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

Side by Side Diff: test/unittests/compiler/arm/instruction-selector-arm-unittest.cc

Issue 1361913003: [arm] Optimize vcmp when lhs operand is #0.0 (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 3 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/compiler/arm/instruction-selector-arm.cc ('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 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 <limits> 5 #include <limits>
6 6
7 #include "test/unittests/compiler/instruction-selector-unittest.h" 7 #include "test/unittests/compiler/instruction-selector-unittest.h"
8 8
9 namespace v8 { 9 namespace v8 {
10 namespace internal { 10 namespace internal {
(...skipping 1374 matching lines...) Expand 10 before | Expand all | Expand 10 after
1385 // Comparisons. 1385 // Comparisons.
1386 1386
1387 1387
1388 namespace { 1388 namespace {
1389 1389
1390 struct Comparison { 1390 struct Comparison {
1391 Constructor constructor; 1391 Constructor constructor;
1392 const char* constructor_name; 1392 const char* constructor_name;
1393 FlagsCondition flags_condition; 1393 FlagsCondition flags_condition;
1394 FlagsCondition negated_flags_condition; 1394 FlagsCondition negated_flags_condition;
1395 FlagsCondition commuted_flags_condition;
1395 }; 1396 };
1396 1397
1397 1398
1398 std::ostream& operator<<(std::ostream& os, const Comparison& cmp) { 1399 std::ostream& operator<<(std::ostream& os, const Comparison& cmp) {
1399 return os << cmp.constructor_name; 1400 return os << cmp.constructor_name;
1400 } 1401 }
1401 1402
1402 1403
1403 const Comparison kComparisons[] = { 1404 const Comparison kComparisons[] = {
1404 {&RawMachineAssembler::Word32Equal, "Word32Equal", kEqual, kNotEqual}, 1405 {&RawMachineAssembler::Word32Equal, "Word32Equal", kEqual, kNotEqual,
1406 kEqual},
1405 {&RawMachineAssembler::Int32LessThan, "Int32LessThan", kSignedLessThan, 1407 {&RawMachineAssembler::Int32LessThan, "Int32LessThan", kSignedLessThan,
1406 kSignedGreaterThanOrEqual}, 1408 kSignedGreaterThanOrEqual, kSignedGreaterThan},
1407 {&RawMachineAssembler::Int32LessThanOrEqual, "Int32LessThanOrEqual", 1409 {&RawMachineAssembler::Int32LessThanOrEqual, "Int32LessThanOrEqual",
1408 kSignedLessThanOrEqual, kSignedGreaterThan}, 1410 kSignedLessThanOrEqual, kSignedGreaterThan, kSignedGreaterThanOrEqual},
1409 {&RawMachineAssembler::Uint32LessThan, "Uint32LessThan", kUnsignedLessThan, 1411 {&RawMachineAssembler::Uint32LessThan, "Uint32LessThan", kUnsignedLessThan,
1410 kUnsignedGreaterThanOrEqual}, 1412 kUnsignedGreaterThanOrEqual, kUnsignedGreaterThan},
1411 {&RawMachineAssembler::Uint32LessThanOrEqual, "Uint32LessThanOrEqual", 1413 {&RawMachineAssembler::Uint32LessThanOrEqual, "Uint32LessThanOrEqual",
1412 kUnsignedLessThanOrEqual, kUnsignedGreaterThan}}; 1414 kUnsignedLessThanOrEqual, kUnsignedGreaterThan,
1415 kUnsignedGreaterThanOrEqual}};
1413 1416
1414 } // namespace 1417 } // namespace
1415 1418
1416 1419
1417 typedef InstructionSelectorTestWithParam<Comparison> 1420 typedef InstructionSelectorTestWithParam<Comparison>
1418 InstructionSelectorComparisonTest; 1421 InstructionSelectorComparisonTest;
1419 1422
1420 1423
1421 TEST_P(InstructionSelectorComparisonTest, Parameters) { 1424 TEST_P(InstructionSelectorComparisonTest, Parameters) {
1422 const Comparison& cmp = GetParam(); 1425 const Comparison& cmp = GetParam();
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
1488 ::testing::ValuesIn(kComparisons)); 1491 ::testing::ValuesIn(kComparisons));
1489 1492
1490 1493
1491 // ----------------------------------------------------------------------------- 1494 // -----------------------------------------------------------------------------
1492 // Floating point comparisons. 1495 // Floating point comparisons.
1493 1496
1494 1497
1495 namespace { 1498 namespace {
1496 1499
1497 const Comparison kF32Comparisons[] = { 1500 const Comparison kF32Comparisons[] = {
1498 {&RawMachineAssembler::Float32Equal, "Float32Equal", kEqual, kNotEqual}, 1501 {&RawMachineAssembler::Float32Equal, "Float32Equal", kEqual, kNotEqual,
1502 kEqual},
1499 {&RawMachineAssembler::Float32LessThan, "Float32LessThan", 1503 {&RawMachineAssembler::Float32LessThan, "Float32LessThan",
1500 kUnsignedLessThan, kUnsignedGreaterThanOrEqual}, 1504 kFloatLessThan, kFloatGreaterThanOrEqualOrUnordered, kFloatGreaterThan},
1501 {&RawMachineAssembler::Float32LessThanOrEqual, "Float32LessThanOrEqual", 1505 {&RawMachineAssembler::Float32LessThanOrEqual, "Float32LessThanOrEqual",
1502 kUnsignedLessThanOrEqual, kUnsignedGreaterThan}}; 1506 kFloatLessThanOrEqual, kFloatGreaterThanOrUnordered,
1507 kFloatGreaterThanOrEqual}};
1503 1508
1504 } // namespace 1509 } // namespace
1505 1510
1506 typedef InstructionSelectorTestWithParam<Comparison> 1511 typedef InstructionSelectorTestWithParam<Comparison>
1507 InstructionSelectorF32ComparisonTest; 1512 InstructionSelectorF32ComparisonTest;
1508 1513
1509 1514
1510 TEST_P(InstructionSelectorF32ComparisonTest, WithParameters) { 1515 TEST_P(InstructionSelectorF32ComparisonTest, WithParameters) {
1511 const Comparison& cmp = GetParam(); 1516 const Comparison& cmp = GetParam();
1512 StreamBuilder m(this, kMachInt32, kMachFloat32, kMachFloat32); 1517 StreamBuilder m(this, kMachInt32, kMachFloat32, kMachFloat32);
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1544 ASSERT_EQ(1U, s.size()); 1549 ASSERT_EQ(1U, s.size());
1545 EXPECT_EQ(kArmVcmpF32, s[0]->arch_opcode()); 1550 EXPECT_EQ(kArmVcmpF32, s[0]->arch_opcode());
1546 ASSERT_EQ(2U, s[0]->InputCount()); 1551 ASSERT_EQ(2U, s[0]->InputCount());
1547 EXPECT_TRUE(s[0]->InputAt(1)->IsImmediate()); 1552 EXPECT_TRUE(s[0]->InputAt(1)->IsImmediate());
1548 ASSERT_EQ(1U, s[0]->OutputCount()); 1553 ASSERT_EQ(1U, s[0]->OutputCount());
1549 EXPECT_EQ(kFlags_set, s[0]->flags_mode()); 1554 EXPECT_EQ(kFlags_set, s[0]->flags_mode());
1550 EXPECT_EQ(cmp.flags_condition, s[0]->flags_condition()); 1555 EXPECT_EQ(cmp.flags_condition, s[0]->flags_condition());
1551 } 1556 }
1552 1557
1553 1558
1559 TEST_P(InstructionSelectorF32ComparisonTest, WithImmediateZeroOnLeft) {
1560 const Comparison& cmp = GetParam();
1561 StreamBuilder m(this, kMachInt32, kMachFloat32);
1562 m.Return((m.*cmp.constructor)(m.Float32Constant(0.0f), m.Parameter(0)));
1563 Stream const s = m.Build();
1564 ASSERT_EQ(1U, s.size());
1565 EXPECT_EQ(kArmVcmpF32, s[0]->arch_opcode());
1566 ASSERT_EQ(2U, s[0]->InputCount());
1567 EXPECT_TRUE(s[0]->InputAt(1)->IsImmediate());
1568 ASSERT_EQ(1U, s[0]->OutputCount());
1569 EXPECT_EQ(kFlags_set, s[0]->flags_mode());
1570 EXPECT_EQ(cmp.commuted_flags_condition, s[0]->flags_condition());
1571 }
1572
1573
1554 INSTANTIATE_TEST_CASE_P(InstructionSelectorTest, 1574 INSTANTIATE_TEST_CASE_P(InstructionSelectorTest,
1555 InstructionSelectorF32ComparisonTest, 1575 InstructionSelectorF32ComparisonTest,
1556 ::testing::ValuesIn(kF32Comparisons)); 1576 ::testing::ValuesIn(kF32Comparisons));
1557 1577
1558 1578
1559 TEST_F(InstructionSelectorTest, Float32EqualWithImmediateZeroOnLeft) {
1560 StreamBuilder m(this, kMachInt32, kMachFloat32);
1561 m.Return(m.Float32Equal(m.Float32Constant(0.0f), m.Parameter(0)));
1562 Stream s = m.Build();
1563 ASSERT_EQ(1U, s.size());
1564 EXPECT_EQ(kArmVcmpF32, s[0]->arch_opcode());
1565 EXPECT_EQ(2U, s[0]->InputCount());
1566 EXPECT_TRUE(s[0]->InputAt(1)->IsImmediate());
1567 EXPECT_EQ(1U, s[0]->OutputCount());
1568 EXPECT_EQ(kFlags_set, s[0]->flags_mode());
1569 EXPECT_EQ(kEqual, s[0]->flags_condition());
1570 }
1571
1572
1573 namespace { 1579 namespace {
1574 1580
1575 const Comparison kF64Comparisons[] = { 1581 const Comparison kF64Comparisons[] = {
1576 {&RawMachineAssembler::Float64Equal, "Float64Equal", kEqual, kNotEqual}, 1582 {&RawMachineAssembler::Float64Equal, "Float64Equal", kEqual, kNotEqual,
1583 kEqual},
1577 {&RawMachineAssembler::Float64LessThan, "Float64LessThan", 1584 {&RawMachineAssembler::Float64LessThan, "Float64LessThan",
1578 kUnsignedLessThan, kUnsignedGreaterThanOrEqual}, 1585 kFloatLessThan, kFloatGreaterThanOrEqualOrUnordered, kFloatGreaterThan},
1579 {&RawMachineAssembler::Float64LessThanOrEqual, "Float64LessThanOrEqual", 1586 {&RawMachineAssembler::Float64LessThanOrEqual, "Float64LessThanOrEqual",
1580 kUnsignedLessThanOrEqual, kUnsignedGreaterThan}}; 1587 kFloatLessThanOrEqual, kFloatGreaterThanOrUnordered,
1588 kFloatGreaterThanOrEqual}};
1581 1589
1582 } // namespace 1590 } // namespace
1583 1591
1584 typedef InstructionSelectorTestWithParam<Comparison> 1592 typedef InstructionSelectorTestWithParam<Comparison>
1585 InstructionSelectorF64ComparisonTest; 1593 InstructionSelectorF64ComparisonTest;
1586 1594
1587 1595
1588 TEST_P(InstructionSelectorF64ComparisonTest, WithParameters) { 1596 TEST_P(InstructionSelectorF64ComparisonTest, WithParameters) {
1589 const Comparison& cmp = GetParam(); 1597 const Comparison& cmp = GetParam();
1590 StreamBuilder m(this, kMachInt32, kMachFloat64, kMachFloat64); 1598 StreamBuilder m(this, kMachInt32, kMachFloat64, kMachFloat64);
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1622 ASSERT_EQ(1U, s.size()); 1630 ASSERT_EQ(1U, s.size());
1623 EXPECT_EQ(kArmVcmpF64, s[0]->arch_opcode()); 1631 EXPECT_EQ(kArmVcmpF64, s[0]->arch_opcode());
1624 ASSERT_EQ(2U, s[0]->InputCount()); 1632 ASSERT_EQ(2U, s[0]->InputCount());
1625 EXPECT_TRUE(s[0]->InputAt(1)->IsImmediate()); 1633 EXPECT_TRUE(s[0]->InputAt(1)->IsImmediate());
1626 ASSERT_EQ(1U, s[0]->OutputCount()); 1634 ASSERT_EQ(1U, s[0]->OutputCount());
1627 EXPECT_EQ(kFlags_set, s[0]->flags_mode()); 1635 EXPECT_EQ(kFlags_set, s[0]->flags_mode());
1628 EXPECT_EQ(cmp.flags_condition, s[0]->flags_condition()); 1636 EXPECT_EQ(cmp.flags_condition, s[0]->flags_condition());
1629 } 1637 }
1630 1638
1631 1639
1640 TEST_P(InstructionSelectorF64ComparisonTest, WithImmediateZeroOnLeft) {
1641 const Comparison& cmp = GetParam();
1642 StreamBuilder m(this, kMachInt32, kMachFloat64);
1643 m.Return((m.*cmp.constructor)(m.Float64Constant(0.0), m.Parameter(0)));
1644 Stream const s = m.Build();
1645 ASSERT_EQ(1U, s.size());
1646 EXPECT_EQ(kArmVcmpF64, s[0]->arch_opcode());
1647 ASSERT_EQ(2U, s[0]->InputCount());
1648 EXPECT_TRUE(s[0]->InputAt(1)->IsImmediate());
1649 ASSERT_EQ(1U, s[0]->OutputCount());
1650 EXPECT_EQ(kFlags_set, s[0]->flags_mode());
1651 EXPECT_EQ(cmp.commuted_flags_condition, s[0]->flags_condition());
1652 }
1653
1654
1632 INSTANTIATE_TEST_CASE_P(InstructionSelectorTest, 1655 INSTANTIATE_TEST_CASE_P(InstructionSelectorTest,
1633 InstructionSelectorF64ComparisonTest, 1656 InstructionSelectorF64ComparisonTest,
1634 ::testing::ValuesIn(kF64Comparisons)); 1657 ::testing::ValuesIn(kF64Comparisons));
1635 1658
1636 1659
1637 TEST_F(InstructionSelectorTest, Float64EqualWithImmediateZeroOnLeft) {
1638 StreamBuilder m(this, kMachInt32, kMachFloat64);
1639 m.Return(m.Float64Equal(m.Float64Constant(0.0), m.Parameter(0)));
1640 Stream s = m.Build();
1641 ASSERT_EQ(1U, s.size());
1642 EXPECT_EQ(kArmVcmpF64, s[0]->arch_opcode());
1643 EXPECT_EQ(2U, s[0]->InputCount());
1644 EXPECT_TRUE(s[0]->InputAt(1)->IsImmediate());
1645 EXPECT_EQ(1U, s[0]->OutputCount());
1646 EXPECT_EQ(kFlags_set, s[0]->flags_mode());
1647 EXPECT_EQ(kEqual, s[0]->flags_condition());
1648 }
1649
1650
1651 // ----------------------------------------------------------------------------- 1660 // -----------------------------------------------------------------------------
1652 // Floating point arithmetic. 1661 // Floating point arithmetic.
1653 1662
1654 1663
1655 typedef InstructionSelectorTestWithParam<FAI> InstructionSelectorFAITest; 1664 typedef InstructionSelectorTestWithParam<FAI> InstructionSelectorFAITest;
1656 1665
1657 1666
1658 TEST_P(InstructionSelectorFAITest, Parameters) { 1667 TEST_P(InstructionSelectorFAITest, Parameters) {
1659 const FAI& fai = GetParam(); 1668 const FAI& fai = GetParam();
1660 StreamBuilder m(this, fai.machine_type, fai.machine_type, fai.machine_type); 1669 StreamBuilder m(this, fai.machine_type, fai.machine_type, fai.machine_type);
(...skipping 1109 matching lines...) Expand 10 before | Expand all | Expand 10 after
2770 EXPECT_EQ(kArmClz, s[0]->arch_opcode()); 2779 EXPECT_EQ(kArmClz, s[0]->arch_opcode());
2771 ASSERT_EQ(1U, s[0]->InputCount()); 2780 ASSERT_EQ(1U, s[0]->InputCount());
2772 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(0))); 2781 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(0)));
2773 ASSERT_EQ(1U, s[0]->OutputCount()); 2782 ASSERT_EQ(1U, s[0]->OutputCount());
2774 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output())); 2783 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output()));
2775 } 2784 }
2776 2785
2777 } // namespace compiler 2786 } // namespace compiler
2778 } // namespace internal 2787 } // namespace internal
2779 } // namespace v8 2788 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/arm/instruction-selector-arm.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698