diff --git a/src/sync/atomic/asm_darwin_arm.s b/src/sync/atomic/asm_darwin_arm.s index c64336034d..226822926f 100644 --- a/src/sync/atomic/asm_darwin_arm.s +++ b/src/sync/atomic/asm_darwin_arm.s @@ -6,6 +6,12 @@ // Darwin/ARM atomic operations. +#define DMB_ISHST_7 \ + WORD $0xf57ff05a // dmb ishst + +#define DMB_ISH_7 \ + WORD $0xf57ff05b // dmb ish + TEXT ·CompareAndSwapInt32(SB),NOSPLIT,$0 B ·CompareAndSwapUint32(SB) @@ -58,9 +64,11 @@ TEXT ·LoadUint32(SB),NOSPLIT,$0-8 MOVW addr+0(FP), R1 load32loop: LDREX (R1), R2 // loads R2 + DMB_ISHST_7 STREX R2, (R1), R0 // stores R2 CMP $0, R0 BNE load32loop + DMB_ISH_7 MOVW R2, val+4(FP) RET @@ -84,9 +92,11 @@ TEXT ·StoreUint32(SB),NOSPLIT,$0-8 MOVW val+4(FP), R2 storeloop: LDREX (R1), R4 // loads R4 + DMB_ISHST_7 STREX R2, (R1), R0 // stores R2 CMP $0, R0 BNE storeloop + DMB_ISH_7 RET TEXT ·StoreInt64(SB),NOSPLIT,$0