Index: src/compiler/arm64/code-generator-arm64.cc |
diff --git a/src/compiler/arm64/code-generator-arm64.cc b/src/compiler/arm64/code-generator-arm64.cc |
index 4b7c85de56b7af2cff2fe45f63f54dabdc2dc6f7..f6c05ddc0d012066abc8b16dabf817e5220016c7 100644 |
--- a/src/compiler/arm64/code-generator-arm64.cc |
+++ b/src/compiler/arm64/code-generator-arm64.cc |
@@ -534,12 +534,14 @@ Condition FlagsConditionToCondition(FlagsCondition condition) { |
#define ASSEMBLE_ATOMIC_EXCHANGE_INTEGER(load_instr, store_instr) \ |
do { \ |
Label exchange; \ |
- __ bind(&exchange); \ |
+ __ Dmb(InnerShareable, BarrierAll); \ |
+ __ Bind(&exchange); \ |
__ Add(i.TempRegister(0), i.InputRegister(0), i.InputRegister(1)); \ |
__ load_instr(i.OutputRegister32(), i.TempRegister(0)); \ |
__ store_instr(i.TempRegister32(), i.InputRegister32(2), \ |
i.TempRegister(0)); \ |
- __ cbnz(i.TempRegister32(), &exchange); \ |
+ __ Cbnz(i.TempRegister32(), &exchange); \ |
+ __ Dmb(InnerShareable, BarrierAll); \ |
} while (0) |
#define ASSEMBLE_IEEE754_BINOP(name) \ |
@@ -1647,21 +1649,21 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( |
__ Dmb(InnerShareable, BarrierAll); |
break; |
case kAtomicExchangeInt8: |
- ASSEMBLE_ATOMIC_EXCHANGE_INTEGER(ldaxrb, stlxrb); |
+ ASSEMBLE_ATOMIC_EXCHANGE_INTEGER(ldxrb, stxrb); |
__ Sxtb(i.OutputRegister(0), i.OutputRegister(0)); |
break; |
case kAtomicExchangeUint8: |
- ASSEMBLE_ATOMIC_EXCHANGE_INTEGER(ldaxrb, stlxrb); |
+ ASSEMBLE_ATOMIC_EXCHANGE_INTEGER(ldxrb, stxrb); |
break; |
case kAtomicExchangeInt16: |
- ASSEMBLE_ATOMIC_EXCHANGE_INTEGER(ldaxrh, stlxrh); |
+ ASSEMBLE_ATOMIC_EXCHANGE_INTEGER(ldxrh, stxrh); |
__ Sxth(i.OutputRegister(0), i.OutputRegister(0)); |
break; |
case kAtomicExchangeUint16: |
- ASSEMBLE_ATOMIC_EXCHANGE_INTEGER(ldaxrh, stlxrh); |
+ ASSEMBLE_ATOMIC_EXCHANGE_INTEGER(ldxrh, stxrh); |
break; |
case kAtomicExchangeWord32: |
- ASSEMBLE_ATOMIC_EXCHANGE_INTEGER(ldaxr, stlxr); |
+ ASSEMBLE_ATOMIC_EXCHANGE_INTEGER(ldxr, stxr); |
break; |
} |
return kSuccess; |