Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
arch
sh
include
asm
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
170
#include <
asm-generic/bitops/non-atomic.h
>
171
172
#endif
/* __ASM_SH_BITOPS_GRB_H */
Generated on Thu Jan 10 2013 13:17:12 for Linux Kernel by
1.8.2