Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: test/cctest/wasm/test-run-wasm-simd.cc

Issue 2728823005: [wasm] Implement simd lowering for F32x4 and I32x4 compare ops (Closed)
Patch Set: Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« src/compiler/wasm-compiler.cc ('K') | « src/compiler/wasm-compiler.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
212 return ~a; 227 return ~a;
213 } 228 }
214 229
215 template <typename T> 230 template <typename T>
216 T Sqrt(T a) { 231 T Sqrt(T a) {
217 return std::sqrt(a); 232 return std::sqrt(a);
218 } 233 }
219 234
220 } // namespace 235 } // namespace
221 236
222 #if !V8_TARGET_ARCH_ARM && !V8_TARGET_ARCH_X64
223 #define SIMD_LOWERING_TARGET 1
224 #else
225 #define SIMD_LOWERING_TARGET 0
226 #endif // !V8_TARGET_ARCH_ARM && !V8_TARGET_ARCH_X64
227
228 #define WASM_SIMD_CHECK_LANE(TYPE, value, LANE_TYPE, lane_value, lane_index) \ 237 #define WASM_SIMD_CHECK_LANE(TYPE, value, LANE_TYPE, lane_value, lane_index) \
229 WASM_IF(WASM_##LANE_TYPE##_NE(WASM_GET_LOCAL(lane_value), \ 238 WASM_IF(WASM_##LANE_TYPE##_NE(WASM_GET_LOCAL(lane_value), \
230 WASM_SIMD_##TYPE##_EXTRACT_LANE( \ 239 WASM_SIMD_##TYPE##_EXTRACT_LANE( \
231 lane_index, WASM_GET_LOCAL(value))), \ 240 lane_index, WASM_GET_LOCAL(value))), \
232 WASM_RETURN1(WASM_ZERO)) 241 WASM_RETURN1(WASM_ZERO))
233 242
234 #define WASM_SIMD_CHECK_F32_LANE(value, lane_value, lane_index) \ 243 #define WASM_SIMD_CHECK_F32_LANE(value, lane_value, lane_index) \
235 WASM_IF(WASM_F32_NE(WASM_GET_LOCAL(lane_value), \ 244 WASM_IF(WASM_F32_NE(WASM_GET_LOCAL(lane_value), \
236 WASM_SIMD_F32x4_EXTRACT_LANE(lane_index, \ 245 WASM_SIMD_F32x4_EXTRACT_LANE(lane_index, \
237 WASM_GET_LOCAL(value))), \ 246 WASM_GET_LOCAL(value))), \
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after
480 WASM_EXEC_COMPILED_TEST(F32x4Mul) { RunF32x4BinOpTest(kExprF32x4Mul, Mul); } 489 WASM_EXEC_COMPILED_TEST(F32x4Mul) { RunF32x4BinOpTest(kExprF32x4Mul, Mul); }
481 WASM_EXEC_COMPILED_TEST(F32x4Div) { RunF32x4BinOpTest(kExprF32x4Div, Div); } 490 WASM_EXEC_COMPILED_TEST(F32x4Div) { RunF32x4BinOpTest(kExprF32x4Div, Div); }
482 WASM_EXEC_COMPILED_TEST(Simd_F32x4_Min) { 491 WASM_EXEC_COMPILED_TEST(Simd_F32x4_Min) {
483 RunF32x4BinOpTest(kExprF32x4Min, Minimum); 492 RunF32x4BinOpTest(kExprF32x4Min, Minimum);
484 } 493 }
485 WASM_EXEC_COMPILED_TEST(Simd_F32x4_Max) { 494 WASM_EXEC_COMPILED_TEST(Simd_F32x4_Max) {
486 RunF32x4BinOpTest(kExprF32x4Max, Maximum); 495 RunF32x4BinOpTest(kExprF32x4Max, Maximum);
487 } 496 }
488 #endif // SIMD_LOWERING_TARGET 497 #endif // SIMD_LOWERING_TARGET
489 498
490 #if V8_TARGET_ARCH_ARM 499 #if V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET
491 void RunF32x4CompareOpTest(WasmOpcode simd_op, FloatCompareOp expected_op) { 500 void RunF32x4CompareOpTest(WasmOpcode simd_op, FloatCompareOp expected_op) {
492 FLAG_wasm_simd_prototype = true; 501 FLAG_wasm_simd_prototype = true;
493 WasmRunner<int32_t, float, float, int32_t> r(kExecuteCompiled); 502 WasmRunner<int32_t, float, float, int32_t> r(kExecuteCompiled);
494 byte a = 0; 503 byte a = 0;
495 byte b = 1; 504 byte b = 1;
496 byte expected = 2; 505 byte expected = 2;
497 byte simd0 = r.AllocateLocal(kWasmS128); 506 byte simd0 = r.AllocateLocal(kWasmS128);
498 byte simd1 = r.AllocateLocal(kWasmS128); 507 byte simd1 = r.AllocateLocal(kWasmS128);
499 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(a))), 508 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(a))),
500 WASM_SET_LOCAL(simd1, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(b))), 509 WASM_SET_LOCAL(simd1, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(b))),
(...skipping 14 matching lines...) Expand all
515 } 524 }
516 } 525 }
517 526
518 WASM_EXEC_COMPILED_TEST(F32x4Equal) { 527 WASM_EXEC_COMPILED_TEST(F32x4Equal) {
519 RunF32x4CompareOpTest(kExprF32x4Eq, Equal); 528 RunF32x4CompareOpTest(kExprF32x4Eq, Equal);
520 } 529 }
521 530
522 WASM_EXEC_COMPILED_TEST(F32x4NotEqual) { 531 WASM_EXEC_COMPILED_TEST(F32x4NotEqual) {
523 RunF32x4CompareOpTest(kExprF32x4Ne, NotEqual); 532 RunF32x4CompareOpTest(kExprF32x4Ne, NotEqual);
524 } 533 }
525 #endif // V8_TARGET_ARCH_ARM 534 #endif // V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET
535
536 #if SIMD_LOWERING_TARGET
537 WASM_EXEC_COMPILED_TEST(F32x4LessThan) {
538 RunF32x4CompareOpTest(kExprF32x4Lt, Less);
539 }
540 WASM_EXEC_COMPILED_TEST(F32x4LessThanOrEqual) {
541 RunF32x4CompareOpTest(kExprF32x4Le, LessEqual);
542 }
543 WASM_EXEC_COMPILED_TEST(F32x4GreaterThan) {
544 RunF32x4CompareOpTest(kExprF32x4Gt, Greater);
545 }
546 WASM_EXEC_COMPILED_TEST(F32x4GreaterThanOrEqual) {
547 RunF32x4CompareOpTest(kExprF32x4Ge, GreaterEqual);
548 }
549 #endif // SIMD_LOWERING_TARGET
526 550
527 WASM_EXEC_COMPILED_TEST(I32x4Splat) { 551 WASM_EXEC_COMPILED_TEST(I32x4Splat) {
528 FLAG_wasm_simd_prototype = true; 552 FLAG_wasm_simd_prototype = true;
529 553
530 // Store SIMD value in a local variable, use extract lane to check lane values 554 // Store SIMD value in a local variable, use extract lane to check lane values
531 // This test is not a test for ExtractLane as Splat does not create 555 // This test is not a test for ExtractLane as Splat does not create
532 // interesting SIMD values. 556 // interesting SIMD values.
533 // 557 //
534 // SetLocal(1, I32x4Splat(Local(0))); 558 // SetLocal(1, I32x4Splat(Local(0)));
535 // For each lane index 559 // For each lane index
(...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after
882 RunI32x4BinOpTest(kExprI32x4MaxS, Maximum); 906 RunI32x4BinOpTest(kExprI32x4MaxS, Maximum);
883 } 907 }
884 908
885 WASM_EXEC_COMPILED_TEST(Ui32x4Min) { 909 WASM_EXEC_COMPILED_TEST(Ui32x4Min) {
886 RunI32x4BinOpTest(kExprI32x4MinU, UnsignedMinimum); 910 RunI32x4BinOpTest(kExprI32x4MinU, UnsignedMinimum);
887 } 911 }
888 912
889 WASM_EXEC_COMPILED_TEST(Ui32x4Max) { 913 WASM_EXEC_COMPILED_TEST(Ui32x4Max) {
890 RunI32x4BinOpTest(kExprI32x4MaxU, UnsignedMaximum); 914 RunI32x4BinOpTest(kExprI32x4MaxU, UnsignedMaximum);
891 } 915 }
892 #endif // V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET
893 916
894 #if V8_TARGET_ARCH_ARM
895 void RunI32x4CompareOpTest(WasmOpcode simd_op, Int32BinOp expected_op) { 917 void RunI32x4CompareOpTest(WasmOpcode simd_op, Int32BinOp expected_op) {
896 FLAG_wasm_simd_prototype = true; 918 FLAG_wasm_simd_prototype = true;
897 WasmRunner<int32_t, int32_t, int32_t, int32_t> r(kExecuteCompiled); 919 WasmRunner<int32_t, int32_t, int32_t, int32_t> r(kExecuteCompiled);
898 byte a = 0; 920 byte a = 0;
899 byte b = 1; 921 byte b = 1;
900 byte expected = 2; 922 byte expected = 2;
901 byte simd0 = r.AllocateLocal(kWasmS128); 923 byte simd0 = r.AllocateLocal(kWasmS128);
902 byte simd1 = r.AllocateLocal(kWasmS128); 924 byte simd1 = r.AllocateLocal(kWasmS128);
903 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(a))), 925 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(a))),
904 WASM_SET_LOCAL(simd1, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(b))), 926 WASM_SET_LOCAL(simd1, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(b))),
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
945 RunI32x4CompareOpTest(kExprI32x4GeU, UnsignedGreaterEqual); 967 RunI32x4CompareOpTest(kExprI32x4GeU, UnsignedGreaterEqual);
946 } 968 }
947 969
948 WASM_EXEC_COMPILED_TEST(Ui32x4Less) { 970 WASM_EXEC_COMPILED_TEST(Ui32x4Less) {
949 RunI32x4CompareOpTest(kExprI32x4LtU, UnsignedLess); 971 RunI32x4CompareOpTest(kExprI32x4LtU, UnsignedLess);
950 } 972 }
951 973
952 WASM_EXEC_COMPILED_TEST(Ui32x4LessEqual) { 974 WASM_EXEC_COMPILED_TEST(Ui32x4LessEqual) {
953 RunI32x4CompareOpTest(kExprI32x4LeU, UnsignedLessEqual); 975 RunI32x4CompareOpTest(kExprI32x4LeU, UnsignedLessEqual);
954 } 976 }
955 #endif // V8_TARGET_ARCH_ARM
956 977
957 #if V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET
958 void RunI32x4ShiftOpTest(WasmOpcode simd_op, Int32ShiftOp expected_op, 978 void RunI32x4ShiftOpTest(WasmOpcode simd_op, Int32ShiftOp expected_op,
959 int shift) { 979 int shift) {
960 FLAG_wasm_simd_prototype = true; 980 FLAG_wasm_simd_prototype = true;
961 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); 981 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled);
962 byte a = 0; 982 byte a = 0;
963 byte expected = 1; 983 byte expected = 1;
964 byte simd = r.AllocateLocal(kWasmS128); 984 byte simd = r.AllocateLocal(kWasmS128);
965 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(a))), 985 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(a))),
966 WASM_SET_LOCAL( 986 WASM_SET_LOCAL(
967 simd, WASM_SIMD_SHIFT_OP(simd_op, shift, WASM_GET_LOCAL(simd))), 987 simd, WASM_SIMD_SHIFT_OP(simd_op, shift, WASM_GET_LOCAL(simd))),
(...skipping 603 matching lines...) Expand 10 before | Expand all | Expand 10 after
1571 WASM_SET_GLOBAL(0, WASM_SIMD_F32x4_REPLACE_LANE(3, WASM_GET_GLOBAL(0), 1591 WASM_SET_GLOBAL(0, WASM_SIMD_F32x4_REPLACE_LANE(3, WASM_GET_GLOBAL(0),
1572 WASM_F32(65.0))), 1592 WASM_F32(65.0))),
1573 WASM_I32V(1)); 1593 WASM_I32V(1));
1574 FOR_INT32_INPUTS(i) { CHECK_EQ(1, r.Call(0)); } 1594 FOR_INT32_INPUTS(i) { CHECK_EQ(1, r.Call(0)); }
1575 CHECK_EQ(*global, 13.5); 1595 CHECK_EQ(*global, 13.5);
1576 CHECK_EQ(*(global + 1), 45.5); 1596 CHECK_EQ(*(global + 1), 45.5);
1577 CHECK_EQ(*(global + 2), 32.25); 1597 CHECK_EQ(*(global + 2), 32.25);
1578 CHECK_EQ(*(global + 3), 65.0); 1598 CHECK_EQ(*(global + 3), 65.0);
1579 } 1599 }
1580 #endif // SIMD_LOWERING_TARGET 1600 #endif // SIMD_LOWERING_TARGET
OLDNEW
« src/compiler/wasm-compiler.cc ('K') | « src/compiler/wasm-compiler.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698