]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - include/asm-sparc/bitops.h
slub: Reduce #ifdef ZONE_DMA by moving kmalloc_caches_dma near dma logic
[linux-2.6-omap-h63xx.git] / include / asm-sparc / bitops.h
index 04aa3318f76aa78e17977a9fa04e26e061228792..cb3cefab6e098e56dc1c1835fdb2a44212fea376 100644 (file)
 
 #ifdef __KERNEL__
 
+#ifndef _LINUX_BITOPS_H
+#error only <linux/bitops.h> can be included directly
+#endif
+
+extern unsigned long ___set_bit(unsigned long *addr, unsigned long mask);
+extern unsigned long ___clear_bit(unsigned long *addr, unsigned long mask);
+extern unsigned long ___change_bit(unsigned long *addr, unsigned long mask);
+
 /*
  * Set bit 'nr' in 32-bit quantity at address 'addr' where bit '0'
  * is in the highest of the four bytes and bit '31' is the high bit
  */
 static inline int test_and_set_bit(unsigned long nr, volatile unsigned long *addr)
 {
-       register unsigned long mask asm("g2");
-       register unsigned long *ADDR asm("g1");
-       register int tmp1 asm("g3");
-       register int tmp2 asm("g4");
-       register int tmp3 asm("g5");
-       register int tmp4 asm("g7");
+       unsigned long *ADDR, mask;
 
        ADDR = ((unsigned long *) addr) + (nr >> 5);
        mask = 1 << (nr & 31);
 
-       __asm__ __volatile__(
-       "mov    %%o7, %%g4\n\t"
-       "call   ___set_bit\n\t"
-       " add   %%o7, 8, %%o7\n"
-       : "=&r" (mask), "=r" (tmp1), "=r" (tmp2), "=r" (tmp3), "=r" (tmp4)
-       : "0" (mask), "r" (ADDR)
-       : "memory", "cc");
-
-       return mask != 0;
+       return ___set_bit(ADDR, mask) != 0;
 }
 
 static inline void set_bit(unsigned long nr, volatile unsigned long *addr)
 {
-       register unsigned long mask asm("g2");
-       register unsigned long *ADDR asm("g1");
-       register int tmp1 asm("g3");
-       register int tmp2 asm("g4");
-       register int tmp3 asm("g5");
-       register int tmp4 asm("g7");
+       unsigned long *ADDR, mask;
 
        ADDR = ((unsigned long *) addr) + (nr >> 5);
        mask = 1 << (nr & 31);
 
-       __asm__ __volatile__(
-       "mov    %%o7, %%g4\n\t"
-       "call   ___set_bit\n\t"
-       " add   %%o7, 8, %%o7\n"
-       : "=&r" (mask), "=r" (tmp1), "=r" (tmp2), "=r" (tmp3), "=r" (tmp4)
-       : "0" (mask), "r" (ADDR)
-       : "memory", "cc");
+       (void) ___set_bit(ADDR, mask);
 }
 
 static inline int test_and_clear_bit(unsigned long nr, volatile unsigned long *addr)
 {
-       register unsigned long mask asm("g2");
-       register unsigned long *ADDR asm("g1");
-       register int tmp1 asm("g3");
-       register int tmp2 asm("g4");
-       register int tmp3 asm("g5");
-       register int tmp4 asm("g7");
+       unsigned long *ADDR, mask;
 
        ADDR = ((unsigned long *) addr) + (nr >> 5);
        mask = 1 << (nr & 31);
 
-       __asm__ __volatile__(
-       "mov    %%o7, %%g4\n\t"
-       "call   ___clear_bit\n\t"
-       " add   %%o7, 8, %%o7\n"
-       : "=&r" (mask), "=r" (tmp1), "=r" (tmp2), "=r" (tmp3), "=r" (tmp4)
-       : "0" (mask), "r" (ADDR)
-       : "memory", "cc");
-
-       return mask != 0;
+       return ___clear_bit(ADDR, mask) != 0;
 }
 
 static inline void clear_bit(unsigned long nr, volatile unsigned long *addr)
 {
-       register unsigned long mask asm("g2");
-       register unsigned long *ADDR asm("g1");
-       register int tmp1 asm("g3");
-       register int tmp2 asm("g4");
-       register int tmp3 asm("g5");
-       register int tmp4 asm("g7");
+       unsigned long *ADDR, mask;
 
        ADDR = ((unsigned long *) addr) + (nr >> 5);
        mask = 1 << (nr & 31);
 
-       __asm__ __volatile__(
-       "mov    %%o7, %%g4\n\t"
-       "call   ___clear_bit\n\t"
-       " add   %%o7, 8, %%o7\n"
-       : "=&r" (mask), "=r" (tmp1), "=r" (tmp2), "=r" (tmp3), "=r" (tmp4)
-       : "0" (mask), "r" (ADDR)
-       : "memory", "cc");
+       (void) ___clear_bit(ADDR, mask);
 }
 
 static inline int test_and_change_bit(unsigned long nr, volatile unsigned long *addr)
 {
-       register unsigned long mask asm("g2");
-       register unsigned long *ADDR asm("g1");
-       register int tmp1 asm("g3");
-       register int tmp2 asm("g4");
-       register int tmp3 asm("g5");
-       register int tmp4 asm("g7");
+       unsigned long *ADDR, mask;
 
        ADDR = ((unsigned long *) addr) + (nr >> 5);
        mask = 1 << (nr & 31);
 
-       __asm__ __volatile__(
-       "mov    %%o7, %%g4\n\t"
-       "call   ___change_bit\n\t"
-       " add   %%o7, 8, %%o7\n"
-       : "=&r" (mask), "=r" (tmp1), "=r" (tmp2), "=r" (tmp3), "=r" (tmp4)
-       : "0" (mask), "r" (ADDR)
-       : "memory", "cc");
-
-       return mask != 0;
+       return ___change_bit(ADDR, mask) != 0;
 }
 
 static inline void change_bit(unsigned long nr, volatile unsigned long *addr)
 {
-       register unsigned long mask asm("g2");
-       register unsigned long *ADDR asm("g1");
-       register int tmp1 asm("g3");
-       register int tmp2 asm("g4");
-       register int tmp3 asm("g5");
-       register int tmp4 asm("g7");
+       unsigned long *ADDR, mask;
 
        ADDR = ((unsigned long *) addr) + (nr >> 5);
        mask = 1 << (nr & 31);
 
-       __asm__ __volatile__(
-       "mov    %%o7, %%g4\n\t"
-       "call   ___change_bit\n\t"
-       " add   %%o7, 8, %%o7\n"
-       : "=&r" (mask), "=r" (tmp1), "=r" (tmp2), "=r" (tmp3), "=r" (tmp4)
-       : "0" (mask), "r" (ADDR)
-       : "memory", "cc");
+       (void) ___change_bit(ADDR, mask);
 }
 
 #include <asm-generic/bitops/non-atomic.h>
@@ -164,6 +100,7 @@ static inline void change_bit(unsigned long nr, volatile unsigned long *addr)
 #include <asm-generic/bitops/fls.h>
 #include <asm-generic/bitops/fls64.h>
 #include <asm-generic/bitops/hweight.h>
+#include <asm-generic/bitops/lock.h>
 #include <asm-generic/bitops/find.h>
 #include <asm-generic/bitops/ext2-non-atomic.h>
 #include <asm-generic/bitops/ext2-atomic.h>