aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/lib/bitops.h
diff options
context:
space:
mode:
authorRussell King <rmk@dyn-67.arm.linux.org.uk>2005-07-16 10:21:51 -0400
committerRussell King <rmk+kernel@arm.linux.org.uk>2005-07-16 10:21:51 -0400
commit54ea06f6afe85aaf419e51343d4e4b5599197113 (patch)
treee486f20da3931e62f07014c4aaf8d7042d656151 /arch/arm/lib/bitops.h
parent9fb1759a3102c26cd8f64254a7c3e532782c2bb8 (diff)
[PATCH] ARM: Convert bitops to use ARMv6 ldrex/strex instructions
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm/lib/bitops.h')
-rw-r--r--arch/arm/lib/bitops.h31
1 files changed, 31 insertions, 0 deletions
diff --git a/arch/arm/lib/bitops.h b/arch/arm/lib/bitops.h
index 4a83ab6cd565..6976e60e47cb 100644
--- a/arch/arm/lib/bitops.h
+++ b/arch/arm/lib/bitops.h
@@ -1,3 +1,33 @@
1#if __LINUX_ARM_ARCH__ >= 6
2 .macro bitop, instr
3 mov r2, #1
4 and r3, r0, #7 @ Get bit offset
5 add r1, r1, r0, lsr #3 @ Get byte offset
6 mov r3, r2, lsl r3
71: ldrexb r2, [r1]
8 \instr r2, r2, r3
9 strexb r0, r2, [r1]
10 cmpne r0, #0
11 bne 1b
12 mov pc, lr
13 .endm
14
15 .macro testop, instr, store
16 and r3, r0, #7 @ Get bit offset
17 mov r2, #1
18 add r1, r1, r0, lsr #3 @ Get byte offset
19 mov r3, r2, lsl r3 @ create mask
201: ldrexb r2, [r1]
21 ands r0, r2, r3 @ save old value of bit
22 \instr ip, r2, r3 @ toggle bit
23 strexb r2, ip, [r1]
24 cmp r2, #0
25 bne 1b
26 cmp r0, #0
27 movne r0, #1
282: mov pc, lr
29 .endm
30#else
1 .macro bitop, instr 31 .macro bitop, instr
2 and r2, r0, #7 32 and r2, r0, #7
3 mov r3, #1 33 mov r3, #1
@@ -31,3 +61,4 @@
31 moveq r0, #0 61 moveq r0, #0
32 mov pc, lr 62 mov pc, lr
33 .endm 63 .endm
64#endif