| Tim Northover | 1683caa | 2014-03-04 10:10:17 +0000 | [diff] [blame^] | 1 | /*===-- sync-ops.h - --===// |
| 2 | * |
| 3 | * The LLVM Compiler Infrastructure |
| 4 | * |
| 5 | * This file is dual licensed under the MIT and the University of Illinois Open |
| 6 | * Source Licenses. See LICENSE.TXT for details. |
| 7 | * |
| 8 | *===----------------------------------------------------------------------===// |
| 9 | * |
| 10 | * FIXME: description |
| 11 | * This file implements the __udivsi3 (32-bit unsigned integer divide) |
| 12 | * function for the ARM architecture. A naive digit-by-digit computation is |
| 13 | * employed for simplicity. |
| 14 | * |
| 15 | *===----------------------------------------------------------------------===*/ |
| 16 | |
| 17 | #include "../assembly.h" |
| 18 | |
| 19 | #define SYNC_OP_4(op) \ |
| 20 | .align 2 ; \ |
| 21 | .thumb ; \ |
| 22 | DEFINE_COMPILERRT_FUNCTION(__sync_fetch_and_ ## op) \ |
| 23 | dmb ; \ |
| 24 | mov r12, r0 ; \ |
| 25 | LOCAL_LABEL(tryatomic_ ## op): \ |
| 26 | ldrex r0, [r12] ; \ |
| 27 | op(r2, r0, r1) ; \ |
| 28 | strex r3, r2, [r12] ; \ |
| 29 | cbnz r3, LOCAL_LABEL(tryatomic_ ## op) ; \ |
| 30 | dmb ; \ |
| 31 | bx lr |
| 32 | |
| 33 | #define SYNC_OP_8(op) \ |
| 34 | .align 2 ; \ |
| 35 | .thumb ; \ |
| 36 | DEFINE_COMPILERRT_FUNCTION(__sync_fetch_and_ ## op) \ |
| 37 | push {r4, r5, r6, lr} ; \ |
| 38 | dmb ; \ |
| 39 | mov r12, r0 ; \ |
| 40 | LOCAL_LABEL(tryatomic_ ## op): \ |
| 41 | ldrexd r0, r1, [r12] ; \ |
| 42 | op(r4, r5, r0, r1, r2, r3) ; \ |
| 43 | strexd r6, r4, r5, [r12] ; \ |
| 44 | cbnz r6, LOCAL_LABEL(tryatomic_ ## op) ; \ |
| 45 | dmb ; \ |
| 46 | pop {r4, r5, r6, pc} |
| 47 | |
| 48 | #define MINMAX_4(rD, rN, rM, cmp_kind) \ |
| 49 | cmp rN, rM ; \ |
| 50 | mov rD, rM ; \ |
| 51 | it cmp_kind ; \ |
| 52 | mov##cmp_kind rD, rN |
| 53 | |
| 54 | #define MINMAX_8(rD_LO, rD_HI, rN_LO, rN_HI, rM_LO, rM_HI, cmp_kind) \ |
| 55 | cmp rN_LO, rM_LO ; \ |
| 56 | sbcs rN_HI, rM_HI ; \ |
| 57 | mov rD_LO, rM_LO ; \ |
| 58 | mov rD_HI, rM_HI ; \ |
| 59 | itt cmp_kind ; \ |
| 60 | mov##cmp_kind rD_LO, rN_LO ; \ |
| 61 | mov##cmp_kind rD_HI, rN_HI |