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 |