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