blob: 64146c177956d2a4f7ad61fb4e8bc7b1b6a45e15 [file] [log] [blame]
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -07001/*
2 * Copyright (C) 2008 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17
18 .text
19 .align
20
21 .global android_atomic_write
22
23 .global android_atomic_inc
24 .global android_atomic_dec
25
26 .global android_atomic_add
27 .global android_atomic_and
28 .global android_atomic_or
29
30 .global android_atomic_swap
31
32 .global android_atomic_cmpxchg
33
34
35
36/* FIXME: On SMP systems memory barriers may be needed */
37#warning "this file is not safe with SMP systems"
38
39
40/*
41 * ----------------------------------------------------------------------------
42 * android_atomic_write
43 * input: r0=value, r1=address
44 * output: void
45 */
46
47android_atomic_write:
481: ldrex r12, [r1]
49 strex r12, r0, [r1]
50 cmp r12, #0
51 bne 1b
52 bx lr
53
54/*
55 * ----------------------------------------------------------------------------
56 * android_atomic_inc
57 * input: r0 = address
58 * output: r0 = old value
59 */
60
61android_atomic_inc:
62 mov r12, r0
631: ldrex r0, [r12]
64 add r2, r0, #1
65 strex r1, r2, [r12]
66 cmp r1, #0
67 bxeq lr
68 b 1b
69
70/*
71 * ----------------------------------------------------------------------------
72 * android_atomic_dec
73 * input: r0=address
74 * output: r0 = old value
75 */
76
77android_atomic_dec:
78 mov r12, r0
791: ldrex r0, [r12]
80 sub r2, r0, #1
81 strex r1, r2, [r12]
82 cmp r1, #0
83 bxeq lr
84 b 1b
85
86
87/*
88 * ----------------------------------------------------------------------------
89 * android_atomic_add
90 * input: r0=value, r1=address
91 * output: r0 = old value
92 */
93
94android_atomic_add:
95 mov r12, r0
961: ldrex r0, [r1]
97 add r2, r0, r12
98 strex r3, r2, [r1]
99 cmp r3, #0
100 bxeq lr
101 b 1b
102
103/*
104 * ----------------------------------------------------------------------------
105 * android_atomic_and
106 * input: r0=value, r1=address
107 * output: r0 = old value
108 */
109
110android_atomic_and:
111 mov r12, r0
1121: ldrex r0, [r1]
113 and r2, r0, r12
114 strex r3, r2, [r1]
115 cmp r3, #0
116 bxeq lr
117 b 1b
118
119
120/*
121 * ----------------------------------------------------------------------------
122 * android_atomic_or
123 * input: r0=value, r1=address
124 * output: r0 = old value
125 */
126
127android_atomic_or:
128 mov r12, r0
1291: ldrex r0, [r1]
130 orr r2, r0, r12
131 strex r3, r2, [r1]
132 cmp r3, #0
133 bxeq lr
134 b 1b
135
136/*
137 * ----------------------------------------------------------------------------
138 * android_atomic_swap
139 * input: r0=value, r1=address
140 * output: r0 = old value
141 */
142
143android_atomic_swap:
144 swp r0, r0, [r1]
145 bx lr
146
147/*
148 * ----------------------------------------------------------------------------
149 * android_atomic_cmpxchg
150 * input: r0=oldvalue, r1=newvalue, r2=address
151 * output: r0 = 0 (xchg done) or non-zero (xchg not done)
152 */
153
154android_atomic_cmpxchg:
155 mov r12, r1
156 ldrex r3, [r2]
157 eors r0, r0, r3
158 strexeq r0, r12, [r2]
159 bx lr
160
161
162
163/*
164 * ----------------------------------------------------------------------------
165 * android_atomic_cmpxchg_64
166 * input: r0-r1=oldvalue, r2-r3=newvalue, arg4 (on stack)=address
167 * output: r0 = 0 (xchg done) or non-zero (xchg not done)
168 */
169/* TODO: NEED IMPLEMENTATION FOR THIS ARCHITECTURE */