[wasm-simd][liftoff] Implement lt, le, gt, ge of f32x4 and f64x2 on x64 and ia32
Bug: v8:9909 Change-Id: Id0fcf8ff2575858dd3977795aa03df95b65b5720 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2158925 Reviewed-by: Zhi An Ng <zhin@chromium.org> Reviewed-by: Clemens Backes <clemensb@chromium.org> Commit-Queue: Zhiguo Zhou <zhiguo.zhou@intel.com> Cr-Commit-Position: refs/heads/master@{#67348}
This commit is contained in:
parent
5f040f9b01
commit
c47d1631a3
@ -2462,6 +2462,16 @@ void LiftoffAssembler::emit_f32x4_ne(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
vmvn(liftoff::GetSimd128Register(dst), liftoff::GetSimd128Register(dst));
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_f32x4_lt(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
bailout(kSimd, "f32x4_lt");
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_f32x4_le(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
bailout(kSimd, "f32x4_le");
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_f64x2_eq(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
liftoff::F64x2CompareEquality(this, dst, lhs, rhs, eq);
|
||||
@ -2472,6 +2482,16 @@ void LiftoffAssembler::emit_f64x2_ne(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
liftoff::F64x2CompareEquality(this, dst, lhs, rhs, ne);
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_f64x2_lt(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
bailout(kSimd, "f64x2_lt");
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_f64x2_le(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
bailout(kSimd, "f64x2_le");
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_s128_not(LiftoffRegister dst, LiftoffRegister src) {
|
||||
vmvn(liftoff::GetSimd128Register(dst), liftoff::GetSimd128Register(src));
|
||||
}
|
||||
|
@ -1573,6 +1573,16 @@ void LiftoffAssembler::emit_f32x4_ne(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
Mvn(dst.fp().V4S(), dst.fp().V4S());
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_f32x4_lt(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
bailout(kSimd, "f32x4_lt");
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_f32x4_le(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
bailout(kSimd, "f32x4_le");
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_f64x2_eq(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
Fcmeq(dst.fp().V2D(), lhs.fp().V2D(), rhs.fp().V2D());
|
||||
@ -1584,6 +1594,16 @@ void LiftoffAssembler::emit_f64x2_ne(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
Mvn(dst.fp().V2D(), dst.fp().V2D());
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_f64x2_lt(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
bailout(kSimd, "f64x2_lt");
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_f64x2_le(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
bailout(kSimd, "f64x2_le");
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_s128_not(LiftoffRegister dst, LiftoffRegister src) {
|
||||
Mvn(dst.fp().V16B(), src.fp().V16B());
|
||||
}
|
||||
|
@ -2073,6 +2073,20 @@ void LiftoffAssembler::emit_f32x4_ne(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
&Assembler::cmpneqps>(this, dst, lhs, rhs);
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_f32x4_lt(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
liftoff::EmitSimdNonCommutativeBinOp<&Assembler::vcmpltps,
|
||||
&Assembler::cmpltps>(this, dst, lhs,
|
||||
rhs);
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_f32x4_le(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
liftoff::EmitSimdNonCommutativeBinOp<&Assembler::vcmpleps,
|
||||
&Assembler::cmpleps>(this, dst, lhs,
|
||||
rhs);
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_f64x2_eq(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
liftoff::EmitSimdCommutativeBinOp<&Assembler::vcmpeqpd, &Assembler::cmpeqpd>(
|
||||
@ -2085,6 +2099,20 @@ void LiftoffAssembler::emit_f64x2_ne(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
&Assembler::cmpneqpd>(this, dst, lhs, rhs);
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_f64x2_lt(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
liftoff::EmitSimdNonCommutativeBinOp<&Assembler::vcmpltpd,
|
||||
&Assembler::cmpltpd>(this, dst, lhs,
|
||||
rhs);
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_f64x2_le(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
liftoff::EmitSimdNonCommutativeBinOp<&Assembler::vcmplepd,
|
||||
&Assembler::cmplepd>(this, dst, lhs,
|
||||
rhs);
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_s128_not(LiftoffRegister dst, LiftoffRegister src) {
|
||||
if (dst.fp() != src.fp()) {
|
||||
Pcmpeqd(dst.fp(), dst.fp());
|
||||
|
@ -745,10 +745,18 @@ class LiftoffAssembler : public TurboAssembler {
|
||||
LiftoffRegister rhs);
|
||||
inline void emit_f32x4_ne(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs);
|
||||
inline void emit_f32x4_lt(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs);
|
||||
inline void emit_f32x4_le(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs);
|
||||
inline void emit_f64x2_eq(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs);
|
||||
inline void emit_f64x2_ne(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs);
|
||||
inline void emit_f64x2_lt(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs);
|
||||
inline void emit_f64x2_le(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs);
|
||||
inline void emit_s128_not(LiftoffRegister dst, LiftoffRegister src);
|
||||
inline void emit_s128_and(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs);
|
||||
|
@ -1146,7 +1146,7 @@ class LiftoffCompiler {
|
||||
}
|
||||
|
||||
template <ValueType::Kind src_type, ValueType::Kind result_type,
|
||||
typename EmitFn>
|
||||
bool swap_lhs_rhs = false, typename EmitFn>
|
||||
void EmitBinOp(EmitFn fn) {
|
||||
static constexpr RegClass src_rc = reg_class_for(src_type);
|
||||
static constexpr RegClass result_rc = reg_class_for(result_type);
|
||||
@ -1155,6 +1155,9 @@ class LiftoffCompiler {
|
||||
LiftoffRegister dst = src_rc == result_rc
|
||||
? __ GetUnusedRegister(result_rc, {lhs, rhs})
|
||||
: __ GetUnusedRegister(result_rc);
|
||||
|
||||
if (swap_lhs_rhs) std::swap(lhs, rhs);
|
||||
|
||||
CallEmitFn(fn, dst, lhs, rhs);
|
||||
__ PushRegister(ValueType(result_type), dst);
|
||||
}
|
||||
@ -2358,10 +2361,26 @@ class LiftoffCompiler {
|
||||
return EmitBinOp<kS128, kS128>(&LiftoffAssembler::emit_f32x4_eq);
|
||||
case wasm::kExprF32x4Ne:
|
||||
return EmitBinOp<kS128, kS128>(&LiftoffAssembler::emit_f32x4_ne);
|
||||
case wasm::kExprF32x4Lt:
|
||||
return EmitBinOp<kS128, kS128>(&LiftoffAssembler::emit_f32x4_lt);
|
||||
case wasm::kExprF32x4Gt:
|
||||
return EmitBinOp<kS128, kS128, true>(&LiftoffAssembler::emit_f32x4_lt);
|
||||
case wasm::kExprF32x4Le:
|
||||
return EmitBinOp<kS128, kS128>(&LiftoffAssembler::emit_f32x4_le);
|
||||
case wasm::kExprF32x4Ge:
|
||||
return EmitBinOp<kS128, kS128, true>(&LiftoffAssembler::emit_f32x4_le);
|
||||
case wasm::kExprF64x2Eq:
|
||||
return EmitBinOp<kS128, kS128>(&LiftoffAssembler::emit_f64x2_eq);
|
||||
case wasm::kExprF64x2Ne:
|
||||
return EmitBinOp<kS128, kS128>(&LiftoffAssembler::emit_f64x2_ne);
|
||||
case wasm::kExprF64x2Lt:
|
||||
return EmitBinOp<kS128, kS128>(&LiftoffAssembler::emit_f64x2_lt);
|
||||
case wasm::kExprF64x2Gt:
|
||||
return EmitBinOp<kS128, kS128, true>(&LiftoffAssembler::emit_f64x2_lt);
|
||||
case wasm::kExprF64x2Le:
|
||||
return EmitBinOp<kS128, kS128>(&LiftoffAssembler::emit_f64x2_le);
|
||||
case wasm::kExprF64x2Ge:
|
||||
return EmitBinOp<kS128, kS128, true>(&LiftoffAssembler::emit_f64x2_le);
|
||||
case wasm::kExprS128Not:
|
||||
return EmitUnOp<kS128, kS128>(&LiftoffAssembler::emit_s128_not);
|
||||
case wasm::kExprS128And:
|
||||
|
@ -2036,6 +2036,20 @@ void LiftoffAssembler::emit_f32x4_ne(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
&Assembler::cmpneqps>(this, dst, lhs, rhs);
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_f32x4_lt(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
liftoff::EmitSimdNonCommutativeBinOp<&Assembler::vcmpltps,
|
||||
&Assembler::cmpltps>(this, dst, lhs,
|
||||
rhs);
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_f32x4_le(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
liftoff::EmitSimdNonCommutativeBinOp<&Assembler::vcmpleps,
|
||||
&Assembler::cmpleps>(this, dst, lhs,
|
||||
rhs);
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_f64x2_eq(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
liftoff::EmitSimdCommutativeBinOp<&Assembler::vcmpeqpd, &Assembler::cmpeqpd>(
|
||||
@ -2048,6 +2062,20 @@ void LiftoffAssembler::emit_f64x2_ne(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
&Assembler::cmpneqpd>(this, dst, lhs, rhs);
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_f64x2_lt(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
liftoff::EmitSimdNonCommutativeBinOp<&Assembler::vcmpltpd,
|
||||
&Assembler::cmpltpd>(this, dst, lhs,
|
||||
rhs);
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_f64x2_le(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
liftoff::EmitSimdNonCommutativeBinOp<&Assembler::vcmplepd,
|
||||
&Assembler::cmplepd>(this, dst, lhs,
|
||||
rhs);
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_s128_not(LiftoffRegister dst, LiftoffRegister src) {
|
||||
if (dst.fp() != src.fp()) {
|
||||
Pcmpeqd(dst.fp(), dst.fp());
|
||||
|
Loading…
Reference in New Issue
Block a user