Skip to content

Commit d04b5e4

Browse files
ngzhianCommit Bot
authored andcommitted
[wasm-simd][liftoff][ia32][x64] Implement bitmask
Implements i8x16 i16x8 i32x4 bitmask. This was merged into the proposal in WebAssembly/simd#201. Bug: v8:9909,v8:10308 Change-Id: I882f0c2697213cdf593e745112e0897cee252009 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2222607 Commit-Queue: Zhi An Ng <[email protected]> Reviewed-by: Clemens Backes <[email protected]> Cr-Commit-Position: refs/heads/master@{#68090}
1 parent c4be24e commit d04b5e4

File tree

6 files changed

+75
-0
lines changed

6 files changed

+75
-0
lines changed

src/wasm/baseline/arm/liftoff-assembler-arm.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2573,6 +2573,11 @@ void LiftoffAssembler::emit_v32x4_alltrue(LiftoffRegister dst,
25732573
mov(dst.gp(), Operand(1), LeaveCC, ne);
25742574
}
25752575

2576+
void LiftoffAssembler::emit_i32x4_bitmask(LiftoffRegister dst,
2577+
LiftoffRegister src) {
2578+
bailout(kSimd, "i32x4_bitmask");
2579+
}
2580+
25762581
void LiftoffAssembler::emit_i32x4_shl(LiftoffRegister dst, LiftoffRegister lhs,
25772582
LiftoffRegister rhs) {
25782583
liftoff::EmitSimdShift<liftoff::kLeft, NeonS32, Neon32>(this, dst, lhs, rhs);
@@ -2682,6 +2687,11 @@ void LiftoffAssembler::emit_v16x8_alltrue(LiftoffRegister dst,
26822687
mov(dst.gp(), Operand(1), LeaveCC, ne);
26832688
}
26842689

2690+
void LiftoffAssembler::emit_i16x8_bitmask(LiftoffRegister dst,
2691+
LiftoffRegister src) {
2692+
bailout(kSimd, "i16x8_bitmask");
2693+
}
2694+
26852695
void LiftoffAssembler::emit_i16x8_shl(LiftoffRegister dst, LiftoffRegister lhs,
26862696
LiftoffRegister rhs) {
26872697
liftoff::EmitSimdShift<liftoff::kLeft, NeonS16, Neon16>(this, dst, lhs, rhs);
@@ -2864,6 +2874,11 @@ void LiftoffAssembler::emit_v8x16_alltrue(LiftoffRegister dst,
28642874
mov(dst.gp(), Operand(1), LeaveCC, ne);
28652875
}
28662876

2877+
void LiftoffAssembler::emit_i8x16_bitmask(LiftoffRegister dst,
2878+
LiftoffRegister src) {
2879+
bailout(kSimd, "i8x16_bitmask");
2880+
}
2881+
28672882
void LiftoffAssembler::emit_i8x16_shl(LiftoffRegister dst, LiftoffRegister lhs,
28682883
LiftoffRegister rhs) {
28692884
liftoff::EmitSimdShift<liftoff::kLeft, NeonS8, Neon8>(this, dst, lhs, rhs);

src/wasm/baseline/arm64/liftoff-assembler-arm64.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1513,6 +1513,11 @@ void LiftoffAssembler::emit_v32x4_alltrue(LiftoffRegister dst,
15131513
liftoff::EmitAllTrue(this, dst, src, kFormat4S);
15141514
}
15151515

1516+
void LiftoffAssembler::emit_i32x4_bitmask(LiftoffRegister dst,
1517+
LiftoffRegister src) {
1518+
bailout(kSimd, "i32x4_bitmask");
1519+
}
1520+
15161521
void LiftoffAssembler::emit_i32x4_shl(LiftoffRegister dst, LiftoffRegister lhs,
15171522
LiftoffRegister rhs) {
15181523
liftoff::EmitSimdShift<liftoff::ShiftDirection::kLeft>(
@@ -1634,6 +1639,11 @@ void LiftoffAssembler::emit_v16x8_alltrue(LiftoffRegister dst,
16341639
liftoff::EmitAllTrue(this, dst, src, kFormat8H);
16351640
}
16361641

1642+
void LiftoffAssembler::emit_i16x8_bitmask(LiftoffRegister dst,
1643+
LiftoffRegister src) {
1644+
bailout(kSimd, "i16x8_bitmask");
1645+
}
1646+
16371647
void LiftoffAssembler::emit_i16x8_shl(LiftoffRegister dst, LiftoffRegister lhs,
16381648
LiftoffRegister rhs) {
16391649
liftoff::EmitSimdShift<liftoff::ShiftDirection::kLeft>(
@@ -1779,6 +1789,11 @@ void LiftoffAssembler::emit_v8x16_alltrue(LiftoffRegister dst,
17791789
liftoff::EmitAllTrue(this, dst, src, kFormat16B);
17801790
}
17811791

1792+
void LiftoffAssembler::emit_i8x16_bitmask(LiftoffRegister dst,
1793+
LiftoffRegister src) {
1794+
bailout(kSimd, "i8x16_bitmask");
1795+
}
1796+
17821797
void LiftoffAssembler::emit_i8x16_shl(LiftoffRegister dst, LiftoffRegister lhs,
17831798
LiftoffRegister rhs) {
17841799
liftoff::EmitSimdShift<liftoff::ShiftDirection::kLeft>(

src/wasm/baseline/ia32/liftoff-assembler-ia32.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2552,6 +2552,11 @@ void LiftoffAssembler::emit_v8x16_alltrue(LiftoffRegister dst,
25522552
liftoff::EmitAllTrue<&TurboAssembler::Pcmpeqb>(this, dst, src);
25532553
}
25542554

2555+
void LiftoffAssembler::emit_i8x16_bitmask(LiftoffRegister dst,
2556+
LiftoffRegister src) {
2557+
Pmovmskb(dst.gp(), src.fp());
2558+
}
2559+
25552560
void LiftoffAssembler::emit_i8x16_shl(LiftoffRegister dst, LiftoffRegister lhs,
25562561
LiftoffRegister rhs) {
25572562
static constexpr RegClass tmp_rc = reg_class_for(ValueType::kI32);
@@ -2790,6 +2795,14 @@ void LiftoffAssembler::emit_v16x8_alltrue(LiftoffRegister dst,
27902795
liftoff::EmitAllTrue<&TurboAssembler::Pcmpeqw>(this, dst, src);
27912796
}
27922797

2798+
void LiftoffAssembler::emit_i16x8_bitmask(LiftoffRegister dst,
2799+
LiftoffRegister src) {
2800+
XMMRegister tmp = liftoff::kScratchDoubleReg;
2801+
Packsswb(tmp, src.fp());
2802+
Pmovmskb(dst.gp(), tmp);
2803+
shr(dst.gp(), 8);
2804+
}
2805+
27932806
void LiftoffAssembler::emit_i16x8_shl(LiftoffRegister dst, LiftoffRegister lhs,
27942807
LiftoffRegister rhs) {
27952808
liftoff::EmitSimdShiftOp<&Assembler::vpsllw, &Assembler::psllw, 4>(this, dst,
@@ -2924,6 +2937,11 @@ void LiftoffAssembler::emit_v32x4_alltrue(LiftoffRegister dst,
29242937
liftoff::EmitAllTrue<&TurboAssembler::Pcmpeqd>(this, dst, src);
29252938
}
29262939

2940+
void LiftoffAssembler::emit_i32x4_bitmask(LiftoffRegister dst,
2941+
LiftoffRegister src) {
2942+
Movmskps(dst.gp(), src.fp());
2943+
}
2944+
29272945
void LiftoffAssembler::emit_i32x4_shl(LiftoffRegister dst, LiftoffRegister lhs,
29282946
LiftoffRegister rhs) {
29292947
liftoff::EmitSimdShiftOp<&Assembler::vpslld, &Assembler::pslld, 5>(this, dst,

src/wasm/baseline/liftoff-assembler.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -818,6 +818,7 @@ class LiftoffAssembler : public TurboAssembler {
818818
inline void emit_i8x16_neg(LiftoffRegister dst, LiftoffRegister src);
819819
inline void emit_v8x16_anytrue(LiftoffRegister dst, LiftoffRegister src);
820820
inline void emit_v8x16_alltrue(LiftoffRegister dst, LiftoffRegister src);
821+
inline void emit_i8x16_bitmask(LiftoffRegister dst, LiftoffRegister src);
821822
inline void emit_i8x16_shl(LiftoffRegister dst, LiftoffRegister lhs,
822823
LiftoffRegister rhs);
823824
inline void emit_i8x16_shli(LiftoffRegister dst, LiftoffRegister lhs,
@@ -859,6 +860,7 @@ class LiftoffAssembler : public TurboAssembler {
859860
inline void emit_i16x8_neg(LiftoffRegister dst, LiftoffRegister src);
860861
inline void emit_v16x8_anytrue(LiftoffRegister dst, LiftoffRegister src);
861862
inline void emit_v16x8_alltrue(LiftoffRegister dst, LiftoffRegister src);
863+
inline void emit_i16x8_bitmask(LiftoffRegister dst, LiftoffRegister src);
862864
inline void emit_i16x8_shl(LiftoffRegister dst, LiftoffRegister lhs,
863865
LiftoffRegister rhs);
864866
inline void emit_i16x8_shli(LiftoffRegister dst, LiftoffRegister lhs,
@@ -900,6 +902,7 @@ class LiftoffAssembler : public TurboAssembler {
900902
inline void emit_i32x4_neg(LiftoffRegister dst, LiftoffRegister src);
901903
inline void emit_v32x4_anytrue(LiftoffRegister dst, LiftoffRegister src);
902904
inline void emit_v32x4_alltrue(LiftoffRegister dst, LiftoffRegister src);
905+
inline void emit_i32x4_bitmask(LiftoffRegister dst, LiftoffRegister src);
903906
inline void emit_i32x4_shl(LiftoffRegister dst, LiftoffRegister lhs,
904907
LiftoffRegister rhs);
905908
inline void emit_i32x4_shli(LiftoffRegister dst, LiftoffRegister lhs,

src/wasm/baseline/liftoff-compiler.cc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2579,6 +2579,8 @@ class LiftoffCompiler {
25792579
return EmitUnOp<kS128, kI32>(&LiftoffAssembler::emit_v8x16_anytrue);
25802580
case wasm::kExprV8x16AllTrue:
25812581
return EmitUnOp<kS128, kI32>(&LiftoffAssembler::emit_v8x16_alltrue);
2582+
case wasm::kExprI8x16BitMask:
2583+
return EmitUnOp<kS128, kI32>(&LiftoffAssembler::emit_i8x16_bitmask);
25822584
case wasm::kExprI8x16Shl:
25832585
return EmitSimdShiftOp(&LiftoffAssembler::emit_i8x16_shl,
25842586
&LiftoffAssembler::emit_i8x16_shli);
@@ -2620,6 +2622,8 @@ class LiftoffCompiler {
26202622
return EmitUnOp<kS128, kI32>(&LiftoffAssembler::emit_v16x8_anytrue);
26212623
case wasm::kExprV16x8AllTrue:
26222624
return EmitUnOp<kS128, kI32>(&LiftoffAssembler::emit_v16x8_alltrue);
2625+
case wasm::kExprI16x8BitMask:
2626+
return EmitUnOp<kS128, kI32>(&LiftoffAssembler::emit_i16x8_bitmask);
26232627
case wasm::kExprI16x8Shl:
26242628
return EmitSimdShiftOp(&LiftoffAssembler::emit_i16x8_shl,
26252629
&LiftoffAssembler::emit_i16x8_shli);
@@ -2661,6 +2665,8 @@ class LiftoffCompiler {
26612665
return EmitUnOp<kS128, kI32>(&LiftoffAssembler::emit_v32x4_anytrue);
26622666
case wasm::kExprV32x4AllTrue:
26632667
return EmitUnOp<kS128, kI32>(&LiftoffAssembler::emit_v32x4_alltrue);
2668+
case wasm::kExprI32x4BitMask:
2669+
return EmitUnOp<kS128, kI32>(&LiftoffAssembler::emit_i32x4_bitmask);
26642670
case wasm::kExprI32x4Shl:
26652671
return EmitSimdShiftOp(&LiftoffAssembler::emit_i32x4_shl,
26662672
&LiftoffAssembler::emit_i32x4_shli);

src/wasm/baseline/x64/liftoff-assembler-x64.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2591,6 +2591,11 @@ void LiftoffAssembler::emit_v8x16_alltrue(LiftoffRegister dst,
25912591
liftoff::EmitAllTrue<&TurboAssembler::Pcmpeqb>(this, dst, src);
25922592
}
25932593

2594+
void LiftoffAssembler::emit_i8x16_bitmask(LiftoffRegister dst,
2595+
LiftoffRegister src) {
2596+
Pmovmskb(dst.gp(), src.fp());
2597+
}
2598+
25942599
void LiftoffAssembler::emit_i8x16_shl(LiftoffRegister dst, LiftoffRegister lhs,
25952600
LiftoffRegister rhs) {
25962601
static constexpr RegClass tmp_simd_rc = reg_class_for(ValueType::kS128);
@@ -2830,6 +2835,14 @@ void LiftoffAssembler::emit_v16x8_alltrue(LiftoffRegister dst,
28302835
liftoff::EmitAllTrue<&TurboAssembler::Pcmpeqw>(this, dst, src);
28312836
}
28322837

2838+
void LiftoffAssembler::emit_i16x8_bitmask(LiftoffRegister dst,
2839+
LiftoffRegister src) {
2840+
XMMRegister tmp = kScratchDoubleReg;
2841+
Packsswb(tmp, src.fp());
2842+
Pmovmskb(dst.gp(), tmp);
2843+
shrq(dst.gp(), Immediate(8));
2844+
}
2845+
28332846
void LiftoffAssembler::emit_i16x8_shl(LiftoffRegister dst, LiftoffRegister lhs,
28342847
LiftoffRegister rhs) {
28352848
liftoff::EmitSimdShiftOp<&Assembler::vpsllw, &Assembler::psllw, 4>(this, dst,
@@ -2964,6 +2977,11 @@ void LiftoffAssembler::emit_v32x4_alltrue(LiftoffRegister dst,
29642977
liftoff::EmitAllTrue<&TurboAssembler::Pcmpeqd>(this, dst, src);
29652978
}
29662979

2980+
void LiftoffAssembler::emit_i32x4_bitmask(LiftoffRegister dst,
2981+
LiftoffRegister src) {
2982+
Movmskps(dst.gp(), src.fp());
2983+
}
2984+
29672985
void LiftoffAssembler::emit_i32x4_shl(LiftoffRegister dst, LiftoffRegister lhs,
29682986
LiftoffRegister rhs) {
29692987
liftoff::EmitSimdShiftOp<&Assembler::vpslld, &Assembler::pslld, 5>(this, dst,

0 commit comments

Comments
 (0)