OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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 "test/unittests/compiler/instruction-selector-unittest.h" | 5 #include "test/unittests/compiler/instruction-selector-unittest.h" |
6 | 6 |
7 namespace v8 { | 7 namespace v8 { |
8 namespace internal { | 8 namespace internal { |
9 namespace compiler { | 9 namespace compiler { |
10 | 10 |
(...skipping 454 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
465 EXPECT_EQ(dpi.mi.arch_opcode, s[0]->arch_opcode()); | 465 EXPECT_EQ(dpi.mi.arch_opcode, s[0]->arch_opcode()); |
466 EXPECT_EQ(shift.mode, s[0]->addressing_mode()); | 466 EXPECT_EQ(shift.mode, s[0]->addressing_mode()); |
467 EXPECT_EQ(3U, s[0]->InputCount()); | 467 EXPECT_EQ(3U, s[0]->InputCount()); |
468 EXPECT_EQ(imm, s.ToInt64(s[0]->InputAt(2))); | 468 EXPECT_EQ(imm, s.ToInt64(s[0]->InputAt(2))); |
469 EXPECT_EQ(1U, s[0]->OutputCount()); | 469 EXPECT_EQ(1U, s[0]->OutputCount()); |
470 } | 470 } |
471 } | 471 } |
472 } | 472 } |
473 | 473 |
474 | 474 |
475 TEST_P(InstructionSelectorAddSubTest, ExtendByte) { | 475 TEST_P(InstructionSelectorAddSubTest, UnsignedExtendByte) { |
476 const AddSub dpi = GetParam(); | 476 const AddSub dpi = GetParam(); |
477 const MachineType type = dpi.mi.machine_type; | 477 const MachineType type = dpi.mi.machine_type; |
478 StreamBuilder m(this, type, type, type); | 478 StreamBuilder m(this, type, type, type); |
479 m.Return((m.*dpi.mi.constructor)( | 479 m.Return((m.*dpi.mi.constructor)( |
480 m.Parameter(0), m.Word32And(m.Parameter(1), m.Int32Constant(0xff)))); | 480 m.Parameter(0), m.Word32And(m.Parameter(1), m.Int32Constant(0xff)))); |
481 Stream s = m.Build(); | 481 Stream s = m.Build(); |
482 ASSERT_EQ(1U, s.size()); | 482 ASSERT_EQ(1U, s.size()); |
483 EXPECT_EQ(dpi.mi.arch_opcode, s[0]->arch_opcode()); | 483 EXPECT_EQ(dpi.mi.arch_opcode, s[0]->arch_opcode()); |
484 EXPECT_EQ(kMode_Operand2_R_UXTB, s[0]->addressing_mode()); | 484 EXPECT_EQ(kMode_Operand2_R_UXTB, s[0]->addressing_mode()); |
485 ASSERT_EQ(2U, s[0]->InputCount()); | 485 ASSERT_EQ(2U, s[0]->InputCount()); |
486 ASSERT_EQ(1U, s[0]->OutputCount()); | 486 ASSERT_EQ(1U, s[0]->OutputCount()); |
487 } | 487 } |
488 | 488 |
489 | 489 |
490 TEST_P(InstructionSelectorAddSubTest, ExtendHalfword) { | 490 TEST_P(InstructionSelectorAddSubTest, UnsignedExtendHalfword) { |
491 const AddSub dpi = GetParam(); | 491 const AddSub dpi = GetParam(); |
492 const MachineType type = dpi.mi.machine_type; | 492 const MachineType type = dpi.mi.machine_type; |
493 StreamBuilder m(this, type, type, type); | 493 StreamBuilder m(this, type, type, type); |
494 m.Return((m.*dpi.mi.constructor)( | 494 m.Return((m.*dpi.mi.constructor)( |
495 m.Parameter(0), m.Word32And(m.Parameter(1), m.Int32Constant(0xffff)))); | 495 m.Parameter(0), m.Word32And(m.Parameter(1), m.Int32Constant(0xffff)))); |
496 Stream s = m.Build(); | 496 Stream s = m.Build(); |
497 ASSERT_EQ(1U, s.size()); | 497 ASSERT_EQ(1U, s.size()); |
498 EXPECT_EQ(dpi.mi.arch_opcode, s[0]->arch_opcode()); | 498 EXPECT_EQ(dpi.mi.arch_opcode, s[0]->arch_opcode()); |
499 EXPECT_EQ(kMode_Operand2_R_UXTH, s[0]->addressing_mode()); | 499 EXPECT_EQ(kMode_Operand2_R_UXTH, s[0]->addressing_mode()); |
500 ASSERT_EQ(2U, s[0]->InputCount()); | 500 ASSERT_EQ(2U, s[0]->InputCount()); |
501 ASSERT_EQ(1U, s[0]->OutputCount()); | 501 ASSERT_EQ(1U, s[0]->OutputCount()); |
502 } | 502 } |
503 | 503 |
504 | 504 |
| 505 TEST_P(InstructionSelectorAddSubTest, SignedExtendByte) { |
| 506 const AddSub dpi = GetParam(); |
| 507 const MachineType type = dpi.mi.machine_type; |
| 508 StreamBuilder m(this, type, type, type); |
| 509 m.Return((m.*dpi.mi.constructor)( |
| 510 m.Parameter(0), |
| 511 m.Word32Sar(m.Word32Shl(m.Parameter(1), m.Int32Constant(24)), |
| 512 m.Int32Constant(24)))); |
| 513 Stream s = m.Build(); |
| 514 ASSERT_EQ(1U, s.size()); |
| 515 EXPECT_EQ(dpi.mi.arch_opcode, s[0]->arch_opcode()); |
| 516 EXPECT_EQ(kMode_Operand2_R_SXTB, s[0]->addressing_mode()); |
| 517 ASSERT_EQ(2U, s[0]->InputCount()); |
| 518 ASSERT_EQ(1U, s[0]->OutputCount()); |
| 519 } |
| 520 |
| 521 |
| 522 TEST_P(InstructionSelectorAddSubTest, SignedExtendHalfword) { |
| 523 const AddSub dpi = GetParam(); |
| 524 const MachineType type = dpi.mi.machine_type; |
| 525 StreamBuilder m(this, type, type, type); |
| 526 m.Return((m.*dpi.mi.constructor)( |
| 527 m.Parameter(0), |
| 528 m.Word32Sar(m.Word32Shl(m.Parameter(1), m.Int32Constant(16)), |
| 529 m.Int32Constant(16)))); |
| 530 Stream s = m.Build(); |
| 531 ASSERT_EQ(1U, s.size()); |
| 532 EXPECT_EQ(dpi.mi.arch_opcode, s[0]->arch_opcode()); |
| 533 EXPECT_EQ(kMode_Operand2_R_SXTH, s[0]->addressing_mode()); |
| 534 ASSERT_EQ(2U, s[0]->InputCount()); |
| 535 ASSERT_EQ(1U, s[0]->OutputCount()); |
| 536 } |
| 537 |
| 538 |
505 INSTANTIATE_TEST_CASE_P(InstructionSelectorTest, InstructionSelectorAddSubTest, | 539 INSTANTIATE_TEST_CASE_P(InstructionSelectorTest, InstructionSelectorAddSubTest, |
506 ::testing::ValuesIn(kAddSubInstructions)); | 540 ::testing::ValuesIn(kAddSubInstructions)); |
507 | 541 |
508 | 542 |
509 TEST_F(InstructionSelectorTest, AddImmediateOnLeft) { | 543 TEST_F(InstructionSelectorTest, AddImmediateOnLeft) { |
510 { | 544 { |
511 // 32-bit add. | 545 // 32-bit add. |
512 TRACED_FOREACH(int32_t, imm, kAddSubImmediates) { | 546 TRACED_FOREACH(int32_t, imm, kAddSubImmediates) { |
513 StreamBuilder m(this, kMachInt32, kMachInt32); | 547 StreamBuilder m(this, kMachInt32, kMachInt32); |
514 m.Return(m.Int32Add(m.Int32Constant(imm), m.Parameter(0))); | 548 m.Return(m.Int32Add(m.Int32Constant(imm), m.Parameter(0))); |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
639 EXPECT_EQ(kArm64Add, s[0]->arch_opcode()); | 673 EXPECT_EQ(kArm64Add, s[0]->arch_opcode()); |
640 EXPECT_EQ(shift.mode, s[0]->addressing_mode()); | 674 EXPECT_EQ(shift.mode, s[0]->addressing_mode()); |
641 EXPECT_EQ(3U, s[0]->InputCount()); | 675 EXPECT_EQ(3U, s[0]->InputCount()); |
642 EXPECT_EQ(imm, s.ToInt64(s[0]->InputAt(2))); | 676 EXPECT_EQ(imm, s.ToInt64(s[0]->InputAt(2))); |
643 EXPECT_EQ(1U, s[0]->OutputCount()); | 677 EXPECT_EQ(1U, s[0]->OutputCount()); |
644 } | 678 } |
645 } | 679 } |
646 } | 680 } |
647 | 681 |
648 | 682 |
649 TEST_F(InstructionSelectorTest, AddExtendByteOnLeft) { | 683 TEST_F(InstructionSelectorTest, AddUnsignedExtendByteOnLeft) { |
650 { | 684 { |
651 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); | 685 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); |
652 m.Return(m.Int32Add(m.Word32And(m.Parameter(0), m.Int32Constant(0xff)), | 686 m.Return(m.Int32Add(m.Word32And(m.Parameter(0), m.Int32Constant(0xff)), |
653 m.Parameter(1))); | 687 m.Parameter(1))); |
654 Stream s = m.Build(); | 688 Stream s = m.Build(); |
655 ASSERT_EQ(1U, s.size()); | 689 ASSERT_EQ(1U, s.size()); |
656 EXPECT_EQ(kArm64Add32, s[0]->arch_opcode()); | 690 EXPECT_EQ(kArm64Add32, s[0]->arch_opcode()); |
657 EXPECT_EQ(kMode_Operand2_R_UXTB, s[0]->addressing_mode()); | 691 EXPECT_EQ(kMode_Operand2_R_UXTB, s[0]->addressing_mode()); |
658 ASSERT_EQ(2U, s[0]->InputCount()); | 692 ASSERT_EQ(2U, s[0]->InputCount()); |
659 ASSERT_EQ(1U, s[0]->OutputCount()); | 693 ASSERT_EQ(1U, s[0]->OutputCount()); |
660 } | 694 } |
661 { | 695 { |
662 StreamBuilder m(this, kMachInt64, kMachInt32, kMachInt64); | 696 StreamBuilder m(this, kMachInt64, kMachInt32, kMachInt64); |
663 m.Return(m.Int64Add(m.Word32And(m.Parameter(0), m.Int32Constant(0xff)), | 697 m.Return(m.Int64Add(m.Word32And(m.Parameter(0), m.Int32Constant(0xff)), |
664 m.Parameter(1))); | 698 m.Parameter(1))); |
665 Stream s = m.Build(); | 699 Stream s = m.Build(); |
666 ASSERT_EQ(1U, s.size()); | 700 ASSERT_EQ(1U, s.size()); |
667 EXPECT_EQ(kArm64Add, s[0]->arch_opcode()); | 701 EXPECT_EQ(kArm64Add, s[0]->arch_opcode()); |
668 EXPECT_EQ(kMode_Operand2_R_UXTB, s[0]->addressing_mode()); | 702 EXPECT_EQ(kMode_Operand2_R_UXTB, s[0]->addressing_mode()); |
669 ASSERT_EQ(2U, s[0]->InputCount()); | 703 ASSERT_EQ(2U, s[0]->InputCount()); |
670 ASSERT_EQ(1U, s[0]->OutputCount()); | 704 ASSERT_EQ(1U, s[0]->OutputCount()); |
671 } | 705 } |
672 } | 706 } |
673 | 707 |
674 | 708 |
675 TEST_F(InstructionSelectorTest, AddExtendHalfwordOnLeft) { | 709 TEST_F(InstructionSelectorTest, AddUnsignedExtendHalfwordOnLeft) { |
676 { | 710 { |
677 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); | 711 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); |
678 m.Return(m.Int32Add(m.Word32And(m.Parameter(0), m.Int32Constant(0xffff)), | 712 m.Return(m.Int32Add(m.Word32And(m.Parameter(0), m.Int32Constant(0xffff)), |
679 m.Parameter(1))); | 713 m.Parameter(1))); |
680 Stream s = m.Build(); | 714 Stream s = m.Build(); |
681 ASSERT_EQ(1U, s.size()); | 715 ASSERT_EQ(1U, s.size()); |
682 EXPECT_EQ(kArm64Add32, s[0]->arch_opcode()); | 716 EXPECT_EQ(kArm64Add32, s[0]->arch_opcode()); |
683 EXPECT_EQ(kMode_Operand2_R_UXTH, s[0]->addressing_mode()); | 717 EXPECT_EQ(kMode_Operand2_R_UXTH, s[0]->addressing_mode()); |
684 ASSERT_EQ(2U, s[0]->InputCount()); | 718 ASSERT_EQ(2U, s[0]->InputCount()); |
685 ASSERT_EQ(1U, s[0]->OutputCount()); | 719 ASSERT_EQ(1U, s[0]->OutputCount()); |
686 } | 720 } |
687 { | 721 { |
688 StreamBuilder m(this, kMachInt64, kMachInt32, kMachInt64); | 722 StreamBuilder m(this, kMachInt64, kMachInt32, kMachInt64); |
689 m.Return(m.Int64Add(m.Word32And(m.Parameter(0), m.Int32Constant(0xffff)), | 723 m.Return(m.Int64Add(m.Word32And(m.Parameter(0), m.Int32Constant(0xffff)), |
690 m.Parameter(1))); | 724 m.Parameter(1))); |
691 Stream s = m.Build(); | 725 Stream s = m.Build(); |
692 ASSERT_EQ(1U, s.size()); | 726 ASSERT_EQ(1U, s.size()); |
693 EXPECT_EQ(kArm64Add, s[0]->arch_opcode()); | 727 EXPECT_EQ(kArm64Add, s[0]->arch_opcode()); |
694 EXPECT_EQ(kMode_Operand2_R_UXTH, s[0]->addressing_mode()); | 728 EXPECT_EQ(kMode_Operand2_R_UXTH, s[0]->addressing_mode()); |
695 ASSERT_EQ(2U, s[0]->InputCount()); | 729 ASSERT_EQ(2U, s[0]->InputCount()); |
696 ASSERT_EQ(1U, s[0]->OutputCount()); | 730 ASSERT_EQ(1U, s[0]->OutputCount()); |
697 } | 731 } |
698 } | 732 } |
699 | 733 |
700 | 734 |
| 735 TEST_F(InstructionSelectorTest, AddSignedExtendByteOnLeft) { |
| 736 { |
| 737 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); |
| 738 m.Return( |
| 739 m.Int32Add(m.Word32Sar(m.Word32Shl(m.Parameter(0), m.Int32Constant(24)), |
| 740 m.Int32Constant(24)), |
| 741 m.Parameter(1))); |
| 742 Stream s = m.Build(); |
| 743 ASSERT_EQ(1U, s.size()); |
| 744 EXPECT_EQ(kArm64Add32, s[0]->arch_opcode()); |
| 745 EXPECT_EQ(kMode_Operand2_R_SXTB, s[0]->addressing_mode()); |
| 746 ASSERT_EQ(2U, s[0]->InputCount()); |
| 747 ASSERT_EQ(1U, s[0]->OutputCount()); |
| 748 } |
| 749 { |
| 750 StreamBuilder m(this, kMachInt64, kMachInt32, kMachInt64); |
| 751 m.Return( |
| 752 m.Int64Add(m.Word32Sar(m.Word32Shl(m.Parameter(0), m.Int32Constant(24)), |
| 753 m.Int32Constant(24)), |
| 754 m.Parameter(1))); |
| 755 Stream s = m.Build(); |
| 756 ASSERT_EQ(1U, s.size()); |
| 757 EXPECT_EQ(kArm64Add, s[0]->arch_opcode()); |
| 758 EXPECT_EQ(kMode_Operand2_R_SXTB, s[0]->addressing_mode()); |
| 759 ASSERT_EQ(2U, s[0]->InputCount()); |
| 760 ASSERT_EQ(1U, s[0]->OutputCount()); |
| 761 } |
| 762 } |
| 763 |
| 764 |
| 765 TEST_F(InstructionSelectorTest, AddSignedExtendHalfwordOnLeft) { |
| 766 { |
| 767 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); |
| 768 m.Return( |
| 769 m.Int32Add(m.Word32Sar(m.Word32Shl(m.Parameter(0), m.Int32Constant(16)), |
| 770 m.Int32Constant(16)), |
| 771 m.Parameter(1))); |
| 772 Stream s = m.Build(); |
| 773 ASSERT_EQ(1U, s.size()); |
| 774 EXPECT_EQ(kArm64Add32, s[0]->arch_opcode()); |
| 775 EXPECT_EQ(kMode_Operand2_R_SXTH, s[0]->addressing_mode()); |
| 776 ASSERT_EQ(2U, s[0]->InputCount()); |
| 777 ASSERT_EQ(1U, s[0]->OutputCount()); |
| 778 } |
| 779 { |
| 780 StreamBuilder m(this, kMachInt64, kMachInt32, kMachInt64); |
| 781 m.Return( |
| 782 m.Int64Add(m.Word32Sar(m.Word32Shl(m.Parameter(0), m.Int32Constant(16)), |
| 783 m.Int32Constant(16)), |
| 784 m.Parameter(1))); |
| 785 Stream s = m.Build(); |
| 786 ASSERT_EQ(1U, s.size()); |
| 787 EXPECT_EQ(kArm64Add, s[0]->arch_opcode()); |
| 788 EXPECT_EQ(kMode_Operand2_R_SXTH, s[0]->addressing_mode()); |
| 789 ASSERT_EQ(2U, s[0]->InputCount()); |
| 790 ASSERT_EQ(1U, s[0]->OutputCount()); |
| 791 } |
| 792 } |
| 793 |
| 794 |
701 // ----------------------------------------------------------------------------- | 795 // ----------------------------------------------------------------------------- |
702 // Data processing controlled branches. | 796 // Data processing controlled branches. |
703 | 797 |
704 | 798 |
705 typedef InstructionSelectorTestWithParam<MachInst2> | 799 typedef InstructionSelectorTestWithParam<MachInst2> |
706 InstructionSelectorDPFlagSetTest; | 800 InstructionSelectorDPFlagSetTest; |
707 | 801 |
708 | 802 |
709 TEST_P(InstructionSelectorDPFlagSetTest, BranchWithParameters) { | 803 TEST_P(InstructionSelectorDPFlagSetTest, BranchWithParameters) { |
710 const MachInst2 dpi = GetParam(); | 804 const MachInst2 dpi = GetParam(); |
(...skipping 1617 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2328 EXPECT_EQ(kArm64Float64Neg, s[0]->arch_opcode()); | 2422 EXPECT_EQ(kArm64Float64Neg, s[0]->arch_opcode()); |
2329 ASSERT_EQ(1U, s[0]->InputCount()); | 2423 ASSERT_EQ(1U, s[0]->InputCount()); |
2330 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(0))); | 2424 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(0))); |
2331 ASSERT_EQ(1U, s[0]->OutputCount()); | 2425 ASSERT_EQ(1U, s[0]->OutputCount()); |
2332 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output())); | 2426 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output())); |
2333 } | 2427 } |
2334 | 2428 |
2335 } // namespace compiler | 2429 } // namespace compiler |
2336 } // namespace internal | 2430 } // namespace internal |
2337 } // namespace v8 | 2431 } // namespace v8 |
OLD | NEW |