Commit 52ddf949 authored by Clemens Backes's avatar Clemens Backes Committed by Commit Bot

[liftoff] Inline PopToRegister and outline SpillOneRegister

{PopToRegister} will most likely find that the stack slot is already
holding a register (89% of cases on epic). Thus put the fast path for
this in the header, so it can be inlined.

Also, {GetUnusedRegister} will mostly find an unused register (95% on
epic). Hence, make sure that the code for spilling a register is not
inlined.

Drive-by: Avoid the call to {LoadToRegister} if we already checked
before if the slot is holding a register.

R=thibaudm@chromium.org

Bug: v8:10576
Change-Id: I13797fa5c12c5359f2578a4dbebb63aa50c00e60
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2237144
Commit-Queue: Clemens Backes <clemensb@chromium.org>
Reviewed-by: 's avatarThibaud Michaud <thibaudm@chromium.org>
Cr-Commit-Position: refs/heads/master@{#68280}
parent e33c15f6
......@@ -510,24 +510,15 @@ LiftoffAssembler::~LiftoffAssembler() {
LiftoffRegister LiftoffAssembler::LoadToRegister(VarState slot,
LiftoffRegList pinned) {
switch (slot.loc()) {
case VarState::kStack: {
LiftoffRegister reg =
GetUnusedRegister(reg_class_for(slot.type()), pinned);
Fill(reg, slot.offset(), slot.type());
return reg;
}
case VarState::kRegister:
return slot.reg();
case VarState::kIntConst: {
RegClass rc =
kNeedI64RegPair && slot.type() == kWasmI64 ? kGpRegPair : kGpReg;
LiftoffRegister reg = GetUnusedRegister(rc, pinned);
LoadConstant(reg, slot.constant());
return reg;
}
if (slot.is_reg()) return slot.reg();
LiftoffRegister reg = GetUnusedRegister(reg_class_for(slot.type()), pinned);
if (slot.is_const()) {
LoadConstant(reg, slot.constant());
} else {
DCHECK(slot.is_stack());
Fill(reg, slot.offset(), slot.type());
}
UNREACHABLE();
return reg;
}
LiftoffRegister LiftoffAssembler::LoadI64HalfIntoRegister(VarState slot,
......@@ -548,23 +539,16 @@ LiftoffRegister LiftoffAssembler::LoadI64HalfIntoRegister(VarState slot,
return dst;
}
LiftoffRegister LiftoffAssembler::PopToRegister(LiftoffRegList pinned) {
DCHECK(!cache_state_.stack_state.empty());
VarState slot = cache_state_.stack_state.back();
if (slot.is_reg()) cache_state_.dec_used(slot.reg());
cache_state_.stack_state.pop_back();
return LoadToRegister(slot, pinned);
}
LiftoffRegister LiftoffAssembler::PeekToRegister(int index,
LiftoffRegList pinned) {
DCHECK_LT(index, cache_state_.stack_state.size());
VarState& slot = cache_state_.stack_state.end()[-1 - index];
if (slot.is_reg()) cache_state_.dec_used(slot.reg());
LiftoffRegister reg = LoadToRegister(slot, pinned);
if (!slot.is_reg()) {
slot.MakeRegister(reg);
if (slot.is_reg()) {
cache_state_.dec_used(slot.reg());
return slot.reg();
}
LiftoffRegister reg = LoadToRegister(slot, pinned);
slot.MakeRegister(reg);
return reg;
}
......
......@@ -286,7 +286,16 @@ class LiftoffAssembler : public TurboAssembler {
LiftoffRegister LoadToRegister(VarState slot, LiftoffRegList pinned);
LiftoffRegister PopToRegister(LiftoffRegList pinned = {});
LiftoffRegister PopToRegister(LiftoffRegList pinned = {}) {
DCHECK(!cache_state_.stack_state.empty());
VarState slot = cache_state_.stack_state.back();
cache_state_.stack_state.pop_back();
if (slot.is_reg()) {
cache_state_.dec_used(slot.reg());
return slot.reg();
}
return LoadToRegister(slot, pinned);
}
// Returns the register which holds the value of stack slot {index}. If the
// value is not stored in a register yet, a register is allocated for it. The
......@@ -1158,8 +1167,8 @@ class LiftoffAssembler : public TurboAssembler {
LiftoffBailoutReason bailout_reason_ = kSuccess;
const char* bailout_detail_ = nullptr;
LiftoffRegister SpillOneRegister(LiftoffRegList candidates,
LiftoffRegList pinned);
V8_NOINLINE LiftoffRegister SpillOneRegister(LiftoffRegList candidates,
LiftoffRegList pinned);
// Spill one or two fp registers to get a pair of adjacent fp registers.
LiftoffRegister SpillAdjacentFpRegisters(LiftoffRegList pinned);
};
......
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