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

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

Issue 654833002: [turbofan] Optimize division/modulus by constant. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 2 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 | Annotate | Revision Log
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 "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 1351 matching lines...) Expand 10 before | Expand all | Expand 10 after
1362 } 1362 }
1363 1363
1364 1364
1365 // ----------------------------------------------------------------------------- 1365 // -----------------------------------------------------------------------------
1366 // Miscellaneous. 1366 // Miscellaneous.
1367 1367
1368 1368
1369 TEST_F(InstructionSelectorTest, Int32AddWithInt32Mul) { 1369 TEST_F(InstructionSelectorTest, Int32AddWithInt32Mul) {
1370 { 1370 {
1371 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32); 1371 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32);
1372 m.Return( 1372 Node* const p0 = m.Parameter(0);
1373 m.Int32Add(m.Parameter(0), m.Int32Mul(m.Parameter(1), m.Parameter(2)))); 1373 Node* const p1 = m.Parameter(1);
1374 Node* const p2 = m.Parameter(2);
1375 Node* const n = m.Int32Add(p0, m.Int32Mul(p1, p2));
1376 m.Return(n);
1374 Stream s = m.Build(); 1377 Stream s = m.Build();
1375 ASSERT_EQ(1U, s.size()); 1378 ASSERT_EQ(1U, s.size());
1376 EXPECT_EQ(kArmMla, s[0]->arch_opcode()); 1379 EXPECT_EQ(kArmMla, s[0]->arch_opcode());
1377 EXPECT_EQ(3U, s[0]->InputCount()); 1380 ASSERT_EQ(3U, s[0]->InputCount());
1378 EXPECT_EQ(1U, s[0]->OutputCount()); 1381 EXPECT_EQ(s.ToVreg(p1), s.ToVreg(s[0]->InputAt(0)));
1382 EXPECT_EQ(s.ToVreg(p2), s.ToVreg(s[0]->InputAt(1)));
1383 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(2)));
1384 ASSERT_EQ(1U, s[0]->OutputCount());
1385 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output()));
1379 } 1386 }
1380 { 1387 {
1381 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32); 1388 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32);
1382 m.Return( 1389 Node* const p0 = m.Parameter(0);
1383 m.Int32Add(m.Int32Mul(m.Parameter(1), m.Parameter(2)), m.Parameter(0))); 1390 Node* const p1 = m.Parameter(1);
1391 Node* const p2 = m.Parameter(2);
1392 Node* const n = m.Int32Add(m.Int32Mul(p1, p2), p0);
1393 m.Return(n);
1384 Stream s = m.Build(); 1394 Stream s = m.Build();
1385 ASSERT_EQ(1U, s.size()); 1395 ASSERT_EQ(1U, s.size());
1386 EXPECT_EQ(kArmMla, s[0]->arch_opcode()); 1396 EXPECT_EQ(kArmMla, s[0]->arch_opcode());
1387 EXPECT_EQ(3U, s[0]->InputCount()); 1397 ASSERT_EQ(3U, s[0]->InputCount());
1388 EXPECT_EQ(1U, s[0]->OutputCount()); 1398 EXPECT_EQ(s.ToVreg(p1), s.ToVreg(s[0]->InputAt(0)));
1399 EXPECT_EQ(s.ToVreg(p2), s.ToVreg(s[0]->InputAt(1)));
1400 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(2)));
1401 ASSERT_EQ(1U, s[0]->OutputCount());
1402 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output()));
1389 } 1403 }
1390 } 1404 }
1391 1405
1392 1406
1407 TEST_F(InstructionSelectorTest, Int32AddWithInt32MulHigh) {
1408 {
1409 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32);
1410 Node* const p0 = m.Parameter(0);
1411 Node* const p1 = m.Parameter(1);
1412 Node* const p2 = m.Parameter(2);
1413 Node* const n = m.Int32Add(p0, m.Int32MulHigh(p1, p2));
1414 m.Return(n);
1415 Stream s = m.Build();
1416 ASSERT_EQ(1U, s.size());
1417 EXPECT_EQ(kArmSmmla, s[0]->arch_opcode());
1418 ASSERT_EQ(3U, s[0]->InputCount());
1419 EXPECT_EQ(s.ToVreg(p1), s.ToVreg(s[0]->InputAt(0)));
1420 EXPECT_EQ(s.ToVreg(p2), s.ToVreg(s[0]->InputAt(1)));
1421 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(2)));
1422 ASSERT_EQ(1U, s[0]->OutputCount());
1423 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output()));
1424 }
1425 {
1426 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32);
1427 Node* const p0 = m.Parameter(0);
1428 Node* const p1 = m.Parameter(1);
1429 Node* const p2 = m.Parameter(2);
1430 Node* const n = m.Int32Add(m.Int32MulHigh(p1, p2), p0);
1431 m.Return(n);
1432 Stream s = m.Build();
1433 ASSERT_EQ(1U, s.size());
1434 EXPECT_EQ(kArmSmmla, s[0]->arch_opcode());
1435 ASSERT_EQ(3U, s[0]->InputCount());
1436 EXPECT_EQ(s.ToVreg(p1), s.ToVreg(s[0]->InputAt(0)));
1437 EXPECT_EQ(s.ToVreg(p2), s.ToVreg(s[0]->InputAt(1)));
1438 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(2)));
1439 ASSERT_EQ(1U, s[0]->OutputCount());
1440 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output()));
1441 }
1442 }
1443
1444
1445 TEST_F(InstructionSelectorTest, Int32SubWithInt32Mul) {
1446 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32);
1447 m.Return(
1448 m.Int32Sub(m.Parameter(0), m.Int32Mul(m.Parameter(1), m.Parameter(2))));
1449 Stream s = m.Build();
1450 ASSERT_EQ(2U, s.size());
1451 EXPECT_EQ(kArmMul, s[0]->arch_opcode());
1452 ASSERT_EQ(1U, s[0]->OutputCount());
1453 EXPECT_EQ(kArmSub, s[1]->arch_opcode());
1454 ASSERT_EQ(2U, s[1]->InputCount());
1455 EXPECT_EQ(s.ToVreg(s[0]->Output()), s.ToVreg(s[1]->InputAt(1)));
1456 }
1457
1458
1459 TEST_F(InstructionSelectorTest, Int32SubWithInt32MulForMLS) {
1460 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32);
1461 m.Return(
1462 m.Int32Sub(m.Parameter(0), m.Int32Mul(m.Parameter(1), m.Parameter(2))));
1463 Stream s = m.Build(MLS);
1464 ASSERT_EQ(1U, s.size());
1465 EXPECT_EQ(kArmMls, s[0]->arch_opcode());
1466 EXPECT_EQ(1U, s[0]->OutputCount());
1467 EXPECT_EQ(3U, s[0]->InputCount());
1468 }
1469
1470
1393 TEST_F(InstructionSelectorTest, Int32DivWithParameters) { 1471 TEST_F(InstructionSelectorTest, Int32DivWithParameters) {
1394 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); 1472 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32);
1395 m.Return(m.Int32Div(m.Parameter(0), m.Parameter(1))); 1473 m.Return(m.Int32Div(m.Parameter(0), m.Parameter(1)));
1396 Stream s = m.Build(); 1474 Stream s = m.Build();
1397 ASSERT_EQ(4U, s.size()); 1475 ASSERT_EQ(4U, s.size());
1398 EXPECT_EQ(kArmVcvtF64S32, s[0]->arch_opcode()); 1476 EXPECT_EQ(kArmVcvtF64S32, s[0]->arch_opcode());
1399 ASSERT_EQ(1U, s[0]->OutputCount()); 1477 ASSERT_EQ(1U, s[0]->OutputCount());
1400 EXPECT_EQ(kArmVcvtF64S32, s[1]->arch_opcode()); 1478 EXPECT_EQ(kArmVcvtF64S32, s[1]->arch_opcode());
1401 ASSERT_EQ(1U, s[1]->OutputCount()); 1479 ASSERT_EQ(1U, s[1]->OutputCount());
1402 EXPECT_EQ(kArmVdivF64, s[2]->arch_opcode()); 1480 EXPECT_EQ(kArmVdivF64, s[2]->arch_opcode());
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
1547 EXPECT_EQ(kArmRsb, s[0]->arch_opcode()); 1625 EXPECT_EQ(kArmRsb, s[0]->arch_opcode());
1548 EXPECT_EQ(kMode_Operand2_R_LSL_I, s[0]->addressing_mode()); 1626 EXPECT_EQ(kMode_Operand2_R_LSL_I, s[0]->addressing_mode());
1549 ASSERT_EQ(3U, s[0]->InputCount()); 1627 ASSERT_EQ(3U, s[0]->InputCount());
1550 EXPECT_EQ(s.ToVreg(s[0]->InputAt(0)), s.ToVreg(s[0]->InputAt(1))); 1628 EXPECT_EQ(s.ToVreg(s[0]->InputAt(0)), s.ToVreg(s[0]->InputAt(1)));
1551 EXPECT_EQ(k, s.ToInt32(s[0]->InputAt(2))); 1629 EXPECT_EQ(k, s.ToInt32(s[0]->InputAt(2)));
1552 EXPECT_EQ(1U, s[0]->OutputCount()); 1630 EXPECT_EQ(1U, s[0]->OutputCount());
1553 } 1631 }
1554 } 1632 }
1555 1633
1556 1634
1557 TEST_F(InstructionSelectorTest, Int32SubWithInt32Mul) { 1635 TEST_F(InstructionSelectorTest, Int32MulHighWithParameters) {
1558 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32); 1636 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32);
1559 m.Return( 1637 Node* const p0 = m.Parameter(0);
1560 m.Int32Sub(m.Parameter(0), m.Int32Mul(m.Parameter(1), m.Parameter(2)))); 1638 Node* const p1 = m.Parameter(1);
1639 Node* const n = m.Int32MulHigh(p0, p1);
1640 m.Return(n);
1561 Stream s = m.Build(); 1641 Stream s = m.Build();
1562 ASSERT_EQ(2U, s.size()); 1642 ASSERT_EQ(1U, s.size());
1563 EXPECT_EQ(kArmMul, s[0]->arch_opcode()); 1643 EXPECT_EQ(kArmSmmul, s[0]->arch_opcode());
1644 ASSERT_EQ(2U, s[0]->InputCount());
1645 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(0)));
1646 EXPECT_EQ(s.ToVreg(p1), s.ToVreg(s[0]->InputAt(1)));
1564 ASSERT_EQ(1U, s[0]->OutputCount()); 1647 ASSERT_EQ(1U, s[0]->OutputCount());
1565 EXPECT_EQ(kArmSub, s[1]->arch_opcode()); 1648 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output()));
1566 ASSERT_EQ(2U, s[1]->InputCount());
1567 EXPECT_EQ(s.ToVreg(s[0]->Output()), s.ToVreg(s[1]->InputAt(1)));
1568 } 1649 }
1569 1650
1570 1651
1571 TEST_F(InstructionSelectorTest, Int32SubWithInt32MulForMLS) {
1572 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32);
1573 m.Return(
1574 m.Int32Sub(m.Parameter(0), m.Int32Mul(m.Parameter(1), m.Parameter(2))));
1575 Stream s = m.Build(MLS);
1576 ASSERT_EQ(1U, s.size());
1577 EXPECT_EQ(kArmMls, s[0]->arch_opcode());
1578 EXPECT_EQ(1U, s[0]->OutputCount());
1579 EXPECT_EQ(3U, s[0]->InputCount());
1580 }
1581
1582
1583 TEST_F(InstructionSelectorTest, Uint32DivWithParameters) { 1652 TEST_F(InstructionSelectorTest, Uint32DivWithParameters) {
1584 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); 1653 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32);
1585 m.Return(m.Uint32Div(m.Parameter(0), m.Parameter(1))); 1654 m.Return(m.Uint32Div(m.Parameter(0), m.Parameter(1)));
1586 Stream s = m.Build(); 1655 Stream s = m.Build();
1587 ASSERT_EQ(4U, s.size()); 1656 ASSERT_EQ(4U, s.size());
1588 EXPECT_EQ(kArmVcvtF64U32, s[0]->arch_opcode()); 1657 EXPECT_EQ(kArmVcvtF64U32, s[0]->arch_opcode());
1589 ASSERT_EQ(1U, s[0]->OutputCount()); 1658 ASSERT_EQ(1U, s[0]->OutputCount());
1590 EXPECT_EQ(kArmVcvtF64U32, s[1]->arch_opcode()); 1659 EXPECT_EQ(kArmVcvtF64U32, s[1]->arch_opcode());
1591 ASSERT_EQ(1U, s[1]->OutputCount()); 1660 ASSERT_EQ(1U, s[1]->OutputCount());
1592 EXPECT_EQ(kArmVdivF64, s[2]->arch_opcode()); 1661 EXPECT_EQ(kArmVdivF64, s[2]->arch_opcode());
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after
1916 ASSERT_EQ(3U, s[0]->InputCount()); 1985 ASSERT_EQ(3U, s[0]->InputCount());
1917 EXPECT_EQ(lsb, s.ToInt32(s[0]->InputAt(1))); 1986 EXPECT_EQ(lsb, s.ToInt32(s[0]->InputAt(1)));
1918 EXPECT_EQ(width, s.ToInt32(s[0]->InputAt(2))); 1987 EXPECT_EQ(width, s.ToInt32(s[0]->InputAt(2)));
1919 } 1988 }
1920 } 1989 }
1921 } 1990 }
1922 1991
1923 } // namespace compiler 1992 } // namespace compiler
1924 } // namespace internal 1993 } // namespace internal
1925 } // namespace v8 1994 } // namespace v8
OLDNEW
« no previous file with comments | « test/mjsunit/asm/int32mod.js ('k') | test/unittests/compiler/arm64/instruction-selector-arm64-unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698