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 10 matching lines...) Expand all Loading... |
21 typedef int32_t (*Int32UnOp)(int32_t); | 21 typedef int32_t (*Int32UnOp)(int32_t); |
22 typedef int32_t (*Int32BinOp)(int32_t, int32_t); | 22 typedef int32_t (*Int32BinOp)(int32_t, int32_t); |
23 typedef int32_t (*Int32ShiftOp)(int32_t, int); | 23 typedef int32_t (*Int32ShiftOp)(int32_t, int); |
24 typedef int16_t (*Int16UnOp)(int16_t); | 24 typedef int16_t (*Int16UnOp)(int16_t); |
25 typedef int16_t (*Int16BinOp)(int16_t, int16_t); | 25 typedef int16_t (*Int16BinOp)(int16_t, int16_t); |
26 typedef int16_t (*Int16ShiftOp)(int16_t, int); | 26 typedef int16_t (*Int16ShiftOp)(int16_t, int); |
27 typedef int8_t (*Int8UnOp)(int8_t); | 27 typedef int8_t (*Int8UnOp)(int8_t); |
28 typedef int8_t (*Int8BinOp)(int8_t, int8_t); | 28 typedef int8_t (*Int8BinOp)(int8_t, int8_t); |
29 typedef int8_t (*Int8ShiftOp)(int8_t, int); | 29 typedef int8_t (*Int8ShiftOp)(int8_t, int); |
30 | 30 |
31 #if V8_TARGET_ARCH_ARM | 31 #if !V8_TARGET_ARCH_ARM && !V8_TARGET_ARCH_X64 |
32 // Floating point specific value functions, only used by ARM so far. | 32 #define SIMD_LOWERING_TARGET 1 |
| 33 #else |
| 34 #define SIMD_LOWERING_TARGET 0 |
| 35 #endif // !V8_TARGET_ARCH_ARM && !V8_TARGET_ARCH_X64 |
| 36 |
| 37 #if V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET |
33 int32_t Equal(float a, float b) { return a == b ? 1 : 0; } | 38 int32_t Equal(float a, float b) { return a == b ? 1 : 0; } |
34 | 39 |
35 int32_t NotEqual(float a, float b) { return a != b ? 1 : 0; } | 40 int32_t NotEqual(float a, float b) { return a != b ? 1 : 0; } |
36 #endif // V8_TARGET_ARCH_ARM | 41 #endif // V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET |
| 42 |
| 43 #if SIMD_LOWERING_TARGET |
| 44 int32_t Less(float a, float b) { return a < b ? 1 : 0; } |
| 45 |
| 46 int32_t LessEqual(float a, float b) { return a <= b ? 1 : 0; } |
| 47 |
| 48 int32_t Greater(float a, float b) { return a > b ? 1 : 0; } |
| 49 |
| 50 int32_t GreaterEqual(float a, float b) { return a >= b ? 1 : 0; } |
| 51 #endif // SIMD_LOWERING_TARGET |
37 | 52 |
38 // Generic expected value functions. | 53 // Generic expected value functions. |
39 template <typename T> | 54 template <typename T> |
40 T Negate(T a) { | 55 T Negate(T a) { |
41 return -a; | 56 return -a; |
42 } | 57 } |
43 | 58 |
44 template <typename T> | 59 template <typename T> |
45 T Add(T a, T b) { | 60 T Add(T a, T b) { |
46 return a + b; | 61 return a + b; |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
217 return a == 0 ? 1 : 0; | 232 return a == 0 ? 1 : 0; |
218 } | 233 } |
219 | 234 |
220 template <typename T> | 235 template <typename T> |
221 T Sqrt(T a) { | 236 T Sqrt(T a) { |
222 return std::sqrt(a); | 237 return std::sqrt(a); |
223 } | 238 } |
224 | 239 |
225 } // namespace | 240 } // namespace |
226 | 241 |
227 #if !V8_TARGET_ARCH_ARM && !V8_TARGET_ARCH_X64 | |
228 #define SIMD_LOWERING_TARGET 1 | |
229 #else | |
230 #define SIMD_LOWERING_TARGET 0 | |
231 #endif // !V8_TARGET_ARCH_ARM && !V8_TARGET_ARCH_X64 | |
232 | |
233 #define WASM_SIMD_CHECK_LANE(TYPE, value, LANE_TYPE, lane_value, lane_index) \ | 242 #define WASM_SIMD_CHECK_LANE(TYPE, value, LANE_TYPE, lane_value, lane_index) \ |
234 WASM_IF(WASM_##LANE_TYPE##_NE(WASM_GET_LOCAL(lane_value), \ | 243 WASM_IF(WASM_##LANE_TYPE##_NE(WASM_GET_LOCAL(lane_value), \ |
235 WASM_SIMD_##TYPE##_EXTRACT_LANE( \ | 244 WASM_SIMD_##TYPE##_EXTRACT_LANE( \ |
236 lane_index, WASM_GET_LOCAL(value))), \ | 245 lane_index, WASM_GET_LOCAL(value))), \ |
237 WASM_RETURN1(WASM_ZERO)) | 246 WASM_RETURN1(WASM_ZERO)) |
238 | 247 |
239 #define WASM_SIMD_CHECK_F32_LANE(value, lane_value, lane_index) \ | 248 #define WASM_SIMD_CHECK_F32_LANE(value, lane_value, lane_index) \ |
240 WASM_IF(WASM_F32_NE(WASM_GET_LOCAL(lane_value), \ | 249 WASM_IF(WASM_F32_NE(WASM_GET_LOCAL(lane_value), \ |
241 WASM_SIMD_F32x4_EXTRACT_LANE(lane_index, \ | 250 WASM_SIMD_F32x4_EXTRACT_LANE(lane_index, \ |
242 WASM_GET_LOCAL(value))), \ | 251 WASM_GET_LOCAL(value))), \ |
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
485 WASM_EXEC_COMPILED_TEST(F32x4Mul) { RunF32x4BinOpTest(kExprF32x4Mul, Mul); } | 494 WASM_EXEC_COMPILED_TEST(F32x4Mul) { RunF32x4BinOpTest(kExprF32x4Mul, Mul); } |
486 WASM_EXEC_COMPILED_TEST(F32x4Div) { RunF32x4BinOpTest(kExprF32x4Div, Div); } | 495 WASM_EXEC_COMPILED_TEST(F32x4Div) { RunF32x4BinOpTest(kExprF32x4Div, Div); } |
487 WASM_EXEC_COMPILED_TEST(Simd_F32x4_Min) { | 496 WASM_EXEC_COMPILED_TEST(Simd_F32x4_Min) { |
488 RunF32x4BinOpTest(kExprF32x4Min, Minimum); | 497 RunF32x4BinOpTest(kExprF32x4Min, Minimum); |
489 } | 498 } |
490 WASM_EXEC_COMPILED_TEST(Simd_F32x4_Max) { | 499 WASM_EXEC_COMPILED_TEST(Simd_F32x4_Max) { |
491 RunF32x4BinOpTest(kExprF32x4Max, Maximum); | 500 RunF32x4BinOpTest(kExprF32x4Max, Maximum); |
492 } | 501 } |
493 #endif // SIMD_LOWERING_TARGET | 502 #endif // SIMD_LOWERING_TARGET |
494 | 503 |
495 #if V8_TARGET_ARCH_ARM | 504 #if V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET |
496 void RunF32x4CompareOpTest(WasmOpcode simd_op, FloatCompareOp expected_op) { | 505 void RunF32x4CompareOpTest(WasmOpcode simd_op, FloatCompareOp expected_op) { |
497 FLAG_wasm_simd_prototype = true; | 506 FLAG_wasm_simd_prototype = true; |
498 WasmRunner<int32_t, float, float, int32_t> r(kExecuteCompiled); | 507 WasmRunner<int32_t, float, float, int32_t> r(kExecuteCompiled); |
499 byte a = 0; | 508 byte a = 0; |
500 byte b = 1; | 509 byte b = 1; |
501 byte expected = 2; | 510 byte expected = 2; |
502 byte simd0 = r.AllocateLocal(kWasmS128); | 511 byte simd0 = r.AllocateLocal(kWasmS128); |
503 byte simd1 = r.AllocateLocal(kWasmS128); | 512 byte simd1 = r.AllocateLocal(kWasmS128); |
504 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(a))), | 513 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(a))), |
505 WASM_SET_LOCAL(simd1, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(b))), | 514 WASM_SET_LOCAL(simd1, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(b))), |
(...skipping 14 matching lines...) Expand all Loading... |
520 } | 529 } |
521 } | 530 } |
522 | 531 |
523 WASM_EXEC_COMPILED_TEST(F32x4Equal) { | 532 WASM_EXEC_COMPILED_TEST(F32x4Equal) { |
524 RunF32x4CompareOpTest(kExprF32x4Eq, Equal); | 533 RunF32x4CompareOpTest(kExprF32x4Eq, Equal); |
525 } | 534 } |
526 | 535 |
527 WASM_EXEC_COMPILED_TEST(F32x4NotEqual) { | 536 WASM_EXEC_COMPILED_TEST(F32x4NotEqual) { |
528 RunF32x4CompareOpTest(kExprF32x4Ne, NotEqual); | 537 RunF32x4CompareOpTest(kExprF32x4Ne, NotEqual); |
529 } | 538 } |
530 #endif // V8_TARGET_ARCH_ARM | 539 #endif // V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET |
| 540 |
| 541 #if SIMD_LOWERING_TARGET |
| 542 WASM_EXEC_COMPILED_TEST(F32x4LessThan) { |
| 543 RunF32x4CompareOpTest(kExprF32x4Lt, Less); |
| 544 } |
| 545 WASM_EXEC_COMPILED_TEST(F32x4LessThanOrEqual) { |
| 546 RunF32x4CompareOpTest(kExprF32x4Le, LessEqual); |
| 547 } |
| 548 WASM_EXEC_COMPILED_TEST(F32x4GreaterThan) { |
| 549 RunF32x4CompareOpTest(kExprF32x4Gt, Greater); |
| 550 } |
| 551 WASM_EXEC_COMPILED_TEST(F32x4GreaterThanOrEqual) { |
| 552 RunF32x4CompareOpTest(kExprF32x4Ge, GreaterEqual); |
| 553 } |
| 554 #endif // SIMD_LOWERING_TARGET |
531 | 555 |
532 WASM_EXEC_COMPILED_TEST(I32x4Splat) { | 556 WASM_EXEC_COMPILED_TEST(I32x4Splat) { |
533 FLAG_wasm_simd_prototype = true; | 557 FLAG_wasm_simd_prototype = true; |
534 | 558 |
535 // Store SIMD value in a local variable, use extract lane to check lane values | 559 // Store SIMD value in a local variable, use extract lane to check lane values |
536 // This test is not a test for ExtractLane as Splat does not create | 560 // This test is not a test for ExtractLane as Splat does not create |
537 // interesting SIMD values. | 561 // interesting SIMD values. |
538 // | 562 // |
539 // SetLocal(1, I32x4Splat(Local(0))); | 563 // SetLocal(1, I32x4Splat(Local(0))); |
540 // For each lane index | 564 // For each lane index |
(...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
887 RunI32x4BinOpTest(kExprI32x4MaxS, Maximum); | 911 RunI32x4BinOpTest(kExprI32x4MaxS, Maximum); |
888 } | 912 } |
889 | 913 |
890 WASM_EXEC_COMPILED_TEST(Ui32x4Min) { | 914 WASM_EXEC_COMPILED_TEST(Ui32x4Min) { |
891 RunI32x4BinOpTest(kExprI32x4MinU, UnsignedMinimum); | 915 RunI32x4BinOpTest(kExprI32x4MinU, UnsignedMinimum); |
892 } | 916 } |
893 | 917 |
894 WASM_EXEC_COMPILED_TEST(Ui32x4Max) { | 918 WASM_EXEC_COMPILED_TEST(Ui32x4Max) { |
895 RunI32x4BinOpTest(kExprI32x4MaxU, UnsignedMaximum); | 919 RunI32x4BinOpTest(kExprI32x4MaxU, UnsignedMaximum); |
896 } | 920 } |
897 #endif // V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET | |
898 | 921 |
899 #if V8_TARGET_ARCH_ARM | |
900 void RunI32x4CompareOpTest(WasmOpcode simd_op, Int32BinOp expected_op) { | 922 void RunI32x4CompareOpTest(WasmOpcode simd_op, Int32BinOp expected_op) { |
901 FLAG_wasm_simd_prototype = true; | 923 FLAG_wasm_simd_prototype = true; |
902 WasmRunner<int32_t, int32_t, int32_t, int32_t> r(kExecuteCompiled); | 924 WasmRunner<int32_t, int32_t, int32_t, int32_t> r(kExecuteCompiled); |
903 byte a = 0; | 925 byte a = 0; |
904 byte b = 1; | 926 byte b = 1; |
905 byte expected = 2; | 927 byte expected = 2; |
906 byte simd0 = r.AllocateLocal(kWasmS128); | 928 byte simd0 = r.AllocateLocal(kWasmS128); |
907 byte simd1 = r.AllocateLocal(kWasmS128); | 929 byte simd1 = r.AllocateLocal(kWasmS128); |
908 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(a))), | 930 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(a))), |
909 WASM_SET_LOCAL(simd1, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(b))), | 931 WASM_SET_LOCAL(simd1, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(b))), |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
950 RunI32x4CompareOpTest(kExprI32x4GeU, UnsignedGreaterEqual); | 972 RunI32x4CompareOpTest(kExprI32x4GeU, UnsignedGreaterEqual); |
951 } | 973 } |
952 | 974 |
953 WASM_EXEC_COMPILED_TEST(Ui32x4Less) { | 975 WASM_EXEC_COMPILED_TEST(Ui32x4Less) { |
954 RunI32x4CompareOpTest(kExprI32x4LtU, UnsignedLess); | 976 RunI32x4CompareOpTest(kExprI32x4LtU, UnsignedLess); |
955 } | 977 } |
956 | 978 |
957 WASM_EXEC_COMPILED_TEST(Ui32x4LessEqual) { | 979 WASM_EXEC_COMPILED_TEST(Ui32x4LessEqual) { |
958 RunI32x4CompareOpTest(kExprI32x4LeU, UnsignedLessEqual); | 980 RunI32x4CompareOpTest(kExprI32x4LeU, UnsignedLessEqual); |
959 } | 981 } |
960 #endif // V8_TARGET_ARCH_ARM | |
961 | 982 |
962 #if V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET | |
963 void RunI32x4ShiftOpTest(WasmOpcode simd_op, Int32ShiftOp expected_op, | 983 void RunI32x4ShiftOpTest(WasmOpcode simd_op, Int32ShiftOp expected_op, |
964 int shift) { | 984 int shift) { |
965 FLAG_wasm_simd_prototype = true; | 985 FLAG_wasm_simd_prototype = true; |
966 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); | 986 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); |
967 byte a = 0; | 987 byte a = 0; |
968 byte expected = 1; | 988 byte expected = 1; |
969 byte simd = r.AllocateLocal(kWasmS128); | 989 byte simd = r.AllocateLocal(kWasmS128); |
970 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(a))), | 990 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(a))), |
971 WASM_SET_LOCAL( | 991 WASM_SET_LOCAL( |
972 simd, WASM_SIMD_SHIFT_OP(simd_op, shift, WASM_GET_LOCAL(simd))), | 992 simd, WASM_SIMD_SHIFT_OP(simd_op, shift, WASM_GET_LOCAL(simd))), |
(...skipping 779 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1752 WASM_SET_GLOBAL(0, WASM_SIMD_F32x4_REPLACE_LANE(3, WASM_GET_GLOBAL(0), | 1772 WASM_SET_GLOBAL(0, WASM_SIMD_F32x4_REPLACE_LANE(3, WASM_GET_GLOBAL(0), |
1753 WASM_F32(65.0))), | 1773 WASM_F32(65.0))), |
1754 WASM_I32V(1)); | 1774 WASM_I32V(1)); |
1755 FOR_INT32_INPUTS(i) { CHECK_EQ(1, r.Call(0)); } | 1775 FOR_INT32_INPUTS(i) { CHECK_EQ(1, r.Call(0)); } |
1756 CHECK_EQ(*global, 13.5); | 1776 CHECK_EQ(*global, 13.5); |
1757 CHECK_EQ(*(global + 1), 45.5); | 1777 CHECK_EQ(*(global + 1), 45.5); |
1758 CHECK_EQ(*(global + 2), 32.25); | 1778 CHECK_EQ(*(global + 2), 32.25); |
1759 CHECK_EQ(*(global + 3), 65.0); | 1779 CHECK_EQ(*(global + 3), 65.0); |
1760 } | 1780 } |
1761 #endif // SIMD_LOWERING_TARGET | 1781 #endif // SIMD_LOWERING_TARGET |
OLD | NEW |