| Index: src/arm/lithium-codegen-arm.cc
|
| diff --git a/src/arm/lithium-codegen-arm.cc b/src/arm/lithium-codegen-arm.cc
|
| index d6d1bc66aaa1558cbf73a75867d63338853caf0f..95ee13a343dc5afce087022ceef7c861f42b658d 100644
|
| --- a/src/arm/lithium-codegen-arm.cc
|
| +++ b/src/arm/lithium-codegen-arm.cc
|
| @@ -85,7 +85,6 @@ bool LCodeGen::GenerateCode() {
|
| return GeneratePrologue() &&
|
| GenerateBody() &&
|
| GenerateDeferredCode() &&
|
| - GenerateDeoptJumpTable() &&
|
| GenerateSafepointTable();
|
| }
|
|
|
| @@ -250,41 +249,13 @@ bool LCodeGen::GenerateDeferredCode() {
|
| __ jmp(code->exit());
|
| }
|
|
|
| - return !is_aborted();
|
| -}
|
| -
|
| -
|
| -bool LCodeGen::GenerateDeoptJumpTable() {
|
| - // Check that the jump table is accessible from everywhere in the function
|
| - // code, ie that offsets to the table can be encoded in the 24bit signed
|
| - // immediate of a branch instruction.
|
| - // To simplify we consider the code size from the first instruction to the
|
| - // end of the jump table. We also don't consider the pc load delta.
|
| - // Each entry in the jump table generates only one instruction.
|
| - if (!is_int24((masm()->pc_offset() / Assembler::kInstrSize) +
|
| - deopt_jump_table_.length())) {
|
| - Abort("Generated code is too large");
|
| - }
|
| -
|
| - __ RecordComment("[ Deoptimisation jump table");
|
| - Label table_start;
|
| - __ bind(&table_start);
|
| - for (int i = 0; i < deopt_jump_table_.length(); i++) {
|
| - __ bind(&deopt_jump_table_[i].label);
|
| - __ mov(pc, Operand(reinterpret_cast<int32_t>(deopt_jump_table_[i].address),
|
| - RelocInfo::RUNTIME_ENTRY));
|
| - }
|
| - ASSERT(masm()->InstructionsGeneratedSince(&table_start) ==
|
| - deopt_jump_table_.length());
|
| - __ RecordComment("]");
|
| -
|
| - // Force constant pool emission at the end of the jump table to make
|
| + // Force constant pool emission at the end of deferred code to make
|
| // sure that no constant pools are emitted after the official end of
|
| // the instruction sequence.
|
| masm()->CheckConstPool(true, false);
|
|
|
| - // The deoptimization jump table is the last part of the instruction
|
| - // sequence. Mark the generated code as done unless we bailed out.
|
| + // Deferred code is the last part of the instruction sequence. Mark
|
| + // the generated code as done unless we bailed out.
|
| if (!is_aborted()) status_ = DONE;
|
| return !is_aborted();
|
| }
|
| @@ -624,18 +595,19 @@ void LCodeGen::DeoptimizeIf(Condition cc, LEnvironment* environment) {
|
| return;
|
| }
|
|
|
| - if (FLAG_trap_on_deopt) __ stop("trap_on_deopt", cc);
|
| -
|
| if (cc == al) {
|
| + if (FLAG_trap_on_deopt) __ stop("trap_on_deopt");
|
| __ Jump(entry, RelocInfo::RUNTIME_ENTRY);
|
| } else {
|
| - // We often have several deopts to the same entry, reuse the last
|
| - // jump entry if this is the case.
|
| - if (deopt_jump_table_.is_empty() ||
|
| - (deopt_jump_table_.last().address != entry)) {
|
| - deopt_jump_table_.Add(JumpTableEntry(entry));
|
| + if (FLAG_trap_on_deopt) {
|
| + Label done;
|
| + __ b(&done, NegateCondition(cc));
|
| + __ stop("trap_on_deopt");
|
| + __ Jump(entry, RelocInfo::RUNTIME_ENTRY);
|
| + __ bind(&done);
|
| + } else {
|
| + __ Jump(entry, RelocInfo::RUNTIME_ENTRY, cc);
|
| }
|
| - __ b(cc, &deopt_jump_table_.last().label);
|
| }
|
| }
|
|
|
|
|