Commit 08df2ebe authored by Junliang Yan's avatar Junliang Yan Committed by Commit Bot

PPC: fix atomic compare exchange Ops

Need to zero/sign-ext input register before comparison

R=joransiu@ca.ibm.com

Change-Id: I3e2909d76d54c6ad5ae55114d0c501615f89184a
Reviewed-on: https://chromium-review.googlesource.com/c/1430620Reviewed-by: 's avatarJoran Siu <joransiu@ca.ibm.com>
Commit-Queue: Junliang Yan <jyan@ca.ibm.com>
Cr-Commit-Position: refs/heads/master@{#59047}
parent 18f32ca8
...@@ -632,15 +632,17 @@ void EmitWordLoadPoisoningIfNeeded(CodeGenerator* codegen, Instruction* instr, ...@@ -632,15 +632,17 @@ void EmitWordLoadPoisoningIfNeeded(CodeGenerator* codegen, Instruction* instr,
__ sync(); \ __ sync(); \
} while (false) } while (false)
#define ASSEMBLE_ATOMIC_COMPARE_EXCHANGE(cmp_inst, load_inst, store_inst) \ #define ASSEMBLE_ATOMIC_COMPARE_EXCHANGE(cmp_inst, load_inst, store_inst, \
input_ext) \
do { \ do { \
MemOperand operand = MemOperand(i.InputRegister(0), i.InputRegister(1)); \ MemOperand operand = MemOperand(i.InputRegister(0), i.InputRegister(1)); \
Label loop; \ Label loop; \
Label exit; \ Label exit; \
__ input_ext(r0, i.InputRegister(2)); \
__ lwsync(); \ __ lwsync(); \
__ bind(&loop); \ __ bind(&loop); \
__ load_inst(i.OutputRegister(), operand); \ __ load_inst(i.OutputRegister(), operand); \
__ cmp_inst(i.OutputRegister(), i.InputRegister(2), cr0); \ __ cmp_inst(i.OutputRegister(), r0, cr0); \
__ bne(&exit, cr0); \ __ bne(&exit, cr0); \
__ store_inst(i.InputRegister(3), operand); \ __ store_inst(i.InputRegister(3), operand); \
__ bne(&loop, cr0); \ __ bne(&loop, cr0); \
...@@ -654,11 +656,12 @@ void EmitWordLoadPoisoningIfNeeded(CodeGenerator* codegen, Instruction* instr, ...@@ -654,11 +656,12 @@ void EmitWordLoadPoisoningIfNeeded(CodeGenerator* codegen, Instruction* instr,
MemOperand operand = MemOperand(i.InputRegister(0), i.InputRegister(1)); \ MemOperand operand = MemOperand(i.InputRegister(0), i.InputRegister(1)); \
Label loop; \ Label loop; \
Label exit; \ Label exit; \
__ ext_instr(r0, i.InputRegister(2)); \
__ lwsync(); \ __ lwsync(); \
__ bind(&loop); \ __ bind(&loop); \
__ load_inst(i.OutputRegister(), operand); \ __ load_inst(i.OutputRegister(), operand); \
__ ext_instr(i.OutputRegister(), i.OutputRegister()); \ __ ext_instr(i.OutputRegister(), i.OutputRegister()); \
__ cmp_inst(i.OutputRegister(), i.InputRegister(2)); \ __ cmp_inst(i.OutputRegister(), r0, cr0); \
__ bne(&exit, cr0); \ __ bne(&exit, cr0); \
__ store_inst(i.InputRegister(3), operand); \ __ store_inst(i.InputRegister(3), operand); \
__ bne(&loop, cr0); \ __ bne(&loop, cr0); \
...@@ -1962,19 +1965,19 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( ...@@ -1962,19 +1965,19 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
ASSEMBLE_ATOMIC_COMPARE_EXCHANGE_SIGN_EXT(cmp, lbarx, stbcx, extsb); ASSEMBLE_ATOMIC_COMPARE_EXCHANGE_SIGN_EXT(cmp, lbarx, stbcx, extsb);
break; break;
case kPPC_AtomicCompareExchangeUint8: case kPPC_AtomicCompareExchangeUint8:
ASSEMBLE_ATOMIC_COMPARE_EXCHANGE(cmp, lbarx, stbcx); ASSEMBLE_ATOMIC_COMPARE_EXCHANGE(cmp, lbarx, stbcx, ZeroExtByte);
break; break;
case kWord32AtomicCompareExchangeInt16: case kWord32AtomicCompareExchangeInt16:
ASSEMBLE_ATOMIC_COMPARE_EXCHANGE_SIGN_EXT(cmp, lharx, sthcx, extsh); ASSEMBLE_ATOMIC_COMPARE_EXCHANGE_SIGN_EXT(cmp, lharx, sthcx, extsh);
break; break;
case kPPC_AtomicCompareExchangeUint16: case kPPC_AtomicCompareExchangeUint16:
ASSEMBLE_ATOMIC_COMPARE_EXCHANGE(cmp, lharx, sthcx); ASSEMBLE_ATOMIC_COMPARE_EXCHANGE(cmp, lharx, sthcx, ZeroExtHalfWord);
break; break;
case kPPC_AtomicCompareExchangeWord32: case kPPC_AtomicCompareExchangeWord32:
ASSEMBLE_ATOMIC_COMPARE_EXCHANGE(cmpw, lwarx, stwcx); ASSEMBLE_ATOMIC_COMPARE_EXCHANGE(cmpw, lwarx, stwcx, ZeroExtWord32);
break; break;
case kPPC_AtomicCompareExchangeWord64: case kPPC_AtomicCompareExchangeWord64:
ASSEMBLE_ATOMIC_COMPARE_EXCHANGE(cmp, ldarx, stdcx); ASSEMBLE_ATOMIC_COMPARE_EXCHANGE(cmp, ldarx, stdcx, mr);
break; break;
#define ATOMIC_BINOP_CASE(op, inst) \ #define ATOMIC_BINOP_CASE(op, inst) \
......
...@@ -3139,6 +3139,18 @@ void TurboAssembler::CallForDeoptimization(Address target, int deopt_id) { ...@@ -3139,6 +3139,18 @@ void TurboAssembler::CallForDeoptimization(Address target, int deopt_id) {
Call(target, RelocInfo::RUNTIME_ENTRY); Call(target, RelocInfo::RUNTIME_ENTRY);
} }
void TurboAssembler::ZeroExtByte(Register dst, Register src) {
clrldi(dst, src, Operand(56));
}
void TurboAssembler::ZeroExtHalfWord(Register dst, Register src) {
clrldi(dst, src, Operand(48));
}
void TurboAssembler::ZeroExtWord32(Register dst, Register src) {
clrldi(dst, src, Operand(32));
}
} // namespace internal } // namespace internal
} // namespace v8 } // namespace v8
......
...@@ -478,6 +478,11 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase { ...@@ -478,6 +478,11 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase {
// do nothing // do nothing
} }
} }
void ZeroExtByte(Register dst, Register src);
void ZeroExtHalfWord(Register dst, Register src);
void ZeroExtWord32(Register dst, Register src);
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
// Bit testing/extraction // Bit testing/extraction
// //
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment