2 * BK Id: SCCS/s.bitops.c 1.10 09/21/01 03:00:33 dan
5 * Copyright (C) 1996 Paul Mackerras.
8 #include <linux/kernel.h>
9 #include <asm/bitops.h>
12 * If the bitops are not inlined in bitops.h, they are defined here.
16 void set_bit(int nr, volatile void * addr)
19 unsigned long mask = 1 << (nr & 0x1f);
20 unsigned long *p = ((unsigned long *)addr) + (nr >> 5);
22 __asm__ __volatile__(SMP_WMB "\n\
29 : "=&r" (old), "=m" (*p)
30 : "r" (mask), "r" (p), "m" (*p)
34 void clear_bit(int nr, volatile void *addr)
37 unsigned long mask = 1 << (nr & 0x1f);
38 unsigned long *p = ((unsigned long *)addr) + (nr >> 5);
40 __asm__ __volatile__(SMP_WMB "\n\
47 : "=&r" (old), "=m" (*p)
48 : "r" (mask), "r" (p), "m" (*p)
52 void change_bit(int nr, volatile void *addr)
55 unsigned long mask = 1 << (nr & 0x1f);
56 unsigned long *p = ((unsigned long *)addr) + (nr >> 5);
58 __asm__ __volatile__(SMP_WMB "\n\
65 : "=&r" (old), "=m" (*p)
66 : "r" (mask), "r" (p), "m" (*p)
70 int test_and_set_bit(int nr, volatile void *addr)
73 unsigned int mask = 1 << (nr & 0x1f);
74 volatile unsigned int *p = ((volatile unsigned int *)addr) + (nr >> 5);
76 __asm__ __volatile__(SMP_WMB "\n\
83 : "=&r" (old), "=&r" (t), "=m" (*p)
84 : "r" (mask), "r" (p), "m" (*p)
87 return (old & mask) != 0;
90 int test_and_clear_bit(int nr, volatile void *addr)
93 unsigned int mask = 1 << (nr & 0x1f);
94 volatile unsigned int *p = ((volatile unsigned int *)addr) + (nr >> 5);
96 __asm__ __volatile__(SMP_WMB "\n\
103 : "=&r" (old), "=&r" (t), "=m" (*p)
104 : "r" (mask), "r" (p), "m" (*p)
107 return (old & mask) != 0;
110 int test_and_change_bit(int nr, volatile void *addr)
113 unsigned int mask = 1 << (nr & 0x1f);
114 volatile unsigned int *p = ((volatile unsigned int *)addr) + (nr >> 5);
116 __asm__ __volatile__(SMP_WMB "\n\
123 : "=&r" (old), "=&r" (t), "=m" (*p)
124 : "r" (mask), "r" (p), "m" (*p)
127 return (old & mask) != 0;
129 #endif /* !__INLINE_BITOPS */