| 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 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 68 T Minimum(T a, T b) { | 68 T Minimum(T a, T b) { |
| 69 return a <= b ? a : b; | 69 return a <= b ? a : b; |
| 70 } | 70 } |
| 71 | 71 |
| 72 template <typename T> | 72 template <typename T> |
| 73 T Maximum(T a, T b) { | 73 T Maximum(T a, T b) { |
| 74 return a >= b ? a : b; | 74 return a >= b ? a : b; |
| 75 } | 75 } |
| 76 | 76 |
| 77 // For float operands, Min and Max must return NaN if either operand is NaN. | 77 // For float operands, Min and Max must return NaN if either operand is NaN. |
| 78 #if V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET | 78 #if V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET || V8_TARGET_ARCH_MIPS || \ |
| 79 V8_TARGET_ARCH_MIPS64 |
| 79 template <> | 80 template <> |
| 80 float Minimum(float a, float b) { | 81 float Minimum(float a, float b) { |
| 81 if (std::isnan(a) || std::isnan(b)) | 82 if (std::isnan(a) || std::isnan(b)) |
| 82 return std::numeric_limits<float>::quiet_NaN(); | 83 return std::numeric_limits<float>::quiet_NaN(); |
| 83 return a <= b ? a : b; | 84 return a <= b ? a : b; |
| 84 } | 85 } |
| 85 | 86 |
| 86 template <> | 87 template <> |
| 87 float Maximum(float a, float b) { | 88 float Maximum(float a, float b) { |
| 88 if (std::isnan(a) || std::isnan(b)) | 89 if (std::isnan(a) || std::isnan(b)) |
| 89 return std::numeric_limits<float>::quiet_NaN(); | 90 return std::numeric_limits<float>::quiet_NaN(); |
| 90 return a >= b ? a : b; | 91 return a >= b ? a : b; |
| 91 } | 92 } |
| 92 #endif // V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET | 93 #endif // V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET || V8_TARGET_ARCH_MIPS || |
| 94 // V8_TARGET_ARCH_MIPS64 |
| 93 | 95 |
| 94 template <typename T> | 96 template <typename T> |
| 95 T UnsignedMinimum(T a, T b) { | 97 T UnsignedMinimum(T a, T b) { |
| 96 using UnsignedT = typename std::make_unsigned<T>::type; | 98 using UnsignedT = typename std::make_unsigned<T>::type; |
| 97 return static_cast<UnsignedT>(a) <= static_cast<UnsignedT>(b) ? a : b; | 99 return static_cast<UnsignedT>(a) <= static_cast<UnsignedT>(b) ? a : b; |
| 98 } | 100 } |
| 99 | 101 |
| 100 template <typename T> | 102 template <typename T> |
| 101 T UnsignedMaximum(T a, T b) { | 103 T UnsignedMaximum(T a, T b) { |
| 102 using UnsignedT = typename std::make_unsigned<T>::type; | 104 using UnsignedT = typename std::make_unsigned<T>::type; |
| (...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 466 WASM_SIMD_CHECK_SPLAT_F32x4(simd1, expected_signed), | 468 WASM_SIMD_CHECK_SPLAT_F32x4(simd1, expected_signed), |
| 467 WASM_SET_LOCAL(simd2, WASM_SIMD_F32x4_FROM_U32x4(WASM_GET_LOCAL(simd0))), | 469 WASM_SET_LOCAL(simd2, WASM_SIMD_F32x4_FROM_U32x4(WASM_GET_LOCAL(simd0))), |
| 468 WASM_SIMD_CHECK_SPLAT_F32x4(simd2, expected_unsigned), | 470 WASM_SIMD_CHECK_SPLAT_F32x4(simd2, expected_unsigned), |
| 469 WASM_RETURN1(WASM_ONE)); | 471 WASM_RETURN1(WASM_ONE)); |
| 470 | 472 |
| 471 FOR_INT32_INPUTS(i) { | 473 FOR_INT32_INPUTS(i) { |
| 472 CHECK_EQ(1, r.Call(*i, static_cast<float>(*i), | 474 CHECK_EQ(1, r.Call(*i, static_cast<float>(*i), |
| 473 static_cast<float>(static_cast<uint32_t>(*i)))); | 475 static_cast<float>(static_cast<uint32_t>(*i)))); |
| 474 } | 476 } |
| 475 } | 477 } |
| 478 #endif // V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET |
| 476 | 479 |
| 480 #if V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET || V8_TARGET_ARCH_MIPS || \ |
| 481 V8_TARGET_ARCH_MIPS64 |
| 477 void RunF32x4UnOpTest(WasmOpcode simd_op, FloatUnOp expected_op, | 482 void RunF32x4UnOpTest(WasmOpcode simd_op, FloatUnOp expected_op, |
| 478 float error = 0.0f) { | 483 float error = 0.0f) { |
| 479 FLAG_wasm_simd_prototype = true; | 484 FLAG_wasm_simd_prototype = true; |
| 480 WasmRunner<int32_t, float, float, float> r(kExecuteCompiled); | 485 WasmRunner<int32_t, float, float, float> r(kExecuteCompiled); |
| 481 byte a = 0; | 486 byte a = 0; |
| 482 byte low = 1; | 487 byte low = 1; |
| 483 byte high = 2; | 488 byte high = 2; |
| 484 byte simd = r.AllocateLocal(kWasmS128); | 489 byte simd = r.AllocateLocal(kWasmS128); |
| 485 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(a))), | 490 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(a))), |
| 486 WASM_SET_LOCAL(simd, WASM_SIMD_UNOP(simd_op, WASM_GET_LOCAL(simd))), | 491 WASM_SET_LOCAL(simd, WASM_SIMD_UNOP(simd_op, WASM_GET_LOCAL(simd))), |
| 487 WASM_SIMD_CHECK_SPLAT_F32x4_ESTIMATE(simd, low, high), | 492 WASM_SIMD_CHECK_SPLAT_F32x4_ESTIMATE(simd, low, high), |
| 488 WASM_RETURN1(WASM_ONE)); | 493 WASM_RETURN1(WASM_ONE)); |
| 489 | 494 |
| 490 FOR_FLOAT32_INPUTS(i) { | 495 FOR_FLOAT32_INPUTS(i) { |
| 491 if (SkipFPValue(*i)) continue; | 496 if (SkipFPValue(*i)) continue; |
| 492 float expected = expected_op(*i); | 497 float expected = expected_op(*i); |
| 493 if (SkipFPExpectedValue(expected)) continue; | 498 if (SkipFPExpectedValue(expected)) continue; |
| 494 float abs_error = std::abs(expected) * error; | 499 float abs_error = std::abs(expected) * error; |
| 495 CHECK_EQ(1, r.Call(*i, expected - abs_error, expected + abs_error)); | 500 CHECK_EQ(1, r.Call(*i, expected - abs_error, expected + abs_error)); |
| 496 } | 501 } |
| 497 } | 502 } |
| 498 | 503 |
| 499 WASM_EXEC_COMPILED_TEST(F32x4Abs) { RunF32x4UnOpTest(kExprF32x4Abs, std::abs); } | 504 WASM_EXEC_COMPILED_TEST(F32x4Abs) { RunF32x4UnOpTest(kExprF32x4Abs, std::abs); } |
| 500 WASM_EXEC_COMPILED_TEST(F32x4Neg) { RunF32x4UnOpTest(kExprF32x4Neg, Negate); } | 505 WASM_EXEC_COMPILED_TEST(F32x4Neg) { RunF32x4UnOpTest(kExprF32x4Neg, Negate); } |
| 501 #endif // V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET | 506 #endif // V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET || V8_TARGET_ARCH_MIPS || |
| 507 // V8_TARGET_ARCH_MIPS64 |
| 502 | 508 |
| 503 #if SIMD_LOWERING_TARGET | 509 #if SIMD_LOWERING_TARGET |
| 504 WASM_EXEC_COMPILED_TEST(F32x4Sqrt) { RunF32x4UnOpTest(kExprF32x4Sqrt, Sqrt); } | 510 WASM_EXEC_COMPILED_TEST(F32x4Sqrt) { RunF32x4UnOpTest(kExprF32x4Sqrt, Sqrt); } |
| 505 #endif // SIMD_LOWERING_TARGET | 511 #endif // SIMD_LOWERING_TARGET |
| 506 | 512 |
| 507 #if V8_TARGET_ARCH_ARM | 513 #if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64 |
| 508 static const float kApproxError = 0.01f; | 514 static const float kApproxError = 0.01f; |
| 509 | 515 |
| 510 WASM_EXEC_COMPILED_TEST(F32x4RecipApprox) { | 516 WASM_EXEC_COMPILED_TEST(F32x4RecipApprox) { |
| 511 RunF32x4UnOpTest(kExprF32x4RecipApprox, Recip, kApproxError); | 517 RunF32x4UnOpTest(kExprF32x4RecipApprox, Recip, kApproxError); |
| 512 } | 518 } |
| 513 | 519 |
| 514 WASM_EXEC_COMPILED_TEST(F32x4RecipSqrtApprox) { | 520 WASM_EXEC_COMPILED_TEST(F32x4RecipSqrtApprox) { |
| 515 RunF32x4UnOpTest(kExprF32x4RecipSqrtApprox, RecipSqrt, kApproxError); | 521 RunF32x4UnOpTest(kExprF32x4RecipSqrtApprox, RecipSqrt, kApproxError); |
| 516 } | 522 } |
| 517 #endif // V8_TARGET_ARCH_ARM | 523 #endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64 |
| 518 | 524 |
| 519 #if V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET | 525 #if V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET || V8_TARGET_ARCH_MIPS || \ |
| 526 V8_TARGET_ARCH_MIPS64 |
| 520 void RunF32x4BinOpTest(WasmOpcode simd_op, FloatBinOp expected_op) { | 527 void RunF32x4BinOpTest(WasmOpcode simd_op, FloatBinOp expected_op) { |
| 521 FLAG_wasm_simd_prototype = true; | 528 FLAG_wasm_simd_prototype = true; |
| 522 WasmRunner<int32_t, float, float, float> r(kExecuteCompiled); | 529 WasmRunner<int32_t, float, float, float> r(kExecuteCompiled); |
| 523 byte a = 0; | 530 byte a = 0; |
| 524 byte b = 1; | 531 byte b = 1; |
| 525 byte expected = 2; | 532 byte expected = 2; |
| 526 byte simd0 = r.AllocateLocal(kWasmS128); | 533 byte simd0 = r.AllocateLocal(kWasmS128); |
| 527 byte simd1 = r.AllocateLocal(kWasmS128); | 534 byte simd1 = r.AllocateLocal(kWasmS128); |
| 528 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(a))), | 535 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(a))), |
| 529 WASM_SET_LOCAL(simd1, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(b))), | 536 WASM_SET_LOCAL(simd1, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(b))), |
| (...skipping 14 matching lines...) Expand all Loading... |
| 544 | 551 |
| 545 WASM_EXEC_COMPILED_TEST(F32x4Add) { RunF32x4BinOpTest(kExprF32x4Add, Add); } | 552 WASM_EXEC_COMPILED_TEST(F32x4Add) { RunF32x4BinOpTest(kExprF32x4Add, Add); } |
| 546 WASM_EXEC_COMPILED_TEST(F32x4Sub) { RunF32x4BinOpTest(kExprF32x4Sub, Sub); } | 553 WASM_EXEC_COMPILED_TEST(F32x4Sub) { RunF32x4BinOpTest(kExprF32x4Sub, Sub); } |
| 547 WASM_EXEC_COMPILED_TEST(F32x4Mul) { RunF32x4BinOpTest(kExprF32x4Mul, Mul); } | 554 WASM_EXEC_COMPILED_TEST(F32x4Mul) { RunF32x4BinOpTest(kExprF32x4Mul, Mul); } |
| 548 WASM_EXEC_COMPILED_TEST(F32x4_Min) { | 555 WASM_EXEC_COMPILED_TEST(F32x4_Min) { |
| 549 RunF32x4BinOpTest(kExprF32x4Min, Minimum); | 556 RunF32x4BinOpTest(kExprF32x4Min, Minimum); |
| 550 } | 557 } |
| 551 WASM_EXEC_COMPILED_TEST(F32x4_Max) { | 558 WASM_EXEC_COMPILED_TEST(F32x4_Max) { |
| 552 RunF32x4BinOpTest(kExprF32x4Max, Maximum); | 559 RunF32x4BinOpTest(kExprF32x4Max, Maximum); |
| 553 } | 560 } |
| 554 #endif // V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET | 561 #endif // V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET || V8_TARGET_ARCH_MIPS || |
| 562 // V8_TARGET_ARCH_MIPS64 |
| 555 | 563 |
| 556 #if SIMD_LOWERING_TARGET | 564 #if SIMD_LOWERING_TARGET |
| 557 WASM_EXEC_COMPILED_TEST(F32x4Div) { RunF32x4BinOpTest(kExprF32x4Div, Div); } | 565 WASM_EXEC_COMPILED_TEST(F32x4Div) { RunF32x4BinOpTest(kExprF32x4Div, Div); } |
| 558 #endif // SIMD_LOWERING_TARGET | 566 #endif // SIMD_LOWERING_TARGET |
| 559 | 567 |
| 560 #if V8_TARGET_ARCH_ARM | 568 #if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64 |
| 561 WASM_EXEC_COMPILED_TEST(F32x4RecipRefine) { | 569 WASM_EXEC_COMPILED_TEST(F32x4RecipRefine) { |
| 562 RunF32x4BinOpTest(kExprF32x4RecipRefine, RecipRefine); | 570 RunF32x4BinOpTest(kExprF32x4RecipRefine, RecipRefine); |
| 563 } | 571 } |
| 564 | 572 |
| 565 WASM_EXEC_COMPILED_TEST(F32x4RecipSqrtRefine) { | 573 WASM_EXEC_COMPILED_TEST(F32x4RecipSqrtRefine) { |
| 566 RunF32x4BinOpTest(kExprF32x4RecipSqrtRefine, RecipSqrtRefine); | 574 RunF32x4BinOpTest(kExprF32x4RecipSqrtRefine, RecipSqrtRefine); |
| 567 } | 575 } |
| 568 #endif // V8_TARGET_ARCH_ARM | 576 #endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64 |
| 569 | 577 |
| 570 #if V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET | 578 #if V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET || V8_TARGET_ARCH_MIPS || \ |
| 579 V8_TARGET_ARCH_MIPS64 |
| 571 void RunF32x4CompareOpTest(WasmOpcode simd_op, FloatCompareOp expected_op) { | 580 void RunF32x4CompareOpTest(WasmOpcode simd_op, FloatCompareOp expected_op) { |
| 572 FLAG_wasm_simd_prototype = true; | 581 FLAG_wasm_simd_prototype = true; |
| 573 WasmRunner<int32_t, float, float, int32_t> r(kExecuteCompiled); | 582 WasmRunner<int32_t, float, float, int32_t> r(kExecuteCompiled); |
| 574 byte a = 0; | 583 byte a = 0; |
| 575 byte b = 1; | 584 byte b = 1; |
| 576 byte expected = 2; | 585 byte expected = 2; |
| 577 byte simd0 = r.AllocateLocal(kWasmS128); | 586 byte simd0 = r.AllocateLocal(kWasmS128); |
| 578 byte simd1 = r.AllocateLocal(kWasmS128); | 587 byte simd1 = r.AllocateLocal(kWasmS128); |
| 579 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(a))), | 588 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(a))), |
| 580 WASM_SET_LOCAL(simd1, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(b))), | 589 WASM_SET_LOCAL(simd1, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(b))), |
| (...skipping 26 matching lines...) Expand all Loading... |
| 607 | 616 |
| 608 WASM_EXEC_COMPILED_TEST(F32x4Ge) { | 617 WASM_EXEC_COMPILED_TEST(F32x4Ge) { |
| 609 RunF32x4CompareOpTest(kExprF32x4Ge, GreaterEqual); | 618 RunF32x4CompareOpTest(kExprF32x4Ge, GreaterEqual); |
| 610 } | 619 } |
| 611 | 620 |
| 612 WASM_EXEC_COMPILED_TEST(F32x4Lt) { RunF32x4CompareOpTest(kExprF32x4Lt, Less); } | 621 WASM_EXEC_COMPILED_TEST(F32x4Lt) { RunF32x4CompareOpTest(kExprF32x4Lt, Less); } |
| 613 | 622 |
| 614 WASM_EXEC_COMPILED_TEST(F32x4Le) { | 623 WASM_EXEC_COMPILED_TEST(F32x4Le) { |
| 615 RunF32x4CompareOpTest(kExprF32x4Le, LessEqual); | 624 RunF32x4CompareOpTest(kExprF32x4Le, LessEqual); |
| 616 } | 625 } |
| 617 #endif // V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET | 626 #endif // V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET || V8_TARGET_ARCH_MIPS || |
| 627 // V8_TARGET_ARCH_MIPS64 |
| 618 | 628 |
| 619 WASM_EXEC_COMPILED_TEST(I32x4Splat) { | 629 WASM_EXEC_COMPILED_TEST(I32x4Splat) { |
| 620 FLAG_wasm_simd_prototype = true; | 630 FLAG_wasm_simd_prototype = true; |
| 621 | 631 |
| 622 // Store SIMD value in a local variable, use extract lane to check lane values | 632 // Store SIMD value in a local variable, use extract lane to check lane values |
| 623 // This test is not a test for ExtractLane as Splat does not create | 633 // This test is not a test for ExtractLane as Splat does not create |
| 624 // interesting SIMD values. | 634 // interesting SIMD values. |
| 625 // | 635 // |
| 626 // SetLocal(1, I32x4Splat(Local(0))); | 636 // SetLocal(1, I32x4Splat(Local(0))); |
| 627 // For each lane index | 637 // For each lane index |
| (...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 843 new_val, new_val, new_val, new_val, new_val, old_val), | 853 new_val, new_val, new_val, new_val, new_val, old_val), |
| 844 WASM_SET_LOCAL(simd, | 854 WASM_SET_LOCAL(simd, |
| 845 WASM_SIMD_I8x16_REPLACE_LANE(15, WASM_GET_LOCAL(simd), | 855 WASM_SIMD_I8x16_REPLACE_LANE(15, WASM_GET_LOCAL(simd), |
| 846 WASM_GET_LOCAL(new_val))), | 856 WASM_GET_LOCAL(new_val))), |
| 847 WASM_SIMD_CHECK_SPLAT16(I8x16, simd, I32, new_val), WASM_ONE); | 857 WASM_SIMD_CHECK_SPLAT16(I8x16, simd, I32, new_val), WASM_ONE); |
| 848 | 858 |
| 849 CHECK_EQ(1, r.Call(1, 2)); | 859 CHECK_EQ(1, r.Call(1, 2)); |
| 850 } | 860 } |
| 851 #endif // V8_TARGET_ARCH_ARM | 861 #endif // V8_TARGET_ARCH_ARM |
| 852 | 862 |
| 853 #if V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET | 863 #if V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET || V8_TARGET_ARCH_MIPS || \ |
| 864 V8_TARGET_ARCH_MIPS64 |
| 854 // Determines if conversion from float to int will be valid. | 865 // Determines if conversion from float to int will be valid. |
| 855 bool CanRoundToZeroAndConvert(double val, bool unsigned_integer) { | 866 bool CanRoundToZeroAndConvert(double val, bool unsigned_integer) { |
| 856 const double max_uint = static_cast<double>(0xffffffffu); | 867 const double max_uint = static_cast<double>(0xffffffffu); |
| 857 const double max_int = static_cast<double>(kMaxInt); | 868 const double max_int = static_cast<double>(kMaxInt); |
| 858 const double min_int = static_cast<double>(kMinInt); | 869 const double min_int = static_cast<double>(kMinInt); |
| 859 | 870 |
| 860 // Check for NaN. | 871 // Check for NaN. |
| 861 if (val != val) { | 872 if (val != val) { |
| 862 return false; | 873 return false; |
| 863 } | 874 } |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 908 WASM_SET_LOCAL(simd2, WASM_SIMD_U32x4_FROM_F32x4(WASM_GET_LOCAL(simd0))), | 919 WASM_SET_LOCAL(simd2, WASM_SIMD_U32x4_FROM_F32x4(WASM_GET_LOCAL(simd0))), |
| 909 WASM_SIMD_CHECK_SPLAT4(I32x4, simd2, I32, expected_unsigned), WASM_ONE); | 920 WASM_SIMD_CHECK_SPLAT4(I32x4, simd2, I32, expected_unsigned), WASM_ONE); |
| 910 | 921 |
| 911 FOR_FLOAT32_INPUTS(i) { | 922 FOR_FLOAT32_INPUTS(i) { |
| 912 if (SkipFPValue(*i)) continue; | 923 if (SkipFPValue(*i)) continue; |
| 913 int32_t signed_value = ConvertToInt(*i, false); | 924 int32_t signed_value = ConvertToInt(*i, false); |
| 914 int32_t unsigned_value = ConvertToInt(*i, true); | 925 int32_t unsigned_value = ConvertToInt(*i, true); |
| 915 CHECK_EQ(1, r.Call(*i, signed_value, unsigned_value)); | 926 CHECK_EQ(1, r.Call(*i, signed_value, unsigned_value)); |
| 916 } | 927 } |
| 917 } | 928 } |
| 929 #endif // V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET || V8_TARGET_ARCH_MIPS || |
| 930 // V8_TARGET_ARCH_MIPS64 |
| 918 | 931 |
| 932 #if V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET |
| 919 void RunI32x4UnOpTest(WasmOpcode simd_op, Int32UnOp expected_op) { | 933 void RunI32x4UnOpTest(WasmOpcode simd_op, Int32UnOp expected_op) { |
| 920 FLAG_wasm_simd_prototype = true; | 934 FLAG_wasm_simd_prototype = true; |
| 921 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); | 935 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); |
| 922 byte a = 0; | 936 byte a = 0; |
| 923 byte expected = 1; | 937 byte expected = 1; |
| 924 byte simd = r.AllocateLocal(kWasmS128); | 938 byte simd = r.AllocateLocal(kWasmS128); |
| 925 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(a))), | 939 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(a))), |
| 926 WASM_SET_LOCAL(simd, WASM_SIMD_UNOP(simd_op, WASM_GET_LOCAL(simd))), | 940 WASM_SET_LOCAL(simd, WASM_SIMD_UNOP(simd_op, WASM_GET_LOCAL(simd))), |
| 927 WASM_SIMD_CHECK_SPLAT4(I32x4, simd, I32, expected), WASM_ONE); | 941 WASM_SIMD_CHECK_SPLAT4(I32x4, simd, I32, expected), WASM_ONE); |
| 928 | 942 |
| (...skipping 927 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1856 WASM_SIMD_I32x4_EXTRACT_LANE( | 1870 WASM_SIMD_I32x4_EXTRACT_LANE( |
| 1857 0, WASM_LOAD_MEM(MachineType::Simd128(), WASM_ZERO))); | 1871 0, WASM_LOAD_MEM(MachineType::Simd128(), WASM_ZERO))); |
| 1858 | 1872 |
| 1859 FOR_INT32_INPUTS(i) { | 1873 FOR_INT32_INPUTS(i) { |
| 1860 int32_t expected = *i; | 1874 int32_t expected = *i; |
| 1861 r.module().WriteMemory(&memory[0], expected); | 1875 r.module().WriteMemory(&memory[0], expected); |
| 1862 CHECK_EQ(expected, r.Call()); | 1876 CHECK_EQ(expected, r.Call()); |
| 1863 } | 1877 } |
| 1864 } | 1878 } |
| 1865 #endif // V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET | 1879 #endif // V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET |
| OLD | NEW |