| 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 1562 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1573   m.Return( | 1573   m.Return( | 
| 1574       m.Int32Sub(m.Parameter(0), m.Int32Mul(m.Parameter(1), m.Parameter(2)))); | 1574       m.Int32Sub(m.Parameter(0), m.Int32Mul(m.Parameter(1), m.Parameter(2)))); | 
| 1575   Stream s = m.Build(MLS); | 1575   Stream s = m.Build(MLS); | 
| 1576   ASSERT_EQ(1U, s.size()); | 1576   ASSERT_EQ(1U, s.size()); | 
| 1577   EXPECT_EQ(kArmMls, s[0]->arch_opcode()); | 1577   EXPECT_EQ(kArmMls, s[0]->arch_opcode()); | 
| 1578   EXPECT_EQ(1U, s[0]->OutputCount()); | 1578   EXPECT_EQ(1U, s[0]->OutputCount()); | 
| 1579   EXPECT_EQ(3U, s[0]->InputCount()); | 1579   EXPECT_EQ(3U, s[0]->InputCount()); | 
| 1580 } | 1580 } | 
| 1581 | 1581 | 
| 1582 | 1582 | 
| 1583 TEST_F(InstructionSelectorTest, Int32UDivWithParameters) { | 1583 TEST_F(InstructionSelectorTest, Uint32DivWithParameters) { | 
| 1584   StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); | 1584   StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); | 
| 1585   m.Return(m.Int32UDiv(m.Parameter(0), m.Parameter(1))); | 1585   m.Return(m.Uint32Div(m.Parameter(0), m.Parameter(1))); | 
| 1586   Stream s = m.Build(); | 1586   Stream s = m.Build(); | 
| 1587   ASSERT_EQ(4U, s.size()); | 1587   ASSERT_EQ(4U, s.size()); | 
| 1588   EXPECT_EQ(kArmVcvtF64U32, s[0]->arch_opcode()); | 1588   EXPECT_EQ(kArmVcvtF64U32, s[0]->arch_opcode()); | 
| 1589   ASSERT_EQ(1U, s[0]->OutputCount()); | 1589   ASSERT_EQ(1U, s[0]->OutputCount()); | 
| 1590   EXPECT_EQ(kArmVcvtF64U32, s[1]->arch_opcode()); | 1590   EXPECT_EQ(kArmVcvtF64U32, s[1]->arch_opcode()); | 
| 1591   ASSERT_EQ(1U, s[1]->OutputCount()); | 1591   ASSERT_EQ(1U, s[1]->OutputCount()); | 
| 1592   EXPECT_EQ(kArmVdivF64, s[2]->arch_opcode()); | 1592   EXPECT_EQ(kArmVdivF64, s[2]->arch_opcode()); | 
| 1593   ASSERT_EQ(2U, s[2]->InputCount()); | 1593   ASSERT_EQ(2U, s[2]->InputCount()); | 
| 1594   ASSERT_EQ(1U, s[2]->OutputCount()); | 1594   ASSERT_EQ(1U, s[2]->OutputCount()); | 
| 1595   EXPECT_EQ(s.ToVreg(s[0]->Output()), s.ToVreg(s[2]->InputAt(0))); | 1595   EXPECT_EQ(s.ToVreg(s[0]->Output()), s.ToVreg(s[2]->InputAt(0))); | 
| 1596   EXPECT_EQ(s.ToVreg(s[1]->Output()), s.ToVreg(s[2]->InputAt(1))); | 1596   EXPECT_EQ(s.ToVreg(s[1]->Output()), s.ToVreg(s[2]->InputAt(1))); | 
| 1597   EXPECT_EQ(kArmVcvtU32F64, s[3]->arch_opcode()); | 1597   EXPECT_EQ(kArmVcvtU32F64, s[3]->arch_opcode()); | 
| 1598   ASSERT_EQ(1U, s[3]->InputCount()); | 1598   ASSERT_EQ(1U, s[3]->InputCount()); | 
| 1599   EXPECT_EQ(s.ToVreg(s[2]->Output()), s.ToVreg(s[3]->InputAt(0))); | 1599   EXPECT_EQ(s.ToVreg(s[2]->Output()), s.ToVreg(s[3]->InputAt(0))); | 
| 1600 } | 1600 } | 
| 1601 | 1601 | 
| 1602 | 1602 | 
| 1603 TEST_F(InstructionSelectorTest, Int32UDivWithParametersForSUDIV) { | 1603 TEST_F(InstructionSelectorTest, Uint32DivWithParametersForSUDIV) { | 
| 1604   StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); | 1604   StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); | 
| 1605   m.Return(m.Int32UDiv(m.Parameter(0), m.Parameter(1))); | 1605   m.Return(m.Uint32Div(m.Parameter(0), m.Parameter(1))); | 
| 1606   Stream s = m.Build(SUDIV); | 1606   Stream s = m.Build(SUDIV); | 
| 1607   ASSERT_EQ(1U, s.size()); | 1607   ASSERT_EQ(1U, s.size()); | 
| 1608   EXPECT_EQ(kArmUdiv, s[0]->arch_opcode()); | 1608   EXPECT_EQ(kArmUdiv, s[0]->arch_opcode()); | 
| 1609 } | 1609 } | 
| 1610 | 1610 | 
| 1611 | 1611 | 
| 1612 TEST_F(InstructionSelectorTest, Int32UModWithParameters) { | 1612 TEST_F(InstructionSelectorTest, Uint32ModWithParameters) { | 
| 1613   StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); | 1613   StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); | 
| 1614   m.Return(m.Int32UMod(m.Parameter(0), m.Parameter(1))); | 1614   m.Return(m.Uint32Mod(m.Parameter(0), m.Parameter(1))); | 
| 1615   Stream s = m.Build(); | 1615   Stream s = m.Build(); | 
| 1616   ASSERT_EQ(6U, s.size()); | 1616   ASSERT_EQ(6U, s.size()); | 
| 1617   EXPECT_EQ(kArmVcvtF64U32, s[0]->arch_opcode()); | 1617   EXPECT_EQ(kArmVcvtF64U32, s[0]->arch_opcode()); | 
| 1618   ASSERT_EQ(1U, s[0]->OutputCount()); | 1618   ASSERT_EQ(1U, s[0]->OutputCount()); | 
| 1619   EXPECT_EQ(kArmVcvtF64U32, s[1]->arch_opcode()); | 1619   EXPECT_EQ(kArmVcvtF64U32, s[1]->arch_opcode()); | 
| 1620   ASSERT_EQ(1U, s[1]->OutputCount()); | 1620   ASSERT_EQ(1U, s[1]->OutputCount()); | 
| 1621   EXPECT_EQ(kArmVdivF64, s[2]->arch_opcode()); | 1621   EXPECT_EQ(kArmVdivF64, s[2]->arch_opcode()); | 
| 1622   ASSERT_EQ(2U, s[2]->InputCount()); | 1622   ASSERT_EQ(2U, s[2]->InputCount()); | 
| 1623   ASSERT_EQ(1U, s[2]->OutputCount()); | 1623   ASSERT_EQ(1U, s[2]->OutputCount()); | 
| 1624   EXPECT_EQ(s.ToVreg(s[0]->Output()), s.ToVreg(s[2]->InputAt(0))); | 1624   EXPECT_EQ(s.ToVreg(s[0]->Output()), s.ToVreg(s[2]->InputAt(0))); | 
| 1625   EXPECT_EQ(s.ToVreg(s[1]->Output()), s.ToVreg(s[2]->InputAt(1))); | 1625   EXPECT_EQ(s.ToVreg(s[1]->Output()), s.ToVreg(s[2]->InputAt(1))); | 
| 1626   EXPECT_EQ(kArmVcvtU32F64, s[3]->arch_opcode()); | 1626   EXPECT_EQ(kArmVcvtU32F64, s[3]->arch_opcode()); | 
| 1627   ASSERT_EQ(1U, s[3]->InputCount()); | 1627   ASSERT_EQ(1U, s[3]->InputCount()); | 
| 1628   EXPECT_EQ(s.ToVreg(s[2]->Output()), s.ToVreg(s[3]->InputAt(0))); | 1628   EXPECT_EQ(s.ToVreg(s[2]->Output()), s.ToVreg(s[3]->InputAt(0))); | 
| 1629   EXPECT_EQ(kArmMul, s[4]->arch_opcode()); | 1629   EXPECT_EQ(kArmMul, s[4]->arch_opcode()); | 
| 1630   ASSERT_EQ(1U, s[4]->OutputCount()); | 1630   ASSERT_EQ(1U, s[4]->OutputCount()); | 
| 1631   ASSERT_EQ(2U, s[4]->InputCount()); | 1631   ASSERT_EQ(2U, s[4]->InputCount()); | 
| 1632   EXPECT_EQ(s.ToVreg(s[3]->Output()), s.ToVreg(s[4]->InputAt(0))); | 1632   EXPECT_EQ(s.ToVreg(s[3]->Output()), s.ToVreg(s[4]->InputAt(0))); | 
| 1633   EXPECT_EQ(s.ToVreg(s[1]->InputAt(0)), s.ToVreg(s[4]->InputAt(1))); | 1633   EXPECT_EQ(s.ToVreg(s[1]->InputAt(0)), s.ToVreg(s[4]->InputAt(1))); | 
| 1634   EXPECT_EQ(kArmSub, s[5]->arch_opcode()); | 1634   EXPECT_EQ(kArmSub, s[5]->arch_opcode()); | 
| 1635   ASSERT_EQ(1U, s[5]->OutputCount()); | 1635   ASSERT_EQ(1U, s[5]->OutputCount()); | 
| 1636   ASSERT_EQ(2U, s[5]->InputCount()); | 1636   ASSERT_EQ(2U, s[5]->InputCount()); | 
| 1637   EXPECT_EQ(s.ToVreg(s[0]->InputAt(0)), s.ToVreg(s[5]->InputAt(0))); | 1637   EXPECT_EQ(s.ToVreg(s[0]->InputAt(0)), s.ToVreg(s[5]->InputAt(0))); | 
| 1638   EXPECT_EQ(s.ToVreg(s[4]->Output()), s.ToVreg(s[5]->InputAt(1))); | 1638   EXPECT_EQ(s.ToVreg(s[4]->Output()), s.ToVreg(s[5]->InputAt(1))); | 
| 1639 } | 1639 } | 
| 1640 | 1640 | 
| 1641 | 1641 | 
| 1642 TEST_F(InstructionSelectorTest, Int32UModWithParametersForSUDIV) { | 1642 TEST_F(InstructionSelectorTest, Uint32ModWithParametersForSUDIV) { | 
| 1643   StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); | 1643   StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); | 
| 1644   m.Return(m.Int32UMod(m.Parameter(0), m.Parameter(1))); | 1644   m.Return(m.Uint32Mod(m.Parameter(0), m.Parameter(1))); | 
| 1645   Stream s = m.Build(SUDIV); | 1645   Stream s = m.Build(SUDIV); | 
| 1646   ASSERT_EQ(3U, s.size()); | 1646   ASSERT_EQ(3U, s.size()); | 
| 1647   EXPECT_EQ(kArmUdiv, s[0]->arch_opcode()); | 1647   EXPECT_EQ(kArmUdiv, s[0]->arch_opcode()); | 
| 1648   ASSERT_EQ(1U, s[0]->OutputCount()); | 1648   ASSERT_EQ(1U, s[0]->OutputCount()); | 
| 1649   ASSERT_EQ(2U, s[0]->InputCount()); | 1649   ASSERT_EQ(2U, s[0]->InputCount()); | 
| 1650   EXPECT_EQ(kArmMul, s[1]->arch_opcode()); | 1650   EXPECT_EQ(kArmMul, s[1]->arch_opcode()); | 
| 1651   ASSERT_EQ(1U, s[1]->OutputCount()); | 1651   ASSERT_EQ(1U, s[1]->OutputCount()); | 
| 1652   ASSERT_EQ(2U, s[1]->InputCount()); | 1652   ASSERT_EQ(2U, s[1]->InputCount()); | 
| 1653   EXPECT_EQ(s.ToVreg(s[0]->Output()), s.ToVreg(s[1]->InputAt(0))); | 1653   EXPECT_EQ(s.ToVreg(s[0]->Output()), s.ToVreg(s[1]->InputAt(0))); | 
| 1654   EXPECT_EQ(s.ToVreg(s[0]->InputAt(1)), s.ToVreg(s[1]->InputAt(1))); | 1654   EXPECT_EQ(s.ToVreg(s[0]->InputAt(1)), s.ToVreg(s[1]->InputAt(1))); | 
| 1655   EXPECT_EQ(kArmSub, s[2]->arch_opcode()); | 1655   EXPECT_EQ(kArmSub, s[2]->arch_opcode()); | 
| 1656   ASSERT_EQ(1U, s[2]->OutputCount()); | 1656   ASSERT_EQ(1U, s[2]->OutputCount()); | 
| 1657   ASSERT_EQ(2U, s[2]->InputCount()); | 1657   ASSERT_EQ(2U, s[2]->InputCount()); | 
| 1658   EXPECT_EQ(s.ToVreg(s[0]->InputAt(0)), s.ToVreg(s[2]->InputAt(0))); | 1658   EXPECT_EQ(s.ToVreg(s[0]->InputAt(0)), s.ToVreg(s[2]->InputAt(0))); | 
| 1659   EXPECT_EQ(s.ToVreg(s[1]->Output()), s.ToVreg(s[2]->InputAt(1))); | 1659   EXPECT_EQ(s.ToVreg(s[1]->Output()), s.ToVreg(s[2]->InputAt(1))); | 
| 1660 } | 1660 } | 
| 1661 | 1661 | 
| 1662 | 1662 | 
| 1663 TEST_F(InstructionSelectorTest, Int32UModWithParametersForSUDIVAndMLS) { | 1663 TEST_F(InstructionSelectorTest, Uint32ModWithParametersForSUDIVAndMLS) { | 
| 1664   StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); | 1664   StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); | 
| 1665   m.Return(m.Int32UMod(m.Parameter(0), m.Parameter(1))); | 1665   m.Return(m.Uint32Mod(m.Parameter(0), m.Parameter(1))); | 
| 1666   Stream s = m.Build(MLS, SUDIV); | 1666   Stream s = m.Build(MLS, SUDIV); | 
| 1667   ASSERT_EQ(2U, s.size()); | 1667   ASSERT_EQ(2U, s.size()); | 
| 1668   EXPECT_EQ(kArmUdiv, s[0]->arch_opcode()); | 1668   EXPECT_EQ(kArmUdiv, s[0]->arch_opcode()); | 
| 1669   ASSERT_EQ(1U, s[0]->OutputCount()); | 1669   ASSERT_EQ(1U, s[0]->OutputCount()); | 
| 1670   ASSERT_EQ(2U, s[0]->InputCount()); | 1670   ASSERT_EQ(2U, s[0]->InputCount()); | 
| 1671   EXPECT_EQ(kArmMls, s[1]->arch_opcode()); | 1671   EXPECT_EQ(kArmMls, s[1]->arch_opcode()); | 
| 1672   ASSERT_EQ(1U, s[1]->OutputCount()); | 1672   ASSERT_EQ(1U, s[1]->OutputCount()); | 
| 1673   ASSERT_EQ(3U, s[1]->InputCount()); | 1673   ASSERT_EQ(3U, s[1]->InputCount()); | 
| 1674   EXPECT_EQ(s.ToVreg(s[0]->Output()), s.ToVreg(s[1]->InputAt(0))); | 1674   EXPECT_EQ(s.ToVreg(s[0]->Output()), s.ToVreg(s[1]->InputAt(0))); | 
| 1675   EXPECT_EQ(s.ToVreg(s[0]->InputAt(1)), s.ToVreg(s[1]->InputAt(1))); | 1675   EXPECT_EQ(s.ToVreg(s[0]->InputAt(1)), s.ToVreg(s[1]->InputAt(1))); | 
| (...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1916       ASSERT_EQ(3U, s[0]->InputCount()); | 1916       ASSERT_EQ(3U, s[0]->InputCount()); | 
| 1917       EXPECT_EQ(lsb, s.ToInt32(s[0]->InputAt(1))); | 1917       EXPECT_EQ(lsb, s.ToInt32(s[0]->InputAt(1))); | 
| 1918       EXPECT_EQ(width, s.ToInt32(s[0]->InputAt(2))); | 1918       EXPECT_EQ(width, s.ToInt32(s[0]->InputAt(2))); | 
| 1919     } | 1919     } | 
| 1920   } | 1920   } | 
| 1921 } | 1921 } | 
| 1922 | 1922 | 
| 1923 }  // namespace compiler | 1923 }  // namespace compiler | 
| 1924 }  // namespace internal | 1924 }  // namespace internal | 
| 1925 }  // namespace v8 | 1925 }  // namespace v8 | 
| OLD | NEW | 
|---|