diff --git a/js/src/jit-test/tests/wasm/regress/bug1953381.js b/js/src/jit-test/tests/wasm/regress/bug1953381.js new file mode 100644 index 000000000000..3fa1a3f32a9c --- /dev/null +++ b/js/src/jit-test/tests/wasm/regress/bug1953381.js @@ -0,0 +1,32 @@ +// |jit-test| skip-if: !wasmSimdEnabled() + +for (let [mask, exp] of [ + [0xFF000000, 0x12bcdef0], // optimized to PBLENDVB on x86 + [0x00FFFFFF, 0x9a345678], // optimized to PBLENDVB on x86 + [0xFFFF0000, 0x1234def0], // optimized to PBLENDW on x86 + [0x0000FFFF, 0x9abc5678], // optimized to PBLENDW on x86 + [0x10000000, 0x9abcdef0], // non-optimizable mask + [0x9FFFFFFF, 0x12345678], // non-optimizable mask + [0x00000000, 0x9abcdef0], + [0xFFFFFFFF, 0x12345678], +]) { + const ins = wasmEvalText(`(module + (memory (export "memory") 1 1) + (func (export "test") + i32.const 48 + i32.const 0 + v128.load + i32.const 16 + v128.load + v128.const i32x4 ${mask} ${mask} ${mask} ${mask} + v128.bitselect + v128.store + ) + (data (i32.const 0) "\\78\\56\\34\\12\\78\\56\\34\\12\\78\\56\\34\\12\\78\\56\\34\\12") + (data (i32.const 16) "\\f0\\de\\bc\\9a\\f0\\de\\bc\\9a\\f0\\de\\bc\\9a\\f0\\de\\bc\\9a") + )`); + ins.exports.test(); + var result = new DataView(ins.exports.memory.buffer).getUint32(48, true); + var expected = exp >>> 0; + assertEq(result, expected); +} diff --git a/js/src/jit-test/tests/wasm/simd/bitselect-x64-ion-codegen.js b/js/src/jit-test/tests/wasm/simd/bitselect-x64-ion-codegen.js index 6d2a105d12a8..80ebffcdf83f 100644 --- a/js/src/jit-test/tests/wasm/simd/bitselect-x64-ion-codegen.js +++ b/js/src/jit-test/tests/wasm/simd/bitselect-x64-ion-codegen.js @@ -29,7 +29,7 @@ codegenTestX64_adhoc( (func (export "f") (param v128) (param v128) (param v128) (result v128) (v128.bitselect (local.get 0) (local.get 1) (v128.const i32x4 -1 0 0 -1))))`, 'f', - `66 0f 3a 0e c1 c3 pblendw \\$0xC3, %xmm1, %xmm0`); + `66 0f 3a 0e c1 3c pblendw \\$0x3C, %xmm1, %xmm0`); // vpblendvp optimization when bitselect follows comparison. // Non-AVX pblendvb uses xmm0 as an implicit read-only operand. diff --git a/js/src/jit/x86-shared/Lowering-x86-shared.cpp b/js/src/jit/x86-shared/Lowering-x86-shared.cpp index e9786d4882cb..2137d8f03b7e 100644 --- a/js/src/jit/x86-shared/Lowering-x86-shared.cpp +++ b/js/src/jit/x86-shared/Lowering-x86-shared.cpp @@ -1161,9 +1161,9 @@ bool MWasmTernarySimd128::specializeBitselectConstantMaskAsShuffle( const SimdConstant::I8x16& bytes = constant.asInt8x16(); for (int8_t i = 0; i < 16; i++) { if (bytes[i] == -1) { - shuffle[i] = i + 16; - } else if (bytes[i] == 0) { shuffle[i] = i; + } else if (bytes[i] == 0) { + shuffle[i] = i + 16; } else { return false; }