overhaul ARM atomics/tls for performance and compatibility
[musl] / arch / arm / src / arm / atomics.s
1 .text
2
3 .global __a_barrier
4 .hidden __a_barrier
5 .type __a_barrier,%function
6 __a_barrier:
7         ldr ip,1f
8         ldr ip,[pc,ip]
9         add pc,pc,ip
10 1:      .word __a_barrier_ptr-1b
11 .global __a_barrier_dummy
12 .hidden __a_barrier_dummy
13 __a_barrier_dummy:
14         tst lr,#1
15         moveq pc,lr
16         bx lr
17 .global __a_barrier_oldkuser
18 .hidden __a_barrier_oldkuser
19 __a_barrier_oldkuser:
20         push {r0,r1,r2,r3,ip,lr}
21         mov r1,r0
22         mov r2,sp
23         ldr ip,=0xffff0fc0
24         mov lr,pc
25         mov pc,ip
26         pop {r0,r1,r2,r3,ip,lr}
27         tst lr,#1
28         moveq pc,lr
29         bx lr
30 .global __a_barrier_v6
31 .hidden __a_barrier_v6
32 __a_barrier_v6:
33         mcr p15,0,r0,c7,c10,5
34         bx lr
35 .global __a_barrier_v7
36 .hidden __a_barrier_v7
37 __a_barrier_v7:
38         .word 0xf57ff05b        /* dmb ish */
39         bx lr
40
41 .global __a_cas
42 .hidden __a_cas
43 .type __a_cas,%function
44 __a_cas:
45         ldr ip,1f
46         ldr ip,[pc,ip]
47         add pc,pc,ip
48 1:      .word __a_cas_ptr-1b
49 .global __a_cas_dummy
50 .hidden __a_cas_dummy
51 __a_cas_dummy:
52         mov r3,r0
53         ldr r0,[r2]
54         subs r0,r3,r0
55         streq r1,[r2]
56         tst lr,#1
57         moveq pc,lr
58         bx lr
59 .global __a_cas_v6
60 .hidden __a_cas_v6
61 __a_cas_v6:
62         mov r3,r0
63         mcr p15,0,r0,c7,c10,5
64 1:      .word 0xe1920f9f        /* ldrex r0,[r2] */
65         subs r0,r3,r0
66         .word 0x01820f91        /* strexeq r0,r1,[r2] */
67         teqeq r0,#1
68         beq 1b
69         mcr p15,0,r0,c7,c10,5
70         bx lr
71 .global __a_cas_v7
72 .hidden __a_cas_v7
73 __a_cas_v7:
74         mov r3,r0
75         .word 0xf57ff05b        /* dmb ish */
76 1:      .word 0xe1920f9f        /* ldrex r0,[r2] */
77         subs r0,r3,r0
78         .word 0x01820f91        /* strexeq r0,r1,[r2] */
79         teqeq r0,#1
80         beq 1b
81         .word 0xf57ff05b        /* dmb ish */
82         bx lr
83
84 .global __a_gettp
85 .hidden __a_gettp
86 .type __a_gettp,%function
87 __a_gettp:
88         ldr r0,1f
89         ldr r0,[pc,r0]
90         add pc,pc,r0
91 1:      .word __a_gettp_ptr-1b
92 .global __a_gettp_dummy
93 .hidden __a_gettp_dummy
94 __a_gettp_dummy:
95         .word 0xe7fddef1
96 .global __a_gettp_native
97 .hidden __a_gettp_native
98 __a_gettp_native:
99         mrc p15,0,r0,c13,c0,3
100         bx lr
101
102 .data
103 .global __a_barrier_ptr
104 .hidden __a_barrier_ptr
105 __a_barrier_ptr:
106         .word 0
107
108 .global __a_cas_ptr
109 .hidden __a_cas_ptr
110 __a_cas_ptr:
111         .word 0
112
113 .global __a_gettp_ptr
114 .hidden __a_gettp_ptr
115 __a_gettp_ptr:
116         .word 0