diff options
Diffstat (limited to 'disk-utils/bitops.h')
-rw-r--r-- | disk-utils/bitops.h | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/disk-utils/bitops.h b/disk-utils/bitops.h new file mode 100644 index 000000000..270dc2d8f --- /dev/null +++ b/disk-utils/bitops.h @@ -0,0 +1,54 @@ +#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 + |