Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
bitops-grb.h
Go to the documentation of this file.
1 #ifndef __ASM_SH_BITOPS_GRB_H
2 #define __ASM_SH_BITOPS_GRB_H
3 
4 static inline void set_bit(int nr, volatile void * addr)
5 {
6  int mask;
7  volatile unsigned int *a = addr;
8  unsigned long tmp;
9 
10  a += nr >> 5;
11  mask = 1 << (nr & 0x1f);
12 
13  __asm__ __volatile__ (
14  " .align 2 \n\t"
15  " mova 1f, r0 \n\t" /* r0 = end point */
16  " mov r15, r1 \n\t" /* r1 = saved sp */
17  " mov #-6, r15 \n\t" /* LOGIN: r15 = size */
18  " mov.l @%1, %0 \n\t" /* load old value */
19  " or %2, %0 \n\t" /* or */
20  " mov.l %0, @%1 \n\t" /* store new value */
21  "1: mov r1, r15 \n\t" /* LOGOUT */
22  : "=&r" (tmp),
23  "+r" (a)
24  : "r" (mask)
25  : "memory" , "r0", "r1");
26 }
27 
28 static inline void clear_bit(int nr, volatile void * addr)
29 {
30  int mask;
31  volatile unsigned int *a = addr;
32  unsigned long tmp;
33 
34  a += nr >> 5;
35  mask = ~(1 << (nr & 0x1f));
36  __asm__ __volatile__ (
37  " .align 2 \n\t"
38  " mova 1f, r0 \n\t" /* r0 = end point */
39  " mov r15, r1 \n\t" /* r1 = saved sp */
40  " mov #-6, r15 \n\t" /* LOGIN: r15 = size */
41  " mov.l @%1, %0 \n\t" /* load old value */
42  " and %2, %0 \n\t" /* and */
43  " mov.l %0, @%1 \n\t" /* store new value */
44  "1: mov r1, r15 \n\t" /* LOGOUT */
45  : "=&r" (tmp),
46  "+r" (a)
47  : "r" (mask)
48  : "memory" , "r0", "r1");
49 }
50 
51 static inline void change_bit(int nr, volatile void * addr)
52 {
53  int mask;
54  volatile unsigned int *a = addr;
55  unsigned long tmp;
56 
57  a += nr >> 5;
58  mask = 1 << (nr & 0x1f);
59  __asm__ __volatile__ (
60  " .align 2 \n\t"
61  " mova 1f, r0 \n\t" /* r0 = end point */
62  " mov r15, r1 \n\t" /* r1 = saved sp */
63  " mov #-6, r15 \n\t" /* LOGIN: r15 = size */
64  " mov.l @%1, %0 \n\t" /* load old value */
65  " xor %2, %0 \n\t" /* xor */
66  " mov.l %0, @%1 \n\t" /* store new value */
67  "1: mov r1, r15 \n\t" /* LOGOUT */
68  : "=&r" (tmp),
69  "+r" (a)
70  : "r" (mask)
71  : "memory" , "r0", "r1");
72 }
73 
74 static inline int test_and_set_bit(int nr, volatile void * addr)
75 {
76  int mask, retval;
77  volatile unsigned int *a = addr;
78  unsigned long tmp;
79 
80  a += nr >> 5;
81  mask = 1 << (nr & 0x1f);
82 
83  __asm__ __volatile__ (
84  " .align 2 \n\t"
85  " mova 1f, r0 \n\t" /* r0 = end point */
86  " mov r15, r1 \n\t" /* r1 = saved sp */
87  " mov #-14, r15 \n\t" /* LOGIN: r15 = size */
88  " mov.l @%2, %0 \n\t" /* load old value */
89  " mov %0, %1 \n\t"
90  " tst %1, %3 \n\t" /* T = ((*a & mask) == 0) */
91  " mov #-1, %1 \n\t" /* retvat = -1 */
92  " negc %1, %1 \n\t" /* retval = (mask & *a) != 0 */
93  " or %3, %0 \n\t"
94  " mov.l %0, @%2 \n\t" /* store new value */
95  "1: mov r1, r15 \n\t" /* LOGOUT */
96  : "=&r" (tmp),
97  "=&r" (retval),
98  "+r" (a)
99  : "r" (mask)
100  : "memory" , "r0", "r1" ,"t");
101 
102  return retval;
103 }
104 
105 static inline int test_and_clear_bit(int nr, volatile void * addr)
106 {
107  int mask, retval,not_mask;
108  volatile unsigned int *a = addr;
109  unsigned long tmp;
110 
111  a += nr >> 5;
112  mask = 1 << (nr & 0x1f);
113 
114  not_mask = ~mask;
115 
116  __asm__ __volatile__ (
117  " .align 2 \n\t"
118  " mova 1f, r0 \n\t" /* r0 = end point */
119  " mov r15, r1 \n\t" /* r1 = saved sp */
120  " mov #-14, r15 \n\t" /* LOGIN */
121  " mov.l @%2, %0 \n\t" /* load old value */
122  " mov %0, %1 \n\t" /* %1 = *a */
123  " tst %1, %3 \n\t" /* T = ((*a & mask) == 0) */
124  " mov #-1, %1 \n\t" /* retvat = -1 */
125  " negc %1, %1 \n\t" /* retval = (mask & *a) != 0 */
126  " and %4, %0 \n\t"
127  " mov.l %0, @%2 \n\t" /* store new value */
128  "1: mov r1, r15 \n\t" /* LOGOUT */
129  : "=&r" (tmp),
130  "=&r" (retval),
131  "+r" (a)
132  : "r" (mask),
133  "r" (not_mask)
134  : "memory" , "r0", "r1", "t");
135 
136  return retval;
137 }
138 
139 static inline int test_and_change_bit(int nr, volatile void * addr)
140 {
141  int mask, retval;
142  volatile unsigned int *a = addr;
143  unsigned long tmp;
144 
145  a += nr >> 5;
146  mask = 1 << (nr & 0x1f);
147 
148  __asm__ __volatile__ (
149  " .align 2 \n\t"
150  " mova 1f, r0 \n\t" /* r0 = end point */
151  " mov r15, r1 \n\t" /* r1 = saved sp */
152  " mov #-14, r15 \n\t" /* LOGIN */
153  " mov.l @%2, %0 \n\t" /* load old value */
154  " mov %0, %1 \n\t" /* %1 = *a */
155  " tst %1, %3 \n\t" /* T = ((*a & mask) == 0) */
156  " mov #-1, %1 \n\t" /* retvat = -1 */
157  " negc %1, %1 \n\t" /* retval = (mask & *a) != 0 */
158  " xor %3, %0 \n\t"
159  " mov.l %0, @%2 \n\t" /* store new value */
160  "1: mov r1, r15 \n\t" /* LOGOUT */
161  : "=&r" (tmp),
162  "=&r" (retval),
163  "+r" (a)
164  : "r" (mask)
165  : "memory" , "r0", "r1", "t");
166 
167  return retval;
168 }
169 
171 
172 #endif /* __ASM_SH_BITOPS_GRB_H */