| 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 |