Commit 9fb6983e authored by Ng Zhi An's avatar Ng Zhi An Committed by Commit Bot

[wasm-simd][x64][ia32] Factor v128.not into shared code

Bug: v8:11589
Change-Id: If92ef6d8ce49831818c797909a7655db8101d154
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2842263Reviewed-by: 's avatarBill Budge <bbudge@chromium.org>
Commit-Queue: Zhi An Ng <zhin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#74126}
parent 5d9b6b30
...@@ -464,6 +464,17 @@ void SharedTurboAssembler::I64x2UConvertI32x4High(XMMRegister dst, ...@@ -464,6 +464,17 @@ void SharedTurboAssembler::I64x2UConvertI32x4High(XMMRegister dst,
} }
} }
void SharedTurboAssembler::S128Not(XMMRegister dst, XMMRegister src,
XMMRegister scratch) {
if (dst == src) {
Pcmpeqd(scratch, scratch);
Pxor(dst, scratch);
} else {
Pcmpeqd(dst, dst);
Pxor(dst, src);
}
}
void SharedTurboAssembler::S128Select(XMMRegister dst, XMMRegister mask, void SharedTurboAssembler::S128Select(XMMRegister dst, XMMRegister mask,
XMMRegister src1, XMMRegister src2, XMMRegister src1, XMMRegister src2,
XMMRegister scratch) { XMMRegister scratch) {
......
...@@ -202,6 +202,7 @@ class V8_EXPORT_PRIVATE SharedTurboAssembler : public TurboAssemblerBase { ...@@ -202,6 +202,7 @@ class V8_EXPORT_PRIVATE SharedTurboAssembler : public TurboAssemblerBase {
AVX_OP(Pavgb, pavgb) AVX_OP(Pavgb, pavgb)
AVX_OP(Pavgw, pavgw) AVX_OP(Pavgw, pavgw)
AVX_OP(Pcmpgtb, pcmpgtb) AVX_OP(Pcmpgtb, pcmpgtb)
AVX_OP(Pcmpeqd, pcmpeqd)
AVX_OP(Pmaxub, pmaxub) AVX_OP(Pmaxub, pmaxub)
AVX_OP(Pminub, pminub) AVX_OP(Pminub, pminub)
AVX_OP(Pmovmskb, pmovmskb) AVX_OP(Pmovmskb, pmovmskb)
...@@ -305,6 +306,7 @@ class V8_EXPORT_PRIVATE SharedTurboAssembler : public TurboAssemblerBase { ...@@ -305,6 +306,7 @@ class V8_EXPORT_PRIVATE SharedTurboAssembler : public TurboAssemblerBase {
void I64x2SConvertI32x4High(XMMRegister dst, XMMRegister src); void I64x2SConvertI32x4High(XMMRegister dst, XMMRegister src);
void I64x2UConvertI32x4High(XMMRegister dst, XMMRegister src, void I64x2UConvertI32x4High(XMMRegister dst, XMMRegister src,
XMMRegister scratch); XMMRegister scratch);
void S128Not(XMMRegister dst, XMMRegister src, XMMRegister scratch);
// Requires dst == mask when AVX is not supported. // Requires dst == mask when AVX is not supported.
void S128Select(XMMRegister dst, XMMRegister mask, XMMRegister src1, void S128Select(XMMRegister dst, XMMRegister mask, XMMRegister src1,
XMMRegister src2, XMMRegister scratch); XMMRegister src2, XMMRegister scratch);
......
...@@ -3510,15 +3510,8 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( ...@@ -3510,15 +3510,8 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
break; break;
} }
case kIA32S128Not: { case kIA32S128Not: {
XMMRegister dst = i.OutputSimd128Register(); __ S128Not(i.OutputSimd128Register(), i.InputSimd128Register(0),
XMMRegister src = i.InputSimd128Register(0); kScratchDoubleReg);
if (dst == src) {
__ Pcmpeqd(kScratchDoubleReg, kScratchDoubleReg);
__ Pxor(dst, kScratchDoubleReg);
} else {
__ Pcmpeqd(dst, dst);
__ Pxor(dst, src);
}
break; break;
} }
case kSSES128And: { case kSSES128And: {
......
...@@ -3625,15 +3625,8 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( ...@@ -3625,15 +3625,8 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
break; break;
} }
case kX64S128Not: { case kX64S128Not: {
XMMRegister dst = i.OutputSimd128Register(); __ S128Not(i.OutputSimd128Register(), i.InputSimd128Register(0),
XMMRegister src = i.InputSimd128Register(0); kScratchDoubleReg);
if (dst == src) {
__ Pcmpeqd(kScratchDoubleReg, kScratchDoubleReg);
__ Pxor(dst, kScratchDoubleReg);
} else {
__ Pcmpeqd(dst, dst);
__ Pxor(dst, src);
}
break; break;
} }
case kX64S128Select: { case kX64S128Select: {
......
...@@ -3260,13 +3260,7 @@ void LiftoffAssembler::emit_s128_const(LiftoffRegister dst, ...@@ -3260,13 +3260,7 @@ void LiftoffAssembler::emit_s128_const(LiftoffRegister dst,
} }
void LiftoffAssembler::emit_s128_not(LiftoffRegister dst, LiftoffRegister src) { void LiftoffAssembler::emit_s128_not(LiftoffRegister dst, LiftoffRegister src) {
if (dst.fp() != src.fp()) { S128Not(dst.fp(), src.fp(), liftoff::kScratchDoubleReg);
Pcmpeqd(dst.fp(), dst.fp());
Pxor(dst.fp(), src.fp());
} else {
Pcmpeqd(liftoff::kScratchDoubleReg, liftoff::kScratchDoubleReg);
Pxor(dst.fp(), liftoff::kScratchDoubleReg);
}
} }
void LiftoffAssembler::emit_s128_and(LiftoffRegister dst, LiftoffRegister lhs, void LiftoffAssembler::emit_s128_and(LiftoffRegister dst, LiftoffRegister lhs,
......
...@@ -2852,13 +2852,7 @@ void LiftoffAssembler::emit_s128_const(LiftoffRegister dst, ...@@ -2852,13 +2852,7 @@ void LiftoffAssembler::emit_s128_const(LiftoffRegister dst,
} }
void LiftoffAssembler::emit_s128_not(LiftoffRegister dst, LiftoffRegister src) { void LiftoffAssembler::emit_s128_not(LiftoffRegister dst, LiftoffRegister src) {
if (dst.fp() != src.fp()) { S128Not(dst.fp(), src.fp(), kScratchDoubleReg);
Pcmpeqd(dst.fp(), dst.fp());
Pxor(dst.fp(), src.fp());
} else {
Pcmpeqd(kScratchDoubleReg, kScratchDoubleReg);
Pxor(dst.fp(), kScratchDoubleReg);
}
} }
void LiftoffAssembler::emit_s128_and(LiftoffRegister dst, LiftoffRegister lhs, void LiftoffAssembler::emit_s128_and(LiftoffRegister dst, LiftoffRegister lhs,
......
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