| 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 943 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 954 | 954 |
| 955 FOR_INT32_INPUTS(i) { | 955 FOR_INT32_INPUTS(i) { |
| 956 FOR_INT32_INPUTS(j) { CHECK_EQ(1, r.Call(*i, *j, expected_op(*i, *j))); } | 956 FOR_INT32_INPUTS(j) { CHECK_EQ(1, r.Call(*i, *j, expected_op(*i, *j))); } |
| 957 } | 957 } |
| 958 } | 958 } |
| 959 | 959 |
| 960 WASM_EXEC_COMPILED_TEST(I32x4Add) { RunI32x4BinOpTest(kExprI32x4Add, Add); } | 960 WASM_EXEC_COMPILED_TEST(I32x4Add) { RunI32x4BinOpTest(kExprI32x4Add, Add); } |
| 961 | 961 |
| 962 WASM_EXEC_COMPILED_TEST(I32x4Sub) { RunI32x4BinOpTest(kExprI32x4Sub, Sub); } | 962 WASM_EXEC_COMPILED_TEST(I32x4Sub) { RunI32x4BinOpTest(kExprI32x4Sub, Sub); } |
| 963 | 963 |
| 964 #if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_X64 || SIMD_LOWERING_TARGET | 964 #if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_X64 || SIMD_LOWERING_TARGET || \ |
| 965 V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64 |
| 965 WASM_EXEC_COMPILED_TEST(I32x4Mul) { RunI32x4BinOpTest(kExprI32x4Mul, Mul); } | 966 WASM_EXEC_COMPILED_TEST(I32x4Mul) { RunI32x4BinOpTest(kExprI32x4Mul, Mul); } |
| 966 #endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_X64 || SIMD_LOWERING_TARGET | 967 #endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_X64 || SIMD_LOWERING_TARGET || |
| 968 // V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64 |
| 967 | 969 |
| 968 #if V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET | 970 #if V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET |
| 969 WASM_EXEC_COMPILED_TEST(S128And) { RunI32x4BinOpTest(kExprS128And, And); } | 971 WASM_EXEC_COMPILED_TEST(S128And) { RunI32x4BinOpTest(kExprS128And, And); } |
| 970 | 972 |
| 971 WASM_EXEC_COMPILED_TEST(S128Or) { RunI32x4BinOpTest(kExprS128Or, Or); } | 973 WASM_EXEC_COMPILED_TEST(S128Or) { RunI32x4BinOpTest(kExprS128Or, Or); } |
| 972 | 974 |
| 973 WASM_EXEC_COMPILED_TEST(S128Xor) { RunI32x4BinOpTest(kExprS128Xor, Xor); } | 975 WASM_EXEC_COMPILED_TEST(S128Xor) { RunI32x4BinOpTest(kExprS128Xor, Xor); } |
| 974 #endif // V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET | 976 #endif // V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET |
| 975 | 977 |
| 976 #if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_X64 || SIMD_LOWERING_TARGET | 978 #if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_X64 || SIMD_LOWERING_TARGET || \ |
| 979 V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64 |
| 977 WASM_EXEC_COMPILED_TEST(I32x4Min) { | 980 WASM_EXEC_COMPILED_TEST(I32x4Min) { |
| 978 RunI32x4BinOpTest(kExprI32x4MinS, Minimum); | 981 RunI32x4BinOpTest(kExprI32x4MinS, Minimum); |
| 979 } | 982 } |
| 980 | 983 |
| 981 WASM_EXEC_COMPILED_TEST(I32x4MaxS) { | 984 WASM_EXEC_COMPILED_TEST(I32x4MaxS) { |
| 982 RunI32x4BinOpTest(kExprI32x4MaxS, Maximum); | 985 RunI32x4BinOpTest(kExprI32x4MaxS, Maximum); |
| 983 } | 986 } |
| 984 | 987 |
| 985 WASM_EXEC_COMPILED_TEST(I32x4MinU) { | 988 WASM_EXEC_COMPILED_TEST(I32x4MinU) { |
| 986 RunI32x4BinOpTest(kExprI32x4MinU, UnsignedMinimum); | 989 RunI32x4BinOpTest(kExprI32x4MinU, UnsignedMinimum); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 1009 FOR_INT32_INPUTS(i) { | 1012 FOR_INT32_INPUTS(i) { |
| 1010 FOR_INT32_INPUTS(j) { CHECK_EQ(1, r.Call(*i, *j, expected_op(*i, *j))); } | 1013 FOR_INT32_INPUTS(j) { CHECK_EQ(1, r.Call(*i, *j, expected_op(*i, *j))); } |
| 1011 } | 1014 } |
| 1012 } | 1015 } |
| 1013 | 1016 |
| 1014 WASM_EXEC_COMPILED_TEST(I32x4Eq) { RunI32x4CompareOpTest(kExprI32x4Eq, Equal); } | 1017 WASM_EXEC_COMPILED_TEST(I32x4Eq) { RunI32x4CompareOpTest(kExprI32x4Eq, Equal); } |
| 1015 | 1018 |
| 1016 WASM_EXEC_COMPILED_TEST(I32x4Ne) { | 1019 WASM_EXEC_COMPILED_TEST(I32x4Ne) { |
| 1017 RunI32x4CompareOpTest(kExprI32x4Ne, NotEqual); | 1020 RunI32x4CompareOpTest(kExprI32x4Ne, NotEqual); |
| 1018 } | 1021 } |
| 1019 #endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_X64 || SIMD_LOWERING_TARGET | 1022 #endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_X64 || SIMD_LOWERING_TARGET || |
| 1023 // V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64 |
| 1020 | 1024 |
| 1021 #if V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET | 1025 #if V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET |
| 1022 WASM_EXEC_COMPILED_TEST(I32x4LtS) { | 1026 WASM_EXEC_COMPILED_TEST(I32x4LtS) { |
| 1023 RunI32x4CompareOpTest(kExprI32x4LtS, Less); | 1027 RunI32x4CompareOpTest(kExprI32x4LtS, Less); |
| 1024 } | 1028 } |
| 1025 | 1029 |
| 1026 WASM_EXEC_COMPILED_TEST(I32x4LeS) { | 1030 WASM_EXEC_COMPILED_TEST(I32x4LeS) { |
| 1027 RunI32x4CompareOpTest(kExprI32x4LeS, LessEqual); | 1031 RunI32x4CompareOpTest(kExprI32x4LeS, LessEqual); |
| 1028 } | 1032 } |
| 1029 | 1033 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1045 | 1049 |
| 1046 WASM_EXEC_COMPILED_TEST(I32x4GtU) { | 1050 WASM_EXEC_COMPILED_TEST(I32x4GtU) { |
| 1047 RunI32x4CompareOpTest(kExprI32x4GtU, UnsignedGreater); | 1051 RunI32x4CompareOpTest(kExprI32x4GtU, UnsignedGreater); |
| 1048 } | 1052 } |
| 1049 | 1053 |
| 1050 WASM_EXEC_COMPILED_TEST(I32x4GeU) { | 1054 WASM_EXEC_COMPILED_TEST(I32x4GeU) { |
| 1051 RunI32x4CompareOpTest(kExprI32x4GeU, UnsignedGreaterEqual); | 1055 RunI32x4CompareOpTest(kExprI32x4GeU, UnsignedGreaterEqual); |
| 1052 } | 1056 } |
| 1053 #endif // V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET | 1057 #endif // V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET |
| 1054 | 1058 |
| 1055 #if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_X64 || SIMD_LOWERING_TARGET | 1059 #if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_X64 || SIMD_LOWERING_TARGET || \ |
| 1060 V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64 |
| 1056 void RunI32x4ShiftOpTest(WasmOpcode simd_op, Int32ShiftOp expected_op, | 1061 void RunI32x4ShiftOpTest(WasmOpcode simd_op, Int32ShiftOp expected_op, |
| 1057 int shift) { | 1062 int shift) { |
| 1058 FLAG_wasm_simd_prototype = true; | 1063 FLAG_wasm_simd_prototype = true; |
| 1059 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); | 1064 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); |
| 1060 byte a = 0; | 1065 byte a = 0; |
| 1061 byte expected = 1; | 1066 byte expected = 1; |
| 1062 byte simd = r.AllocateLocal(kWasmS128); | 1067 byte simd = r.AllocateLocal(kWasmS128); |
| 1063 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(a))), | 1068 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(a))), |
| 1064 WASM_SET_LOCAL( | 1069 WASM_SET_LOCAL( |
| 1065 simd, WASM_SIMD_SHIFT_OP(simd_op, shift, WASM_GET_LOCAL(simd))), | 1070 simd, WASM_SIMD_SHIFT_OP(simd_op, shift, WASM_GET_LOCAL(simd))), |
| 1066 WASM_SIMD_CHECK_SPLAT4(I32x4, simd, I32, expected), WASM_ONE); | 1071 WASM_SIMD_CHECK_SPLAT4(I32x4, simd, I32, expected), WASM_ONE); |
| 1067 | 1072 |
| 1068 FOR_INT32_INPUTS(i) { CHECK_EQ(1, r.Call(*i, expected_op(*i, shift))); } | 1073 FOR_INT32_INPUTS(i) { CHECK_EQ(1, r.Call(*i, expected_op(*i, shift))); } |
| 1069 } | 1074 } |
| 1070 | 1075 |
| 1071 WASM_EXEC_COMPILED_TEST(I32x4Shl) { | 1076 WASM_EXEC_COMPILED_TEST(I32x4Shl) { |
| 1072 RunI32x4ShiftOpTest(kExprI32x4Shl, LogicalShiftLeft, 1); | 1077 RunI32x4ShiftOpTest(kExprI32x4Shl, LogicalShiftLeft, 1); |
| 1073 } | 1078 } |
| 1074 | 1079 |
| 1075 WASM_EXEC_COMPILED_TEST(I32x4ShrS) { | 1080 WASM_EXEC_COMPILED_TEST(I32x4ShrS) { |
| 1076 RunI32x4ShiftOpTest(kExprI32x4ShrS, ArithmeticShiftRight, 1); | 1081 RunI32x4ShiftOpTest(kExprI32x4ShrS, ArithmeticShiftRight, 1); |
| 1077 } | 1082 } |
| 1078 | 1083 |
| 1079 WASM_EXEC_COMPILED_TEST(I32x4ShrU) { | 1084 WASM_EXEC_COMPILED_TEST(I32x4ShrU) { |
| 1080 RunI32x4ShiftOpTest(kExprI32x4ShrU, LogicalShiftRight, 1); | 1085 RunI32x4ShiftOpTest(kExprI32x4ShrU, LogicalShiftRight, 1); |
| 1081 } | 1086 } |
| 1082 #endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_X64 || SIMD_LOWERING_TARGET | 1087 #endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_X64 || SIMD_LOWERING_TARGET || |
| 1088 // V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64 |
| 1083 | 1089 |
| 1084 #if V8_TARGET_ARCH_ARM | 1090 #if V8_TARGET_ARCH_ARM |
| 1085 void RunI16x8UnOpTest(WasmOpcode simd_op, Int16UnOp expected_op) { | 1091 void RunI16x8UnOpTest(WasmOpcode simd_op, Int16UnOp expected_op) { |
| 1086 FLAG_wasm_simd_prototype = true; | 1092 FLAG_wasm_simd_prototype = true; |
| 1087 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); | 1093 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); |
| 1088 byte a = 0; | 1094 byte a = 0; |
| 1089 byte expected = 1; | 1095 byte expected = 1; |
| 1090 byte simd = r.AllocateLocal(kWasmS128); | 1096 byte simd = r.AllocateLocal(kWasmS128); |
| 1091 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I16x8_SPLAT(WASM_GET_LOCAL(a))), | 1097 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I16x8_SPLAT(WASM_GET_LOCAL(a))), |
| 1092 WASM_SET_LOCAL(simd, WASM_SIMD_UNOP(simd_op, WASM_GET_LOCAL(simd))), | 1098 WASM_SET_LOCAL(simd, WASM_SIMD_UNOP(simd_op, WASM_GET_LOCAL(simd))), |
| (...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1392 | 1398 |
| 1393 WASM_EXEC_COMPILED_TEST(I8x16ShrS) { | 1399 WASM_EXEC_COMPILED_TEST(I8x16ShrS) { |
| 1394 RunI8x16ShiftOpTest(kExprI8x16ShrS, ArithmeticShiftRight, 1); | 1400 RunI8x16ShiftOpTest(kExprI8x16ShrS, ArithmeticShiftRight, 1); |
| 1395 } | 1401 } |
| 1396 | 1402 |
| 1397 WASM_EXEC_COMPILED_TEST(I8x16ShrU) { | 1403 WASM_EXEC_COMPILED_TEST(I8x16ShrU) { |
| 1398 RunI8x16ShiftOpTest(kExprI8x16ShrU, LogicalShiftRight, 1); | 1404 RunI8x16ShiftOpTest(kExprI8x16ShrU, LogicalShiftRight, 1); |
| 1399 } | 1405 } |
| 1400 #endif // V8_TARGET_ARCH_ARM | 1406 #endif // V8_TARGET_ARCH_ARM |
| 1401 | 1407 |
| 1402 #if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_X64 | 1408 #if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_MIPS || \ |
| 1409 V8_TARGET_ARCH_MIPS64 |
| 1403 // Test Select by making a mask where the first two lanes are true and the rest | 1410 // Test Select by making a mask where the first two lanes are true and the rest |
| 1404 // false, and comparing for non-equality with zero to materialize a bool vector. | 1411 // false, and comparing for non-equality with zero to materialize a bool vector. |
| 1405 #define WASM_SIMD_SELECT_TEST(format) \ | 1412 #define WASM_SIMD_SELECT_TEST(format) \ |
| 1406 WASM_EXEC_COMPILED_TEST(S##format##Select) { \ | 1413 WASM_EXEC_COMPILED_TEST(S##format##Select) { \ |
| 1407 FLAG_wasm_simd_prototype = true; \ | 1414 FLAG_wasm_simd_prototype = true; \ |
| 1408 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); \ | 1415 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); \ |
| 1409 byte val1 = 0; \ | 1416 byte val1 = 0; \ |
| 1410 byte val2 = 1; \ | 1417 byte val2 = 1; \ |
| 1411 byte src1 = r.AllocateLocal(kWasmS128); \ | 1418 byte src1 = r.AllocateLocal(kWasmS128); \ |
| 1412 byte src2 = r.AllocateLocal(kWasmS128); \ | 1419 byte src2 = r.AllocateLocal(kWasmS128); \ |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1429 WASM_GET_LOCAL(src1), WASM_GET_LOCAL(src2))), \ | 1436 WASM_GET_LOCAL(src1), WASM_GET_LOCAL(src2))), \ |
| 1430 WASM_SIMD_CHECK_LANE(I##format, mask, I32, val2, 0), \ | 1437 WASM_SIMD_CHECK_LANE(I##format, mask, I32, val2, 0), \ |
| 1431 WASM_SIMD_CHECK_LANE(I##format, mask, I32, val1, 1), \ | 1438 WASM_SIMD_CHECK_LANE(I##format, mask, I32, val1, 1), \ |
| 1432 WASM_SIMD_CHECK_LANE(I##format, mask, I32, val1, 2), \ | 1439 WASM_SIMD_CHECK_LANE(I##format, mask, I32, val1, 2), \ |
| 1433 WASM_SIMD_CHECK_LANE(I##format, mask, I32, val2, 3), WASM_ONE); \ | 1440 WASM_SIMD_CHECK_LANE(I##format, mask, I32, val2, 3), WASM_ONE); \ |
| 1434 \ | 1441 \ |
| 1435 CHECK_EQ(1, r.Call(0x12, 0x34)); \ | 1442 CHECK_EQ(1, r.Call(0x12, 0x34)); \ |
| 1436 } | 1443 } |
| 1437 | 1444 |
| 1438 WASM_SIMD_SELECT_TEST(32x4) | 1445 WASM_SIMD_SELECT_TEST(32x4) |
| 1439 #endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_X64 | 1446 #endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_MIPS || |
| 1447 // V8_TARGET_ARCH_MIPS64 |
| 1440 | 1448 |
| 1441 #if V8_TARGET_ARCH_ARM | 1449 #if V8_TARGET_ARCH_ARM |
| 1442 WASM_SIMD_SELECT_TEST(16x8) | 1450 WASM_SIMD_SELECT_TEST(16x8) |
| 1443 WASM_SIMD_SELECT_TEST(8x16) | 1451 WASM_SIMD_SELECT_TEST(8x16) |
| 1444 | 1452 |
| 1445 // Boolean unary operations are 'AllTrue' and 'AnyTrue', which return an integer | 1453 // Boolean unary operations are 'AllTrue' and 'AnyTrue', which return an integer |
| 1446 // result. Use relational ops on numeric vectors to create the boolean vector | 1454 // result. Use relational ops on numeric vectors to create the boolean vector |
| 1447 // test inputs. Test inputs with all true, all false, one true, and one false. | 1455 // test inputs. Test inputs with all true, all false, one true, and one false. |
| 1448 #define WASM_SIMD_BOOL_REDUCTION_TEST(format, lanes) \ | 1456 #define WASM_SIMD_BOOL_REDUCTION_TEST(format, lanes) \ |
| 1449 WASM_EXEC_TEST(ReductionTest##lanes) { \ | 1457 WASM_EXEC_TEST(ReductionTest##lanes) { \ |
| (...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1860 WASM_SIMD_I32x4_EXTRACT_LANE( | 1868 WASM_SIMD_I32x4_EXTRACT_LANE( |
| 1861 0, WASM_LOAD_MEM(MachineType::Simd128(), WASM_ZERO))); | 1869 0, WASM_LOAD_MEM(MachineType::Simd128(), WASM_ZERO))); |
| 1862 | 1870 |
| 1863 FOR_INT32_INPUTS(i) { | 1871 FOR_INT32_INPUTS(i) { |
| 1864 int32_t expected = *i; | 1872 int32_t expected = *i; |
| 1865 r.module().WriteMemory(&memory[0], expected); | 1873 r.module().WriteMemory(&memory[0], expected); |
| 1866 CHECK_EQ(expected, r.Call()); | 1874 CHECK_EQ(expected, r.Call()); |
| 1867 } | 1875 } |
| 1868 } | 1876 } |
| 1869 #endif // V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET | 1877 #endif // V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET |
| OLD | NEW |