Commit 9f37a8af authored by dusan.milosavljevic's avatar dusan.milosavljevic Committed by Commit bot

MIPS64: Optimize generated code size for deoptimization table entry.

Reuse optimization introduced in 6dee8884.

TEST=
BUG=

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

Cr-Commit-Position: refs/heads/master@{#26888}
parent cc918d30
...@@ -329,39 +329,66 @@ void Deoptimizer::EntryGenerator::Generate() { ...@@ -329,39 +329,66 @@ void Deoptimizer::EntryGenerator::Generate() {
// Maximum size of a table entry generated below. // Maximum size of a table entry generated below.
const int Deoptimizer::table_entry_size_ = 11 * Assembler::kInstrSize; const int Deoptimizer::table_entry_size_ = 2 * Assembler::kInstrSize;
void Deoptimizer::TableEntryGenerator::GeneratePrologue() { void Deoptimizer::TableEntryGenerator::GeneratePrologue() {
Assembler::BlockTrampolinePoolScope block_trampoline_pool(masm()); Assembler::BlockTrampolinePoolScope block_trampoline_pool(masm());
// Create a sequence of deoptimization entries. // Create a sequence of deoptimization entries.
// Note that registers are still live when jumping to an entry. // Note that registers are still live when jumping to an entry.
Label table_start; Label table_start, done, done_special, trampoline_jump;
__ bind(&table_start); __ bind(&table_start);
int kMaxEntriesBranchReach =
(1 << (kImm16Bits - 2)) / (table_entry_size_ / Assembler::kInstrSize);
if (count() <= kMaxEntriesBranchReach) {
// Common case.
for (int i = 0; i < count(); i++) { for (int i = 0; i < count(); i++) {
Label start; Label start;
__ bind(&start); __ bind(&start);
__ daddiu(sp, sp, -1 * kPointerSize); DCHECK(is_int16(i));
// Jump over the remaining deopt entries (including this one). __ Branch(USE_DELAY_SLOT, &done); // Expose delay slot.
// This code is always reached by calling Jump, which puts the target (label __ li(at, i); // In the delay slot.
// start) into t9.
const int remaining_entries = (count() - i) * table_entry_size_; DCHECK_EQ(table_entry_size_, masm()->SizeOfCodeGeneratedSince(&start));
__ Daddu(t9, t9, remaining_entries);
// 'at' was clobbered so we can only load the current entry value here.
__ li(t8, i);
__ jr(t9); // Expose delay slot.
__ sd(t8, MemOperand(sp, 0 * kPointerSize)); // In the delay slot.
// Pad the rest of the code.
while (table_entry_size_ > (masm()->SizeOfCodeGeneratedSince(&start))) {
__ nop();
} }
DCHECK_EQ(masm()->SizeOfCodeGeneratedSince(&table_start),
count() * table_entry_size_);
__ bind(&done);
__ Push(at);
} else {
// Uncommon case, the branch cannot reach.
// Create mini trampoline and adjust id constants to get proper value at
// the end of table.
for (int i = kMaxEntriesBranchReach; i > 1; i--) {
Label start;
__ bind(&start);
DCHECK(is_int16(i));
__ Branch(USE_DELAY_SLOT, &trampoline_jump); // Expose delay slot.
__ li(at, -i); // In the delay slot.
DCHECK_EQ(table_entry_size_, masm()->SizeOfCodeGeneratedSince(&start)); DCHECK_EQ(table_entry_size_, masm()->SizeOfCodeGeneratedSince(&start));
} }
// Entry with id == kMaxEntriesBranchReach - 1.
__ bind(&trampoline_jump);
__ Branch(USE_DELAY_SLOT, &done_special);
__ li(at, -1);
for (int i = kMaxEntriesBranchReach; i < count(); i++) {
Label start;
__ bind(&start);
DCHECK(is_int16(i));
__ Branch(USE_DELAY_SLOT, &done); // Expose delay slot.
__ li(at, i); // In the delay slot.
}
DCHECK_EQ(masm()->SizeOfCodeGeneratedSince(&table_start), DCHECK_EQ(masm()->SizeOfCodeGeneratedSince(&table_start),
count() * table_entry_size_); count() * table_entry_size_);
__ bind(&done_special);
__ daddiu(at, at, kMaxEntriesBranchReach);
__ bind(&done);
__ Push(at);
}
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment