PPC: simplify delta calculation in DoDeferredInstanceOfKnownGlobal.

... and improve protection against trampoline table generation in this
sequence.

R=danno@chromium.org, svenpanne@chromium.org

BUG=

Review URL: https://codereview.chromium.org/985933003

Cr-Commit-Position: refs/heads/master@{#27146}
This commit is contained in:
michael_dawson 2015-03-12 01:14:38 -07:00 committed by Commit bot
parent 7cbdadd495
commit be2e9199cb

View File

@ -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