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

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

Issue 2951793003: [wasm] Implement remaining SIMD x64 compare ops, unops. (Closed)
Patch Set: Bill's review Created 3 years, 5 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/compiler/x64/instruction-selector-x64.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 "test/cctest/cctest.h" 6 #include "test/cctest/cctest.h"
7 #include "test/cctest/compiler/value-helper.h" 7 #include "test/cctest/compiler/value-helper.h"
8 #include "test/cctest/wasm/wasm-run-utils.h" 8 #include "test/cctest/wasm/wasm-run-utils.h"
9 #include "test/common/wasm/wasm-macro-gen.h" 9 #include "test/common/wasm/wasm-macro-gen.h"
10 10
(...skipping 914 matching lines...) Expand 10 before | Expand all | Expand 10 after
925 int32_t unpacked_signed = static_cast<int32_t>(Widen<int16_t>(*i)); 925 int32_t unpacked_signed = static_cast<int32_t>(Widen<int16_t>(*i));
926 int32_t unpacked_unsigned = 926 int32_t unpacked_unsigned =
927 static_cast<int32_t>(UnsignedWiden<int16_t>(*i)); 927 static_cast<int32_t>(UnsignedWiden<int16_t>(*i));
928 CHECK_EQ(1, r.Call(*i, unpacked_signed, unpacked_unsigned)); 928 CHECK_EQ(1, r.Call(*i, unpacked_signed, unpacked_unsigned));
929 } 929 }
930 } 930 }
931 #endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_MIPS || 931 #endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_MIPS ||
932 // V8_TARGET_ARCH_MIPS64 932 // V8_TARGET_ARCH_MIPS64
933 933
934 #if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || SIMD_LOWERING_TARGET || \ 934 #if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || SIMD_LOWERING_TARGET || \
935 V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64 935 V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64 || V8_TARGET_ARCH_X64
936 void RunI32x4UnOpTest(WasmOpcode simd_op, Int32UnOp expected_op) { 936 void RunI32x4UnOpTest(WasmOpcode simd_op, Int32UnOp expected_op) {
937 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); 937 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled);
938 byte a = 0; 938 byte a = 0;
939 byte expected = 1; 939 byte expected = 1;
940 byte simd = r.AllocateLocal(kWasmS128); 940 byte simd = r.AllocateLocal(kWasmS128);
941 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(a))), 941 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(a))),
942 WASM_SET_LOCAL(simd, WASM_SIMD_UNOP(simd_op, WASM_GET_LOCAL(simd))), 942 WASM_SET_LOCAL(simd, WASM_SIMD_UNOP(simd_op, WASM_GET_LOCAL(simd))),
943 WASM_SIMD_CHECK_SPLAT4(I32x4, simd, I32, expected), WASM_ONE); 943 WASM_SIMD_CHECK_SPLAT4(I32x4, simd, I32, expected), WASM_ONE);
944 944
945 FOR_INT32_INPUTS(i) { CHECK_EQ(1, r.Call(*i, expected_op(*i))); } 945 FOR_INT32_INPUTS(i) { CHECK_EQ(1, r.Call(*i, expected_op(*i))); }
946 } 946 }
947 947
948 WASM_SIMD_TEST(I32x4Neg) { RunI32x4UnOpTest(kExprI32x4Neg, Negate); } 948 WASM_SIMD_TEST(I32x4Neg) { RunI32x4UnOpTest(kExprI32x4Neg, Negate); }
949 #endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || SIMD_LOWERING_TARGET || 949 #endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || SIMD_LOWERING_TARGET ||
950 // V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64 950 // V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64 || V8_TARGET_ARCH_X64
951 951
952 #if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || SIMD_LOWERING_TARGET 952 #if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || SIMD_LOWERING_TARGET || \
953 V8_TARGET_ARCH_X64
953 WASM_SIMD_TEST(S128Not) { RunI32x4UnOpTest(kExprS128Not, Not); } 954 WASM_SIMD_TEST(S128Not) { RunI32x4UnOpTest(kExprS128Not, Not); }
954 #endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || SIMD_LOWERING_TARGET 955 #endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || SIMD_LOWERING_TARGET
956 // V8_TARGET_ARCH_X64
955 957
956 void RunI32x4BinOpTest(WasmOpcode simd_op, Int32BinOp expected_op) { 958 void RunI32x4BinOpTest(WasmOpcode simd_op, Int32BinOp expected_op) {
957 WasmRunner<int32_t, int32_t, int32_t, int32_t> r(kExecuteCompiled); 959 WasmRunner<int32_t, int32_t, int32_t, int32_t> r(kExecuteCompiled);
958 byte a = 0; 960 byte a = 0;
959 byte b = 1; 961 byte b = 1;
960 byte expected = 2; 962 byte expected = 2;
961 byte simd0 = r.AllocateLocal(kWasmS128); 963 byte simd0 = r.AllocateLocal(kWasmS128);
962 byte simd1 = r.AllocateLocal(kWasmS128); 964 byte simd1 = r.AllocateLocal(kWasmS128);
963 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(a))), 965 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(a))),
964 WASM_SET_LOCAL(simd1, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(b))), 966 WASM_SET_LOCAL(simd1, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(b))),
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
1011 WASM_SIMD_CHECK_SPLAT4(I32x4, simd1, I32, expected), WASM_ONE); 1013 WASM_SIMD_CHECK_SPLAT4(I32x4, simd1, I32, expected), WASM_ONE);
1012 1014
1013 FOR_INT32_INPUTS(i) { 1015 FOR_INT32_INPUTS(i) {
1014 FOR_INT32_INPUTS(j) { CHECK_EQ(1, r.Call(*i, *j, expected_op(*i, *j))); } 1016 FOR_INT32_INPUTS(j) { CHECK_EQ(1, r.Call(*i, *j, expected_op(*i, *j))); }
1015 } 1017 }
1016 } 1018 }
1017 1019
1018 WASM_SIMD_TEST(I32x4Eq) { RunI32x4CompareOpTest(kExprI32x4Eq, Equal); } 1020 WASM_SIMD_TEST(I32x4Eq) { RunI32x4CompareOpTest(kExprI32x4Eq, Equal); }
1019 1021
1020 WASM_SIMD_TEST(I32x4Ne) { RunI32x4CompareOpTest(kExprI32x4Ne, NotEqual); } 1022 WASM_SIMD_TEST(I32x4Ne) { RunI32x4CompareOpTest(kExprI32x4Ne, NotEqual); }
1021 #endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_X64 ||
1022 // SIMD_LOWERING_TARGET || V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64
1023 1023
1024 #if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || SIMD_LOWERING_TARGET || \
1025 V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64
1026 WASM_SIMD_TEST(I32x4LtS) { RunI32x4CompareOpTest(kExprI32x4LtS, Less); } 1024 WASM_SIMD_TEST(I32x4LtS) { RunI32x4CompareOpTest(kExprI32x4LtS, Less); }
1027 1025
1028 WASM_SIMD_TEST(I32x4LeS) { RunI32x4CompareOpTest(kExprI32x4LeS, LessEqual); } 1026 WASM_SIMD_TEST(I32x4LeS) { RunI32x4CompareOpTest(kExprI32x4LeS, LessEqual); }
1029 1027
1030 WASM_SIMD_TEST(I32x4GtS) { RunI32x4CompareOpTest(kExprI32x4GtS, Greater); } 1028 WASM_SIMD_TEST(I32x4GtS) { RunI32x4CompareOpTest(kExprI32x4GtS, Greater); }
1031 1029
1032 WASM_SIMD_TEST(I32x4GeS) { RunI32x4CompareOpTest(kExprI32x4GeS, GreaterEqual); } 1030 WASM_SIMD_TEST(I32x4GeS) { RunI32x4CompareOpTest(kExprI32x4GeS, GreaterEqual); }
1033 1031
1034 WASM_SIMD_TEST(I32x4LtU) { RunI32x4CompareOpTest(kExprI32x4LtU, UnsignedLess); } 1032 WASM_SIMD_TEST(I32x4LtU) { RunI32x4CompareOpTest(kExprI32x4LtU, UnsignedLess); }
1035 1033
1036 WASM_SIMD_TEST(I32x4LeU) { 1034 WASM_SIMD_TEST(I32x4LeU) {
1037 RunI32x4CompareOpTest(kExprI32x4LeU, UnsignedLessEqual); 1035 RunI32x4CompareOpTest(kExprI32x4LeU, UnsignedLessEqual);
1038 } 1036 }
1039 1037
1040 WASM_SIMD_TEST(I32x4GtU) { 1038 WASM_SIMD_TEST(I32x4GtU) {
1041 RunI32x4CompareOpTest(kExprI32x4GtU, UnsignedGreater); 1039 RunI32x4CompareOpTest(kExprI32x4GtU, UnsignedGreater);
1042 } 1040 }
1043 1041
1044 WASM_SIMD_TEST(I32x4GeU) { 1042 WASM_SIMD_TEST(I32x4GeU) {
1045 RunI32x4CompareOpTest(kExprI32x4GeU, UnsignedGreaterEqual); 1043 RunI32x4CompareOpTest(kExprI32x4GeU, UnsignedGreaterEqual);
1046 } 1044 }
1047 #endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || SIMD_LOWERING_TARGET ||
1048 // V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64
1049 1045
1050 #if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_X64 || \
1051 SIMD_LOWERING_TARGET || V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64
1052 void RunI32x4ShiftOpTest(WasmOpcode simd_op, Int32ShiftOp expected_op, 1046 void RunI32x4ShiftOpTest(WasmOpcode simd_op, Int32ShiftOp expected_op,
1053 int shift) { 1047 int shift) {
1054 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); 1048 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled);
1055 byte a = 0; 1049 byte a = 0;
1056 byte expected = 1; 1050 byte expected = 1;
1057 byte simd = r.AllocateLocal(kWasmS128); 1051 byte simd = r.AllocateLocal(kWasmS128);
1058 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(a))), 1052 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(a))),
1059 WASM_SET_LOCAL( 1053 WASM_SET_LOCAL(
1060 simd, WASM_SIMD_SHIFT_OP(simd_op, shift, WASM_GET_LOCAL(simd))), 1054 simd, WASM_SIMD_SHIFT_OP(simd_op, shift, WASM_GET_LOCAL(simd))),
1061 WASM_SIMD_CHECK_SPLAT4(I32x4, simd, I32, expected), WASM_ONE); 1055 WASM_SIMD_CHECK_SPLAT4(I32x4, simd, I32, expected), WASM_ONE);
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1099 FOR_INT8_INPUTS(i) { 1093 FOR_INT8_INPUTS(i) {
1100 int32_t unpacked_signed = static_cast<int32_t>(Widen<int8_t>(*i)); 1094 int32_t unpacked_signed = static_cast<int32_t>(Widen<int8_t>(*i));
1101 int32_t unpacked_unsigned = static_cast<int32_t>(UnsignedWiden<int8_t>(*i)); 1095 int32_t unpacked_unsigned = static_cast<int32_t>(UnsignedWiden<int8_t>(*i));
1102 CHECK_EQ(1, r.Call(*i, unpacked_signed, unpacked_unsigned)); 1096 CHECK_EQ(1, r.Call(*i, unpacked_signed, unpacked_unsigned));
1103 } 1097 }
1104 } 1098 }
1105 #endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_MIPS || 1099 #endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_MIPS ||
1106 // V8_TARGET_ARCH_MIPS64 1100 // V8_TARGET_ARCH_MIPS64
1107 1101
1108 #if SIMD_LOWERING_TARGET || V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || \ 1102 #if SIMD_LOWERING_TARGET || V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || \
1109 V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64 1103 V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64 || V8_TARGET_ARCH_X64
1110 void RunI16x8UnOpTest(WasmOpcode simd_op, Int16UnOp expected_op) { 1104 void RunI16x8UnOpTest(WasmOpcode simd_op, Int16UnOp expected_op) {
1111 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); 1105 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled);
1112 byte a = 0; 1106 byte a = 0;
1113 byte expected = 1; 1107 byte expected = 1;
1114 byte simd = r.AllocateLocal(kWasmS128); 1108 byte simd = r.AllocateLocal(kWasmS128);
1115 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I16x8_SPLAT(WASM_GET_LOCAL(a))), 1109 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I16x8_SPLAT(WASM_GET_LOCAL(a))),
1116 WASM_SET_LOCAL(simd, WASM_SIMD_UNOP(simd_op, WASM_GET_LOCAL(simd))), 1110 WASM_SET_LOCAL(simd, WASM_SIMD_UNOP(simd_op, WASM_GET_LOCAL(simd))),
1117 WASM_SIMD_CHECK_SPLAT8(I16x8, simd, I32, expected), WASM_ONE); 1111 WASM_SIMD_CHECK_SPLAT8(I16x8, simd, I32, expected), WASM_ONE);
1118 1112
1119 FOR_INT16_INPUTS(i) { CHECK_EQ(1, r.Call(*i, expected_op(*i))); } 1113 FOR_INT16_INPUTS(i) { CHECK_EQ(1, r.Call(*i, expected_op(*i))); }
1120 } 1114 }
1121 1115
1122 WASM_SIMD_TEST(I16x8Neg) { RunI16x8UnOpTest(kExprI16x8Neg, Negate); } 1116 WASM_SIMD_TEST(I16x8Neg) { RunI16x8UnOpTest(kExprI16x8Neg, Negate); }
1123 #endif // SIMD_LOWERING_TARGET || V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || 1117 #endif // SIMD_LOWERING_TARGET || V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 ||
1124 // V8_TARGET_ARCH_MIPS || 1118 // V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64 || V8_TARGET_ARCH_X64
1125 // V8_TARGET_ARCH_MIPS64
1126 1119
1127 #if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_MIPS || \ 1120 #if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_MIPS || \
1128 V8_TARGET_ARCH_MIPS64 1121 V8_TARGET_ARCH_MIPS64
1129 // Tests both signed and unsigned conversion from I32x4 (packing). 1122 // Tests both signed and unsigned conversion from I32x4 (packing).
1130 WASM_SIMD_TEST(I16x8ConvertI32x4) { 1123 WASM_SIMD_TEST(I16x8ConvertI32x4) {
1131 WasmRunner<int32_t, int32_t, int32_t, int32_t> r(kExecuteCompiled); 1124 WasmRunner<int32_t, int32_t, int32_t, int32_t> r(kExecuteCompiled);
1132 byte a = 0; 1125 byte a = 0;
1133 byte packed_signed = 1; 1126 byte packed_signed = 1;
1134 byte packed_unsigned = 2; 1127 byte packed_unsigned = 2;
1135 byte simd0 = r.AllocateLocal(kWasmS128); 1128 byte simd0 = r.AllocateLocal(kWasmS128);
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
1180 1173
1181 WASM_SIMD_TEST(I16x8AddSaturateS) { 1174 WASM_SIMD_TEST(I16x8AddSaturateS) {
1182 RunI16x8BinOpTest(kExprI16x8AddSaturateS, AddSaturate); 1175 RunI16x8BinOpTest(kExprI16x8AddSaturateS, AddSaturate);
1183 } 1176 }
1184 1177
1185 WASM_SIMD_TEST(I16x8Sub) { RunI16x8BinOpTest(kExprI16x8Sub, Sub); } 1178 WASM_SIMD_TEST(I16x8Sub) { RunI16x8BinOpTest(kExprI16x8Sub, Sub); }
1186 1179
1187 WASM_SIMD_TEST(I16x8SubSaturateS) { 1180 WASM_SIMD_TEST(I16x8SubSaturateS) {
1188 RunI16x8BinOpTest(kExprI16x8SubSaturateS, SubSaturate); 1181 RunI16x8BinOpTest(kExprI16x8SubSaturateS, SubSaturate);
1189 } 1182 }
1190 #endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_X64 ||
1191 // SIMD_LOWERING_TARGET || V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64
1192 1183
1193 #if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_X64 || \
1194 SIMD_LOWERING_TARGET || V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64
1195 WASM_SIMD_TEST(I16x8Mul) { RunI16x8BinOpTest(kExprI16x8Mul, Mul); } 1184 WASM_SIMD_TEST(I16x8Mul) { RunI16x8BinOpTest(kExprI16x8Mul, Mul); }
1196 1185
1197 WASM_SIMD_TEST(I16x8MinS) { RunI16x8BinOpTest(kExprI16x8MinS, Minimum); } 1186 WASM_SIMD_TEST(I16x8MinS) { RunI16x8BinOpTest(kExprI16x8MinS, Minimum); }
1198 1187
1199 WASM_SIMD_TEST(I16x8MaxS) { RunI16x8BinOpTest(kExprI16x8MaxS, Maximum); } 1188 WASM_SIMD_TEST(I16x8MaxS) { RunI16x8BinOpTest(kExprI16x8MaxS, Maximum); }
1200 1189
1201 WASM_SIMD_TEST(I16x8AddSaturateU) { 1190 WASM_SIMD_TEST(I16x8AddSaturateU) {
1202 RunI16x8BinOpTest(kExprI16x8AddSaturateU, UnsignedAddSaturate); 1191 RunI16x8BinOpTest(kExprI16x8AddSaturateU, UnsignedAddSaturate);
1203 } 1192 }
1204 1193
(...skipping 23 matching lines...) Expand all
1228 WASM_SIMD_CHECK_SPLAT8(I16x8, simd1, I32, expected), WASM_ONE); 1217 WASM_SIMD_CHECK_SPLAT8(I16x8, simd1, I32, expected), WASM_ONE);
1229 1218
1230 FOR_INT16_INPUTS(i) { 1219 FOR_INT16_INPUTS(i) {
1231 FOR_INT16_INPUTS(j) { CHECK_EQ(1, r.Call(*i, *j, expected_op(*i, *j))); } 1220 FOR_INT16_INPUTS(j) { CHECK_EQ(1, r.Call(*i, *j, expected_op(*i, *j))); }
1232 } 1221 }
1233 } 1222 }
1234 1223
1235 WASM_SIMD_TEST(I16x8Eq) { RunI16x8CompareOpTest(kExprI16x8Eq, Equal); } 1224 WASM_SIMD_TEST(I16x8Eq) { RunI16x8CompareOpTest(kExprI16x8Eq, Equal); }
1236 1225
1237 WASM_SIMD_TEST(I16x8Ne) { RunI16x8CompareOpTest(kExprI16x8Ne, NotEqual); } 1226 WASM_SIMD_TEST(I16x8Ne) { RunI16x8CompareOpTest(kExprI16x8Ne, NotEqual); }
1238 #endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_X64 ||
1239 // SIMD_LOWERING_TARGET || V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64
1240 1227
1241 #if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || SIMD_LOWERING_TARGET || \
1242 V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64
1243 WASM_SIMD_TEST(I16x8LtS) { RunI16x8CompareOpTest(kExprI16x8LtS, Less); } 1228 WASM_SIMD_TEST(I16x8LtS) { RunI16x8CompareOpTest(kExprI16x8LtS, Less); }
1244 1229
1245 WASM_SIMD_TEST(I16x8LeS) { RunI16x8CompareOpTest(kExprI16x8LeS, LessEqual); } 1230 WASM_SIMD_TEST(I16x8LeS) { RunI16x8CompareOpTest(kExprI16x8LeS, LessEqual); }
1246 1231
1247 WASM_SIMD_TEST(I16x8GtS) { RunI16x8CompareOpTest(kExprI16x8GtS, Greater); } 1232 WASM_SIMD_TEST(I16x8GtS) { RunI16x8CompareOpTest(kExprI16x8GtS, Greater); }
1248 1233
1249 WASM_SIMD_TEST(I16x8GeS) { RunI16x8CompareOpTest(kExprI16x8GeS, GreaterEqual); } 1234 WASM_SIMD_TEST(I16x8GeS) { RunI16x8CompareOpTest(kExprI16x8GeS, GreaterEqual); }
1250 1235
1251 WASM_SIMD_TEST(I16x8GtU) { 1236 WASM_SIMD_TEST(I16x8GtU) {
1252 RunI16x8CompareOpTest(kExprI16x8GtU, UnsignedGreater); 1237 RunI16x8CompareOpTest(kExprI16x8GtU, UnsignedGreater);
1253 } 1238 }
1254 1239
1255 WASM_SIMD_TEST(I16x8GeU) { 1240 WASM_SIMD_TEST(I16x8GeU) {
1256 RunI16x8CompareOpTest(kExprI16x8GeU, UnsignedGreaterEqual); 1241 RunI16x8CompareOpTest(kExprI16x8GeU, UnsignedGreaterEqual);
1257 } 1242 }
1258 1243
1259 WASM_SIMD_TEST(I16x8LtU) { RunI16x8CompareOpTest(kExprI16x8LtU, UnsignedLess); } 1244 WASM_SIMD_TEST(I16x8LtU) { RunI16x8CompareOpTest(kExprI16x8LtU, UnsignedLess); }
1260 1245
1261 WASM_SIMD_TEST(I16x8LeU) { 1246 WASM_SIMD_TEST(I16x8LeU) {
1262 RunI16x8CompareOpTest(kExprI16x8LeU, UnsignedLessEqual); 1247 RunI16x8CompareOpTest(kExprI16x8LeU, UnsignedLessEqual);
1263 } 1248 }
1264 #endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || SIMD_LOWERING_TARGET ||
1265 // V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64
1266 1249
1267 #if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_X64 || \
1268 SIMD_LOWERING_TARGET || V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64
1269 void RunI16x8ShiftOpTest(WasmOpcode simd_op, Int16ShiftOp expected_op, 1250 void RunI16x8ShiftOpTest(WasmOpcode simd_op, Int16ShiftOp expected_op,
1270 int shift) { 1251 int shift) {
1271 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); 1252 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled);
1272 byte a = 0; 1253 byte a = 0;
1273 byte expected = 1; 1254 byte expected = 1;
1274 byte simd = r.AllocateLocal(kWasmS128); 1255 byte simd = r.AllocateLocal(kWasmS128);
1275 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I16x8_SPLAT(WASM_GET_LOCAL(a))), 1256 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I16x8_SPLAT(WASM_GET_LOCAL(a))),
1276 WASM_SET_LOCAL( 1257 WASM_SET_LOCAL(
1277 simd, WASM_SIMD_SHIFT_OP(simd_op, shift, WASM_GET_LOCAL(simd))), 1258 simd, WASM_SIMD_SHIFT_OP(simd_op, shift, WASM_GET_LOCAL(simd))),
1278 WASM_SIMD_CHECK_SPLAT8(I16x8, simd, I32, expected), WASM_ONE); 1259 WASM_SIMD_CHECK_SPLAT8(I16x8, simd, I32, expected), WASM_ONE);
1279 1260
1280 FOR_INT16_INPUTS(i) { CHECK_EQ(1, r.Call(*i, expected_op(*i, shift))); } 1261 FOR_INT16_INPUTS(i) { CHECK_EQ(1, r.Call(*i, expected_op(*i, shift))); }
1281 } 1262 }
1282 1263
1283 WASM_SIMD_TEST(I16x8Shl) { 1264 WASM_SIMD_TEST(I16x8Shl) {
1284 RunI16x8ShiftOpTest(kExprI16x8Shl, LogicalShiftLeft, 1); 1265 RunI16x8ShiftOpTest(kExprI16x8Shl, LogicalShiftLeft, 1);
1285 } 1266 }
1286 1267
1287 WASM_SIMD_TEST(I16x8ShrS) { 1268 WASM_SIMD_TEST(I16x8ShrS) {
1288 RunI16x8ShiftOpTest(kExprI16x8ShrS, ArithmeticShiftRight, 1); 1269 RunI16x8ShiftOpTest(kExprI16x8ShrS, ArithmeticShiftRight, 1);
1289 } 1270 }
1290 1271
1291 WASM_SIMD_TEST(I16x8ShrU) { 1272 WASM_SIMD_TEST(I16x8ShrU) {
1292 RunI16x8ShiftOpTest(kExprI16x8ShrU, LogicalShiftRight, 1); 1273 RunI16x8ShiftOpTest(kExprI16x8ShrU, LogicalShiftRight, 1);
1293 } 1274 }
1294 #endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_X64 ||
1295 // SIMD_LOWERING_TARGET || V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64
1296 1275
1297 #if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_MIPS || \
1298 V8_TARGET_ARCH_MIPS64 || SIMD_LOWERING_TARGET
1299 void RunI8x16UnOpTest(WasmOpcode simd_op, Int8UnOp expected_op) { 1276 void RunI8x16UnOpTest(WasmOpcode simd_op, Int8UnOp expected_op) {
1300 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); 1277 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled);
1301 byte a = 0; 1278 byte a = 0;
1302 byte expected = 1; 1279 byte expected = 1;
1303 byte simd = r.AllocateLocal(kWasmS128); 1280 byte simd = r.AllocateLocal(kWasmS128);
1304 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I8x16_SPLAT(WASM_GET_LOCAL(a))), 1281 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I8x16_SPLAT(WASM_GET_LOCAL(a))),
1305 WASM_SET_LOCAL(simd, WASM_SIMD_UNOP(simd_op, WASM_GET_LOCAL(simd))), 1282 WASM_SET_LOCAL(simd, WASM_SIMD_UNOP(simd_op, WASM_GET_LOCAL(simd))),
1306 WASM_SIMD_CHECK_SPLAT16(I8x16, simd, I32, expected), WASM_ONE); 1283 WASM_SIMD_CHECK_SPLAT16(I8x16, simd, I32, expected), WASM_ONE);
1307 1284
1308 FOR_INT8_INPUTS(i) { CHECK_EQ(1, r.Call(*i, expected_op(*i))); } 1285 FOR_INT8_INPUTS(i) { CHECK_EQ(1, r.Call(*i, expected_op(*i))); }
1309 } 1286 }
1310 1287
1311 WASM_SIMD_TEST(I8x16Neg) { RunI8x16UnOpTest(kExprI8x16Neg, Negate); } 1288 WASM_SIMD_TEST(I8x16Neg) { RunI8x16UnOpTest(kExprI8x16Neg, Negate); }
1312 #endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_MIPS || 1289 #endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_X64 ||
1313 // V8_TARGET_ARCH_MIPS64 || SIMD_LOWERING_TARGET 1290 // SIMD_LOWERING_TARGET || V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64
1314 1291
1315 #if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_MIPS || \ 1292 #if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_MIPS || \
1316 V8_TARGET_ARCH_MIPS64 1293 V8_TARGET_ARCH_MIPS64
1317 // Tests both signed and unsigned conversion from I16x8 (packing). 1294 // Tests both signed and unsigned conversion from I16x8 (packing).
1318 WASM_SIMD_TEST(I8x16ConvertI16x8) { 1295 WASM_SIMD_TEST(I8x16ConvertI16x8) {
1319 WasmRunner<int32_t, int32_t, int32_t, int32_t> r(kExecuteCompiled); 1296 WasmRunner<int32_t, int32_t, int32_t, int32_t> r(kExecuteCompiled);
1320 byte a = 0; 1297 byte a = 0;
1321 byte packed_signed = 1; 1298 byte packed_signed = 1;
1322 byte packed_unsigned = 2; 1299 byte packed_unsigned = 2;
1323 byte simd0 = r.AllocateLocal(kWasmS128); 1300 byte simd0 = r.AllocateLocal(kWasmS128);
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
1410 WASM_SIMD_CHECK_SPLAT16(I8x16, simd1, I32, expected), WASM_ONE); 1387 WASM_SIMD_CHECK_SPLAT16(I8x16, simd1, I32, expected), WASM_ONE);
1411 1388
1412 FOR_INT8_INPUTS(i) { 1389 FOR_INT8_INPUTS(i) {
1413 FOR_INT8_INPUTS(j) { CHECK_EQ(1, r.Call(*i, *j, expected_op(*i, *j))); } 1390 FOR_INT8_INPUTS(j) { CHECK_EQ(1, r.Call(*i, *j, expected_op(*i, *j))); }
1414 } 1391 }
1415 } 1392 }
1416 1393
1417 WASM_SIMD_TEST(I8x16Eq) { RunI8x16CompareOpTest(kExprI8x16Eq, Equal); } 1394 WASM_SIMD_TEST(I8x16Eq) { RunI8x16CompareOpTest(kExprI8x16Eq, Equal); }
1418 1395
1419 WASM_SIMD_TEST(I8x16Ne) { RunI8x16CompareOpTest(kExprI8x16Ne, NotEqual); } 1396 WASM_SIMD_TEST(I8x16Ne) { RunI8x16CompareOpTest(kExprI8x16Ne, NotEqual); }
1420 #endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_X64 ||
1421 // SIMD_LOWERING_TARGET || V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64
1422 1397
1423 #if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || SIMD_LOWERING_TARGET || \
1424 V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64
1425 WASM_SIMD_TEST(I8x16Mul) { RunI8x16BinOpTest(kExprI8x16Mul, Mul); }
1426 #endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_X64 ||
1427 // V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64
1428
1429 #if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || SIMD_LOWERING_TARGET || \
1430 V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64
1431 WASM_SIMD_TEST(I8x16GtS) { RunI8x16CompareOpTest(kExprI8x16GtS, Greater); } 1398 WASM_SIMD_TEST(I8x16GtS) { RunI8x16CompareOpTest(kExprI8x16GtS, Greater); }
1432 1399
1433 WASM_SIMD_TEST(I8x16GeS) { RunI8x16CompareOpTest(kExprI8x16GeS, GreaterEqual); } 1400 WASM_SIMD_TEST(I8x16GeS) { RunI8x16CompareOpTest(kExprI8x16GeS, GreaterEqual); }
1434 1401
1435 WASM_SIMD_TEST(I8x16LtS) { RunI8x16CompareOpTest(kExprI8x16LtS, Less); } 1402 WASM_SIMD_TEST(I8x16LtS) { RunI8x16CompareOpTest(kExprI8x16LtS, Less); }
1436 1403
1437 WASM_SIMD_TEST(I8x16LeS) { RunI8x16CompareOpTest(kExprI8x16LeS, LessEqual); } 1404 WASM_SIMD_TEST(I8x16LeS) { RunI8x16CompareOpTest(kExprI8x16LeS, LessEqual); }
1438 1405
1439 WASM_SIMD_TEST(I8x16GtU) { 1406 WASM_SIMD_TEST(I8x16GtU) {
1440 RunI8x16CompareOpTest(kExprI8x16GtU, UnsignedGreater); 1407 RunI8x16CompareOpTest(kExprI8x16GtU, UnsignedGreater);
1441 } 1408 }
1442 1409
1443 WASM_SIMD_TEST(I8x16GeU) { 1410 WASM_SIMD_TEST(I8x16GeU) {
1444 RunI8x16CompareOpTest(kExprI8x16GeU, UnsignedGreaterEqual); 1411 RunI8x16CompareOpTest(kExprI8x16GeU, UnsignedGreaterEqual);
1445 } 1412 }
1446 1413
1447 WASM_SIMD_TEST(I8x16LtU) { RunI8x16CompareOpTest(kExprI8x16LtU, UnsignedLess); } 1414 WASM_SIMD_TEST(I8x16LtU) { RunI8x16CompareOpTest(kExprI8x16LtU, UnsignedLess); }
1448 1415
1449 WASM_SIMD_TEST(I8x16LeU) { 1416 WASM_SIMD_TEST(I8x16LeU) {
1450 RunI8x16CompareOpTest(kExprI8x16LeU, UnsignedLessEqual); 1417 RunI8x16CompareOpTest(kExprI8x16LeU, UnsignedLessEqual);
1451 } 1418 }
1452 #endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || SIMD_LOWERING_TARGET 1419 #endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_X64 ||
1453 // || V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64 1420 // SIMD_LOWERING_TARGET || V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64
1421
1422 #if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || SIMD_LOWERING_TARGET || \
1423 V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64
1424 WASM_SIMD_TEST(I8x16Mul) { RunI8x16BinOpTest(kExprI8x16Mul, Mul); }
1425 #endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_X64 ||
1426 // V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64
1454 1427
1455 void RunI8x16ShiftOpTest(WasmOpcode simd_op, Int8ShiftOp expected_op, 1428 void RunI8x16ShiftOpTest(WasmOpcode simd_op, Int8ShiftOp expected_op,
1456 int shift) { 1429 int shift) {
1457 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); 1430 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled);
1458 byte a = 0; 1431 byte a = 0;
1459 byte expected = 1; 1432 byte expected = 1;
1460 byte simd = r.AllocateLocal(kWasmS128); 1433 byte simd = r.AllocateLocal(kWasmS128);
1461 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I8x16_SPLAT(WASM_GET_LOCAL(a))), 1434 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I8x16_SPLAT(WASM_GET_LOCAL(a))),
1462 WASM_SET_LOCAL( 1435 WASM_SET_LOCAL(
1463 simd, WASM_SIMD_SHIFT_OP(simd_op, shift, WASM_GET_LOCAL(simd))), 1436 simd, WASM_SIMD_SHIFT_OP(simd_op, shift, WASM_GET_LOCAL(simd))),
1464 WASM_SIMD_CHECK_SPLAT16(I8x16, simd, I32, expected), WASM_ONE); 1437 WASM_SIMD_CHECK_SPLAT16(I8x16, simd, I32, expected), WASM_ONE);
1465 1438
1466 FOR_INT8_INPUTS(i) { CHECK_EQ(1, r.Call(*i, expected_op(*i, shift))); } 1439 FOR_INT8_INPUTS(i) { CHECK_EQ(1, r.Call(*i, expected_op(*i, shift))); }
1467 } 1440 }
1468 1441
1469 #if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_MIPS || \ 1442 #if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_MIPS || \
1470 V8_TARGET_ARCH_MIPS64 || SIMD_LOWERING_TARGET 1443 V8_TARGET_ARCH_MIPS64 || SIMD_LOWERING_TARGET
1471 WASM_SIMD_TEST(I8x16Shl) { 1444 WASM_SIMD_TEST(I8x16Shl) {
1472 RunI8x16ShiftOpTest(kExprI8x16Shl, LogicalShiftLeft, 1); 1445 RunI8x16ShiftOpTest(kExprI8x16Shl, LogicalShiftLeft, 1);
1473 } 1446 }
1474 1447
1475 WASM_SIMD_TEST(I8x16ShrS) { 1448 WASM_SIMD_TEST(I8x16ShrS) {
1476 RunI8x16ShiftOpTest(kExprI8x16ShrS, ArithmeticShiftRight, 1); 1449 RunI8x16ShiftOpTest(kExprI8x16ShrS, ArithmeticShiftRight, 1);
1477 } 1450 }
1451
1452 WASM_SIMD_TEST(I8x16ShrU) {
1453 RunI8x16ShiftOpTest(kExprI8x16ShrU, LogicalShiftRight, 1);
1454 }
1478 #endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_MIPS || 1455 #endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_MIPS ||
1479 // V8_TARGET_ARCH_MIPS64 || SIMD_LOWERING_TARGET 1456 // V8_TARGET_ARCH_MIPS64 || SIMD_LOWERING_TARGET
1480 1457
1481 #if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || SIMD_LOWERING_TARGET || \
1482 V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64
1483 WASM_SIMD_TEST(I8x16ShrU) {
1484 RunI8x16ShiftOpTest(kExprI8x16ShrU, LogicalShiftRight, 1);
1485 }
1486 #endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || SIMD_LOWERING_TARGET ||
1487 // V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64
1488
1489 #if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_X64 || \ 1458 #if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_X64 || \
1490 V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64 1459 V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64
1491 // Test Select by making a mask where the 0th and 3rd lanes are true and the 1460 // Test Select by making a mask where the 0th and 3rd lanes are true and the
1492 // rest false, and comparing for non-equality with zero to convert to a boolean 1461 // rest false, and comparing for non-equality with zero to convert to a boolean
1493 // vector. 1462 // vector.
1494 #define WASM_SIMD_SELECT_TEST(format) \ 1463 #define WASM_SIMD_SELECT_TEST(format) \
1495 WASM_SIMD_TEST(S##format##Select) { \ 1464 WASM_SIMD_TEST(S##format##Select) { \
1496 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); \ 1465 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); \
1497 byte val1 = 0; \ 1466 byte val1 = 0; \
1498 byte val2 = 1; \ 1467 byte val2 = 1; \
(...skipping 712 matching lines...) Expand 10 before | Expand all | Expand 10 after
2211 WASM_SIMD_I32x4_EXTRACT_LANE(0, WASM_SIMD_LOAD_MEM(WASM_ZERO))); 2180 WASM_SIMD_I32x4_EXTRACT_LANE(0, WASM_SIMD_LOAD_MEM(WASM_ZERO)));
2212 2181
2213 FOR_INT32_INPUTS(i) { 2182 FOR_INT32_INPUTS(i) {
2214 int32_t expected = *i; 2183 int32_t expected = *i;
2215 r.module().WriteMemory(&memory[0], expected); 2184 r.module().WriteMemory(&memory[0], expected);
2216 CHECK_EQ(expected, r.Call()); 2185 CHECK_EQ(expected, r.Call());
2217 } 2186 }
2218 } 2187 }
2219 #endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || SIMD_LOWERING_TARGET || 2188 #endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || SIMD_LOWERING_TARGET ||
2220 // V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64 2189 // V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64
OLDNEW
« no previous file with comments | « src/compiler/x64/instruction-selector-x64.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698