| OLD | NEW |
| 1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/assembler-inl.h" | 5 #include "src/assembler-inl.h" |
| 6 #include "src/wasm/wasm-macro-gen.h" | 6 #include "src/wasm/wasm-macro-gen.h" |
| 7 #include "test/cctest/cctest.h" | 7 #include "test/cctest/cctest.h" |
| 8 #include "test/cctest/compiler/value-helper.h" | 8 #include "test/cctest/compiler/value-helper.h" |
| 9 #include "test/cctest/wasm/wasm-run-utils.h" | 9 #include "test/cctest/wasm/wasm-run-utils.h" |
| 10 | 10 |
| (...skipping 832 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 843 | 843 |
| 844 FOR_INT32_INPUTS(i) { | 844 FOR_INT32_INPUTS(i) { |
| 845 FOR_INT32_INPUTS(j) { CHECK_EQ(1, r.Call(*i, *j, expected_op(*i, *j))); } | 845 FOR_INT32_INPUTS(j) { CHECK_EQ(1, r.Call(*i, *j, expected_op(*i, *j))); } |
| 846 } | 846 } |
| 847 } | 847 } |
| 848 | 848 |
| 849 WASM_EXEC_COMPILED_TEST(I32x4Add) { RunI32x4BinOpTest(kExprI32x4Add, Add); } | 849 WASM_EXEC_COMPILED_TEST(I32x4Add) { RunI32x4BinOpTest(kExprI32x4Add, Add); } |
| 850 | 850 |
| 851 WASM_EXEC_COMPILED_TEST(I32x4Sub) { RunI32x4BinOpTest(kExprI32x4Sub, Sub); } | 851 WASM_EXEC_COMPILED_TEST(I32x4Sub) { RunI32x4BinOpTest(kExprI32x4Sub, Sub); } |
| 852 | 852 |
| 853 #if V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET | |
| 854 WASM_EXEC_COMPILED_TEST(I32x4Mul) { RunI32x4BinOpTest(kExprI32x4Mul, Mul); } | 853 WASM_EXEC_COMPILED_TEST(I32x4Mul) { RunI32x4BinOpTest(kExprI32x4Mul, Mul); } |
| 855 | 854 |
| 855 #if V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET |
| 856 WASM_EXEC_COMPILED_TEST(S128And) { RunI32x4BinOpTest(kExprS128And, And); } | 856 WASM_EXEC_COMPILED_TEST(S128And) { RunI32x4BinOpTest(kExprS128And, And); } |
| 857 | 857 |
| 858 WASM_EXEC_COMPILED_TEST(S128Or) { RunI32x4BinOpTest(kExprS128Or, Or); } | 858 WASM_EXEC_COMPILED_TEST(S128Or) { RunI32x4BinOpTest(kExprS128Or, Or); } |
| 859 | 859 |
| 860 WASM_EXEC_COMPILED_TEST(S128Xor) { RunI32x4BinOpTest(kExprS128Xor, Xor); } | 860 WASM_EXEC_COMPILED_TEST(S128Xor) { RunI32x4BinOpTest(kExprS128Xor, Xor); } |
| 861 #endif // V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET | 861 #endif // V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET |
| 862 | 862 |
| 863 #if V8_TARGET_ARCH_ARM | 863 #if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_X64 |
| 864 WASM_EXEC_COMPILED_TEST(I32x4Min) { | 864 WASM_EXEC_COMPILED_TEST(I32x4Min) { |
| 865 RunI32x4BinOpTest(kExprI32x4MinS, Minimum); | 865 RunI32x4BinOpTest(kExprI32x4MinS, Minimum); |
| 866 } | 866 } |
| 867 | 867 |
| 868 WASM_EXEC_COMPILED_TEST(I32x4Max) { | 868 WASM_EXEC_COMPILED_TEST(I32x4Max) { |
| 869 RunI32x4BinOpTest(kExprI32x4MaxS, Maximum); | 869 RunI32x4BinOpTest(kExprI32x4MaxS, Maximum); |
| 870 } | 870 } |
| 871 | 871 |
| 872 WASM_EXEC_COMPILED_TEST(Ui32x4Min) { | 872 WASM_EXEC_COMPILED_TEST(Ui32x4Min) { |
| 873 RunI32x4BinOpTest(kExprI32x4MinU, UnsignedMinimum); | 873 RunI32x4BinOpTest(kExprI32x4MinU, UnsignedMinimum); |
| 874 } | 874 } |
| 875 | 875 |
| 876 WASM_EXEC_COMPILED_TEST(Ui32x4Max) { | 876 WASM_EXEC_COMPILED_TEST(Ui32x4Max) { |
| 877 RunI32x4BinOpTest(kExprI32x4MaxU, UnsignedMaximum); | 877 RunI32x4BinOpTest(kExprI32x4MaxU, UnsignedMaximum); |
| 878 } | 878 } |
| 879 | 879 |
| 880 | |
| 881 | |
| 882 void RunI32x4CompareOpTest(WasmOpcode simd_op, Int32BinOp expected_op) { | 880 void RunI32x4CompareOpTest(WasmOpcode simd_op, Int32BinOp expected_op) { |
| 883 FLAG_wasm_simd_prototype = true; | 881 FLAG_wasm_simd_prototype = true; |
| 884 WasmRunner<int32_t, int32_t, int32_t, int32_t> r(kExecuteCompiled); | 882 WasmRunner<int32_t, int32_t, int32_t, int32_t> r(kExecuteCompiled); |
| 885 byte a = 0; | 883 byte a = 0; |
| 886 byte b = 1; | 884 byte b = 1; |
| 887 byte expected = 2; | 885 byte expected = 2; |
| 888 byte simd0 = r.AllocateLocal(kWasmS128); | 886 byte simd0 = r.AllocateLocal(kWasmS128); |
| 889 byte simd1 = r.AllocateLocal(kWasmS128); | 887 byte simd1 = r.AllocateLocal(kWasmS128); |
| 890 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(a))), | 888 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(a))), |
| 891 WASM_SET_LOCAL(simd1, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(b))), | 889 WASM_SET_LOCAL(simd1, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(b))), |
| 892 WASM_SET_LOCAL(simd1, | 890 WASM_SET_LOCAL(simd1, |
| 893 WASM_SIMD_MATERIALIZE_BOOLS( | 891 WASM_SIMD_MATERIALIZE_BOOLS( |
| 894 32x4, WASM_SIMD_BINOP(simd_op, WASM_GET_LOCAL(simd0), | 892 32x4, WASM_SIMD_BINOP(simd_op, WASM_GET_LOCAL(simd0), |
| 895 WASM_GET_LOCAL(simd1)))), | 893 WASM_GET_LOCAL(simd1)))), |
| 896 WASM_SIMD_CHECK_SPLAT4(I32x4, simd1, I32, expected), WASM_ONE); | 894 WASM_SIMD_CHECK_SPLAT4(I32x4, simd1, I32, expected), WASM_ONE); |
| 897 | 895 |
| 898 FOR_INT32_INPUTS(i) { | 896 FOR_INT32_INPUTS(i) { |
| 899 FOR_INT32_INPUTS(j) { CHECK_EQ(1, r.Call(*i, *j, expected_op(*i, *j))); } | 897 FOR_INT32_INPUTS(j) { CHECK_EQ(1, r.Call(*i, *j, expected_op(*i, *j))); } |
| 900 } | 898 } |
| 901 } | 899 } |
| 902 | 900 |
| 903 WASM_EXEC_COMPILED_TEST(I32x4Equal) { | 901 WASM_EXEC_COMPILED_TEST(I32x4Equal) { |
| 904 RunI32x4CompareOpTest(kExprI32x4Eq, Equal); | 902 RunI32x4CompareOpTest(kExprI32x4Eq, Equal); |
| 905 } | 903 } |
| 906 | 904 |
| 907 WASM_EXEC_COMPILED_TEST(I32x4NotEqual) { | 905 WASM_EXEC_COMPILED_TEST(I32x4NotEqual) { |
| 908 RunI32x4CompareOpTest(kExprI32x4Ne, NotEqual); | 906 RunI32x4CompareOpTest(kExprI32x4Ne, NotEqual); |
| 909 } | 907 } |
| 910 | 908 |
| 909 // Test Select by making a mask where the first two lanes are true and the rest |
| 910 // false, and comparing for non-equality with zero to materialize a bool vector. |
| 911 #define WASM_SIMD_SELECT_TEST(format) \ |
| 912 WASM_EXEC_COMPILED_TEST(S##format##Select) { \ |
| 913 FLAG_wasm_simd_prototype = true; \ |
| 914 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); \ |
| 915 byte val1 = 0; \ |
| 916 byte val2 = 1; \ |
| 917 byte src1 = r.AllocateLocal(kWasmS128); \ |
| 918 byte src2 = r.AllocateLocal(kWasmS128); \ |
| 919 byte zero = r.AllocateLocal(kWasmS128); \ |
| 920 byte mask = r.AllocateLocal(kWasmS128); \ |
| 921 BUILD(r, WASM_SET_LOCAL( \ |
| 922 src1, WASM_SIMD_I##format##_SPLAT(WASM_GET_LOCAL(val1))), \ |
| 923 WASM_SET_LOCAL(src2, \ |
| 924 WASM_SIMD_I##format##_SPLAT(WASM_GET_LOCAL(val2))), \ |
| 925 WASM_SET_LOCAL(zero, WASM_SIMD_I##format##_SPLAT(WASM_ZERO)), \ |
| 926 WASM_SET_LOCAL(mask, WASM_SIMD_I##format##_REPLACE_LANE( \ |
| 927 1, WASM_GET_LOCAL(zero), WASM_I32V(-1))), \ |
| 928 WASM_SET_LOCAL(mask, WASM_SIMD_I##format##_REPLACE_LANE( \ |
| 929 2, WASM_GET_LOCAL(mask), WASM_I32V(-1))), \ |
| 930 WASM_SET_LOCAL( \ |
| 931 mask, \ |
| 932 WASM_SIMD_SELECT(format, WASM_SIMD_BINOP(kExprI##format##Ne, \ |
| 933 WASM_GET_LOCAL(mask), \ |
| 934 WASM_GET_LOCAL(zero)), \ |
| 935 WASM_GET_LOCAL(src1), WASM_GET_LOCAL(src2))), \ |
| 936 WASM_SIMD_CHECK_LANE(I##format, mask, I32, val2, 0), \ |
| 937 WASM_SIMD_CHECK_LANE(I##format, mask, I32, val1, 1), \ |
| 938 WASM_SIMD_CHECK_LANE(I##format, mask, I32, val1, 2), \ |
| 939 WASM_SIMD_CHECK_LANE(I##format, mask, I32, val2, 3), WASM_ONE); \ |
| 940 \ |
| 941 CHECK_EQ(1, r.Call(0x12, 0x34)); \ |
| 942 } |
| 943 |
| 944 WASM_SIMD_SELECT_TEST(32x4) |
| 945 #endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_X64 |
| 946 |
| 947 #if V8_TARGET_ARCH_ARM |
| 911 WASM_EXEC_COMPILED_TEST(I32x4Greater) { | 948 WASM_EXEC_COMPILED_TEST(I32x4Greater) { |
| 912 RunI32x4CompareOpTest(kExprI32x4GtS, Greater); | 949 RunI32x4CompareOpTest(kExprI32x4GtS, Greater); |
| 913 } | 950 } |
| 914 | 951 |
| 915 WASM_EXEC_COMPILED_TEST(I32x4GreaterEqual) { | 952 WASM_EXEC_COMPILED_TEST(I32x4GreaterEqual) { |
| 916 RunI32x4CompareOpTest(kExprI32x4GeS, GreaterEqual); | 953 RunI32x4CompareOpTest(kExprI32x4GeS, GreaterEqual); |
| 917 } | 954 } |
| 918 | 955 |
| 919 WASM_EXEC_COMPILED_TEST(I32x4Less) { | 956 WASM_EXEC_COMPILED_TEST(I32x4Less) { |
| 920 RunI32x4CompareOpTest(kExprI32x4LtS, Less); | 957 RunI32x4CompareOpTest(kExprI32x4LtS, Less); |
| (...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1280 } | 1317 } |
| 1281 | 1318 |
| 1282 WASM_EXEC_COMPILED_TEST(I8x16ShrS) { | 1319 WASM_EXEC_COMPILED_TEST(I8x16ShrS) { |
| 1283 RunI8x16ShiftOpTest(kExprI8x16ShrS, ArithmeticShiftRight, 1); | 1320 RunI8x16ShiftOpTest(kExprI8x16ShrS, ArithmeticShiftRight, 1); |
| 1284 } | 1321 } |
| 1285 | 1322 |
| 1286 WASM_EXEC_COMPILED_TEST(I8x16ShrU) { | 1323 WASM_EXEC_COMPILED_TEST(I8x16ShrU) { |
| 1287 RunI8x16ShiftOpTest(kExprI8x16ShrU, LogicalShiftRight, 1); | 1324 RunI8x16ShiftOpTest(kExprI8x16ShrU, LogicalShiftRight, 1); |
| 1288 } | 1325 } |
| 1289 | 1326 |
| 1290 // Test Select by making a mask where the first two lanes are true and the rest | |
| 1291 // false, and comparing for non-equality with zero to materialize a bool vector. | |
| 1292 #define WASM_SIMD_SELECT_TEST(format) \ | |
| 1293 WASM_EXEC_COMPILED_TEST(S##format##Select) { \ | |
| 1294 FLAG_wasm_simd_prototype = true; \ | |
| 1295 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); \ | |
| 1296 byte val1 = 0; \ | |
| 1297 byte val2 = 1; \ | |
| 1298 byte src1 = r.AllocateLocal(kWasmS128); \ | |
| 1299 byte src2 = r.AllocateLocal(kWasmS128); \ | |
| 1300 byte zero = r.AllocateLocal(kWasmS128); \ | |
| 1301 byte mask = r.AllocateLocal(kWasmS128); \ | |
| 1302 BUILD(r, WASM_SET_LOCAL( \ | |
| 1303 src1, WASM_SIMD_I##format##_SPLAT(WASM_GET_LOCAL(val1))), \ | |
| 1304 WASM_SET_LOCAL(src2, \ | |
| 1305 WASM_SIMD_I##format##_SPLAT(WASM_GET_LOCAL(val2))), \ | |
| 1306 WASM_SET_LOCAL(zero, WASM_SIMD_I##format##_SPLAT(WASM_ZERO)), \ | |
| 1307 WASM_SET_LOCAL(mask, WASM_SIMD_I##format##_REPLACE_LANE( \ | |
| 1308 1, WASM_GET_LOCAL(zero), WASM_I32V(-1))), \ | |
| 1309 WASM_SET_LOCAL(mask, WASM_SIMD_I##format##_REPLACE_LANE( \ | |
| 1310 2, WASM_GET_LOCAL(mask), WASM_I32V(-1))), \ | |
| 1311 WASM_SET_LOCAL( \ | |
| 1312 mask, \ | |
| 1313 WASM_SIMD_SELECT(format, WASM_SIMD_BINOP(kExprI##format##Ne, \ | |
| 1314 WASM_GET_LOCAL(mask), \ | |
| 1315 WASM_GET_LOCAL(zero)), \ | |
| 1316 WASM_GET_LOCAL(src1), WASM_GET_LOCAL(src2))), \ | |
| 1317 WASM_SIMD_CHECK_LANE(I##format, mask, I32, val2, 0), \ | |
| 1318 WASM_SIMD_CHECK_LANE(I##format, mask, I32, val1, 1), \ | |
| 1319 WASM_SIMD_CHECK_LANE(I##format, mask, I32, val1, 2), \ | |
| 1320 WASM_SIMD_CHECK_LANE(I##format, mask, I32, val2, 3), WASM_ONE); \ | |
| 1321 \ | |
| 1322 CHECK_EQ(1, r.Call(0x12, 0x34)); \ | |
| 1323 } | |
| 1324 | |
| 1325 WASM_SIMD_SELECT_TEST(32x4) | |
| 1326 WASM_SIMD_SELECT_TEST(16x8) | 1327 WASM_SIMD_SELECT_TEST(16x8) |
| 1327 WASM_SIMD_SELECT_TEST(8x16) | 1328 WASM_SIMD_SELECT_TEST(8x16) |
| 1328 #endif // V8_TARGET_ARCH_ARM | 1329 #endif // V8_TARGET_ARCH_ARM |
| 1329 | 1330 |
| 1330 #if V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET | 1331 #if V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET |
| 1331 WASM_EXEC_COMPILED_TEST(SimdI32x4ExtractWithF32x4) { | 1332 WASM_EXEC_COMPILED_TEST(SimdI32x4ExtractWithF32x4) { |
| 1332 FLAG_wasm_simd_prototype = true; | 1333 FLAG_wasm_simd_prototype = true; |
| 1333 WasmRunner<int32_t> r(kExecuteCompiled); | 1334 WasmRunner<int32_t> r(kExecuteCompiled); |
| 1334 BUILD(r, WASM_IF_ELSE_I( | 1335 BUILD(r, WASM_IF_ELSE_I( |
| 1335 WASM_I32_EQ(WASM_SIMD_I32x4_EXTRACT_LANE( | 1336 WASM_I32_EQ(WASM_SIMD_I32x4_EXTRACT_LANE( |
| (...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1551 WASM_SET_GLOBAL(0, WASM_SIMD_F32x4_REPLACE_LANE(3, WASM_GET_GLOBAL(0), | 1552 WASM_SET_GLOBAL(0, WASM_SIMD_F32x4_REPLACE_LANE(3, WASM_GET_GLOBAL(0), |
| 1552 WASM_F32(65.0))), | 1553 WASM_F32(65.0))), |
| 1553 WASM_I32V(1)); | 1554 WASM_I32V(1)); |
| 1554 FOR_INT32_INPUTS(i) { CHECK_EQ(1, r.Call(0)); } | 1555 FOR_INT32_INPUTS(i) { CHECK_EQ(1, r.Call(0)); } |
| 1555 CHECK_EQ(*global, 13.5); | 1556 CHECK_EQ(*global, 13.5); |
| 1556 CHECK_EQ(*(global + 1), 45.5); | 1557 CHECK_EQ(*(global + 1), 45.5); |
| 1557 CHECK_EQ(*(global + 2), 32.25); | 1558 CHECK_EQ(*(global + 2), 32.25); |
| 1558 CHECK_EQ(*(global + 3), 65.0); | 1559 CHECK_EQ(*(global + 3), 65.0); |
| 1559 } | 1560 } |
| 1560 #endif // SIMD_LOWERING_TARGET | 1561 #endif // SIMD_LOWERING_TARGET |
| OLD | NEW |