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

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

Issue 2700813002: [V8] Implement SIMD Boolean vector types to allow mask registers. (Closed)
Patch Set: Rebase. Created 3 years, 10 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
« no previous file with comments | « src/x87/assembler-x87.h ('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/wasm/wasm-macro-gen.h" 5 #include "src/wasm/wasm-macro-gen.h"
6 6
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 11 matching lines...) Expand all
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
32 // Floating point specific value functions. 32 // Floating point specific value functions, only used by ARM so far.
33 int32_t Equal(float a, float b) { return a == b ? -1 : 0; } 33 int32_t Equal(float a, float b) { return a == b ? 1 : 0; }
34 34
35 int32_t NotEqual(float a, float b) { return a != b ? -1 : 0; } 35 int32_t NotEqual(float a, float b) { return a != b ? 1 : 0; }
36 #endif // V8_TARGET_ARCH_ARM 36 #endif // V8_TARGET_ARCH_ARM
37 37
38 // Generic expected value functions. 38 // Generic expected value functions.
39 template <typename T> 39 template <typename T>
40 T Negate(T a) { 40 T Negate(T a) {
41 return -a; 41 return -a;
42 } 42 }
43 43
44 template <typename T> 44 template <typename T>
45 T Add(T a, T b) { 45 T Add(T a, T b) {
(...skipping 27 matching lines...) Expand all
73 } 73 }
74 74
75 template <typename T> 75 template <typename T>
76 T UnsignedMaximum(T a, T b) { 76 T UnsignedMaximum(T a, T b) {
77 using UnsignedT = typename std::make_unsigned<T>::type; 77 using UnsignedT = typename std::make_unsigned<T>::type;
78 return static_cast<UnsignedT>(a) >= static_cast<UnsignedT>(b) ? a : b; 78 return static_cast<UnsignedT>(a) >= static_cast<UnsignedT>(b) ? a : b;
79 } 79 }
80 80
81 template <typename T> 81 template <typename T>
82 T Equal(T a, T b) { 82 T Equal(T a, T b) {
83 return a == b ? -1 : 0; 83 return a == b ? 1 : 0;
84 } 84 }
85 85
86 template <typename T> 86 template <typename T>
87 T NotEqual(T a, T b) { 87 T NotEqual(T a, T b) {
88 return a != b ? -1 : 0; 88 return a != b ? 1 : 0;
89 } 89 }
90 90
91 template <typename T> 91 template <typename T>
92 T Greater(T a, T b) { 92 T Greater(T a, T b) {
93 return a > b ? -1 : 0; 93 return a > b ? 1 : 0;
94 } 94 }
95 95
96 template <typename T> 96 template <typename T>
97 T GreaterEqual(T a, T b) { 97 T GreaterEqual(T a, T b) {
98 return a >= b ? -1 : 0; 98 return a >= b ? 1 : 0;
99 } 99 }
100 100
101 template <typename T> 101 template <typename T>
102 T Less(T a, T b) { 102 T Less(T a, T b) {
103 return a < b ? -1 : 0; 103 return a < b ? 1 : 0;
104 } 104 }
105 105
106 template <typename T> 106 template <typename T>
107 T LessEqual(T a, T b) { 107 T LessEqual(T a, T b) {
108 return a <= b ? -1 : 0; 108 return a <= b ? 1 : 0;
109 } 109 }
110 110
111 template <typename T> 111 template <typename T>
112 T UnsignedGreater(T a, T b) { 112 T UnsignedGreater(T a, T b) {
113 using UnsignedT = typename std::make_unsigned<T>::type; 113 using UnsignedT = typename std::make_unsigned<T>::type;
114 return static_cast<UnsignedT>(a) > static_cast<UnsignedT>(b) ? -1 : 0; 114 return static_cast<UnsignedT>(a) > static_cast<UnsignedT>(b) ? 1 : 0;
115 } 115 }
116 116
117 template <typename T> 117 template <typename T>
118 T UnsignedGreaterEqual(T a, T b) { 118 T UnsignedGreaterEqual(T a, T b) {
119 using UnsignedT = typename std::make_unsigned<T>::type; 119 using UnsignedT = typename std::make_unsigned<T>::type;
120 return static_cast<UnsignedT>(a) >= static_cast<UnsignedT>(b) ? -1 : 0; 120 return static_cast<UnsignedT>(a) >= static_cast<UnsignedT>(b) ? 1 : 0;
121 } 121 }
122 122
123 template <typename T> 123 template <typename T>
124 T UnsignedLess(T a, T b) { 124 T UnsignedLess(T a, T b) {
125 using UnsignedT = typename std::make_unsigned<T>::type; 125 using UnsignedT = typename std::make_unsigned<T>::type;
126 return static_cast<UnsignedT>(a) < static_cast<UnsignedT>(b) ? -1 : 0; 126 return static_cast<UnsignedT>(a) < static_cast<UnsignedT>(b) ? 1 : 0;
127 } 127 }
128 128
129 template <typename T> 129 template <typename T>
130 T UnsignedLessEqual(T a, T b) { 130 T UnsignedLessEqual(T a, T b) {
131 using UnsignedT = typename std::make_unsigned<T>::type; 131 using UnsignedT = typename std::make_unsigned<T>::type;
132 return static_cast<UnsignedT>(a) <= static_cast<UnsignedT>(b) ? -1 : 0; 132 return static_cast<UnsignedT>(a) <= static_cast<UnsignedT>(b) ? 1 : 0;
133 } 133 }
134 134
135 template <typename T> 135 template <typename T>
136 T LogicalShiftLeft(T a, int shift) { 136 T LogicalShiftLeft(T a, int shift) {
137 return a << shift; 137 return a << shift;
138 } 138 }
139 139
140 template <typename T> 140 template <typename T>
141 T LogicalShiftRight(T a, int shift) { 141 T LogicalShiftRight(T a, int shift) {
142 using UnsignedT = typename std::make_unsigned<T>::type; 142 using UnsignedT = typename std::make_unsigned<T>::type;
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
279 WASM_SIMD_CHECK_F32_LANE(TYPE, value, lv0, 0) \ 279 WASM_SIMD_CHECK_F32_LANE(TYPE, value, lv0, 0) \
280 , WASM_SIMD_CHECK_F32_LANE(TYPE, value, lv1, 1), \ 280 , WASM_SIMD_CHECK_F32_LANE(TYPE, value, lv1, 1), \
281 WASM_SIMD_CHECK_F32_LANE(TYPE, value, lv2, 2), \ 281 WASM_SIMD_CHECK_F32_LANE(TYPE, value, lv2, 2), \
282 WASM_SIMD_CHECK_F32_LANE(TYPE, value, lv3, 3) 282 WASM_SIMD_CHECK_F32_LANE(TYPE, value, lv3, 3)
283 283
284 #define WASM_SIMD_CHECK_SPLAT4_F32(TYPE, value, lv) \ 284 #define WASM_SIMD_CHECK_SPLAT4_F32(TYPE, value, lv) \
285 WASM_SIMD_CHECK4_F32(TYPE, value, lv, lv, lv, lv) 285 WASM_SIMD_CHECK4_F32(TYPE, value, lv, lv, lv, lv)
286 286
287 #define TO_BYTE(val) static_cast<byte>(val) 287 #define TO_BYTE(val) static_cast<byte>(val)
288 #define WASM_SIMD_OP(op) kSimdPrefix, TO_BYTE(op) 288 #define WASM_SIMD_OP(op) kSimdPrefix, TO_BYTE(op)
289 #define WASM_SIMD_SPLAT(Type, x) x, WASM_SIMD_OP(kExpr##Type##Splat)
289 #define WASM_SIMD_UNOP(op, x) x, WASM_SIMD_OP(op) 290 #define WASM_SIMD_UNOP(op, x) x, WASM_SIMD_OP(op)
290 #define WASM_SIMD_BINOP(op, x, y) x, y, WASM_SIMD_OP(op) 291 #define WASM_SIMD_BINOP(op, x, y) x, y, WASM_SIMD_OP(op)
291 #define WASM_SIMD_SHIFT_OP(op, shift, x) x, WASM_SIMD_OP(op), TO_BYTE(shift) 292 #define WASM_SIMD_SHIFT_OP(op, shift, x) x, WASM_SIMD_OP(op), TO_BYTE(shift)
292 #define WASM_SIMD_SELECT(format, x, y, z) \ 293 #define WASM_SIMD_SELECT(format, x, y, z) \
293 x, y, z, WASM_SIMD_OP(kExprS##format##Select) 294 x, y, z, WASM_SIMD_OP(kExprS##format##Select)
295 // Since boolean vectors can't be checked directly, materialize them into
296 // integer vectors using a Select operation.
297 #define WASM_SIMD_MATERIALIZE_BOOLS(format, x) \
298 x, WASM_SIMD_I##format##_SPLAT(WASM_ONE), \
299 WASM_SIMD_I##format##_SPLAT(WASM_ZERO), \
300 WASM_SIMD_OP(kExprS##format##Select)
294 301
295 #define WASM_SIMD_I16x8_SPLAT(x) x, WASM_SIMD_OP(kExprI16x8Splat) 302 #define WASM_SIMD_I16x8_SPLAT(x) x, WASM_SIMD_OP(kExprI16x8Splat)
296 #define WASM_SIMD_I16x8_EXTRACT_LANE(lane, x) \ 303 #define WASM_SIMD_I16x8_EXTRACT_LANE(lane, x) \
297 x, WASM_SIMD_OP(kExprI16x8ExtractLane), TO_BYTE(lane) 304 x, WASM_SIMD_OP(kExprI16x8ExtractLane), TO_BYTE(lane)
298 #define WASM_SIMD_I16x8_REPLACE_LANE(lane, x, y) \ 305 #define WASM_SIMD_I16x8_REPLACE_LANE(lane, x, y) \
299 x, y, WASM_SIMD_OP(kExprI16x8ReplaceLane), TO_BYTE(lane) 306 x, y, WASM_SIMD_OP(kExprI16x8ReplaceLane), TO_BYTE(lane)
300 #define WASM_SIMD_I8x16_SPLAT(x) x, WASM_SIMD_OP(kExprI8x16Splat) 307 #define WASM_SIMD_I8x16_SPLAT(x) x, WASM_SIMD_OP(kExprI8x16Splat)
301 #define WASM_SIMD_I8x16_EXTRACT_LANE(lane, x) \ 308 #define WASM_SIMD_I8x16_EXTRACT_LANE(lane, x) \
302 x, WASM_SIMD_OP(kExprI8x16ExtractLane), TO_BYTE(lane) 309 x, WASM_SIMD_OP(kExprI8x16ExtractLane), TO_BYTE(lane)
303 #define WASM_SIMD_I8x16_REPLACE_LANE(lane, x, y) \ 310 #define WASM_SIMD_I8x16_REPLACE_LANE(lane, x, y) \
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
425 void RunF32x4CompareOpTest(WasmOpcode simd_op, FloatCompareOp expected_op) { 432 void RunF32x4CompareOpTest(WasmOpcode simd_op, FloatCompareOp expected_op) {
426 FLAG_wasm_simd_prototype = true; 433 FLAG_wasm_simd_prototype = true;
427 WasmRunner<int32_t, float, float, int32_t> r(kExecuteCompiled); 434 WasmRunner<int32_t, float, float, int32_t> r(kExecuteCompiled);
428 byte a = 0; 435 byte a = 0;
429 byte b = 1; 436 byte b = 1;
430 byte expected = 2; 437 byte expected = 2;
431 byte simd0 = r.AllocateLocal(kWasmS128); 438 byte simd0 = r.AllocateLocal(kWasmS128);
432 byte simd1 = r.AllocateLocal(kWasmS128); 439 byte simd1 = r.AllocateLocal(kWasmS128);
433 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(a))), 440 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(a))),
434 WASM_SET_LOCAL(simd1, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(b))), 441 WASM_SET_LOCAL(simd1, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(b))),
435 WASM_SET_LOCAL(simd1, WASM_SIMD_BINOP(simd_op, WASM_GET_LOCAL(simd0), 442 WASM_SET_LOCAL(simd1,
436 WASM_GET_LOCAL(simd1))), 443 WASM_SIMD_MATERIALIZE_BOOLS(
444 32x4, WASM_SIMD_BINOP(simd_op, WASM_GET_LOCAL(simd0),
445 WASM_GET_LOCAL(simd1)))),
437 WASM_SIMD_CHECK_SPLAT4(I32x4, simd1, I32, expected), WASM_ONE); 446 WASM_SIMD_CHECK_SPLAT4(I32x4, simd1, I32, expected), WASM_ONE);
438 447
439 FOR_FLOAT32_INPUTS(i) { 448 FOR_FLOAT32_INPUTS(i) {
440 if (std::isnan(*i)) continue; 449 if (std::isnan(*i)) continue;
441 FOR_FLOAT32_INPUTS(j) { 450 FOR_FLOAT32_INPUTS(j) {
442 if (std::isnan(*j)) continue; 451 if (std::isnan(*j)) continue;
443 // SIMD on some platforms may handle denormalized numbers differently. 452 // SIMD on some platforms may handle denormalized numbers differently.
444 // Check for number pairs that are very close together. 453 // Check for number pairs that are very close together.
445 if (std::fpclassify(*i - *j) == FP_SUBNORMAL) continue; 454 if (std::fpclassify(*i - *j) == FP_SUBNORMAL) continue;
446 CHECK_EQ(1, r.Call(*i, *j, expected_op(*i, *j))); 455 CHECK_EQ(1, r.Call(*i, *j, expected_op(*i, *j)));
(...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after
790 799
791 WASM_EXEC_TEST(I32x4Sub) { RunI32x4BinOpTest(kExprI32x4Sub, Sub); } 800 WASM_EXEC_TEST(I32x4Sub) { RunI32x4BinOpTest(kExprI32x4Sub, Sub); }
792 801
793 #if V8_TARGET_ARCH_ARM 802 #if V8_TARGET_ARCH_ARM
794 WASM_EXEC_TEST(I32x4Mul) { RunI32x4BinOpTest(kExprI32x4Mul, Mul); } 803 WASM_EXEC_TEST(I32x4Mul) { RunI32x4BinOpTest(kExprI32x4Mul, Mul); }
795 804
796 WASM_EXEC_TEST(I32x4Min) { RunI32x4BinOpTest(kExprI32x4MinS, Minimum); } 805 WASM_EXEC_TEST(I32x4Min) { RunI32x4BinOpTest(kExprI32x4MinS, Minimum); }
797 806
798 WASM_EXEC_TEST(I32x4Max) { RunI32x4BinOpTest(kExprI32x4MaxS, Maximum); } 807 WASM_EXEC_TEST(I32x4Max) { RunI32x4BinOpTest(kExprI32x4MaxS, Maximum); }
799 808
800 WASM_EXEC_TEST(I32x4Equal) { RunI32x4BinOpTest(kExprI32x4Eq, Equal); }
801
802 WASM_EXEC_TEST(I32x4NotEqual) { RunI32x4BinOpTest(kExprI32x4Ne, NotEqual); }
803
804 WASM_EXEC_TEST(I32x4Greater) { RunI32x4BinOpTest(kExprI32x4GtS, Greater); }
805
806 WASM_EXEC_TEST(I32x4GreaterEqual) {
807 RunI32x4BinOpTest(kExprI32x4GeS, GreaterEqual);
808 }
809
810 WASM_EXEC_TEST(I32x4Less) { RunI32x4BinOpTest(kExprI32x4LtS, Less); }
811
812 WASM_EXEC_TEST(I32x4LessEqual) { RunI32x4BinOpTest(kExprI32x4LeS, LessEqual); }
813
814 WASM_EXEC_TEST(Ui32x4Min) { 809 WASM_EXEC_TEST(Ui32x4Min) {
815 RunI32x4BinOpTest(kExprI32x4MinU, UnsignedMinimum); 810 RunI32x4BinOpTest(kExprI32x4MinU, UnsignedMinimum);
816 } 811 }
817 812
818 WASM_EXEC_TEST(Ui32x4Max) { 813 WASM_EXEC_TEST(Ui32x4Max) {
819 RunI32x4BinOpTest(kExprI32x4MaxU, UnsignedMaximum); 814 RunI32x4BinOpTest(kExprI32x4MaxU, UnsignedMaximum);
820 } 815 }
821 816
822 WASM_EXEC_TEST(Ui32x4Greater) {
823 RunI32x4BinOpTest(kExprI32x4GtU, UnsignedGreater);
824 }
825
826 WASM_EXEC_TEST(Ui32x4GreaterEqual) {
827 RunI32x4BinOpTest(kExprI32x4GeU, UnsignedGreaterEqual);
828 }
829
830 WASM_EXEC_TEST(Ui32x4Less) { RunI32x4BinOpTest(kExprI32x4LtU, UnsignedLess); }
831
832 WASM_EXEC_TEST(Ui32x4LessEqual) {
833 RunI32x4BinOpTest(kExprI32x4LeU, UnsignedLessEqual);
834 }
835
836 WASM_EXEC_TEST(S128And) { RunI32x4BinOpTest(kExprS128And, And); } 817 WASM_EXEC_TEST(S128And) { RunI32x4BinOpTest(kExprS128And, And); }
837 818
838 WASM_EXEC_TEST(S128Or) { RunI32x4BinOpTest(kExprS128Or, Or); } 819 WASM_EXEC_TEST(S128Or) { RunI32x4BinOpTest(kExprS128Or, Or); }
839 820
840 WASM_EXEC_TEST(S128Xor) { RunI32x4BinOpTest(kExprS128Xor, Xor); } 821 WASM_EXEC_TEST(S128Xor) { RunI32x4BinOpTest(kExprS128Xor, Xor); }
841 822
823 void RunI32x4CompareOpTest(WasmOpcode simd_op, Int32BinOp expected_op) {
824 FLAG_wasm_simd_prototype = true;
825 WasmRunner<int32_t, int32_t, int32_t, int32_t> r(kExecuteCompiled);
826 byte a = 0;
827 byte b = 1;
828 byte expected = 2;
829 byte simd0 = r.AllocateLocal(kWasmS128);
830 byte simd1 = r.AllocateLocal(kWasmS128);
831 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(a))),
832 WASM_SET_LOCAL(simd1, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(b))),
833 WASM_SET_LOCAL(simd1,
834 WASM_SIMD_MATERIALIZE_BOOLS(
835 32x4, WASM_SIMD_BINOP(simd_op, WASM_GET_LOCAL(simd0),
836 WASM_GET_LOCAL(simd1)))),
837 WASM_SIMD_CHECK_SPLAT4(I32x4, simd1, I32, expected), WASM_ONE);
838
839 FOR_INT32_INPUTS(i) {
840 FOR_INT32_INPUTS(j) { CHECK_EQ(1, r.Call(*i, *j, expected_op(*i, *j))); }
841 }
842 }
843
844 WASM_EXEC_TEST(I32x4Equal) { RunI32x4CompareOpTest(kExprI32x4Eq, Equal); }
845
846 WASM_EXEC_TEST(I32x4NotEqual) { RunI32x4CompareOpTest(kExprI32x4Ne, NotEqual); }
847
848 WASM_EXEC_TEST(I32x4Greater) { RunI32x4CompareOpTest(kExprI32x4GtS, Greater); }
849
850 WASM_EXEC_TEST(I32x4GreaterEqual) {
851 RunI32x4CompareOpTest(kExprI32x4GeS, GreaterEqual);
852 }
853
854 WASM_EXEC_TEST(I32x4Less) { RunI32x4CompareOpTest(kExprI32x4LtS, Less); }
855
856 WASM_EXEC_TEST(I32x4LessEqual) {
857 RunI32x4CompareOpTest(kExprI32x4LeS, LessEqual);
858 }
859
860 WASM_EXEC_TEST(Ui32x4Greater) {
861 RunI32x4CompareOpTest(kExprI32x4GtU, UnsignedGreater);
862 }
863
864 WASM_EXEC_TEST(Ui32x4GreaterEqual) {
865 RunI32x4CompareOpTest(kExprI32x4GeU, UnsignedGreaterEqual);
866 }
867
868 WASM_EXEC_TEST(Ui32x4Less) {
869 RunI32x4CompareOpTest(kExprI32x4LtU, UnsignedLess);
870 }
871
872 WASM_EXEC_TEST(Ui32x4LessEqual) {
873 RunI32x4CompareOpTest(kExprI32x4LeU, UnsignedLessEqual);
874 }
875
842 void RunI32x4ShiftOpTest(WasmOpcode simd_op, Int32ShiftOp expected_op, 876 void RunI32x4ShiftOpTest(WasmOpcode simd_op, Int32ShiftOp expected_op,
843 int shift) { 877 int shift) {
844 FLAG_wasm_simd_prototype = true; 878 FLAG_wasm_simd_prototype = true;
845 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); 879 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled);
846 byte a = 0; 880 byte a = 0;
847 byte expected = 1; 881 byte expected = 1;
848 byte simd = r.AllocateLocal(kWasmS128); 882 byte simd = r.AllocateLocal(kWasmS128);
849 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(a))), 883 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(a))),
850 WASM_SET_LOCAL( 884 WASM_SET_LOCAL(
851 simd, WASM_SIMD_SHIFT_OP(simd_op, shift, WASM_GET_LOCAL(simd))), 885 simd, WASM_SIMD_SHIFT_OP(simd_op, shift, WASM_GET_LOCAL(simd))),
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
911 WASM_EXEC_TEST(I16x8SubSaturate) { 945 WASM_EXEC_TEST(I16x8SubSaturate) {
912 RunI16x8BinOpTest(kExprI16x8SubSaturateS, SubSaturate); 946 RunI16x8BinOpTest(kExprI16x8SubSaturateS, SubSaturate);
913 } 947 }
914 948
915 WASM_EXEC_TEST(I16x8Mul) { RunI16x8BinOpTest(kExprI16x8Mul, Mul); } 949 WASM_EXEC_TEST(I16x8Mul) { RunI16x8BinOpTest(kExprI16x8Mul, Mul); }
916 950
917 WASM_EXEC_TEST(I16x8Min) { RunI16x8BinOpTest(kExprI16x8MinS, Minimum); } 951 WASM_EXEC_TEST(I16x8Min) { RunI16x8BinOpTest(kExprI16x8MinS, Minimum); }
918 952
919 WASM_EXEC_TEST(I16x8Max) { RunI16x8BinOpTest(kExprI16x8MaxS, Maximum); } 953 WASM_EXEC_TEST(I16x8Max) { RunI16x8BinOpTest(kExprI16x8MaxS, Maximum); }
920 954
921 WASM_EXEC_TEST(I16x8Equal) { RunI16x8BinOpTest(kExprI16x8Eq, Equal); }
922
923 WASM_EXEC_TEST(I16x8NotEqual) { RunI16x8BinOpTest(kExprI16x8Ne, NotEqual); }
924
925 WASM_EXEC_TEST(I16x8Greater) { RunI16x8BinOpTest(kExprI16x8GtS, Greater); }
926
927 WASM_EXEC_TEST(I16x8GreaterEqual) {
928 RunI16x8BinOpTest(kExprI16x8GeS, GreaterEqual);
929 }
930
931 WASM_EXEC_TEST(I16x8Less) { RunI16x8BinOpTest(kExprI16x8LtS, Less); }
932
933 WASM_EXEC_TEST(I16x8LessEqual) { RunI16x8BinOpTest(kExprI16x8LeS, LessEqual); }
934
935 WASM_EXEC_TEST(Ui16x8AddSaturate) { 955 WASM_EXEC_TEST(Ui16x8AddSaturate) {
936 RunI16x8BinOpTest(kExprI16x8AddSaturateU, UnsignedAddSaturate); 956 RunI16x8BinOpTest(kExprI16x8AddSaturateU, UnsignedAddSaturate);
937 } 957 }
938 958
939 WASM_EXEC_TEST(Ui16x8SubSaturate) { 959 WASM_EXEC_TEST(Ui16x8SubSaturate) {
940 RunI16x8BinOpTest(kExprI16x8SubSaturateU, UnsignedSubSaturate); 960 RunI16x8BinOpTest(kExprI16x8SubSaturateU, UnsignedSubSaturate);
941 } 961 }
942 962
943 WASM_EXEC_TEST(Ui16x8Min) { 963 WASM_EXEC_TEST(Ui16x8Min) {
944 RunI16x8BinOpTest(kExprI16x8MinU, UnsignedMinimum); 964 RunI16x8BinOpTest(kExprI16x8MinU, UnsignedMinimum);
945 } 965 }
946 966
947 WASM_EXEC_TEST(Ui16x8Max) { 967 WASM_EXEC_TEST(Ui16x8Max) {
948 RunI16x8BinOpTest(kExprI16x8MaxU, UnsignedMaximum); 968 RunI16x8BinOpTest(kExprI16x8MaxU, UnsignedMaximum);
949 } 969 }
950 970
971 void RunI16x8CompareOpTest(WasmOpcode simd_op, Int16BinOp expected_op) {
972 FLAG_wasm_simd_prototype = true;
973 WasmRunner<int32_t, int32_t, int32_t, int32_t> r(kExecuteCompiled);
974 byte a = 0;
975 byte b = 1;
976 byte expected = 2;
977 byte simd0 = r.AllocateLocal(kWasmS128);
978 byte simd1 = r.AllocateLocal(kWasmS128);
979 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_I16x8_SPLAT(WASM_GET_LOCAL(a))),
980 WASM_SET_LOCAL(simd1, WASM_SIMD_I16x8_SPLAT(WASM_GET_LOCAL(b))),
981 WASM_SET_LOCAL(simd1,
982 WASM_SIMD_MATERIALIZE_BOOLS(
983 16x8, WASM_SIMD_BINOP(simd_op, WASM_GET_LOCAL(simd0),
984 WASM_GET_LOCAL(simd1)))),
985 WASM_SIMD_CHECK_SPLAT8(I16x8, simd1, I32, expected), WASM_ONE);
986
987 FOR_INT16_INPUTS(i) {
988 FOR_INT16_INPUTS(j) { CHECK_EQ(1, r.Call(*i, *j, expected_op(*i, *j))); }
989 }
990 }
991
992 WASM_EXEC_TEST(I16x8Equal) { RunI16x8CompareOpTest(kExprI16x8Eq, Equal); }
993
994 WASM_EXEC_TEST(I16x8NotEqual) { RunI16x8CompareOpTest(kExprI16x8Ne, NotEqual); }
995
996 WASM_EXEC_TEST(I16x8Greater) { RunI16x8CompareOpTest(kExprI16x8GtS, Greater); }
997
998 WASM_EXEC_TEST(I16x8GreaterEqual) {
999 RunI16x8CompareOpTest(kExprI16x8GeS, GreaterEqual);
1000 }
1001
1002 WASM_EXEC_TEST(I16x8Less) { RunI16x8CompareOpTest(kExprI16x8LtS, Less); }
1003
1004 WASM_EXEC_TEST(I16x8LessEqual) {
1005 RunI16x8CompareOpTest(kExprI16x8LeS, LessEqual);
1006 }
1007
951 WASM_EXEC_TEST(Ui16x8Greater) { 1008 WASM_EXEC_TEST(Ui16x8Greater) {
952 RunI16x8BinOpTest(kExprI16x8GtU, UnsignedGreater); 1009 RunI16x8CompareOpTest(kExprI16x8GtU, UnsignedGreater);
953 } 1010 }
954 1011
955 WASM_EXEC_TEST(Ui16x8GreaterEqual) { 1012 WASM_EXEC_TEST(Ui16x8GreaterEqual) {
956 RunI16x8BinOpTest(kExprI16x8GeU, UnsignedGreaterEqual); 1013 RunI16x8CompareOpTest(kExprI16x8GeU, UnsignedGreaterEqual);
957 } 1014 }
958 1015
959 WASM_EXEC_TEST(Ui16x8Less) { RunI16x8BinOpTest(kExprI16x8LtU, UnsignedLess); } 1016 WASM_EXEC_TEST(Ui16x8Less) {
1017 RunI16x8CompareOpTest(kExprI16x8LtU, UnsignedLess);
1018 }
960 1019
961 WASM_EXEC_TEST(Ui16x8LessEqual) { 1020 WASM_EXEC_TEST(Ui16x8LessEqual) {
962 RunI16x8BinOpTest(kExprI16x8LeU, UnsignedLessEqual); 1021 RunI16x8CompareOpTest(kExprI16x8LeU, UnsignedLessEqual);
963 } 1022 }
964 1023
965 void RunI16x8ShiftOpTest(WasmOpcode simd_op, Int16ShiftOp expected_op, 1024 void RunI16x8ShiftOpTest(WasmOpcode simd_op, Int16ShiftOp expected_op,
966 int shift) { 1025 int shift) {
967 FLAG_wasm_simd_prototype = true; 1026 FLAG_wasm_simd_prototype = true;
968 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); 1027 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled);
969 byte a = 0; 1028 byte a = 0;
970 byte expected = 1; 1029 byte expected = 1;
971 byte simd = r.AllocateLocal(kWasmS128); 1030 byte simd = r.AllocateLocal(kWasmS128);
972 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I16x8_SPLAT(WASM_GET_LOCAL(a))), 1031 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I16x8_SPLAT(WASM_GET_LOCAL(a))),
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
1034 WASM_EXEC_TEST(I8x16SubSaturate) { 1093 WASM_EXEC_TEST(I8x16SubSaturate) {
1035 RunI8x16BinOpTest(kExprI8x16SubSaturateS, SubSaturate); 1094 RunI8x16BinOpTest(kExprI8x16SubSaturateS, SubSaturate);
1036 } 1095 }
1037 1096
1038 WASM_EXEC_TEST(I8x16Mul) { RunI8x16BinOpTest(kExprI8x16Mul, Mul); } 1097 WASM_EXEC_TEST(I8x16Mul) { RunI8x16BinOpTest(kExprI8x16Mul, Mul); }
1039 1098
1040 WASM_EXEC_TEST(I8x16Min) { RunI8x16BinOpTest(kExprI8x16MinS, Minimum); } 1099 WASM_EXEC_TEST(I8x16Min) { RunI8x16BinOpTest(kExprI8x16MinS, Minimum); }
1041 1100
1042 WASM_EXEC_TEST(I8x16Max) { RunI8x16BinOpTest(kExprI8x16MaxS, Maximum); } 1101 WASM_EXEC_TEST(I8x16Max) { RunI8x16BinOpTest(kExprI8x16MaxS, Maximum); }
1043 1102
1044 WASM_EXEC_TEST(I8x16Equal) { RunI8x16BinOpTest(kExprI8x16Eq, Equal); }
1045
1046 WASM_EXEC_TEST(I8x16NotEqual) { RunI8x16BinOpTest(kExprI8x16Ne, NotEqual); }
1047
1048 WASM_EXEC_TEST(I8x16Greater) { RunI8x16BinOpTest(kExprI8x16GtS, Greater); }
1049
1050 WASM_EXEC_TEST(I8x16GreaterEqual) {
1051 RunI8x16BinOpTest(kExprI8x16GeS, GreaterEqual);
1052 }
1053
1054 WASM_EXEC_TEST(I8x16Less) { RunI8x16BinOpTest(kExprI8x16LtS, Less); }
1055
1056 WASM_EXEC_TEST(I8x16LessEqual) { RunI8x16BinOpTest(kExprI8x16LeS, LessEqual); }
1057
1058 WASM_EXEC_TEST(Ui8x16AddSaturate) { 1103 WASM_EXEC_TEST(Ui8x16AddSaturate) {
1059 RunI8x16BinOpTest(kExprI8x16AddSaturateU, UnsignedAddSaturate); 1104 RunI8x16BinOpTest(kExprI8x16AddSaturateU, UnsignedAddSaturate);
1060 } 1105 }
1061 1106
1062 WASM_EXEC_TEST(Ui8x16SubSaturate) { 1107 WASM_EXEC_TEST(Ui8x16SubSaturate) {
1063 RunI8x16BinOpTest(kExprI8x16SubSaturateU, UnsignedSubSaturate); 1108 RunI8x16BinOpTest(kExprI8x16SubSaturateU, UnsignedSubSaturate);
1064 } 1109 }
1065 1110
1066 WASM_EXEC_TEST(Ui8x16Min) { 1111 WASM_EXEC_TEST(Ui8x16Min) {
1067 RunI8x16BinOpTest(kExprI8x16MinU, UnsignedMinimum); 1112 RunI8x16BinOpTest(kExprI8x16MinU, UnsignedMinimum);
1068 } 1113 }
1069 1114
1070 WASM_EXEC_TEST(Ui8x16Max) { 1115 WASM_EXEC_TEST(Ui8x16Max) {
1071 RunI8x16BinOpTest(kExprI8x16MaxU, UnsignedMaximum); 1116 RunI8x16BinOpTest(kExprI8x16MaxU, UnsignedMaximum);
1072 } 1117 }
1073 1118
1119 void RunI8x16CompareOpTest(WasmOpcode simd_op, Int8BinOp expected_op) {
1120 FLAG_wasm_simd_prototype = true;
1121 WasmRunner<int32_t, int32_t, int32_t, int32_t> r(kExecuteCompiled);
1122 byte a = 0;
1123 byte b = 1;
1124 byte expected = 2;
1125 byte simd0 = r.AllocateLocal(kWasmS128);
1126 byte simd1 = r.AllocateLocal(kWasmS128);
1127 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_I8x16_SPLAT(WASM_GET_LOCAL(a))),
1128 WASM_SET_LOCAL(simd1, WASM_SIMD_I8x16_SPLAT(WASM_GET_LOCAL(b))),
1129 WASM_SET_LOCAL(simd1,
1130 WASM_SIMD_MATERIALIZE_BOOLS(
1131 8x16, WASM_SIMD_BINOP(simd_op, WASM_GET_LOCAL(simd0),
1132 WASM_GET_LOCAL(simd1)))),
1133 WASM_SIMD_CHECK_SPLAT16(I8x16, simd1, I32, expected), WASM_ONE);
1134
1135 FOR_INT8_INPUTS(i) {
1136 FOR_INT8_INPUTS(j) { CHECK_EQ(1, r.Call(*i, *j, expected_op(*i, *j))); }
1137 }
1138 }
1139
1140 WASM_EXEC_TEST(I8x16Equal) { RunI8x16CompareOpTest(kExprI8x16Eq, Equal); }
1141
1142 WASM_EXEC_TEST(I8x16NotEqual) { RunI8x16CompareOpTest(kExprI8x16Ne, NotEqual); }
1143
1144 WASM_EXEC_TEST(I8x16Greater) { RunI8x16CompareOpTest(kExprI8x16GtS, Greater); }
1145
1146 WASM_EXEC_TEST(I8x16GreaterEqual) {
1147 RunI8x16CompareOpTest(kExprI8x16GeS, GreaterEqual);
1148 }
1149
1150 WASM_EXEC_TEST(I8x16Less) { RunI8x16CompareOpTest(kExprI8x16LtS, Less); }
1151
1152 WASM_EXEC_TEST(I8x16LessEqual) {
1153 RunI8x16CompareOpTest(kExprI8x16LeS, LessEqual);
1154 }
1155
1074 WASM_EXEC_TEST(Ui8x16Greater) { 1156 WASM_EXEC_TEST(Ui8x16Greater) {
1075 RunI8x16BinOpTest(kExprI8x16GtU, UnsignedGreater); 1157 RunI8x16CompareOpTest(kExprI8x16GtU, UnsignedGreater);
1076 } 1158 }
1077 1159
1078 WASM_EXEC_TEST(Ui8x16GreaterEqual) { 1160 WASM_EXEC_TEST(Ui8x16GreaterEqual) {
1079 RunI8x16BinOpTest(kExprI8x16GeU, UnsignedGreaterEqual); 1161 RunI8x16CompareOpTest(kExprI8x16GeU, UnsignedGreaterEqual);
1080 } 1162 }
1081 1163
1082 WASM_EXEC_TEST(Ui8x16Less) { RunI8x16BinOpTest(kExprI8x16LtU, UnsignedLess); } 1164 WASM_EXEC_TEST(Ui8x16Less) {
1165 RunI8x16CompareOpTest(kExprI8x16LtU, UnsignedLess);
1166 }
1083 1167
1084 WASM_EXEC_TEST(Ui8x16LessEqual) { 1168 WASM_EXEC_TEST(Ui8x16LessEqual) {
1085 RunI8x16BinOpTest(kExprI8x16LeU, UnsignedLessEqual); 1169 RunI8x16CompareOpTest(kExprI8x16LeU, UnsignedLessEqual);
1086 } 1170 }
1087 1171
1088 void RunI8x16ShiftOpTest(WasmOpcode simd_op, Int8ShiftOp expected_op, 1172 void RunI8x16ShiftOpTest(WasmOpcode simd_op, Int8ShiftOp expected_op,
1089 int shift) { 1173 int shift) {
1090 FLAG_wasm_simd_prototype = true; 1174 FLAG_wasm_simd_prototype = true;
1091 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); 1175 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled);
1092 byte a = 0; 1176 byte a = 0;
1093 byte expected = 1; 1177 byte expected = 1;
1094 byte simd = r.AllocateLocal(kWasmS128); 1178 byte simd = r.AllocateLocal(kWasmS128);
1095 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I8x16_SPLAT(WASM_GET_LOCAL(a))), 1179 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I8x16_SPLAT(WASM_GET_LOCAL(a))),
1096 WASM_SET_LOCAL( 1180 WASM_SET_LOCAL(
1097 simd, WASM_SIMD_SHIFT_OP(simd_op, shift, WASM_GET_LOCAL(simd))), 1181 simd, WASM_SIMD_SHIFT_OP(simd_op, shift, WASM_GET_LOCAL(simd))),
1098 WASM_SIMD_CHECK_SPLAT16(I8x16, simd, I32, expected), WASM_ONE); 1182 WASM_SIMD_CHECK_SPLAT16(I8x16, simd, I32, expected), WASM_ONE);
1099 1183
1100 FOR_INT8_INPUTS(i) { CHECK_EQ(1, r.Call(*i, expected_op(*i, shift))); } 1184 FOR_INT8_INPUTS(i) { CHECK_EQ(1, r.Call(*i, expected_op(*i, shift))); }
1101 } 1185 }
1102 1186
1103 WASM_EXEC_TEST(I8x16Shl) { 1187 WASM_EXEC_TEST(I8x16Shl) {
1104 RunI8x16ShiftOpTest(kExprI8x16Shl, LogicalShiftLeft, 1); 1188 RunI8x16ShiftOpTest(kExprI8x16Shl, LogicalShiftLeft, 1);
1105 } 1189 }
1106 1190
1107 WASM_EXEC_TEST(I8x16ShrS) { 1191 WASM_EXEC_TEST(I8x16ShrS) {
1108 RunI8x16ShiftOpTest(kExprI8x16ShrS, ArithmeticShiftRight, 1); 1192 RunI8x16ShiftOpTest(kExprI8x16ShrS, ArithmeticShiftRight, 1);
1109 } 1193 }
1110 1194
1111 WASM_EXEC_TEST(I8x16ShrU) { 1195 WASM_EXEC_TEST(I8x16ShrU) {
1112 RunI8x16ShiftOpTest(kExprI8x16ShrU, LogicalShiftRight, 1); 1196 RunI8x16ShiftOpTest(kExprI8x16ShrU, LogicalShiftRight, 1);
1113 } 1197 }
1114 1198
1199 // Test Select by making a mask where the first two lanes are true and the rest
1200 // false, and comparing for non-equality with zero to materialize a bool vector.
1115 #define WASM_SIMD_SELECT_TEST(format) \ 1201 #define WASM_SIMD_SELECT_TEST(format) \
1116 WASM_EXEC_TEST(S##format##Select) { \ 1202 WASM_EXEC_TEST(S##format##Select) { \
1117 FLAG_wasm_simd_prototype = true; \ 1203 FLAG_wasm_simd_prototype = true; \
1118 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); \ 1204 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); \
1119 byte val1 = 0; \ 1205 byte val1 = 0; \
1120 byte val2 = 1; \ 1206 byte val2 = 1; \
1121 byte mask = r.AllocateLocal(kWasmS128); \
1122 byte src1 = r.AllocateLocal(kWasmS128); \ 1207 byte src1 = r.AllocateLocal(kWasmS128); \
1123 byte src2 = r.AllocateLocal(kWasmS128); \ 1208 byte src2 = r.AllocateLocal(kWasmS128); \
1124 BUILD(r, WASM_SET_LOCAL(mask, WASM_SIMD_I##format##_SPLAT(WASM_ZERO)), \ 1209 byte zero = r.AllocateLocal(kWasmS128); \
1125 WASM_SET_LOCAL(src1, \ 1210 byte mask = r.AllocateLocal(kWasmS128); \
1126 WASM_SIMD_I##format##_SPLAT(WASM_GET_LOCAL(val1))), \ 1211 BUILD(r, WASM_SET_LOCAL( \
1212 src1, WASM_SIMD_I##format##_SPLAT(WASM_GET_LOCAL(val1))), \
1127 WASM_SET_LOCAL(src2, \ 1213 WASM_SET_LOCAL(src2, \
1128 WASM_SIMD_I##format##_SPLAT(WASM_GET_LOCAL(val2))), \ 1214 WASM_SIMD_I##format##_SPLAT(WASM_GET_LOCAL(val2))), \
1215 WASM_SET_LOCAL(zero, WASM_SIMD_I##format##_SPLAT(WASM_ZERO)), \
1129 WASM_SET_LOCAL(mask, WASM_SIMD_I##format##_REPLACE_LANE( \ 1216 WASM_SET_LOCAL(mask, WASM_SIMD_I##format##_REPLACE_LANE( \
1130 1, WASM_GET_LOCAL(mask), WASM_I32V(-1))), \ 1217 1, WASM_GET_LOCAL(zero), WASM_I32V(-1))), \
1131 WASM_SET_LOCAL(mask, WASM_SIMD_I##format##_REPLACE_LANE( \ 1218 WASM_SET_LOCAL(mask, WASM_SIMD_I##format##_REPLACE_LANE( \
1132 2, WASM_GET_LOCAL(mask), WASM_I32V(-1))), \ 1219 2, WASM_GET_LOCAL(mask), WASM_I32V(-1))), \
1133 WASM_SET_LOCAL(mask, WASM_SIMD_SELECT(format, WASM_GET_LOCAL(mask), \ 1220 WASM_SET_LOCAL( \
1134 WASM_GET_LOCAL(src1), \ 1221 mask, \
1135 WASM_GET_LOCAL(src2))), \ 1222 WASM_SIMD_SELECT(format, WASM_SIMD_BINOP(kExprI##format##Ne, \
1223 WASM_GET_LOCAL(mask), \
1224 WASM_GET_LOCAL(zero)), \
1225 WASM_GET_LOCAL(src1), WASM_GET_LOCAL(src2))), \
1136 WASM_SIMD_CHECK_LANE(I##format, mask, I32, val2, 0), \ 1226 WASM_SIMD_CHECK_LANE(I##format, mask, I32, val2, 0), \
1137 WASM_SIMD_CHECK_LANE(I##format, mask, I32, val1, 1), \ 1227 WASM_SIMD_CHECK_LANE(I##format, mask, I32, val1, 1), \
1138 WASM_SIMD_CHECK_LANE(I##format, mask, I32, val1, 2), \ 1228 WASM_SIMD_CHECK_LANE(I##format, mask, I32, val1, 2), \
1139 WASM_SIMD_CHECK_LANE(I##format, mask, I32, val2, 3), WASM_ONE); \ 1229 WASM_SIMD_CHECK_LANE(I##format, mask, I32, val2, 3), WASM_ONE); \
1140 \ 1230 \
1141 CHECK_EQ(1, r.Call(0x12, 0x34)); \ 1231 CHECK_EQ(1, r.Call(0x12, 0x34)); \
1142 } 1232 }
1143 1233
1144 WASM_SIMD_SELECT_TEST(32x4) 1234 WASM_SIMD_SELECT_TEST(32x4)
1145 WASM_SIMD_SELECT_TEST(16x8) 1235 WASM_SIMD_SELECT_TEST(16x8)
1146 WASM_SIMD_SELECT_TEST(8x16) 1236 WASM_SIMD_SELECT_TEST(8x16)
1147 #endif // V8_TARGET_ARCH_ARM 1237 #endif // V8_TARGET_ARCH_ARM
OLDNEW
« no previous file with comments | « src/x87/assembler-x87.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698