[wasm-simd][liftoff] Implement ge of i8x16, i16x8 and i32x4 on x64 and ia32
Bug: v8:9909 Change-Id: I066621f12ce594280f6f43bc526988e55729eefa Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2162366 Reviewed-by: Zhi An Ng <zhin@chromium.org> Commit-Queue: Zhiguo Zhou <zhiguo.zhou@intel.com> Cr-Commit-Position: refs/heads/master@{#67411}
This commit is contained in:
parent
503562388a
commit
97a4b795be
@ -2432,6 +2432,16 @@ void LiftoffAssembler::emit_i8x16_ne(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
vmvn(liftoff::GetSimd128Register(dst), liftoff::GetSimd128Register(dst));
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_i8x16_ge_s(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
bailout(kSimd, "i8x16ge_s");
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_i8x16_ge_u(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
bailout(kSimd, "i8x16ge_u");
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_i16x8_eq(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
vceq(Neon16, liftoff::GetSimd128Register(dst),
|
||||
@ -2445,6 +2455,16 @@ void LiftoffAssembler::emit_i16x8_ne(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
vmvn(liftoff::GetSimd128Register(dst), liftoff::GetSimd128Register(dst));
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_i16x8_ge_s(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
bailout(kSimd, "i16x8ge_s");
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_i16x8_ge_u(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
bailout(kSimd, "i16x8ge_u");
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_i32x4_eq(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
vceq(Neon32, liftoff::GetSimd128Register(dst),
|
||||
@ -2458,6 +2478,16 @@ void LiftoffAssembler::emit_i32x4_ne(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
vmvn(liftoff::GetSimd128Register(dst), liftoff::GetSimd128Register(dst));
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_i32x4_ge_s(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
bailout(kSimd, "i32x4ge_s");
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_i32x4_ge_u(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
bailout(kSimd, "i32x4ge_u");
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_f32x4_eq(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
vceq(liftoff::GetSimd128Register(dst), liftoff::GetSimd128Register(lhs),
|
||||
|
@ -1540,6 +1540,16 @@ void LiftoffAssembler::emit_i8x16_ne(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
Mvn(dst.fp().V16B(), dst.fp().V16B());
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_i8x16_ge_s(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
bailout(kSimd, "i8x16ge_s");
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_i8x16_ge_u(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
bailout(kSimd, "i8x16ge_u");
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_i16x8_eq(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
Cmeq(dst.fp().V8H(), lhs.fp().V8H(), rhs.fp().V8H());
|
||||
@ -1551,6 +1561,16 @@ void LiftoffAssembler::emit_i16x8_ne(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
Mvn(dst.fp().V8H(), dst.fp().V8H());
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_i16x8_ge_s(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
bailout(kSimd, "i16x8ge_s");
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_i16x8_ge_u(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
bailout(kSimd, "i16x8ge_u");
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_i32x4_eq(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
Cmeq(dst.fp().V4S(), lhs.fp().V4S(), rhs.fp().V4S());
|
||||
@ -1562,6 +1582,16 @@ void LiftoffAssembler::emit_i32x4_ne(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
Mvn(dst.fp().V4S(), dst.fp().V4S());
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_i32x4_ge_s(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
bailout(kSimd, "i32x4ge_s");
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_i32x4_ge_u(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
bailout(kSimd, "i32x4ge_u");
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_f32x4_eq(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
Fcmeq(dst.fp().V4S(), lhs.fp().V4S(), rhs.fp().V4S());
|
||||
|
@ -2033,6 +2033,30 @@ void LiftoffAssembler::emit_i8x16_ne(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
Pxor(dst.fp(), liftoff::kScratchDoubleReg);
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_i8x16_ge_s(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
DoubleRegister ref = rhs.fp();
|
||||
if (dst == rhs) {
|
||||
Movaps(liftoff::kScratchDoubleReg, rhs.fp());
|
||||
ref = liftoff::kScratchDoubleReg;
|
||||
}
|
||||
liftoff::EmitSimdCommutativeBinOp<&Assembler::vpminsb, &Assembler::pminsb>(
|
||||
this, dst, lhs, rhs, SSE4_1);
|
||||
Pcmpeqb(dst.fp(), ref);
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_i8x16_ge_u(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
DoubleRegister ref = rhs.fp();
|
||||
if (dst == rhs) {
|
||||
Movaps(liftoff::kScratchDoubleReg, rhs.fp());
|
||||
ref = liftoff::kScratchDoubleReg;
|
||||
}
|
||||
liftoff::EmitSimdCommutativeBinOp<&Assembler::vpminub, &Assembler::pminub>(
|
||||
this, dst, lhs, rhs);
|
||||
Pcmpeqb(dst.fp(), ref);
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_i16x8_eq(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
liftoff::EmitSimdCommutativeBinOp<&Assembler::vpcmpeqw, &Assembler::pcmpeqw>(
|
||||
@ -2047,6 +2071,30 @@ void LiftoffAssembler::emit_i16x8_ne(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
Pxor(dst.fp(), liftoff::kScratchDoubleReg);
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_i16x8_ge_s(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
DoubleRegister ref = rhs.fp();
|
||||
if (dst == rhs) {
|
||||
Movaps(liftoff::kScratchDoubleReg, rhs.fp());
|
||||
ref = liftoff::kScratchDoubleReg;
|
||||
}
|
||||
liftoff::EmitSimdCommutativeBinOp<&Assembler::vpminsw, &Assembler::pminsw>(
|
||||
this, dst, lhs, rhs);
|
||||
Pcmpeqw(dst.fp(), ref);
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_i16x8_ge_u(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
DoubleRegister ref = rhs.fp();
|
||||
if (dst == rhs) {
|
||||
Movaps(liftoff::kScratchDoubleReg, rhs.fp());
|
||||
ref = liftoff::kScratchDoubleReg;
|
||||
}
|
||||
liftoff::EmitSimdCommutativeBinOp<&Assembler::vpminuw, &Assembler::pminuw>(
|
||||
this, dst, lhs, rhs, SSE4_1);
|
||||
Pcmpeqw(dst.fp(), ref);
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_i32x4_eq(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
liftoff::EmitSimdCommutativeBinOp<&Assembler::vpcmpeqd, &Assembler::pcmpeqd>(
|
||||
@ -2061,6 +2109,30 @@ void LiftoffAssembler::emit_i32x4_ne(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
Pxor(dst.fp(), liftoff::kScratchDoubleReg);
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_i32x4_ge_s(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
DoubleRegister ref = rhs.fp();
|
||||
if (dst == rhs) {
|
||||
Movaps(liftoff::kScratchDoubleReg, rhs.fp());
|
||||
ref = liftoff::kScratchDoubleReg;
|
||||
}
|
||||
liftoff::EmitSimdCommutativeBinOp<&Assembler::vpminsd, &Assembler::pminsd>(
|
||||
this, dst, lhs, rhs, SSE4_1);
|
||||
Pcmpeqd(dst.fp(), ref);
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_i32x4_ge_u(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
DoubleRegister ref = rhs.fp();
|
||||
if (dst == rhs) {
|
||||
Movaps(liftoff::kScratchDoubleReg, rhs.fp());
|
||||
ref = liftoff::kScratchDoubleReg;
|
||||
}
|
||||
liftoff::EmitSimdCommutativeBinOp<&Assembler::vpminud, &Assembler::pminud>(
|
||||
this, dst, lhs, rhs, SSE4_1);
|
||||
Pcmpeqd(dst.fp(), ref);
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_f32x4_eq(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
liftoff::EmitSimdCommutativeBinOp<&Assembler::vcmpeqps, &Assembler::cmpeqps>(
|
||||
|
@ -733,14 +733,26 @@ class LiftoffAssembler : public TurboAssembler {
|
||||
LiftoffRegister rhs);
|
||||
inline void emit_i8x16_ne(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs);
|
||||
inline void emit_i8x16_ge_s(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs);
|
||||
inline void emit_i8x16_ge_u(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs);
|
||||
inline void emit_i16x8_eq(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs);
|
||||
inline void emit_i16x8_ne(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs);
|
||||
inline void emit_i16x8_ge_s(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs);
|
||||
inline void emit_i16x8_ge_u(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs);
|
||||
inline void emit_i32x4_eq(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs);
|
||||
inline void emit_i32x4_ne(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs);
|
||||
inline void emit_i32x4_ge_s(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs);
|
||||
inline void emit_i32x4_ge_u(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs);
|
||||
inline void emit_f32x4_eq(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs);
|
||||
inline void emit_f32x4_ne(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
|
@ -2349,14 +2349,26 @@ class LiftoffCompiler {
|
||||
return EmitBinOp<kS128, kS128>(&LiftoffAssembler::emit_i8x16_eq);
|
||||
case wasm::kExprI8x16Ne:
|
||||
return EmitBinOp<kS128, kS128>(&LiftoffAssembler::emit_i8x16_ne);
|
||||
case wasm::kExprI8x16GeS:
|
||||
return EmitBinOp<kS128, kS128>(&LiftoffAssembler::emit_i8x16_ge_s);
|
||||
case wasm::kExprI8x16GeU:
|
||||
return EmitBinOp<kS128, kS128>(&LiftoffAssembler::emit_i8x16_ge_u);
|
||||
case wasm::kExprI16x8Eq:
|
||||
return EmitBinOp<kS128, kS128>(&LiftoffAssembler::emit_i16x8_eq);
|
||||
case wasm::kExprI16x8Ne:
|
||||
return EmitBinOp<kS128, kS128>(&LiftoffAssembler::emit_i16x8_ne);
|
||||
case wasm::kExprI16x8GeS:
|
||||
return EmitBinOp<kS128, kS128>(&LiftoffAssembler::emit_i16x8_ge_s);
|
||||
case wasm::kExprI16x8GeU:
|
||||
return EmitBinOp<kS128, kS128>(&LiftoffAssembler::emit_i16x8_ge_u);
|
||||
case wasm::kExprI32x4Eq:
|
||||
return EmitBinOp<kS128, kS128>(&LiftoffAssembler::emit_i32x4_eq);
|
||||
case wasm::kExprI32x4Ne:
|
||||
return EmitBinOp<kS128, kS128>(&LiftoffAssembler::emit_i32x4_ne);
|
||||
case wasm::kExprI32x4GeS:
|
||||
return EmitBinOp<kS128, kS128>(&LiftoffAssembler::emit_i32x4_ge_s);
|
||||
case wasm::kExprI32x4GeU:
|
||||
return EmitBinOp<kS128, kS128>(&LiftoffAssembler::emit_i32x4_ge_u);
|
||||
case wasm::kExprF32x4Eq:
|
||||
return EmitBinOp<kS128, kS128>(&LiftoffAssembler::emit_f32x4_eq);
|
||||
case wasm::kExprF32x4Ne:
|
||||
|
@ -1996,6 +1996,30 @@ void LiftoffAssembler::emit_i8x16_ne(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
Pxor(dst.fp(), kScratchDoubleReg);
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_i8x16_ge_s(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
DoubleRegister ref = rhs.fp();
|
||||
if (dst == rhs) {
|
||||
Movaps(kScratchDoubleReg, rhs.fp());
|
||||
ref = kScratchDoubleReg;
|
||||
}
|
||||
liftoff::EmitSimdCommutativeBinOp<&Assembler::vpminsb, &Assembler::pminsb>(
|
||||
this, dst, lhs, rhs, SSE4_1);
|
||||
Pcmpeqb(dst.fp(), ref);
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_i8x16_ge_u(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
DoubleRegister ref = rhs.fp();
|
||||
if (dst == rhs) {
|
||||
Movaps(kScratchDoubleReg, rhs.fp());
|
||||
ref = kScratchDoubleReg;
|
||||
}
|
||||
liftoff::EmitSimdCommutativeBinOp<&Assembler::vpminub, &Assembler::pminub>(
|
||||
this, dst, lhs, rhs);
|
||||
Pcmpeqb(dst.fp(), ref);
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_i16x8_eq(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
liftoff::EmitSimdCommutativeBinOp<&Assembler::vpcmpeqw, &Assembler::pcmpeqw>(
|
||||
@ -2010,6 +2034,30 @@ void LiftoffAssembler::emit_i16x8_ne(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
Pxor(dst.fp(), kScratchDoubleReg);
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_i16x8_ge_s(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
DoubleRegister ref = rhs.fp();
|
||||
if (dst == rhs) {
|
||||
Movaps(kScratchDoubleReg, rhs.fp());
|
||||
ref = kScratchDoubleReg;
|
||||
}
|
||||
liftoff::EmitSimdCommutativeBinOp<&Assembler::vpminsw, &Assembler::pminsw>(
|
||||
this, dst, lhs, rhs);
|
||||
Pcmpeqw(dst.fp(), ref);
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_i16x8_ge_u(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
DoubleRegister ref = rhs.fp();
|
||||
if (dst == rhs) {
|
||||
Movaps(kScratchDoubleReg, rhs.fp());
|
||||
ref = kScratchDoubleReg;
|
||||
}
|
||||
liftoff::EmitSimdCommutativeBinOp<&Assembler::vpminuw, &Assembler::pminuw>(
|
||||
this, dst, lhs, rhs, SSE4_1);
|
||||
Pcmpeqw(dst.fp(), ref);
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_i32x4_eq(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
liftoff::EmitSimdCommutativeBinOp<&Assembler::vpcmpeqd, &Assembler::pcmpeqd>(
|
||||
@ -2024,6 +2072,30 @@ void LiftoffAssembler::emit_i32x4_ne(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
Pxor(dst.fp(), kScratchDoubleReg);
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_i32x4_ge_s(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
DoubleRegister ref = rhs.fp();
|
||||
if (dst == rhs) {
|
||||
Movaps(kScratchDoubleReg, rhs.fp());
|
||||
ref = kScratchDoubleReg;
|
||||
}
|
||||
liftoff::EmitSimdCommutativeBinOp<&Assembler::vpminsd, &Assembler::pminsd>(
|
||||
this, dst, lhs, rhs, SSE4_1);
|
||||
Pcmpeqd(dst.fp(), ref);
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_i32x4_ge_u(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
DoubleRegister ref = rhs.fp();
|
||||
if (dst == rhs) {
|
||||
Movaps(kScratchDoubleReg, rhs.fp());
|
||||
ref = kScratchDoubleReg;
|
||||
}
|
||||
liftoff::EmitSimdCommutativeBinOp<&Assembler::vpminud, &Assembler::pminud>(
|
||||
this, dst, lhs, rhs, SSE4_1);
|
||||
Pcmpeqd(dst.fp(), ref);
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_f32x4_eq(LiftoffRegister dst, LiftoffRegister lhs,
|
||||
LiftoffRegister rhs) {
|
||||
liftoff::EmitSimdCommutativeBinOp<&Assembler::vcmpeqps, &Assembler::cmpeqps>(
|
||||
|
Loading…
Reference in New Issue
Block a user