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:
parent
7cbdadd495
commit
be2e9199cb
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user