1 static __inline__ __attribute__((always_inline)) void set_bit(int nr, volatile void * addr)
2 {
3 volatile unsigned char *b_addr;
4 b_addr = (volatile unsigned char *)addr + ((nr >> 3) ^ 3);
5 nr &= 7;
6 if (__builtin_constant_p (nr))
7 {
8 switch(nr)
9 {
10 case 0:
11 __asm__("bset #0,%0" :"+m"(*b_addr) :"m"(*b_addr));
12 break;
13 case 1:
14 __asm__("bset #1,%0" :"+m"(*b_addr) :"m"(*b_addr));
15 break;
16 case 2:
17 __asm__("bset #2,%0" :"+m"(*b_addr) :"m"(*b_addr));
18 break;
19 case 3:
20 __asm__("bset #3,%0" :"+m"(*b_addr) :"m"(*b_addr));
21 break;
22 case 4:
23 __asm__("bset #4,%0" :"+m"(*b_addr) :"m"(*b_addr));
24 break;
25 case 5:
26 __asm__("bset #5,%0" :"+m"(*b_addr) :"m"(*b_addr));
27 break;
28 case 6:
29 __asm__("bset #6,%0" :"+m"(*b_addr) :"m"(*b_addr));
30 break;
31 case 7:
32 __asm__("bset #7,%0" :"+m"(*b_addr) :"m"(*b_addr));
33 break;
34 }
35 }
36 else
37 {
38 __asm__("bset %w1,%0" :"+m"(*b_addr) :"g"(nr),"m"(*b_addr)); /* { dg-error "invalid 'asm'" "" } */
39
40 }
41 }
42
43 static __inline__ __attribute__((always_inline)) int test_bit(int nr, const volatile void * addr)
44 {
45 return (*((volatile unsigned char *)addr + ((nr >> 3) ^ 3)) & (1UL << (nr & 7))) != 0;
46 }
47
48 struct a {
49 unsigned long a;
50 };
51
52 void dummy(struct a *a, int b);
53
54 int ice_func(struct a *a, int b)
55 {
56 int c,d;
57 unsigned int e;
58
59 for(c=0;c<b;c++) {
60 for(d=b; d <= b; d++) {
61 if (!test_bit(d, &e)) {
62 dummy(a, d * a->a);
63 dummy(a, d * a->a);
64 set_bit(d, &e);
65 }
66 }
67 dummy(a, d * a->a);
68 }
69
70 return 0;
71 }