diff options
author | Russell King <rmk+kernel@arm.linux.org.uk> | 2011-01-16 13:02:17 -0500 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2011-02-02 16:23:25 -0500 |
commit | 6323f0ccedf756dfe5f46549cec69a2d6d97937b (patch) | |
tree | 091e3408c12bbce33ef5d708b6131132b9660d4d /arch/arm | |
parent | a16ede35a2659170c855c5d267776666c0630f1f (diff) |
ARM: bitops: switch set/clear/change bitops to use ldrex/strex
Switch the set/clear/change bitops to use the word-based exclusive
operations, which are only present in a wider range of ARM architectures
than the byte-based exclusive operations.
Tested record:
- Nicolas Pitre: ext3,rw,le
- Sourav Poddar: nfs,le
- Will Deacon: ext3,rw,le
- Tony Lindgren: ext3+nfs,le
Reviewed-by: Nicolas Pitre <nicolas.pitre@linaro.org>
Tested-by: Sourav Poddar <sourav.poddar@ti.com>
Tested-by: Will Deacon <will.deacon@arm.com>
Tested-by: Tony Lindgren <tony@atomide.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm')
-rw-r--r-- | arch/arm/include/asm/bitops.h | 60 | ||||
-rw-r--r-- | arch/arm/kernel/armksyms.c | 18 | ||||
-rw-r--r-- | arch/arm/lib/bitops.h | 38 | ||||
-rw-r--r-- | arch/arm/lib/changebit.S | 10 | ||||
-rw-r--r-- | arch/arm/lib/clearbit.S | 11 | ||||
-rw-r--r-- | arch/arm/lib/setbit.S | 11 | ||||
-rw-r--r-- | arch/arm/lib/testchangebit.S | 9 | ||||
-rw-r--r-- | arch/arm/lib/testclearbit.S | 9 | ||||
-rw-r--r-- | arch/arm/lib/testsetbit.S | 9 |
9 files changed, 63 insertions, 112 deletions
diff --git a/arch/arm/include/asm/bitops.h b/arch/arm/include/asm/bitops.h index 7b1bb2bbaf88..af54ed102f5f 100644 --- a/arch/arm/include/asm/bitops.h +++ b/arch/arm/include/asm/bitops.h | |||
@@ -149,14 +149,18 @@ ____atomic_test_and_change_bit(unsigned int bit, volatile unsigned long *p) | |||
149 | */ | 149 | */ |
150 | 150 | ||
151 | /* | 151 | /* |
152 | * Native endian assembly bitops. nr = 0 -> word 0 bit 0. | ||
153 | */ | ||
154 | extern void _set_bit(int nr, volatile unsigned long * p); | ||
155 | extern void _clear_bit(int nr, volatile unsigned long * p); | ||
156 | extern void _change_bit(int nr, volatile unsigned long * p); | ||
157 | extern int _test_and_set_bit(int nr, volatile unsigned long * p); | ||
158 | extern int _test_and_clear_bit(int nr, volatile unsigned long * p); | ||
159 | extern int _test_and_change_bit(int nr, volatile unsigned long * p); | ||
160 | |||
161 | /* | ||
152 | * Little endian assembly bitops. nr = 0 -> byte 0 bit 0. | 162 | * Little endian assembly bitops. nr = 0 -> byte 0 bit 0. |
153 | */ | 163 | */ |
154 | extern void _set_bit_le(int nr, volatile unsigned long * p); | ||
155 | extern void _clear_bit_le(int nr, volatile unsigned long * p); | ||
156 | extern void _change_bit_le(int nr, volatile unsigned long * p); | ||
157 | extern int _test_and_set_bit_le(int nr, volatile unsigned long * p); | ||
158 | extern int _test_and_clear_bit_le(int nr, volatile unsigned long * p); | ||
159 | extern int _test_and_change_bit_le(int nr, volatile unsigned long * p); | ||
160 | extern int _find_first_zero_bit_le(const void * p, unsigned size); | 164 | extern int _find_first_zero_bit_le(const void * p, unsigned size); |
161 | extern int _find_next_zero_bit_le(const void * p, int size, int offset); | 165 | extern int _find_next_zero_bit_le(const void * p, int size, int offset); |
162 | extern int _find_first_bit_le(const unsigned long *p, unsigned size); | 166 | extern int _find_first_bit_le(const unsigned long *p, unsigned size); |
@@ -165,12 +169,6 @@ extern int _find_next_bit_le(const unsigned long *p, int size, int offset); | |||
165 | /* | 169 | /* |
166 | * Big endian assembly bitops. nr = 0 -> byte 3 bit 0. | 170 | * Big endian assembly bitops. nr = 0 -> byte 3 bit 0. |
167 | */ | 171 | */ |
168 | extern void _set_bit_be(int nr, volatile unsigned long * p); | ||
169 | extern void _clear_bit_be(int nr, volatile unsigned long * p); | ||
170 | extern void _change_bit_be(int nr, volatile unsigned long * p); | ||
171 | extern int _test_and_set_bit_be(int nr, volatile unsigned long * p); | ||
172 | extern int _test_and_clear_bit_be(int nr, volatile unsigned long * p); | ||
173 | extern int _test_and_change_bit_be(int nr, volatile unsigned long * p); | ||
174 | extern int _find_first_zero_bit_be(const void * p, unsigned size); | 172 | extern int _find_first_zero_bit_be(const void * p, unsigned size); |
175 | extern int _find_next_zero_bit_be(const void * p, int size, int offset); | 173 | extern int _find_next_zero_bit_be(const void * p, int size, int offset); |
176 | extern int _find_first_bit_be(const unsigned long *p, unsigned size); | 174 | extern int _find_first_bit_be(const unsigned long *p, unsigned size); |
@@ -180,33 +178,26 @@ extern int _find_next_bit_be(const unsigned long *p, int size, int offset); | |||
180 | /* | 178 | /* |
181 | * The __* form of bitops are non-atomic and may be reordered. | 179 | * The __* form of bitops are non-atomic and may be reordered. |
182 | */ | 180 | */ |
183 | #define ATOMIC_BITOP_LE(name,nr,p) \ | 181 | #define ATOMIC_BITOP(name,nr,p) \ |
184 | (__builtin_constant_p(nr) ? \ | 182 | (__builtin_constant_p(nr) ? ____atomic_##name(nr, p) : _##name(nr,p)) |
185 | ____atomic_##name(nr, p) : \ | ||
186 | _##name##_le(nr,p)) | ||
187 | |||
188 | #define ATOMIC_BITOP_BE(name,nr,p) \ | ||
189 | (__builtin_constant_p(nr) ? \ | ||
190 | ____atomic_##name(nr, p) : \ | ||
191 | _##name##_be(nr,p)) | ||
192 | #else | 183 | #else |
193 | #define ATOMIC_BITOP_LE(name,nr,p) _##name##_le(nr,p) | 184 | #define ATOMIC_BITOP(name,nr,p) _##name(nr,p) |
194 | #define ATOMIC_BITOP_BE(name,nr,p) _##name##_be(nr,p) | ||
195 | #endif | 185 | #endif |
196 | 186 | ||
197 | #define NONATOMIC_BITOP(name,nr,p) \ | 187 | /* |
198 | (____nonatomic_##name(nr, p)) | 188 | * Native endian atomic definitions. |
189 | */ | ||
190 | #define set_bit(nr,p) ATOMIC_BITOP(set_bit,nr,p) | ||
191 | #define clear_bit(nr,p) ATOMIC_BITOP(clear_bit,nr,p) | ||
192 | #define change_bit(nr,p) ATOMIC_BITOP(change_bit,nr,p) | ||
193 | #define test_and_set_bit(nr,p) ATOMIC_BITOP(test_and_set_bit,nr,p) | ||
194 | #define test_and_clear_bit(nr,p) ATOMIC_BITOP(test_and_clear_bit,nr,p) | ||
195 | #define test_and_change_bit(nr,p) ATOMIC_BITOP(test_and_change_bit,nr,p) | ||
199 | 196 | ||
200 | #ifndef __ARMEB__ | 197 | #ifndef __ARMEB__ |
201 | /* | 198 | /* |
202 | * These are the little endian, atomic definitions. | 199 | * These are the little endian, atomic definitions. |
203 | */ | 200 | */ |
204 | #define set_bit(nr,p) ATOMIC_BITOP_LE(set_bit,nr,p) | ||
205 | #define clear_bit(nr,p) ATOMIC_BITOP_LE(clear_bit,nr,p) | ||
206 | #define change_bit(nr,p) ATOMIC_BITOP_LE(change_bit,nr,p) | ||
207 | #define test_and_set_bit(nr,p) ATOMIC_BITOP_LE(test_and_set_bit,nr,p) | ||
208 | #define test_and_clear_bit(nr,p) ATOMIC_BITOP_LE(test_and_clear_bit,nr,p) | ||
209 | #define test_and_change_bit(nr,p) ATOMIC_BITOP_LE(test_and_change_bit,nr,p) | ||
210 | #define find_first_zero_bit(p,sz) _find_first_zero_bit_le(p,sz) | 201 | #define find_first_zero_bit(p,sz) _find_first_zero_bit_le(p,sz) |
211 | #define find_next_zero_bit(p,sz,off) _find_next_zero_bit_le(p,sz,off) | 202 | #define find_next_zero_bit(p,sz,off) _find_next_zero_bit_le(p,sz,off) |
212 | #define find_first_bit(p,sz) _find_first_bit_le(p,sz) | 203 | #define find_first_bit(p,sz) _find_first_bit_le(p,sz) |
@@ -215,16 +206,9 @@ extern int _find_next_bit_be(const unsigned long *p, int size, int offset); | |||
215 | #define WORD_BITOFF_TO_LE(x) ((x)) | 206 | #define WORD_BITOFF_TO_LE(x) ((x)) |
216 | 207 | ||
217 | #else | 208 | #else |
218 | |||
219 | /* | 209 | /* |
220 | * These are the big endian, atomic definitions. | 210 | * These are the big endian, atomic definitions. |
221 | */ | 211 | */ |
222 | #define set_bit(nr,p) ATOMIC_BITOP_BE(set_bit,nr,p) | ||
223 | #define clear_bit(nr,p) ATOMIC_BITOP_BE(clear_bit,nr,p) | ||
224 | #define change_bit(nr,p) ATOMIC_BITOP_BE(change_bit,nr,p) | ||
225 | #define test_and_set_bit(nr,p) ATOMIC_BITOP_BE(test_and_set_bit,nr,p) | ||
226 | #define test_and_clear_bit(nr,p) ATOMIC_BITOP_BE(test_and_clear_bit,nr,p) | ||
227 | #define test_and_change_bit(nr,p) ATOMIC_BITOP_BE(test_and_change_bit,nr,p) | ||
228 | #define find_first_zero_bit(p,sz) _find_first_zero_bit_be(p,sz) | 212 | #define find_first_zero_bit(p,sz) _find_first_zero_bit_be(p,sz) |
229 | #define find_next_zero_bit(p,sz,off) _find_next_zero_bit_be(p,sz,off) | 213 | #define find_next_zero_bit(p,sz,off) _find_next_zero_bit_be(p,sz,off) |
230 | #define find_first_bit(p,sz) _find_first_bit_be(p,sz) | 214 | #define find_first_bit(p,sz) _find_first_bit_be(p,sz) |
diff --git a/arch/arm/kernel/armksyms.c b/arch/arm/kernel/armksyms.c index e5e1e5387678..d5d4185f0c24 100644 --- a/arch/arm/kernel/armksyms.c +++ b/arch/arm/kernel/armksyms.c | |||
@@ -140,24 +140,18 @@ EXPORT_SYMBOL(__aeabi_ulcmp); | |||
140 | #endif | 140 | #endif |
141 | 141 | ||
142 | /* bitops */ | 142 | /* bitops */ |
143 | EXPORT_SYMBOL(_set_bit_le); | 143 | EXPORT_SYMBOL(_set_bit); |
144 | EXPORT_SYMBOL(_test_and_set_bit_le); | 144 | EXPORT_SYMBOL(_test_and_set_bit); |
145 | EXPORT_SYMBOL(_clear_bit_le); | 145 | EXPORT_SYMBOL(_clear_bit); |
146 | EXPORT_SYMBOL(_test_and_clear_bit_le); | 146 | EXPORT_SYMBOL(_test_and_clear_bit); |
147 | EXPORT_SYMBOL(_change_bit_le); | 147 | EXPORT_SYMBOL(_change_bit); |
148 | EXPORT_SYMBOL(_test_and_change_bit_le); | 148 | EXPORT_SYMBOL(_test_and_change_bit); |
149 | EXPORT_SYMBOL(_find_first_zero_bit_le); | 149 | EXPORT_SYMBOL(_find_first_zero_bit_le); |
150 | EXPORT_SYMBOL(_find_next_zero_bit_le); | 150 | EXPORT_SYMBOL(_find_next_zero_bit_le); |
151 | EXPORT_SYMBOL(_find_first_bit_le); | 151 | EXPORT_SYMBOL(_find_first_bit_le); |
152 | EXPORT_SYMBOL(_find_next_bit_le); | 152 | EXPORT_SYMBOL(_find_next_bit_le); |
153 | 153 | ||
154 | #ifdef __ARMEB__ | 154 | #ifdef __ARMEB__ |
155 | EXPORT_SYMBOL(_set_bit_be); | ||
156 | EXPORT_SYMBOL(_test_and_set_bit_be); | ||
157 | EXPORT_SYMBOL(_clear_bit_be); | ||
158 | EXPORT_SYMBOL(_test_and_clear_bit_be); | ||
159 | EXPORT_SYMBOL(_change_bit_be); | ||
160 | EXPORT_SYMBOL(_test_and_change_bit_be); | ||
161 | EXPORT_SYMBOL(_find_first_zero_bit_be); | 155 | EXPORT_SYMBOL(_find_first_zero_bit_be); |
162 | EXPORT_SYMBOL(_find_next_zero_bit_be); | 156 | EXPORT_SYMBOL(_find_next_zero_bit_be); |
163 | EXPORT_SYMBOL(_find_first_bit_be); | 157 | EXPORT_SYMBOL(_find_first_bit_be); |
diff --git a/arch/arm/lib/bitops.h b/arch/arm/lib/bitops.h index bd00551fb797..a9d9d152a751 100644 --- a/arch/arm/lib/bitops.h +++ b/arch/arm/lib/bitops.h | |||
@@ -1,15 +1,15 @@ | |||
1 | 1 | #if __LINUX_ARM_ARCH__ >= 6 | |
2 | #if __LINUX_ARM_ARCH__ >= 6 && defined(CONFIG_CPU_32v6K) | ||
3 | .macro bitop, instr | 2 | .macro bitop, instr |
4 | ands ip, r1, #3 | 3 | ands ip, r1, #3 |
5 | strneb r1, [ip] @ assert word-aligned | 4 | strneb r1, [ip] @ assert word-aligned |
6 | mov r2, #1 | 5 | mov r2, #1 |
7 | and r3, r0, #7 @ Get bit offset | 6 | and r3, r0, #31 @ Get bit offset |
8 | add r1, r1, r0, lsr #3 @ Get byte offset | 7 | mov r0, r0, lsr #5 |
8 | add r1, r1, r0, lsl #2 @ Get word offset | ||
9 | mov r3, r2, lsl r3 | 9 | mov r3, r2, lsl r3 |
10 | 1: ldrexb r2, [r1] | 10 | 1: ldrex r2, [r1] |
11 | \instr r2, r2, r3 | 11 | \instr r2, r2, r3 |
12 | strexb r0, r2, [r1] | 12 | strex r0, r2, [r1] |
13 | cmp r0, #0 | 13 | cmp r0, #0 |
14 | bne 1b | 14 | bne 1b |
15 | mov pc, lr | 15 | mov pc, lr |
@@ -18,15 +18,16 @@ | |||
18 | .macro testop, instr, store | 18 | .macro testop, instr, store |
19 | ands ip, r1, #3 | 19 | ands ip, r1, #3 |
20 | strneb r1, [ip] @ assert word-aligned | 20 | strneb r1, [ip] @ assert word-aligned |
21 | and r3, r0, #7 @ Get bit offset | ||
22 | mov r2, #1 | 21 | mov r2, #1 |
23 | add r1, r1, r0, lsr #3 @ Get byte offset | 22 | and r3, r0, #31 @ Get bit offset |
23 | mov r0, r0, lsr #5 | ||
24 | add r1, r1, r0, lsl #2 @ Get word offset | ||
24 | mov r3, r2, lsl r3 @ create mask | 25 | mov r3, r2, lsl r3 @ create mask |
25 | smp_dmb | 26 | smp_dmb |
26 | 1: ldrexb r2, [r1] | 27 | 1: ldrex r2, [r1] |
27 | ands r0, r2, r3 @ save old value of bit | 28 | ands r0, r2, r3 @ save old value of bit |
28 | \instr r2, r2, r3 @ toggle bit | 29 | \instr r2, r2, r3 @ toggle bit |
29 | strexb ip, r2, [r1] | 30 | strex ip, r2, [r1] |
30 | cmp ip, #0 | 31 | cmp ip, #0 |
31 | bne 1b | 32 | bne 1b |
32 | smp_dmb | 33 | smp_dmb |
@@ -38,13 +39,14 @@ | |||
38 | .macro bitop, instr | 39 | .macro bitop, instr |
39 | ands ip, r1, #3 | 40 | ands ip, r1, #3 |
40 | strneb r1, [ip] @ assert word-aligned | 41 | strneb r1, [ip] @ assert word-aligned |
41 | and r2, r0, #7 | 42 | and r2, r0, #31 |
43 | mov r0, r0, lsr #5 | ||
42 | mov r3, #1 | 44 | mov r3, #1 |
43 | mov r3, r3, lsl r2 | 45 | mov r3, r3, lsl r2 |
44 | save_and_disable_irqs ip | 46 | save_and_disable_irqs ip |
45 | ldrb r2, [r1, r0, lsr #3] | 47 | ldr r2, [r1, r0, lsl #2] |
46 | \instr r2, r2, r3 | 48 | \instr r2, r2, r3 |
47 | strb r2, [r1, r0, lsr #3] | 49 | str r2, [r1, r0, lsl #2] |
48 | restore_irqs ip | 50 | restore_irqs ip |
49 | mov pc, lr | 51 | mov pc, lr |
50 | .endm | 52 | .endm |
@@ -60,11 +62,11 @@ | |||
60 | .macro testop, instr, store | 62 | .macro testop, instr, store |
61 | ands ip, r1, #3 | 63 | ands ip, r1, #3 |
62 | strneb r1, [ip] @ assert word-aligned | 64 | strneb r1, [ip] @ assert word-aligned |
63 | add r1, r1, r0, lsr #3 | 65 | and r3, r0, #31 |
64 | and r3, r0, #7 | 66 | mov r0, r0, lsr #5 |
65 | mov r0, #1 | ||
66 | save_and_disable_irqs ip | 67 | save_and_disable_irqs ip |
67 | ldrb r2, [r1] | 68 | ldr r2, [r1, r0, lsl #2]! |
69 | mov r0, #1 | ||
68 | tst r2, r0, lsl r3 | 70 | tst r2, r0, lsl r3 |
69 | \instr r2, r2, r0, lsl r3 | 71 | \instr r2, r2, r0, lsl r3 |
70 | \store r2, [r1] | 72 | \store r2, [r1] |
diff --git a/arch/arm/lib/changebit.S b/arch/arm/lib/changebit.S index 80f3115cbee2..68ed5b62e839 100644 --- a/arch/arm/lib/changebit.S +++ b/arch/arm/lib/changebit.S | |||
@@ -12,12 +12,6 @@ | |||
12 | #include "bitops.h" | 12 | #include "bitops.h" |
13 | .text | 13 | .text |
14 | 14 | ||
15 | /* Purpose : Function to change a bit | 15 | ENTRY(_change_bit) |
16 | * Prototype: int change_bit(int bit, void *addr) | ||
17 | */ | ||
18 | ENTRY(_change_bit_be) | ||
19 | eor r0, r0, #0x18 @ big endian byte ordering | ||
20 | ENTRY(_change_bit_le) | ||
21 | bitop eor | 16 | bitop eor |
22 | ENDPROC(_change_bit_be) | 17 | ENDPROC(_change_bit) |
23 | ENDPROC(_change_bit_le) | ||
diff --git a/arch/arm/lib/clearbit.S b/arch/arm/lib/clearbit.S index 1a63e43a1df0..4c04c3b51eeb 100644 --- a/arch/arm/lib/clearbit.S +++ b/arch/arm/lib/clearbit.S | |||
@@ -12,13 +12,6 @@ | |||
12 | #include "bitops.h" | 12 | #include "bitops.h" |
13 | .text | 13 | .text |
14 | 14 | ||
15 | /* | 15 | ENTRY(_clear_bit) |
16 | * Purpose : Function to clear a bit | ||
17 | * Prototype: int clear_bit(int bit, void *addr) | ||
18 | */ | ||
19 | ENTRY(_clear_bit_be) | ||
20 | eor r0, r0, #0x18 @ big endian byte ordering | ||
21 | ENTRY(_clear_bit_le) | ||
22 | bitop bic | 16 | bitop bic |
23 | ENDPROC(_clear_bit_be) | 17 | ENDPROC(_clear_bit) |
24 | ENDPROC(_clear_bit_le) | ||
diff --git a/arch/arm/lib/setbit.S b/arch/arm/lib/setbit.S index 1dd7176c4b2b..bbee5c66a23e 100644 --- a/arch/arm/lib/setbit.S +++ b/arch/arm/lib/setbit.S | |||
@@ -12,13 +12,6 @@ | |||
12 | #include "bitops.h" | 12 | #include "bitops.h" |
13 | .text | 13 | .text |
14 | 14 | ||
15 | /* | 15 | ENTRY(_set_bit) |
16 | * Purpose : Function to set a bit | ||
17 | * Prototype: int set_bit(int bit, void *addr) | ||
18 | */ | ||
19 | ENTRY(_set_bit_be) | ||
20 | eor r0, r0, #0x18 @ big endian byte ordering | ||
21 | ENTRY(_set_bit_le) | ||
22 | bitop orr | 16 | bitop orr |
23 | ENDPROC(_set_bit_be) | 17 | ENDPROC(_set_bit) |
24 | ENDPROC(_set_bit_le) | ||
diff --git a/arch/arm/lib/testchangebit.S b/arch/arm/lib/testchangebit.S index 5c98dc567f0f..15a4d431f229 100644 --- a/arch/arm/lib/testchangebit.S +++ b/arch/arm/lib/testchangebit.S | |||
@@ -12,9 +12,6 @@ | |||
12 | #include "bitops.h" | 12 | #include "bitops.h" |
13 | .text | 13 | .text |
14 | 14 | ||
15 | ENTRY(_test_and_change_bit_be) | 15 | ENTRY(_test_and_change_bit) |
16 | eor r0, r0, #0x18 @ big endian byte ordering | 16 | testop eor, str |
17 | ENTRY(_test_and_change_bit_le) | 17 | ENDPROC(_test_and_change_bit) |
18 | testop eor, strb | ||
19 | ENDPROC(_test_and_change_bit_be) | ||
20 | ENDPROC(_test_and_change_bit_le) | ||
diff --git a/arch/arm/lib/testclearbit.S b/arch/arm/lib/testclearbit.S index 543d7094d18e..521b66b5b95d 100644 --- a/arch/arm/lib/testclearbit.S +++ b/arch/arm/lib/testclearbit.S | |||
@@ -12,9 +12,6 @@ | |||
12 | #include "bitops.h" | 12 | #include "bitops.h" |
13 | .text | 13 | .text |
14 | 14 | ||
15 | ENTRY(_test_and_clear_bit_be) | 15 | ENTRY(_test_and_clear_bit) |
16 | eor r0, r0, #0x18 @ big endian byte ordering | 16 | testop bicne, strne |
17 | ENTRY(_test_and_clear_bit_le) | 17 | ENDPROC(_test_and_clear_bit) |
18 | testop bicne, strneb | ||
19 | ENDPROC(_test_and_clear_bit_be) | ||
20 | ENDPROC(_test_and_clear_bit_le) | ||
diff --git a/arch/arm/lib/testsetbit.S b/arch/arm/lib/testsetbit.S index 0b3f390401ce..1c98cc2185bb 100644 --- a/arch/arm/lib/testsetbit.S +++ b/arch/arm/lib/testsetbit.S | |||
@@ -12,9 +12,6 @@ | |||
12 | #include "bitops.h" | 12 | #include "bitops.h" |
13 | .text | 13 | .text |
14 | 14 | ||
15 | ENTRY(_test_and_set_bit_be) | 15 | ENTRY(_test_and_set_bit) |
16 | eor r0, r0, #0x18 @ big endian byte ordering | 16 | testop orreq, streq |
17 | ENTRY(_test_and_set_bit_le) | 17 | ENDPROC(_test_and_set_bit) |
18 | testop orreq, streqb | ||
19 | ENDPROC(_test_and_set_bit_be) | ||
20 | ENDPROC(_test_and_set_bit_le) | ||