Index: lib/builtins/arm/sync-ops.h =================================================================== --- lib/builtins/arm/sync-ops.h +++ lib/builtins/arm/sync-ops.h @@ -15,6 +15,20 @@ #include "../assembly.h" +#if __ARM_ARCH_PROFILE == 'M' +#define SYNC_OP_4(op) \ + .thumb ; \ + .syntax unified ; \ + DEFINE_COMPILERRT_THUMB_FUNCTION(__sync_fetch_and_ ## op) \ + mrs r3, PRIMASK ; \ + cpsid i ; \ + mov r2, r0 ; \ + ldr r0, [r2] ; \ + op(r1, r1, r0) ; \ + str r1, [r2] ; \ + msr PRIMASK, r3 ; \ + bx lr; +#else #define SYNC_OP_4(op) \ .p2align 2 ; \ .thumb ; \ @@ -30,7 +44,25 @@ bne LOCAL_LABEL(tryatomic_ ## op) ; \ dmb ; \ bx lr +#endif +#if __ARM_ARCH_PROFILE == 'M' +#define SYNC_OP_8(op) \ + .thumb ; \ + .syntax unified ; \ + DEFINE_COMPILERRT_THUMB_FUNCTION(__sync_fetch_and_ ## op) \ + push {r4, r5, lr} ; \ + mov r4, r0 ; \ + mrs r5, PRIMASK ; \ + cpsid i ; \ + ldr r0, [r4, #0] ; \ + ldr r1, [r4, #4] ; \ + op(r2, r3, r2, r3, r0, r1) ; \ + str r2, [r4, #0] ; \ + str r3, [r4, #4] ; \ + msr PRIMASK, r5 ; \ + pop {r4, r5, pc} ; +#else #define SYNC_OP_8(op) \ .p2align 2 ; \ .thumb ; \ @@ -47,6 +79,7 @@ bne LOCAL_LABEL(tryatomic_ ## op) ; \ dmb ; \ pop {r4, r5, r6, pc} +#endif #define MINMAX_4(rD, rN, rM, cmp_kind) \ cmp rN, rM ; \ Index: lib/builtins/arm/sync_fetch_and_add_8.S =================================================================== --- lib/builtins/arm/sync_fetch_and_add_8.S +++ lib/builtins/arm/sync_fetch_and_add_8.S @@ -14,13 +14,11 @@ #include "sync-ops.h" -#if __ARM_ARCH_PROFILE != 'M' #define add_8(rD_LO, rD_HI, rN_LO, rN_HI, rM_LO, rM_HI) \ adds rD_LO, rN_LO, rM_LO ; \ adc rD_HI, rN_HI, rM_HI SYNC_OP_8(add_8) -#endif NO_EXEC_STACK_DIRECTIVE Index: lib/builtins/arm/sync_fetch_and_and_8.S =================================================================== --- lib/builtins/arm/sync_fetch_and_and_8.S +++ lib/builtins/arm/sync_fetch_and_and_8.S @@ -14,13 +14,11 @@ #include "sync-ops.h" -#if __ARM_ARCH_PROFILE != 'M' #define and_8(rD_LO, rD_HI, rN_LO, rN_HI, rM_LO, rM_HI) \ and rD_LO, rN_LO, rM_LO ; \ and rD_HI, rN_HI, rM_HI SYNC_OP_8(and_8) -#endif NO_EXEC_STACK_DIRECTIVE Index: lib/builtins/arm/sync_fetch_and_max_8.S =================================================================== --- lib/builtins/arm/sync_fetch_and_max_8.S +++ lib/builtins/arm/sync_fetch_and_max_8.S @@ -14,11 +14,9 @@ #include "sync-ops.h" -#if __ARM_ARCH_PROFILE != 'M' #define max_8(rD_LO, rD_HI, rN_LO, rN_HI, rM_LO, rM_HI) MINMAX_8(rD_LO, rD_HI, rN_LO, rN_HI, rM_LO, rM_HI, gt) SYNC_OP_8(max_8) -#endif NO_EXEC_STACK_DIRECTIVE Index: lib/builtins/arm/sync_fetch_and_nand_8.S =================================================================== --- lib/builtins/arm/sync_fetch_and_nand_8.S +++ lib/builtins/arm/sync_fetch_and_nand_8.S @@ -14,13 +14,11 @@ #include "sync-ops.h" -#if __ARM_ARCH_PROFILE != 'M' #define nand_8(rD_LO, rD_HI, rN_LO, rN_HI, rM_LO, rM_HI) \ bic rD_LO, rN_LO, rM_LO ; \ bic rD_HI, rN_HI, rM_HI SYNC_OP_8(nand_8) -#endif NO_EXEC_STACK_DIRECTIVE Index: lib/builtins/arm/sync_fetch_and_or_8.S =================================================================== --- lib/builtins/arm/sync_fetch_and_or_8.S +++ lib/builtins/arm/sync_fetch_and_or_8.S @@ -14,13 +14,11 @@ #include "sync-ops.h" -#if __ARM_ARCH_PROFILE != 'M' #define or_8(rD_LO, rD_HI, rN_LO, rN_HI, rM_LO, rM_HI) \ orr rD_LO, rN_LO, rM_LO ; \ orr rD_HI, rN_HI, rM_HI SYNC_OP_8(or_8) -#endif NO_EXEC_STACK_DIRECTIVE Index: lib/builtins/arm/sync_fetch_and_sub_8.S =================================================================== --- lib/builtins/arm/sync_fetch_and_sub_8.S +++ lib/builtins/arm/sync_fetch_and_sub_8.S @@ -14,13 +14,11 @@ #include "sync-ops.h" -#if __ARM_ARCH_PROFILE != 'M' #define sub_8(rD_LO, rD_HI, rN_LO, rN_HI, rM_LO, rM_HI) \ subs rD_LO, rN_LO, rM_LO ; \ sbc rD_HI, rN_HI, rM_HI SYNC_OP_8(sub_8) -#endif NO_EXEC_STACK_DIRECTIVE Index: lib/builtins/arm/sync_fetch_and_xor_8.S =================================================================== --- lib/builtins/arm/sync_fetch_and_xor_8.S +++ lib/builtins/arm/sync_fetch_and_xor_8.S @@ -14,13 +14,11 @@ #include "sync-ops.h" -#if __ARM_ARCH_PROFILE != 'M' #define xor_8(rD_LO, rD_HI, rN_LO, rN_HI, rM_LO, rM_HI) \ eor rD_LO, rN_LO, rM_LO ; \ eor rD_HI, rN_HI, rM_HI SYNC_OP_8(xor_8) -#endif NO_EXEC_STACK_DIRECTIVE