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 2585 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2596 EXPECT_EQ(kArm64Asr, s[1]->arch_opcode()); | 2596 EXPECT_EQ(kArm64Asr, s[1]->arch_opcode()); |
2597 ASSERT_EQ(2U, s[1]->InputCount()); | 2597 ASSERT_EQ(2U, s[1]->InputCount()); |
2598 EXPECT_EQ(s.ToVreg(s[0]->Output()), s.ToVreg(s[1]->InputAt(0))); | 2598 EXPECT_EQ(s.ToVreg(s[0]->Output()), s.ToVreg(s[1]->InputAt(0))); |
2599 EXPECT_EQ((shift & 0x1f) + 32, s.ToInt64(s[1]->InputAt(1))); | 2599 EXPECT_EQ((shift & 0x1f) + 32, s.ToInt64(s[1]->InputAt(1))); |
2600 ASSERT_EQ(1U, s[1]->OutputCount()); | 2600 ASSERT_EQ(1U, s[1]->OutputCount()); |
2601 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[1]->Output())); | 2601 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[1]->Output())); |
2602 } | 2602 } |
2603 } | 2603 } |
2604 | 2604 |
2605 | 2605 |
| 2606 TEST_F(InstructionSelectorTest, Int32MulHighWithAdd) { |
| 2607 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); |
| 2608 Node* const p0 = m.Parameter(0); |
| 2609 Node* const p1 = m.Parameter(1); |
| 2610 Node* const a = m.Int32Add(m.Int32MulHigh(p0, p1), p0); |
| 2611 // Test only one shift constant here, as we're only interested in it being a |
| 2612 // 32-bit operation; the shift amount is irrelevant. |
| 2613 Node* const n = m.Word32Sar(a, m.Int32Constant(1)); |
| 2614 m.Return(n); |
| 2615 Stream s = m.Build(); |
| 2616 ASSERT_EQ(3U, s.size()); |
| 2617 EXPECT_EQ(kArm64Smull, s[0]->arch_opcode()); |
| 2618 ASSERT_EQ(2U, s[0]->InputCount()); |
| 2619 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(0))); |
| 2620 EXPECT_EQ(s.ToVreg(p1), s.ToVreg(s[0]->InputAt(1))); |
| 2621 ASSERT_EQ(1U, s[0]->OutputCount()); |
| 2622 EXPECT_EQ(kArm64Add, s[1]->arch_opcode()); |
| 2623 EXPECT_EQ(kMode_Operand2_R_ASR_I, s[1]->addressing_mode()); |
| 2624 ASSERT_EQ(3U, s[1]->InputCount()); |
| 2625 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[1]->InputAt(0))); |
| 2626 EXPECT_EQ(s.ToVreg(s[0]->Output()), s.ToVreg(s[1]->InputAt(1))); |
| 2627 EXPECT_EQ(32, s.ToInt64(s[1]->InputAt(2))); |
| 2628 ASSERT_EQ(1U, s[1]->OutputCount()); |
| 2629 EXPECT_EQ(kArm64Asr32, s[2]->arch_opcode()); |
| 2630 ASSERT_EQ(2U, s[2]->InputCount()); |
| 2631 EXPECT_EQ(s.ToVreg(s[1]->Output()), s.ToVreg(s[2]->InputAt(0))); |
| 2632 EXPECT_EQ(1, s.ToInt64(s[2]->InputAt(1))); |
| 2633 ASSERT_EQ(1U, s[2]->OutputCount()); |
| 2634 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[2]->Output())); |
| 2635 } |
| 2636 |
| 2637 |
2606 TEST_F(InstructionSelectorTest, Uint32MulHighWithShr) { | 2638 TEST_F(InstructionSelectorTest, Uint32MulHighWithShr) { |
2607 TRACED_FORRANGE(int32_t, shift, -32, 63) { | 2639 TRACED_FORRANGE(int32_t, shift, -32, 63) { |
2608 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); | 2640 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); |
2609 Node* const p0 = m.Parameter(0); | 2641 Node* const p0 = m.Parameter(0); |
2610 Node* const p1 = m.Parameter(1); | 2642 Node* const p1 = m.Parameter(1); |
2611 Node* const n = | 2643 Node* const n = |
2612 m.Word32Shr(m.Uint32MulHigh(p0, p1), m.Int32Constant(shift)); | 2644 m.Word32Shr(m.Uint32MulHigh(p0, p1), m.Int32Constant(shift)); |
2613 m.Return(n); | 2645 m.Return(n); |
2614 Stream s = m.Build(); | 2646 Stream s = m.Build(); |
2615 ASSERT_EQ(2U, s.size()); | 2647 ASSERT_EQ(2U, s.size()); |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2781 EXPECT_EQ(kArm64Float64Neg, s[0]->arch_opcode()); | 2813 EXPECT_EQ(kArm64Float64Neg, s[0]->arch_opcode()); |
2782 ASSERT_EQ(1U, s[0]->InputCount()); | 2814 ASSERT_EQ(1U, s[0]->InputCount()); |
2783 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(0))); | 2815 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(0))); |
2784 ASSERT_EQ(1U, s[0]->OutputCount()); | 2816 ASSERT_EQ(1U, s[0]->OutputCount()); |
2785 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output())); | 2817 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output())); |
2786 } | 2818 } |
2787 | 2819 |
2788 } // namespace compiler | 2820 } // namespace compiler |
2789 } // namespace internal | 2821 } // namespace internal |
2790 } // namespace v8 | 2822 } // namespace v8 |
OLD | NEW |