[wasm][liftoff] Refactor Condition code mapping
Because actual condition code used by s390/ppc does not distinguish between signed and unsigned, we need to use a generic enum class for liftoff which needs to deal with signed/unsigned case differently. Change-Id: Ia870dc30788037996dc1c65de0117eac7d941697 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2560603 Commit-Queue: Junliang Yan <junyan@redhat.com> Reviewed-by: Clemens Backes <clemensb@chromium.org> Cr-Commit-Position: refs/heads/master@{#71433}
This commit is contained in:
parent
b652ba7597
commit
7b17b5e34a
@ -16,6 +16,31 @@ namespace wasm {
|
||||
|
||||
namespace liftoff {
|
||||
|
||||
inline constexpr Condition ToCondition(LiftoffCondition liftoff_cond) {
|
||||
switch (liftoff_cond) {
|
||||
case kEqual:
|
||||
return eq;
|
||||
case kUnequal:
|
||||
return ne;
|
||||
case kSignedLessThan:
|
||||
return lt;
|
||||
case kSignedLessEqual:
|
||||
return le;
|
||||
case kSignedGreaterThan:
|
||||
return gt;
|
||||
case kSignedGreaterEqual:
|
||||
return ge;
|
||||
case kUnsignedLessThan:
|
||||
return lo;
|
||||
case kUnsignedLessEqual:
|
||||
return ls;
|
||||
case kUnsignedGreaterThan:
|
||||
return hi;
|
||||
case kUnsignedGreaterEqual:
|
||||
return hs;
|
||||
}
|
||||
}
|
||||
|
||||
// half
|
||||
// slot Frame
|
||||
// -----+--------------------+---------------------------
|
||||
@ -95,7 +120,7 @@ inline Register CalculateActualAddress(LiftoffAssembler* assm,
|
||||
return actual_addr_reg;
|
||||
}
|
||||
|
||||
inline Condition MakeUnsigned(Condition cond) {
|
||||
inline LiftoffCondition MakeUnsigned(LiftoffCondition cond) {
|
||||
switch (cond) {
|
||||
case kSignedLessThan:
|
||||
return kUnsignedLessThan;
|
||||
@ -2124,9 +2149,10 @@ void LiftoffAssembler::emit_jump(Label* label) { b(label); }
|
||||
|
||||
void LiftoffAssembler::emit_jump(Register target) { bx(target); }
|
||||
|
||||
void LiftoffAssembler::emit_cond_jump(Condition cond, Label* label,
|
||||
ValueType type, Register lhs,
|
||||
Register rhs) {
|
||||
void LiftoffAssembler::emit_cond_jump(LiftoffCondition liftoff_cond,
|
||||
Label* label, ValueType type,
|
||||
Register lhs, Register rhs) {
|
||||
Condition cond = liftoff::ToCondition(liftoff_cond);
|
||||
DCHECK_EQ(type, kWasmI32);
|
||||
if (rhs == no_reg) {
|
||||
cmp(lhs, Operand(0));
|
||||
@ -2141,8 +2167,10 @@ void LiftoffAssembler::emit_i32_eqz(Register dst, Register src) {
|
||||
mov(dst, Operand(dst, LSR, kRegSizeInBitsLog2));
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_i32_set_cond(Condition cond, Register dst,
|
||||
Register lhs, Register rhs) {
|
||||
void LiftoffAssembler::emit_i32_set_cond(LiftoffCondition liftoff_cond,
|
||||
Register dst, Register lhs,
|
||||
Register rhs) {
|
||||
Condition cond = liftoff::ToCondition(liftoff_cond);
|
||||
cmp(lhs, rhs);
|
||||
mov(dst, Operand(0), LeaveCC);
|
||||
mov(dst, Operand(1), LeaveCC, cond);
|
||||
@ -2154,13 +2182,15 @@ void LiftoffAssembler::emit_i64_eqz(Register dst, LiftoffRegister src) {
|
||||
mov(dst, Operand(dst, LSR, 5));
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_i64_set_cond(Condition cond, Register dst,
|
||||
LiftoffRegister lhs,
|
||||
void LiftoffAssembler::emit_i64_set_cond(LiftoffCondition liftoff_cond,
|
||||
Register dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
// For signed i64 comparisons, we still need to use unsigned comparison for
|
||||
// the low word (the only bit carrying signedness information is the MSB in
|
||||
// the high word).
|
||||
Condition unsigned_cond = liftoff::MakeUnsigned(cond);
|
||||
Condition cond = liftoff::ToCondition(liftoff_cond);
|
||||
Condition unsigned_cond =
|
||||
liftoff::ToCondition(liftoff::MakeUnsigned(liftoff_cond));
|
||||
Label set_cond;
|
||||
Label cont;
|
||||
LiftoffRegister dest = LiftoffRegister(dst);
|
||||
@ -2172,7 +2202,7 @@ void LiftoffAssembler::emit_i64_set_cond(Condition cond, Register dst,
|
||||
// equal, compare the low word and use that for set_cond.
|
||||
cmp(lhs.high_gp(), rhs.high_gp());
|
||||
if (unsigned_cond == cond) {
|
||||
cmp(lhs.low_gp(), rhs.low_gp(), kEqual);
|
||||
cmp(lhs.low_gp(), rhs.low_gp(), eq);
|
||||
if (!speculative_move) {
|
||||
mov(dst, Operand(0));
|
||||
}
|
||||
@ -2196,9 +2226,10 @@ void LiftoffAssembler::emit_i64_set_cond(Condition cond, Register dst,
|
||||
}
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_f32_set_cond(Condition cond, Register dst,
|
||||
DoubleRegister lhs,
|
||||
void LiftoffAssembler::emit_f32_set_cond(LiftoffCondition liftoff_cond,
|
||||
Register dst, DoubleRegister lhs,
|
||||
DoubleRegister rhs) {
|
||||
Condition cond = liftoff::ToCondition(liftoff_cond);
|
||||
VFPCompareAndSetFlags(liftoff::GetFloatRegister(lhs),
|
||||
liftoff::GetFloatRegister(rhs));
|
||||
mov(dst, Operand(0), LeaveCC);
|
||||
@ -2209,9 +2240,10 @@ void LiftoffAssembler::emit_f32_set_cond(Condition cond, Register dst,
|
||||
}
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_f64_set_cond(Condition cond, Register dst,
|
||||
DoubleRegister lhs,
|
||||
void LiftoffAssembler::emit_f64_set_cond(LiftoffCondition liftoff_cond,
|
||||
Register dst, DoubleRegister lhs,
|
||||
DoubleRegister rhs) {
|
||||
Condition cond = liftoff::ToCondition(liftoff_cond);
|
||||
VFPCompareAndSetFlags(lhs, rhs);
|
||||
mov(dst, Operand(0), LeaveCC);
|
||||
mov(dst, Operand(1), LeaveCC, cond);
|
||||
|
@ -15,6 +15,31 @@ namespace wasm {
|
||||
|
||||
namespace liftoff {
|
||||
|
||||
inline constexpr Condition ToCondition(LiftoffCondition liftoff_cond) {
|
||||
switch (liftoff_cond) {
|
||||
case kEqual:
|
||||
return eq;
|
||||
case kUnequal:
|
||||
return ne;
|
||||
case kSignedLessThan:
|
||||
return lt;
|
||||
case kSignedLessEqual:
|
||||
return le;
|
||||
case kSignedGreaterThan:
|
||||
return gt;
|
||||
case kSignedGreaterEqual:
|
||||
return ge;
|
||||
case kUnsignedLessThan:
|
||||
return lo;
|
||||
case kUnsignedLessEqual:
|
||||
return ls;
|
||||
case kUnsignedGreaterThan:
|
||||
return hi;
|
||||
case kUnsignedGreaterEqual:
|
||||
return hs;
|
||||
}
|
||||
}
|
||||
|
||||
// Liftoff Frames.
|
||||
//
|
||||
// slot Frame
|
||||
@ -1415,9 +1440,10 @@ void LiftoffAssembler::emit_jump(Label* label) { B(label); }
|
||||
|
||||
void LiftoffAssembler::emit_jump(Register target) { Br(target); }
|
||||
|
||||
void LiftoffAssembler::emit_cond_jump(Condition cond, Label* label,
|
||||
ValueType type, Register lhs,
|
||||
Register rhs) {
|
||||
void LiftoffAssembler::emit_cond_jump(LiftoffCondition liftoff_cond,
|
||||
Label* label, ValueType type,
|
||||
Register lhs, Register rhs) {
|
||||
Condition cond = liftoff::ToCondition(liftoff_cond);
|
||||
switch (type.kind()) {
|
||||
case ValueType::kI32:
|
||||
if (rhs.is_valid()) {
|
||||
@ -1444,8 +1470,10 @@ void LiftoffAssembler::emit_i32_eqz(Register dst, Register src) {
|
||||
Cset(dst.W(), eq);
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_i32_set_cond(Condition cond, Register dst,
|
||||
Register lhs, Register rhs) {
|
||||
void LiftoffAssembler::emit_i32_set_cond(LiftoffCondition liftoff_cond,
|
||||
Register dst, Register lhs,
|
||||
Register rhs) {
|
||||
Condition cond = liftoff::ToCondition(liftoff_cond);
|
||||
Cmp(lhs.W(), rhs.W());
|
||||
Cset(dst.W(), cond);
|
||||
}
|
||||
@ -1455,16 +1483,18 @@ void LiftoffAssembler::emit_i64_eqz(Register dst, LiftoffRegister src) {
|
||||
Cset(dst.W(), eq);
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_i64_set_cond(Condition cond, Register dst,
|
||||
LiftoffRegister lhs,
|
||||
void LiftoffAssembler::emit_i64_set_cond(LiftoffCondition liftoff_cond,
|
||||
Register dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
Condition cond = liftoff::ToCondition(liftoff_cond);
|
||||
Cmp(lhs.gp().X(), rhs.gp().X());
|
||||
Cset(dst.W(), cond);
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_f32_set_cond(Condition cond, Register dst,
|
||||
DoubleRegister lhs,
|
||||
void LiftoffAssembler::emit_f32_set_cond(LiftoffCondition liftoff_cond,
|
||||
Register dst, DoubleRegister lhs,
|
||||
DoubleRegister rhs) {
|
||||
Condition cond = liftoff::ToCondition(liftoff_cond);
|
||||
Fcmp(lhs.S(), rhs.S());
|
||||
Cset(dst.W(), cond);
|
||||
if (cond != ne) {
|
||||
@ -1473,9 +1503,10 @@ void LiftoffAssembler::emit_f32_set_cond(Condition cond, Register dst,
|
||||
}
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_f64_set_cond(Condition cond, Register dst,
|
||||
DoubleRegister lhs,
|
||||
void LiftoffAssembler::emit_f64_set_cond(LiftoffCondition liftoff_cond,
|
||||
Register dst, DoubleRegister lhs,
|
||||
DoubleRegister rhs) {
|
||||
Condition cond = liftoff::ToCondition(liftoff_cond);
|
||||
Fcmp(lhs.D(), rhs.D());
|
||||
Cset(dst.W(), cond);
|
||||
if (cond != ne) {
|
||||
|
@ -22,6 +22,31 @@ namespace wasm {
|
||||
|
||||
namespace liftoff {
|
||||
|
||||
inline constexpr Condition ToCondition(LiftoffCondition liftoff_cond) {
|
||||
switch (liftoff_cond) {
|
||||
case kEqual:
|
||||
return equal;
|
||||
case kUnequal:
|
||||
return not_equal;
|
||||
case kSignedLessThan:
|
||||
return less;
|
||||
case kSignedLessEqual:
|
||||
return less_equal;
|
||||
case kSignedGreaterThan:
|
||||
return greater;
|
||||
case kSignedGreaterEqual:
|
||||
return greater_equal;
|
||||
case kUnsignedLessThan:
|
||||
return below;
|
||||
case kUnsignedLessEqual:
|
||||
return below_equal;
|
||||
case kUnsignedGreaterThan:
|
||||
return above;
|
||||
case kUnsignedGreaterEqual:
|
||||
return above_equal;
|
||||
}
|
||||
}
|
||||
|
||||
// ebp-4 holds the stack marker, ebp-8 is the instance parameter.
|
||||
constexpr int kInstanceOffset = 8;
|
||||
|
||||
@ -2341,9 +2366,10 @@ void LiftoffAssembler::emit_jump(Label* label) { jmp(label); }
|
||||
|
||||
void LiftoffAssembler::emit_jump(Register target) { jmp(target); }
|
||||
|
||||
void LiftoffAssembler::emit_cond_jump(Condition cond, Label* label,
|
||||
ValueType type, Register lhs,
|
||||
Register rhs) {
|
||||
void LiftoffAssembler::emit_cond_jump(LiftoffCondition liftoff_cond,
|
||||
Label* label, ValueType type,
|
||||
Register lhs, Register rhs) {
|
||||
Condition cond = liftoff::ToCondition(liftoff_cond);
|
||||
if (rhs != no_reg) {
|
||||
switch (type.kind()) {
|
||||
case ValueType::kI32:
|
||||
@ -2383,8 +2409,10 @@ void LiftoffAssembler::emit_i32_eqz(Register dst, Register src) {
|
||||
liftoff::setcc_32(this, equal, dst);
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_i32_set_cond(Condition cond, Register dst,
|
||||
Register lhs, Register rhs) {
|
||||
void LiftoffAssembler::emit_i32_set_cond(LiftoffCondition liftoff_cond,
|
||||
Register dst, Register lhs,
|
||||
Register rhs) {
|
||||
Condition cond = liftoff::ToCondition(liftoff_cond);
|
||||
cmp(lhs, rhs);
|
||||
liftoff::setcc_32(this, cond, dst);
|
||||
}
|
||||
@ -2402,7 +2430,7 @@ void LiftoffAssembler::emit_i64_eqz(Register dst, LiftoffRegister src) {
|
||||
}
|
||||
|
||||
namespace liftoff {
|
||||
inline Condition cond_make_unsigned(Condition cond) {
|
||||
inline LiftoffCondition cond_make_unsigned(LiftoffCondition cond) {
|
||||
switch (cond) {
|
||||
case kSignedLessThan:
|
||||
return kUnsignedLessThan;
|
||||
@ -2418,9 +2446,13 @@ inline Condition cond_make_unsigned(Condition cond) {
|
||||
}
|
||||
} // namespace liftoff
|
||||
|
||||
void LiftoffAssembler::emit_i64_set_cond(Condition cond, Register dst,
|
||||
LiftoffRegister lhs,
|
||||
void LiftoffAssembler::emit_i64_set_cond(LiftoffCondition liftoff_cond,
|
||||
Register dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
Condition cond = liftoff::ToCondition(liftoff_cond);
|
||||
Condition unsigned_cond =
|
||||
liftoff::ToCondition(liftoff::cond_make_unsigned(liftoff_cond));
|
||||
|
||||
// Get the tmp byte register out here, such that we don't conditionally spill
|
||||
// (this cannot be reflected in the cache state).
|
||||
Register tmp_byte_reg = liftoff::GetTmpByteRegister(this, dst);
|
||||
@ -2428,7 +2460,6 @@ void LiftoffAssembler::emit_i64_set_cond(Condition cond, Register dst,
|
||||
// For signed i64 comparisons, we still need to use unsigned comparison for
|
||||
// the low word (the only bit carrying signedness information is the MSB in
|
||||
// the high word).
|
||||
Condition unsigned_cond = liftoff::cond_make_unsigned(cond);
|
||||
Label setcc;
|
||||
Label cont;
|
||||
// Compare high word first. If it differs, use if for the setcc. If it's
|
||||
@ -2475,15 +2506,17 @@ void EmitFloatSetCond(LiftoffAssembler* assm, Condition cond, Register dst,
|
||||
}
|
||||
} // namespace liftoff
|
||||
|
||||
void LiftoffAssembler::emit_f32_set_cond(Condition cond, Register dst,
|
||||
DoubleRegister lhs,
|
||||
void LiftoffAssembler::emit_f32_set_cond(LiftoffCondition liftoff_cond,
|
||||
Register dst, DoubleRegister lhs,
|
||||
DoubleRegister rhs) {
|
||||
Condition cond = liftoff::ToCondition(liftoff_cond);
|
||||
liftoff::EmitFloatSetCond<&Assembler::ucomiss>(this, cond, dst, lhs, rhs);
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_f64_set_cond(Condition cond, Register dst,
|
||||
DoubleRegister lhs,
|
||||
void LiftoffAssembler::emit_f64_set_cond(LiftoffCondition liftoff_cond,
|
||||
Register dst, DoubleRegister lhs,
|
||||
DoubleRegister rhs) {
|
||||
Condition cond = liftoff::ToCondition(liftoff_cond);
|
||||
liftoff::EmitFloatSetCond<&Assembler::ucomisd>(this, cond, dst, lhs, rhs);
|
||||
}
|
||||
|
||||
|
@ -77,61 +77,6 @@ constexpr RegList kLiftoffAssemblerFpCacheRegs = 0xff;
|
||||
|
||||
#endif
|
||||
|
||||
#if V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_X64
|
||||
|
||||
constexpr Condition kEqual = equal;
|
||||
constexpr Condition kUnequal = not_equal;
|
||||
constexpr Condition kSignedLessThan = less;
|
||||
constexpr Condition kSignedLessEqual = less_equal;
|
||||
constexpr Condition kSignedGreaterThan = greater;
|
||||
constexpr Condition kSignedGreaterEqual = greater_equal;
|
||||
constexpr Condition kUnsignedLessThan = below;
|
||||
constexpr Condition kUnsignedLessEqual = below_equal;
|
||||
constexpr Condition kUnsignedGreaterThan = above;
|
||||
constexpr Condition kUnsignedGreaterEqual = above_equal;
|
||||
|
||||
#elif V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64
|
||||
|
||||
constexpr Condition kEqual = eq;
|
||||
constexpr Condition kUnequal = ne;
|
||||
constexpr Condition kSignedLessThan = lt;
|
||||
constexpr Condition kSignedLessEqual = le;
|
||||
constexpr Condition kSignedGreaterThan = gt;
|
||||
constexpr Condition kSignedGreaterEqual = ge;
|
||||
constexpr Condition kUnsignedLessThan = ult;
|
||||
constexpr Condition kUnsignedLessEqual = ule;
|
||||
constexpr Condition kUnsignedGreaterThan = ugt;
|
||||
constexpr Condition kUnsignedGreaterEqual = uge;
|
||||
|
||||
#elif V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64
|
||||
|
||||
constexpr Condition kEqual = eq;
|
||||
constexpr Condition kUnequal = ne;
|
||||
constexpr Condition kSignedLessThan = lt;
|
||||
constexpr Condition kSignedLessEqual = le;
|
||||
constexpr Condition kSignedGreaterThan = gt;
|
||||
constexpr Condition kSignedGreaterEqual = ge;
|
||||
constexpr Condition kUnsignedLessThan = lo;
|
||||
constexpr Condition kUnsignedLessEqual = ls;
|
||||
constexpr Condition kUnsignedGreaterThan = hi;
|
||||
constexpr Condition kUnsignedGreaterEqual = hs;
|
||||
|
||||
#else
|
||||
|
||||
// On unimplemented platforms, just make this compile.
|
||||
constexpr Condition kEqual = static_cast<Condition>(0);
|
||||
constexpr Condition kUnequal = static_cast<Condition>(0);
|
||||
constexpr Condition kSignedLessThan = static_cast<Condition>(0);
|
||||
constexpr Condition kSignedLessEqual = static_cast<Condition>(0);
|
||||
constexpr Condition kSignedGreaterThan = static_cast<Condition>(0);
|
||||
constexpr Condition kSignedGreaterEqual = static_cast<Condition>(0);
|
||||
constexpr Condition kUnsignedLessThan = static_cast<Condition>(0);
|
||||
constexpr Condition kUnsignedLessEqual = static_cast<Condition>(0);
|
||||
constexpr Condition kUnsignedGreaterThan = static_cast<Condition>(0);
|
||||
constexpr Condition kUnsignedGreaterEqual = static_cast<Condition>(0);
|
||||
|
||||
#endif
|
||||
|
||||
} // namespace wasm
|
||||
} // namespace internal
|
||||
} // namespace v8
|
||||
|
@ -30,6 +30,44 @@ class CallDescriptor;
|
||||
|
||||
namespace wasm {
|
||||
|
||||
enum LiftoffCondition {
|
||||
kEqual,
|
||||
kUnequal,
|
||||
kSignedLessThan,
|
||||
kSignedLessEqual,
|
||||
kSignedGreaterThan,
|
||||
kSignedGreaterEqual,
|
||||
kUnsignedLessThan,
|
||||
kUnsignedLessEqual,
|
||||
kUnsignedGreaterThan,
|
||||
kUnsignedGreaterEqual
|
||||
};
|
||||
|
||||
inline constexpr LiftoffCondition Negate(LiftoffCondition liftoff_cond) {
|
||||
switch (liftoff_cond) {
|
||||
case kEqual:
|
||||
return kUnequal;
|
||||
case kUnequal:
|
||||
return kEqual;
|
||||
case kSignedLessThan:
|
||||
return kSignedGreaterEqual;
|
||||
case kSignedLessEqual:
|
||||
return kSignedGreaterThan;
|
||||
case kSignedGreaterEqual:
|
||||
return kSignedLessThan;
|
||||
case kSignedGreaterThan:
|
||||
return kSignedLessEqual;
|
||||
case kUnsignedLessThan:
|
||||
return kUnsignedGreaterEqual;
|
||||
case kUnsignedLessEqual:
|
||||
return kUnsignedGreaterThan;
|
||||
case kUnsignedGreaterEqual:
|
||||
return kUnsignedLessThan;
|
||||
case kUnsignedGreaterThan:
|
||||
return kUnsignedLessEqual;
|
||||
}
|
||||
}
|
||||
|
||||
class LiftoffAssembler : public TurboAssembler {
|
||||
public:
|
||||
// Each slot in our stack frame currently has exactly 8 bytes.
|
||||
@ -747,18 +785,18 @@ class LiftoffAssembler : public TurboAssembler {
|
||||
inline void emit_jump(Label*);
|
||||
inline void emit_jump(Register);
|
||||
|
||||
inline void emit_cond_jump(Condition, Label*, ValueType value, Register lhs,
|
||||
Register rhs = no_reg);
|
||||
inline void emit_cond_jump(LiftoffCondition, Label*, ValueType value,
|
||||
Register lhs, Register rhs = no_reg);
|
||||
// Set {dst} to 1 if condition holds, 0 otherwise.
|
||||
inline void emit_i32_eqz(Register dst, Register src);
|
||||
inline void emit_i32_set_cond(Condition, Register dst, Register lhs,
|
||||
inline void emit_i32_set_cond(LiftoffCondition, Register dst, Register lhs,
|
||||
Register rhs);
|
||||
inline void emit_i64_eqz(Register dst, LiftoffRegister src);
|
||||
inline void emit_i64_set_cond(Condition condition, Register dst,
|
||||
inline void emit_i64_set_cond(LiftoffCondition condition, Register dst,
|
||||
LiftoffRegister lhs, LiftoffRegister rhs);
|
||||
inline void emit_f32_set_cond(Condition condition, Register dst,
|
||||
inline void emit_f32_set_cond(LiftoffCondition condition, Register dst,
|
||||
DoubleRegister lhs, DoubleRegister rhs);
|
||||
inline void emit_f64_set_cond(Condition condition, Register dst,
|
||||
inline void emit_f64_set_cond(LiftoffCondition condition, Register dst,
|
||||
DoubleRegister lhs, DoubleRegister rhs);
|
||||
|
||||
// Optional select support: Returns false if generic code (via branches)
|
||||
|
@ -133,7 +133,7 @@ constexpr ValueType kSupportedTypesWithoutRefsArr[] = {
|
||||
constexpr Vector<const ValueType> kSupportedTypesWithoutRefs =
|
||||
ArrayVector(kSupportedTypesWithoutRefsArr);
|
||||
|
||||
constexpr Condition GetCompareCondition(WasmOpcode opcode) {
|
||||
constexpr LiftoffCondition GetCompareCondition(WasmOpcode opcode) {
|
||||
switch (opcode) {
|
||||
case kExprI32Eq:
|
||||
return kEqual;
|
||||
@ -1963,7 +1963,7 @@ class LiftoffCompiler {
|
||||
outstanding_op_ = kNoOutstandingOp;
|
||||
} else {
|
||||
// Otherwise, it's an i32 compare opcode.
|
||||
Condition cond = NegateCondition(GetCompareCondition(outstanding_op_));
|
||||
LiftoffCondition cond = Negate(GetCompareCondition(outstanding_op_));
|
||||
Register rhs = value;
|
||||
Register lhs = __ PopToRegister(LiftoffRegList::ForRegs(rhs)).gp();
|
||||
__ emit_cond_jump(cond, &cont_false, kWasmI32, lhs, rhs);
|
||||
|
@ -13,6 +13,31 @@ namespace wasm {
|
||||
|
||||
namespace liftoff {
|
||||
|
||||
inline constexpr Condition ToCondition(LiftoffCondition liftoff_cond) {
|
||||
switch (liftoff_cond) {
|
||||
case kEqual:
|
||||
return eq;
|
||||
case kUnequal:
|
||||
return ne;
|
||||
case kSignedLessThan:
|
||||
return lt;
|
||||
case kSignedLessEqual:
|
||||
return le;
|
||||
case kSignedGreaterThan:
|
||||
return gt;
|
||||
case kSignedGreaterEqual:
|
||||
return ge;
|
||||
case kUnsignedLessThan:
|
||||
return ult;
|
||||
case kUnsignedLessEqual:
|
||||
return ule;
|
||||
case kUnsignedGreaterThan:
|
||||
return ugt;
|
||||
case kUnsignedGreaterEqual:
|
||||
return uge;
|
||||
}
|
||||
}
|
||||
|
||||
// half
|
||||
// slot Frame
|
||||
// -----+--------------------+---------------------------
|
||||
@ -1430,9 +1455,10 @@ void LiftoffAssembler::emit_jump(Register target) {
|
||||
TurboAssembler::Jump(target);
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_cond_jump(Condition cond, Label* label,
|
||||
ValueType type, Register lhs,
|
||||
Register rhs) {
|
||||
void LiftoffAssembler::emit_cond_jump(LiftoffCondition liftoff_cond,
|
||||
Label* label, ValueType type,
|
||||
Register lhs, Register rhs) {
|
||||
Condition cond = liftoff::ToCondition(liftoff_cond);
|
||||
if (rhs != no_reg) {
|
||||
TurboAssembler::Branch(label, cond, lhs, Operand(rhs));
|
||||
} else {
|
||||
@ -1444,8 +1470,10 @@ void LiftoffAssembler::emit_i32_eqz(Register dst, Register src) {
|
||||
sltiu(dst, src, 1);
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_i32_set_cond(Condition cond, Register dst,
|
||||
Register lhs, Register rhs) {
|
||||
void LiftoffAssembler::emit_i32_set_cond(LiftoffCondition liftoff_cond,
|
||||
Register dst, Register lhs,
|
||||
Register rhs) {
|
||||
Condition cond = liftoff::ToCondition(liftoff_cond);
|
||||
Register tmp = dst;
|
||||
if (dst == lhs || dst == rhs) {
|
||||
tmp = GetUnusedRegister(kGpReg, LiftoffRegList::ForRegs(lhs, rhs)).gp();
|
||||
@ -1486,9 +1514,10 @@ inline Condition cond_make_unsigned(Condition cond) {
|
||||
}
|
||||
} // namespace liftoff
|
||||
|
||||
void LiftoffAssembler::emit_i64_set_cond(Condition cond, Register dst,
|
||||
LiftoffRegister lhs,
|
||||
void LiftoffAssembler::emit_i64_set_cond(LiftoffCondition liftoff_cond,
|
||||
Register dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
Condition cond = liftoff::ToCondition(liftoff_cond);
|
||||
Label low, cont;
|
||||
|
||||
// For signed i64 comparisons, we still need to use unsigned comparison for
|
||||
@ -1553,9 +1582,10 @@ inline FPUCondition ConditionToConditionCmpFPU(Condition condition,
|
||||
|
||||
} // namespace liftoff
|
||||
|
||||
void LiftoffAssembler::emit_f32_set_cond(Condition cond, Register dst,
|
||||
DoubleRegister lhs,
|
||||
void LiftoffAssembler::emit_f32_set_cond(LiftoffCondition liftoff_cond,
|
||||
Register dst, DoubleRegister lhs,
|
||||
DoubleRegister rhs) {
|
||||
Condition cond = liftoff::ToCondition(liftoff_cond);
|
||||
Label not_nan, cont;
|
||||
TurboAssembler::CompareIsNanF32(lhs, rhs);
|
||||
TurboAssembler::BranchFalseF(¬_nan);
|
||||
@ -1582,9 +1612,10 @@ void LiftoffAssembler::emit_f32_set_cond(Condition cond, Register dst,
|
||||
bind(&cont);
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_f64_set_cond(Condition cond, Register dst,
|
||||
DoubleRegister lhs,
|
||||
void LiftoffAssembler::emit_f64_set_cond(LiftoffCondition liftoff_cond,
|
||||
Register dst, DoubleRegister lhs,
|
||||
DoubleRegister rhs) {
|
||||
Condition cond = liftoff::ToCondition(liftoff_cond);
|
||||
Label not_nan, cont;
|
||||
TurboAssembler::CompareIsNanF64(lhs, rhs);
|
||||
TurboAssembler::BranchFalseF(¬_nan);
|
||||
|
@ -15,6 +15,31 @@ namespace wasm {
|
||||
|
||||
namespace liftoff {
|
||||
|
||||
inline constexpr Condition ToCondition(LiftoffCondition liftoff_cond) {
|
||||
switch (liftoff_cond) {
|
||||
case kEqual:
|
||||
return eq;
|
||||
case kUnequal:
|
||||
return ne;
|
||||
case kSignedLessThan:
|
||||
return lt;
|
||||
case kSignedLessEqual:
|
||||
return le;
|
||||
case kSignedGreaterThan:
|
||||
return gt;
|
||||
case kSignedGreaterEqual:
|
||||
return ge;
|
||||
case kUnsignedLessThan:
|
||||
return ult;
|
||||
case kUnsignedLessEqual:
|
||||
return ule;
|
||||
case kUnsignedGreaterThan:
|
||||
return ugt;
|
||||
case kUnsignedGreaterEqual:
|
||||
return uge;
|
||||
}
|
||||
}
|
||||
|
||||
// Liftoff Frames.
|
||||
//
|
||||
// slot Frame
|
||||
@ -1308,9 +1333,10 @@ void LiftoffAssembler::emit_jump(Register target) {
|
||||
TurboAssembler::Jump(target);
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_cond_jump(Condition cond, Label* label,
|
||||
ValueType type, Register lhs,
|
||||
Register rhs) {
|
||||
void LiftoffAssembler::emit_cond_jump(LiftoffCondition liftoff_cond,
|
||||
Label* label, ValueType type,
|
||||
Register lhs, Register rhs) {
|
||||
Condition cond = liftoff::ToCondition(liftoff_cond);
|
||||
if (rhs != no_reg) {
|
||||
TurboAssembler::Branch(label, cond, lhs, Operand(rhs));
|
||||
} else {
|
||||
@ -1322,8 +1348,10 @@ void LiftoffAssembler::emit_i32_eqz(Register dst, Register src) {
|
||||
sltiu(dst, src, 1);
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_i32_set_cond(Condition cond, Register dst,
|
||||
Register lhs, Register rhs) {
|
||||
void LiftoffAssembler::emit_i32_set_cond(LiftoffCondition liftoff_cond,
|
||||
Register dst, Register lhs,
|
||||
Register rhs) {
|
||||
Condition cond = liftoff::ToCondition(liftoff_cond);
|
||||
Register tmp = dst;
|
||||
if (dst == lhs || dst == rhs) {
|
||||
tmp = GetUnusedRegister(kGpReg, LiftoffRegList::ForRegs(lhs, rhs)).gp();
|
||||
@ -1343,9 +1371,10 @@ void LiftoffAssembler::emit_i64_eqz(Register dst, LiftoffRegister src) {
|
||||
sltiu(dst, src.gp(), 1);
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_i64_set_cond(Condition cond, Register dst,
|
||||
LiftoffRegister lhs,
|
||||
void LiftoffAssembler::emit_i64_set_cond(LiftoffCondition liftoff_cond,
|
||||
Register dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
Condition cond = liftoff::ToCondition(liftoff_cond);
|
||||
Register tmp = dst;
|
||||
if (dst == lhs.gp() || dst == rhs.gp()) {
|
||||
tmp = GetUnusedRegister(kGpReg, LiftoffRegList::ForRegs(lhs, rhs)).gp();
|
||||
@ -1414,9 +1443,10 @@ inline void EmitAllTrue(LiftoffAssembler* assm, LiftoffRegister dst,
|
||||
|
||||
} // namespace liftoff
|
||||
|
||||
void LiftoffAssembler::emit_f32_set_cond(Condition cond, Register dst,
|
||||
DoubleRegister lhs,
|
||||
void LiftoffAssembler::emit_f32_set_cond(LiftoffCondition liftoff_cond,
|
||||
Register dst, DoubleRegister lhs,
|
||||
DoubleRegister rhs) {
|
||||
Condition cond = liftoff::ToCondition(liftoff_cond);
|
||||
Label not_nan, cont;
|
||||
TurboAssembler::CompareIsNanF32(lhs, rhs);
|
||||
TurboAssembler::BranchFalseF(¬_nan);
|
||||
@ -1443,9 +1473,10 @@ void LiftoffAssembler::emit_f32_set_cond(Condition cond, Register dst,
|
||||
bind(&cont);
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_f64_set_cond(Condition cond, Register dst,
|
||||
DoubleRegister lhs,
|
||||
void LiftoffAssembler::emit_f64_set_cond(LiftoffCondition liftoff_cond,
|
||||
Register dst, DoubleRegister lhs,
|
||||
DoubleRegister rhs) {
|
||||
Condition cond = liftoff::ToCondition(liftoff_cond);
|
||||
Label not_nan, cont;
|
||||
TurboAssembler::CompareIsNanF64(lhs, rhs);
|
||||
TurboAssembler::BranchFalseF(¬_nan);
|
||||
|
@ -516,9 +516,9 @@ void LiftoffAssembler::emit_jump(Register target) {
|
||||
bailout(kUnsupportedArchitecture, "emit_jump");
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_cond_jump(Condition cond, Label* label,
|
||||
ValueType type, Register lhs,
|
||||
Register rhs) {
|
||||
void LiftoffAssembler::emit_cond_jump(LiftoffCondition liftoff_cond,
|
||||
Label* label, ValueType type,
|
||||
Register lhs, Register rhs) {
|
||||
bailout(kUnsupportedArchitecture, "emit_cond_jump");
|
||||
}
|
||||
|
||||
@ -526,8 +526,9 @@ void LiftoffAssembler::emit_i32_eqz(Register dst, Register src) {
|
||||
bailout(kUnsupportedArchitecture, "emit_i32_eqz");
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_i32_set_cond(Condition cond, Register dst,
|
||||
Register lhs, Register rhs) {
|
||||
void LiftoffAssembler::emit_i32_set_cond(LiftoffCondition liftoff_cond,
|
||||
Register dst, Register lhs,
|
||||
Register rhs) {
|
||||
bailout(kUnsupportedArchitecture, "emit_i32_set_cond");
|
||||
}
|
||||
|
||||
@ -535,20 +536,20 @@ void LiftoffAssembler::emit_i64_eqz(Register dst, LiftoffRegister src) {
|
||||
bailout(kUnsupportedArchitecture, "emit_i64_eqz");
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_i64_set_cond(Condition cond, Register dst,
|
||||
LiftoffRegister lhs,
|
||||
void LiftoffAssembler::emit_i64_set_cond(LiftoffCondition liftoff_cond,
|
||||
Register dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
bailout(kUnsupportedArchitecture, "emit_i64_set_cond");
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_f32_set_cond(Condition cond, Register dst,
|
||||
DoubleRegister lhs,
|
||||
void LiftoffAssembler::emit_f32_set_cond(LiftoffCondition liftoff_cond,
|
||||
Register dst, DoubleRegister lhs,
|
||||
DoubleRegister rhs) {
|
||||
bailout(kUnsupportedArchitecture, "emit_f32_set_cond");
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_f64_set_cond(Condition cond, Register dst,
|
||||
DoubleRegister lhs,
|
||||
void LiftoffAssembler::emit_f64_set_cond(LiftoffCondition liftoff_cond,
|
||||
Register dst, DoubleRegister lhs,
|
||||
DoubleRegister rhs) {
|
||||
bailout(kUnsupportedArchitecture, "emit_f64_set_cond");
|
||||
}
|
||||
|
@ -520,9 +520,9 @@ void LiftoffAssembler::emit_jump(Register target) {
|
||||
bailout(kUnsupportedArchitecture, "emit_jump");
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_cond_jump(Condition cond, Label* label,
|
||||
ValueType type, Register lhs,
|
||||
Register rhs) {
|
||||
void LiftoffAssembler::emit_cond_jump(LiftoffCondition liftoff_cond,
|
||||
Label* label, ValueType type,
|
||||
Register lhs, Register rhs) {
|
||||
bailout(kUnsupportedArchitecture, "emit_cond_jump");
|
||||
}
|
||||
|
||||
@ -530,8 +530,9 @@ void LiftoffAssembler::emit_i32_eqz(Register dst, Register src) {
|
||||
bailout(kUnsupportedArchitecture, "emit_i32_eqz");
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_i32_set_cond(Condition cond, Register dst,
|
||||
Register lhs, Register rhs) {
|
||||
void LiftoffAssembler::emit_i32_set_cond(LiftoffCondition liftoff_cond,
|
||||
Register dst, Register lhs,
|
||||
Register rhs) {
|
||||
bailout(kUnsupportedArchitecture, "emit_i32_set_cond");
|
||||
}
|
||||
|
||||
@ -539,20 +540,20 @@ void LiftoffAssembler::emit_i64_eqz(Register dst, LiftoffRegister src) {
|
||||
bailout(kUnsupportedArchitecture, "emit_i64_eqz");
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_i64_set_cond(Condition cond, Register dst,
|
||||
LiftoffRegister lhs,
|
||||
void LiftoffAssembler::emit_i64_set_cond(LiftoffCondition liftoff_cond,
|
||||
Register dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
bailout(kUnsupportedArchitecture, "emit_i64_set_cond");
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_f32_set_cond(Condition cond, Register dst,
|
||||
DoubleRegister lhs,
|
||||
void LiftoffAssembler::emit_f32_set_cond(LiftoffCondition liftoff_cond,
|
||||
Register dst, DoubleRegister lhs,
|
||||
DoubleRegister rhs) {
|
||||
bailout(kUnsupportedArchitecture, "emit_f32_set_cond");
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_f64_set_cond(Condition cond, Register dst,
|
||||
DoubleRegister lhs,
|
||||
void LiftoffAssembler::emit_f64_set_cond(LiftoffCondition liftoff_cond,
|
||||
Register dst, DoubleRegister lhs,
|
||||
DoubleRegister rhs) {
|
||||
bailout(kUnsupportedArchitecture, "emit_f64_set_cond");
|
||||
}
|
||||
|
@ -21,6 +21,31 @@ namespace wasm {
|
||||
|
||||
namespace liftoff {
|
||||
|
||||
inline constexpr Condition ToCondition(LiftoffCondition liftoff_cond) {
|
||||
switch (liftoff_cond) {
|
||||
case kEqual:
|
||||
return equal;
|
||||
case kUnequal:
|
||||
return not_equal;
|
||||
case kSignedLessThan:
|
||||
return less;
|
||||
case kSignedLessEqual:
|
||||
return less_equal;
|
||||
case kSignedGreaterThan:
|
||||
return greater;
|
||||
case kSignedGreaterEqual:
|
||||
return greater_equal;
|
||||
case kUnsignedLessThan:
|
||||
return below;
|
||||
case kUnsignedLessEqual:
|
||||
return below_equal;
|
||||
case kUnsignedGreaterThan:
|
||||
return above;
|
||||
case kUnsignedGreaterEqual:
|
||||
return above_equal;
|
||||
}
|
||||
}
|
||||
|
||||
constexpr Register kScratchRegister2 = r11;
|
||||
static_assert(kScratchRegister != kScratchRegister2, "collision");
|
||||
static_assert((kLiftoffAssemblerGpCacheRegs &
|
||||
@ -2009,9 +2034,10 @@ void LiftoffAssembler::emit_jump(Label* label) { jmp(label); }
|
||||
|
||||
void LiftoffAssembler::emit_jump(Register target) { jmp(target); }
|
||||
|
||||
void LiftoffAssembler::emit_cond_jump(Condition cond, Label* label,
|
||||
ValueType type, Register lhs,
|
||||
Register rhs) {
|
||||
void LiftoffAssembler::emit_cond_jump(LiftoffCondition liftoff_cond,
|
||||
Label* label, ValueType type,
|
||||
Register lhs, Register rhs) {
|
||||
Condition cond = liftoff::ToCondition(liftoff_cond);
|
||||
if (rhs != no_reg) {
|
||||
switch (type.kind()) {
|
||||
case ValueType::kI32:
|
||||
@ -2037,8 +2063,10 @@ void LiftoffAssembler::emit_i32_eqz(Register dst, Register src) {
|
||||
movzxbl(dst, dst);
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_i32_set_cond(Condition cond, Register dst,
|
||||
Register lhs, Register rhs) {
|
||||
void LiftoffAssembler::emit_i32_set_cond(LiftoffCondition liftoff_cond,
|
||||
Register dst, Register lhs,
|
||||
Register rhs) {
|
||||
Condition cond = liftoff::ToCondition(liftoff_cond);
|
||||
cmpl(lhs, rhs);
|
||||
setcc(cond, dst);
|
||||
movzxbl(dst, dst);
|
||||
@ -2050,9 +2078,10 @@ void LiftoffAssembler::emit_i64_eqz(Register dst, LiftoffRegister src) {
|
||||
movzxbl(dst, dst);
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_i64_set_cond(Condition cond, Register dst,
|
||||
LiftoffRegister lhs,
|
||||
void LiftoffAssembler::emit_i64_set_cond(LiftoffCondition liftoff_cond,
|
||||
Register dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
Condition cond = liftoff::ToCondition(liftoff_cond);
|
||||
cmpq(lhs.gp(), rhs.gp());
|
||||
setcc(cond, dst);
|
||||
movzxbl(dst, dst);
|
||||
@ -2083,16 +2112,18 @@ void EmitFloatSetCond(LiftoffAssembler* assm, Condition cond, Register dst,
|
||||
}
|
||||
} // namespace liftoff
|
||||
|
||||
void LiftoffAssembler::emit_f32_set_cond(Condition cond, Register dst,
|
||||
DoubleRegister lhs,
|
||||
void LiftoffAssembler::emit_f32_set_cond(LiftoffCondition liftoff_cond,
|
||||
Register dst, DoubleRegister lhs,
|
||||
DoubleRegister rhs) {
|
||||
Condition cond = liftoff::ToCondition(liftoff_cond);
|
||||
liftoff::EmitFloatSetCond<&TurboAssembler::Ucomiss>(this, cond, dst, lhs,
|
||||
rhs);
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_f64_set_cond(Condition cond, Register dst,
|
||||
DoubleRegister lhs,
|
||||
void LiftoffAssembler::emit_f64_set_cond(LiftoffCondition liftoff_cond,
|
||||
Register dst, DoubleRegister lhs,
|
||||
DoubleRegister rhs) {
|
||||
Condition cond = liftoff::ToCondition(liftoff_cond);
|
||||
liftoff::EmitFloatSetCond<&TurboAssembler::Ucomisd>(this, cond, dst, lhs,
|
||||
rhs);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user