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

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

Issue 2778203002: MIPS[64]: Support for some SIMD operations (4) (Closed)
Patch Set: rebased Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/mips64/assembler-mips64.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 the V8 project authors. All rights reserved. 1 // Copyright 2016 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/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
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 375 matching lines...) Expand 10 before | Expand all | Expand 10 after
478 WASM_RETURN1(WASM_ONE)); 480 WASM_RETURN1(WASM_ONE));
479 481
480 FOR_INT32_INPUTS(i) { 482 FOR_INT32_INPUTS(i) {
481 CHECK_EQ(1, r.Call(*i, static_cast<float>(*i), 483 CHECK_EQ(1, r.Call(*i, static_cast<float>(*i),
482 static_cast<float>(static_cast<uint32_t>(*i)))); 484 static_cast<float>(static_cast<uint32_t>(*i))));
483 } 485 }
484 } 486 }
485 #endif // V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET || V8_TARGET_ARCH_MIPS || 487 #endif // V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET || V8_TARGET_ARCH_MIPS ||
486 // V8_TARGET_ARCH_MIPS64 488 // V8_TARGET_ARCH_MIPS64
487 489
488 #if V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET 490 #if V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET || V8_TARGET_ARCH_MIPS || \
491 V8_TARGET_ARCH_MIPS64
489 void RunF32x4UnOpTest(WasmOpcode simd_op, FloatUnOp expected_op, 492 void RunF32x4UnOpTest(WasmOpcode simd_op, FloatUnOp expected_op,
490 float error = 0.0f) { 493 float error = 0.0f) {
491 FLAG_wasm_simd_prototype = true; 494 FLAG_wasm_simd_prototype = true;
492 WasmRunner<int32_t, float, float, float> r(kExecuteCompiled); 495 WasmRunner<int32_t, float, float, float> r(kExecuteCompiled);
493 byte a = 0; 496 byte a = 0;
494 byte low = 1; 497 byte low = 1;
495 byte high = 2; 498 byte high = 2;
496 byte simd = r.AllocateLocal(kWasmS128); 499 byte simd = r.AllocateLocal(kWasmS128);
497 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(a))), 500 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(a))),
498 WASM_SET_LOCAL(simd, WASM_SIMD_UNOP(simd_op, WASM_GET_LOCAL(simd))), 501 WASM_SET_LOCAL(simd, WASM_SIMD_UNOP(simd_op, WASM_GET_LOCAL(simd))),
499 WASM_SIMD_CHECK_SPLAT_F32x4_ESTIMATE(simd, low, high), 502 WASM_SIMD_CHECK_SPLAT_F32x4_ESTIMATE(simd, low, high),
500 WASM_RETURN1(WASM_ONE)); 503 WASM_RETURN1(WASM_ONE));
501 504
502 FOR_FLOAT32_INPUTS(i) { 505 FOR_FLOAT32_INPUTS(i) {
503 if (SkipFPValue(*i)) continue; 506 if (SkipFPValue(*i)) continue;
504 float expected = expected_op(*i); 507 float expected = expected_op(*i);
505 if (SkipFPExpectedValue(expected)) continue; 508 if (SkipFPExpectedValue(expected)) continue;
506 float abs_error = std::abs(expected) * error; 509 float abs_error = std::abs(expected) * error;
507 CHECK_EQ(1, r.Call(*i, expected - abs_error, expected + abs_error)); 510 CHECK_EQ(1, r.Call(*i, expected - abs_error, expected + abs_error));
508 } 511 }
509 } 512 }
510 513
511 WASM_EXEC_COMPILED_TEST(F32x4Abs) { RunF32x4UnOpTest(kExprF32x4Abs, std::abs); } 514 WASM_EXEC_COMPILED_TEST(F32x4Abs) { RunF32x4UnOpTest(kExprF32x4Abs, std::abs); }
512 WASM_EXEC_COMPILED_TEST(F32x4Neg) { RunF32x4UnOpTest(kExprF32x4Neg, Negate); } 515 WASM_EXEC_COMPILED_TEST(F32x4Neg) { RunF32x4UnOpTest(kExprF32x4Neg, Negate); }
513 #endif // V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET 516 #endif // V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET || V8_TARGET_ARCH_MIPS ||
517 // V8_TARGET_ARCH_MIPS64
514 518
515 #if SIMD_LOWERING_TARGET 519 #if SIMD_LOWERING_TARGET
516 WASM_EXEC_COMPILED_TEST(F32x4Sqrt) { RunF32x4UnOpTest(kExprF32x4Sqrt, Sqrt); } 520 WASM_EXEC_COMPILED_TEST(F32x4Sqrt) { RunF32x4UnOpTest(kExprF32x4Sqrt, Sqrt); }
517 #endif // SIMD_LOWERING_TARGET 521 #endif // SIMD_LOWERING_TARGET
518 522
519 #if V8_TARGET_ARCH_ARM 523 #if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64
520 static const float kApproxError = 0.01f; 524 static const float kApproxError = 0.01f;
521 525
522 WASM_EXEC_COMPILED_TEST(F32x4RecipApprox) { 526 WASM_EXEC_COMPILED_TEST(F32x4RecipApprox) {
523 RunF32x4UnOpTest(kExprF32x4RecipApprox, Recip, kApproxError); 527 RunF32x4UnOpTest(kExprF32x4RecipApprox, Recip, kApproxError);
524 } 528 }
525 529
526 WASM_EXEC_COMPILED_TEST(F32x4RecipSqrtApprox) { 530 WASM_EXEC_COMPILED_TEST(F32x4RecipSqrtApprox) {
527 RunF32x4UnOpTest(kExprF32x4RecipSqrtApprox, RecipSqrt, kApproxError); 531 RunF32x4UnOpTest(kExprF32x4RecipSqrtApprox, RecipSqrt, kApproxError);
528 } 532 }
529 #endif // V8_TARGET_ARCH_ARM 533 #endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64
530 534
531 #if V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET 535 #if V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET || V8_TARGET_ARCH_MIPS || \
536 V8_TARGET_ARCH_MIPS64
532 void RunF32x4BinOpTest(WasmOpcode simd_op, FloatBinOp expected_op) { 537 void RunF32x4BinOpTest(WasmOpcode simd_op, FloatBinOp expected_op) {
533 FLAG_wasm_simd_prototype = true; 538 FLAG_wasm_simd_prototype = true;
534 WasmRunner<int32_t, float, float, float> r(kExecuteCompiled); 539 WasmRunner<int32_t, float, float, float> r(kExecuteCompiled);
535 byte a = 0; 540 byte a = 0;
536 byte b = 1; 541 byte b = 1;
537 byte expected = 2; 542 byte expected = 2;
538 byte simd0 = r.AllocateLocal(kWasmS128); 543 byte simd0 = r.AllocateLocal(kWasmS128);
539 byte simd1 = r.AllocateLocal(kWasmS128); 544 byte simd1 = r.AllocateLocal(kWasmS128);
540 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(a))), 545 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(a))),
541 WASM_SET_LOCAL(simd1, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(b))), 546 WASM_SET_LOCAL(simd1, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(b))),
(...skipping 14 matching lines...) Expand all
556 561
557 WASM_EXEC_COMPILED_TEST(F32x4Add) { RunF32x4BinOpTest(kExprF32x4Add, Add); } 562 WASM_EXEC_COMPILED_TEST(F32x4Add) { RunF32x4BinOpTest(kExprF32x4Add, Add); }
558 WASM_EXEC_COMPILED_TEST(F32x4Sub) { RunF32x4BinOpTest(kExprF32x4Sub, Sub); } 563 WASM_EXEC_COMPILED_TEST(F32x4Sub) { RunF32x4BinOpTest(kExprF32x4Sub, Sub); }
559 WASM_EXEC_COMPILED_TEST(F32x4Mul) { RunF32x4BinOpTest(kExprF32x4Mul, Mul); } 564 WASM_EXEC_COMPILED_TEST(F32x4Mul) { RunF32x4BinOpTest(kExprF32x4Mul, Mul); }
560 WASM_EXEC_COMPILED_TEST(F32x4_Min) { 565 WASM_EXEC_COMPILED_TEST(F32x4_Min) {
561 RunF32x4BinOpTest(kExprF32x4Min, Minimum); 566 RunF32x4BinOpTest(kExprF32x4Min, Minimum);
562 } 567 }
563 WASM_EXEC_COMPILED_TEST(F32x4_Max) { 568 WASM_EXEC_COMPILED_TEST(F32x4_Max) {
564 RunF32x4BinOpTest(kExprF32x4Max, Maximum); 569 RunF32x4BinOpTest(kExprF32x4Max, Maximum);
565 } 570 }
566 #endif // V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET 571 #endif // V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET || V8_TARGET_ARCH_MIPS ||
572 // V8_TARGET_ARCH_MIPS64
567 573
568 #if SIMD_LOWERING_TARGET 574 #if SIMD_LOWERING_TARGET
569 WASM_EXEC_COMPILED_TEST(F32x4Div) { RunF32x4BinOpTest(kExprF32x4Div, Div); } 575 WASM_EXEC_COMPILED_TEST(F32x4Div) { RunF32x4BinOpTest(kExprF32x4Div, Div); }
570 #endif // SIMD_LOWERING_TARGET 576 #endif // SIMD_LOWERING_TARGET
571 577
572 #if V8_TARGET_ARCH_ARM 578 #if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64
573 WASM_EXEC_COMPILED_TEST(F32x4RecipRefine) { 579 WASM_EXEC_COMPILED_TEST(F32x4RecipRefine) {
574 RunF32x4BinOpTest(kExprF32x4RecipRefine, RecipRefine); 580 RunF32x4BinOpTest(kExprF32x4RecipRefine, RecipRefine);
575 } 581 }
576 582
577 WASM_EXEC_COMPILED_TEST(F32x4RecipSqrtRefine) { 583 WASM_EXEC_COMPILED_TEST(F32x4RecipSqrtRefine) {
578 RunF32x4BinOpTest(kExprF32x4RecipSqrtRefine, RecipSqrtRefine); 584 RunF32x4BinOpTest(kExprF32x4RecipSqrtRefine, RecipSqrtRefine);
579 } 585 }
580 #endif // V8_TARGET_ARCH_ARM 586 #endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64
581 587
582 #if V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET 588 #if V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET || V8_TARGET_ARCH_MIPS || \
589 V8_TARGET_ARCH_MIPS64
583 void RunF32x4CompareOpTest(WasmOpcode simd_op, FloatCompareOp expected_op) { 590 void RunF32x4CompareOpTest(WasmOpcode simd_op, FloatCompareOp expected_op) {
584 FLAG_wasm_simd_prototype = true; 591 FLAG_wasm_simd_prototype = true;
585 WasmRunner<int32_t, float, float, int32_t> r(kExecuteCompiled); 592 WasmRunner<int32_t, float, float, int32_t> r(kExecuteCompiled);
586 byte a = 0; 593 byte a = 0;
587 byte b = 1; 594 byte b = 1;
588 byte expected = 2; 595 byte expected = 2;
589 byte simd0 = r.AllocateLocal(kWasmS128); 596 byte simd0 = r.AllocateLocal(kWasmS128);
590 byte simd1 = r.AllocateLocal(kWasmS128); 597 byte simd1 = r.AllocateLocal(kWasmS128);
591 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(a))), 598 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(a))),
592 WASM_SET_LOCAL(simd1, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(b))), 599 WASM_SET_LOCAL(simd1, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(b))),
(...skipping 26 matching lines...) Expand all
619 626
620 WASM_EXEC_COMPILED_TEST(F32x4Ge) { 627 WASM_EXEC_COMPILED_TEST(F32x4Ge) {
621 RunF32x4CompareOpTest(kExprF32x4Ge, GreaterEqual); 628 RunF32x4CompareOpTest(kExprF32x4Ge, GreaterEqual);
622 } 629 }
623 630
624 WASM_EXEC_COMPILED_TEST(F32x4Lt) { RunF32x4CompareOpTest(kExprF32x4Lt, Less); } 631 WASM_EXEC_COMPILED_TEST(F32x4Lt) { RunF32x4CompareOpTest(kExprF32x4Lt, Less); }
625 632
626 WASM_EXEC_COMPILED_TEST(F32x4Le) { 633 WASM_EXEC_COMPILED_TEST(F32x4Le) {
627 RunF32x4CompareOpTest(kExprF32x4Le, LessEqual); 634 RunF32x4CompareOpTest(kExprF32x4Le, LessEqual);
628 } 635 }
629 #endif // V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET 636 #endif // V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET || V8_TARGET_ARCH_MIPS ||
637 // V8_TARGET_ARCH_MIPS64
630 638
631 WASM_EXEC_COMPILED_TEST(I32x4Splat) { 639 WASM_EXEC_COMPILED_TEST(I32x4Splat) {
632 FLAG_wasm_simd_prototype = true; 640 FLAG_wasm_simd_prototype = true;
633 641
634 // Store SIMD value in a local variable, use extract lane to check lane values 642 // Store SIMD value in a local variable, use extract lane to check lane values
635 // This test is not a test for ExtractLane as Splat does not create 643 // This test is not a test for ExtractLane as Splat does not create
636 // interesting SIMD values. 644 // interesting SIMD values.
637 // 645 //
638 // SetLocal(1, I32x4Splat(Local(0))); 646 // SetLocal(1, I32x4Splat(Local(0)));
639 // For each lane index 647 // For each lane index
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after
855 new_val, new_val, new_val, new_val, new_val, old_val), 863 new_val, new_val, new_val, new_val, new_val, old_val),
856 WASM_SET_LOCAL(simd, 864 WASM_SET_LOCAL(simd,
857 WASM_SIMD_I8x16_REPLACE_LANE(15, WASM_GET_LOCAL(simd), 865 WASM_SIMD_I8x16_REPLACE_LANE(15, WASM_GET_LOCAL(simd),
858 WASM_GET_LOCAL(new_val))), 866 WASM_GET_LOCAL(new_val))),
859 WASM_SIMD_CHECK_SPLAT16(I8x16, simd, I32, new_val), WASM_ONE); 867 WASM_SIMD_CHECK_SPLAT16(I8x16, simd, I32, new_val), WASM_ONE);
860 868
861 CHECK_EQ(1, r.Call(1, 2)); 869 CHECK_EQ(1, r.Call(1, 2));
862 } 870 }
863 #endif // V8_TARGET_ARCH_ARM 871 #endif // V8_TARGET_ARCH_ARM
864 872
865 #if V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET 873 #if V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET || V8_TARGET_ARCH_MIPS || \
874 V8_TARGET_ARCH_MIPS64
866 // Determines if conversion from float to int will be valid. 875 // Determines if conversion from float to int will be valid.
867 bool CanRoundToZeroAndConvert(double val, bool unsigned_integer) { 876 bool CanRoundToZeroAndConvert(double val, bool unsigned_integer) {
868 const double max_uint = static_cast<double>(0xffffffffu); 877 const double max_uint = static_cast<double>(0xffffffffu);
869 const double max_int = static_cast<double>(kMaxInt); 878 const double max_int = static_cast<double>(kMaxInt);
870 const double min_int = static_cast<double>(kMinInt); 879 const double min_int = static_cast<double>(kMinInt);
871 880
872 // Check for NaN. 881 // Check for NaN.
873 if (val != val) { 882 if (val != val) {
874 return false; 883 return false;
875 } 884 }
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
921 WASM_GET_LOCAL(simd0))), 930 WASM_GET_LOCAL(simd0))),
922 WASM_SIMD_CHECK_SPLAT4(I32x4, simd2, I32, expected_unsigned), WASM_ONE); 931 WASM_SIMD_CHECK_SPLAT4(I32x4, simd2, I32, expected_unsigned), WASM_ONE);
923 932
924 FOR_FLOAT32_INPUTS(i) { 933 FOR_FLOAT32_INPUTS(i) {
925 if (SkipFPValue(*i)) continue; 934 if (SkipFPValue(*i)) continue;
926 int32_t signed_value = ConvertToInt(*i, false); 935 int32_t signed_value = ConvertToInt(*i, false);
927 int32_t unsigned_value = ConvertToInt(*i, true); 936 int32_t unsigned_value = ConvertToInt(*i, true);
928 CHECK_EQ(1, r.Call(*i, signed_value, unsigned_value)); 937 CHECK_EQ(1, r.Call(*i, signed_value, unsigned_value));
929 } 938 }
930 } 939 }
940 #endif // V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET || V8_TARGET_ARCH_MIPS ||
941 // V8_TARGET_ARCH_MIPS64
931 942
932 #if V8_TARGET_ARCH_ARM 943 #if V8_TARGET_ARCH_ARM
933 // Tests both signed and unsigned conversion from I16x8 (unpacking). 944 // Tests both signed and unsigned conversion from I16x8 (unpacking).
934 WASM_EXEC_COMPILED_TEST(I32x4ConvertI16x8) { 945 WASM_EXEC_COMPILED_TEST(I32x4ConvertI16x8) {
935 FLAG_wasm_simd_prototype = true; 946 FLAG_wasm_simd_prototype = true;
936 WasmRunner<int32_t, int32_t, int32_t, int32_t> r(kExecuteCompiled); 947 WasmRunner<int32_t, int32_t, int32_t, int32_t> r(kExecuteCompiled);
937 byte a = 0; 948 byte a = 0;
938 byte unpacked_signed = 1; 949 byte unpacked_signed = 1;
939 byte unpacked_unsigned = 2; 950 byte unpacked_unsigned = 2;
940 byte simd0 = r.AllocateLocal(kWasmS128); 951 byte simd0 = r.AllocateLocal(kWasmS128);
941 byte simd1 = r.AllocateLocal(kWasmS128); 952 byte simd1 = r.AllocateLocal(kWasmS128);
942 byte simd2 = r.AllocateLocal(kWasmS128); 953 byte simd2 = r.AllocateLocal(kWasmS128);
943 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_I16x8_SPLAT(WASM_GET_LOCAL(a))), 954 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_I16x8_SPLAT(WASM_GET_LOCAL(a))),
944 WASM_SET_LOCAL(simd1, WASM_SIMD_UNOP(kExprI32x4SConvertI16x8Low, 955 WASM_SET_LOCAL(simd1, WASM_SIMD_UNOP(kExprI32x4SConvertI16x8Low,
945 WASM_GET_LOCAL(simd0))), 956 WASM_GET_LOCAL(simd0))),
946 WASM_SIMD_CHECK_SPLAT4(I32x4, simd1, I32, unpacked_signed), 957 WASM_SIMD_CHECK_SPLAT4(I32x4, simd1, I32, unpacked_signed),
947 WASM_SET_LOCAL(simd2, WASM_SIMD_UNOP(kExprI32x4UConvertI16x8High, 958 WASM_SET_LOCAL(simd2, WASM_SIMD_UNOP(kExprI32x4UConvertI16x8High,
948 WASM_GET_LOCAL(simd0))), 959 WASM_GET_LOCAL(simd0))),
949 WASM_SIMD_CHECK_SPLAT4(I32x4, simd2, I32, unpacked_unsigned), WASM_ONE); 960 WASM_SIMD_CHECK_SPLAT4(I32x4, simd2, I32, unpacked_unsigned), WASM_ONE);
950 961
951 FOR_INT16_INPUTS(i) { 962 FOR_INT16_INPUTS(i) {
952 int32_t unpacked_signed = Widen<int16_t>(*i); 963 int32_t unpacked_signed = Widen<int16_t>(*i);
953 int32_t unpacked_unsigned = UnsignedWiden<int16_t>(*i); 964 int32_t unpacked_unsigned = UnsignedWiden<int16_t>(*i);
954 CHECK_EQ(1, r.Call(*i, unpacked_signed, unpacked_unsigned)); 965 CHECK_EQ(1, r.Call(*i, unpacked_signed, unpacked_unsigned));
955 } 966 }
956 } 967 }
957 #endif // V8_TARGET_ARCH_ARM 968 #endif // V8_TARGET_ARCH_ARM
958 969
970 #if V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET
959 void RunI32x4UnOpTest(WasmOpcode simd_op, Int32UnOp expected_op) { 971 void RunI32x4UnOpTest(WasmOpcode simd_op, Int32UnOp expected_op) {
960 FLAG_wasm_simd_prototype = true; 972 FLAG_wasm_simd_prototype = true;
961 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); 973 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled);
962 byte a = 0; 974 byte a = 0;
963 byte expected = 1; 975 byte expected = 1;
964 byte simd = r.AllocateLocal(kWasmS128); 976 byte simd = r.AllocateLocal(kWasmS128);
965 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(a))), 977 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(a))),
966 WASM_SET_LOCAL(simd, WASM_SIMD_UNOP(simd_op, WASM_GET_LOCAL(simd))), 978 WASM_SET_LOCAL(simd, WASM_SIMD_UNOP(simd_op, WASM_GET_LOCAL(simd))),
967 WASM_SIMD_CHECK_SPLAT4(I32x4, simd, I32, expected), WASM_ONE); 979 WASM_SIMD_CHECK_SPLAT4(I32x4, simd, I32, expected), WASM_ONE);
968 980
(...skipping 1018 matching lines...) Expand 10 before | Expand all | Expand 10 after
1987 WASM_SIMD_I32x4_EXTRACT_LANE( 1999 WASM_SIMD_I32x4_EXTRACT_LANE(
1988 0, WASM_LOAD_MEM(MachineType::Simd128(), WASM_ZERO))); 2000 0, WASM_LOAD_MEM(MachineType::Simd128(), WASM_ZERO)));
1989 2001
1990 FOR_INT32_INPUTS(i) { 2002 FOR_INT32_INPUTS(i) {
1991 int32_t expected = *i; 2003 int32_t expected = *i;
1992 r.module().WriteMemory(&memory[0], expected); 2004 r.module().WriteMemory(&memory[0], expected);
1993 CHECK_EQ(expected, r.Call()); 2005 CHECK_EQ(expected, r.Call());
1994 } 2006 }
1995 } 2007 }
1996 #endif // V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET 2008 #endif // V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET
OLDNEW
« no previous file with comments | « src/mips64/assembler-mips64.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698