Skip to content

Commit aa5bcc0

Browse files
ngzhianCommit Bot
authored and
Commit Bot
committed
Reland "[wasm-simd][liftoff][ia32][x64] Implement bitmask"
This relands commit d04b5e4. The fix here is in the assembler for pmovmskb, emit_optional_rex_32 should be called after emitting the prefix byte. Original change's description: > [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} Bug: v8:9909, v8:10308 Change-Id: I4897585c86b87f72dc8f142b275171276d135a24 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2225090 Reviewed-by: Clemens Backes <[email protected]> Commit-Queue: Zhi An Ng <[email protected]> Cr-Commit-Position: refs/heads/master@{#68106}
1 parent a16ad72 commit aa5bcc0

7 files changed

+76
-1
lines changed

src/codegen/x64/assembler-x64.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3450,8 +3450,8 @@ void Assembler::movmskps(Register dst, XMMRegister src) {
34503450

34513451
void Assembler::pmovmskb(Register dst, XMMRegister src) {
34523452
EnsureSpace ensure_space(this);
3453-
emit_optional_rex_32(dst, src);
34543453
emit(0x66);
3454+
emit_optional_rex_32(dst, src);
34553455
emit(0x0F);
34563456
emit(0xD7);
34573457
emit_sse_operand(dst, src);

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
@@ -2585,6 +2585,8 @@ class LiftoffCompiler {
25852585
return EmitUnOp<kS128, kI32>(&LiftoffAssembler::emit_v8x16_anytrue);
25862586
case wasm::kExprV8x16AllTrue:
25872587
return EmitUnOp<kS128, kI32>(&LiftoffAssembler::emit_v8x16_alltrue);
2588+
case wasm::kExprI8x16BitMask:
2589+
return EmitUnOp<kS128, kI32>(&LiftoffAssembler::emit_i8x16_bitmask);
25882590
case wasm::kExprI8x16Shl:
25892591
return EmitSimdShiftOp(&LiftoffAssembler::emit_i8x16_shl,
25902592
&LiftoffAssembler::emit_i8x16_shli);
@@ -2626,6 +2628,8 @@ class LiftoffCompiler {
26262628
return EmitUnOp<kS128, kI32>(&LiftoffAssembler::emit_v16x8_anytrue);
26272629
case wasm::kExprV16x8AllTrue:
26282630
return EmitUnOp<kS128, kI32>(&LiftoffAssembler::emit_v16x8_alltrue);
2631+
case wasm::kExprI16x8BitMask:
2632+
return EmitUnOp<kS128, kI32>(&LiftoffAssembler::emit_i16x8_bitmask);
26292633
case wasm::kExprI16x8Shl:
26302634
return EmitSimdShiftOp(&LiftoffAssembler::emit_i16x8_shl,
26312635
&LiftoffAssembler::emit_i16x8_shli);
@@ -2667,6 +2671,8 @@ class LiftoffCompiler {
26672671
return EmitUnOp<kS128, kI32>(&LiftoffAssembler::emit_v32x4_anytrue);
26682672
case wasm::kExprV32x4AllTrue:
26692673
return EmitUnOp<kS128, kI32>(&LiftoffAssembler::emit_v32x4_alltrue);
2674+
case wasm::kExprI32x4BitMask:
2675+
return EmitUnOp<kS128, kI32>(&LiftoffAssembler::emit_i32x4_bitmask);
26702676
case wasm::kExprI32x4Shl:
26712677
return EmitSimdShiftOp(&LiftoffAssembler::emit_i32x4_shl,
26722678
&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)