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 727 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
738 m.Int32Constant(0), | 738 m.Int32Constant(0), |
739 (m.*shift.mi.constructor)(m.Parameter(1), m.Int32Constant(imm)))); | 739 (m.*shift.mi.constructor)(m.Parameter(1), m.Int32Constant(imm)))); |
740 Stream s = m.Build(); | 740 Stream s = m.Build(); |
741 | 741 |
742 ASSERT_EQ(1U, s.size()); | 742 ASSERT_EQ(1U, s.size()); |
743 EXPECT_EQ(kArm64Sub32, s[0]->arch_opcode()); | 743 EXPECT_EQ(kArm64Sub32, s[0]->arch_opcode()); |
744 ASSERT_EQ(3U, s[0]->InputCount()); | 744 ASSERT_EQ(3U, s[0]->InputCount()); |
745 EXPECT_TRUE(s[0]->InputAt(0)->IsImmediate()); | 745 EXPECT_TRUE(s[0]->InputAt(0)->IsImmediate()); |
746 EXPECT_EQ(0, s.ToInt32(s[0]->InputAt(0))); | 746 EXPECT_EQ(0, s.ToInt32(s[0]->InputAt(0))); |
747 EXPECT_EQ(shift.mode, s[0]->addressing_mode()); | 747 EXPECT_EQ(shift.mode, s[0]->addressing_mode()); |
748 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2))); | 748 EXPECT_EQ(0x3f & imm, 0x3f & s.ToInt32(s[0]->InputAt(2))); |
749 EXPECT_EQ(1U, s[0]->OutputCount()); | 749 EXPECT_EQ(1U, s[0]->OutputCount()); |
750 } | 750 } |
751 } | 751 } |
752 { | 752 { |
753 // Test 64-bit operations. Ignore ROR shifts, as subtract does not | 753 // Test 64-bit operations. Ignore ROR shifts, as subtract does not |
754 // support them. | 754 // support them. |
755 if ((shift.mi.machine_type != MachineType::Int64()) || | 755 if ((shift.mi.machine_type != MachineType::Int64()) || |
756 (shift.mi.arch_opcode == kArm64Ror32) || | 756 (shift.mi.arch_opcode == kArm64Ror32) || |
757 (shift.mi.arch_opcode == kArm64Ror)) | 757 (shift.mi.arch_opcode == kArm64Ror)) |
758 continue; | 758 continue; |
759 | 759 |
760 TRACED_FORRANGE(int, imm, -32, 127) { | 760 TRACED_FORRANGE(int, imm, -32, 127) { |
761 StreamBuilder m(this, MachineType::Int64(), MachineType::Int64(), | 761 StreamBuilder m(this, MachineType::Int64(), MachineType::Int64(), |
762 MachineType::Int64()); | 762 MachineType::Int64()); |
763 m.Return(m.Int64Sub( | 763 m.Return(m.Int64Sub( |
764 m.Int64Constant(0), | 764 m.Int64Constant(0), |
765 (m.*shift.mi.constructor)(m.Parameter(1), m.Int64Constant(imm)))); | 765 (m.*shift.mi.constructor)(m.Parameter(1), m.Int64Constant(imm)))); |
766 Stream s = m.Build(); | 766 Stream s = m.Build(); |
767 | 767 |
768 ASSERT_EQ(1U, s.size()); | 768 ASSERT_EQ(1U, s.size()); |
769 EXPECT_EQ(kArm64Sub, s[0]->arch_opcode()); | 769 EXPECT_EQ(kArm64Sub, s[0]->arch_opcode()); |
770 ASSERT_EQ(3U, s[0]->InputCount()); | 770 ASSERT_EQ(3U, s[0]->InputCount()); |
771 EXPECT_TRUE(s[0]->InputAt(0)->IsImmediate()); | 771 EXPECT_TRUE(s[0]->InputAt(0)->IsImmediate()); |
772 EXPECT_EQ(0, s.ToInt32(s[0]->InputAt(0))); | 772 EXPECT_EQ(0, s.ToInt32(s[0]->InputAt(0))); |
773 EXPECT_EQ(shift.mode, s[0]->addressing_mode()); | 773 EXPECT_EQ(shift.mode, s[0]->addressing_mode()); |
774 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2))); | 774 EXPECT_EQ(0x3f & imm, 0x3f & s.ToInt32(s[0]->InputAt(2))); |
775 EXPECT_EQ(1U, s[0]->OutputCount()); | 775 EXPECT_EQ(1U, s[0]->OutputCount()); |
776 } | 776 } |
777 } | 777 } |
778 } | 778 } |
779 } | 779 } |
780 | 780 |
781 | 781 |
782 TEST_F(InstructionSelectorTest, AddNegImmediateOnLeft) { | 782 TEST_F(InstructionSelectorTest, AddNegImmediateOnLeft) { |
783 { | 783 { |
784 // 32-bit add. | 784 // 32-bit add. |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
828 StreamBuilder m(this, MachineType::Int32(), MachineType::Int32(), | 828 StreamBuilder m(this, MachineType::Int32(), MachineType::Int32(), |
829 MachineType::Int32()); | 829 MachineType::Int32()); |
830 m.Return((m.Int32Add)( | 830 m.Return((m.Int32Add)( |
831 (m.*shift.mi.constructor)(m.Parameter(1), m.Int32Constant(imm)), | 831 (m.*shift.mi.constructor)(m.Parameter(1), m.Int32Constant(imm)), |
832 m.Parameter(0))); | 832 m.Parameter(0))); |
833 Stream s = m.Build(); | 833 Stream s = m.Build(); |
834 ASSERT_EQ(1U, s.size()); | 834 ASSERT_EQ(1U, s.size()); |
835 EXPECT_EQ(kArm64Add32, s[0]->arch_opcode()); | 835 EXPECT_EQ(kArm64Add32, s[0]->arch_opcode()); |
836 EXPECT_EQ(shift.mode, s[0]->addressing_mode()); | 836 EXPECT_EQ(shift.mode, s[0]->addressing_mode()); |
837 EXPECT_EQ(3U, s[0]->InputCount()); | 837 EXPECT_EQ(3U, s[0]->InputCount()); |
838 EXPECT_EQ(imm, s.ToInt64(s[0]->InputAt(2))); | 838 EXPECT_EQ(0x3f & imm, 0x3f & s.ToInt64(s[0]->InputAt(2))); |
839 EXPECT_EQ(1U, s[0]->OutputCount()); | 839 EXPECT_EQ(1U, s[0]->OutputCount()); |
840 } | 840 } |
841 } | 841 } |
842 | 842 |
843 // 64-bit add. | 843 // 64-bit add. |
844 TRACED_FOREACH(Shift, shift, kShiftInstructions) { | 844 TRACED_FOREACH(Shift, shift, kShiftInstructions) { |
845 // Only test relevant shifted operands. | 845 // Only test relevant shifted operands. |
846 if (shift.mi.machine_type != MachineType::Int64()) continue; | 846 if (shift.mi.machine_type != MachineType::Int64()) continue; |
847 if (shift.mi.arch_opcode == kArm64Ror) continue; | 847 if (shift.mi.arch_opcode == kArm64Ror) continue; |
848 | 848 |
849 // The available shift operand range is `0 <= imm < 64`, but we also test | 849 // The available shift operand range is `0 <= imm < 64`, but we also test |
850 // that immediates outside this range are handled properly (modulo-64). | 850 // that immediates outside this range are handled properly (modulo-64). |
851 TRACED_FORRANGE(int, imm, -64, 127) { | 851 TRACED_FORRANGE(int, imm, -64, 127) { |
852 StreamBuilder m(this, MachineType::Int64(), MachineType::Int64(), | 852 StreamBuilder m(this, MachineType::Int64(), MachineType::Int64(), |
853 MachineType::Int64()); | 853 MachineType::Int64()); |
854 m.Return((m.Int64Add)( | 854 m.Return((m.Int64Add)( |
855 (m.*shift.mi.constructor)(m.Parameter(1), m.Int64Constant(imm)), | 855 (m.*shift.mi.constructor)(m.Parameter(1), m.Int64Constant(imm)), |
856 m.Parameter(0))); | 856 m.Parameter(0))); |
857 Stream s = m.Build(); | 857 Stream s = m.Build(); |
858 ASSERT_EQ(1U, s.size()); | 858 ASSERT_EQ(1U, s.size()); |
859 EXPECT_EQ(kArm64Add, s[0]->arch_opcode()); | 859 EXPECT_EQ(kArm64Add, s[0]->arch_opcode()); |
860 EXPECT_EQ(shift.mode, s[0]->addressing_mode()); | 860 EXPECT_EQ(shift.mode, s[0]->addressing_mode()); |
861 EXPECT_EQ(3U, s[0]->InputCount()); | 861 EXPECT_EQ(3U, s[0]->InputCount()); |
862 EXPECT_EQ(imm, s.ToInt64(s[0]->InputAt(2))); | 862 EXPECT_EQ(0x3f & imm, 0x3f & s.ToInt64(s[0]->InputAt(2))); |
863 EXPECT_EQ(1U, s[0]->OutputCount()); | 863 EXPECT_EQ(1U, s[0]->OutputCount()); |
864 } | 864 } |
865 } | 865 } |
866 } | 866 } |
867 | 867 |
868 | 868 |
869 TEST_F(InstructionSelectorTest, AddUnsignedExtendByteOnLeft) { | 869 TEST_F(InstructionSelectorTest, AddUnsignedExtendByteOnLeft) { |
870 { | 870 { |
871 StreamBuilder m(this, MachineType::Int32(), MachineType::Int32(), | 871 StreamBuilder m(this, MachineType::Int32(), MachineType::Int32(), |
872 MachineType::Int32()); | 872 MachineType::Int32()); |
(...skipping 2044 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2917 Node* const p1 = m.Parameter(1); | 2917 Node* const p1 = m.Parameter(1); |
2918 Node* r = (m.*shift.mi.constructor)(p1, m.Int32Constant(imm)); | 2918 Node* r = (m.*shift.mi.constructor)(p1, m.Int32Constant(imm)); |
2919 m.Return(m.Word32Equal(p0, r)); | 2919 m.Return(m.Word32Equal(p0, r)); |
2920 Stream s = m.Build(); | 2920 Stream s = m.Build(); |
2921 ASSERT_EQ(1U, s.size()); | 2921 ASSERT_EQ(1U, s.size()); |
2922 EXPECT_EQ(kArm64Cmp32, s[0]->arch_opcode()); | 2922 EXPECT_EQ(kArm64Cmp32, s[0]->arch_opcode()); |
2923 EXPECT_EQ(shift.mode, s[0]->addressing_mode()); | 2923 EXPECT_EQ(shift.mode, s[0]->addressing_mode()); |
2924 ASSERT_EQ(3U, s[0]->InputCount()); | 2924 ASSERT_EQ(3U, s[0]->InputCount()); |
2925 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(0))); | 2925 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(0))); |
2926 EXPECT_EQ(s.ToVreg(p1), s.ToVreg(s[0]->InputAt(1))); | 2926 EXPECT_EQ(s.ToVreg(p1), s.ToVreg(s[0]->InputAt(1))); |
2927 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2))); | 2927 EXPECT_EQ(0x3f & imm, 0x3f & s.ToInt32(s[0]->InputAt(2))); |
2928 ASSERT_EQ(1U, s[0]->OutputCount()); | 2928 ASSERT_EQ(1U, s[0]->OutputCount()); |
2929 } | 2929 } |
2930 TRACED_FORRANGE(int32_t, imm, -32, 63) { | 2930 TRACED_FORRANGE(int32_t, imm, -32, 63) { |
2931 StreamBuilder m(this, MachineType::Int32(), MachineType::Int32(), | 2931 StreamBuilder m(this, MachineType::Int32(), MachineType::Int32(), |
2932 MachineType::Int32()); | 2932 MachineType::Int32()); |
2933 Node* const p0 = m.Parameter(0); | 2933 Node* const p0 = m.Parameter(0); |
2934 Node* const p1 = m.Parameter(1); | 2934 Node* const p1 = m.Parameter(1); |
2935 Node* r = (m.*shift.mi.constructor)(p1, m.Int32Constant(imm)); | 2935 Node* r = (m.*shift.mi.constructor)(p1, m.Int32Constant(imm)); |
2936 m.Return(m.Word32Equal(r, p0)); | 2936 m.Return(m.Word32Equal(r, p0)); |
2937 Stream s = m.Build(); | 2937 Stream s = m.Build(); |
2938 ASSERT_EQ(1U, s.size()); | 2938 ASSERT_EQ(1U, s.size()); |
2939 EXPECT_EQ(kArm64Cmp32, s[0]->arch_opcode()); | 2939 EXPECT_EQ(kArm64Cmp32, s[0]->arch_opcode()); |
2940 EXPECT_EQ(shift.mode, s[0]->addressing_mode()); | 2940 EXPECT_EQ(shift.mode, s[0]->addressing_mode()); |
2941 ASSERT_EQ(3U, s[0]->InputCount()); | 2941 ASSERT_EQ(3U, s[0]->InputCount()); |
2942 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(0))); | 2942 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(0))); |
2943 EXPECT_EQ(s.ToVreg(p1), s.ToVreg(s[0]->InputAt(1))); | 2943 EXPECT_EQ(s.ToVreg(p1), s.ToVreg(s[0]->InputAt(1))); |
2944 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2))); | 2944 EXPECT_EQ(0x3f & imm, 0x3f & s.ToInt32(s[0]->InputAt(2))); |
2945 ASSERT_EQ(1U, s[0]->OutputCount()); | 2945 ASSERT_EQ(1U, s[0]->OutputCount()); |
2946 } | 2946 } |
2947 } | 2947 } |
2948 } | 2948 } |
2949 | 2949 |
2950 | 2950 |
2951 TEST_F(InstructionSelectorTest, Word32EqualWithUnsignedExtendByte) { | 2951 TEST_F(InstructionSelectorTest, Word32EqualWithUnsignedExtendByte) { |
2952 { | 2952 { |
2953 StreamBuilder m(this, MachineType::Int32(), MachineType::Int32(), | 2953 StreamBuilder m(this, MachineType::Int32(), MachineType::Int32(), |
2954 MachineType::Int32()); | 2954 MachineType::Int32()); |
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3196 Node* const p0 = m.Parameter(0); | 3196 Node* const p0 = m.Parameter(0); |
3197 Node* const p1 = m.Parameter(1); | 3197 Node* const p1 = m.Parameter(1); |
3198 Node* r = (m.*shift.mi.constructor)(p1, m.Int32Constant(imm)); | 3198 Node* r = (m.*shift.mi.constructor)(p1, m.Int32Constant(imm)); |
3199 m.Return( | 3199 m.Return( |
3200 (m.*cmp.mi.constructor)(p0, m.Int32Sub(m.Int32Constant(0), r))); | 3200 (m.*cmp.mi.constructor)(p0, m.Int32Sub(m.Int32Constant(0), r))); |
3201 Stream s = m.Build(); | 3201 Stream s = m.Build(); |
3202 ASSERT_EQ(1U, s.size()); | 3202 ASSERT_EQ(1U, s.size()); |
3203 EXPECT_EQ(kArm64Cmn32, s[0]->arch_opcode()); | 3203 EXPECT_EQ(kArm64Cmn32, s[0]->arch_opcode()); |
3204 EXPECT_EQ(3U, s[0]->InputCount()); | 3204 EXPECT_EQ(3U, s[0]->InputCount()); |
3205 EXPECT_EQ(shift.mode, s[0]->addressing_mode()); | 3205 EXPECT_EQ(shift.mode, s[0]->addressing_mode()); |
3206 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2))); | 3206 EXPECT_EQ(0x3f & imm, 0x3f & s.ToInt32(s[0]->InputAt(2))); |
3207 EXPECT_EQ(1U, s[0]->OutputCount()); | 3207 EXPECT_EQ(1U, s[0]->OutputCount()); |
3208 EXPECT_EQ(kFlags_set, s[0]->flags_mode()); | 3208 EXPECT_EQ(kFlags_set, s[0]->flags_mode()); |
3209 EXPECT_EQ(cmp.cond, s[0]->flags_condition()); | 3209 EXPECT_EQ(cmp.cond, s[0]->flags_condition()); |
3210 } | 3210 } |
3211 } | 3211 } |
3212 } | 3212 } |
3213 } | 3213 } |
3214 | 3214 |
3215 TEST_F(InstructionSelectorTest, CmpWithImmediateOnLeft) { | 3215 TEST_F(InstructionSelectorTest, CmpWithImmediateOnLeft) { |
3216 TRACED_FOREACH(IntegerCmp, cmp, kIntegerCmpInstructions) { | 3216 TRACED_FOREACH(IntegerCmp, cmp, kIntegerCmpInstructions) { |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3304 Stream s = m.Build(); | 3304 Stream s = m.Build(); |
3305 // Cmp does not support ROR shifts. | 3305 // Cmp does not support ROR shifts. |
3306 if (shift.mi.arch_opcode == kArm64Ror32) { | 3306 if (shift.mi.arch_opcode == kArm64Ror32) { |
3307 ASSERT_EQ(2U, s.size()); | 3307 ASSERT_EQ(2U, s.size()); |
3308 continue; | 3308 continue; |
3309 } | 3309 } |
3310 ASSERT_EQ(1U, s.size()); | 3310 ASSERT_EQ(1U, s.size()); |
3311 EXPECT_EQ(kArm64Cmp32, s[0]->arch_opcode()); | 3311 EXPECT_EQ(kArm64Cmp32, s[0]->arch_opcode()); |
3312 EXPECT_EQ(shift.mode, s[0]->addressing_mode()); | 3312 EXPECT_EQ(shift.mode, s[0]->addressing_mode()); |
3313 EXPECT_EQ(3U, s[0]->InputCount()); | 3313 EXPECT_EQ(3U, s[0]->InputCount()); |
3314 EXPECT_EQ(imm, s.ToInt64(s[0]->InputAt(2))); | 3314 EXPECT_EQ(0x3f & imm, 0x3f & s.ToInt64(s[0]->InputAt(2))); |
3315 EXPECT_EQ(1U, s[0]->OutputCount()); | 3315 EXPECT_EQ(1U, s[0]->OutputCount()); |
3316 EXPECT_EQ(kFlags_set, s[0]->flags_mode()); | 3316 EXPECT_EQ(kFlags_set, s[0]->flags_mode()); |
3317 EXPECT_EQ(cmp.commuted_cond, s[0]->flags_condition()); | 3317 EXPECT_EQ(cmp.commuted_cond, s[0]->flags_condition()); |
3318 } | 3318 } |
3319 } | 3319 } |
3320 } | 3320 } |
3321 } | 3321 } |
3322 | 3322 |
3323 TEST_F(InstructionSelectorTest, CmnShiftByImmediateOnLeft) { | 3323 TEST_F(InstructionSelectorTest, CmnShiftByImmediateOnLeft) { |
3324 TRACED_FOREACH(IntegerCmp, cmp, kIntegerCmpEqualityInstructions) { | 3324 TRACED_FOREACH(IntegerCmp, cmp, kIntegerCmpEqualityInstructions) { |
(...skipping 13 matching lines...) Expand all Loading... |
3338 Stream s = m.Build(); | 3338 Stream s = m.Build(); |
3339 // Cmn does not support ROR shifts. | 3339 // Cmn does not support ROR shifts. |
3340 if (shift.mi.arch_opcode == kArm64Ror32) { | 3340 if (shift.mi.arch_opcode == kArm64Ror32) { |
3341 ASSERT_EQ(2U, s.size()); | 3341 ASSERT_EQ(2U, s.size()); |
3342 continue; | 3342 continue; |
3343 } | 3343 } |
3344 ASSERT_EQ(1U, s.size()); | 3344 ASSERT_EQ(1U, s.size()); |
3345 EXPECT_EQ(kArm64Cmn32, s[0]->arch_opcode()); | 3345 EXPECT_EQ(kArm64Cmn32, s[0]->arch_opcode()); |
3346 EXPECT_EQ(shift.mode, s[0]->addressing_mode()); | 3346 EXPECT_EQ(shift.mode, s[0]->addressing_mode()); |
3347 EXPECT_EQ(3U, s[0]->InputCount()); | 3347 EXPECT_EQ(3U, s[0]->InputCount()); |
3348 EXPECT_EQ(imm, s.ToInt64(s[0]->InputAt(2))); | 3348 EXPECT_EQ(0x3f & imm, 0x3f & s.ToInt64(s[0]->InputAt(2))); |
3349 EXPECT_EQ(1U, s[0]->OutputCount()); | 3349 EXPECT_EQ(1U, s[0]->OutputCount()); |
3350 EXPECT_EQ(kFlags_set, s[0]->flags_mode()); | 3350 EXPECT_EQ(kFlags_set, s[0]->flags_mode()); |
3351 EXPECT_EQ(cmp.cond, s[0]->flags_condition()); | 3351 EXPECT_EQ(cmp.cond, s[0]->flags_condition()); |
3352 } | 3352 } |
3353 } | 3353 } |
3354 } | 3354 } |
3355 } | 3355 } |
3356 | 3356 |
3357 // ----------------------------------------------------------------------------- | 3357 // ----------------------------------------------------------------------------- |
3358 // Flag-setting add and and instructions. | 3358 // Flag-setting add and and instructions. |
(...skipping 1016 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4375 EXPECT_EQ(kArm64TestAndBranch, s[1]->arch_opcode()); | 4375 EXPECT_EQ(kArm64TestAndBranch, s[1]->arch_opcode()); |
4376 EXPECT_EQ(kEqual, s[1]->flags_condition()); | 4376 EXPECT_EQ(kEqual, s[1]->flags_condition()); |
4377 EXPECT_EQ(4U, s[1]->InputCount()); | 4377 EXPECT_EQ(4U, s[1]->InputCount()); |
4378 EXPECT_EQ(InstructionOperand::IMMEDIATE, s[1]->InputAt(1)->kind()); | 4378 EXPECT_EQ(InstructionOperand::IMMEDIATE, s[1]->InputAt(1)->kind()); |
4379 EXPECT_EQ(63, s.ToInt32(s[1]->InputAt(1))); | 4379 EXPECT_EQ(63, s.ToInt32(s[1]->InputAt(1))); |
4380 } | 4380 } |
4381 | 4381 |
4382 } // namespace compiler | 4382 } // namespace compiler |
4383 } // namespace internal | 4383 } // namespace internal |
4384 } // namespace v8 | 4384 } // namespace v8 |
OLD | NEW |