Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/sh/include/asm/bitops-grb.h
26493 views
1
/* SPDX-License-Identifier: GPL-2.0 */
2
#ifndef __ASM_SH_BITOPS_GRB_H
3
#define __ASM_SH_BITOPS_GRB_H
4
5
static inline void set_bit(int nr, volatile void * addr)
6
{
7
int mask;
8
volatile unsigned int *a = addr;
9
unsigned long tmp;
10
11
a += nr >> 5;
12
mask = 1 << (nr & 0x1f);
13
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");
27
}
28
29
static inline void clear_bit(int nr, volatile void * addr)
30
{
31
int mask;
32
volatile unsigned int *a = addr;
33
unsigned long tmp;
34
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");
50
}
51
52
static inline void change_bit(int nr, volatile void * addr)
53
{
54
int mask;
55
volatile unsigned int *a = addr;
56
unsigned long tmp;
57
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");
73
}
74
75
static inline int test_and_set_bit(int nr, volatile void * addr)
76
{
77
int mask, retval;
78
volatile unsigned int *a = addr;
79
unsigned long tmp;
80
81
a += nr >> 5;
82
mask = 1 << (nr & 0x1f);
83
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");
102
103
return retval;
104
}
105
106
static inline int test_and_clear_bit(int nr, volatile void * addr)
107
{
108
int mask, retval,not_mask;
109
volatile unsigned int *a = addr;
110
unsigned long tmp;
111
112
a += nr >> 5;
113
mask = 1 << (nr & 0x1f);
114
115
not_mask = ~mask;
116
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");
136
137
return retval;
138
}
139
140
static inline int test_and_change_bit(int nr, volatile void * addr)
141
{
142
int mask, retval;
143
volatile unsigned int *a = addr;
144
unsigned long tmp;
145
146
a += nr >> 5;
147
mask = 1 << (nr & 0x1f);
148
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");
167
168
return retval;
169
}
170
171
#include <asm-generic/bitops/non-atomic.h>
172
173
#endif /* __ASM_SH_BITOPS_GRB_H */
174
175