| Index: src/compiler/ppc/code-generator-ppc.cc
|
| diff --git a/src/compiler/ppc/code-generator-ppc.cc b/src/compiler/ppc/code-generator-ppc.cc
|
| index b5f3bb5886d34405a8c1a7cd484370e0e8c390e3..d7e552283aacaea0edbbfeda555a615b5cf50605 100644
|
| --- a/src/compiler/ppc/code-generator-ppc.cc
|
| +++ b/src/compiler/ppc/code-generator-ppc.cc
|
| @@ -792,6 +792,16 @@ Condition FlagsConditionToCondition(FlagsCondition condition, ArchOpcode op) {
|
| __ sync(); \
|
| DCHECK_EQ(LeaveRC, i.OutputRCBit()); \
|
| } while (0)
|
| +#define ASSEMBLE_ATOMIC_EXCHANGE_INTEGER(load_instr, store_instr) \
|
| + do { \
|
| + Label exchange; \
|
| + __ bind(&exchange); \
|
| + __ load_instr(i.OutputRegister(0), \
|
| + MemOperand(i.InputRegister(0), i.InputRegister(1))); \
|
| + __ store_instr(i.InputRegister(2), \
|
| + MemOperand(i.InputRegister(0), i.InputRegister(1))); \
|
| + __ bne(&exchange, cr0); \
|
| + } while (0)
|
|
|
| void CodeGenerator::AssembleDeconstructFrame() {
|
| __ LeaveFrame(StackFrame::MANUAL);
|
| @@ -1979,10 +1989,22 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
|
| ASSEMBLE_ATOMIC_STORE_INTEGER(stw, stwx);
|
| break;
|
| case kAtomicExchangeInt8:
|
| + ASSEMBLE_ATOMIC_EXCHANGE_INTEGER(lbarx, stbcx);
|
| + __ extsb(i.OutputRegister(0), i.OutputRegister(0));
|
| + break;
|
| case kAtomicExchangeUint8:
|
| + ASSEMBLE_ATOMIC_EXCHANGE_INTEGER(lbarx, stbcx);
|
| + break;
|
| case kAtomicExchangeInt16:
|
| + ASSEMBLE_ATOMIC_EXCHANGE_INTEGER(lharx, sthcx);
|
| + __ extsh(i.OutputRegister(0), i.OutputRegister(0));
|
| + break;
|
| case kAtomicExchangeUint16:
|
| + ASSEMBLE_ATOMIC_EXCHANGE_INTEGER(lharx, sthcx);
|
| + break;
|
| case kAtomicExchangeWord32:
|
| + ASSEMBLE_ATOMIC_EXCHANGE_INTEGER(lwarx, stwcx);
|
| + break;
|
| case kAtomicCompareExchangeInt8:
|
| case kAtomicCompareExchangeUint8:
|
| case kAtomicCompareExchangeInt16:
|
|
|