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() { ...@@ -510,24 +510,15 @@ LiftoffAssembler::~LiftoffAssembler() {
LiftoffRegister LiftoffAssembler::LoadToRegister(VarState slot, LiftoffRegister LiftoffAssembler::LoadToRegister(VarState slot,
LiftoffRegList pinned) { LiftoffRegList pinned) {
switch (slot.loc()) { if (slot.is_reg()) return slot.reg();
case VarState::kStack: { LiftoffRegister reg = GetUnusedRegister(reg_class_for(slot.type()), pinned);
LiftoffRegister reg = if (slot.is_const()) {
GetUnusedRegister(reg_class_for(slot.type()), pinned); LoadConstant(reg, slot.constant());
Fill(reg, slot.offset(), slot.type()); } else {
return reg; DCHECK(slot.is_stack());
} Fill(reg, slot.offset(), slot.type());
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;
}
} }
UNREACHABLE(); return reg;
} }
LiftoffRegister LiftoffAssembler::LoadI64HalfIntoRegister(VarState slot, LiftoffRegister LiftoffAssembler::LoadI64HalfIntoRegister(VarState slot,
...@@ -548,23 +539,16 @@ LiftoffRegister LiftoffAssembler::LoadI64HalfIntoRegister(VarState slot, ...@@ -548,23 +539,16 @@ LiftoffRegister LiftoffAssembler::LoadI64HalfIntoRegister(VarState slot,
return dst; 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, LiftoffRegister LiftoffAssembler::PeekToRegister(int index,
LiftoffRegList pinned) { LiftoffRegList pinned) {
DCHECK_LT(index, cache_state_.stack_state.size()); DCHECK_LT(index, cache_state_.stack_state.size());
VarState& slot = cache_state_.stack_state.end()[-1 - index]; VarState& slot = cache_state_.stack_state.end()[-1 - index];
if (slot.is_reg()) cache_state_.dec_used(slot.reg()); if (slot.is_reg()) {
LiftoffRegister reg = LoadToRegister(slot, pinned); cache_state_.dec_used(slot.reg());
if (!slot.is_reg()) { return slot.reg();
slot.MakeRegister(reg);
} }
LiftoffRegister reg = LoadToRegister(slot, pinned);
slot.MakeRegister(reg);
return reg; return reg;
} }
......
...@@ -286,7 +286,16 @@ class LiftoffAssembler : public TurboAssembler { ...@@ -286,7 +286,16 @@ class LiftoffAssembler : public TurboAssembler {
LiftoffRegister LoadToRegister(VarState slot, LiftoffRegList pinned); 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 // 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 // value is not stored in a register yet, a register is allocated for it. The
...@@ -1158,8 +1167,8 @@ class LiftoffAssembler : public TurboAssembler { ...@@ -1158,8 +1167,8 @@ class LiftoffAssembler : public TurboAssembler {
LiftoffBailoutReason bailout_reason_ = kSuccess; LiftoffBailoutReason bailout_reason_ = kSuccess;
const char* bailout_detail_ = nullptr; const char* bailout_detail_ = nullptr;
LiftoffRegister SpillOneRegister(LiftoffRegList candidates, V8_NOINLINE LiftoffRegister SpillOneRegister(LiftoffRegList candidates,
LiftoffRegList pinned); LiftoffRegList pinned);
// Spill one or two fp registers to get a pair of adjacent fp registers. // Spill one or two fp registers to get a pair of adjacent fp registers.
LiftoffRegister SpillAdjacentFpRegisters(LiftoffRegList pinned); 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