File: mips-octeon-bbit.c

package info (click to toggle)
binutils-avr 2.26.20160125%2BAtmel3.6.2-4
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 365,552 kB
  • sloc: ansic: 2,480,046; asm: 892,808; exp: 188,218; cpp: 133,829; makefile: 63,886; sh: 32,212; yacc: 26,783; lisp: 16,709; xml: 7,490; perl: 6,449; python: 4,555; ada: 4,318; pascal: 3,174; lex: 2,250; cs: 879; sed: 334; f90: 298; awk: 168; objc: 134; java: 73; fortran: 43
file content (49 lines) | stat: -rw-r--r-- 1,369 bytes parent folder | download | duplicates (26)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
typedef unsigned long long uint64_t;
void abort (void);

#define BASE 0x1234567812345678ull

#define DEF_BBIT_TAKEN(BRANCH_IF, BIT)					\
  int bbit_is_taken_##BRANCH_IF##_##BIT (volatile uint64_t *p)		\
  {									\
    int ret;								\
    asm (".set push				\n\t"			\
	 ".set noreorder			\n\t"			\
	 "bbit" #BRANCH_IF " %1, " #BIT ", 1f	\n\t"			\
	 "nop					\n\t"			\
	 "li %0, 0				\n\t"			\
	 "b 2f					\n\t"			\
	 "nop					\n\t"			\
	 "1:					\n\t"			\
	 "li %0, 1				\n\t"			\
	 "2:					\n\t"			\
	 ".set pop"							\
	 : "=r"(ret) : "r"(*p));					\
    return ret;								\
  }									\
  volatile uint64_t taken_##BRANCH_IF##_##BIT =				\
    BASE & (~(1ull << BIT)) | ((uint64_t) BRANCH_IF << BIT);		\
  volatile uint64_t not_taken_##BRANCH_IF##_##BIT =			\
    BASE & (~(1ull << BIT)) | (((uint64_t) !BRANCH_IF) << BIT);  

DEF_BBIT_TAKEN (0, 10);
DEF_BBIT_TAKEN (0, 36);
DEF_BBIT_TAKEN (1, 20);
DEF_BBIT_TAKEN (1, 49);

#define EXPECT(X) if (!(X)) abort ();

main ()
{
  EXPECT (bbit_is_taken_0_10 (&taken_0_10));
  EXPECT (!bbit_is_taken_0_10 (&not_taken_0_10));

  EXPECT (bbit_is_taken_0_36 (&taken_0_36));
  EXPECT (!bbit_is_taken_0_36 (&not_taken_0_36));

  EXPECT (bbit_is_taken_1_20 (&taken_1_20));
  EXPECT (!bbit_is_taken_1_20 (&not_taken_1_20));

  EXPECT (bbit_is_taken_1_49 (&taken_1_49));
  EXPECT (!bbit_is_taken_1_49 (&not_taken_1_49));
}