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 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
50 T Sub(T a, T b) { | 50 T Sub(T a, T b) { |
51 return a - b; | 51 return a - b; |
52 } | 52 } |
53 | 53 |
54 template <typename T> | 54 template <typename T> |
55 T Mul(T a, T b) { | 55 T Mul(T a, T b) { |
56 return a * b; | 56 return a * b; |
57 } | 57 } |
58 | 58 |
59 template <typename T> | 59 template <typename T> |
| 60 T Div(T a, T b) { |
| 61 return a / b; |
| 62 } |
| 63 |
| 64 template <typename T> |
60 T Minimum(T a, T b) { | 65 T Minimum(T a, T b) { |
61 return a <= b ? a : b; | 66 return a <= b ? a : b; |
62 } | 67 } |
63 | 68 |
64 template <typename T> | 69 template <typename T> |
65 T Maximum(T a, T b) { | 70 T Maximum(T a, T b) { |
66 return a >= b ? a : b; | 71 return a >= b ? a : b; |
67 } | 72 } |
68 | 73 |
69 template <typename T> | 74 template <typename T> |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
202 return a ^ b; | 207 return a ^ b; |
203 } | 208 } |
204 | 209 |
205 template <typename T> | 210 template <typename T> |
206 T Not(T a) { | 211 T Not(T a) { |
207 return ~a; | 212 return ~a; |
208 } | 213 } |
209 | 214 |
210 } // namespace | 215 } // namespace |
211 | 216 |
| 217 #if !V8_TARGET_ARCH_ARM && !V8_TARGET_ARCH_X64 |
| 218 #define SIMD_LOWERING_TARGET 1 |
| 219 #else |
| 220 #define SIMD_LOWERING_TARGET 0 |
| 221 #endif // !V8_TARGET_ARCH_ARM && !V8_TARGET_ARCH_X64 |
| 222 |
212 // TODO(gdeepti): These are tests using sample values to verify functional | 223 // TODO(gdeepti): These are tests using sample values to verify functional |
213 // correctness of opcodes, add more tests for a range of values and macroize | 224 // correctness of opcodes, add more tests for a range of values and macroize |
214 // tests. | 225 // tests. |
215 | 226 |
216 // TODO(bbudge) Figure out how to compare floats in Wasm code that can handle | 227 // TODO(bbudge) Figure out how to compare floats in Wasm code that can handle |
217 // NaNs. For now, our tests avoid using NaNs. | 228 // NaNs. For now, our tests avoid using NaNs. |
218 #define WASM_SIMD_CHECK_LANE(TYPE, value, LANE_TYPE, lane_value, lane_index) \ | 229 #define WASM_SIMD_CHECK_LANE(TYPE, value, LANE_TYPE, lane_value, lane_index) \ |
219 WASM_IF(WASM_##LANE_TYPE##_NE(WASM_GET_LOCAL(lane_value), \ | 230 WASM_IF(WASM_##LANE_TYPE##_NE(WASM_GET_LOCAL(lane_value), \ |
220 WASM_SIMD_##TYPE##_EXTRACT_LANE( \ | 231 WASM_SIMD_##TYPE##_EXTRACT_LANE( \ |
221 lane_index, WASM_GET_LOCAL(value))), \ | 232 lane_index, WASM_GET_LOCAL(value))), \ |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
292 #define WASM_SIMD_SHIFT_OP(op, shift, x) x, WASM_SIMD_OP(op), TO_BYTE(shift) | 303 #define WASM_SIMD_SHIFT_OP(op, shift, x) x, WASM_SIMD_OP(op), TO_BYTE(shift) |
293 #define WASM_SIMD_SELECT(format, x, y, z) \ | 304 #define WASM_SIMD_SELECT(format, x, y, z) \ |
294 x, y, z, WASM_SIMD_OP(kExprS##format##Select) | 305 x, y, z, WASM_SIMD_OP(kExprS##format##Select) |
295 // Since boolean vectors can't be checked directly, materialize them into | 306 // Since boolean vectors can't be checked directly, materialize them into |
296 // integer vectors using a Select operation. | 307 // integer vectors using a Select operation. |
297 #define WASM_SIMD_MATERIALIZE_BOOLS(format, x) \ | 308 #define WASM_SIMD_MATERIALIZE_BOOLS(format, x) \ |
298 x, WASM_SIMD_I##format##_SPLAT(WASM_ONE), \ | 309 x, WASM_SIMD_I##format##_SPLAT(WASM_ONE), \ |
299 WASM_SIMD_I##format##_SPLAT(WASM_ZERO), \ | 310 WASM_SIMD_I##format##_SPLAT(WASM_ZERO), \ |
300 WASM_SIMD_OP(kExprS##format##Select) | 311 WASM_SIMD_OP(kExprS##format##Select) |
301 | 312 |
| 313 #define WASM_SIMD_F32x4_SPLAT(x) x, WASM_SIMD_OP(kExprF32x4Splat) |
| 314 #define WASM_SIMD_F32x4_EXTRACT_LANE(lane, x) \ |
| 315 x, WASM_SIMD_OP(kExprF32x4ExtractLane), TO_BYTE(lane) |
| 316 #define WASM_SIMD_F32x4_REPLACE_LANE(lane, x, y) \ |
| 317 x, y, WASM_SIMD_OP(kExprF32x4ReplaceLane), TO_BYTE(lane) |
| 318 |
| 319 #define WASM_SIMD_I32x4_SPLAT(x) x, WASM_SIMD_OP(kExprI32x4Splat) |
| 320 #define WASM_SIMD_I32x4_EXTRACT_LANE(lane, x) \ |
| 321 x, WASM_SIMD_OP(kExprI32x4ExtractLane), TO_BYTE(lane) |
| 322 #define WASM_SIMD_I32x4_REPLACE_LANE(lane, x, y) \ |
| 323 x, y, WASM_SIMD_OP(kExprI32x4ReplaceLane), TO_BYTE(lane) |
| 324 |
302 #define WASM_SIMD_I16x8_SPLAT(x) x, WASM_SIMD_OP(kExprI16x8Splat) | 325 #define WASM_SIMD_I16x8_SPLAT(x) x, WASM_SIMD_OP(kExprI16x8Splat) |
303 #define WASM_SIMD_I16x8_EXTRACT_LANE(lane, x) \ | 326 #define WASM_SIMD_I16x8_EXTRACT_LANE(lane, x) \ |
304 x, WASM_SIMD_OP(kExprI16x8ExtractLane), TO_BYTE(lane) | 327 x, WASM_SIMD_OP(kExprI16x8ExtractLane), TO_BYTE(lane) |
305 #define WASM_SIMD_I16x8_REPLACE_LANE(lane, x, y) \ | 328 #define WASM_SIMD_I16x8_REPLACE_LANE(lane, x, y) \ |
306 x, y, WASM_SIMD_OP(kExprI16x8ReplaceLane), TO_BYTE(lane) | 329 x, y, WASM_SIMD_OP(kExprI16x8ReplaceLane), TO_BYTE(lane) |
| 330 |
307 #define WASM_SIMD_I8x16_SPLAT(x) x, WASM_SIMD_OP(kExprI8x16Splat) | 331 #define WASM_SIMD_I8x16_SPLAT(x) x, WASM_SIMD_OP(kExprI8x16Splat) |
308 #define WASM_SIMD_I8x16_EXTRACT_LANE(lane, x) \ | 332 #define WASM_SIMD_I8x16_EXTRACT_LANE(lane, x) \ |
309 x, WASM_SIMD_OP(kExprI8x16ExtractLane), TO_BYTE(lane) | 333 x, WASM_SIMD_OP(kExprI8x16ExtractLane), TO_BYTE(lane) |
310 #define WASM_SIMD_I8x16_REPLACE_LANE(lane, x, y) \ | 334 #define WASM_SIMD_I8x16_REPLACE_LANE(lane, x, y) \ |
311 x, y, WASM_SIMD_OP(kExprI8x16ReplaceLane), TO_BYTE(lane) | 335 x, y, WASM_SIMD_OP(kExprI8x16ReplaceLane), TO_BYTE(lane) |
312 | 336 |
313 #define WASM_SIMD_F32x4_FROM_I32x4(x) x, WASM_SIMD_OP(kExprF32x4SConvertI32x4) | 337 #define WASM_SIMD_F32x4_FROM_I32x4(x) x, WASM_SIMD_OP(kExprF32x4SConvertI32x4) |
314 #define WASM_SIMD_F32x4_FROM_U32x4(x) x, WASM_SIMD_OP(kExprF32x4UConvertI32x4) | 338 #define WASM_SIMD_F32x4_FROM_U32x4(x) x, WASM_SIMD_OP(kExprF32x4UConvertI32x4) |
315 #define WASM_SIMD_I32x4_FROM_F32x4(x) x, WASM_SIMD_OP(kExprI32x4SConvertF32x4) | 339 #define WASM_SIMD_I32x4_FROM_F32x4(x) x, WASM_SIMD_OP(kExprI32x4SConvertF32x4) |
316 #define WASM_SIMD_U32x4_FROM_F32x4(x) x, WASM_SIMD_OP(kExprI32x4UConvertF32x4) | 340 #define WASM_SIMD_U32x4_FROM_F32x4(x) x, WASM_SIMD_OP(kExprI32x4UConvertF32x4) |
317 | 341 |
318 #if V8_TARGET_ARCH_ARM | 342 #if V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET |
319 WASM_EXEC_TEST(F32x4Splat) { | 343 WASM_EXEC_COMPILED_TEST(F32x4Splat) { |
320 FLAG_wasm_simd_prototype = true; | 344 FLAG_wasm_simd_prototype = true; |
321 | 345 |
322 WasmRunner<int32_t, float> r(kExecuteCompiled); | 346 WasmRunner<int32_t, float> r(kExecuteCompiled); |
323 byte lane_val = 0; | 347 byte lane_val = 0; |
324 byte simd = r.AllocateLocal(kWasmS128); | 348 byte simd = r.AllocateLocal(kWasmS128); |
325 BUILD(r, | 349 BUILD(r, |
326 WASM_SET_LOCAL(simd, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(lane_val))), | 350 WASM_SET_LOCAL(simd, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(lane_val))), |
327 WASM_SIMD_CHECK_SPLAT4_F32(F32x4, simd, lane_val), WASM_ONE); | 351 WASM_SIMD_CHECK_SPLAT4_F32(F32x4, simd, lane_val), WASM_ONE); |
328 | 352 |
329 FOR_FLOAT32_INPUTS(i) { CHECK_EQ(1, r.Call(*i)); } | 353 FOR_FLOAT32_INPUTS(i) { CHECK_EQ(1, r.Call(*i)); } |
330 } | 354 } |
331 | 355 |
332 WASM_EXEC_TEST(F32x4ReplaceLane) { | 356 WASM_EXEC_COMPILED_TEST(F32x4ReplaceLane) { |
333 FLAG_wasm_simd_prototype = true; | 357 FLAG_wasm_simd_prototype = true; |
334 WasmRunner<int32_t, float, float> r(kExecuteCompiled); | 358 WasmRunner<int32_t, float, float> r(kExecuteCompiled); |
335 byte old_val = 0; | 359 byte old_val = 0; |
336 byte new_val = 1; | 360 byte new_val = 1; |
337 byte simd = r.AllocateLocal(kWasmS128); | 361 byte simd = r.AllocateLocal(kWasmS128); |
338 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(old_val))), | 362 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(old_val))), |
339 WASM_SET_LOCAL(simd, | 363 WASM_SET_LOCAL(simd, |
340 WASM_SIMD_F32x4_REPLACE_LANE(0, WASM_GET_LOCAL(simd), | 364 WASM_SIMD_F32x4_REPLACE_LANE(0, WASM_GET_LOCAL(simd), |
341 WASM_GET_LOCAL(new_val))), | 365 WASM_GET_LOCAL(new_val))), |
342 WASM_SIMD_CHECK4(F32x4, simd, F32, new_val, old_val, old_val, old_val), | 366 WASM_SIMD_CHECK4(F32x4, simd, F32, new_val, old_val, old_val, old_val), |
343 WASM_SET_LOCAL(simd, | 367 WASM_SET_LOCAL(simd, |
344 WASM_SIMD_F32x4_REPLACE_LANE(1, WASM_GET_LOCAL(simd), | 368 WASM_SIMD_F32x4_REPLACE_LANE(1, WASM_GET_LOCAL(simd), |
345 WASM_GET_LOCAL(new_val))), | 369 WASM_GET_LOCAL(new_val))), |
346 WASM_SIMD_CHECK4(F32x4, simd, F32, new_val, new_val, old_val, old_val), | 370 WASM_SIMD_CHECK4(F32x4, simd, F32, new_val, new_val, old_val, old_val), |
347 WASM_SET_LOCAL(simd, | 371 WASM_SET_LOCAL(simd, |
348 WASM_SIMD_F32x4_REPLACE_LANE(2, WASM_GET_LOCAL(simd), | 372 WASM_SIMD_F32x4_REPLACE_LANE(2, WASM_GET_LOCAL(simd), |
349 WASM_GET_LOCAL(new_val))), | 373 WASM_GET_LOCAL(new_val))), |
350 WASM_SIMD_CHECK4(F32x4, simd, F32, new_val, new_val, new_val, old_val), | 374 WASM_SIMD_CHECK4(F32x4, simd, F32, new_val, new_val, new_val, old_val), |
351 WASM_SET_LOCAL(simd, | 375 WASM_SET_LOCAL(simd, |
352 WASM_SIMD_F32x4_REPLACE_LANE(3, WASM_GET_LOCAL(simd), | 376 WASM_SIMD_F32x4_REPLACE_LANE(3, WASM_GET_LOCAL(simd), |
353 WASM_GET_LOCAL(new_val))), | 377 WASM_GET_LOCAL(new_val))), |
354 WASM_SIMD_CHECK_SPLAT4(F32x4, simd, F32, new_val), WASM_ONE); | 378 WASM_SIMD_CHECK_SPLAT4(F32x4, simd, F32, new_val), WASM_ONE); |
355 | 379 |
356 CHECK_EQ(1, r.Call(3.14159, -1.5)); | 380 CHECK_EQ(1, r.Call(3.14159f, -1.5f)); |
357 } | 381 } |
| 382 #endif // V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET |
358 | 383 |
| 384 #if V8_TARGET_ARCH_ARM |
359 // Tests both signed and unsigned conversion. | 385 // Tests both signed and unsigned conversion. |
360 WASM_EXEC_TEST(F32x4FromInt32x4) { | 386 WASM_EXEC_COMPILED_TEST(F32x4FromInt32x4) { |
361 FLAG_wasm_simd_prototype = true; | 387 FLAG_wasm_simd_prototype = true; |
362 WasmRunner<int32_t, int32_t, float, float> r(kExecuteCompiled); | 388 WasmRunner<int32_t, int32_t, float, float> r(kExecuteCompiled); |
363 byte a = 0; | 389 byte a = 0; |
364 byte expected_signed = 1; | 390 byte expected_signed = 1; |
365 byte expected_unsigned = 2; | 391 byte expected_unsigned = 2; |
366 byte simd0 = r.AllocateLocal(kWasmS128); | 392 byte simd0 = r.AllocateLocal(kWasmS128); |
367 byte simd1 = r.AllocateLocal(kWasmS128); | 393 byte simd1 = r.AllocateLocal(kWasmS128); |
368 byte simd2 = r.AllocateLocal(kWasmS128); | 394 byte simd2 = r.AllocateLocal(kWasmS128); |
369 BUILD( | 395 BUILD( |
370 r, WASM_SET_LOCAL(simd0, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(a))), | 396 r, WASM_SET_LOCAL(simd0, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(a))), |
(...skipping 17 matching lines...) Expand all Loading... |
388 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(a))), | 414 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(a))), |
389 WASM_SET_LOCAL(simd, WASM_SIMD_UNOP(simd_op, WASM_GET_LOCAL(simd))), | 415 WASM_SET_LOCAL(simd, WASM_SIMD_UNOP(simd_op, WASM_GET_LOCAL(simd))), |
390 WASM_SIMD_CHECK_SPLAT4_F32(F32x4, simd, expected), WASM_ONE); | 416 WASM_SIMD_CHECK_SPLAT4_F32(F32x4, simd, expected), WASM_ONE); |
391 | 417 |
392 FOR_FLOAT32_INPUTS(i) { | 418 FOR_FLOAT32_INPUTS(i) { |
393 if (std::isnan(*i)) continue; | 419 if (std::isnan(*i)) continue; |
394 CHECK_EQ(1, r.Call(*i, expected_op(*i))); | 420 CHECK_EQ(1, r.Call(*i, expected_op(*i))); |
395 } | 421 } |
396 } | 422 } |
397 | 423 |
398 WASM_EXEC_TEST(F32x4Abs) { RunF32x4UnOpTest(kExprF32x4Abs, std::abs); } | 424 WASM_EXEC_COMPILED_TEST(F32x4Abs) { RunF32x4UnOpTest(kExprF32x4Abs, std::abs); } |
399 WASM_EXEC_TEST(F32x4Neg) { RunF32x4UnOpTest(kExprF32x4Neg, Negate); } | 425 WASM_EXEC_COMPILED_TEST(F32x4Neg) { RunF32x4UnOpTest(kExprF32x4Neg, Negate); } |
| 426 #endif // V8_TARGET_ARCH_ARM |
400 | 427 |
401 void RunF32x4BinOpTest(WasmOpcode simd_op, FloatBinOp expected_op) { | 428 #if V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET |
| 429 void RunF32x4BinOpTest(WasmOpcode simd_op, FloatBinOp expected_op, |
| 430 bool skip_zero_inputs = false) { |
402 FLAG_wasm_simd_prototype = true; | 431 FLAG_wasm_simd_prototype = true; |
403 WasmRunner<int32_t, float, float, float> r(kExecuteCompiled); | 432 WasmRunner<int32_t, float, float, float> r(kExecuteCompiled); |
404 byte a = 0; | 433 byte a = 0; |
405 byte b = 1; | 434 byte b = 1; |
406 byte expected = 2; | 435 byte expected = 2; |
407 byte simd0 = r.AllocateLocal(kWasmS128); | 436 byte simd0 = r.AllocateLocal(kWasmS128); |
408 byte simd1 = r.AllocateLocal(kWasmS128); | 437 byte simd1 = r.AllocateLocal(kWasmS128); |
409 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(a))), | 438 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(a))), |
410 WASM_SET_LOCAL(simd1, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(b))), | 439 WASM_SET_LOCAL(simd1, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(b))), |
411 WASM_SET_LOCAL(simd1, WASM_SIMD_BINOP(simd_op, WASM_GET_LOCAL(simd0), | 440 WASM_SET_LOCAL(simd1, WASM_SIMD_BINOP(simd_op, WASM_GET_LOCAL(simd0), |
412 WASM_GET_LOCAL(simd1))), | 441 WASM_GET_LOCAL(simd1))), |
413 WASM_SIMD_CHECK_SPLAT4_F32(F32x4, simd1, expected), WASM_ONE); | 442 WASM_SIMD_CHECK_SPLAT4_F32(F32x4, simd1, expected), WASM_ONE); |
414 | 443 |
415 FOR_FLOAT32_INPUTS(i) { | 444 FOR_FLOAT32_INPUTS(i) { |
416 if (std::isnan(*i)) continue; | 445 if (std::isnan(*i)) continue; |
417 FOR_FLOAT32_INPUTS(j) { | 446 FOR_FLOAT32_INPUTS(j) { |
418 if (std::isnan(*j)) continue; | 447 if (std::isnan(*j)) continue; |
| 448 if (skip_zero_inputs && std::fpclassify(*i) == FP_ZERO && |
| 449 std::fpclassify(*j) == FP_ZERO) |
| 450 continue; |
419 float expected = expected_op(*i, *j); | 451 float expected = expected_op(*i, *j); |
420 // SIMD on some platforms may handle denormalized numbers differently. | 452 // SIMD on some platforms may handle denormalized numbers differently. |
421 // TODO(bbudge) On platforms that flush denorms to zero, test with | 453 // TODO(bbudge) On platforms that flush denorms to zero, test with |
422 // expected == 0. | 454 // expected == 0. |
423 if (std::fpclassify(expected) == FP_SUBNORMAL) continue; | 455 if (std::fpclassify(expected) == FP_SUBNORMAL) continue; |
| 456 if (std::isnan(expected)) continue; |
424 CHECK_EQ(1, r.Call(*i, *j, expected)); | 457 CHECK_EQ(1, r.Call(*i, *j, expected)); |
425 } | 458 } |
426 } | 459 } |
427 } | 460 } |
428 | 461 |
429 WASM_EXEC_TEST(F32x4Add) { RunF32x4BinOpTest(kExprF32x4Add, Add); } | 462 WASM_EXEC_COMPILED_TEST(F32x4Add) { RunF32x4BinOpTest(kExprF32x4Add, Add); } |
430 WASM_EXEC_TEST(F32x4Sub) { RunF32x4BinOpTest(kExprF32x4Sub, Sub); } | 463 WASM_EXEC_COMPILED_TEST(F32x4Sub) { RunF32x4BinOpTest(kExprF32x4Sub, Sub); } |
| 464 #endif // V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET |
431 | 465 |
| 466 #if SIMD_LOWERING_TARGET |
| 467 WASM_EXEC_COMPILED_TEST(F32x4Mul) { RunF32x4BinOpTest(kExprF32x4Mul, Mul); } |
| 468 WASM_EXEC_COMPILED_TEST(F32x4Div) { RunF32x4BinOpTest(kExprF32x4Div, Div); } |
| 469 WASM_EXEC_COMPILED_TEST(Simd_F32x4_Min) { |
| 470 RunF32x4BinOpTest(kExprF32x4Min, Minimum, true); |
| 471 } |
| 472 WASM_EXEC_COMPILED_TEST(Simd_F32x4_Max) { |
| 473 RunF32x4BinOpTest(kExprF32x4Max, Maximum, true); |
| 474 } |
| 475 #endif // SIMD_LOWERING_TARGET |
| 476 |
| 477 #if V8_TARGET_ARCH_ARM |
432 void RunF32x4CompareOpTest(WasmOpcode simd_op, FloatCompareOp expected_op) { | 478 void RunF32x4CompareOpTest(WasmOpcode simd_op, FloatCompareOp expected_op) { |
433 FLAG_wasm_simd_prototype = true; | 479 FLAG_wasm_simd_prototype = true; |
434 WasmRunner<int32_t, float, float, int32_t> r(kExecuteCompiled); | 480 WasmRunner<int32_t, float, float, int32_t> r(kExecuteCompiled); |
435 byte a = 0; | 481 byte a = 0; |
436 byte b = 1; | 482 byte b = 1; |
437 byte expected = 2; | 483 byte expected = 2; |
438 byte simd0 = r.AllocateLocal(kWasmS128); | 484 byte simd0 = r.AllocateLocal(kWasmS128); |
439 byte simd1 = r.AllocateLocal(kWasmS128); | 485 byte simd1 = r.AllocateLocal(kWasmS128); |
440 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(a))), | 486 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(a))), |
441 WASM_SET_LOCAL(simd1, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(b))), | 487 WASM_SET_LOCAL(simd1, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(b))), |
442 WASM_SET_LOCAL(simd1, | 488 WASM_SET_LOCAL(simd1, |
443 WASM_SIMD_MATERIALIZE_BOOLS( | 489 WASM_SIMD_MATERIALIZE_BOOLS( |
444 32x4, WASM_SIMD_BINOP(simd_op, WASM_GET_LOCAL(simd0), | 490 32x4, WASM_SIMD_BINOP(simd_op, WASM_GET_LOCAL(simd0), |
445 WASM_GET_LOCAL(simd1)))), | 491 WASM_GET_LOCAL(simd1)))), |
446 WASM_SIMD_CHECK_SPLAT4(I32x4, simd1, I32, expected), WASM_ONE); | 492 WASM_SIMD_CHECK_SPLAT4(I32x4, simd1, I32, expected), WASM_ONE); |
447 | 493 |
448 FOR_FLOAT32_INPUTS(i) { | 494 FOR_FLOAT32_INPUTS(i) { |
449 if (std::isnan(*i)) continue; | 495 if (std::isnan(*i)) continue; |
450 FOR_FLOAT32_INPUTS(j) { | 496 FOR_FLOAT32_INPUTS(j) { |
451 if (std::isnan(*j)) continue; | 497 if (std::isnan(*j)) continue; |
452 // SIMD on some platforms may handle denormalized numbers differently. | 498 // SIMD on some platforms may handle denormalized numbers differently. |
453 // Check for number pairs that are very close together. | 499 // Check for number pairs that are very close together. |
454 if (std::fpclassify(*i - *j) == FP_SUBNORMAL) continue; | 500 if (std::fpclassify(*i - *j) == FP_SUBNORMAL) continue; |
455 CHECK_EQ(1, r.Call(*i, *j, expected_op(*i, *j))); | 501 CHECK_EQ(1, r.Call(*i, *j, expected_op(*i, *j))); |
456 } | 502 } |
457 } | 503 } |
458 } | 504 } |
459 | 505 |
460 WASM_EXEC_TEST(F32x4Equal) { RunF32x4CompareOpTest(kExprF32x4Eq, Equal); } | 506 WASM_EXEC_COMPILED_TEST(F32x4Equal) { |
461 WASM_EXEC_TEST(F32x4NotEqual) { RunF32x4CompareOpTest(kExprF32x4Ne, NotEqual); } | 507 RunF32x4CompareOpTest(kExprF32x4Eq, Equal); |
| 508 } |
| 509 |
| 510 WASM_EXEC_COMPILED_TEST(F32x4NotEqual) { |
| 511 RunF32x4CompareOpTest(kExprF32x4Ne, NotEqual); |
| 512 } |
462 #endif // V8_TARGET_ARCH_ARM | 513 #endif // V8_TARGET_ARCH_ARM |
463 | 514 |
464 WASM_EXEC_TEST(I32x4Splat) { | 515 WASM_EXEC_COMPILED_TEST(I32x4Splat) { |
465 FLAG_wasm_simd_prototype = true; | 516 FLAG_wasm_simd_prototype = true; |
466 | 517 |
467 // Store SIMD value in a local variable, use extract lane to check lane values | 518 // Store SIMD value in a local variable, use extract lane to check lane values |
468 // This test is not a test for ExtractLane as Splat does not create | 519 // This test is not a test for ExtractLane as Splat does not create |
469 // interesting SIMD values. | 520 // interesting SIMD values. |
470 // | 521 // |
471 // SetLocal(1, I32x4Splat(Local(0))); | 522 // SetLocal(1, I32x4Splat(Local(0))); |
472 // For each lane index | 523 // For each lane index |
473 // if(Local(0) != I32x4ExtractLane(Local(1), index) | 524 // if(Local(0) != I32x4ExtractLane(Local(1), index) |
474 // return 0 | 525 // return 0 |
475 // | 526 // |
476 // return 1 | 527 // return 1 |
477 WasmRunner<int32_t, int32_t> r(kExecuteCompiled); | 528 WasmRunner<int32_t, int32_t> r(kExecuteCompiled); |
478 byte lane_val = 0; | 529 byte lane_val = 0; |
479 byte simd = r.AllocateLocal(kWasmS128); | 530 byte simd = r.AllocateLocal(kWasmS128); |
480 BUILD(r, | 531 BUILD(r, |
481 WASM_SET_LOCAL(simd, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(lane_val))), | 532 WASM_SET_LOCAL(simd, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(lane_val))), |
482 WASM_SIMD_CHECK_SPLAT4(I32x4, simd, I32, lane_val), WASM_ONE); | 533 WASM_SIMD_CHECK_SPLAT4(I32x4, simd, I32, lane_val), WASM_ONE); |
483 | 534 |
484 FOR_INT32_INPUTS(i) { CHECK_EQ(1, r.Call(*i)); } | 535 FOR_INT32_INPUTS(i) { CHECK_EQ(1, r.Call(*i)); } |
485 } | 536 } |
486 | 537 |
487 WASM_EXEC_TEST(I32x4ReplaceLane) { | 538 WASM_EXEC_COMPILED_TEST(I32x4ReplaceLane) { |
488 FLAG_wasm_simd_prototype = true; | 539 FLAG_wasm_simd_prototype = true; |
489 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); | 540 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); |
490 byte old_val = 0; | 541 byte old_val = 0; |
491 byte new_val = 1; | 542 byte new_val = 1; |
492 byte simd = r.AllocateLocal(kWasmS128); | 543 byte simd = r.AllocateLocal(kWasmS128); |
493 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(old_val))), | 544 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(old_val))), |
494 WASM_SET_LOCAL(simd, | 545 WASM_SET_LOCAL(simd, |
495 WASM_SIMD_I32x4_REPLACE_LANE(0, WASM_GET_LOCAL(simd), | 546 WASM_SIMD_I32x4_REPLACE_LANE(0, WASM_GET_LOCAL(simd), |
496 WASM_GET_LOCAL(new_val))), | 547 WASM_GET_LOCAL(new_val))), |
497 WASM_SIMD_CHECK4(I32x4, simd, I32, new_val, old_val, old_val, old_val), | 548 WASM_SIMD_CHECK4(I32x4, simd, I32, new_val, old_val, old_val, old_val), |
498 WASM_SET_LOCAL(simd, | 549 WASM_SET_LOCAL(simd, |
499 WASM_SIMD_I32x4_REPLACE_LANE(1, WASM_GET_LOCAL(simd), | 550 WASM_SIMD_I32x4_REPLACE_LANE(1, WASM_GET_LOCAL(simd), |
500 WASM_GET_LOCAL(new_val))), | 551 WASM_GET_LOCAL(new_val))), |
501 WASM_SIMD_CHECK4(I32x4, simd, I32, new_val, new_val, old_val, old_val), | 552 WASM_SIMD_CHECK4(I32x4, simd, I32, new_val, new_val, old_val, old_val), |
502 WASM_SET_LOCAL(simd, | 553 WASM_SET_LOCAL(simd, |
503 WASM_SIMD_I32x4_REPLACE_LANE(2, WASM_GET_LOCAL(simd), | 554 WASM_SIMD_I32x4_REPLACE_LANE(2, WASM_GET_LOCAL(simd), |
504 WASM_GET_LOCAL(new_val))), | 555 WASM_GET_LOCAL(new_val))), |
505 WASM_SIMD_CHECK4(I32x4, simd, I32, new_val, new_val, new_val, old_val), | 556 WASM_SIMD_CHECK4(I32x4, simd, I32, new_val, new_val, new_val, old_val), |
506 WASM_SET_LOCAL(simd, | 557 WASM_SET_LOCAL(simd, |
507 WASM_SIMD_I32x4_REPLACE_LANE(3, WASM_GET_LOCAL(simd), | 558 WASM_SIMD_I32x4_REPLACE_LANE(3, WASM_GET_LOCAL(simd), |
508 WASM_GET_LOCAL(new_val))), | 559 WASM_GET_LOCAL(new_val))), |
509 WASM_SIMD_CHECK_SPLAT4(I32x4, simd, I32, new_val), WASM_ONE); | 560 WASM_SIMD_CHECK_SPLAT4(I32x4, simd, I32, new_val), WASM_ONE); |
510 | 561 |
511 CHECK_EQ(1, r.Call(1, 2)); | 562 CHECK_EQ(1, r.Call(1, 2)); |
512 } | 563 } |
513 | 564 |
514 #if V8_TARGET_ARCH_ARM | 565 #if V8_TARGET_ARCH_ARM |
515 | 566 |
516 WASM_EXEC_TEST(I16x8Splat) { | 567 WASM_EXEC_COMPILED_TEST(I16x8Splat) { |
517 FLAG_wasm_simd_prototype = true; | 568 FLAG_wasm_simd_prototype = true; |
518 | 569 |
519 WasmRunner<int32_t, int32_t> r(kExecuteCompiled); | 570 WasmRunner<int32_t, int32_t> r(kExecuteCompiled); |
520 byte lane_val = 0; | 571 byte lane_val = 0; |
521 byte simd = r.AllocateLocal(kWasmS128); | 572 byte simd = r.AllocateLocal(kWasmS128); |
522 BUILD(r, | 573 BUILD(r, |
523 WASM_SET_LOCAL(simd, WASM_SIMD_I16x8_SPLAT(WASM_GET_LOCAL(lane_val))), | 574 WASM_SET_LOCAL(simd, WASM_SIMD_I16x8_SPLAT(WASM_GET_LOCAL(lane_val))), |
524 WASM_SIMD_CHECK_SPLAT8(I16x8, simd, I32, lane_val), WASM_ONE); | 575 WASM_SIMD_CHECK_SPLAT8(I16x8, simd, I32, lane_val), WASM_ONE); |
525 | 576 |
526 FOR_INT16_INPUTS(i) { CHECK_EQ(1, r.Call(*i)); } | 577 FOR_INT16_INPUTS(i) { CHECK_EQ(1, r.Call(*i)); } |
527 } | 578 } |
528 | 579 |
529 WASM_EXEC_TEST(I16x8ReplaceLane) { | 580 WASM_EXEC_COMPILED_TEST(I16x8ReplaceLane) { |
530 FLAG_wasm_simd_prototype = true; | 581 FLAG_wasm_simd_prototype = true; |
531 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); | 582 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); |
532 byte old_val = 0; | 583 byte old_val = 0; |
533 byte new_val = 1; | 584 byte new_val = 1; |
534 byte simd = r.AllocateLocal(kWasmS128); | 585 byte simd = r.AllocateLocal(kWasmS128); |
535 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I16x8_SPLAT(WASM_GET_LOCAL(old_val))), | 586 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I16x8_SPLAT(WASM_GET_LOCAL(old_val))), |
536 WASM_SET_LOCAL(simd, | 587 WASM_SET_LOCAL(simd, |
537 WASM_SIMD_I16x8_REPLACE_LANE(0, WASM_GET_LOCAL(simd), | 588 WASM_SIMD_I16x8_REPLACE_LANE(0, WASM_GET_LOCAL(simd), |
538 WASM_GET_LOCAL(new_val))), | 589 WASM_GET_LOCAL(new_val))), |
539 WASM_SIMD_CHECK8(I16x8, simd, I32, new_val, old_val, old_val, old_val, | 590 WASM_SIMD_CHECK8(I16x8, simd, I32, new_val, old_val, old_val, old_val, |
(...skipping 29 matching lines...) Expand all Loading... |
569 WASM_SIMD_CHECK8(I16x8, simd, I32, new_val, new_val, new_val, new_val, | 620 WASM_SIMD_CHECK8(I16x8, simd, I32, new_val, new_val, new_val, new_val, |
570 new_val, new_val, new_val, old_val), | 621 new_val, new_val, new_val, old_val), |
571 WASM_SET_LOCAL(simd, | 622 WASM_SET_LOCAL(simd, |
572 WASM_SIMD_I16x8_REPLACE_LANE(7, WASM_GET_LOCAL(simd), | 623 WASM_SIMD_I16x8_REPLACE_LANE(7, WASM_GET_LOCAL(simd), |
573 WASM_GET_LOCAL(new_val))), | 624 WASM_GET_LOCAL(new_val))), |
574 WASM_SIMD_CHECK_SPLAT8(I16x8, simd, I32, new_val), WASM_ONE); | 625 WASM_SIMD_CHECK_SPLAT8(I16x8, simd, I32, new_val), WASM_ONE); |
575 | 626 |
576 CHECK_EQ(1, r.Call(1, 2)); | 627 CHECK_EQ(1, r.Call(1, 2)); |
577 } | 628 } |
578 | 629 |
579 WASM_EXEC_TEST(I8x16Splat) { | 630 WASM_EXEC_COMPILED_TEST(I8x16Splat) { |
580 FLAG_wasm_simd_prototype = true; | 631 FLAG_wasm_simd_prototype = true; |
581 | 632 |
582 WasmRunner<int32_t, int32_t> r(kExecuteCompiled); | 633 WasmRunner<int32_t, int32_t> r(kExecuteCompiled); |
583 byte lane_val = 0; | 634 byte lane_val = 0; |
584 byte simd = r.AllocateLocal(kWasmS128); | 635 byte simd = r.AllocateLocal(kWasmS128); |
585 BUILD(r, | 636 BUILD(r, |
586 WASM_SET_LOCAL(simd, WASM_SIMD_I8x16_SPLAT(WASM_GET_LOCAL(lane_val))), | 637 WASM_SET_LOCAL(simd, WASM_SIMD_I8x16_SPLAT(WASM_GET_LOCAL(lane_val))), |
587 WASM_SIMD_CHECK_SPLAT8(I8x16, simd, I32, lane_val), WASM_ONE); | 638 WASM_SIMD_CHECK_SPLAT8(I8x16, simd, I32, lane_val), WASM_ONE); |
588 | 639 |
589 FOR_INT8_INPUTS(i) { CHECK_EQ(1, r.Call(*i)); } | 640 FOR_INT8_INPUTS(i) { CHECK_EQ(1, r.Call(*i)); } |
590 } | 641 } |
591 | 642 |
592 WASM_EXEC_TEST(I8x16ReplaceLane) { | 643 WASM_EXEC_COMPILED_TEST(I8x16ReplaceLane) { |
593 FLAG_wasm_simd_prototype = true; | 644 FLAG_wasm_simd_prototype = true; |
594 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); | 645 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); |
595 byte old_val = 0; | 646 byte old_val = 0; |
596 byte new_val = 1; | 647 byte new_val = 1; |
597 byte simd = r.AllocateLocal(kWasmS128); | 648 byte simd = r.AllocateLocal(kWasmS128); |
598 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I8x16_SPLAT(WASM_GET_LOCAL(old_val))), | 649 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I8x16_SPLAT(WASM_GET_LOCAL(old_val))), |
599 WASM_SET_LOCAL(simd, | 650 WASM_SET_LOCAL(simd, |
600 WASM_SIMD_I8x16_REPLACE_LANE(0, WASM_GET_LOCAL(simd), | 651 WASM_SIMD_I8x16_REPLACE_LANE(0, WASM_GET_LOCAL(simd), |
601 WASM_GET_LOCAL(new_val))), | 652 WASM_GET_LOCAL(new_val))), |
602 WASM_SIMD_CHECK16(I8x16, simd, I32, new_val, old_val, old_val, old_val, | 653 WASM_SIMD_CHECK16(I8x16, simd, I32, new_val, old_val, old_val, old_val, |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
728 int32_t result = | 779 int32_t result = |
729 unsigned_integer ? static_cast<uint32_t>(val) : static_cast<int32_t>(val); | 780 unsigned_integer ? static_cast<uint32_t>(val) : static_cast<int32_t>(val); |
730 | 781 |
731 if (!CanRoundToZeroAndConvert(val, unsigned_integer)) { | 782 if (!CanRoundToZeroAndConvert(val, unsigned_integer)) { |
732 result = ConvertInvalidValue(val, unsigned_integer); | 783 result = ConvertInvalidValue(val, unsigned_integer); |
733 } | 784 } |
734 return result; | 785 return result; |
735 } | 786 } |
736 | 787 |
737 // Tests both signed and unsigned conversion. | 788 // Tests both signed and unsigned conversion. |
738 WASM_EXEC_TEST(I32x4FromFloat32x4) { | 789 WASM_EXEC_COMPILED_TEST(I32x4FromFloat32x4) { |
739 FLAG_wasm_simd_prototype = true; | 790 FLAG_wasm_simd_prototype = true; |
740 WasmRunner<int32_t, float, int32_t, int32_t> r(kExecuteCompiled); | 791 WasmRunner<int32_t, float, int32_t, int32_t> r(kExecuteCompiled); |
741 byte a = 0; | 792 byte a = 0; |
742 byte expected_signed = 1; | 793 byte expected_signed = 1; |
743 byte expected_unsigned = 2; | 794 byte expected_unsigned = 2; |
744 byte simd0 = r.AllocateLocal(kWasmS128); | 795 byte simd0 = r.AllocateLocal(kWasmS128); |
745 byte simd1 = r.AllocateLocal(kWasmS128); | 796 byte simd1 = r.AllocateLocal(kWasmS128); |
746 byte simd2 = r.AllocateLocal(kWasmS128); | 797 byte simd2 = r.AllocateLocal(kWasmS128); |
747 BUILD( | 798 BUILD( |
748 r, WASM_SET_LOCAL(simd0, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(a))), | 799 r, WASM_SET_LOCAL(simd0, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(a))), |
(...skipping 15 matching lines...) Expand all Loading... |
764 byte a = 0; | 815 byte a = 0; |
765 byte expected = 1; | 816 byte expected = 1; |
766 byte simd = r.AllocateLocal(kWasmS128); | 817 byte simd = r.AllocateLocal(kWasmS128); |
767 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(a))), | 818 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(a))), |
768 WASM_SET_LOCAL(simd, WASM_SIMD_UNOP(simd_op, WASM_GET_LOCAL(simd))), | 819 WASM_SET_LOCAL(simd, WASM_SIMD_UNOP(simd_op, WASM_GET_LOCAL(simd))), |
769 WASM_SIMD_CHECK_SPLAT4(I32x4, simd, I32, expected), WASM_ONE); | 820 WASM_SIMD_CHECK_SPLAT4(I32x4, simd, I32, expected), WASM_ONE); |
770 | 821 |
771 FOR_INT32_INPUTS(i) { CHECK_EQ(1, r.Call(*i, expected_op(*i))); } | 822 FOR_INT32_INPUTS(i) { CHECK_EQ(1, r.Call(*i, expected_op(*i))); } |
772 } | 823 } |
773 | 824 |
774 WASM_EXEC_TEST(I32x4Neg) { RunI32x4UnOpTest(kExprI32x4Neg, Negate); } | 825 WASM_EXEC_COMPILED_TEST(I32x4Neg) { RunI32x4UnOpTest(kExprI32x4Neg, Negate); } |
775 | 826 |
776 WASM_EXEC_TEST(S128Not) { RunI32x4UnOpTest(kExprS128Not, Not); } | 827 WASM_EXEC_COMPILED_TEST(S128Not) { RunI32x4UnOpTest(kExprS128Not, Not); } |
777 #endif // V8_TARGET_ARCH_ARM | 828 #endif // V8_TARGET_ARCH_ARM |
778 | 829 |
779 void RunI32x4BinOpTest(WasmOpcode simd_op, Int32BinOp expected_op) { | 830 void RunI32x4BinOpTest(WasmOpcode simd_op, Int32BinOp expected_op) { |
780 FLAG_wasm_simd_prototype = true; | 831 FLAG_wasm_simd_prototype = true; |
781 WasmRunner<int32_t, int32_t, int32_t, int32_t> r(kExecuteCompiled); | 832 WasmRunner<int32_t, int32_t, int32_t, int32_t> r(kExecuteCompiled); |
782 byte a = 0; | 833 byte a = 0; |
783 byte b = 1; | 834 byte b = 1; |
784 byte expected = 2; | 835 byte expected = 2; |
785 byte simd0 = r.AllocateLocal(kWasmS128); | 836 byte simd0 = r.AllocateLocal(kWasmS128); |
786 byte simd1 = r.AllocateLocal(kWasmS128); | 837 byte simd1 = r.AllocateLocal(kWasmS128); |
787 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(a))), | 838 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(a))), |
788 WASM_SET_LOCAL(simd1, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(b))), | 839 WASM_SET_LOCAL(simd1, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(b))), |
789 WASM_SET_LOCAL(simd1, WASM_SIMD_BINOP(simd_op, WASM_GET_LOCAL(simd0), | 840 WASM_SET_LOCAL(simd1, WASM_SIMD_BINOP(simd_op, WASM_GET_LOCAL(simd0), |
790 WASM_GET_LOCAL(simd1))), | 841 WASM_GET_LOCAL(simd1))), |
791 WASM_SIMD_CHECK_SPLAT4(I32x4, simd1, I32, expected), WASM_ONE); | 842 WASM_SIMD_CHECK_SPLAT4(I32x4, simd1, I32, expected), WASM_ONE); |
792 | 843 |
793 FOR_INT32_INPUTS(i) { | 844 FOR_INT32_INPUTS(i) { |
794 FOR_INT32_INPUTS(j) { CHECK_EQ(1, r.Call(*i, *j, expected_op(*i, *j))); } | 845 FOR_INT32_INPUTS(j) { CHECK_EQ(1, r.Call(*i, *j, expected_op(*i, *j))); } |
795 } | 846 } |
796 } | 847 } |
797 | 848 |
798 WASM_EXEC_TEST(I32x4Add) { RunI32x4BinOpTest(kExprI32x4Add, Add); } | 849 WASM_EXEC_COMPILED_TEST(I32x4Add) { RunI32x4BinOpTest(kExprI32x4Add, Add); } |
799 | 850 |
800 WASM_EXEC_TEST(I32x4Sub) { RunI32x4BinOpTest(kExprI32x4Sub, Sub); } | 851 WASM_EXEC_COMPILED_TEST(I32x4Sub) { RunI32x4BinOpTest(kExprI32x4Sub, Sub); } |
| 852 |
| 853 #if V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET |
| 854 WASM_EXEC_COMPILED_TEST(I32x4Mul) { RunI32x4BinOpTest(kExprI32x4Mul, Mul); } |
| 855 |
| 856 WASM_EXEC_COMPILED_TEST(S128And) { RunI32x4BinOpTest(kExprS128And, And); } |
| 857 |
| 858 WASM_EXEC_COMPILED_TEST(S128Or) { RunI32x4BinOpTest(kExprS128Or, Or); } |
| 859 |
| 860 WASM_EXEC_COMPILED_TEST(S128Xor) { RunI32x4BinOpTest(kExprS128Xor, Xor); } |
| 861 #endif // V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET |
801 | 862 |
802 #if V8_TARGET_ARCH_ARM | 863 #if V8_TARGET_ARCH_ARM |
803 WASM_EXEC_TEST(I32x4Mul) { RunI32x4BinOpTest(kExprI32x4Mul, Mul); } | 864 WASM_EXEC_COMPILED_TEST(I32x4Min) { |
| 865 RunI32x4BinOpTest(kExprI32x4MinS, Minimum); |
| 866 } |
804 | 867 |
805 WASM_EXEC_TEST(I32x4Min) { RunI32x4BinOpTest(kExprI32x4MinS, Minimum); } | 868 WASM_EXEC_COMPILED_TEST(I32x4Max) { |
| 869 RunI32x4BinOpTest(kExprI32x4MaxS, Maximum); |
| 870 } |
806 | 871 |
807 WASM_EXEC_TEST(I32x4Max) { RunI32x4BinOpTest(kExprI32x4MaxS, Maximum); } | 872 WASM_EXEC_COMPILED_TEST(Ui32x4Min) { |
808 | |
809 WASM_EXEC_TEST(Ui32x4Min) { | |
810 RunI32x4BinOpTest(kExprI32x4MinU, UnsignedMinimum); | 873 RunI32x4BinOpTest(kExprI32x4MinU, UnsignedMinimum); |
811 } | 874 } |
812 | 875 |
813 WASM_EXEC_TEST(Ui32x4Max) { | 876 WASM_EXEC_COMPILED_TEST(Ui32x4Max) { |
814 RunI32x4BinOpTest(kExprI32x4MaxU, UnsignedMaximum); | 877 RunI32x4BinOpTest(kExprI32x4MaxU, UnsignedMaximum); |
815 } | 878 } |
816 | 879 |
817 WASM_EXEC_TEST(S128And) { RunI32x4BinOpTest(kExprS128And, And); } | |
818 | 880 |
819 WASM_EXEC_TEST(S128Or) { RunI32x4BinOpTest(kExprS128Or, Or); } | |
820 | |
821 WASM_EXEC_TEST(S128Xor) { RunI32x4BinOpTest(kExprS128Xor, Xor); } | |
822 | 881 |
823 void RunI32x4CompareOpTest(WasmOpcode simd_op, Int32BinOp expected_op) { | 882 void RunI32x4CompareOpTest(WasmOpcode simd_op, Int32BinOp expected_op) { |
824 FLAG_wasm_simd_prototype = true; | 883 FLAG_wasm_simd_prototype = true; |
825 WasmRunner<int32_t, int32_t, int32_t, int32_t> r(kExecuteCompiled); | 884 WasmRunner<int32_t, int32_t, int32_t, int32_t> r(kExecuteCompiled); |
826 byte a = 0; | 885 byte a = 0; |
827 byte b = 1; | 886 byte b = 1; |
828 byte expected = 2; | 887 byte expected = 2; |
829 byte simd0 = r.AllocateLocal(kWasmS128); | 888 byte simd0 = r.AllocateLocal(kWasmS128); |
830 byte simd1 = r.AllocateLocal(kWasmS128); | 889 byte simd1 = r.AllocateLocal(kWasmS128); |
831 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(a))), | 890 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))), | 891 WASM_SET_LOCAL(simd1, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(b))), |
833 WASM_SET_LOCAL(simd1, | 892 WASM_SET_LOCAL(simd1, |
834 WASM_SIMD_MATERIALIZE_BOOLS( | 893 WASM_SIMD_MATERIALIZE_BOOLS( |
835 32x4, WASM_SIMD_BINOP(simd_op, WASM_GET_LOCAL(simd0), | 894 32x4, WASM_SIMD_BINOP(simd_op, WASM_GET_LOCAL(simd0), |
836 WASM_GET_LOCAL(simd1)))), | 895 WASM_GET_LOCAL(simd1)))), |
837 WASM_SIMD_CHECK_SPLAT4(I32x4, simd1, I32, expected), WASM_ONE); | 896 WASM_SIMD_CHECK_SPLAT4(I32x4, simd1, I32, expected), WASM_ONE); |
838 | 897 |
839 FOR_INT32_INPUTS(i) { | 898 FOR_INT32_INPUTS(i) { |
840 FOR_INT32_INPUTS(j) { CHECK_EQ(1, r.Call(*i, *j, expected_op(*i, *j))); } | 899 FOR_INT32_INPUTS(j) { CHECK_EQ(1, r.Call(*i, *j, expected_op(*i, *j))); } |
841 } | 900 } |
842 } | 901 } |
843 | 902 |
844 WASM_EXEC_TEST(I32x4Equal) { RunI32x4CompareOpTest(kExprI32x4Eq, Equal); } | 903 WASM_EXEC_COMPILED_TEST(I32x4Equal) { |
| 904 RunI32x4CompareOpTest(kExprI32x4Eq, Equal); |
| 905 } |
845 | 906 |
846 WASM_EXEC_TEST(I32x4NotEqual) { RunI32x4CompareOpTest(kExprI32x4Ne, NotEqual); } | 907 WASM_EXEC_COMPILED_TEST(I32x4NotEqual) { |
| 908 RunI32x4CompareOpTest(kExprI32x4Ne, NotEqual); |
| 909 } |
847 | 910 |
848 WASM_EXEC_TEST(I32x4Greater) { RunI32x4CompareOpTest(kExprI32x4GtS, Greater); } | 911 WASM_EXEC_COMPILED_TEST(I32x4Greater) { |
| 912 RunI32x4CompareOpTest(kExprI32x4GtS, Greater); |
| 913 } |
849 | 914 |
850 WASM_EXEC_TEST(I32x4GreaterEqual) { | 915 WASM_EXEC_COMPILED_TEST(I32x4GreaterEqual) { |
851 RunI32x4CompareOpTest(kExprI32x4GeS, GreaterEqual); | 916 RunI32x4CompareOpTest(kExprI32x4GeS, GreaterEqual); |
852 } | 917 } |
853 | 918 |
854 WASM_EXEC_TEST(I32x4Less) { RunI32x4CompareOpTest(kExprI32x4LtS, Less); } | 919 WASM_EXEC_COMPILED_TEST(I32x4Less) { |
| 920 RunI32x4CompareOpTest(kExprI32x4LtS, Less); |
| 921 } |
855 | 922 |
856 WASM_EXEC_TEST(I32x4LessEqual) { | 923 WASM_EXEC_COMPILED_TEST(I32x4LessEqual) { |
857 RunI32x4CompareOpTest(kExprI32x4LeS, LessEqual); | 924 RunI32x4CompareOpTest(kExprI32x4LeS, LessEqual); |
858 } | 925 } |
859 | 926 |
860 WASM_EXEC_TEST(Ui32x4Greater) { | 927 WASM_EXEC_COMPILED_TEST(Ui32x4Greater) { |
861 RunI32x4CompareOpTest(kExprI32x4GtU, UnsignedGreater); | 928 RunI32x4CompareOpTest(kExprI32x4GtU, UnsignedGreater); |
862 } | 929 } |
863 | 930 |
864 WASM_EXEC_TEST(Ui32x4GreaterEqual) { | 931 WASM_EXEC_COMPILED_TEST(Ui32x4GreaterEqual) { |
865 RunI32x4CompareOpTest(kExprI32x4GeU, UnsignedGreaterEqual); | 932 RunI32x4CompareOpTest(kExprI32x4GeU, UnsignedGreaterEqual); |
866 } | 933 } |
867 | 934 |
868 WASM_EXEC_TEST(Ui32x4Less) { | 935 WASM_EXEC_COMPILED_TEST(Ui32x4Less) { |
869 RunI32x4CompareOpTest(kExprI32x4LtU, UnsignedLess); | 936 RunI32x4CompareOpTest(kExprI32x4LtU, UnsignedLess); |
870 } | 937 } |
871 | 938 |
872 WASM_EXEC_TEST(Ui32x4LessEqual) { | 939 WASM_EXEC_COMPILED_TEST(Ui32x4LessEqual) { |
873 RunI32x4CompareOpTest(kExprI32x4LeU, UnsignedLessEqual); | 940 RunI32x4CompareOpTest(kExprI32x4LeU, UnsignedLessEqual); |
874 } | 941 } |
875 | 942 |
876 void RunI32x4ShiftOpTest(WasmOpcode simd_op, Int32ShiftOp expected_op, | 943 void RunI32x4ShiftOpTest(WasmOpcode simd_op, Int32ShiftOp expected_op, |
877 int shift) { | 944 int shift) { |
878 FLAG_wasm_simd_prototype = true; | 945 FLAG_wasm_simd_prototype = true; |
879 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); | 946 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); |
880 byte a = 0; | 947 byte a = 0; |
881 byte expected = 1; | 948 byte expected = 1; |
882 byte simd = r.AllocateLocal(kWasmS128); | 949 byte simd = r.AllocateLocal(kWasmS128); |
883 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(a))), | 950 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(a))), |
884 WASM_SET_LOCAL( | 951 WASM_SET_LOCAL( |
885 simd, WASM_SIMD_SHIFT_OP(simd_op, shift, WASM_GET_LOCAL(simd))), | 952 simd, WASM_SIMD_SHIFT_OP(simd_op, shift, WASM_GET_LOCAL(simd))), |
886 WASM_SIMD_CHECK_SPLAT4(I32x4, simd, I32, expected), WASM_ONE); | 953 WASM_SIMD_CHECK_SPLAT4(I32x4, simd, I32, expected), WASM_ONE); |
887 | 954 |
888 FOR_INT32_INPUTS(i) { CHECK_EQ(1, r.Call(*i, expected_op(*i, shift))); } | 955 FOR_INT32_INPUTS(i) { CHECK_EQ(1, r.Call(*i, expected_op(*i, shift))); } |
889 } | 956 } |
890 | 957 |
891 WASM_EXEC_TEST(I32x4Shl) { | 958 WASM_EXEC_COMPILED_TEST(I32x4Shl) { |
892 RunI32x4ShiftOpTest(kExprI32x4Shl, LogicalShiftLeft, 1); | 959 RunI32x4ShiftOpTest(kExprI32x4Shl, LogicalShiftLeft, 1); |
893 } | 960 } |
894 | 961 |
895 WASM_EXEC_TEST(I32x4ShrS) { | 962 WASM_EXEC_COMPILED_TEST(I32x4ShrS) { |
896 RunI32x4ShiftOpTest(kExprI32x4ShrS, ArithmeticShiftRight, 1); | 963 RunI32x4ShiftOpTest(kExprI32x4ShrS, ArithmeticShiftRight, 1); |
897 } | 964 } |
898 | 965 |
899 WASM_EXEC_TEST(I32x4ShrU) { | 966 WASM_EXEC_COMPILED_TEST(I32x4ShrU) { |
900 RunI32x4ShiftOpTest(kExprI32x4ShrU, LogicalShiftRight, 1); | 967 RunI32x4ShiftOpTest(kExprI32x4ShrU, LogicalShiftRight, 1); |
901 } | 968 } |
902 | 969 |
903 void RunI16x8UnOpTest(WasmOpcode simd_op, Int16UnOp expected_op) { | 970 void RunI16x8UnOpTest(WasmOpcode simd_op, Int16UnOp expected_op) { |
904 FLAG_wasm_simd_prototype = true; | 971 FLAG_wasm_simd_prototype = true; |
905 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); | 972 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); |
906 byte a = 0; | 973 byte a = 0; |
907 byte expected = 1; | 974 byte expected = 1; |
908 byte simd = r.AllocateLocal(kWasmS128); | 975 byte simd = r.AllocateLocal(kWasmS128); |
909 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I16x8_SPLAT(WASM_GET_LOCAL(a))), | 976 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I16x8_SPLAT(WASM_GET_LOCAL(a))), |
910 WASM_SET_LOCAL(simd, WASM_SIMD_UNOP(simd_op, WASM_GET_LOCAL(simd))), | 977 WASM_SET_LOCAL(simd, WASM_SIMD_UNOP(simd_op, WASM_GET_LOCAL(simd))), |
911 WASM_SIMD_CHECK_SPLAT8(I16x8, simd, I32, expected), WASM_ONE); | 978 WASM_SIMD_CHECK_SPLAT8(I16x8, simd, I32, expected), WASM_ONE); |
912 | 979 |
913 FOR_INT16_INPUTS(i) { CHECK_EQ(1, r.Call(*i, expected_op(*i))); } | 980 FOR_INT16_INPUTS(i) { CHECK_EQ(1, r.Call(*i, expected_op(*i))); } |
914 } | 981 } |
915 | 982 |
916 WASM_EXEC_TEST(I16x8Neg) { RunI16x8UnOpTest(kExprI16x8Neg, Negate); } | 983 WASM_EXEC_COMPILED_TEST(I16x8Neg) { RunI16x8UnOpTest(kExprI16x8Neg, Negate); } |
917 | 984 |
918 void RunI16x8BinOpTest(WasmOpcode simd_op, Int16BinOp expected_op) { | 985 void RunI16x8BinOpTest(WasmOpcode simd_op, Int16BinOp expected_op) { |
919 FLAG_wasm_simd_prototype = true; | 986 FLAG_wasm_simd_prototype = true; |
920 WasmRunner<int32_t, int32_t, int32_t, int32_t> r(kExecuteCompiled); | 987 WasmRunner<int32_t, int32_t, int32_t, int32_t> r(kExecuteCompiled); |
921 byte a = 0; | 988 byte a = 0; |
922 byte b = 1; | 989 byte b = 1; |
923 byte expected = 2; | 990 byte expected = 2; |
924 byte simd0 = r.AllocateLocal(kWasmS128); | 991 byte simd0 = r.AllocateLocal(kWasmS128); |
925 byte simd1 = r.AllocateLocal(kWasmS128); | 992 byte simd1 = r.AllocateLocal(kWasmS128); |
926 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_I16x8_SPLAT(WASM_GET_LOCAL(a))), | 993 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_I16x8_SPLAT(WASM_GET_LOCAL(a))), |
927 WASM_SET_LOCAL(simd1, WASM_SIMD_I16x8_SPLAT(WASM_GET_LOCAL(b))), | 994 WASM_SET_LOCAL(simd1, WASM_SIMD_I16x8_SPLAT(WASM_GET_LOCAL(b))), |
928 WASM_SET_LOCAL(simd1, WASM_SIMD_BINOP(simd_op, WASM_GET_LOCAL(simd0), | 995 WASM_SET_LOCAL(simd1, WASM_SIMD_BINOP(simd_op, WASM_GET_LOCAL(simd0), |
929 WASM_GET_LOCAL(simd1))), | 996 WASM_GET_LOCAL(simd1))), |
930 WASM_SIMD_CHECK_SPLAT8(I16x8, simd1, I32, expected), WASM_ONE); | 997 WASM_SIMD_CHECK_SPLAT8(I16x8, simd1, I32, expected), WASM_ONE); |
931 | 998 |
932 FOR_INT16_INPUTS(i) { | 999 FOR_INT16_INPUTS(i) { |
933 FOR_INT16_INPUTS(j) { CHECK_EQ(1, r.Call(*i, *j, expected_op(*i, *j))); } | 1000 FOR_INT16_INPUTS(j) { CHECK_EQ(1, r.Call(*i, *j, expected_op(*i, *j))); } |
934 } | 1001 } |
935 } | 1002 } |
936 | 1003 |
937 WASM_EXEC_TEST(I16x8Add) { RunI16x8BinOpTest(kExprI16x8Add, Add); } | 1004 WASM_EXEC_COMPILED_TEST(I16x8Add) { RunI16x8BinOpTest(kExprI16x8Add, Add); } |
938 | 1005 |
939 WASM_EXEC_TEST(I16x8AddSaturate) { | 1006 WASM_EXEC_COMPILED_TEST(I16x8AddSaturate) { |
940 RunI16x8BinOpTest(kExprI16x8AddSaturateS, AddSaturate); | 1007 RunI16x8BinOpTest(kExprI16x8AddSaturateS, AddSaturate); |
941 } | 1008 } |
942 | 1009 |
943 WASM_EXEC_TEST(I16x8Sub) { RunI16x8BinOpTest(kExprI16x8Sub, Sub); } | 1010 WASM_EXEC_COMPILED_TEST(I16x8Sub) { RunI16x8BinOpTest(kExprI16x8Sub, Sub); } |
944 | 1011 |
945 WASM_EXEC_TEST(I16x8SubSaturate) { | 1012 WASM_EXEC_COMPILED_TEST(I16x8SubSaturate) { |
946 RunI16x8BinOpTest(kExprI16x8SubSaturateS, SubSaturate); | 1013 RunI16x8BinOpTest(kExprI16x8SubSaturateS, SubSaturate); |
947 } | 1014 } |
948 | 1015 |
949 WASM_EXEC_TEST(I16x8Mul) { RunI16x8BinOpTest(kExprI16x8Mul, Mul); } | 1016 WASM_EXEC_COMPILED_TEST(I16x8Mul) { RunI16x8BinOpTest(kExprI16x8Mul, Mul); } |
950 | 1017 |
951 WASM_EXEC_TEST(I16x8Min) { RunI16x8BinOpTest(kExprI16x8MinS, Minimum); } | 1018 WASM_EXEC_COMPILED_TEST(I16x8Min) { |
| 1019 RunI16x8BinOpTest(kExprI16x8MinS, Minimum); |
| 1020 } |
952 | 1021 |
953 WASM_EXEC_TEST(I16x8Max) { RunI16x8BinOpTest(kExprI16x8MaxS, Maximum); } | 1022 WASM_EXEC_COMPILED_TEST(I16x8Max) { |
| 1023 RunI16x8BinOpTest(kExprI16x8MaxS, Maximum); |
| 1024 } |
954 | 1025 |
955 WASM_EXEC_TEST(Ui16x8AddSaturate) { | 1026 WASM_EXEC_COMPILED_TEST(Ui16x8AddSaturate) { |
956 RunI16x8BinOpTest(kExprI16x8AddSaturateU, UnsignedAddSaturate); | 1027 RunI16x8BinOpTest(kExprI16x8AddSaturateU, UnsignedAddSaturate); |
957 } | 1028 } |
958 | 1029 |
959 WASM_EXEC_TEST(Ui16x8SubSaturate) { | 1030 WASM_EXEC_COMPILED_TEST(Ui16x8SubSaturate) { |
960 RunI16x8BinOpTest(kExprI16x8SubSaturateU, UnsignedSubSaturate); | 1031 RunI16x8BinOpTest(kExprI16x8SubSaturateU, UnsignedSubSaturate); |
961 } | 1032 } |
962 | 1033 |
963 WASM_EXEC_TEST(Ui16x8Min) { | 1034 WASM_EXEC_COMPILED_TEST(Ui16x8Min) { |
964 RunI16x8BinOpTest(kExprI16x8MinU, UnsignedMinimum); | 1035 RunI16x8BinOpTest(kExprI16x8MinU, UnsignedMinimum); |
965 } | 1036 } |
966 | 1037 |
967 WASM_EXEC_TEST(Ui16x8Max) { | 1038 WASM_EXEC_COMPILED_TEST(Ui16x8Max) { |
968 RunI16x8BinOpTest(kExprI16x8MaxU, UnsignedMaximum); | 1039 RunI16x8BinOpTest(kExprI16x8MaxU, UnsignedMaximum); |
969 } | 1040 } |
970 | 1041 |
971 void RunI16x8CompareOpTest(WasmOpcode simd_op, Int16BinOp expected_op) { | 1042 void RunI16x8CompareOpTest(WasmOpcode simd_op, Int16BinOp expected_op) { |
972 FLAG_wasm_simd_prototype = true; | 1043 FLAG_wasm_simd_prototype = true; |
973 WasmRunner<int32_t, int32_t, int32_t, int32_t> r(kExecuteCompiled); | 1044 WasmRunner<int32_t, int32_t, int32_t, int32_t> r(kExecuteCompiled); |
974 byte a = 0; | 1045 byte a = 0; |
975 byte b = 1; | 1046 byte b = 1; |
976 byte expected = 2; | 1047 byte expected = 2; |
977 byte simd0 = r.AllocateLocal(kWasmS128); | 1048 byte simd0 = r.AllocateLocal(kWasmS128); |
978 byte simd1 = r.AllocateLocal(kWasmS128); | 1049 byte simd1 = r.AllocateLocal(kWasmS128); |
979 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_I16x8_SPLAT(WASM_GET_LOCAL(a))), | 1050 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))), | 1051 WASM_SET_LOCAL(simd1, WASM_SIMD_I16x8_SPLAT(WASM_GET_LOCAL(b))), |
981 WASM_SET_LOCAL(simd1, | 1052 WASM_SET_LOCAL(simd1, |
982 WASM_SIMD_MATERIALIZE_BOOLS( | 1053 WASM_SIMD_MATERIALIZE_BOOLS( |
983 16x8, WASM_SIMD_BINOP(simd_op, WASM_GET_LOCAL(simd0), | 1054 16x8, WASM_SIMD_BINOP(simd_op, WASM_GET_LOCAL(simd0), |
984 WASM_GET_LOCAL(simd1)))), | 1055 WASM_GET_LOCAL(simd1)))), |
985 WASM_SIMD_CHECK_SPLAT8(I16x8, simd1, I32, expected), WASM_ONE); | 1056 WASM_SIMD_CHECK_SPLAT8(I16x8, simd1, I32, expected), WASM_ONE); |
986 | 1057 |
987 FOR_INT16_INPUTS(i) { | 1058 FOR_INT16_INPUTS(i) { |
988 FOR_INT16_INPUTS(j) { CHECK_EQ(1, r.Call(*i, *j, expected_op(*i, *j))); } | 1059 FOR_INT16_INPUTS(j) { CHECK_EQ(1, r.Call(*i, *j, expected_op(*i, *j))); } |
989 } | 1060 } |
990 } | 1061 } |
991 | 1062 |
992 WASM_EXEC_TEST(I16x8Equal) { RunI16x8CompareOpTest(kExprI16x8Eq, Equal); } | 1063 WASM_EXEC_COMPILED_TEST(I16x8Equal) { |
| 1064 RunI16x8CompareOpTest(kExprI16x8Eq, Equal); |
| 1065 } |
993 | 1066 |
994 WASM_EXEC_TEST(I16x8NotEqual) { RunI16x8CompareOpTest(kExprI16x8Ne, NotEqual); } | 1067 WASM_EXEC_COMPILED_TEST(I16x8NotEqual) { |
| 1068 RunI16x8CompareOpTest(kExprI16x8Ne, NotEqual); |
| 1069 } |
995 | 1070 |
996 WASM_EXEC_TEST(I16x8Greater) { RunI16x8CompareOpTest(kExprI16x8GtS, Greater); } | 1071 WASM_EXEC_COMPILED_TEST(I16x8Greater) { |
| 1072 RunI16x8CompareOpTest(kExprI16x8GtS, Greater); |
| 1073 } |
997 | 1074 |
998 WASM_EXEC_TEST(I16x8GreaterEqual) { | 1075 WASM_EXEC_COMPILED_TEST(I16x8GreaterEqual) { |
999 RunI16x8CompareOpTest(kExprI16x8GeS, GreaterEqual); | 1076 RunI16x8CompareOpTest(kExprI16x8GeS, GreaterEqual); |
1000 } | 1077 } |
1001 | 1078 |
1002 WASM_EXEC_TEST(I16x8Less) { RunI16x8CompareOpTest(kExprI16x8LtS, Less); } | 1079 WASM_EXEC_COMPILED_TEST(I16x8Less) { |
| 1080 RunI16x8CompareOpTest(kExprI16x8LtS, Less); |
| 1081 } |
1003 | 1082 |
1004 WASM_EXEC_TEST(I16x8LessEqual) { | 1083 WASM_EXEC_COMPILED_TEST(I16x8LessEqual) { |
1005 RunI16x8CompareOpTest(kExprI16x8LeS, LessEqual); | 1084 RunI16x8CompareOpTest(kExprI16x8LeS, LessEqual); |
1006 } | 1085 } |
1007 | 1086 |
1008 WASM_EXEC_TEST(Ui16x8Greater) { | 1087 WASM_EXEC_COMPILED_TEST(Ui16x8Greater) { |
1009 RunI16x8CompareOpTest(kExprI16x8GtU, UnsignedGreater); | 1088 RunI16x8CompareOpTest(kExprI16x8GtU, UnsignedGreater); |
1010 } | 1089 } |
1011 | 1090 |
1012 WASM_EXEC_TEST(Ui16x8GreaterEqual) { | 1091 WASM_EXEC_COMPILED_TEST(Ui16x8GreaterEqual) { |
1013 RunI16x8CompareOpTest(kExprI16x8GeU, UnsignedGreaterEqual); | 1092 RunI16x8CompareOpTest(kExprI16x8GeU, UnsignedGreaterEqual); |
1014 } | 1093 } |
1015 | 1094 |
1016 WASM_EXEC_TEST(Ui16x8Less) { | 1095 WASM_EXEC_COMPILED_TEST(Ui16x8Less) { |
1017 RunI16x8CompareOpTest(kExprI16x8LtU, UnsignedLess); | 1096 RunI16x8CompareOpTest(kExprI16x8LtU, UnsignedLess); |
1018 } | 1097 } |
1019 | 1098 |
1020 WASM_EXEC_TEST(Ui16x8LessEqual) { | 1099 WASM_EXEC_COMPILED_TEST(Ui16x8LessEqual) { |
1021 RunI16x8CompareOpTest(kExprI16x8LeU, UnsignedLessEqual); | 1100 RunI16x8CompareOpTest(kExprI16x8LeU, UnsignedLessEqual); |
1022 } | 1101 } |
1023 | 1102 |
1024 void RunI16x8ShiftOpTest(WasmOpcode simd_op, Int16ShiftOp expected_op, | 1103 void RunI16x8ShiftOpTest(WasmOpcode simd_op, Int16ShiftOp expected_op, |
1025 int shift) { | 1104 int shift) { |
1026 FLAG_wasm_simd_prototype = true; | 1105 FLAG_wasm_simd_prototype = true; |
1027 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); | 1106 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); |
1028 byte a = 0; | 1107 byte a = 0; |
1029 byte expected = 1; | 1108 byte expected = 1; |
1030 byte simd = r.AllocateLocal(kWasmS128); | 1109 byte simd = r.AllocateLocal(kWasmS128); |
1031 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I16x8_SPLAT(WASM_GET_LOCAL(a))), | 1110 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I16x8_SPLAT(WASM_GET_LOCAL(a))), |
1032 WASM_SET_LOCAL( | 1111 WASM_SET_LOCAL( |
1033 simd, WASM_SIMD_SHIFT_OP(simd_op, shift, WASM_GET_LOCAL(simd))), | 1112 simd, WASM_SIMD_SHIFT_OP(simd_op, shift, WASM_GET_LOCAL(simd))), |
1034 WASM_SIMD_CHECK_SPLAT8(I16x8, simd, I32, expected), WASM_ONE); | 1113 WASM_SIMD_CHECK_SPLAT8(I16x8, simd, I32, expected), WASM_ONE); |
1035 | 1114 |
1036 FOR_INT16_INPUTS(i) { CHECK_EQ(1, r.Call(*i, expected_op(*i, shift))); } | 1115 FOR_INT16_INPUTS(i) { CHECK_EQ(1, r.Call(*i, expected_op(*i, shift))); } |
1037 } | 1116 } |
1038 | 1117 |
1039 WASM_EXEC_TEST(I16x8Shl) { | 1118 WASM_EXEC_COMPILED_TEST(I16x8Shl) { |
1040 RunI16x8ShiftOpTest(kExprI16x8Shl, LogicalShiftLeft, 1); | 1119 RunI16x8ShiftOpTest(kExprI16x8Shl, LogicalShiftLeft, 1); |
1041 } | 1120 } |
1042 | 1121 |
1043 WASM_EXEC_TEST(I16x8ShrS) { | 1122 WASM_EXEC_COMPILED_TEST(I16x8ShrS) { |
1044 RunI16x8ShiftOpTest(kExprI16x8ShrS, ArithmeticShiftRight, 1); | 1123 RunI16x8ShiftOpTest(kExprI16x8ShrS, ArithmeticShiftRight, 1); |
1045 } | 1124 } |
1046 | 1125 |
1047 WASM_EXEC_TEST(I16x8ShrU) { | 1126 WASM_EXEC_COMPILED_TEST(I16x8ShrU) { |
1048 RunI16x8ShiftOpTest(kExprI16x8ShrU, LogicalShiftRight, 1); | 1127 RunI16x8ShiftOpTest(kExprI16x8ShrU, LogicalShiftRight, 1); |
1049 } | 1128 } |
1050 | 1129 |
1051 void RunI8x16UnOpTest(WasmOpcode simd_op, Int8UnOp expected_op) { | 1130 void RunI8x16UnOpTest(WasmOpcode simd_op, Int8UnOp expected_op) { |
1052 FLAG_wasm_simd_prototype = true; | 1131 FLAG_wasm_simd_prototype = true; |
1053 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); | 1132 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); |
1054 byte a = 0; | 1133 byte a = 0; |
1055 byte expected = 1; | 1134 byte expected = 1; |
1056 byte simd = r.AllocateLocal(kWasmS128); | 1135 byte simd = r.AllocateLocal(kWasmS128); |
1057 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I8x16_SPLAT(WASM_GET_LOCAL(a))), | 1136 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I8x16_SPLAT(WASM_GET_LOCAL(a))), |
1058 WASM_SET_LOCAL(simd, WASM_SIMD_UNOP(simd_op, WASM_GET_LOCAL(simd))), | 1137 WASM_SET_LOCAL(simd, WASM_SIMD_UNOP(simd_op, WASM_GET_LOCAL(simd))), |
1059 WASM_SIMD_CHECK_SPLAT16(I8x16, simd, I32, expected), WASM_ONE); | 1138 WASM_SIMD_CHECK_SPLAT16(I8x16, simd, I32, expected), WASM_ONE); |
1060 | 1139 |
1061 FOR_INT8_INPUTS(i) { CHECK_EQ(1, r.Call(*i, expected_op(*i))); } | 1140 FOR_INT8_INPUTS(i) { CHECK_EQ(1, r.Call(*i, expected_op(*i))); } |
1062 } | 1141 } |
1063 | 1142 |
1064 WASM_EXEC_TEST(I8x16Neg) { RunI8x16UnOpTest(kExprI8x16Neg, Negate); } | 1143 WASM_EXEC_COMPILED_TEST(I8x16Neg) { RunI8x16UnOpTest(kExprI8x16Neg, Negate); } |
1065 | 1144 |
1066 void RunI8x16BinOpTest(WasmOpcode simd_op, Int8BinOp expected_op) { | 1145 void RunI8x16BinOpTest(WasmOpcode simd_op, Int8BinOp expected_op) { |
1067 FLAG_wasm_simd_prototype = true; | 1146 FLAG_wasm_simd_prototype = true; |
1068 WasmRunner<int32_t, int32_t, int32_t, int32_t> r(kExecuteCompiled); | 1147 WasmRunner<int32_t, int32_t, int32_t, int32_t> r(kExecuteCompiled); |
1069 byte a = 0; | 1148 byte a = 0; |
1070 byte b = 1; | 1149 byte b = 1; |
1071 byte expected = 2; | 1150 byte expected = 2; |
1072 byte simd0 = r.AllocateLocal(kWasmS128); | 1151 byte simd0 = r.AllocateLocal(kWasmS128); |
1073 byte simd1 = r.AllocateLocal(kWasmS128); | 1152 byte simd1 = r.AllocateLocal(kWasmS128); |
1074 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_I8x16_SPLAT(WASM_GET_LOCAL(a))), | 1153 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_I8x16_SPLAT(WASM_GET_LOCAL(a))), |
1075 WASM_SET_LOCAL(simd1, WASM_SIMD_I8x16_SPLAT(WASM_GET_LOCAL(b))), | 1154 WASM_SET_LOCAL(simd1, WASM_SIMD_I8x16_SPLAT(WASM_GET_LOCAL(b))), |
1076 WASM_SET_LOCAL(simd1, WASM_SIMD_BINOP(simd_op, WASM_GET_LOCAL(simd0), | 1155 WASM_SET_LOCAL(simd1, WASM_SIMD_BINOP(simd_op, WASM_GET_LOCAL(simd0), |
1077 WASM_GET_LOCAL(simd1))), | 1156 WASM_GET_LOCAL(simd1))), |
1078 WASM_SIMD_CHECK_SPLAT16(I8x16, simd1, I32, expected), WASM_ONE); | 1157 WASM_SIMD_CHECK_SPLAT16(I8x16, simd1, I32, expected), WASM_ONE); |
1079 | 1158 |
1080 FOR_INT8_INPUTS(i) { | 1159 FOR_INT8_INPUTS(i) { |
1081 FOR_INT8_INPUTS(j) { CHECK_EQ(1, r.Call(*i, *j, expected_op(*i, *j))); } | 1160 FOR_INT8_INPUTS(j) { CHECK_EQ(1, r.Call(*i, *j, expected_op(*i, *j))); } |
1082 } | 1161 } |
1083 } | 1162 } |
1084 | 1163 |
1085 WASM_EXEC_TEST(I8x16Add) { RunI8x16BinOpTest(kExprI8x16Add, Add); } | 1164 WASM_EXEC_COMPILED_TEST(I8x16Add) { RunI8x16BinOpTest(kExprI8x16Add, Add); } |
1086 | 1165 |
1087 WASM_EXEC_TEST(I8x16AddSaturate) { | 1166 WASM_EXEC_COMPILED_TEST(I8x16AddSaturate) { |
1088 RunI8x16BinOpTest(kExprI8x16AddSaturateS, AddSaturate); | 1167 RunI8x16BinOpTest(kExprI8x16AddSaturateS, AddSaturate); |
1089 } | 1168 } |
1090 | 1169 |
1091 WASM_EXEC_TEST(I8x16Sub) { RunI8x16BinOpTest(kExprI8x16Sub, Sub); } | 1170 WASM_EXEC_COMPILED_TEST(I8x16Sub) { RunI8x16BinOpTest(kExprI8x16Sub, Sub); } |
1092 | 1171 |
1093 WASM_EXEC_TEST(I8x16SubSaturate) { | 1172 WASM_EXEC_COMPILED_TEST(I8x16SubSaturate) { |
1094 RunI8x16BinOpTest(kExprI8x16SubSaturateS, SubSaturate); | 1173 RunI8x16BinOpTest(kExprI8x16SubSaturateS, SubSaturate); |
1095 } | 1174 } |
1096 | 1175 |
1097 WASM_EXEC_TEST(I8x16Mul) { RunI8x16BinOpTest(kExprI8x16Mul, Mul); } | 1176 WASM_EXEC_COMPILED_TEST(I8x16Mul) { RunI8x16BinOpTest(kExprI8x16Mul, Mul); } |
1098 | 1177 |
1099 WASM_EXEC_TEST(I8x16Min) { RunI8x16BinOpTest(kExprI8x16MinS, Minimum); } | 1178 WASM_EXEC_COMPILED_TEST(I8x16Min) { |
| 1179 RunI8x16BinOpTest(kExprI8x16MinS, Minimum); |
| 1180 } |
1100 | 1181 |
1101 WASM_EXEC_TEST(I8x16Max) { RunI8x16BinOpTest(kExprI8x16MaxS, Maximum); } | 1182 WASM_EXEC_COMPILED_TEST(I8x16Max) { |
| 1183 RunI8x16BinOpTest(kExprI8x16MaxS, Maximum); |
| 1184 } |
1102 | 1185 |
1103 WASM_EXEC_TEST(Ui8x16AddSaturate) { | 1186 WASM_EXEC_COMPILED_TEST(Ui8x16AddSaturate) { |
1104 RunI8x16BinOpTest(kExprI8x16AddSaturateU, UnsignedAddSaturate); | 1187 RunI8x16BinOpTest(kExprI8x16AddSaturateU, UnsignedAddSaturate); |
1105 } | 1188 } |
1106 | 1189 |
1107 WASM_EXEC_TEST(Ui8x16SubSaturate) { | 1190 WASM_EXEC_COMPILED_TEST(Ui8x16SubSaturate) { |
1108 RunI8x16BinOpTest(kExprI8x16SubSaturateU, UnsignedSubSaturate); | 1191 RunI8x16BinOpTest(kExprI8x16SubSaturateU, UnsignedSubSaturate); |
1109 } | 1192 } |
1110 | 1193 |
1111 WASM_EXEC_TEST(Ui8x16Min) { | 1194 WASM_EXEC_COMPILED_TEST(Ui8x16Min) { |
1112 RunI8x16BinOpTest(kExprI8x16MinU, UnsignedMinimum); | 1195 RunI8x16BinOpTest(kExprI8x16MinU, UnsignedMinimum); |
1113 } | 1196 } |
1114 | 1197 |
1115 WASM_EXEC_TEST(Ui8x16Max) { | 1198 WASM_EXEC_COMPILED_TEST(Ui8x16Max) { |
1116 RunI8x16BinOpTest(kExprI8x16MaxU, UnsignedMaximum); | 1199 RunI8x16BinOpTest(kExprI8x16MaxU, UnsignedMaximum); |
1117 } | 1200 } |
1118 | 1201 |
1119 void RunI8x16CompareOpTest(WasmOpcode simd_op, Int8BinOp expected_op) { | 1202 void RunI8x16CompareOpTest(WasmOpcode simd_op, Int8BinOp expected_op) { |
1120 FLAG_wasm_simd_prototype = true; | 1203 FLAG_wasm_simd_prototype = true; |
1121 WasmRunner<int32_t, int32_t, int32_t, int32_t> r(kExecuteCompiled); | 1204 WasmRunner<int32_t, int32_t, int32_t, int32_t> r(kExecuteCompiled); |
1122 byte a = 0; | 1205 byte a = 0; |
1123 byte b = 1; | 1206 byte b = 1; |
1124 byte expected = 2; | 1207 byte expected = 2; |
1125 byte simd0 = r.AllocateLocal(kWasmS128); | 1208 byte simd0 = r.AllocateLocal(kWasmS128); |
1126 byte simd1 = r.AllocateLocal(kWasmS128); | 1209 byte simd1 = r.AllocateLocal(kWasmS128); |
1127 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_I8x16_SPLAT(WASM_GET_LOCAL(a))), | 1210 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))), | 1211 WASM_SET_LOCAL(simd1, WASM_SIMD_I8x16_SPLAT(WASM_GET_LOCAL(b))), |
1129 WASM_SET_LOCAL(simd1, | 1212 WASM_SET_LOCAL(simd1, |
1130 WASM_SIMD_MATERIALIZE_BOOLS( | 1213 WASM_SIMD_MATERIALIZE_BOOLS( |
1131 8x16, WASM_SIMD_BINOP(simd_op, WASM_GET_LOCAL(simd0), | 1214 8x16, WASM_SIMD_BINOP(simd_op, WASM_GET_LOCAL(simd0), |
1132 WASM_GET_LOCAL(simd1)))), | 1215 WASM_GET_LOCAL(simd1)))), |
1133 WASM_SIMD_CHECK_SPLAT16(I8x16, simd1, I32, expected), WASM_ONE); | 1216 WASM_SIMD_CHECK_SPLAT16(I8x16, simd1, I32, expected), WASM_ONE); |
1134 | 1217 |
1135 FOR_INT8_INPUTS(i) { | 1218 FOR_INT8_INPUTS(i) { |
1136 FOR_INT8_INPUTS(j) { CHECK_EQ(1, r.Call(*i, *j, expected_op(*i, *j))); } | 1219 FOR_INT8_INPUTS(j) { CHECK_EQ(1, r.Call(*i, *j, expected_op(*i, *j))); } |
1137 } | 1220 } |
1138 } | 1221 } |
1139 | 1222 |
1140 WASM_EXEC_TEST(I8x16Equal) { RunI8x16CompareOpTest(kExprI8x16Eq, Equal); } | 1223 WASM_EXEC_COMPILED_TEST(I8x16Equal) { |
| 1224 RunI8x16CompareOpTest(kExprI8x16Eq, Equal); |
| 1225 } |
1141 | 1226 |
1142 WASM_EXEC_TEST(I8x16NotEqual) { RunI8x16CompareOpTest(kExprI8x16Ne, NotEqual); } | 1227 WASM_EXEC_COMPILED_TEST(I8x16NotEqual) { |
| 1228 RunI8x16CompareOpTest(kExprI8x16Ne, NotEqual); |
| 1229 } |
1143 | 1230 |
1144 WASM_EXEC_TEST(I8x16Greater) { RunI8x16CompareOpTest(kExprI8x16GtS, Greater); } | 1231 WASM_EXEC_COMPILED_TEST(I8x16Greater) { |
| 1232 RunI8x16CompareOpTest(kExprI8x16GtS, Greater); |
| 1233 } |
1145 | 1234 |
1146 WASM_EXEC_TEST(I8x16GreaterEqual) { | 1235 WASM_EXEC_COMPILED_TEST(I8x16GreaterEqual) { |
1147 RunI8x16CompareOpTest(kExprI8x16GeS, GreaterEqual); | 1236 RunI8x16CompareOpTest(kExprI8x16GeS, GreaterEqual); |
1148 } | 1237 } |
1149 | 1238 |
1150 WASM_EXEC_TEST(I8x16Less) { RunI8x16CompareOpTest(kExprI8x16LtS, Less); } | 1239 WASM_EXEC_COMPILED_TEST(I8x16Less) { |
| 1240 RunI8x16CompareOpTest(kExprI8x16LtS, Less); |
| 1241 } |
1151 | 1242 |
1152 WASM_EXEC_TEST(I8x16LessEqual) { | 1243 WASM_EXEC_COMPILED_TEST(I8x16LessEqual) { |
1153 RunI8x16CompareOpTest(kExprI8x16LeS, LessEqual); | 1244 RunI8x16CompareOpTest(kExprI8x16LeS, LessEqual); |
1154 } | 1245 } |
1155 | 1246 |
1156 WASM_EXEC_TEST(Ui8x16Greater) { | 1247 WASM_EXEC_COMPILED_TEST(Ui8x16Greater) { |
1157 RunI8x16CompareOpTest(kExprI8x16GtU, UnsignedGreater); | 1248 RunI8x16CompareOpTest(kExprI8x16GtU, UnsignedGreater); |
1158 } | 1249 } |
1159 | 1250 |
1160 WASM_EXEC_TEST(Ui8x16GreaterEqual) { | 1251 WASM_EXEC_COMPILED_TEST(Ui8x16GreaterEqual) { |
1161 RunI8x16CompareOpTest(kExprI8x16GeU, UnsignedGreaterEqual); | 1252 RunI8x16CompareOpTest(kExprI8x16GeU, UnsignedGreaterEqual); |
1162 } | 1253 } |
1163 | 1254 |
1164 WASM_EXEC_TEST(Ui8x16Less) { | 1255 WASM_EXEC_COMPILED_TEST(Ui8x16Less) { |
1165 RunI8x16CompareOpTest(kExprI8x16LtU, UnsignedLess); | 1256 RunI8x16CompareOpTest(kExprI8x16LtU, UnsignedLess); |
1166 } | 1257 } |
1167 | 1258 |
1168 WASM_EXEC_TEST(Ui8x16LessEqual) { | 1259 WASM_EXEC_COMPILED_TEST(Ui8x16LessEqual) { |
1169 RunI8x16CompareOpTest(kExprI8x16LeU, UnsignedLessEqual); | 1260 RunI8x16CompareOpTest(kExprI8x16LeU, UnsignedLessEqual); |
1170 } | 1261 } |
1171 | 1262 |
1172 void RunI8x16ShiftOpTest(WasmOpcode simd_op, Int8ShiftOp expected_op, | 1263 void RunI8x16ShiftOpTest(WasmOpcode simd_op, Int8ShiftOp expected_op, |
1173 int shift) { | 1264 int shift) { |
1174 FLAG_wasm_simd_prototype = true; | 1265 FLAG_wasm_simd_prototype = true; |
1175 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); | 1266 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); |
1176 byte a = 0; | 1267 byte a = 0; |
1177 byte expected = 1; | 1268 byte expected = 1; |
1178 byte simd = r.AllocateLocal(kWasmS128); | 1269 byte simd = r.AllocateLocal(kWasmS128); |
1179 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I8x16_SPLAT(WASM_GET_LOCAL(a))), | 1270 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I8x16_SPLAT(WASM_GET_LOCAL(a))), |
1180 WASM_SET_LOCAL( | 1271 WASM_SET_LOCAL( |
1181 simd, WASM_SIMD_SHIFT_OP(simd_op, shift, WASM_GET_LOCAL(simd))), | 1272 simd, WASM_SIMD_SHIFT_OP(simd_op, shift, WASM_GET_LOCAL(simd))), |
1182 WASM_SIMD_CHECK_SPLAT16(I8x16, simd, I32, expected), WASM_ONE); | 1273 WASM_SIMD_CHECK_SPLAT16(I8x16, simd, I32, expected), WASM_ONE); |
1183 | 1274 |
1184 FOR_INT8_INPUTS(i) { CHECK_EQ(1, r.Call(*i, expected_op(*i, shift))); } | 1275 FOR_INT8_INPUTS(i) { CHECK_EQ(1, r.Call(*i, expected_op(*i, shift))); } |
1185 } | 1276 } |
1186 | 1277 |
1187 WASM_EXEC_TEST(I8x16Shl) { | 1278 WASM_EXEC_COMPILED_TEST(I8x16Shl) { |
1188 RunI8x16ShiftOpTest(kExprI8x16Shl, LogicalShiftLeft, 1); | 1279 RunI8x16ShiftOpTest(kExprI8x16Shl, LogicalShiftLeft, 1); |
1189 } | 1280 } |
1190 | 1281 |
1191 WASM_EXEC_TEST(I8x16ShrS) { | 1282 WASM_EXEC_COMPILED_TEST(I8x16ShrS) { |
1192 RunI8x16ShiftOpTest(kExprI8x16ShrS, ArithmeticShiftRight, 1); | 1283 RunI8x16ShiftOpTest(kExprI8x16ShrS, ArithmeticShiftRight, 1); |
1193 } | 1284 } |
1194 | 1285 |
1195 WASM_EXEC_TEST(I8x16ShrU) { | 1286 WASM_EXEC_COMPILED_TEST(I8x16ShrU) { |
1196 RunI8x16ShiftOpTest(kExprI8x16ShrU, LogicalShiftRight, 1); | 1287 RunI8x16ShiftOpTest(kExprI8x16ShrU, LogicalShiftRight, 1); |
1197 } | 1288 } |
1198 | 1289 |
1199 // Test Select by making a mask where the first two lanes are true and the rest | 1290 // 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. | 1291 // false, and comparing for non-equality with zero to materialize a bool vector. |
1201 #define WASM_SIMD_SELECT_TEST(format) \ | 1292 #define WASM_SIMD_SELECT_TEST(format) \ |
1202 WASM_EXEC_TEST(S##format##Select) { \ | 1293 WASM_EXEC_COMPILED_TEST(S##format##Select) { \ |
1203 FLAG_wasm_simd_prototype = true; \ | 1294 FLAG_wasm_simd_prototype = true; \ |
1204 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); \ | 1295 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); \ |
1205 byte val1 = 0; \ | 1296 byte val1 = 0; \ |
1206 byte val2 = 1; \ | 1297 byte val2 = 1; \ |
1207 byte src1 = r.AllocateLocal(kWasmS128); \ | 1298 byte src1 = r.AllocateLocal(kWasmS128); \ |
1208 byte src2 = r.AllocateLocal(kWasmS128); \ | 1299 byte src2 = r.AllocateLocal(kWasmS128); \ |
1209 byte zero = r.AllocateLocal(kWasmS128); \ | 1300 byte zero = r.AllocateLocal(kWasmS128); \ |
1210 byte mask = r.AllocateLocal(kWasmS128); \ | 1301 byte mask = r.AllocateLocal(kWasmS128); \ |
1211 BUILD(r, WASM_SET_LOCAL( \ | 1302 BUILD(r, WASM_SET_LOCAL( \ |
1212 src1, WASM_SIMD_I##format##_SPLAT(WASM_GET_LOCAL(val1))), \ | 1303 src1, WASM_SIMD_I##format##_SPLAT(WASM_GET_LOCAL(val1))), \ |
(...skipping 15 matching lines...) Expand all Loading... |
1228 WASM_SIMD_CHECK_LANE(I##format, mask, I32, val1, 2), \ | 1319 WASM_SIMD_CHECK_LANE(I##format, mask, I32, val1, 2), \ |
1229 WASM_SIMD_CHECK_LANE(I##format, mask, I32, val2, 3), WASM_ONE); \ | 1320 WASM_SIMD_CHECK_LANE(I##format, mask, I32, val2, 3), WASM_ONE); \ |
1230 \ | 1321 \ |
1231 CHECK_EQ(1, r.Call(0x12, 0x34)); \ | 1322 CHECK_EQ(1, r.Call(0x12, 0x34)); \ |
1232 } | 1323 } |
1233 | 1324 |
1234 WASM_SIMD_SELECT_TEST(32x4) | 1325 WASM_SIMD_SELECT_TEST(32x4) |
1235 WASM_SIMD_SELECT_TEST(16x8) | 1326 WASM_SIMD_SELECT_TEST(16x8) |
1236 WASM_SIMD_SELECT_TEST(8x16) | 1327 WASM_SIMD_SELECT_TEST(8x16) |
1237 #endif // V8_TARGET_ARCH_ARM | 1328 #endif // V8_TARGET_ARCH_ARM |
| 1329 |
| 1330 #if V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET |
| 1331 WASM_EXEC_COMPILED_TEST(SimdI32x4ExtractWithF32x4) { |
| 1332 FLAG_wasm_simd_prototype = true; |
| 1333 WasmRunner<int32_t> r(kExecuteCompiled); |
| 1334 BUILD(r, WASM_IF_ELSE_I( |
| 1335 WASM_I32_EQ(WASM_SIMD_I32x4_EXTRACT_LANE( |
| 1336 0, WASM_SIMD_F32x4_SPLAT(WASM_F32(30.5))), |
| 1337 WASM_I32_REINTERPRET_F32(WASM_F32(30.5))), |
| 1338 WASM_I32V(1), WASM_I32V(0))); |
| 1339 FOR_INT32_INPUTS(i) { CHECK_EQ(1, r.Call()); } |
| 1340 } |
| 1341 |
| 1342 WASM_EXEC_COMPILED_TEST(SimdF32x4ExtractWithI32x4) { |
| 1343 FLAG_wasm_simd_prototype = true; |
| 1344 WasmRunner<int32_t> r(kExecuteCompiled); |
| 1345 BUILD(r, |
| 1346 WASM_IF_ELSE_I(WASM_F32_EQ(WASM_SIMD_F32x4_EXTRACT_LANE( |
| 1347 0, WASM_SIMD_I32x4_SPLAT(WASM_I32V(15))), |
| 1348 WASM_F32_REINTERPRET_I32(WASM_I32V(15))), |
| 1349 WASM_I32V(1), WASM_I32V(0))); |
| 1350 FOR_INT32_INPUTS(i) { CHECK_EQ(1, r.Call()); } |
| 1351 } |
| 1352 |
| 1353 WASM_EXEC_COMPILED_TEST(SimdF32x4AddWithI32x4) { |
| 1354 FLAG_wasm_simd_prototype = true; |
| 1355 WasmRunner<int32_t> r(kExecuteCompiled); |
| 1356 BUILD(r, |
| 1357 WASM_IF_ELSE_I( |
| 1358 WASM_F32_EQ( |
| 1359 WASM_SIMD_F32x4_EXTRACT_LANE( |
| 1360 0, WASM_SIMD_BINOP(kExprF32x4Add, |
| 1361 WASM_SIMD_I32x4_SPLAT(WASM_I32V(32)), |
| 1362 WASM_SIMD_I32x4_SPLAT(WASM_I32V(19)))), |
| 1363 WASM_F32_ADD(WASM_F32_REINTERPRET_I32(WASM_I32V(32)), |
| 1364 WASM_F32_REINTERPRET_I32(WASM_I32V(19)))), |
| 1365 WASM_I32V(1), WASM_I32V(0))); |
| 1366 FOR_INT32_INPUTS(i) { CHECK_EQ(1, r.Call()); } |
| 1367 } |
| 1368 |
| 1369 WASM_EXEC_COMPILED_TEST(SimdI32x4AddWithF32x4) { |
| 1370 FLAG_wasm_simd_prototype = true; |
| 1371 WasmRunner<int32_t> r(kExecuteCompiled); |
| 1372 BUILD(r, |
| 1373 WASM_IF_ELSE_I( |
| 1374 WASM_I32_EQ( |
| 1375 WASM_SIMD_I32x4_EXTRACT_LANE( |
| 1376 0, WASM_SIMD_BINOP(kExprI32x4Add, |
| 1377 WASM_SIMD_F32x4_SPLAT(WASM_F32(21.25)), |
| 1378 WASM_SIMD_F32x4_SPLAT(WASM_F32(31.5)))), |
| 1379 WASM_I32_ADD(WASM_I32_REINTERPRET_F32(WASM_F32(21.25)), |
| 1380 WASM_I32_REINTERPRET_F32(WASM_F32(31.5)))), |
| 1381 WASM_I32V(1), WASM_I32V(0))); |
| 1382 FOR_INT32_INPUTS(i) { CHECK_EQ(1, r.Call()); } |
| 1383 } |
| 1384 |
| 1385 WASM_EXEC_COMPILED_TEST(SimdI32x4Local) { |
| 1386 FLAG_wasm_simd_prototype = true; |
| 1387 WasmRunner<int32_t> r(kExecuteCompiled); |
| 1388 r.AllocateLocal(kWasmS128); |
| 1389 BUILD(r, WASM_SET_LOCAL(0, WASM_SIMD_I32x4_SPLAT(WASM_I32V(31))), |
| 1390 |
| 1391 WASM_SIMD_I32x4_EXTRACT_LANE(0, WASM_GET_LOCAL(0))); |
| 1392 FOR_INT32_INPUTS(i) { CHECK_EQ(31, r.Call()); } |
| 1393 } |
| 1394 |
| 1395 WASM_EXEC_COMPILED_TEST(SimdI32x4SplatFromExtract) { |
| 1396 FLAG_wasm_simd_prototype = true; |
| 1397 WasmRunner<int32_t> r(kExecuteCompiled); |
| 1398 r.AllocateLocal(kWasmI32); |
| 1399 r.AllocateLocal(kWasmS128); |
| 1400 BUILD(r, WASM_SET_LOCAL(0, WASM_SIMD_I32x4_EXTRACT_LANE( |
| 1401 0, WASM_SIMD_I32x4_SPLAT(WASM_I32V(76)))), |
| 1402 WASM_SET_LOCAL(1, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(0))), |
| 1403 WASM_SIMD_I32x4_EXTRACT_LANE(1, WASM_GET_LOCAL(1))); |
| 1404 FOR_INT32_INPUTS(i) { CHECK_EQ(76, r.Call()); } |
| 1405 } |
| 1406 |
| 1407 WASM_EXEC_COMPILED_TEST(SimdI32x4For) { |
| 1408 FLAG_wasm_simd_prototype = true; |
| 1409 WasmRunner<int32_t> r(kExecuteCompiled); |
| 1410 r.AllocateLocal(kWasmI32); |
| 1411 r.AllocateLocal(kWasmS128); |
| 1412 BUILD(r, |
| 1413 |
| 1414 WASM_SET_LOCAL(1, WASM_SIMD_I32x4_SPLAT(WASM_I32V(31))), |
| 1415 WASM_SET_LOCAL(1, WASM_SIMD_I32x4_REPLACE_LANE(1, WASM_GET_LOCAL(1), |
| 1416 WASM_I32V(53))), |
| 1417 WASM_SET_LOCAL(1, WASM_SIMD_I32x4_REPLACE_LANE(2, WASM_GET_LOCAL(1), |
| 1418 WASM_I32V(23))), |
| 1419 WASM_SET_LOCAL(0, WASM_I32V(0)), |
| 1420 WASM_LOOP( |
| 1421 WASM_SET_LOCAL( |
| 1422 1, WASM_SIMD_BINOP(kExprI32x4Add, WASM_GET_LOCAL(1), |
| 1423 WASM_SIMD_I32x4_SPLAT(WASM_I32V(1)))), |
| 1424 WASM_IF(WASM_I32_NE(WASM_INC_LOCAL(0), WASM_I32V(5)), WASM_BR(1))), |
| 1425 WASM_SET_LOCAL(0, WASM_I32V(1)), |
| 1426 WASM_IF(WASM_I32_NE(WASM_SIMD_I32x4_EXTRACT_LANE(0, WASM_GET_LOCAL(1)), |
| 1427 WASM_I32V(36)), |
| 1428 WASM_SET_LOCAL(0, WASM_I32V(0))), |
| 1429 WASM_IF(WASM_I32_NE(WASM_SIMD_I32x4_EXTRACT_LANE(1, WASM_GET_LOCAL(1)), |
| 1430 WASM_I32V(58)), |
| 1431 WASM_SET_LOCAL(0, WASM_I32V(0))), |
| 1432 WASM_IF(WASM_I32_NE(WASM_SIMD_I32x4_EXTRACT_LANE(2, WASM_GET_LOCAL(1)), |
| 1433 WASM_I32V(28)), |
| 1434 WASM_SET_LOCAL(0, WASM_I32V(0))), |
| 1435 WASM_IF(WASM_I32_NE(WASM_SIMD_I32x4_EXTRACT_LANE(3, WASM_GET_LOCAL(1)), |
| 1436 WASM_I32V(36)), |
| 1437 WASM_SET_LOCAL(0, WASM_I32V(0))), |
| 1438 WASM_GET_LOCAL(0)); |
| 1439 FOR_INT32_INPUTS(i) { CHECK_EQ(1, r.Call()); } |
| 1440 } |
| 1441 |
| 1442 WASM_EXEC_COMPILED_TEST(SimdF32x4For) { |
| 1443 FLAG_wasm_simd_prototype = true; |
| 1444 WasmRunner<int32_t> r(kExecuteCompiled); |
| 1445 r.AllocateLocal(kWasmI32); |
| 1446 r.AllocateLocal(kWasmS128); |
| 1447 BUILD(r, WASM_SET_LOCAL(1, WASM_SIMD_F32x4_SPLAT(WASM_F32(21.25))), |
| 1448 WASM_SET_LOCAL(1, WASM_SIMD_F32x4_REPLACE_LANE(3, WASM_GET_LOCAL(1), |
| 1449 WASM_F32(19.5))), |
| 1450 WASM_SET_LOCAL(0, WASM_I32V(0)), |
| 1451 WASM_LOOP( |
| 1452 WASM_SET_LOCAL( |
| 1453 1, WASM_SIMD_BINOP(kExprF32x4Add, WASM_GET_LOCAL(1), |
| 1454 WASM_SIMD_F32x4_SPLAT(WASM_F32(2.0)))), |
| 1455 WASM_IF(WASM_I32_NE(WASM_INC_LOCAL(0), WASM_I32V(3)), WASM_BR(1))), |
| 1456 WASM_SET_LOCAL(0, WASM_I32V(1)), |
| 1457 WASM_IF(WASM_F32_NE(WASM_SIMD_F32x4_EXTRACT_LANE(0, WASM_GET_LOCAL(1)), |
| 1458 WASM_F32(27.25)), |
| 1459 WASM_SET_LOCAL(0, WASM_I32V(0))), |
| 1460 WASM_IF(WASM_F32_NE(WASM_SIMD_F32x4_EXTRACT_LANE(3, WASM_GET_LOCAL(1)), |
| 1461 WASM_F32(25.5)), |
| 1462 WASM_SET_LOCAL(0, WASM_I32V(0))), |
| 1463 WASM_GET_LOCAL(0)); |
| 1464 FOR_INT32_INPUTS(i) { CHECK_EQ(1, r.Call()); } |
| 1465 } |
| 1466 #endif // V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET |
| 1467 |
| 1468 #if SIMD_LOWERING_TARGET |
| 1469 WASM_EXEC_COMPILED_TEST(SimdI32x4GetGlobal) { |
| 1470 FLAG_wasm_simd_prototype = true; |
| 1471 WasmRunner<int32_t, int32_t> r(kExecuteCompiled); |
| 1472 int32_t* global = r.module().AddGlobal<int32_t>(kWasmS128); |
| 1473 *(global) = 0; |
| 1474 *(global + 1) = 1; |
| 1475 *(global + 2) = 2; |
| 1476 *(global + 3) = 3; |
| 1477 r.AllocateLocal(kWasmI32); |
| 1478 BUILD( |
| 1479 r, WASM_SET_LOCAL(1, WASM_I32V(1)), |
| 1480 WASM_IF(WASM_I32_NE(WASM_I32V(0), |
| 1481 WASM_SIMD_I32x4_EXTRACT_LANE(0, WASM_GET_GLOBAL(0))), |
| 1482 WASM_SET_LOCAL(1, WASM_I32V(0))), |
| 1483 WASM_IF(WASM_I32_NE(WASM_I32V(1), |
| 1484 WASM_SIMD_I32x4_EXTRACT_LANE(1, WASM_GET_GLOBAL(0))), |
| 1485 WASM_SET_LOCAL(1, WASM_I32V(0))), |
| 1486 WASM_IF(WASM_I32_NE(WASM_I32V(2), |
| 1487 WASM_SIMD_I32x4_EXTRACT_LANE(2, WASM_GET_GLOBAL(0))), |
| 1488 WASM_SET_LOCAL(1, WASM_I32V(0))), |
| 1489 WASM_IF(WASM_I32_NE(WASM_I32V(3), |
| 1490 WASM_SIMD_I32x4_EXTRACT_LANE(3, WASM_GET_GLOBAL(0))), |
| 1491 WASM_SET_LOCAL(1, WASM_I32V(0))), |
| 1492 WASM_GET_LOCAL(1)); |
| 1493 FOR_INT32_INPUTS(i) { CHECK_EQ(1, r.Call(0)); } |
| 1494 } |
| 1495 |
| 1496 WASM_EXEC_COMPILED_TEST(SimdI32x4SetGlobal) { |
| 1497 FLAG_wasm_simd_prototype = true; |
| 1498 WasmRunner<int32_t, int32_t> r(kExecuteCompiled); |
| 1499 int32_t* global = r.module().AddGlobal<int32_t>(kWasmS128); |
| 1500 BUILD(r, WASM_SET_GLOBAL(0, WASM_SIMD_I32x4_SPLAT(WASM_I32V(23))), |
| 1501 WASM_SET_GLOBAL(0, WASM_SIMD_I32x4_REPLACE_LANE(1, WASM_GET_GLOBAL(0), |
| 1502 WASM_I32V(34))), |
| 1503 WASM_SET_GLOBAL(0, WASM_SIMD_I32x4_REPLACE_LANE(2, WASM_GET_GLOBAL(0), |
| 1504 WASM_I32V(45))), |
| 1505 WASM_SET_GLOBAL(0, WASM_SIMD_I32x4_REPLACE_LANE(3, WASM_GET_GLOBAL(0), |
| 1506 WASM_I32V(56))), |
| 1507 WASM_I32V(1)); |
| 1508 FOR_INT32_INPUTS(i) { CHECK_EQ(1, r.Call(0)); } |
| 1509 CHECK_EQ(*global, 23); |
| 1510 CHECK_EQ(*(global + 1), 34); |
| 1511 CHECK_EQ(*(global + 2), 45); |
| 1512 CHECK_EQ(*(global + 3), 56); |
| 1513 } |
| 1514 |
| 1515 WASM_EXEC_COMPILED_TEST(SimdF32x4GetGlobal) { |
| 1516 FLAG_wasm_simd_prototype = true; |
| 1517 WasmRunner<int32_t, int32_t> r(kExecuteCompiled); |
| 1518 float* global = r.module().AddGlobal<float>(kWasmS128); |
| 1519 *(global) = 0.0; |
| 1520 *(global + 1) = 1.5; |
| 1521 *(global + 2) = 2.25; |
| 1522 *(global + 3) = 3.5; |
| 1523 r.AllocateLocal(kWasmI32); |
| 1524 BUILD( |
| 1525 r, WASM_SET_LOCAL(1, WASM_I32V(1)), |
| 1526 WASM_IF(WASM_F32_NE(WASM_F32(0.0), |
| 1527 WASM_SIMD_F32x4_EXTRACT_LANE(0, WASM_GET_GLOBAL(0))), |
| 1528 WASM_SET_LOCAL(1, WASM_I32V(0))), |
| 1529 WASM_IF(WASM_F32_NE(WASM_F32(1.5), |
| 1530 WASM_SIMD_F32x4_EXTRACT_LANE(1, WASM_GET_GLOBAL(0))), |
| 1531 WASM_SET_LOCAL(1, WASM_I32V(0))), |
| 1532 WASM_IF(WASM_F32_NE(WASM_F32(2.25), |
| 1533 WASM_SIMD_F32x4_EXTRACT_LANE(2, WASM_GET_GLOBAL(0))), |
| 1534 WASM_SET_LOCAL(1, WASM_I32V(0))), |
| 1535 WASM_IF(WASM_F32_NE(WASM_F32(3.5), |
| 1536 WASM_SIMD_F32x4_EXTRACT_LANE(3, WASM_GET_GLOBAL(0))), |
| 1537 WASM_SET_LOCAL(1, WASM_I32V(0))), |
| 1538 WASM_GET_LOCAL(1)); |
| 1539 FOR_INT32_INPUTS(i) { CHECK_EQ(1, r.Call(0)); } |
| 1540 } |
| 1541 |
| 1542 WASM_EXEC_COMPILED_TEST(SimdF32x4SetGlobal) { |
| 1543 FLAG_wasm_simd_prototype = true; |
| 1544 WasmRunner<int32_t, int32_t> r(kExecuteCompiled); |
| 1545 float* global = r.module().AddGlobal<float>(kWasmS128); |
| 1546 BUILD(r, WASM_SET_GLOBAL(0, WASM_SIMD_F32x4_SPLAT(WASM_F32(13.5))), |
| 1547 WASM_SET_GLOBAL(0, WASM_SIMD_F32x4_REPLACE_LANE(1, WASM_GET_GLOBAL(0), |
| 1548 WASM_F32(45.5))), |
| 1549 WASM_SET_GLOBAL(0, WASM_SIMD_F32x4_REPLACE_LANE(2, WASM_GET_GLOBAL(0), |
| 1550 WASM_F32(32.25))), |
| 1551 WASM_SET_GLOBAL(0, WASM_SIMD_F32x4_REPLACE_LANE(3, WASM_GET_GLOBAL(0), |
| 1552 WASM_F32(65.0))), |
| 1553 WASM_I32V(1)); |
| 1554 FOR_INT32_INPUTS(i) { CHECK_EQ(1, r.Call(0)); } |
| 1555 CHECK_EQ(*global, 13.5); |
| 1556 CHECK_EQ(*(global + 1), 45.5); |
| 1557 CHECK_EQ(*(global + 2), 32.25); |
| 1558 CHECK_EQ(*(global + 3), 65.0); |
| 1559 } |
| 1560 #endif // SIMD_LOWERING_TARGET |
OLD | NEW |