Commit d54e2bc7 authored by Clemens Backes's avatar Clemens Backes Committed by V8 LUCI CQ

[liftoff] Make RegsUnusedByParams constexpr

After dropping support for older GCC versions, we can now assume full
c++14 constexpr support, and can hence resolve a TODO to make a
LiftoffCompiler method constexpr.

This is also a proof-of-concept to verify that this indeed works on all
bots now.

R=ahaas@chromium.org

Bug: v8:9686, v8:11384
Change-Id: I9b7da91152b0af98778312d653aebbf4236fed0d
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2876850Reviewed-by: 's avatarAndreas Haas <ahaas@chromium.org>
Commit-Queue: Clemens Backes <clemensb@chromium.org>
Cr-Commit-Position: refs/heads/master@{#74407}
parent dc7906c9
...@@ -593,8 +593,7 @@ class LiftoffCompiler { ...@@ -593,8 +593,7 @@ class LiftoffCompiler {
} }
} }
// TODO(ahaas): Make this function constexpr once GCC allows it. constexpr static LiftoffRegList RegsUnusedByParams() {
LiftoffRegList RegsUnusedByParams() {
LiftoffRegList regs = kGpCacheRegList; LiftoffRegList regs = kGpCacheRegList;
for (auto reg : kGpParamRegisters) { for (auto reg : kGpParamRegisters) {
regs.clear(reg); regs.clear(reg);
...@@ -619,8 +618,9 @@ class LiftoffCompiler { ...@@ -619,8 +618,9 @@ class LiftoffCompiler {
// For reference type parameters we have to use registers that were not // For reference type parameters we have to use registers that were not
// used for parameters because some reference type stack parameters may // used for parameters because some reference type stack parameters may
// get processed before some value type register parameters. // get processed before some value type register parameters.
static constexpr auto kRegsUnusedByParams = RegsUnusedByParams();
LiftoffRegister reg = is_reference(reg_kind) LiftoffRegister reg = is_reference(reg_kind)
? __ GetUnusedRegister(RegsUnusedByParams()) ? __ GetUnusedRegister(kRegsUnusedByParams)
: __ GetUnusedRegister(rc, pinned); : __ GetUnusedRegister(rc, pinned);
__ LoadCallerFrameSlot(reg, -location.AsCallerFrameSlot(), reg_kind); __ LoadCallerFrameSlot(reg, -location.AsCallerFrameSlot(), reg_kind);
return reg; return reg;
......
...@@ -152,11 +152,12 @@ class LiftoffRegister { ...@@ -152,11 +152,12 @@ class LiftoffRegister {
"chosen type is small enough"); "chosen type is small enough");
public: public:
explicit LiftoffRegister(Register reg) : LiftoffRegister(reg.code()) { constexpr explicit LiftoffRegister(Register reg)
: LiftoffRegister(reg.code()) {
DCHECK_NE(0, kLiftoffAssemblerGpCacheRegs & reg.bit()); DCHECK_NE(0, kLiftoffAssemblerGpCacheRegs & reg.bit());
DCHECK_EQ(reg, gp()); DCHECK_EQ(reg, gp());
} }
explicit LiftoffRegister(DoubleRegister reg) constexpr explicit LiftoffRegister(DoubleRegister reg)
: LiftoffRegister(kAfterMaxLiftoffGpRegCode + reg.code()) { : LiftoffRegister(kAfterMaxLiftoffGpRegCode + reg.code()) {
DCHECK_NE(0, kLiftoffAssemblerFpCacheRegs & reg.bit()); DCHECK_NE(0, kLiftoffAssemblerFpCacheRegs & reg.bit());
DCHECK_EQ(reg, fp()); DCHECK_EQ(reg, fp());
...@@ -275,22 +276,22 @@ class LiftoffRegister { ...@@ -275,22 +276,22 @@ class LiftoffRegister {
return DoubleRegister::from_code((code_ & kCodeMask) + 1); return DoubleRegister::from_code((code_ & kCodeMask) + 1);
} }
Register gp() const { constexpr Register gp() const {
DCHECK(is_gp()); DCHECK(is_gp());
return Register::from_code(code_); return Register::from_code(code_);
} }
DoubleRegister fp() const { constexpr DoubleRegister fp() const {
DCHECK(is_fp()); DCHECK(is_fp());
return DoubleRegister::from_code(code_ - kAfterMaxLiftoffGpRegCode); return DoubleRegister::from_code(code_ - kAfterMaxLiftoffGpRegCode);
} }
int liftoff_code() const { constexpr int liftoff_code() const {
STATIC_ASSERT(sizeof(int) >= sizeof(storage_t)); STATIC_ASSERT(sizeof(int) >= sizeof(storage_t));
return static_cast<int>(code_); return static_cast<int>(code_);
} }
RegClass reg_class() const { constexpr RegClass reg_class() const {
return is_fp_pair() ? kFpRegPair return is_fp_pair() ? kFpRegPair
: is_gp_pair() ? kGpRegPair : is_gp() ? kGpReg : kFpReg; : is_gp_pair() ? kGpRegPair : is_gp() ? kGpReg : kFpReg;
} }
...@@ -364,7 +365,7 @@ class LiftoffRegList { ...@@ -364,7 +365,7 @@ class LiftoffRegList {
return reg; return reg;
} }
LiftoffRegister clear(LiftoffRegister reg) { constexpr LiftoffRegister clear(LiftoffRegister reg) {
if (reg.is_pair()) { if (reg.is_pair()) {
regs_ &= ~(storage_t{1} << reg.low().liftoff_code()); regs_ &= ~(storage_t{1} << reg.low().liftoff_code());
regs_ &= ~(storage_t{1} << reg.high().liftoff_code()); regs_ &= ~(storage_t{1} << reg.high().liftoff_code());
...@@ -373,8 +374,10 @@ class LiftoffRegList { ...@@ -373,8 +374,10 @@ class LiftoffRegList {
} }
return reg; return reg;
} }
Register clear(Register reg) { return clear(LiftoffRegister{reg}).gp(); } constexpr Register clear(Register reg) {
DoubleRegister clear(DoubleRegister reg) { return clear(LiftoffRegister{reg}).gp();
}
constexpr DoubleRegister clear(DoubleRegister reg) {
return clear(LiftoffRegister{reg}).fp(); return clear(LiftoffRegister{reg}).fp();
} }
......
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