Index: src/ppc/lithium-codegen-ppc.cc |
diff --git a/src/ppc/lithium-codegen-ppc.cc b/src/ppc/lithium-codegen-ppc.cc |
index 706ab20520a06355ef307f8b6a0996137d52b3fb..4646ce644373330f6fb41092eec2a47affcb6ccf 100644 |
--- a/src/ppc/lithium-codegen-ppc.cc |
+++ b/src/ppc/lithium-codegen-ppc.cc |
@@ -2941,22 +2941,25 @@ void LCodeGen::DoDeferredInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr, |
LoadContextFromDeferred(instr->context()); |
__ Move(InstanceofStub::right(), instr->function()); |
- // Include instructions below in delta: mov + call = mov + (mov + 2) |
- static const int kAdditionalDelta = 2 * Assembler::kMovInstructions + 2; |
- int delta = masm_->InstructionsGeneratedSince(map_check) + kAdditionalDelta; |
{ |
Assembler::BlockTrampolinePoolScope block_trampoline_pool(masm_); |
- if (Assembler::kMovInstructions != 1 && |
- is_int16(delta * Instruction::kInstrSize)) { |
- // The following mov will be an li rather than a multi-instruction form |
- delta -= Assembler::kMovInstructions - 1; |
- } |
+ Handle<Code> code = stub.GetCode(); |
+ // Include instructions below in delta: bitwise_mov32 + call |
+ int delta = (masm_->InstructionsGeneratedSince(map_check) + 2) * |
+ Instruction::kInstrSize + |
+ masm_->CallSize(code); |
// r8 is used to communicate the offset to the location of the map check. |
- __ mov(r8, Operand(delta * Instruction::kInstrSize)); |
+ if (is_int16(delta)) { |
+ delta -= Instruction::kInstrSize; |
+ __ li(r8, Operand(delta)); |
+ } else { |
+ __ bitwise_mov32(r8, delta); |
+ } |
+ CallCodeGeneric(code, RelocInfo::CODE_TARGET, instr, |
+ RECORD_SAFEPOINT_WITH_REGISTERS_AND_NO_ARGUMENTS); |
+ DCHECK(delta / Instruction::kInstrSize == |
+ masm_->InstructionsGeneratedSince(map_check)); |
} |
- CallCodeGeneric(stub.GetCode(), RelocInfo::CODE_TARGET, instr, |
- RECORD_SAFEPOINT_WITH_REGISTERS_AND_NO_ARGUMENTS); |
- DCHECK(delta == masm_->InstructionsGeneratedSince(map_check)); |
LEnvironment* env = instr->GetDeferredLazyDeoptimizationEnvironment(); |
safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index()); |
// Put the result value (r3) into the result register slot and |