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

Side by Side Diff: src/compiler/mips64/instruction-selector-mips64.cc

Issue 2569683002: MIPS[64]: Disable fusion multiple-accumulate instructions (Closed)
Patch Set: Created 4 years 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/mips64/instruction-codes-mips64.h ('k') | src/mips/macro-assembler-mips.h » ('j') | 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 "src/base/adapters.h" 5 #include "src/base/adapters.h"
6 #include "src/base/bits.h" 6 #include "src/base/bits.h"
7 #include "src/compiler/instruction-selector-impl.h" 7 #include "src/compiler/instruction-selector-impl.h"
8 #include "src/compiler/node-matchers.h" 8 #include "src/compiler/node-matchers.h"
9 #include "src/compiler/node-properties.h" 9 #include "src/compiler/node-properties.h"
10 10
(...skipping 1431 matching lines...) Expand 10 before | Expand all | Expand 10 after
1442 } 1442 }
1443 1443
1444 1444
1445 void InstructionSelector::VisitBitcastInt64ToFloat64(Node* node) { 1445 void InstructionSelector::VisitBitcastInt64ToFloat64(Node* node) {
1446 VisitRR(this, kMips64BitcastLD, node); 1446 VisitRR(this, kMips64BitcastLD, node);
1447 } 1447 }
1448 1448
1449 1449
1450 void InstructionSelector::VisitFloat32Add(Node* node) { 1450 void InstructionSelector::VisitFloat32Add(Node* node) {
1451 Mips64OperandGenerator g(this); 1451 Mips64OperandGenerator g(this);
1452 Float32BinopMatcher m(node); 1452 if (kArchVariant == kMips64r2) { // Select Madd.S(z, x, y).
1453 if (m.left().IsFloat32Mul() && CanCover(node, m.left().node())) { 1453 Float32BinopMatcher m(node);
1454 // For Add.S(Mul.S(x, y), z): 1454 if (m.left().IsFloat32Mul() && CanCover(node, m.left().node())) {
1455 Float32BinopMatcher mleft(m.left().node()); 1455 // For Add.S(Mul.S(x, y), z):
1456 if (kArchVariant == kMips64r2) { // Select Madd.S(z, x, y). 1456 Float32BinopMatcher mleft(m.left().node());
1457 Emit(kMips64MaddS, g.DefineAsRegister(node), 1457 Emit(kMips64MaddS, g.DefineAsRegister(node),
1458 g.UseRegister(m.right().node()), g.UseRegister(mleft.left().node()), 1458 g.UseRegister(m.right().node()), g.UseRegister(mleft.left().node()),
1459 g.UseRegister(mleft.right().node())); 1459 g.UseRegister(mleft.right().node()));
1460 return; 1460 return;
1461 } else if (kArchVariant == kMips64r6) { // Select Maddf.S(z, x, y).
1462 Emit(kMips64MaddfS, g.DefineSameAsFirst(node),
1463 g.UseRegister(m.right().node()), g.UseRegister(mleft.left().node()),
1464 g.UseRegister(mleft.right().node()));
1465 return;
1466 } 1461 }
1467 } 1462 if (m.right().IsFloat32Mul() && CanCover(node, m.right().node())) {
1468 if (m.right().IsFloat32Mul() && CanCover(node, m.right().node())) { 1463 // For Add.S(x, Mul.S(y, z)):
1469 // For Add.S(x, Mul.S(y, z)): 1464 Float32BinopMatcher mright(m.right().node());
1470 Float32BinopMatcher mright(m.right().node());
1471 if (kArchVariant == kMips64r2) { // Select Madd.S(x, y, z).
1472 Emit(kMips64MaddS, g.DefineAsRegister(node), 1465 Emit(kMips64MaddS, g.DefineAsRegister(node),
1473 g.UseRegister(m.left().node()), g.UseRegister(mright.left().node()), 1466 g.UseRegister(m.left().node()), g.UseRegister(mright.left().node()),
1474 g.UseRegister(mright.right().node())); 1467 g.UseRegister(mright.right().node()));
1475 return; 1468 return;
1476 } else if (kArchVariant == kMips64r6) { // Select Maddf.S(x, y, z).
1477 Emit(kMips64MaddfS, g.DefineSameAsFirst(node),
1478 g.UseRegister(m.left().node()), g.UseRegister(mright.left().node()),
1479 g.UseRegister(mright.right().node()));
1480 return;
1481 } 1469 }
1482 } 1470 }
1483 VisitRRR(this, kMips64AddS, node); 1471 VisitRRR(this, kMips64AddS, node);
1484 } 1472 }
1485 1473
1486 1474
1487 void InstructionSelector::VisitFloat64Add(Node* node) { 1475 void InstructionSelector::VisitFloat64Add(Node* node) {
1488 Mips64OperandGenerator g(this); 1476 Mips64OperandGenerator g(this);
1489 Float64BinopMatcher m(node); 1477 if (kArchVariant == kMips64r2) { // Select Madd.S(z, x, y).
1490 if (m.left().IsFloat64Mul() && CanCover(node, m.left().node())) { 1478 Float64BinopMatcher m(node);
1491 // For Add.D(Mul.D(x, y), z): 1479 if (m.left().IsFloat64Mul() && CanCover(node, m.left().node())) {
1492 Float64BinopMatcher mleft(m.left().node()); 1480 // For Add.D(Mul.D(x, y), z):
1493 if (kArchVariant == kMips64r2) { // Select Madd.D(z, x, y). 1481 Float64BinopMatcher mleft(m.left().node());
1494 Emit(kMips64MaddD, g.DefineAsRegister(node), 1482 Emit(kMips64MaddD, g.DefineAsRegister(node),
1495 g.UseRegister(m.right().node()), g.UseRegister(mleft.left().node()), 1483 g.UseRegister(m.right().node()), g.UseRegister(mleft.left().node()),
1496 g.UseRegister(mleft.right().node())); 1484 g.UseRegister(mleft.right().node()));
1497 return; 1485 return;
1498 } else if (kArchVariant == kMips64r6) { // Select Maddf.D(z, x, y).
1499 Emit(kMips64MaddfD, g.DefineSameAsFirst(node),
1500 g.UseRegister(m.right().node()), g.UseRegister(mleft.left().node()),
1501 g.UseRegister(mleft.right().node()));
1502 return;
1503 } 1486 }
1504 } 1487 if (m.right().IsFloat64Mul() && CanCover(node, m.right().node())) {
1505 if (m.right().IsFloat64Mul() && CanCover(node, m.right().node())) { 1488 // For Add.D(x, Mul.D(y, z)):
1506 // For Add.D(x, Mul.D(y, z)): 1489 Float64BinopMatcher mright(m.right().node());
1507 Float64BinopMatcher mright(m.right().node());
1508 if (kArchVariant == kMips64r2) { // Select Madd.D(x, y, z).
1509 Emit(kMips64MaddD, g.DefineAsRegister(node), 1490 Emit(kMips64MaddD, g.DefineAsRegister(node),
1510 g.UseRegister(m.left().node()), g.UseRegister(mright.left().node()), 1491 g.UseRegister(m.left().node()), g.UseRegister(mright.left().node()),
1511 g.UseRegister(mright.right().node())); 1492 g.UseRegister(mright.right().node()));
1512 return; 1493 return;
1513 } else if (kArchVariant == kMips64r6) { // Select Maddf.D(x, y, z).
1514 Emit(kMips64MaddfD, g.DefineSameAsFirst(node),
1515 g.UseRegister(m.left().node()), g.UseRegister(mright.left().node()),
1516 g.UseRegister(mright.right().node()));
1517 return;
1518 } 1494 }
1519 } 1495 }
1520 VisitRRR(this, kMips64AddD, node); 1496 VisitRRR(this, kMips64AddD, node);
1521 } 1497 }
1522 1498
1523 1499
1524 void InstructionSelector::VisitFloat32Sub(Node* node) { 1500 void InstructionSelector::VisitFloat32Sub(Node* node) {
1525 Mips64OperandGenerator g(this); 1501 Mips64OperandGenerator g(this);
1526 Float32BinopMatcher m(node); 1502 if (kArchVariant == kMips64r2) { // Select Madd.S(z, x, y).
1527 if (m.left().IsFloat32Mul() && CanCover(node, m.left().node())) { 1503 Float32BinopMatcher m(node);
1528 if (kArchVariant == kMips64r2) { 1504 if (m.left().IsFloat32Mul() && CanCover(node, m.left().node())) {
1529 // For Sub.S(Mul.S(x,y), z) select Msub.S(z, x, y). 1505 // For Sub.S(Mul.S(x,y), z) select Msub.S(z, x, y).
1530 Float32BinopMatcher mleft(m.left().node()); 1506 Float32BinopMatcher mleft(m.left().node());
1531 Emit(kMips64MsubS, g.DefineAsRegister(node), 1507 Emit(kMips64MsubS, g.DefineAsRegister(node),
1532 g.UseRegister(m.right().node()), g.UseRegister(mleft.left().node()), 1508 g.UseRegister(m.right().node()), g.UseRegister(mleft.left().node()),
1533 g.UseRegister(mleft.right().node())); 1509 g.UseRegister(mleft.right().node()));
1534 return; 1510 return;
1535 } 1511 }
1536 } else if (m.right().IsFloat32Mul() && CanCover(node, m.right().node())) {
1537 if (kArchVariant == kMips64r6) {
1538 // For Sub.S(x,Mul.S(y,z)) select Msubf.S(x, y, z).
1539 Float32BinopMatcher mright(m.right().node());
1540 Emit(kMips64MsubfS, g.DefineSameAsFirst(node),
1541 g.UseRegister(m.left().node()), g.UseRegister(mright.left().node()),
1542 g.UseRegister(mright.right().node()));
1543 return;
1544 }
1545 } 1512 }
1546 VisitRRR(this, kMips64SubS, node); 1513 VisitRRR(this, kMips64SubS, node);
1547 } 1514 }
1548 1515
1549 void InstructionSelector::VisitFloat64Sub(Node* node) { 1516 void InstructionSelector::VisitFloat64Sub(Node* node) {
1550 Mips64OperandGenerator g(this); 1517 Mips64OperandGenerator g(this);
1551 Float64BinopMatcher m(node); 1518 if (kArchVariant == kMips64r2) { // Select Madd.S(z, x, y).
1552 if (m.left().IsFloat64Mul() && CanCover(node, m.left().node())) { 1519 Float64BinopMatcher m(node);
1553 if (kArchVariant == kMips64r2) { 1520 if (m.left().IsFloat64Mul() && CanCover(node, m.left().node())) {
1554 // For Sub.D(Mul.S(x,y), z) select Msub.D(z, x, y). 1521 // For Sub.D(Mul.S(x,y), z) select Msub.D(z, x, y).
1555 Float64BinopMatcher mleft(m.left().node()); 1522 Float64BinopMatcher mleft(m.left().node());
1556 Emit(kMips64MsubD, g.DefineAsRegister(node), 1523 Emit(kMips64MsubD, g.DefineAsRegister(node),
1557 g.UseRegister(m.right().node()), g.UseRegister(mleft.left().node()), 1524 g.UseRegister(m.right().node()), g.UseRegister(mleft.left().node()),
1558 g.UseRegister(mleft.right().node())); 1525 g.UseRegister(mleft.right().node()));
1559 return; 1526 return;
1560 } 1527 }
1561 } else if (m.right().IsFloat64Mul() && CanCover(node, m.right().node())) {
1562 if (kArchVariant == kMips64r6) {
1563 // For Sub.D(x,Mul.S(y,z)) select Msubf.D(x, y, z).
1564 Float64BinopMatcher mright(m.right().node());
1565 Emit(kMips64MsubfD, g.DefineSameAsFirst(node),
1566 g.UseRegister(m.left().node()), g.UseRegister(mright.left().node()),
1567 g.UseRegister(mright.right().node()));
1568 return;
1569 }
1570 } 1528 }
1571 VisitRRR(this, kMips64SubD, node); 1529 VisitRRR(this, kMips64SubD, node);
1572 } 1530 }
1573 1531
1574 void InstructionSelector::VisitFloat32Mul(Node* node) { 1532 void InstructionSelector::VisitFloat32Mul(Node* node) {
1575 VisitRRR(this, kMips64MulS, node); 1533 VisitRRR(this, kMips64MulS, node);
1576 } 1534 }
1577 1535
1578 1536
1579 void InstructionSelector::VisitFloat64Mul(Node* node) { 1537 void InstructionSelector::VisitFloat64Mul(Node* node) {
(...skipping 1064 matching lines...) Expand 10 before | Expand all | Expand 10 after
2644 } else { 2602 } else {
2645 DCHECK(kArchVariant == kMips64r2); 2603 DCHECK(kArchVariant == kMips64r2);
2646 return MachineOperatorBuilder::AlignmentRequirements:: 2604 return MachineOperatorBuilder::AlignmentRequirements::
2647 NoUnalignedAccessSupport(); 2605 NoUnalignedAccessSupport();
2648 } 2606 }
2649 } 2607 }
2650 2608
2651 } // namespace compiler 2609 } // namespace compiler
2652 } // namespace internal 2610 } // namespace internal
2653 } // namespace v8 2611 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/mips64/instruction-codes-mips64.h ('k') | src/mips/macro-assembler-mips.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698