#ifdef __i386__ #define bitop(name,op) \ static inline int name(char * addr,unsigned int nr) \ { \ int __res; \ __asm__ __volatile__("bt" op " %1,%2; adcl $0,%0" \ :"=g" (__res) \ :"r" (nr),"m" (*(addr)),"0" (0)); \ return __res; \ } bitop(bit,"") bitop(setbit,"s") bitop(clrbit,"r") #elif defined(__mc68000__) #define bitop(name,op) \ static inline int name (char *addr, unsigned int nr) \ { \ char __res; \ __asm__ __volatile__("bf" op " %2@{%1:#1}; sne %0" \ : "=d" (__res) \ : "d" (nr ^ 15), "a" (addr)); \ return __res != 0; \ } bitop (bit, "tst") bitop (setbit, "set") bitop (clrbit, "clr") #else static inline int bit(char * addr,unsigned int nr) { return (addr[nr >> 3] & (1<<(nr & 7))) != 0; } static inline int setbit(char * addr,unsigned int nr) { int __res = bit(addr, nr); addr[nr >> 3] |= (1<<(nr & 7)); return __res != 0; \ } static inline int clrbit(char * addr,unsigned int nr) { int __res = bit(addr, nr); addr[nr >> 3] &= ~(1<<(nr & 7)); return __res != 0; } #endif