Home | History | Annotate | Line # | Download | only in arm
      1      1.1  joerg /*===-- sync-ops.h - --===//
      2      1.1  joerg  *
      3      1.1  joerg  *                     The LLVM Compiler Infrastructure
      4      1.1  joerg  *
      5      1.1  joerg  * This file is dual licensed under the MIT and the University of Illinois Open
      6      1.1  joerg  * Source Licenses. See LICENSE.TXT for details.
      7      1.1  joerg  *
      8      1.1  joerg  *===----------------------------------------------------------------------===//
      9      1.1  joerg  *
     10      1.1  joerg  * This file implements outline macros for the __sync_fetch_and_*
     11      1.1  joerg  * operations. Different instantiations will generate appropriate assembly for
     12      1.1  joerg  * ARM and Thumb-2 versions of the functions.
     13      1.1  joerg  *
     14      1.1  joerg  *===----------------------------------------------------------------------===*/
     15      1.1  joerg 
     16      1.1  joerg #include "../assembly.h"
     17      1.1  joerg 
     18      1.1  joerg #define SYNC_OP_4(op) \
     19      1.1  joerg         .p2align 2 ; \
     20      1.1  joerg         .thumb ; \
     21  1.1.1.2  joerg         .syntax unified ; \
     22  1.1.1.3  joerg         DEFINE_COMPILERRT_THUMB_FUNCTION(__sync_fetch_and_ ## op) \
     23      1.1  joerg         dmb ; \
     24      1.1  joerg         mov r12, r0 ; \
     25      1.1  joerg         LOCAL_LABEL(tryatomic_ ## op): \
     26      1.1  joerg         ldrex r0, [r12] ; \
     27      1.1  joerg         op(r2, r0, r1) ; \
     28      1.1  joerg         strex r3, r2, [r12] ; \
     29  1.1.1.2  joerg         cmp r3, #0 ; \
     30  1.1.1.2  joerg         bne LOCAL_LABEL(tryatomic_ ## op) ; \
     31      1.1  joerg         dmb ; \
     32      1.1  joerg         bx lr
     33      1.1  joerg 
     34      1.1  joerg #define SYNC_OP_8(op) \
     35      1.1  joerg         .p2align 2 ; \
     36      1.1  joerg         .thumb ; \
     37  1.1.1.2  joerg         .syntax unified ; \
     38  1.1.1.3  joerg         DEFINE_COMPILERRT_THUMB_FUNCTION(__sync_fetch_and_ ## op) \
     39      1.1  joerg         push {r4, r5, r6, lr} ; \
     40      1.1  joerg         dmb ; \
     41      1.1  joerg         mov r12, r0 ; \
     42      1.1  joerg         LOCAL_LABEL(tryatomic_ ## op): \
     43      1.1  joerg         ldrexd r0, r1, [r12] ; \
     44      1.1  joerg         op(r4, r5, r0, r1, r2, r3) ; \
     45      1.1  joerg         strexd r6, r4, r5, [r12] ; \
     46  1.1.1.2  joerg         cmp r6, #0 ; \
     47  1.1.1.2  joerg         bne LOCAL_LABEL(tryatomic_ ## op) ; \
     48      1.1  joerg         dmb ; \
     49      1.1  joerg         pop {r4, r5, r6, pc}
     50      1.1  joerg 
     51      1.1  joerg #define MINMAX_4(rD, rN, rM, cmp_kind) \
     52      1.1  joerg         cmp rN, rM ; \
     53      1.1  joerg         mov rD, rM ; \
     54      1.1  joerg         it cmp_kind ; \
     55      1.1  joerg         mov##cmp_kind rD, rN
     56      1.1  joerg 
     57      1.1  joerg #define MINMAX_8(rD_LO, rD_HI, rN_LO, rN_HI, rM_LO, rM_HI, cmp_kind) \
     58      1.1  joerg         cmp rN_LO, rM_LO ; \
     59      1.1  joerg         sbcs rN_HI, rM_HI ; \
     60      1.1  joerg         mov rD_LO, rM_LO ; \
     61      1.1  joerg         mov rD_HI, rM_HI ; \
     62      1.1  joerg         itt cmp_kind ; \
     63      1.1  joerg         mov##cmp_kind rD_LO, rN_LO ; \
     64      1.1  joerg         mov##cmp_kind rD_HI, rN_HI
     65