1 #ifndef __ASM_SH_BITOPS_LLSC_H
2 #define __ASM_SH_BITOPS_LLSC_H
4 static inline void set_bit(int nr, volatile void * addr)
7 volatile unsigned int *a = addr;
11 mask = 1 << (nr & 0x1f);
13 __asm__ __volatile__ (
15 "movli.l @%1, %0 ! set_bit \n\t"
17 "movco.l %0, @%1 \n\t"
19 : "=&z" (tmp), "=r" (a)
25 static inline void clear_bit(int nr, volatile void * addr)
28 volatile unsigned int *a = addr;
32 mask = 1 << (nr & 0x1f);
34 __asm__ __volatile__ (
36 "movli.l @%1, %0 ! clear_bit \n\t"
38 "movco.l %0, @%1 \n\t"
40 : "=&z" (tmp), "=r" (a)
41 : "1" (a), "r" (~mask)
46 static inline void change_bit(int nr, volatile void * addr)
49 volatile unsigned int *a = addr;
53 mask = 1 << (nr & 0x1f);
55 __asm__ __volatile__ (
57 "movli.l @%1, %0 ! change_bit \n\t"
59 "movco.l %0, @%1 \n\t"
61 : "=&z" (tmp), "=r" (a)
67 static inline int test_and_set_bit(int nr, volatile void * addr)
70 volatile unsigned int *a = addr;
74 mask = 1 << (nr & 0x1f);
76 __asm__ __volatile__ (
78 "movli.l @%1, %0 ! test_and_set_bit \n\t"
81 "movco.l %0, @%1 \n\t"
84 : "=&z" (tmp), "=r" (a), "=&r" (retval)
92 static inline int test_and_clear_bit(int nr, volatile void * addr)
95 volatile unsigned int *a = addr;
99 mask = 1 << (nr & 0x1f);
101 __asm__ __volatile__ (
103 "movli.l @%1, %0 ! test_and_clear_bit \n\t"
106 "movco.l %0, @%1 \n\t"
110 : "=&z" (tmp), "=r" (a), "=&r" (retval)
111 : "1" (a), "r" (mask), "r" (~mask)
118 static inline int test_and_change_bit(int nr, volatile void * addr)
121 volatile unsigned int *a = addr;
125 mask = 1 << (nr & 0x1f);
127 __asm__ __volatile__ (
129 "movli.l @%1, %0 ! test_and_change_bit \n\t"
132 "movco.l %0, @%1 \n\t"
136 : "=&z" (tmp), "=r" (a), "=&r" (retval)
137 : "1" (a), "r" (mask)
144 #include <asm-generic/bitops/non-atomic.h>
146 #endif /* __ASM_SH_BITOPS_LLSC_H */