bitops.h (597473720f4dc69749542bfcfed4a927a43d935e) bitops.h (dda5f312bb09e56e7a1c3e3851f2000eb2e9c879)
1/* SPDX-License-Identifier: GPL-2.0 */
2#include <asm/assembler.h>
3#include <asm/unwind.h>
4
5#if __LINUX_ARM_ARCH__ >= 6
6 .macro bitop, name, instr
7ENTRY( \name )
8UNWIND( .fnstart )

--- 14 unchanged lines hidden (view full) ---

23 strex r0, r2, [r1]
24 cmp r0, #0
25 bne 1b
26 bx lr
27UNWIND( .fnend )
28ENDPROC(\name )
29 .endm
30
1/* SPDX-License-Identifier: GPL-2.0 */
2#include <asm/assembler.h>
3#include <asm/unwind.h>
4
5#if __LINUX_ARM_ARCH__ >= 6
6 .macro bitop, name, instr
7ENTRY( \name )
8UNWIND( .fnstart )

--- 14 unchanged lines hidden (view full) ---

23 strex r0, r2, [r1]
24 cmp r0, #0
25 bne 1b
26 bx lr
27UNWIND( .fnend )
28ENDPROC(\name )
29 .endm
30
31 .macro testop, name, instr, store
31 .macro __testop, name, instr, store, barrier
32ENTRY( \name )
33UNWIND( .fnstart )
34 ands ip, r1, #3
35 strbne r1, [ip] @ assert word-aligned
36 mov r2, #1
37 and r3, r0, #31 @ Get bit offset
38 mov r0, r0, lsr #5
39 add r1, r1, r0, lsl #2 @ Get word offset
40 mov r3, r2, lsl r3 @ create mask
32ENTRY( \name )
33UNWIND( .fnstart )
34 ands ip, r1, #3
35 strbne r1, [ip] @ assert word-aligned
36 mov r2, #1
37 and r3, r0, #31 @ Get bit offset
38 mov r0, r0, lsr #5
39 add r1, r1, r0, lsl #2 @ Get word offset
40 mov r3, r2, lsl r3 @ create mask
41 smp_dmb
41 \barrier
42#if __LINUX_ARM_ARCH__ >= 7 && defined(CONFIG_SMP)
43 .arch_extension mp
44 ALT_SMP(W(pldw) [r1])
45 ALT_UP(W(nop))
46#endif
471: ldrex r2, [r1]
48 ands r0, r2, r3 @ save old value of bit
49 \instr r2, r2, r3 @ toggle bit
50 strex ip, r2, [r1]
51 cmp ip, #0
52 bne 1b
42#if __LINUX_ARM_ARCH__ >= 7 && defined(CONFIG_SMP)
43 .arch_extension mp
44 ALT_SMP(W(pldw) [r1])
45 ALT_UP(W(nop))
46#endif
471: ldrex r2, [r1]
48 ands r0, r2, r3 @ save old value of bit
49 \instr r2, r2, r3 @ toggle bit
50 strex ip, r2, [r1]
51 cmp ip, #0
52 bne 1b
53 smp_dmb
53 \barrier
54 cmp r0, #0
55 movne r0, #1
562: bx lr
57UNWIND( .fnend )
58ENDPROC(\name )
59 .endm
54 cmp r0, #0
55 movne r0, #1
562: bx lr
57UNWIND( .fnend )
58ENDPROC(\name )
59 .endm
60
61 .macro testop, name, instr, store
62 __testop \name, \instr, \store, smp_dmb
63 .endm
64
65 .macro sync_testop, name, instr, store
66 __testop \name, \instr, \store, __smp_dmb
67 .endm
60#else
61 .macro bitop, name, instr
62ENTRY( \name )
63UNWIND( .fnstart )
64 ands ip, r1, #3
65 strbne r1, [ip] @ assert word-aligned
66 and r2, r0, #31
67 mov r0, r0, lsr #5

--- 40 unchanged lines hidden ---
68#else
69 .macro bitop, name, instr
70ENTRY( \name )
71UNWIND( .fnstart )
72 ands ip, r1, #3
73 strbne r1, [ip] @ assert word-aligned
74 and r2, r0, #31
75 mov r0, r0, lsr #5

--- 40 unchanged lines hidden ---