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

[wasm] Make LiftoffRegList::ForRegs a constructor

The 'ForRegs' method is not needed for clarity of the code, it's pretty
clear what to construct a register list from. Hence turn the static
{LiftoffRegList::ForRegs} method into a constructor. This makes the code
more concise.

Also, turn the for loop into a C++17 folding expression, which might
generate better code because the loop will automatically be unrolled.

R=thibaudm@chromium.org

Bug: v8:12425
Change-Id: Ic4446f23022db5f17420303d45b9c15fa5daff60
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3572041Reviewed-by: 's avatarThibaud Michaud <thibaudm@chromium.org>
Commit-Queue: Clemens Backes <clemensb@chromium.org>
Cr-Commit-Position: refs/heads/main@{#79815}
parent 5cd917d5
...@@ -155,8 +155,8 @@ inline void I64Binop(LiftoffAssembler* assm, LiftoffRegister dst, ...@@ -155,8 +155,8 @@ inline void I64Binop(LiftoffAssembler* assm, LiftoffRegister dst,
LiftoffRegister lhs, LiftoffRegister rhs) { LiftoffRegister lhs, LiftoffRegister rhs) {
Register dst_low = dst.low_gp(); Register dst_low = dst.low_gp();
if (dst_low == lhs.high_gp() || dst_low == rhs.high_gp()) { if (dst_low == lhs.high_gp() || dst_low == rhs.high_gp()) {
dst_low = assm->GetUnusedRegister( dst_low =
kGpReg, LiftoffRegList::ForRegs(lhs, rhs, dst.high_gp())) assm->GetUnusedRegister(kGpReg, LiftoffRegList{lhs, rhs, dst.high_gp()})
.gp(); .gp();
} }
(assm->*op)(dst_low, lhs.low_gp(), rhs.low_gp(), SetCC, al); (assm->*op)(dst_low, lhs.low_gp(), rhs.low_gp(), SetCC, al);
...@@ -193,7 +193,7 @@ inline void I64Shiftop(LiftoffAssembler* assm, LiftoffRegister dst, ...@@ -193,7 +193,7 @@ inline void I64Shiftop(LiftoffAssembler* assm, LiftoffRegister dst,
// Left shift writes {dst_high} then {dst_low}, right shifts write {dst_low} // Left shift writes {dst_high} then {dst_low}, right shifts write {dst_low}
// then {dst_high}. // then {dst_high}.
Register clobbered_dst_reg = is_left_shift ? dst_high : dst_low; Register clobbered_dst_reg = is_left_shift ? dst_high : dst_low;
LiftoffRegList pinned = LiftoffRegList::ForRegs(clobbered_dst_reg, src); LiftoffRegList pinned = {clobbered_dst_reg, src};
Register amount_capped = Register amount_capped =
pinned.set(assm->GetUnusedRegister(kGpReg, pinned)).gp(); pinned.set(assm->GetUnusedRegister(kGpReg, pinned)).gp();
assm->and_(amount_capped, amount, Operand(0x3F)); assm->and_(amount_capped, amount, Operand(0x3F));
...@@ -950,8 +950,7 @@ inline void AtomicBinop32(LiftoffAssembler* lasm, Register dst_addr, ...@@ -950,8 +950,7 @@ inline void AtomicBinop32(LiftoffAssembler* lasm, Register dst_addr,
StoreType type, StoreType type,
void (*op)(LiftoffAssembler*, Register, Register, void (*op)(LiftoffAssembler*, Register, Register,
Register)) { Register)) {
LiftoffRegList pinned = LiftoffRegList pinned = {dst_addr, offset_reg, value, result};
LiftoffRegList::ForRegs(dst_addr, offset_reg, value, result);
switch (type.value()) { switch (type.value()) {
case StoreType::kI64Store8: case StoreType::kI64Store8:
__ LoadConstant(result.high(), WasmValue(0)); __ LoadConstant(result.high(), WasmValue(0));
...@@ -1002,16 +1001,14 @@ inline void AtomicOp64(LiftoffAssembler* lasm, Register dst_addr, ...@@ -1002,16 +1001,14 @@ inline void AtomicOp64(LiftoffAssembler* lasm, Register dst_addr,
// Make sure {dst_low} and {dst_high} are not occupied by any other value. // Make sure {dst_low} and {dst_high} are not occupied by any other value.
Register value_low = value.low_gp(); Register value_low = value.low_gp();
Register value_high = value.high_gp(); Register value_high = value.high_gp();
LiftoffRegList pinned = LiftoffRegList::ForRegs( LiftoffRegList pinned = {dst_addr, offset_reg, value_low,
dst_addr, offset_reg, value_low, value_high, dst_low, dst_high); value_high, dst_low, dst_high};
__ ClearRegister(dst_low, {&dst_addr, &offset_reg, &value_low, &value_high}, __ ClearRegister(dst_low, {&dst_addr, &offset_reg, &value_low, &value_high},
pinned); pinned);
pinned = pinned | pinned = pinned | LiftoffRegList{dst_addr, offset_reg, value_low, value_high};
LiftoffRegList::ForRegs(dst_addr, offset_reg, value_low, value_high);
__ ClearRegister(dst_high, {&dst_addr, &offset_reg, &value_low, &value_high}, __ ClearRegister(dst_high, {&dst_addr, &offset_reg, &value_low, &value_high},
pinned); pinned);
pinned = pinned | pinned = pinned | LiftoffRegList{dst_addr, offset_reg, value_low, value_high};
LiftoffRegList::ForRegs(dst_addr, offset_reg, value_low, value_high);
// Make sure that {result}, if it exists, also does not overlap with // Make sure that {result}, if it exists, also does not overlap with
// {dst_low} and {dst_high}. We don't have to transfer the value stored in // {dst_low} and {dst_high}. We don't have to transfer the value stored in
...@@ -1275,7 +1272,7 @@ void LiftoffAssembler::AtomicCompareExchange( ...@@ -1275,7 +1272,7 @@ void LiftoffAssembler::AtomicCompareExchange(
void (Assembler::*load)(Register, Register, Condition) = nullptr; void (Assembler::*load)(Register, Register, Condition) = nullptr;
void (Assembler::*store)(Register, Register, Register, Condition) = nullptr; void (Assembler::*store)(Register, Register, Register, Condition) = nullptr;
LiftoffRegList pinned = LiftoffRegList::ForRegs(dst_addr, offset_reg); LiftoffRegList pinned = {dst_addr, offset_reg};
// We need to remember the high word of {result}, so we can set it to zero in // We need to remember the high word of {result}, so we can set it to zero in
// the end if necessary. // the end if necessary.
Register result_high = no_reg; Register result_high = no_reg;
...@@ -1614,7 +1611,7 @@ inline void GeneratePopCnt(Assembler* assm, Register dst, Register src, ...@@ -1614,7 +1611,7 @@ inline void GeneratePopCnt(Assembler* assm, Register dst, Register src,
} // namespace liftoff } // namespace liftoff
bool LiftoffAssembler::emit_i32_popcnt(Register dst, Register src) { bool LiftoffAssembler::emit_i32_popcnt(Register dst, Register src) {
LiftoffRegList pinned = LiftoffRegList::ForRegs(dst); LiftoffRegList pinned = {dst};
Register scratch1 = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp(); Register scratch1 = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp();
Register scratch2 = GetUnusedRegister(kGpReg, pinned).gp(); Register scratch2 = GetUnusedRegister(kGpReg, pinned).gp();
liftoff::GeneratePopCnt(this, dst, src, scratch1, scratch2); liftoff::GeneratePopCnt(this, dst, src, scratch1, scratch2);
...@@ -1855,7 +1852,7 @@ bool LiftoffAssembler::emit_i64_popcnt(LiftoffRegister dst, ...@@ -1855,7 +1852,7 @@ bool LiftoffAssembler::emit_i64_popcnt(LiftoffRegister dst,
// overwrite the second src register before using it. // overwrite the second src register before using it.
Register src1 = src.high_gp() == dst.low_gp() ? src.high_gp() : src.low_gp(); Register src1 = src.high_gp() == dst.low_gp() ? src.high_gp() : src.low_gp();
Register src2 = src.high_gp() == dst.low_gp() ? src.low_gp() : src.high_gp(); Register src2 = src.high_gp() == dst.low_gp() ? src.low_gp() : src.high_gp();
LiftoffRegList pinned = LiftoffRegList::ForRegs(dst, src2); LiftoffRegList pinned = {dst, src2};
Register scratch1 = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp(); Register scratch1 = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp();
Register scratch2 = GetUnusedRegister(kGpReg, pinned).gp(); Register scratch2 = GetUnusedRegister(kGpReg, pinned).gp();
liftoff::GeneratePopCnt(this, dst.low_gp(), src1, scratch1, scratch2); liftoff::GeneratePopCnt(this, dst.low_gp(), src1, scratch1, scratch2);
...@@ -2924,12 +2921,12 @@ void LiftoffAssembler::emit_i64x2_mul(LiftoffRegister dst, LiftoffRegister lhs, ...@@ -2924,12 +2921,12 @@ void LiftoffAssembler::emit_i64x2_mul(LiftoffRegister dst, LiftoffRegister lhs,
QwNeonRegister tmp2 = right; QwNeonRegister tmp2 = right;
LiftoffRegList used_plus_dst = LiftoffRegList used_plus_dst =
cache_state()->used_registers | LiftoffRegList::ForRegs(dst); cache_state()->used_registers | LiftoffRegList{dst};
if (used_plus_dst.has(lhs) && used_plus_dst.has(rhs)) { if (used_plus_dst.has(lhs) && used_plus_dst.has(rhs)) {
tmp1 = temps.AcquireQ(); tmp1 = temps.AcquireQ();
// We only have 1 scratch Q register, so acquire another ourselves. // We only have 1 scratch Q register, so acquire another ourselves.
LiftoffRegList pinned = LiftoffRegList::ForRegs(dst); LiftoffRegList pinned = {dst};
LiftoffRegister unused_pair = GetUnusedRegister(kFpRegPair, pinned); LiftoffRegister unused_pair = GetUnusedRegister(kFpRegPair, pinned);
tmp2 = liftoff::GetSimd128Register(unused_pair); tmp2 = liftoff::GetSimd128Register(unused_pair);
} else if (used_plus_dst.has(lhs)) { } else if (used_plus_dst.has(lhs)) {
...@@ -3055,7 +3052,7 @@ void LiftoffAssembler::emit_i32x4_bitmask(LiftoffRegister dst, ...@@ -3055,7 +3052,7 @@ void LiftoffAssembler::emit_i32x4_bitmask(LiftoffRegister dst,
if (cache_state()->is_used(src)) { if (cache_state()->is_used(src)) {
// We only have 1 scratch Q register, so try and reuse src. // We only have 1 scratch Q register, so try and reuse src.
LiftoffRegList pinned = LiftoffRegList::ForRegs(src); LiftoffRegList pinned = {src};
LiftoffRegister unused_pair = GetUnusedRegister(kFpRegPair, pinned); LiftoffRegister unused_pair = GetUnusedRegister(kFpRegPair, pinned);
mask = liftoff::GetSimd128Register(unused_pair); mask = liftoff::GetSimd128Register(unused_pair);
} }
...@@ -3240,7 +3237,7 @@ void LiftoffAssembler::emit_i16x8_bitmask(LiftoffRegister dst, ...@@ -3240,7 +3237,7 @@ void LiftoffAssembler::emit_i16x8_bitmask(LiftoffRegister dst,
if (cache_state()->is_used(src)) { if (cache_state()->is_used(src)) {
// We only have 1 scratch Q register, so try and reuse src. // We only have 1 scratch Q register, so try and reuse src.
LiftoffRegList pinned = LiftoffRegList::ForRegs(src); LiftoffRegList pinned = {src};
LiftoffRegister unused_pair = GetUnusedRegister(kFpRegPair, pinned); LiftoffRegister unused_pair = GetUnusedRegister(kFpRegPair, pinned);
mask = liftoff::GetSimd128Register(unused_pair); mask = liftoff::GetSimd128Register(unused_pair);
} }
...@@ -3555,7 +3552,7 @@ void LiftoffAssembler::emit_i8x16_bitmask(LiftoffRegister dst, ...@@ -3555,7 +3552,7 @@ void LiftoffAssembler::emit_i8x16_bitmask(LiftoffRegister dst,
if (cache_state()->is_used(src)) { if (cache_state()->is_used(src)) {
// We only have 1 scratch Q register, so try and reuse src. // We only have 1 scratch Q register, so try and reuse src.
LiftoffRegList pinned = LiftoffRegList::ForRegs(src); LiftoffRegList pinned = {src};
LiftoffRegister unused_pair = GetUnusedRegister(kFpRegPair, pinned); LiftoffRegister unused_pair = GetUnusedRegister(kFpRegPair, pinned);
mask = liftoff::GetSimd128Register(unused_pair); mask = liftoff::GetSimd128Register(unused_pair);
} }
......
...@@ -636,8 +636,7 @@ inline void AtomicBinop(LiftoffAssembler* lasm, Register dst_addr, ...@@ -636,8 +636,7 @@ inline void AtomicBinop(LiftoffAssembler* lasm, Register dst_addr,
Register offset_reg, uintptr_t offset_imm, Register offset_reg, uintptr_t offset_imm,
LiftoffRegister value, LiftoffRegister result, LiftoffRegister value, LiftoffRegister result,
StoreType type, Binop op) { StoreType type, Binop op) {
LiftoffRegList pinned = LiftoffRegList pinned = {dst_addr, offset_reg, value, result};
LiftoffRegList::ForRegs(dst_addr, offset_reg, value, result);
Register store_result = pinned.set(__ GetUnusedRegister(kGpReg, pinned)).gp(); Register store_result = pinned.set(__ GetUnusedRegister(kGpReg, pinned)).gp();
// {LiftoffCompiler::AtomicBinop} ensures that {result} is unique. // {LiftoffCompiler::AtomicBinop} ensures that {result} is unique.
...@@ -823,8 +822,7 @@ void LiftoffAssembler::AtomicCompareExchange( ...@@ -823,8 +822,7 @@ void LiftoffAssembler::AtomicCompareExchange(
Register dst_addr, Register offset_reg, uintptr_t offset_imm, Register dst_addr, Register offset_reg, uintptr_t offset_imm,
LiftoffRegister expected, LiftoffRegister new_value, LiftoffRegister result, LiftoffRegister expected, LiftoffRegister new_value, LiftoffRegister result,
StoreType type) { StoreType type) {
LiftoffRegList pinned = LiftoffRegList pinned = {dst_addr, offset_reg, expected, new_value};
LiftoffRegList::ForRegs(dst_addr, offset_reg, expected, new_value);
Register result_reg = result.gp(); Register result_reg = result.gp();
if (pinned.has(result)) { if (pinned.has(result)) {
...@@ -2511,7 +2509,7 @@ void LiftoffAssembler::emit_i8x16_shuffle(LiftoffRegister dst, ...@@ -2511,7 +2509,7 @@ void LiftoffAssembler::emit_i8x16_shuffle(LiftoffRegister dst,
VRegister temp = dst.fp(); VRegister temp = dst.fp();
if (dst == lhs || dst == rhs) { if (dst == lhs || dst == rhs) {
// dst overlaps with lhs or rhs, so we need a temporary. // dst overlaps with lhs or rhs, so we need a temporary.
temp = GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(lhs, rhs)).fp(); temp = GetUnusedRegister(kFpReg, LiftoffRegList{lhs, rhs}).fp();
} }
UseScratchRegisterScope scope(this); UseScratchRegisterScope scope(this);
......
...@@ -1591,8 +1591,7 @@ void EmitI64IndependentHalfOperation(LiftoffAssembler* assm, ...@@ -1591,8 +1591,7 @@ void EmitI64IndependentHalfOperation(LiftoffAssembler* assm,
return; return;
} }
// Otherwise, we need a temporary register. // Otherwise, we need a temporary register.
Register tmp = Register tmp = assm->GetUnusedRegister(kGpReg, LiftoffRegList{lhs, rhs}).gp();
assm->GetUnusedRegister(kGpReg, LiftoffRegList::ForRegs(lhs, rhs)).gp();
(assm->*op)(tmp, lhs.low_gp(), rhs.low_gp()); (assm->*op)(tmp, lhs.low_gp(), rhs.low_gp());
(assm->*op)(dst.high_gp(), lhs.high_gp(), rhs.high_gp()); (assm->*op)(dst.high_gp(), lhs.high_gp(), rhs.high_gp());
assm->Move(dst.low_gp(), tmp, kI32); assm->Move(dst.low_gp(), tmp, kI32);
...@@ -1619,8 +1618,7 @@ void EmitI64IndependentHalfOperationImm(LiftoffAssembler* assm, ...@@ -1619,8 +1618,7 @@ void EmitI64IndependentHalfOperationImm(LiftoffAssembler* assm,
return; return;
} }
// Otherwise, we need a temporary register. // Otherwise, we need a temporary register.
Register tmp = Register tmp = assm->GetUnusedRegister(kGpReg, LiftoffRegList{lhs}).gp();
assm->GetUnusedRegister(kGpReg, LiftoffRegList::ForRegs(lhs)).gp();
(assm->*op)(tmp, lhs.low_gp(), low_word); (assm->*op)(tmp, lhs.low_gp(), low_word);
(assm->*op)(dst.high_gp(), lhs.high_gp(), high_word); (assm->*op)(dst.high_gp(), lhs.high_gp(), high_word);
assm->Move(dst.low_gp(), tmp, kI32); assm->Move(dst.low_gp(), tmp, kI32);
......
This diff is collapsed.
...@@ -347,6 +347,17 @@ class LiftoffRegList { ...@@ -347,6 +347,17 @@ class LiftoffRegList {
constexpr LiftoffRegList() = default; constexpr LiftoffRegList() = default;
// Allow to construct LiftoffRegList from a number of
// {Register|DoubleRegister|LiftoffRegister}.
template <
typename... Regs,
typename = std::enable_if_t<std::conjunction_v<std::disjunction<
std::is_same<Register, Regs>, std::is_same<DoubleRegister, Regs>,
std::is_same<LiftoffRegister, Regs>>...>>>
constexpr LiftoffRegList(Regs... regs) {
(..., set(regs));
}
constexpr Register set(Register reg) { constexpr Register set(Register reg) {
return set(LiftoffRegister(reg)).gp(); return set(LiftoffRegister(reg)).gp();
} }
...@@ -461,13 +472,6 @@ class LiftoffRegList { ...@@ -461,13 +472,6 @@ class LiftoffRegList {
return LiftoffRegList(bits); return LiftoffRegList(bits);
} }
template <typename... Regs>
static LiftoffRegList ForRegs(Regs... regs) {
LiftoffRegList list;
for (LiftoffRegister reg : {LiftoffRegister(regs)...}) list.set(reg);
return list;
}
private: private:
// Unchecked constructor. Only use for valid bits. // Unchecked constructor. Only use for valid bits.
explicit constexpr LiftoffRegList(storage_t bits) : regs_(bits) {} explicit constexpr LiftoffRegList(storage_t bits) : regs_(bits) {}
......
...@@ -599,8 +599,7 @@ void LiftoffAssembler::AtomicStore(Register dst_addr, Register offset_reg, ...@@ -599,8 +599,7 @@ void LiftoffAssembler::AtomicStore(Register dst_addr, Register offset_reg,
void LiftoffAssembler::Atomic##name( \ void LiftoffAssembler::Atomic##name( \
Register dst_addr, Register offset_reg, uintptr_t offset_imm, \ Register dst_addr, Register offset_reg, uintptr_t offset_imm, \
LiftoffRegister value, LiftoffRegister result, StoreType type) { \ LiftoffRegister value, LiftoffRegister result, StoreType type) { \
LiftoffRegList pinned = \ LiftoffRegList pinned = {dst_addr, offset_reg, value, result}; \
LiftoffRegList::ForRegs(dst_addr, offset_reg, value, result); \
Register temp0 = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp(); \ Register temp0 = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp(); \
Register temp1 = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp(); \ Register temp1 = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp(); \
Register temp2 = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp(); \ Register temp2 = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp(); \
...@@ -655,8 +654,7 @@ ATOMIC_BINOP_CASE(Xor, Xor, Xor, xor) ...@@ -655,8 +654,7 @@ ATOMIC_BINOP_CASE(Xor, Xor, Xor, xor)
void LiftoffAssembler::AtomicSub(Register dst_addr, Register offset_reg, void LiftoffAssembler::AtomicSub(Register dst_addr, Register offset_reg,
uintptr_t offset_imm, LiftoffRegister value, uintptr_t offset_imm, LiftoffRegister value,
LiftoffRegister result, StoreType type) { LiftoffRegister result, StoreType type) {
LiftoffRegList pinned = LiftoffRegList pinned = {dst_addr, offset_reg, value, result};
LiftoffRegList::ForRegs(dst_addr, offset_reg, value, result);
Register temp0 = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp(); Register temp0 = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp();
Register temp1 = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp(); Register temp1 = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp();
Register temp2 = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp(); Register temp2 = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp();
...@@ -714,8 +712,7 @@ void LiftoffAssembler::AtomicExchange(Register dst_addr, Register offset_reg, ...@@ -714,8 +712,7 @@ void LiftoffAssembler::AtomicExchange(Register dst_addr, Register offset_reg,
uintptr_t offset_imm, uintptr_t offset_imm,
LiftoffRegister value, LiftoffRegister value,
LiftoffRegister result, StoreType type) { LiftoffRegister result, StoreType type) {
LiftoffRegList pinned = LiftoffRegList pinned = {dst_addr, offset_reg, value, result};
LiftoffRegList::ForRegs(dst_addr, offset_reg, value, result);
Register temp0 = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp(); Register temp0 = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp();
Register temp1 = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp(); Register temp1 = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp();
Register temp2 = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp(); Register temp2 = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp();
...@@ -790,8 +787,7 @@ void LiftoffAssembler::AtomicCompareExchange( ...@@ -790,8 +787,7 @@ void LiftoffAssembler::AtomicCompareExchange(
Register dst_addr, Register offset_reg, uintptr_t offset_imm, Register dst_addr, Register offset_reg, uintptr_t offset_imm,
LiftoffRegister expected, LiftoffRegister new_value, LiftoffRegister result, LiftoffRegister expected, LiftoffRegister new_value, LiftoffRegister result,
StoreType type) { StoreType type) {
LiftoffRegList pinned = LiftoffRegList::ForRegs(dst_addr, offset_reg, LiftoffRegList pinned = {dst_addr, offset_reg, expected, new_value, result};
expected, new_value, result);
Register temp0 = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp(); Register temp0 = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp();
Register temp1 = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp(); Register temp1 = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp();
Register temp2 = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp(); Register temp2 = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp();
...@@ -1320,10 +1316,9 @@ bool LiftoffAssembler::emit_type_conversion(WasmOpcode opcode, ...@@ -1320,10 +1316,9 @@ bool LiftoffAssembler::emit_type_conversion(WasmOpcode opcode,
TurboAssembler::bstrpick_w(dst.gp(), src.gp(), 31, 0); TurboAssembler::bstrpick_w(dst.gp(), src.gp(), 31, 0);
return true; return true;
case kExprI32SConvertF32: { case kExprI32SConvertF32: {
LiftoffRegister rounded = LiftoffRegister rounded = GetUnusedRegister(kFpReg, LiftoffRegList{src});
GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(src));
LiftoffRegister converted_back = LiftoffRegister converted_back =
GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(src, rounded)); GetUnusedRegister(kFpReg, LiftoffRegList{src, rounded});
// Real conversion. // Real conversion.
TurboAssembler::Trunc_s(rounded.fp(), src.fp()); TurboAssembler::Trunc_s(rounded.fp(), src.fp());
...@@ -1343,10 +1338,9 @@ bool LiftoffAssembler::emit_type_conversion(WasmOpcode opcode, ...@@ -1343,10 +1338,9 @@ bool LiftoffAssembler::emit_type_conversion(WasmOpcode opcode,
return true; return true;
} }
case kExprI32UConvertF32: { case kExprI32UConvertF32: {
LiftoffRegister rounded = LiftoffRegister rounded = GetUnusedRegister(kFpReg, LiftoffRegList{src});
GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(src));
LiftoffRegister converted_back = LiftoffRegister converted_back =
GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(src, rounded)); GetUnusedRegister(kFpReg, LiftoffRegList{src, rounded});
// Real conversion. // Real conversion.
TurboAssembler::Trunc_s(rounded.fp(), src.fp()); TurboAssembler::Trunc_s(rounded.fp(), src.fp());
...@@ -1364,10 +1358,9 @@ bool LiftoffAssembler::emit_type_conversion(WasmOpcode opcode, ...@@ -1364,10 +1358,9 @@ bool LiftoffAssembler::emit_type_conversion(WasmOpcode opcode,
return true; return true;
} }
case kExprI32SConvertF64: { case kExprI32SConvertF64: {
LiftoffRegister rounded = LiftoffRegister rounded = GetUnusedRegister(kFpReg, LiftoffRegList{src});
GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(src));
LiftoffRegister converted_back = LiftoffRegister converted_back =
GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(src, rounded)); GetUnusedRegister(kFpReg, LiftoffRegList{src, rounded});
// Real conversion. // Real conversion.
TurboAssembler::Trunc_d(rounded.fp(), src.fp()); TurboAssembler::Trunc_d(rounded.fp(), src.fp());
...@@ -1381,10 +1374,9 @@ bool LiftoffAssembler::emit_type_conversion(WasmOpcode opcode, ...@@ -1381,10 +1374,9 @@ bool LiftoffAssembler::emit_type_conversion(WasmOpcode opcode,
return true; return true;
} }
case kExprI32UConvertF64: { case kExprI32UConvertF64: {
LiftoffRegister rounded = LiftoffRegister rounded = GetUnusedRegister(kFpReg, LiftoffRegList{src});
GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(src));
LiftoffRegister converted_back = LiftoffRegister converted_back =
GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(src, rounded)); GetUnusedRegister(kFpReg, LiftoffRegList{src, rounded});
// Real conversion. // Real conversion.
TurboAssembler::Trunc_d(rounded.fp(), src.fp()); TurboAssembler::Trunc_d(rounded.fp(), src.fp());
...@@ -1406,10 +1398,9 @@ bool LiftoffAssembler::emit_type_conversion(WasmOpcode opcode, ...@@ -1406,10 +1398,9 @@ bool LiftoffAssembler::emit_type_conversion(WasmOpcode opcode,
TurboAssembler::bstrpick_d(dst.gp(), src.gp(), 31, 0); TurboAssembler::bstrpick_d(dst.gp(), src.gp(), 31, 0);
return true; return true;
case kExprI64SConvertF32: { case kExprI64SConvertF32: {
LiftoffRegister rounded = LiftoffRegister rounded = GetUnusedRegister(kFpReg, LiftoffRegList{src});
GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(src));
LiftoffRegister converted_back = LiftoffRegister converted_back =
GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(src, rounded)); GetUnusedRegister(kFpReg, LiftoffRegList{src, rounded});
// Real conversion. // Real conversion.
TurboAssembler::Trunc_s(rounded.fp(), src.fp()); TurboAssembler::Trunc_s(rounded.fp(), src.fp());
...@@ -1438,10 +1429,9 @@ bool LiftoffAssembler::emit_type_conversion(WasmOpcode opcode, ...@@ -1438,10 +1429,9 @@ bool LiftoffAssembler::emit_type_conversion(WasmOpcode opcode,
return true; return true;
} }
case kExprI64SConvertF64: { case kExprI64SConvertF64: {
LiftoffRegister rounded = LiftoffRegister rounded = GetUnusedRegister(kFpReg, LiftoffRegList{src});
GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(src));
LiftoffRegister converted_back = LiftoffRegister converted_back =
GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(src, rounded)); GetUnusedRegister(kFpReg, LiftoffRegList{src, rounded});
// Real conversion. // Real conversion.
TurboAssembler::Trunc_d(rounded.fp(), src.fp()); TurboAssembler::Trunc_d(rounded.fp(), src.fp());
...@@ -1473,8 +1463,7 @@ bool LiftoffAssembler::emit_type_conversion(WasmOpcode opcode, ...@@ -1473,8 +1463,7 @@ bool LiftoffAssembler::emit_type_conversion(WasmOpcode opcode,
movfr2gr_d(dst.gp(), src.fp()); movfr2gr_d(dst.gp(), src.fp());
return true; return true;
case kExprF32SConvertI32: { case kExprF32SConvertI32: {
LiftoffRegister scratch = LiftoffRegister scratch = GetUnusedRegister(kFpReg, LiftoffRegList{dst});
GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(dst));
movgr2fr_w(scratch.fp(), src.gp()); movgr2fr_w(scratch.fp(), src.gp());
ffint_s_w(dst.fp(), scratch.fp()); ffint_s_w(dst.fp(), scratch.fp());
return true; return true;
...@@ -1489,8 +1478,7 @@ bool LiftoffAssembler::emit_type_conversion(WasmOpcode opcode, ...@@ -1489,8 +1478,7 @@ bool LiftoffAssembler::emit_type_conversion(WasmOpcode opcode,
TurboAssembler::FmoveLow(dst.fp(), src.gp()); TurboAssembler::FmoveLow(dst.fp(), src.gp());
return true; return true;
case kExprF64SConvertI32: { case kExprF64SConvertI32: {
LiftoffRegister scratch = LiftoffRegister scratch = GetUnusedRegister(kFpReg, LiftoffRegList{dst});
GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(dst));
movgr2fr_w(scratch.fp(), src.gp()); movgr2fr_w(scratch.fp(), src.gp());
ffint_d_w(dst.fp(), scratch.fp()); ffint_d_w(dst.fp(), scratch.fp());
return true; return true;
...@@ -1635,7 +1623,7 @@ void LiftoffAssembler::emit_i32_set_cond(LiftoffCondition liftoff_cond, ...@@ -1635,7 +1623,7 @@ void LiftoffAssembler::emit_i32_set_cond(LiftoffCondition liftoff_cond,
Condition cond = liftoff::ToCondition(liftoff_cond); Condition cond = liftoff::ToCondition(liftoff_cond);
Register tmp = dst; Register tmp = dst;
if (dst == lhs || dst == rhs) { if (dst == lhs || dst == rhs) {
tmp = GetUnusedRegister(kGpReg, LiftoffRegList::ForRegs(lhs, rhs)).gp(); tmp = GetUnusedRegister(kGpReg, LiftoffRegList{lhs, rhs}).gp();
} }
// Write 1 as result. // Write 1 as result.
TurboAssembler::li(tmp, 1); TurboAssembler::li(tmp, 1);
...@@ -1658,7 +1646,7 @@ void LiftoffAssembler::emit_i64_set_cond(LiftoffCondition liftoff_cond, ...@@ -1658,7 +1646,7 @@ void LiftoffAssembler::emit_i64_set_cond(LiftoffCondition liftoff_cond,
Condition cond = liftoff::ToCondition(liftoff_cond); Condition cond = liftoff::ToCondition(liftoff_cond);
Register tmp = dst; Register tmp = dst;
if (dst == lhs.gp() || dst == rhs.gp()) { if (dst == lhs.gp() || dst == rhs.gp()) {
tmp = GetUnusedRegister(kGpReg, LiftoffRegList::ForRegs(lhs, rhs)).gp(); tmp = GetUnusedRegister(kGpReg, LiftoffRegList{lhs, rhs}).gp();
} }
// Write 1 as result. // Write 1 as result.
TurboAssembler::li(tmp, 1); TurboAssembler::li(tmp, 1);
......
...@@ -658,7 +658,7 @@ void LiftoffAssembler::Store(Register dst_addr, Register offset_reg, ...@@ -658,7 +658,7 @@ void LiftoffAssembler::Store(Register dst_addr, Register offset_reg,
#if defined(V8_TARGET_BIG_ENDIAN) #if defined(V8_TARGET_BIG_ENDIAN)
if (is_store_mem) { if (is_store_mem) {
pinned = pinned | LiftoffRegList::ForRegs(dst_op.rm(), src); pinned = pinned | LiftoffRegList{dst_op.rm(), src};
LiftoffRegister tmp = GetUnusedRegister(src.reg_class(), pinned); LiftoffRegister tmp = GetUnusedRegister(src.reg_class(), pinned);
// Save original value. // Save original value.
Move(tmp, src, type.value_type()); Move(tmp, src, type.value_type());
...@@ -1022,8 +1022,7 @@ I32_SHIFTOP_I(shr, srl) ...@@ -1022,8 +1022,7 @@ I32_SHIFTOP_I(shr, srl)
void LiftoffAssembler::emit_i64_addi(LiftoffRegister dst, LiftoffRegister lhs, void LiftoffAssembler::emit_i64_addi(LiftoffRegister dst, LiftoffRegister lhs,
int64_t imm) { int64_t imm) {
LiftoffRegister imm_reg = LiftoffRegister imm_reg = GetUnusedRegister(kFpReg, LiftoffRegList{dst, lhs});
GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(dst, lhs));
int32_t imm_low_word = static_cast<int32_t>(imm); int32_t imm_low_word = static_cast<int32_t>(imm);
int32_t imm_high_word = static_cast<int32_t>(imm >> 32); int32_t imm_high_word = static_cast<int32_t>(imm >> 32);
TurboAssembler::li(imm_reg.low_gp(), imm_low_word); TurboAssembler::li(imm_reg.low_gp(), imm_low_word);
...@@ -1092,7 +1091,7 @@ inline void Emit64BitShiftOperation( ...@@ -1092,7 +1091,7 @@ inline void Emit64BitShiftOperation(
void (TurboAssembler::*emit_shift)(Register, Register, Register, Register, void (TurboAssembler::*emit_shift)(Register, Register, Register, Register,
Register, Register, Register)) { Register, Register, Register)) {
Label move, done; Label move, done;
LiftoffRegList pinned = LiftoffRegList::ForRegs(dst, src, amount); LiftoffRegList pinned = {dst, src, amount};
// If some of destination registers are in use, get another, unused pair. // If some of destination registers are in use, get another, unused pair.
// That way we prevent overwriting some input registers while shifting. // That way we prevent overwriting some input registers while shifting.
...@@ -1377,10 +1376,9 @@ bool LiftoffAssembler::emit_type_conversion(WasmOpcode opcode, ...@@ -1377,10 +1376,9 @@ bool LiftoffAssembler::emit_type_conversion(WasmOpcode opcode,
TurboAssembler::Move(dst.gp(), src.low_gp()); TurboAssembler::Move(dst.gp(), src.low_gp());
return true; return true;
case kExprI32SConvertF32: { case kExprI32SConvertF32: {
LiftoffRegister rounded = LiftoffRegister rounded = GetUnusedRegister(kFpReg, LiftoffRegList{src});
GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(src));
LiftoffRegister converted_back = LiftoffRegister converted_back =
GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(src, rounded)); GetUnusedRegister(kFpReg, LiftoffRegList{src, rounded});
// Real conversion. // Real conversion.
TurboAssembler::Trunc_s_s(rounded.fp(), src.fp()); TurboAssembler::Trunc_s_s(rounded.fp(), src.fp());
...@@ -1400,10 +1398,9 @@ bool LiftoffAssembler::emit_type_conversion(WasmOpcode opcode, ...@@ -1400,10 +1398,9 @@ bool LiftoffAssembler::emit_type_conversion(WasmOpcode opcode,
return true; return true;
} }
case kExprI32UConvertF32: { case kExprI32UConvertF32: {
LiftoffRegister rounded = LiftoffRegister rounded = GetUnusedRegister(kFpReg, LiftoffRegList{src});
GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(src));
LiftoffRegister converted_back = LiftoffRegister converted_back =
GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(src, rounded)); GetUnusedRegister(kFpReg, LiftoffRegList{src, rounded});
// Real conversion. // Real conversion.
TurboAssembler::Trunc_s_s(rounded.fp(), src.fp()); TurboAssembler::Trunc_s_s(rounded.fp(), src.fp());
...@@ -1422,8 +1419,7 @@ bool LiftoffAssembler::emit_type_conversion(WasmOpcode opcode, ...@@ -1422,8 +1419,7 @@ bool LiftoffAssembler::emit_type_conversion(WasmOpcode opcode,
return true; return true;
} }
case kExprI32SConvertF64: { case kExprI32SConvertF64: {
LiftoffRegister scratch = LiftoffRegister scratch = GetUnusedRegister(kGpReg, LiftoffRegList{dst});
GetUnusedRegister(kGpReg, LiftoffRegList::ForRegs(dst));
// Try a conversion to a signed integer. // Try a conversion to a signed integer.
trunc_w_d(kScratchDoubleReg, src.fp()); trunc_w_d(kScratchDoubleReg, src.fp());
...@@ -1442,9 +1438,9 @@ bool LiftoffAssembler::emit_type_conversion(WasmOpcode opcode, ...@@ -1442,9 +1438,9 @@ bool LiftoffAssembler::emit_type_conversion(WasmOpcode opcode,
if ((IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)) && if ((IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)) &&
IsFp64Mode()) { IsFp64Mode()) {
LiftoffRegister rounded = LiftoffRegister rounded =
GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(src)); GetUnusedRegister(kFpReg, LiftoffRegList{src});
LiftoffRegister converted_back = LiftoffRegister converted_back =
GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(src, rounded)); GetUnusedRegister(kFpReg, LiftoffRegList{src, rounded});
// Real conversion. // Real conversion.
TurboAssembler::Trunc_d_d(rounded.fp(), src.fp()); TurboAssembler::Trunc_d_d(rounded.fp(), src.fp());
...@@ -1501,15 +1497,13 @@ bool LiftoffAssembler::emit_type_conversion(WasmOpcode opcode, ...@@ -1501,15 +1497,13 @@ bool LiftoffAssembler::emit_type_conversion(WasmOpcode opcode,
TurboAssembler::Mfhc1(dst.high_gp(), src.fp()); TurboAssembler::Mfhc1(dst.high_gp(), src.fp());
return true; return true;
case kExprF32SConvertI32: { case kExprF32SConvertI32: {
LiftoffRegister scratch = LiftoffRegister scratch = GetUnusedRegister(kFpReg, LiftoffRegList{dst});
GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(dst));
mtc1(src.gp(), scratch.fp()); mtc1(src.gp(), scratch.fp());
cvt_s_w(dst.fp(), scratch.fp()); cvt_s_w(dst.fp(), scratch.fp());
return true; return true;
} }
case kExprF32UConvertI32: { case kExprF32UConvertI32: {
LiftoffRegister scratch = LiftoffRegister scratch = GetUnusedRegister(kFpReg, LiftoffRegList{dst});
GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(dst));
TurboAssembler::Cvt_d_uw(dst.fp(), src.gp(), scratch.fp()); TurboAssembler::Cvt_d_uw(dst.fp(), src.gp(), scratch.fp());
cvt_s_d(dst.fp(), dst.fp()); cvt_s_d(dst.fp(), dst.fp());
return true; return true;
...@@ -1521,15 +1515,13 @@ bool LiftoffAssembler::emit_type_conversion(WasmOpcode opcode, ...@@ -1521,15 +1515,13 @@ bool LiftoffAssembler::emit_type_conversion(WasmOpcode opcode,
TurboAssembler::FmoveLow(dst.fp(), src.gp()); TurboAssembler::FmoveLow(dst.fp(), src.gp());
return true; return true;
case kExprF64SConvertI32: { case kExprF64SConvertI32: {
LiftoffRegister scratch = LiftoffRegister scratch = GetUnusedRegister(kFpReg, LiftoffRegList{dst});
GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(dst));
mtc1(src.gp(), scratch.fp()); mtc1(src.gp(), scratch.fp());
cvt_d_w(dst.fp(), scratch.fp()); cvt_d_w(dst.fp(), scratch.fp());
return true; return true;
} }
case kExprF64UConvertI32: { case kExprF64UConvertI32: {
LiftoffRegister scratch = LiftoffRegister scratch = GetUnusedRegister(kFpReg, LiftoffRegList{dst});
GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(dst));
TurboAssembler::Cvt_d_uw(dst.fp(), src.gp(), scratch.fp()); TurboAssembler::Cvt_d_uw(dst.fp(), src.gp(), scratch.fp());
return true; return true;
} }
...@@ -1614,7 +1606,7 @@ void LiftoffAssembler::emit_i32_set_cond(LiftoffCondition liftoff_cond, ...@@ -1614,7 +1606,7 @@ void LiftoffAssembler::emit_i32_set_cond(LiftoffCondition liftoff_cond,
Condition cond = liftoff::ToCondition(liftoff_cond); Condition cond = liftoff::ToCondition(liftoff_cond);
Register tmp = dst; Register tmp = dst;
if (dst == lhs || dst == rhs) { if (dst == lhs || dst == rhs) {
tmp = GetUnusedRegister(kGpReg, LiftoffRegList::ForRegs(lhs, rhs)).gp(); tmp = GetUnusedRegister(kGpReg, LiftoffRegList{lhs, rhs}).gp();
} }
// Write 1 as result. // Write 1 as result.
TurboAssembler::li(tmp, 1); TurboAssembler::li(tmp, 1);
...@@ -1628,8 +1620,7 @@ void LiftoffAssembler::emit_i32_set_cond(LiftoffCondition liftoff_cond, ...@@ -1628,8 +1620,7 @@ void LiftoffAssembler::emit_i32_set_cond(LiftoffCondition liftoff_cond,
} }
void LiftoffAssembler::emit_i64_eqz(Register dst, LiftoffRegister src) { void LiftoffAssembler::emit_i64_eqz(Register dst, LiftoffRegister src) {
Register tmp = Register tmp = GetUnusedRegister(kGpReg, LiftoffRegList{src, dst}).gp();
GetUnusedRegister(kGpReg, LiftoffRegList::ForRegs(src, dst)).gp();
sltiu(tmp, src.low_gp(), 1); sltiu(tmp, src.low_gp(), 1);
sltiu(dst, src.high_gp(), 1); sltiu(dst, src.high_gp(), 1);
and_(dst, dst, tmp); and_(dst, dst, tmp);
...@@ -1666,8 +1657,7 @@ void LiftoffAssembler::emit_i64_set_cond(LiftoffCondition liftoff_cond, ...@@ -1666,8 +1657,7 @@ void LiftoffAssembler::emit_i64_set_cond(LiftoffCondition liftoff_cond,
Register tmp = dst; Register tmp = dst;
if (liftoff::IsRegInRegPair(lhs, dst) || liftoff::IsRegInRegPair(rhs, dst)) { if (liftoff::IsRegInRegPair(lhs, dst) || liftoff::IsRegInRegPair(rhs, dst)) {
tmp = tmp = GetUnusedRegister(kGpReg, LiftoffRegList{dst, lhs, rhs}).gp();
GetUnusedRegister(kGpReg, LiftoffRegList::ForRegs(dst, lhs, rhs)).gp();
} }
// Write 1 initially in tmp register. // Write 1 initially in tmp register.
......
...@@ -738,8 +738,7 @@ void LiftoffAssembler::AtomicStore(Register dst_addr, Register offset_reg, ...@@ -738,8 +738,7 @@ void LiftoffAssembler::AtomicStore(Register dst_addr, Register offset_reg,
void LiftoffAssembler::Atomic##name( \ void LiftoffAssembler::Atomic##name( \
Register dst_addr, Register offset_reg, uintptr_t offset_imm, \ Register dst_addr, Register offset_reg, uintptr_t offset_imm, \
LiftoffRegister value, LiftoffRegister result, StoreType type) { \ LiftoffRegister value, LiftoffRegister result, StoreType type) { \
LiftoffRegList pinned = \ LiftoffRegList pinned = {dst_addr, offset_reg, value, result}; \
LiftoffRegList::ForRegs(dst_addr, offset_reg, value, result); \
Register temp0 = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp(); \ Register temp0 = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp(); \
Register temp1 = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp(); \ Register temp1 = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp(); \
Register temp2 = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp(); \ Register temp2 = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp(); \
...@@ -816,8 +815,7 @@ void LiftoffAssembler::AtomicExchange(Register dst_addr, Register offset_reg, ...@@ -816,8 +815,7 @@ void LiftoffAssembler::AtomicExchange(Register dst_addr, Register offset_reg,
uintptr_t offset_imm, uintptr_t offset_imm,
LiftoffRegister value, LiftoffRegister value,
LiftoffRegister result, StoreType type) { LiftoffRegister result, StoreType type) {
LiftoffRegList pinned = LiftoffRegList pinned = {dst_addr, offset_reg, value, result};
LiftoffRegList::ForRegs(dst_addr, offset_reg, value, result);
Register temp0 = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp(); Register temp0 = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp();
Register temp1 = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp(); Register temp1 = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp();
Register temp2 = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp(); Register temp2 = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp();
...@@ -893,8 +891,7 @@ void LiftoffAssembler::AtomicCompareExchange( ...@@ -893,8 +891,7 @@ void LiftoffAssembler::AtomicCompareExchange(
Register dst_addr, Register offset_reg, uintptr_t offset_imm, Register dst_addr, Register offset_reg, uintptr_t offset_imm,
LiftoffRegister expected, LiftoffRegister new_value, LiftoffRegister result, LiftoffRegister expected, LiftoffRegister new_value, LiftoffRegister result,
StoreType type) { StoreType type) {
LiftoffRegList pinned = LiftoffRegList::ForRegs(dst_addr, offset_reg, LiftoffRegList pinned = {dst_addr, offset_reg, expected, new_value, result};
expected, new_value, result);
Register temp0 = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp(); Register temp0 = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp();
Register temp1 = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp(); Register temp1 = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp();
Register temp2 = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp(); Register temp2 = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp();
...@@ -1463,10 +1460,9 @@ bool LiftoffAssembler::emit_type_conversion(WasmOpcode opcode, ...@@ -1463,10 +1460,9 @@ bool LiftoffAssembler::emit_type_conversion(WasmOpcode opcode,
TurboAssembler::Ext(dst.gp(), src.gp(), 0, 32); TurboAssembler::Ext(dst.gp(), src.gp(), 0, 32);
return true; return true;
case kExprI32SConvertF32: { case kExprI32SConvertF32: {
LiftoffRegister rounded = LiftoffRegister rounded = GetUnusedRegister(kFpReg, LiftoffRegList{src});
GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(src));
LiftoffRegister converted_back = LiftoffRegister converted_back =
GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(src, rounded)); GetUnusedRegister(kFpReg, LiftoffRegList{src, rounded});
// Real conversion. // Real conversion.
TurboAssembler::Trunc_s_s(rounded.fp(), src.fp()); TurboAssembler::Trunc_s_s(rounded.fp(), src.fp());
...@@ -1486,10 +1482,9 @@ bool LiftoffAssembler::emit_type_conversion(WasmOpcode opcode, ...@@ -1486,10 +1482,9 @@ bool LiftoffAssembler::emit_type_conversion(WasmOpcode opcode,
return true; return true;
} }
case kExprI32UConvertF32: { case kExprI32UConvertF32: {
LiftoffRegister rounded = LiftoffRegister rounded = GetUnusedRegister(kFpReg, LiftoffRegList{src});
GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(src));
LiftoffRegister converted_back = LiftoffRegister converted_back =
GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(src, rounded)); GetUnusedRegister(kFpReg, LiftoffRegList{src, rounded});
// Real conversion. // Real conversion.
TurboAssembler::Trunc_s_s(rounded.fp(), src.fp()); TurboAssembler::Trunc_s_s(rounded.fp(), src.fp());
...@@ -1507,10 +1502,9 @@ bool LiftoffAssembler::emit_type_conversion(WasmOpcode opcode, ...@@ -1507,10 +1502,9 @@ bool LiftoffAssembler::emit_type_conversion(WasmOpcode opcode,
return true; return true;
} }
case kExprI32SConvertF64: { case kExprI32SConvertF64: {
LiftoffRegister rounded = LiftoffRegister rounded = GetUnusedRegister(kFpReg, LiftoffRegList{src});
GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(src));
LiftoffRegister converted_back = LiftoffRegister converted_back =
GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(src, rounded)); GetUnusedRegister(kFpReg, LiftoffRegList{src, rounded});
// Real conversion. // Real conversion.
TurboAssembler::Trunc_d_d(rounded.fp(), src.fp()); TurboAssembler::Trunc_d_d(rounded.fp(), src.fp());
...@@ -1524,10 +1518,9 @@ bool LiftoffAssembler::emit_type_conversion(WasmOpcode opcode, ...@@ -1524,10 +1518,9 @@ bool LiftoffAssembler::emit_type_conversion(WasmOpcode opcode,
return true; return true;
} }
case kExprI32UConvertF64: { case kExprI32UConvertF64: {
LiftoffRegister rounded = LiftoffRegister rounded = GetUnusedRegister(kFpReg, LiftoffRegList{src});
GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(src));
LiftoffRegister converted_back = LiftoffRegister converted_back =
GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(src, rounded)); GetUnusedRegister(kFpReg, LiftoffRegList{src, rounded});
// Real conversion. // Real conversion.
TurboAssembler::Trunc_d_d(rounded.fp(), src.fp()); TurboAssembler::Trunc_d_d(rounded.fp(), src.fp());
...@@ -1549,10 +1542,9 @@ bool LiftoffAssembler::emit_type_conversion(WasmOpcode opcode, ...@@ -1549,10 +1542,9 @@ bool LiftoffAssembler::emit_type_conversion(WasmOpcode opcode,
TurboAssembler::Dext(dst.gp(), src.gp(), 0, 32); TurboAssembler::Dext(dst.gp(), src.gp(), 0, 32);
return true; return true;
case kExprI64SConvertF32: { case kExprI64SConvertF32: {
LiftoffRegister rounded = LiftoffRegister rounded = GetUnusedRegister(kFpReg, LiftoffRegList{src});
GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(src));
LiftoffRegister converted_back = LiftoffRegister converted_back =
GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(src, rounded)); GetUnusedRegister(kFpReg, LiftoffRegList{src, rounded});
// Real conversion. // Real conversion.
TurboAssembler::Trunc_s_s(rounded.fp(), src.fp()); TurboAssembler::Trunc_s_s(rounded.fp(), src.fp());
...@@ -1581,10 +1573,9 @@ bool LiftoffAssembler::emit_type_conversion(WasmOpcode opcode, ...@@ -1581,10 +1573,9 @@ bool LiftoffAssembler::emit_type_conversion(WasmOpcode opcode,
return true; return true;
} }
case kExprI64SConvertF64: { case kExprI64SConvertF64: {
LiftoffRegister rounded = LiftoffRegister rounded = GetUnusedRegister(kFpReg, LiftoffRegList{src});
GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(src));
LiftoffRegister converted_back = LiftoffRegister converted_back =
GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(src, rounded)); GetUnusedRegister(kFpReg, LiftoffRegList{src, rounded});
// Real conversion. // Real conversion.
TurboAssembler::Trunc_d_d(rounded.fp(), src.fp()); TurboAssembler::Trunc_d_d(rounded.fp(), src.fp());
...@@ -1616,8 +1607,7 @@ bool LiftoffAssembler::emit_type_conversion(WasmOpcode opcode, ...@@ -1616,8 +1607,7 @@ bool LiftoffAssembler::emit_type_conversion(WasmOpcode opcode,
dmfc1(dst.gp(), src.fp()); dmfc1(dst.gp(), src.fp());
return true; return true;
case kExprF32SConvertI32: { case kExprF32SConvertI32: {
LiftoffRegister scratch = LiftoffRegister scratch = GetUnusedRegister(kFpReg, LiftoffRegList{dst});
GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(dst));
mtc1(src.gp(), scratch.fp()); mtc1(src.gp(), scratch.fp());
cvt_s_w(dst.fp(), scratch.fp()); cvt_s_w(dst.fp(), scratch.fp());
return true; return true;
...@@ -1632,8 +1622,7 @@ bool LiftoffAssembler::emit_type_conversion(WasmOpcode opcode, ...@@ -1632,8 +1622,7 @@ bool LiftoffAssembler::emit_type_conversion(WasmOpcode opcode,
TurboAssembler::FmoveLow(dst.fp(), src.gp()); TurboAssembler::FmoveLow(dst.fp(), src.gp());
return true; return true;
case kExprF64SConvertI32: { case kExprF64SConvertI32: {
LiftoffRegister scratch = LiftoffRegister scratch = GetUnusedRegister(kFpReg, LiftoffRegList{dst});
GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(dst));
mtc1(src.gp(), scratch.fp()); mtc1(src.gp(), scratch.fp());
cvt_d_w(dst.fp(), scratch.fp()); cvt_d_w(dst.fp(), scratch.fp());
return true; return true;
...@@ -1847,7 +1836,7 @@ void LiftoffAssembler::emit_i32_set_cond(LiftoffCondition liftoff_cond, ...@@ -1847,7 +1836,7 @@ void LiftoffAssembler::emit_i32_set_cond(LiftoffCondition liftoff_cond,
Condition cond = liftoff::ToCondition(liftoff_cond); Condition cond = liftoff::ToCondition(liftoff_cond);
Register tmp = dst; Register tmp = dst;
if (dst == lhs || dst == rhs) { if (dst == lhs || dst == rhs) {
tmp = GetUnusedRegister(kGpReg, LiftoffRegList::ForRegs(lhs, rhs)).gp(); tmp = GetUnusedRegister(kGpReg, LiftoffRegList{lhs, rhs}).gp();
} }
// Write 1 as result. // Write 1 as result.
TurboAssembler::li(tmp, 1); TurboAssembler::li(tmp, 1);
...@@ -1870,7 +1859,7 @@ void LiftoffAssembler::emit_i64_set_cond(LiftoffCondition liftoff_cond, ...@@ -1870,7 +1859,7 @@ void LiftoffAssembler::emit_i64_set_cond(LiftoffCondition liftoff_cond,
Condition cond = liftoff::ToCondition(liftoff_cond); Condition cond = liftoff::ToCondition(liftoff_cond);
Register tmp = dst; Register tmp = dst;
if (dst == lhs.gp() || dst == rhs.gp()) { if (dst == lhs.gp() || dst == rhs.gp()) {
tmp = GetUnusedRegister(kGpReg, LiftoffRegList::ForRegs(lhs, rhs)).gp(); tmp = GetUnusedRegister(kGpReg, LiftoffRegList{lhs, rhs}).gp();
} }
// Write 1 as result. // Write 1 as result.
TurboAssembler::li(tmp, 1); TurboAssembler::li(tmp, 1);
......
...@@ -657,8 +657,7 @@ inline void AtomicBinop(LiftoffAssembler* lasm, Register dst_addr, ...@@ -657,8 +657,7 @@ inline void AtomicBinop(LiftoffAssembler* lasm, Register dst_addr,
Register offset_reg, uintptr_t offset_imm, Register offset_reg, uintptr_t offset_imm,
LiftoffRegister value, LiftoffRegister result, LiftoffRegister value, LiftoffRegister result,
StoreType type, Binop op) { StoreType type, Binop op) {
LiftoffRegList pinned = LiftoffRegList pinned = {dst_addr, offset_reg, value, result};
LiftoffRegList::ForRegs(dst_addr, offset_reg, value, result);
Register store_result = pinned.set(__ GetUnusedRegister(kGpReg, pinned)).gp(); Register store_result = pinned.set(__ GetUnusedRegister(kGpReg, pinned)).gp();
// Make sure that {result} is unique. // Make sure that {result} is unique.
...@@ -869,8 +868,7 @@ void LiftoffAssembler::AtomicCompareExchange( ...@@ -869,8 +868,7 @@ void LiftoffAssembler::AtomicCompareExchange(
Register dst_addr, Register offset_reg, uintptr_t offset_imm, Register dst_addr, Register offset_reg, uintptr_t offset_imm,
LiftoffRegister expected, LiftoffRegister new_value, LiftoffRegister result, LiftoffRegister expected, LiftoffRegister new_value, LiftoffRegister result,
StoreType type) { StoreType type) {
LiftoffRegList pinned = LiftoffRegList pinned = {dst_addr, offset_reg, expected, new_value};
LiftoffRegList::ForRegs(dst_addr, offset_reg, expected, new_value);
Register result_reg = result.gp(); Register result_reg = result.gp();
if (pinned.has(result)) { if (pinned.has(result)) {
...@@ -1866,7 +1864,7 @@ void LiftoffAssembler::emit_i8x16_shuffle(LiftoffRegister dst, ...@@ -1866,7 +1864,7 @@ void LiftoffAssembler::emit_i8x16_shuffle(LiftoffRegister dst,
VU.set(kScratchReg, E8, m1); VU.set(kScratchReg, E8, m1);
VRegister temp = VRegister temp =
GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(lhs, rhs)).fp().toV(); GetUnusedRegister(kFpReg, LiftoffRegList{lhs, rhs}).fp().toV();
if (dst_v == lhs_v) { if (dst_v == lhs_v) {
vmv_vv(temp, lhs_v); vmv_vv(temp, lhs_v);
lhs_v = temp; lhs_v = temp;
......
...@@ -561,13 +561,11 @@ void LiftoffAssembler::AtomicStore(Register dst_addr, Register offset_reg, ...@@ -561,13 +561,11 @@ void LiftoffAssembler::AtomicStore(Register dst_addr, Register offset_reg,
void LiftoffAssembler::AtomicAdd(Register dst_addr, Register offset_reg, void LiftoffAssembler::AtomicAdd(Register dst_addr, Register offset_reg,
uintptr_t offset_imm, LiftoffRegister value, uintptr_t offset_imm, LiftoffRegister value,
LiftoffRegister result, StoreType type) { LiftoffRegister result, StoreType type) {
Register tmp1 = Register tmp1 = GetUnusedRegister(kGpReg, LiftoffRegList{dst_addr, offset_reg,
GetUnusedRegister( value, result})
kGpReg, LiftoffRegList::ForRegs(dst_addr, offset_reg, value, result))
.gp(); .gp();
Register tmp2 = Register tmp2 = GetUnusedRegister(kGpReg, LiftoffRegList{dst_addr, offset_reg,
GetUnusedRegister(kGpReg, LiftoffRegList::ForRegs(dst_addr, offset_reg, value, result, tmp1})
value, result, tmp1))
.gp(); .gp();
if (!is_int20(offset_imm)) { if (!is_int20(offset_imm)) {
...@@ -663,13 +661,11 @@ void LiftoffAssembler::AtomicAdd(Register dst_addr, Register offset_reg, ...@@ -663,13 +661,11 @@ void LiftoffAssembler::AtomicAdd(Register dst_addr, Register offset_reg,
void LiftoffAssembler::AtomicSub(Register dst_addr, Register offset_reg, void LiftoffAssembler::AtomicSub(Register dst_addr, Register offset_reg,
uintptr_t offset_imm, LiftoffRegister value, uintptr_t offset_imm, LiftoffRegister value,
LiftoffRegister result, StoreType type) { LiftoffRegister result, StoreType type) {
Register tmp1 = Register tmp1 = GetUnusedRegister(kGpReg, LiftoffRegList{dst_addr, offset_reg,
GetUnusedRegister( value, result})
kGpReg, LiftoffRegList::ForRegs(dst_addr, offset_reg, value, result))
.gp(); .gp();
Register tmp2 = Register tmp2 = GetUnusedRegister(kGpReg, LiftoffRegList{dst_addr, offset_reg,
GetUnusedRegister(kGpReg, LiftoffRegList::ForRegs(dst_addr, offset_reg, value, result, tmp1})
value, result, tmp1))
.gp(); .gp();
if (!is_int20(offset_imm)) { if (!is_int20(offset_imm)) {
...@@ -765,13 +761,11 @@ void LiftoffAssembler::AtomicSub(Register dst_addr, Register offset_reg, ...@@ -765,13 +761,11 @@ void LiftoffAssembler::AtomicSub(Register dst_addr, Register offset_reg,
void LiftoffAssembler::AtomicAnd(Register dst_addr, Register offset_reg, void LiftoffAssembler::AtomicAnd(Register dst_addr, Register offset_reg,
uintptr_t offset_imm, LiftoffRegister value, uintptr_t offset_imm, LiftoffRegister value,
LiftoffRegister result, StoreType type) { LiftoffRegister result, StoreType type) {
Register tmp1 = Register tmp1 = GetUnusedRegister(kGpReg, LiftoffRegList{dst_addr, offset_reg,
GetUnusedRegister( value, result})
kGpReg, LiftoffRegList::ForRegs(dst_addr, offset_reg, value, result))
.gp(); .gp();
Register tmp2 = Register tmp2 = GetUnusedRegister(kGpReg, LiftoffRegList{dst_addr, offset_reg,
GetUnusedRegister(kGpReg, LiftoffRegList::ForRegs(dst_addr, offset_reg, value, result, tmp1})
value, result, tmp1))
.gp(); .gp();
if (!is_int20(offset_imm)) { if (!is_int20(offset_imm)) {
...@@ -867,13 +861,11 @@ void LiftoffAssembler::AtomicAnd(Register dst_addr, Register offset_reg, ...@@ -867,13 +861,11 @@ void LiftoffAssembler::AtomicAnd(Register dst_addr, Register offset_reg,
void LiftoffAssembler::AtomicOr(Register dst_addr, Register offset_reg, void LiftoffAssembler::AtomicOr(Register dst_addr, Register offset_reg,
uintptr_t offset_imm, LiftoffRegister value, uintptr_t offset_imm, LiftoffRegister value,
LiftoffRegister result, StoreType type) { LiftoffRegister result, StoreType type) {
Register tmp1 = Register tmp1 = GetUnusedRegister(kGpReg, LiftoffRegList{dst_addr, offset_reg,
GetUnusedRegister( value, result})
kGpReg, LiftoffRegList::ForRegs(dst_addr, offset_reg, value, result))
.gp(); .gp();
Register tmp2 = Register tmp2 = GetUnusedRegister(kGpReg, LiftoffRegList{dst_addr, offset_reg,
GetUnusedRegister(kGpReg, LiftoffRegList::ForRegs(dst_addr, offset_reg, value, result, tmp1})
value, result, tmp1))
.gp(); .gp();
if (!is_int20(offset_imm)) { if (!is_int20(offset_imm)) {
...@@ -969,13 +961,11 @@ void LiftoffAssembler::AtomicOr(Register dst_addr, Register offset_reg, ...@@ -969,13 +961,11 @@ void LiftoffAssembler::AtomicOr(Register dst_addr, Register offset_reg,
void LiftoffAssembler::AtomicXor(Register dst_addr, Register offset_reg, void LiftoffAssembler::AtomicXor(Register dst_addr, Register offset_reg,
uintptr_t offset_imm, LiftoffRegister value, uintptr_t offset_imm, LiftoffRegister value,
LiftoffRegister result, StoreType type) { LiftoffRegister result, StoreType type) {
Register tmp1 = Register tmp1 = GetUnusedRegister(kGpReg, LiftoffRegList{dst_addr, offset_reg,
GetUnusedRegister( value, result})
kGpReg, LiftoffRegList::ForRegs(dst_addr, offset_reg, value, result))
.gp(); .gp();
Register tmp2 = Register tmp2 = GetUnusedRegister(kGpReg, LiftoffRegList{dst_addr, offset_reg,
GetUnusedRegister(kGpReg, LiftoffRegList::ForRegs(dst_addr, offset_reg, value, result, tmp1})
value, result, tmp1))
.gp(); .gp();
if (!is_int20(offset_imm)) { if (!is_int20(offset_imm)) {
...@@ -2532,12 +2522,10 @@ SIMD_ALL_TRUE_LIST(EMIT_SIMD_ALL_TRUE) ...@@ -2532,12 +2522,10 @@ SIMD_ALL_TRUE_LIST(EMIT_SIMD_ALL_TRUE)
* `EmitBinOp`. */ \ * `EmitBinOp`. */ \
/* Make sure dst and temp are also unique. */ \ /* Make sure dst and temp are also unique. */ \
if (dest == src1 || dest == src2) { \ if (dest == src1 || dest == src2) { \
dest = \ dest = GetUnusedRegister(kFpReg, LiftoffRegList{src1, src2}).fp(); \
GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(src1, src2)).fp(); \
} \ } \
Simd128Register temp = \ Simd128Register temp = \
GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(dest, src1, src2)) \ GetUnusedRegister(kFpReg, LiftoffRegList{dest, src1, src2}).fp(); \
.fp(); \
op(dest, src1, src2, kScratchDoubleReg, temp); \ op(dest, src1, src2, kScratchDoubleReg, temp); \
/* Original dst register needs to be populated. */ \ /* Original dst register needs to be populated. */ \
if (dest != dst.fp()) { \ if (dest != dst.fp()) { \
...@@ -2561,10 +2549,10 @@ SIMD_ADD_SUB_SAT_LIST(EMIT_SIMD_ADD_SUB_SAT) ...@@ -2561,10 +2549,10 @@ SIMD_ADD_SUB_SAT_LIST(EMIT_SIMD_ADD_SUB_SAT)
Simd128Register dest = dst.fp(); \ Simd128Register dest = dst.fp(); \
/* Make sure dst and temp are unique. */ \ /* Make sure dst and temp are unique. */ \
if (dest == src1) { \ if (dest == src1) { \
dest = GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(src1)).fp(); \ dest = GetUnusedRegister(kFpReg, LiftoffRegList{src1}).fp(); \
} \ } \
Simd128Register temp = \ Simd128Register temp = \
GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(dest, src1)).fp(); \ GetUnusedRegister(kFpReg, LiftoffRegList{dest, src1}).fp(); \
op(dest, src1, kScratchDoubleReg, temp); \ op(dest, src1, kScratchDoubleReg, temp); \
if (dest != dst.fp()) { \ if (dest != dst.fp()) { \
vlr(dst.fp(), dest, Condition(0), Condition(0), Condition(0)); \ vlr(dst.fp(), dest, Condition(0), Condition(0), Condition(0)); \
...@@ -2716,7 +2704,7 @@ void LiftoffAssembler::emit_i8x16_swizzle(LiftoffRegister dst, ...@@ -2716,7 +2704,7 @@ void LiftoffAssembler::emit_i8x16_swizzle(LiftoffRegister dst,
Simd128Register src2 = rhs.fp(); Simd128Register src2 = rhs.fp();
Simd128Register dest = dst.fp(); Simd128Register dest = dst.fp();
Simd128Register temp = Simd128Register temp =
GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(dest, src1, src2)).fp(); GetUnusedRegister(kFpReg, LiftoffRegList{dest, src1, src2}).fp();
I8x16Swizzle(dest, src1, src2, r0, r1, kScratchDoubleReg, temp); I8x16Swizzle(dest, src1, src2, r0, r1, kScratchDoubleReg, temp);
} }
...@@ -2764,10 +2752,9 @@ void LiftoffAssembler::emit_i16x8_q15mulr_sat_s(LiftoffRegister dst, ...@@ -2764,10 +2752,9 @@ void LiftoffAssembler::emit_i16x8_q15mulr_sat_s(LiftoffRegister dst,
Simd128Register dest = dst.fp(); Simd128Register dest = dst.fp();
// Make sure temp registers are unique. // Make sure temp registers are unique.
Simd128Register temp1 = Simd128Register temp1 =
GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(dest, s1, s2)).fp(); GetUnusedRegister(kFpReg, LiftoffRegList{dest, s1, s2}).fp();
Simd128Register temp2 = Simd128Register temp2 =
GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(dest, s1, s2, temp1)) GetUnusedRegister(kFpReg, LiftoffRegList{dest, s1, s2, temp1}).fp();
.fp();
I16x8Q15MulRSatS(dest, s1, s2, kScratchDoubleReg, temp1, temp2); I16x8Q15MulRSatS(dest, s1, s2, kScratchDoubleReg, temp1, temp2);
} }
......
...@@ -598,8 +598,8 @@ void LiftoffAssembler::AtomicAdd(Register dst_addr, Register offset_reg, ...@@ -598,8 +598,8 @@ void LiftoffAssembler::AtomicAdd(Register dst_addr, Register offset_reg,
void LiftoffAssembler::AtomicSub(Register dst_addr, Register offset_reg, void LiftoffAssembler::AtomicSub(Register dst_addr, Register offset_reg,
uintptr_t offset_imm, LiftoffRegister value, uintptr_t offset_imm, LiftoffRegister value,
LiftoffRegister result, StoreType type) { LiftoffRegister result, StoreType type) {
LiftoffRegList dont_overwrite = cache_state()->used_registers | LiftoffRegList dont_overwrite =
LiftoffRegList::ForRegs(dst_addr, offset_reg); cache_state()->used_registers | LiftoffRegList{dst_addr, offset_reg};
DCHECK(!dont_overwrite.has(result)); DCHECK(!dont_overwrite.has(result));
if (dont_overwrite.has(value)) { if (dont_overwrite.has(value)) {
// We cannot overwrite {value}, but the {value} register is changed in the // We cannot overwrite {value}, but the {value} register is changed in the
...@@ -660,8 +660,7 @@ inline void AtomicBinop(LiftoffAssembler* lasm, ...@@ -660,8 +660,7 @@ inline void AtomicBinop(LiftoffAssembler* lasm,
// The cmpxchg instruction uses rax to store the old value of the // The cmpxchg instruction uses rax to store the old value of the
// compare-exchange primitive. Therefore we have to spill the register and // compare-exchange primitive. Therefore we have to spill the register and
// move any use to another register. // move any use to another register.
LiftoffRegList pinned = LiftoffRegList pinned = LiftoffRegList{dst_addr, offset_reg, value_reg};
LiftoffRegList::ForRegs(dst_addr, offset_reg, value_reg);
__ ClearRegister(rax, {&dst_addr, &offset_reg, &value_reg}, pinned); __ ClearRegister(rax, {&dst_addr, &offset_reg, &value_reg}, pinned);
Operand dst_op = liftoff::GetMemOp(lasm, dst_addr, offset_reg, offset_imm); Operand dst_op = liftoff::GetMemOp(lasm, dst_addr, offset_reg, offset_imm);
...@@ -798,7 +797,7 @@ void LiftoffAssembler::AtomicCompareExchange( ...@@ -798,7 +797,7 @@ void LiftoffAssembler::AtomicCompareExchange(
// compare-exchange primitive. Therefore we have to spill the register and // compare-exchange primitive. Therefore we have to spill the register and
// move any use to another register. // move any use to another register.
LiftoffRegList pinned = LiftoffRegList pinned =
LiftoffRegList::ForRegs(dst_addr, offset_reg, expected, value_reg); LiftoffRegList{dst_addr, offset_reg, expected, value_reg};
ClearRegister(rax, {&dst_addr, &offset_reg, &value_reg}, pinned); ClearRegister(rax, {&dst_addr, &offset_reg, &value_reg}, pinned);
if (expected.gp() != rax) { if (expected.gp() != rax) {
movq(rax, expected.gp()); movq(rax, expected.gp());
...@@ -3429,9 +3428,9 @@ void LiftoffAssembler::emit_i64x2_mul(LiftoffRegister dst, LiftoffRegister lhs, ...@@ -3429,9 +3428,9 @@ void LiftoffAssembler::emit_i64x2_mul(LiftoffRegister dst, LiftoffRegister lhs,
LiftoffRegister rhs) { LiftoffRegister rhs) {
static constexpr RegClass tmp_rc = reg_class_for(kS128); static constexpr RegClass tmp_rc = reg_class_for(kS128);
LiftoffRegister tmp1 = LiftoffRegister tmp1 =
GetUnusedRegister(tmp_rc, LiftoffRegList::ForRegs(dst, lhs, rhs)); GetUnusedRegister(tmp_rc, LiftoffRegList{dst, lhs, rhs});
LiftoffRegister tmp2 = LiftoffRegister tmp2 =
GetUnusedRegister(tmp_rc, LiftoffRegList::ForRegs(dst, lhs, rhs, tmp1)); GetUnusedRegister(tmp_rc, LiftoffRegList{dst, lhs, rhs, tmp1});
I64x2Mul(dst.fp(), lhs.fp(), rhs.fp(), tmp1.fp(), tmp2.fp()); I64x2Mul(dst.fp(), lhs.fp(), rhs.fp(), tmp1.fp(), tmp2.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