Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(66)

Unified Diff: src/compiler/arm64/code-generator-arm64.cc

Issue 2754543006: [arm64] Use exclusive instructions in exchange (Closed)
Patch Set: Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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;

Powered by Google App Engine
This is Rietveld 408576698