| 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 4fd1d63b18e511414ccb071624aa3c5912340936..7d0bc8a8a65f07e8b8ba802480e11cf1b7919e1e 100644
|
| --- a/test/cctest/wasm/test-run-wasm-simd.cc
|
| +++ b/test/cctest/wasm/test-run-wasm-simd.cc
|
| @@ -213,6 +213,11 @@ T Not(T a) {
|
| }
|
|
|
| template <typename T>
|
| +T LogicalNot(T a) {
|
| + return a == 0 ? 1 : 0;
|
| +}
|
| +
|
| +template <typename T>
|
| T Sqrt(T a) {
|
| return std::sqrt(a);
|
| }
|
| @@ -1340,6 +1345,182 @@ WASM_EXEC_COMPILED_TEST(I8x16ShrU) {
|
| WASM_SIMD_SELECT_TEST(32x4)
|
| WASM_SIMD_SELECT_TEST(16x8)
|
| WASM_SIMD_SELECT_TEST(8x16)
|
| +
|
| +// Boolean unary operations are 'AllTrue' and 'AnyTrue', which return an integer
|
| +// result. Use relational ops on numeric vectors to create the boolean vector
|
| +// test inputs. Test inputs with all true, all false, one true, and one false.
|
| +#define WASM_SIMD_BOOL_REDUCTION_TEST(format, lanes) \
|
| + WASM_EXEC_TEST(ReductionTest##lanes) { \
|
| + FLAG_wasm_simd_prototype = true; \
|
| + WasmRunner<int32_t> r(kExecuteCompiled); \
|
| + byte zero = r.AllocateLocal(kWasmS128); \
|
| + byte one_one = r.AllocateLocal(kWasmS128); \
|
| + byte reduced = r.AllocateLocal(kWasmI32); \
|
| + BUILD(r, WASM_SET_LOCAL(zero, WASM_SIMD_I##format##_SPLAT(WASM_ZERO)), \
|
| + WASM_SET_LOCAL( \
|
| + reduced, WASM_SIMD_UNOP(kExprS1x##lanes##AnyTrue, \
|
| + WASM_SIMD_BINOP(kExprI##format##Eq, \
|
| + WASM_GET_LOCAL(zero), \
|
| + WASM_GET_LOCAL(zero)))), \
|
| + WASM_IF(WASM_I32_EQ(WASM_GET_LOCAL(reduced), WASM_ZERO), \
|
| + WASM_RETURN1(WASM_ZERO)), \
|
| + WASM_SET_LOCAL( \
|
| + reduced, WASM_SIMD_UNOP(kExprS1x##lanes##AnyTrue, \
|
| + WASM_SIMD_BINOP(kExprI##format##Ne, \
|
| + WASM_GET_LOCAL(zero), \
|
| + WASM_GET_LOCAL(zero)))), \
|
| + WASM_IF(WASM_I32_NE(WASM_GET_LOCAL(reduced), WASM_ZERO), \
|
| + WASM_RETURN1(WASM_ZERO)), \
|
| + WASM_SET_LOCAL( \
|
| + reduced, WASM_SIMD_UNOP(kExprS1x##lanes##AllTrue, \
|
| + WASM_SIMD_BINOP(kExprI##format##Eq, \
|
| + WASM_GET_LOCAL(zero), \
|
| + WASM_GET_LOCAL(zero)))), \
|
| + WASM_IF(WASM_I32_EQ(WASM_GET_LOCAL(reduced), WASM_ZERO), \
|
| + WASM_RETURN1(WASM_ZERO)), \
|
| + WASM_SET_LOCAL( \
|
| + reduced, WASM_SIMD_UNOP(kExprS1x##lanes##AllTrue, \
|
| + WASM_SIMD_BINOP(kExprI##format##Ne, \
|
| + WASM_GET_LOCAL(zero), \
|
| + WASM_GET_LOCAL(zero)))), \
|
| + WASM_IF(WASM_I32_NE(WASM_GET_LOCAL(reduced), WASM_ZERO), \
|
| + WASM_RETURN1(WASM_ZERO)), \
|
| + WASM_SET_LOCAL(one_one, \
|
| + WASM_SIMD_I##format##_REPLACE_LANE( \
|
| + lanes - 1, WASM_GET_LOCAL(zero), WASM_ONE)), \
|
| + WASM_SET_LOCAL( \
|
| + reduced, WASM_SIMD_UNOP(kExprS1x##lanes##AnyTrue, \
|
| + WASM_SIMD_BINOP(kExprI##format##Eq, \
|
| + WASM_GET_LOCAL(one_one), \
|
| + WASM_GET_LOCAL(zero)))), \
|
| + WASM_IF(WASM_I32_EQ(WASM_GET_LOCAL(reduced), WASM_ZERO), \
|
| + WASM_RETURN1(WASM_ZERO)), \
|
| + WASM_SET_LOCAL( \
|
| + reduced, WASM_SIMD_UNOP(kExprS1x##lanes##AnyTrue, \
|
| + WASM_SIMD_BINOP(kExprI##format##Ne, \
|
| + WASM_GET_LOCAL(one_one), \
|
| + WASM_GET_LOCAL(zero)))), \
|
| + WASM_IF(WASM_I32_EQ(WASM_GET_LOCAL(reduced), WASM_ZERO), \
|
| + WASM_RETURN1(WASM_ZERO)), \
|
| + WASM_SET_LOCAL( \
|
| + reduced, WASM_SIMD_UNOP(kExprS1x##lanes##AllTrue, \
|
| + WASM_SIMD_BINOP(kExprI##format##Eq, \
|
| + WASM_GET_LOCAL(one_one), \
|
| + WASM_GET_LOCAL(zero)))), \
|
| + WASM_IF(WASM_I32_NE(WASM_GET_LOCAL(reduced), WASM_ZERO), \
|
| + WASM_RETURN1(WASM_ZERO)), \
|
| + WASM_SET_LOCAL( \
|
| + reduced, WASM_SIMD_UNOP(kExprS1x##lanes##AllTrue, \
|
| + WASM_SIMD_BINOP(kExprI##format##Ne, \
|
| + WASM_GET_LOCAL(one_one), \
|
| + WASM_GET_LOCAL(zero)))), \
|
| + WASM_IF(WASM_I32_NE(WASM_GET_LOCAL(reduced), WASM_ZERO), \
|
| + WASM_RETURN1(WASM_ZERO)), \
|
| + WASM_ONE); \
|
| + CHECK_EQ(1, r.Call()); \
|
| + }
|
| +
|
| +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) { \
|
| + FLAG_wasm_simd_prototype = true; \
|
| + 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_EXEC_COMPILED_TEST(S1x4Not) { RunS1x4UnOpTest(kExprS1x4Not, LogicalNot); }
|
| +
|
| +WASM_EXEC_COMPILED_TEST(S1x8Not) { RunS1x8UnOpTest(kExprS1x8Not, LogicalNot); }
|
| +
|
| +WASM_EXEC_COMPILED_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) { \
|
| + FLAG_wasm_simd_prototype = true; \
|
| + 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_EXEC_COMPILED_TEST(S1x4And) { RunS1x4BinOpTest(kExprS1x4And, And); }
|
| +
|
| +WASM_EXEC_COMPILED_TEST(S1x4Or) { RunS1x4BinOpTest(kExprS1x4Or, Or); }
|
| +
|
| +WASM_EXEC_COMPILED_TEST(S1x4Xor) { RunS1x4BinOpTest(kExprS1x4Xor, Xor); }
|
| +
|
| +WASM_EXEC_COMPILED_TEST(S1x8And) { RunS1x8BinOpTest(kExprS1x8And, And); }
|
| +
|
| +WASM_EXEC_COMPILED_TEST(S1x8Or) { RunS1x8BinOpTest(kExprS1x8Or, Or); }
|
| +
|
| +WASM_EXEC_COMPILED_TEST(S1x8Xor) { RunS1x8BinOpTest(kExprS1x8Xor, Xor); }
|
| +
|
| +WASM_EXEC_COMPILED_TEST(S1x16And) { RunS1x16BinOpTest(kExprS1x16And, And); }
|
| +
|
| +WASM_EXEC_COMPILED_TEST(S1x16Or) { RunS1x16BinOpTest(kExprS1x16Or, Or); }
|
| +
|
| +WASM_EXEC_COMPILED_TEST(S1x16Xor) { RunS1x16BinOpTest(kExprS1x16Xor, Xor); }
|
| +
|
| #endif // V8_TARGET_ARCH_ARM
|
|
|
| #if SIMD_LOWERING_TARGET
|
|
|