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