Commit b3799538 authored by Ng Zhi An's avatar Ng Zhi An Committed by Commit Bot

[wasm-simd][liftoff][ia32][x64] Implement all_true

Implement all v8x16 v16x8 v32x4 all_true on ia32 and x64. arm and arm64
bailout for now, will be implemented later.

Bug: v8:9909
Change-Id: Icea38c00e33b387191e000b64100251525d8f8da
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2220446
Commit-Queue: Zhi An Ng <zhin@chromium.org>
Reviewed-by: 's avatarClemens Backes <clemensb@chromium.org>
Cr-Commit-Position: refs/heads/master@{#68077}
parent 91322bbe
...@@ -2562,6 +2562,11 @@ void LiftoffAssembler::emit_v32x4_anytrue(LiftoffRegister dst, ...@@ -2562,6 +2562,11 @@ void LiftoffAssembler::emit_v32x4_anytrue(LiftoffRegister dst,
liftoff::EmitAnyTrue(this, dst, src); liftoff::EmitAnyTrue(this, dst, src);
} }
void LiftoffAssembler::emit_v32x4_alltrue(LiftoffRegister dst,
LiftoffRegister src) {
bailout(kSimd, "v32x4_alltrue");
}
void LiftoffAssembler::emit_i32x4_shl(LiftoffRegister dst, LiftoffRegister lhs, void LiftoffAssembler::emit_i32x4_shl(LiftoffRegister dst, LiftoffRegister lhs,
LiftoffRegister rhs) { LiftoffRegister rhs) {
liftoff::EmitSimdShift<liftoff::kLeft, NeonS32, Neon32>(this, dst, lhs, rhs); liftoff::EmitSimdShift<liftoff::kLeft, NeonS32, Neon32>(this, dst, lhs, rhs);
...@@ -2659,6 +2664,11 @@ void LiftoffAssembler::emit_v16x8_anytrue(LiftoffRegister dst, ...@@ -2659,6 +2664,11 @@ void LiftoffAssembler::emit_v16x8_anytrue(LiftoffRegister dst,
liftoff::EmitAnyTrue(this, dst, src); liftoff::EmitAnyTrue(this, dst, src);
} }
void LiftoffAssembler::emit_v16x8_alltrue(LiftoffRegister dst,
LiftoffRegister src) {
bailout(kSimd, "v16x8_alltrue");
}
void LiftoffAssembler::emit_i16x8_shl(LiftoffRegister dst, LiftoffRegister lhs, void LiftoffAssembler::emit_i16x8_shl(LiftoffRegister dst, LiftoffRegister lhs,
LiftoffRegister rhs) { LiftoffRegister rhs) {
liftoff::EmitSimdShift<liftoff::kLeft, NeonS16, Neon16>(this, dst, lhs, rhs); liftoff::EmitSimdShift<liftoff::kLeft, NeonS16, Neon16>(this, dst, lhs, rhs);
...@@ -2828,6 +2838,11 @@ void LiftoffAssembler::emit_v8x16_anytrue(LiftoffRegister dst, ...@@ -2828,6 +2838,11 @@ void LiftoffAssembler::emit_v8x16_anytrue(LiftoffRegister dst,
liftoff::EmitAnyTrue(this, dst, src); liftoff::EmitAnyTrue(this, dst, src);
} }
void LiftoffAssembler::emit_v8x16_alltrue(LiftoffRegister dst,
LiftoffRegister src) {
bailout(kSimd, "v8x16_alltrue");
}
void LiftoffAssembler::emit_i8x16_shl(LiftoffRegister dst, LiftoffRegister lhs, void LiftoffAssembler::emit_i8x16_shl(LiftoffRegister dst, LiftoffRegister lhs,
LiftoffRegister rhs) { LiftoffRegister rhs) {
liftoff::EmitSimdShift<liftoff::kLeft, NeonS8, Neon8>(this, dst, lhs, rhs); liftoff::EmitSimdShift<liftoff::kLeft, NeonS8, Neon8>(this, dst, lhs, rhs);
......
...@@ -1498,6 +1498,11 @@ void LiftoffAssembler::emit_v32x4_anytrue(LiftoffRegister dst, ...@@ -1498,6 +1498,11 @@ void LiftoffAssembler::emit_v32x4_anytrue(LiftoffRegister dst,
liftoff::EmitAnyTrue(this, dst, src); liftoff::EmitAnyTrue(this, dst, src);
} }
void LiftoffAssembler::emit_v32x4_alltrue(LiftoffRegister dst,
LiftoffRegister src) {
bailout(kSimd, "v32x4_alltrue");
}
void LiftoffAssembler::emit_i32x4_shl(LiftoffRegister dst, LiftoffRegister lhs, void LiftoffAssembler::emit_i32x4_shl(LiftoffRegister dst, LiftoffRegister lhs,
LiftoffRegister rhs) { LiftoffRegister rhs) {
liftoff::EmitSimdShift<liftoff::ShiftDirection::kLeft>( liftoff::EmitSimdShift<liftoff::ShiftDirection::kLeft>(
...@@ -1614,6 +1619,11 @@ void LiftoffAssembler::emit_v16x8_anytrue(LiftoffRegister dst, ...@@ -1614,6 +1619,11 @@ void LiftoffAssembler::emit_v16x8_anytrue(LiftoffRegister dst,
liftoff::EmitAnyTrue(this, dst, src); liftoff::EmitAnyTrue(this, dst, src);
} }
void LiftoffAssembler::emit_v16x8_alltrue(LiftoffRegister dst,
LiftoffRegister src) {
bailout(kSimd, "v16x8_alltrue");
}
void LiftoffAssembler::emit_i16x8_shl(LiftoffRegister dst, LiftoffRegister lhs, void LiftoffAssembler::emit_i16x8_shl(LiftoffRegister dst, LiftoffRegister lhs,
LiftoffRegister rhs) { LiftoffRegister rhs) {
liftoff::EmitSimdShift<liftoff::ShiftDirection::kLeft>( liftoff::EmitSimdShift<liftoff::ShiftDirection::kLeft>(
...@@ -1754,6 +1764,11 @@ void LiftoffAssembler::emit_v8x16_anytrue(LiftoffRegister dst, ...@@ -1754,6 +1764,11 @@ void LiftoffAssembler::emit_v8x16_anytrue(LiftoffRegister dst,
liftoff::EmitAnyTrue(this, dst, src); liftoff::EmitAnyTrue(this, dst, src);
} }
void LiftoffAssembler::emit_v8x16_alltrue(LiftoffRegister dst,
LiftoffRegister src) {
bailout(kSimd, "v8x16_alltrue");
}
void LiftoffAssembler::emit_i8x16_shl(LiftoffRegister dst, LiftoffRegister lhs, void LiftoffAssembler::emit_i8x16_shl(LiftoffRegister dst, LiftoffRegister lhs,
LiftoffRegister rhs) { LiftoffRegister rhs) {
liftoff::EmitSimdShift<liftoff::ShiftDirection::kLeft>( liftoff::EmitSimdShift<liftoff::ShiftDirection::kLeft>(
......
...@@ -2136,6 +2136,20 @@ inline void EmitAnyTrue(LiftoffAssembler* assm, LiftoffRegister dst, ...@@ -2136,6 +2136,20 @@ inline void EmitAnyTrue(LiftoffAssembler* assm, LiftoffRegister dst,
assm->cmov(zero, dst.gp(), tmp); assm->cmov(zero, dst.gp(), tmp);
} }
template <void (TurboAssembler::*pcmp)(XMMRegister, XMMRegister)>
inline void EmitAllTrue(LiftoffAssembler* assm, LiftoffRegister dst,
LiftoffRegister src) {
Register tmp =
assm->GetUnusedRegister(kGpReg, LiftoffRegList::ForRegs(dst)).gp();
XMMRegister tmp_simd = liftoff::kScratchDoubleReg;
assm->mov(tmp, Immediate(1));
assm->xor_(dst.gp(), dst.gp());
assm->Pxor(tmp_simd, tmp_simd);
(assm->*pcmp)(tmp_simd, src.fp());
assm->Ptest(tmp_simd, tmp_simd);
assm->cmov(zero, dst.gp(), tmp);
}
} // namespace liftoff } // namespace liftoff
void LiftoffAssembler::LoadTransform(LiftoffRegister dst, Register src_addr, void LiftoffAssembler::LoadTransform(LiftoffRegister dst, Register src_addr,
...@@ -2533,6 +2547,11 @@ void LiftoffAssembler::emit_v8x16_anytrue(LiftoffRegister dst, ...@@ -2533,6 +2547,11 @@ void LiftoffAssembler::emit_v8x16_anytrue(LiftoffRegister dst,
liftoff::EmitAnyTrue(this, dst, src); liftoff::EmitAnyTrue(this, dst, src);
} }
void LiftoffAssembler::emit_v8x16_alltrue(LiftoffRegister dst,
LiftoffRegister src) {
liftoff::EmitAllTrue<&TurboAssembler::Pcmpeqb>(this, dst, src);
}
void LiftoffAssembler::emit_i8x16_shl(LiftoffRegister dst, LiftoffRegister lhs, void LiftoffAssembler::emit_i8x16_shl(LiftoffRegister dst, LiftoffRegister lhs,
LiftoffRegister rhs) { LiftoffRegister rhs) {
static constexpr RegClass tmp_rc = reg_class_for(ValueType::kI32); static constexpr RegClass tmp_rc = reg_class_for(ValueType::kI32);
...@@ -2766,6 +2785,11 @@ void LiftoffAssembler::emit_v16x8_anytrue(LiftoffRegister dst, ...@@ -2766,6 +2785,11 @@ void LiftoffAssembler::emit_v16x8_anytrue(LiftoffRegister dst,
liftoff::EmitAnyTrue(this, dst, src); liftoff::EmitAnyTrue(this, dst, src);
} }
void LiftoffAssembler::emit_v16x8_alltrue(LiftoffRegister dst,
LiftoffRegister src) {
liftoff::EmitAllTrue<&TurboAssembler::Pcmpeqw>(this, dst, src);
}
void LiftoffAssembler::emit_i16x8_shl(LiftoffRegister dst, LiftoffRegister lhs, void LiftoffAssembler::emit_i16x8_shl(LiftoffRegister dst, LiftoffRegister lhs,
LiftoffRegister rhs) { LiftoffRegister rhs) {
liftoff::EmitSimdShiftOp<&Assembler::vpsllw, &Assembler::psllw, 4>(this, dst, liftoff::EmitSimdShiftOp<&Assembler::vpsllw, &Assembler::psllw, 4>(this, dst,
...@@ -2895,6 +2919,11 @@ void LiftoffAssembler::emit_v32x4_anytrue(LiftoffRegister dst, ...@@ -2895,6 +2919,11 @@ void LiftoffAssembler::emit_v32x4_anytrue(LiftoffRegister dst,
liftoff::EmitAnyTrue(this, dst, src); liftoff::EmitAnyTrue(this, dst, src);
} }
void LiftoffAssembler::emit_v32x4_alltrue(LiftoffRegister dst,
LiftoffRegister src) {
liftoff::EmitAllTrue<&TurboAssembler::Pcmpeqd>(this, dst, src);
}
void LiftoffAssembler::emit_i32x4_shl(LiftoffRegister dst, LiftoffRegister lhs, void LiftoffAssembler::emit_i32x4_shl(LiftoffRegister dst, LiftoffRegister lhs,
LiftoffRegister rhs) { LiftoffRegister rhs) {
liftoff::EmitSimdShiftOp<&Assembler::vpslld, &Assembler::pslld, 5>(this, dst, liftoff::EmitSimdShiftOp<&Assembler::vpslld, &Assembler::pslld, 5>(this, dst,
......
...@@ -817,6 +817,7 @@ class LiftoffAssembler : public TurboAssembler { ...@@ -817,6 +817,7 @@ class LiftoffAssembler : public TurboAssembler {
LiftoffRegister src2, LiftoffRegister mask); LiftoffRegister src2, LiftoffRegister mask);
inline void emit_i8x16_neg(LiftoffRegister dst, LiftoffRegister src); inline void emit_i8x16_neg(LiftoffRegister dst, LiftoffRegister src);
inline void emit_v8x16_anytrue(LiftoffRegister dst, LiftoffRegister src); inline void emit_v8x16_anytrue(LiftoffRegister dst, LiftoffRegister src);
inline void emit_v8x16_alltrue(LiftoffRegister dst, LiftoffRegister src);
inline void emit_i8x16_shl(LiftoffRegister dst, LiftoffRegister lhs, inline void emit_i8x16_shl(LiftoffRegister dst, LiftoffRegister lhs,
LiftoffRegister rhs); LiftoffRegister rhs);
inline void emit_i8x16_shli(LiftoffRegister dst, LiftoffRegister lhs, inline void emit_i8x16_shli(LiftoffRegister dst, LiftoffRegister lhs,
...@@ -857,6 +858,7 @@ class LiftoffAssembler : public TurboAssembler { ...@@ -857,6 +858,7 @@ class LiftoffAssembler : public TurboAssembler {
LiftoffRegister rhs); LiftoffRegister rhs);
inline void emit_i16x8_neg(LiftoffRegister dst, LiftoffRegister src); inline void emit_i16x8_neg(LiftoffRegister dst, LiftoffRegister src);
inline void emit_v16x8_anytrue(LiftoffRegister dst, LiftoffRegister src); inline void emit_v16x8_anytrue(LiftoffRegister dst, LiftoffRegister src);
inline void emit_v16x8_alltrue(LiftoffRegister dst, LiftoffRegister src);
inline void emit_i16x8_shl(LiftoffRegister dst, LiftoffRegister lhs, inline void emit_i16x8_shl(LiftoffRegister dst, LiftoffRegister lhs,
LiftoffRegister rhs); LiftoffRegister rhs);
inline void emit_i16x8_shli(LiftoffRegister dst, LiftoffRegister lhs, inline void emit_i16x8_shli(LiftoffRegister dst, LiftoffRegister lhs,
...@@ -897,6 +899,7 @@ class LiftoffAssembler : public TurboAssembler { ...@@ -897,6 +899,7 @@ class LiftoffAssembler : public TurboAssembler {
LiftoffRegister rhs); LiftoffRegister rhs);
inline void emit_i32x4_neg(LiftoffRegister dst, LiftoffRegister src); inline void emit_i32x4_neg(LiftoffRegister dst, LiftoffRegister src);
inline void emit_v32x4_anytrue(LiftoffRegister dst, LiftoffRegister src); inline void emit_v32x4_anytrue(LiftoffRegister dst, LiftoffRegister src);
inline void emit_v32x4_alltrue(LiftoffRegister dst, LiftoffRegister src);
inline void emit_i32x4_shl(LiftoffRegister dst, LiftoffRegister lhs, inline void emit_i32x4_shl(LiftoffRegister dst, LiftoffRegister lhs,
LiftoffRegister rhs); LiftoffRegister rhs);
inline void emit_i32x4_shli(LiftoffRegister dst, LiftoffRegister lhs, inline void emit_i32x4_shli(LiftoffRegister dst, LiftoffRegister lhs,
......
...@@ -2577,6 +2577,8 @@ class LiftoffCompiler { ...@@ -2577,6 +2577,8 @@ class LiftoffCompiler {
return EmitUnOp<kS128, kS128>(&LiftoffAssembler::emit_i8x16_neg); return EmitUnOp<kS128, kS128>(&LiftoffAssembler::emit_i8x16_neg);
case wasm::kExprV8x16AnyTrue: case wasm::kExprV8x16AnyTrue:
return EmitUnOp<kS128, kI32>(&LiftoffAssembler::emit_v8x16_anytrue); return EmitUnOp<kS128, kI32>(&LiftoffAssembler::emit_v8x16_anytrue);
case wasm::kExprV8x16AllTrue:
return EmitUnOp<kS128, kI32>(&LiftoffAssembler::emit_v8x16_alltrue);
case wasm::kExprI8x16Shl: case wasm::kExprI8x16Shl:
return EmitSimdShiftOp(&LiftoffAssembler::emit_i8x16_shl, return EmitSimdShiftOp(&LiftoffAssembler::emit_i8x16_shl,
&LiftoffAssembler::emit_i8x16_shli); &LiftoffAssembler::emit_i8x16_shli);
...@@ -2616,6 +2618,8 @@ class LiftoffCompiler { ...@@ -2616,6 +2618,8 @@ class LiftoffCompiler {
return EmitUnOp<kS128, kS128>(&LiftoffAssembler::emit_i16x8_neg); return EmitUnOp<kS128, kS128>(&LiftoffAssembler::emit_i16x8_neg);
case wasm::kExprV16x8AnyTrue: case wasm::kExprV16x8AnyTrue:
return EmitUnOp<kS128, kI32>(&LiftoffAssembler::emit_v16x8_anytrue); return EmitUnOp<kS128, kI32>(&LiftoffAssembler::emit_v16x8_anytrue);
case wasm::kExprV16x8AllTrue:
return EmitUnOp<kS128, kI32>(&LiftoffAssembler::emit_v16x8_alltrue);
case wasm::kExprI16x8Shl: case wasm::kExprI16x8Shl:
return EmitSimdShiftOp(&LiftoffAssembler::emit_i16x8_shl, return EmitSimdShiftOp(&LiftoffAssembler::emit_i16x8_shl,
&LiftoffAssembler::emit_i16x8_shli); &LiftoffAssembler::emit_i16x8_shli);
...@@ -2655,6 +2659,8 @@ class LiftoffCompiler { ...@@ -2655,6 +2659,8 @@ class LiftoffCompiler {
return EmitUnOp<kS128, kS128>(&LiftoffAssembler::emit_i32x4_neg); return EmitUnOp<kS128, kS128>(&LiftoffAssembler::emit_i32x4_neg);
case wasm::kExprV32x4AnyTrue: case wasm::kExprV32x4AnyTrue:
return EmitUnOp<kS128, kI32>(&LiftoffAssembler::emit_v32x4_anytrue); return EmitUnOp<kS128, kI32>(&LiftoffAssembler::emit_v32x4_anytrue);
case wasm::kExprV32x4AllTrue:
return EmitUnOp<kS128, kI32>(&LiftoffAssembler::emit_v32x4_alltrue);
case wasm::kExprI32x4Shl: case wasm::kExprI32x4Shl:
return EmitSimdShiftOp(&LiftoffAssembler::emit_i32x4_shl, return EmitSimdShiftOp(&LiftoffAssembler::emit_i32x4_shl,
&LiftoffAssembler::emit_i32x4_shli); &LiftoffAssembler::emit_i32x4_shli);
......
...@@ -2178,6 +2178,17 @@ inline void EmitAnyTrue(LiftoffAssembler* assm, LiftoffRegister dst, ...@@ -2178,6 +2178,17 @@ inline void EmitAnyTrue(LiftoffAssembler* assm, LiftoffRegister dst,
assm->setcc(not_equal, dst.gp()); assm->setcc(not_equal, dst.gp());
} }
template <void (TurboAssembler::*pcmp)(XMMRegister, XMMRegister)>
inline void EmitAllTrue(LiftoffAssembler* assm, LiftoffRegister dst,
LiftoffRegister src) {
XMMRegister tmp = kScratchDoubleReg;
assm->xorq(dst.gp(), dst.gp());
assm->Pxor(tmp, tmp);
(assm->*pcmp)(tmp, src.fp());
assm->Ptest(tmp, tmp);
assm->setcc(equal, dst.gp());
}
} // namespace liftoff } // namespace liftoff
void LiftoffAssembler::LoadTransform(LiftoffRegister dst, Register src_addr, void LiftoffAssembler::LoadTransform(LiftoffRegister dst, Register src_addr,
...@@ -2575,6 +2586,11 @@ void LiftoffAssembler::emit_v8x16_anytrue(LiftoffRegister dst, ...@@ -2575,6 +2586,11 @@ void LiftoffAssembler::emit_v8x16_anytrue(LiftoffRegister dst,
liftoff::EmitAnyTrue(this, dst, src); liftoff::EmitAnyTrue(this, dst, src);
} }
void LiftoffAssembler::emit_v8x16_alltrue(LiftoffRegister dst,
LiftoffRegister src) {
liftoff::EmitAllTrue<&TurboAssembler::Pcmpeqb>(this, dst, src);
}
void LiftoffAssembler::emit_i8x16_shl(LiftoffRegister dst, LiftoffRegister lhs, void LiftoffAssembler::emit_i8x16_shl(LiftoffRegister dst, LiftoffRegister lhs,
LiftoffRegister rhs) { LiftoffRegister rhs) {
static constexpr RegClass tmp_simd_rc = reg_class_for(ValueType::kS128); static constexpr RegClass tmp_simd_rc = reg_class_for(ValueType::kS128);
...@@ -2809,6 +2825,11 @@ void LiftoffAssembler::emit_v16x8_anytrue(LiftoffRegister dst, ...@@ -2809,6 +2825,11 @@ void LiftoffAssembler::emit_v16x8_anytrue(LiftoffRegister dst,
liftoff::EmitAnyTrue(this, dst, src); liftoff::EmitAnyTrue(this, dst, src);
} }
void LiftoffAssembler::emit_v16x8_alltrue(LiftoffRegister dst,
LiftoffRegister src) {
liftoff::EmitAllTrue<&TurboAssembler::Pcmpeqw>(this, dst, src);
}
void LiftoffAssembler::emit_i16x8_shl(LiftoffRegister dst, LiftoffRegister lhs, void LiftoffAssembler::emit_i16x8_shl(LiftoffRegister dst, LiftoffRegister lhs,
LiftoffRegister rhs) { LiftoffRegister rhs) {
liftoff::EmitSimdShiftOp<&Assembler::vpsllw, &Assembler::psllw, 4>(this, dst, liftoff::EmitSimdShiftOp<&Assembler::vpsllw, &Assembler::psllw, 4>(this, dst,
...@@ -2938,6 +2959,11 @@ void LiftoffAssembler::emit_v32x4_anytrue(LiftoffRegister dst, ...@@ -2938,6 +2959,11 @@ void LiftoffAssembler::emit_v32x4_anytrue(LiftoffRegister dst,
liftoff::EmitAnyTrue(this, dst, src); liftoff::EmitAnyTrue(this, dst, src);
} }
void LiftoffAssembler::emit_v32x4_alltrue(LiftoffRegister dst,
LiftoffRegister src) {
liftoff::EmitAllTrue<&TurboAssembler::Pcmpeqd>(this, dst, src);
}
void LiftoffAssembler::emit_i32x4_shl(LiftoffRegister dst, LiftoffRegister lhs, void LiftoffAssembler::emit_i32x4_shl(LiftoffRegister dst, LiftoffRegister lhs,
LiftoffRegister rhs) { LiftoffRegister rhs) {
liftoff::EmitSimdShiftOp<&Assembler::vpslld, &Assembler::pslld, 5>(this, dst, liftoff::EmitSimdShiftOp<&Assembler::vpslld, &Assembler::pslld, 5>(this, dst,
......
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