summaryrefslogtreecommitdiffstats
path: root/disk-utils/bitops.h
diff options
context:
space:
mode:
Diffstat (limited to 'disk-utils/bitops.h')
-rw-r--r--disk-utils/bitops.h54
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
+