| Index: test/cctest/wasm/test-run-wasm-simd.cc
|
| diff --git a/test/cctest/wasm/test-run-wasm-simd.cc b/test/cctest/wasm/test-run-wasm-simd.cc
|
| index 3734268166d915d904510bed298542cd628f16be..2a3c7a9665ee85c5e89dae4687bb2723f4f8dd3e 100644
|
| --- a/test/cctest/wasm/test-run-wasm-simd.cc
|
| +++ b/test/cctest/wasm/test-run-wasm-simd.cc
|
| @@ -368,14 +368,12 @@ T RecipSqrt(T a) {
|
| #define WASM_SIMD_SHIFT_OP(op, shift, x) x, WASM_SIMD_OP(op), TO_BYTE(shift)
|
| #define WASM_SIMD_CONCAT_OP(op, bytes, x, y) \
|
| x, y, WASM_SIMD_OP(op), TO_BYTE(bytes)
|
| -#define WASM_SIMD_SELECT(format, x, y, z) \
|
| - x, y, z, WASM_SIMD_OP(kExprS##format##Select)
|
| +#define WASM_SIMD_SELECT(format, x, y, z) x, y, z, WASM_SIMD_OP(kExprS128Select)
|
| // Since boolean vectors can't be checked directly, materialize them into
|
| // integer vectors using a Select operation.
|
| #define WASM_SIMD_MATERIALIZE_BOOLS(format, x) \
|
| x, WASM_SIMD_I##format##_SPLAT(WASM_ONE), \
|
| - WASM_SIMD_I##format##_SPLAT(WASM_ZERO), \
|
| - WASM_SIMD_OP(kExprS##format##Select)
|
| + WASM_SIMD_I##format##_SPLAT(WASM_ZERO), WASM_SIMD_OP(kExprS128Select)
|
|
|
| #define WASM_SIMD_F32x4_SPLAT(x) x, WASM_SIMD_OP(kExprF32x4Splat)
|
| #define WASM_SIMD_F32x4_EXTRACT_LANE(lane, x) \
|
| @@ -1495,8 +1493,9 @@ WASM_SIMD_TEST(I8x16ShrU) {
|
|
|
| #if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_MIPS || \
|
| V8_TARGET_ARCH_MIPS64
|
| -// Test Select by making a mask where the first two lanes are true and the rest
|
| -// false, and comparing for non-equality with zero to materialize a bool vector.
|
| +// Test Select by making a mask where the 0th and 3rd lanes are true and the
|
| +// rest false, and comparing for non-equality with zero to materialize a boolean
|
| +// vector.
|
| #define WASM_SIMD_SELECT_TEST(format) \
|
| WASM_SIMD_TEST(S##format##Select) { \
|
| WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); \
|
| @@ -1532,14 +1531,45 @@ WASM_SIMD_TEST(I8x16ShrU) {
|
| }
|
|
|
| WASM_SIMD_SELECT_TEST(32x4)
|
| -#endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_MIPS ||
|
| - // V8_TARGET_ARCH_MIPS64
|
| -
|
| -#if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_MIPS || \
|
| - V8_TARGET_ARCH_MIPS64
|
| WASM_SIMD_SELECT_TEST(16x8)
|
| -
|
| WASM_SIMD_SELECT_TEST(8x16)
|
| +
|
| +// Test Select by making a mask where the 0th and 3rd lanes are non-zero and the
|
| +// rest 0. The mask is not the result of a comparison op.
|
| +#define WASM_SIMD_NON_CANONICAL_SELECT_TEST(format) \
|
| + WASM_SIMD_TEST(S##format##NonCanonicalSelect) { \
|
| + WasmRunner<int32_t, int32_t, int32_t, int32_t> r(kExecuteCompiled); \
|
| + byte val1 = 0; \
|
| + byte val2 = 1; \
|
| + byte combined = 2; \
|
| + byte src1 = r.AllocateLocal(kWasmS128); \
|
| + byte src2 = r.AllocateLocal(kWasmS128); \
|
| + byte zero = r.AllocateLocal(kWasmS128); \
|
| + byte mask = r.AllocateLocal(kWasmS128); \
|
| + BUILD(r, \
|
| + WASM_SET_LOCAL(src1, \
|
| + WASM_SIMD_I##format##_SPLAT(WASM_GET_LOCAL(val1))), \
|
| + WASM_SET_LOCAL(src2, \
|
| + WASM_SIMD_I##format##_SPLAT(WASM_GET_LOCAL(val2))), \
|
| + WASM_SET_LOCAL(zero, WASM_SIMD_I##format##_SPLAT(WASM_ZERO)), \
|
| + WASM_SET_LOCAL(mask, WASM_SIMD_I##format##_REPLACE_LANE( \
|
| + 1, WASM_GET_LOCAL(zero), WASM_I32V(0xF))), \
|
| + WASM_SET_LOCAL(mask, WASM_SIMD_I##format##_REPLACE_LANE( \
|
| + 2, WASM_GET_LOCAL(mask), WASM_I32V(0xF))), \
|
| + WASM_SET_LOCAL(mask, WASM_SIMD_SELECT(format, WASM_GET_LOCAL(mask), \
|
| + WASM_GET_LOCAL(src1), \
|
| + WASM_GET_LOCAL(src2))), \
|
| + WASM_SIMD_CHECK_LANE(I##format, mask, I32, val2, 0), \
|
| + WASM_SIMD_CHECK_LANE(I##format, mask, I32, combined, 1), \
|
| + WASM_SIMD_CHECK_LANE(I##format, mask, I32, combined, 2), \
|
| + WASM_SIMD_CHECK_LANE(I##format, mask, I32, val2, 3), WASM_ONE); \
|
| + \
|
| + CHECK_EQ(1, r.Call(0x12, 0x34, 0x32)); \
|
| + }
|
| +
|
| +WASM_SIMD_NON_CANONICAL_SELECT_TEST(32x4)
|
| +WASM_SIMD_NON_CANONICAL_SELECT_TEST(16x8)
|
| +WASM_SIMD_NON_CANONICAL_SELECT_TEST(8x16)
|
| #endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_MIPS ||
|
| // V8_TARGET_ARCH_MIPS64
|
|
|
| @@ -1880,98 +1910,6 @@ WASM_SIMD_BOOL_REDUCTION_TEST(32x4, 4)
|
| WASM_SIMD_BOOL_REDUCTION_TEST(16x8, 8)
|
| WASM_SIMD_BOOL_REDUCTION_TEST(8x16, 16)
|
|
|
| -#define WASM_SIMD_UNOP_HELPER(format, lanes, lane_size) \
|
| - void RunS1x##lanes##UnOpTest(WasmOpcode simd_op, \
|
| - Int##lane_size##UnOp expected_op) { \
|
| - WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); \
|
| - byte a = 0; \
|
| - byte expected = 1; \
|
| - byte zero = r.AllocateLocal(kWasmS128); \
|
| - byte simd = r.AllocateLocal(kWasmS128); \
|
| - BUILD( \
|
| - r, WASM_SET_LOCAL(zero, WASM_SIMD_I##format##_SPLAT(WASM_ZERO)), \
|
| - WASM_SET_LOCAL(simd, WASM_SIMD_I##format##_SPLAT(WASM_GET_LOCAL(a))), \
|
| - WASM_SET_LOCAL( \
|
| - simd, \
|
| - WASM_SIMD_MATERIALIZE_BOOLS( \
|
| - format, WASM_SIMD_UNOP( \
|
| - simd_op, WASM_SIMD_BINOP(kExprI##format##Ne, \
|
| - WASM_GET_LOCAL(simd), \
|
| - WASM_GET_LOCAL(zero))))), \
|
| - WASM_SIMD_CHECK_SPLAT##lanes(I##format, simd, I32, expected), \
|
| - WASM_ONE); \
|
| - \
|
| - for (int i = 0; i <= 1; i++) { \
|
| - CHECK_EQ(1, r.Call(i, expected_op(i))); \
|
| - } \
|
| - }
|
| -WASM_SIMD_UNOP_HELPER(32x4, 4, 32);
|
| -WASM_SIMD_UNOP_HELPER(16x8, 8, 16);
|
| -WASM_SIMD_UNOP_HELPER(8x16, 16, 8);
|
| -#undef WASM_SIMD_UNOP_HELPER
|
| -
|
| -WASM_SIMD_TEST(S1x4Not) { RunS1x4UnOpTest(kExprS1x4Not, LogicalNot); }
|
| -
|
| -WASM_SIMD_TEST(S1x8Not) { RunS1x8UnOpTest(kExprS1x8Not, LogicalNot); }
|
| -
|
| -WASM_SIMD_TEST(S1x16Not) { RunS1x16UnOpTest(kExprS1x16Not, LogicalNot); }
|
| -
|
| -#define WASM_SIMD_BINOP_HELPER(format, lanes, lane_size) \
|
| - void RunS1x##lanes##BinOpTest(WasmOpcode simd_op, \
|
| - Int##lane_size##BinOp expected_op) { \
|
| - WasmRunner<int32_t, int32_t, int32_t, int32_t> r(kExecuteCompiled); \
|
| - byte a = 0; \
|
| - byte b = 1; \
|
| - byte expected = 2; \
|
| - byte zero = r.AllocateLocal(kWasmS128); \
|
| - byte simd0 = r.AllocateLocal(kWasmS128); \
|
| - byte simd1 = r.AllocateLocal(kWasmS128); \
|
| - BUILD( \
|
| - r, WASM_SET_LOCAL(zero, WASM_SIMD_I##format##_SPLAT(WASM_ZERO)), \
|
| - WASM_SET_LOCAL(simd0, WASM_SIMD_I##format##_SPLAT(WASM_GET_LOCAL(a))), \
|
| - WASM_SET_LOCAL(simd1, WASM_SIMD_I##format##_SPLAT(WASM_GET_LOCAL(b))), \
|
| - WASM_SET_LOCAL( \
|
| - simd1, \
|
| - WASM_SIMD_MATERIALIZE_BOOLS( \
|
| - format, \
|
| - WASM_SIMD_BINOP( \
|
| - simd_op, \
|
| - WASM_SIMD_BINOP(kExprI##format##Ne, WASM_GET_LOCAL(simd0), \
|
| - WASM_GET_LOCAL(zero)), \
|
| - WASM_SIMD_BINOP(kExprI##format##Ne, WASM_GET_LOCAL(simd1), \
|
| - WASM_GET_LOCAL(zero))))), \
|
| - WASM_SIMD_CHECK_SPLAT##lanes(I##format, simd1, I32, expected), \
|
| - WASM_ONE); \
|
| - \
|
| - for (int i = 0; i <= 1; i++) { \
|
| - for (int j = 0; j <= 1; j++) { \
|
| - CHECK_EQ(1, r.Call(i, j, expected_op(i, j))); \
|
| - } \
|
| - } \
|
| - }
|
| -
|
| -WASM_SIMD_BINOP_HELPER(32x4, 4, 32);
|
| -WASM_SIMD_BINOP_HELPER(16x8, 8, 16);
|
| -WASM_SIMD_BINOP_HELPER(8x16, 16, 8);
|
| -#undef WASM_SIMD_BINOP_HELPER
|
| -
|
| -WASM_SIMD_TEST(S1x4And) { RunS1x4BinOpTest(kExprS1x4And, And); }
|
| -
|
| -WASM_SIMD_TEST(S1x4Or) { RunS1x4BinOpTest(kExprS1x4Or, Or); }
|
| -
|
| -WASM_SIMD_TEST(S1x4Xor) { RunS1x4BinOpTest(kExprS1x4Xor, Xor); }
|
| -
|
| -WASM_SIMD_TEST(S1x8And) { RunS1x8BinOpTest(kExprS1x8And, And); }
|
| -
|
| -WASM_SIMD_TEST(S1x8Or) { RunS1x8BinOpTest(kExprS1x8Or, Or); }
|
| -
|
| -WASM_SIMD_TEST(S1x8Xor) { RunS1x8BinOpTest(kExprS1x8Xor, Xor); }
|
| -
|
| -WASM_SIMD_TEST(S1x16And) { RunS1x16BinOpTest(kExprS1x16And, And); }
|
| -
|
| -WASM_SIMD_TEST(S1x16Or) { RunS1x16BinOpTest(kExprS1x16Or, Or); }
|
| -
|
| -WASM_SIMD_TEST(S1x16Xor) { RunS1x16BinOpTest(kExprS1x16Xor, Xor); }
|
| #endif // !V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64
|
|
|
| #if V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET || V8_TARGET_ARCH_MIPS || \
|
|
|