Linux 3.17-rc2
[linux/fpc-iii.git] / arch / arm64 / lib / bitops.S
blob7dac371cc9a2f8c817d895d1be0103db9a009ec9
1 /*
2  * Based on arch/arm/lib/bitops.h
3  *
4  * Copyright (C) 2013 ARM Ltd.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  */
19 #include <linux/linkage.h>
20 #include <asm/assembler.h>
23  * x0: bits 5:0  bit offset
24  *     bits 31:6 word offset
25  * x1: address
26  */
27         .macro  bitop, name, instr
28 ENTRY(  \name   )
29         and     w3, w0, #63             // Get bit offset
30         eor     w0, w0, w3              // Clear low bits
31         mov     x2, #1
32         add     x1, x1, x0, lsr #3      // Get word offset
33         lsl     x3, x2, x3              // Create mask
34 1:      ldxr    x2, [x1]
35         \instr  x2, x2, x3
36         stxr    w0, x2, [x1]
37         cbnz    w0, 1b
38         ret
39 ENDPROC(\name   )
40         .endm
42         .macro  testop, name, instr
43 ENTRY(  \name   )
44         and     w3, w0, #63             // Get bit offset
45         eor     w0, w0, w3              // Clear low bits
46         mov     x2, #1
47         add     x1, x1, x0, lsr #3      // Get word offset
48         lsl     x4, x2, x3              // Create mask
49 1:      ldxr    x2, [x1]
50         lsr     x0, x2, x3              // Save old value of bit
51         \instr  x2, x2, x4              // toggle bit
52         stlxr   w5, x2, [x1]
53         cbnz    w5, 1b
54         dmb     ish
55         and     x0, x0, #1
56 3:      ret
57 ENDPROC(\name   )
58         .endm
61  * Atomic bit operations.
62  */
63         bitop   change_bit, eor
64         bitop   clear_bit, bic
65         bitop   set_bit, orr
67         testop  test_and_change_bit, eor
68         testop  test_and_clear_bit, bic
69         testop  test_and_set_bit, orr