72 lines
1.8 KiB
C
72 lines
1.8 KiB
C
static __inline__ __attribute__((always_inline)) void set_bit(int nr, volatile void * addr)
|
|
{
|
|
volatile unsigned char *b_addr;
|
|
b_addr = (volatile unsigned char *)addr + ((nr >> 3) ^ 3);
|
|
nr &= 7;
|
|
if (__builtin_constant_p (nr))
|
|
{
|
|
switch(nr)
|
|
{
|
|
case 0:
|
|
__asm__("bset #0,%0" :"+m"(*b_addr) :"m"(*b_addr));
|
|
break;
|
|
case 1:
|
|
__asm__("bset #1,%0" :"+m"(*b_addr) :"m"(*b_addr));
|
|
break;
|
|
case 2:
|
|
__asm__("bset #2,%0" :"+m"(*b_addr) :"m"(*b_addr));
|
|
break;
|
|
case 3:
|
|
__asm__("bset #3,%0" :"+m"(*b_addr) :"m"(*b_addr));
|
|
break;
|
|
case 4:
|
|
__asm__("bset #4,%0" :"+m"(*b_addr) :"m"(*b_addr));
|
|
break;
|
|
case 5:
|
|
__asm__("bset #5,%0" :"+m"(*b_addr) :"m"(*b_addr));
|
|
break;
|
|
case 6:
|
|
__asm__("bset #6,%0" :"+m"(*b_addr) :"m"(*b_addr));
|
|
break;
|
|
case 7:
|
|
__asm__("bset #7,%0" :"+m"(*b_addr) :"m"(*b_addr));
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
__asm__("bset %w1,%0" :"+m"(*b_addr) :"g"(nr),"m"(*b_addr)); /* { dg-error "invalid 'asm'" "" } */
|
|
|
|
}
|
|
}
|
|
|
|
static __inline__ __attribute__((always_inline)) int test_bit(int nr, const volatile void * addr)
|
|
{
|
|
return (*((volatile unsigned char *)addr + ((nr >> 3) ^ 3)) & (1UL << (nr & 7))) != 0;
|
|
}
|
|
|
|
struct a {
|
|
unsigned long a;
|
|
};
|
|
|
|
void dummy(struct a *a, int b);
|
|
|
|
int ice_func(struct a *a, int b)
|
|
{
|
|
int c,d;
|
|
unsigned int e;
|
|
|
|
for(c=0;c<b;c++) {
|
|
for(d=b; d <= b; d++) {
|
|
if (!test_bit(d, &e)) {
|
|
dummy(a, d * a->a);
|
|
dummy(a, d * a->a);
|
|
set_bit(d, &e);
|
|
}
|
|
}
|
|
dummy(a, d * a->a);
|
|
}
|
|
|
|
return 0;
|
|
}
|