Revert r7909

r7909: Optimise the deoptimisation check to improve performance on modern ARM cores.

Assert failure on mozilla/ecma/Date/15.9.3.8-2 and mozilla/ecma/Date/15.9.3.8-4.

R=ricow@chromium.org

Review URL: http://codereview.chromium.org//7037006

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@7916 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
sgjesse@chromium.org 2011-05-17 12:43:14 +00:00
parent 925107046e
commit 46aeea9d3a
2 changed files with 12 additions and 51 deletions

View File

@ -85,7 +85,6 @@ bool LCodeGen::GenerateCode() {
return GeneratePrologue() && return GeneratePrologue() &&
GenerateBody() && GenerateBody() &&
GenerateDeferredCode() && GenerateDeferredCode() &&
GenerateDeoptJumpTable() &&
GenerateSafepointTable(); GenerateSafepointTable();
} }
@ -250,41 +249,13 @@ bool LCodeGen::GenerateDeferredCode() {
__ jmp(code->exit()); __ jmp(code->exit());
} }
return !is_aborted(); // Force constant pool emission at the end of deferred code to make
}
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
// sure that no constant pools are emitted after the official end of // sure that no constant pools are emitted after the official end of
// the instruction sequence. // the instruction sequence.
masm()->CheckConstPool(true, false); masm()->CheckConstPool(true, false);
// The deoptimization jump table is the last part of the instruction // Deferred code is the last part of the instruction sequence. Mark
// sequence. Mark the generated code as done unless we bailed out. // the generated code as done unless we bailed out.
if (!is_aborted()) status_ = DONE; if (!is_aborted()) status_ = DONE;
return !is_aborted(); return !is_aborted();
} }
@ -624,18 +595,19 @@ void LCodeGen::DeoptimizeIf(Condition cc, LEnvironment* environment) {
return; return;
} }
if (FLAG_trap_on_deopt) __ stop("trap_on_deopt", cc);
if (cc == al) { if (cc == al) {
if (FLAG_trap_on_deopt) __ stop("trap_on_deopt");
__ Jump(entry, RelocInfo::RUNTIME_ENTRY); __ Jump(entry, RelocInfo::RUNTIME_ENTRY);
} else { } else {
// We often have several deopts to the same entry, reuse the last if (FLAG_trap_on_deopt) {
// jump entry if this is the case. Label done;
if (deopt_jump_table_.is_empty() || __ b(&done, NegateCondition(cc));
(deopt_jump_table_.last().address != entry)) { __ stop("trap_on_deopt");
deopt_jump_table_.Add(JumpTableEntry(entry)); __ Jump(entry, RelocInfo::RUNTIME_ENTRY);
__ bind(&done);
} else {
__ Jump(entry, RelocInfo::RUNTIME_ENTRY, cc);
} }
__ b(cc, &deopt_jump_table_.last().label);
} }
} }

View File

@ -51,7 +51,6 @@ class LCodeGen BASE_EMBEDDED {
current_instruction_(-1), current_instruction_(-1),
instructions_(chunk->instructions()), instructions_(chunk->instructions()),
deoptimizations_(4), deoptimizations_(4),
deopt_jump_table_(4),
deoptimization_literals_(8), deoptimization_literals_(8),
inlined_function_count_(0), inlined_function_count_(0),
scope_(info->scope()), scope_(info->scope()),
@ -173,7 +172,6 @@ class LCodeGen BASE_EMBEDDED {
bool GeneratePrologue(); bool GeneratePrologue();
bool GenerateBody(); bool GenerateBody();
bool GenerateDeferredCode(); bool GenerateDeferredCode();
bool GenerateDeoptJumpTable();
bool GenerateSafepointTable(); bool GenerateSafepointTable();
enum SafepointMode { enum SafepointMode {
@ -291,14 +289,6 @@ class LCodeGen BASE_EMBEDDED {
Handle<Map> type, Handle<Map> type,
Handle<String> name); Handle<String> name);
struct JumpTableEntry {
explicit inline JumpTableEntry(Address entry)
: label(),
address(entry) { }
Label label;
Address address;
};
LChunk* const chunk_; LChunk* const chunk_;
MacroAssembler* const masm_; MacroAssembler* const masm_;
CompilationInfo* const info_; CompilationInfo* const info_;
@ -307,7 +297,6 @@ class LCodeGen BASE_EMBEDDED {
int current_instruction_; int current_instruction_;
const ZoneList<LInstruction*>* instructions_; const ZoneList<LInstruction*>* instructions_;
ZoneList<LEnvironment*> deoptimizations_; ZoneList<LEnvironment*> deoptimizations_;
ZoneList<JumpTableEntry> deopt_jump_table_;
ZoneList<Handle<Object> > deoptimization_literals_; ZoneList<Handle<Object> > deoptimization_literals_;
int inlined_function_count_; int inlined_function_count_;
Scope* const scope_; Scope* const scope_;