Merge tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost
[cris-mirror.git] / arch / sh / include / asm / bitops-grb.h
blob75b5980399d44dae1035b725da753352b92052e1
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef __ASM_SH_BITOPS_GRB_H
3 #define __ASM_SH_BITOPS_GRB_H
5 static inline void set_bit(int nr, volatile void * addr)
7 int mask;
8 volatile unsigned int *a = addr;
9 unsigned long tmp;
11 a += nr >> 5;
12 mask = 1 << (nr & 0x1f);
14 __asm__ __volatile__ (
15 " .align 2 \n\t"
16 " mova 1f, r0 \n\t" /* r0 = end point */
17 " mov r15, r1 \n\t" /* r1 = saved sp */
18 " mov #-6, r15 \n\t" /* LOGIN: r15 = size */
19 " mov.l @%1, %0 \n\t" /* load old value */
20 " or %2, %0 \n\t" /* or */
21 " mov.l %0, @%1 \n\t" /* store new value */
22 "1: mov r1, r15 \n\t" /* LOGOUT */
23 : "=&r" (tmp),
24 "+r" (a)
25 : "r" (mask)
26 : "memory" , "r0", "r1");
29 static inline void clear_bit(int nr, volatile void * addr)
31 int mask;
32 volatile unsigned int *a = addr;
33 unsigned long tmp;
35 a += nr >> 5;
36 mask = ~(1 << (nr & 0x1f));
37 __asm__ __volatile__ (
38 " .align 2 \n\t"
39 " mova 1f, r0 \n\t" /* r0 = end point */
40 " mov r15, r1 \n\t" /* r1 = saved sp */
41 " mov #-6, r15 \n\t" /* LOGIN: r15 = size */
42 " mov.l @%1, %0 \n\t" /* load old value */
43 " and %2, %0 \n\t" /* and */
44 " mov.l %0, @%1 \n\t" /* store new value */
45 "1: mov r1, r15 \n\t" /* LOGOUT */
46 : "=&r" (tmp),
47 "+r" (a)
48 : "r" (mask)
49 : "memory" , "r0", "r1");
52 static inline void change_bit(int nr, volatile void * addr)
54 int mask;
55 volatile unsigned int *a = addr;
56 unsigned long tmp;
58 a += nr >> 5;
59 mask = 1 << (nr & 0x1f);
60 __asm__ __volatile__ (
61 " .align 2 \n\t"
62 " mova 1f, r0 \n\t" /* r0 = end point */
63 " mov r15, r1 \n\t" /* r1 = saved sp */
64 " mov #-6, r15 \n\t" /* LOGIN: r15 = size */
65 " mov.l @%1, %0 \n\t" /* load old value */
66 " xor %2, %0 \n\t" /* xor */
67 " mov.l %0, @%1 \n\t" /* store new value */
68 "1: mov r1, r15 \n\t" /* LOGOUT */
69 : "=&r" (tmp),
70 "+r" (a)
71 : "r" (mask)
72 : "memory" , "r0", "r1");
75 static inline int test_and_set_bit(int nr, volatile void * addr)
77 int mask, retval;
78 volatile unsigned int *a = addr;
79 unsigned long tmp;
81 a += nr >> 5;
82 mask = 1 << (nr & 0x1f);
84 __asm__ __volatile__ (
85 " .align 2 \n\t"
86 " mova 1f, r0 \n\t" /* r0 = end point */
87 " mov r15, r1 \n\t" /* r1 = saved sp */
88 " mov #-14, r15 \n\t" /* LOGIN: r15 = size */
89 " mov.l @%2, %0 \n\t" /* load old value */
90 " mov %0, %1 \n\t"
91 " tst %1, %3 \n\t" /* T = ((*a & mask) == 0) */
92 " mov #-1, %1 \n\t" /* retvat = -1 */
93 " negc %1, %1 \n\t" /* retval = (mask & *a) != 0 */
94 " or %3, %0 \n\t"
95 " mov.l %0, @%2 \n\t" /* store new value */
96 "1: mov r1, r15 \n\t" /* LOGOUT */
97 : "=&r" (tmp),
98 "=&r" (retval),
99 "+r" (a)
100 : "r" (mask)
101 : "memory" , "r0", "r1" ,"t");
103 return retval;
106 static inline int test_and_clear_bit(int nr, volatile void * addr)
108 int mask, retval,not_mask;
109 volatile unsigned int *a = addr;
110 unsigned long tmp;
112 a += nr >> 5;
113 mask = 1 << (nr & 0x1f);
115 not_mask = ~mask;
117 __asm__ __volatile__ (
118 " .align 2 \n\t"
119 " mova 1f, r0 \n\t" /* r0 = end point */
120 " mov r15, r1 \n\t" /* r1 = saved sp */
121 " mov #-14, r15 \n\t" /* LOGIN */
122 " mov.l @%2, %0 \n\t" /* load old value */
123 " mov %0, %1 \n\t" /* %1 = *a */
124 " tst %1, %3 \n\t" /* T = ((*a & mask) == 0) */
125 " mov #-1, %1 \n\t" /* retvat = -1 */
126 " negc %1, %1 \n\t" /* retval = (mask & *a) != 0 */
127 " and %4, %0 \n\t"
128 " mov.l %0, @%2 \n\t" /* store new value */
129 "1: mov r1, r15 \n\t" /* LOGOUT */
130 : "=&r" (tmp),
131 "=&r" (retval),
132 "+r" (a)
133 : "r" (mask),
134 "r" (not_mask)
135 : "memory" , "r0", "r1", "t");
137 return retval;
140 static inline int test_and_change_bit(int nr, volatile void * addr)
142 int mask, retval;
143 volatile unsigned int *a = addr;
144 unsigned long tmp;
146 a += nr >> 5;
147 mask = 1 << (nr & 0x1f);
149 __asm__ __volatile__ (
150 " .align 2 \n\t"
151 " mova 1f, r0 \n\t" /* r0 = end point */
152 " mov r15, r1 \n\t" /* r1 = saved sp */
153 " mov #-14, r15 \n\t" /* LOGIN */
154 " mov.l @%2, %0 \n\t" /* load old value */
155 " mov %0, %1 \n\t" /* %1 = *a */
156 " tst %1, %3 \n\t" /* T = ((*a & mask) == 0) */
157 " mov #-1, %1 \n\t" /* retvat = -1 */
158 " negc %1, %1 \n\t" /* retval = (mask & *a) != 0 */
159 " xor %3, %0 \n\t"
160 " mov.l %0, @%2 \n\t" /* store new value */
161 "1: mov r1, r15 \n\t" /* LOGOUT */
162 : "=&r" (tmp),
163 "=&r" (retval),
164 "+r" (a)
165 : "r" (mask)
166 : "memory" , "r0", "r1", "t");
168 return retval;
171 #include <asm-generic/bitops/non-atomic.h>
173 #endif /* __ASM_SH_BITOPS_GRB_H */