| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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/compiler/code-generator.h" | 5 #include "src/compiler/code-generator.h" |
| 6 | 6 |
| 7 #include "src/compilation-info.h" | 7 #include "src/compilation-info.h" |
| 8 #include "src/compiler/code-generator-impl.h" | 8 #include "src/compiler/code-generator-impl.h" |
| 9 #include "src/compiler/gap-resolver.h" | 9 #include "src/compiler/gap-resolver.h" |
| 10 #include "src/compiler/node-matchers.h" | 10 #include "src/compiler/node-matchers.h" |
| (...skipping 1513 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1524 __ Mul64(i.InputRegister(0), i.InputImmediate(1)); | 1524 __ Mul64(i.InputRegister(0), i.InputImmediate(1)); |
| 1525 } else if (HasStackSlotInput(instr, 1)) { | 1525 } else if (HasStackSlotInput(instr, 1)) { |
| 1526 __ Mul64(i.InputRegister(0), i.InputStackSlot(1)); | 1526 __ Mul64(i.InputRegister(0), i.InputStackSlot(1)); |
| 1527 } else { | 1527 } else { |
| 1528 UNIMPLEMENTED(); | 1528 UNIMPLEMENTED(); |
| 1529 } | 1529 } |
| 1530 break; | 1530 break; |
| 1531 case kS390_MulHigh32: | 1531 case kS390_MulHigh32: |
| 1532 ASSEMBLE_BIN_OP(MulHigh32, MulHigh32, MulHigh32); | 1532 ASSEMBLE_BIN_OP(MulHigh32, MulHigh32, MulHigh32); |
| 1533 break; | 1533 break; |
| 1534 case kS390_Mul32WithHigh32: | |
| 1535 __ LoadRR(r1, i.InputRegister(0)); | |
| 1536 __ mr_z(r0, i.InputRegister(1)); | |
| 1537 __ LoadW(i.OutputRegister(0), r1); // low | |
| 1538 __ LoadW(i.OutputRegister(1), r0); // high | |
| 1539 break; | |
| 1540 case kS390_MulHighU32: | 1534 case kS390_MulHighU32: |
| 1541 __ LoadRR(r1, i.InputRegister(0)); | 1535 ASSEMBLE_BIN_OP(MulHighU32, MulHighU32, MulHighU32); |
| 1542 if (HasRegisterInput(instr, 1)) { | |
| 1543 __ mlr(r0, i.InputRegister(1)); | |
| 1544 } else if (HasStackSlotInput(instr, 1)) { | |
| 1545 __ ml(r0, i.InputStackSlot32(1)); | |
| 1546 } else { | |
| 1547 UNIMPLEMENTED(); | |
| 1548 } | |
| 1549 __ LoadlW(i.OutputRegister(), r0); | |
| 1550 break; | 1536 break; |
| 1551 case kS390_MulFloat: | 1537 case kS390_MulFloat: |
| 1552 // Ensure we don't clobber right | 1538 // Ensure we don't clobber right |
| 1553 if (i.OutputDoubleRegister().is(i.InputDoubleRegister(1))) { | 1539 if (i.OutputDoubleRegister().is(i.InputDoubleRegister(1))) { |
| 1554 ASSEMBLE_FLOAT_UNOP(meebr); | 1540 ASSEMBLE_FLOAT_UNOP(meebr); |
| 1555 } else { | 1541 } else { |
| 1556 if (!i.OutputDoubleRegister().is(i.InputDoubleRegister(0))) | 1542 if (!i.OutputDoubleRegister().is(i.InputDoubleRegister(0))) |
| 1557 __ ldr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); | 1543 __ ldr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); |
| 1558 __ meebr(i.OutputDoubleRegister(), i.InputDoubleRegister(1)); | 1544 __ meebr(i.OutputDoubleRegister(), i.InputDoubleRegister(1)); |
| 1559 } | 1545 } |
| 1560 break; | 1546 break; |
| 1561 case kS390_MulDouble: | 1547 case kS390_MulDouble: |
| 1562 // Ensure we don't clobber right | 1548 // Ensure we don't clobber right |
| 1563 if (i.OutputDoubleRegister().is(i.InputDoubleRegister(1))) { | 1549 if (i.OutputDoubleRegister().is(i.InputDoubleRegister(1))) { |
| 1564 ASSEMBLE_FLOAT_UNOP(mdbr); | 1550 ASSEMBLE_FLOAT_UNOP(mdbr); |
| 1565 } else { | 1551 } else { |
| 1566 if (!i.OutputDoubleRegister().is(i.InputDoubleRegister(0))) | 1552 if (!i.OutputDoubleRegister().is(i.InputDoubleRegister(0))) |
| 1567 __ ldr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); | 1553 __ ldr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); |
| 1568 __ mdbr(i.OutputDoubleRegister(), i.InputDoubleRegister(1)); | 1554 __ mdbr(i.OutputDoubleRegister(), i.InputDoubleRegister(1)); |
| 1569 } | 1555 } |
| 1570 break; | 1556 break; |
| 1571 #if V8_TARGET_ARCH_S390X | 1557 #if V8_TARGET_ARCH_S390X |
| 1572 case kS390_Div64: | 1558 case kS390_Div64: |
| 1573 __ LoadRR(r1, i.InputRegister(0)); | 1559 __ LoadRR(r1, i.InputRegister(0)); |
| 1574 __ dsgr(r0, i.InputRegister(1)); // R1: Dividend | 1560 __ dsgr(r0, i.InputRegister(1)); // R1: Dividend |
| 1575 __ ltgr(i.OutputRegister(), r1); // Copy R1: Quotient to output | 1561 __ ltgr(i.OutputRegister(), r1); // Copy R1: Quotient to output |
| 1576 break; | 1562 break; |
| 1577 #endif | 1563 #endif |
| 1578 case kS390_Div32: { | 1564 case kS390_Div32: { |
| 1579 AddressingMode mode = AddressingModeField::decode(instr->opcode()); | 1565 ASSEMBLE_BIN_OP(Div32, Div32, Div32); |
| 1580 __ lgfr(r1, i.InputRegister(0)); | |
| 1581 if (mode != kMode_None) { | |
| 1582 size_t first_index = 1; | |
| 1583 MemOperand operand = i.MemoryOperand(&mode, &first_index); | |
| 1584 __ dsgf(r0, operand); | |
| 1585 } else if (HasRegisterInput(instr, 1)) { | |
| 1586 __ dsgfr(r0, i.InputRegister(1)); | |
| 1587 } else if (HasStackSlotInput(instr, 1)) { | |
| 1588 __ dsgf(r0, i.InputStackSlot32(1)); | |
| 1589 } else { | |
| 1590 UNREACHABLE(); | |
| 1591 } | |
| 1592 __ LoadlW(i.OutputRegister(), r1); | |
| 1593 break; | 1566 break; |
| 1594 } | 1567 } |
| 1595 #if V8_TARGET_ARCH_S390X | 1568 #if V8_TARGET_ARCH_S390X |
| 1596 case kS390_DivU64: | 1569 case kS390_DivU64: |
| 1597 __ LoadRR(r1, i.InputRegister(0)); | 1570 __ LoadRR(r1, i.InputRegister(0)); |
| 1598 __ LoadImmP(r0, Operand::Zero()); | 1571 __ LoadImmP(r0, Operand::Zero()); |
| 1599 __ dlgr(r0, i.InputRegister(1)); // R0:R1: Dividend | 1572 __ dlgr(r0, i.InputRegister(1)); // R0:R1: Dividend |
| 1600 __ ltgr(i.OutputRegister(), r1); // Copy R1: Quotient to output | 1573 __ ltgr(i.OutputRegister(), r1); // Copy R1: Quotient to output |
| 1601 break; | 1574 break; |
| 1602 #endif | 1575 #endif |
| 1603 case kS390_DivU32: { | 1576 case kS390_DivU32: { |
| 1604 __ lr(r0, i.InputRegister(0)); | 1577 ASSEMBLE_BIN_OP(DivU32, DivU32, DivU32); |
| 1605 __ srdl(r0, Operand(32)); | |
| 1606 AddressingMode mode = AddressingModeField::decode(instr->opcode()); | |
| 1607 if (mode != kMode_None) { | |
| 1608 size_t first_index = 1; | |
| 1609 MemOperand operand = i.MemoryOperand(&mode, &first_index); | |
| 1610 __ dl(r0, operand); | |
| 1611 } else if (HasRegisterInput(instr, 1)) { | |
| 1612 __ dlr(r0, i.InputRegister(1)); | |
| 1613 } else if (HasStackSlotInput(instr, 1)) { | |
| 1614 __ dl(r0, i.InputStackSlot32(1)); | |
| 1615 } else { | |
| 1616 UNREACHABLE(); | |
| 1617 } | |
| 1618 __ LoadlW(i.OutputRegister(), r1); | |
| 1619 break; | 1578 break; |
| 1620 } | 1579 } |
| 1621 case kS390_DivFloat: | 1580 case kS390_DivFloat: |
| 1622 // InputDoubleRegister(1)=InputDoubleRegister(0)/InputDoubleRegister(1) | 1581 // InputDoubleRegister(1)=InputDoubleRegister(0)/InputDoubleRegister(1) |
| 1623 if (i.OutputDoubleRegister().is(i.InputDoubleRegister(1))) { | 1582 if (i.OutputDoubleRegister().is(i.InputDoubleRegister(1))) { |
| 1624 __ ldr(kScratchDoubleReg, i.InputDoubleRegister(1)); | 1583 __ ldr(kScratchDoubleReg, i.InputDoubleRegister(1)); |
| 1625 __ ldr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); | 1584 __ ldr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); |
| 1626 __ debr(i.OutputDoubleRegister(), kScratchDoubleReg); | 1585 __ debr(i.OutputDoubleRegister(), kScratchDoubleReg); |
| 1627 } else { | 1586 } else { |
| 1628 if (!i.OutputDoubleRegister().is(i.InputDoubleRegister(0))) | 1587 if (!i.OutputDoubleRegister().is(i.InputDoubleRegister(0))) |
| 1629 __ ldr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); | 1588 __ ldr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); |
| 1630 __ debr(i.OutputDoubleRegister(), i.InputDoubleRegister(1)); | 1589 __ debr(i.OutputDoubleRegister(), i.InputDoubleRegister(1)); |
| 1631 } | 1590 } |
| 1632 break; | 1591 break; |
| 1633 case kS390_DivDouble: | 1592 case kS390_DivDouble: |
| 1634 // InputDoubleRegister(1)=InputDoubleRegister(0)/InputDoubleRegister(1) | 1593 // InputDoubleRegister(1)=InputDoubleRegister(0)/InputDoubleRegister(1) |
| 1635 if (i.OutputDoubleRegister().is(i.InputDoubleRegister(1))) { | 1594 if (i.OutputDoubleRegister().is(i.InputDoubleRegister(1))) { |
| 1636 __ ldr(kScratchDoubleReg, i.InputDoubleRegister(1)); | 1595 __ ldr(kScratchDoubleReg, i.InputDoubleRegister(1)); |
| 1637 __ ldr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); | 1596 __ ldr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); |
| 1638 __ ddbr(i.OutputDoubleRegister(), kScratchDoubleReg); | 1597 __ ddbr(i.OutputDoubleRegister(), kScratchDoubleReg); |
| 1639 } else { | 1598 } else { |
| 1640 if (!i.OutputDoubleRegister().is(i.InputDoubleRegister(0))) | 1599 if (!i.OutputDoubleRegister().is(i.InputDoubleRegister(0))) |
| 1641 __ ldr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); | 1600 __ ldr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); |
| 1642 __ ddbr(i.OutputDoubleRegister(), i.InputDoubleRegister(1)); | 1601 __ ddbr(i.OutputDoubleRegister(), i.InputDoubleRegister(1)); |
| 1643 } | 1602 } |
| 1644 break; | 1603 break; |
| 1645 case kS390_Mod32: | 1604 case kS390_Mod32: |
| 1646 ASSEMBLE_MODULO(dr, srda); | 1605 ASSEMBLE_BIN_OP(Mod32, Mod32, Mod32); |
| 1647 break; | 1606 break; |
| 1648 case kS390_ModU32: | 1607 case kS390_ModU32: |
| 1649 ASSEMBLE_MODULO(dlr, srdl); | 1608 ASSEMBLE_BIN_OP(ModU32, ModU32, ModU32); |
| 1650 break; | 1609 break; |
| 1651 #if V8_TARGET_ARCH_S390X | 1610 #if V8_TARGET_ARCH_S390X |
| 1652 case kS390_Mod64: | 1611 case kS390_Mod64: |
| 1653 __ LoadRR(r1, i.InputRegister(0)); | 1612 __ LoadRR(r1, i.InputRegister(0)); |
| 1654 __ dsgr(r0, i.InputRegister(1)); // R1: Dividend | 1613 __ dsgr(r0, i.InputRegister(1)); // R1: Dividend |
| 1655 __ ltgr(i.OutputRegister(), r0); // Copy R0: Remainder to output | 1614 __ ltgr(i.OutputRegister(), r0); // Copy R0: Remainder to output |
| 1656 break; | 1615 break; |
| 1657 case kS390_ModU64: | 1616 case kS390_ModU64: |
| 1658 __ LoadRR(r1, i.InputRegister(0)); | 1617 __ LoadRR(r1, i.InputRegister(0)); |
| 1659 __ LoadImmP(r0, Operand::Zero()); | 1618 __ LoadImmP(r0, Operand::Zero()); |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1792 break; | 1751 break; |
| 1793 case kS390_NegFloat: | 1752 case kS390_NegFloat: |
| 1794 ASSEMBLE_FLOAT_UNOP(lcebr); | 1753 ASSEMBLE_FLOAT_UNOP(lcebr); |
| 1795 break; | 1754 break; |
| 1796 case kS390_NegDouble: | 1755 case kS390_NegDouble: |
| 1797 ASSEMBLE_FLOAT_UNOP(lcdbr); | 1756 ASSEMBLE_FLOAT_UNOP(lcdbr); |
| 1798 break; | 1757 break; |
| 1799 case kS390_Cntlz32: { | 1758 case kS390_Cntlz32: { |
| 1800 __ llgfr(i.OutputRegister(), i.InputRegister(0)); | 1759 __ llgfr(i.OutputRegister(), i.InputRegister(0)); |
| 1801 __ flogr(r0, i.OutputRegister()); | 1760 __ flogr(r0, i.OutputRegister()); |
| 1802 __ LoadRR(i.OutputRegister(), r0); | 1761 __ Add32(i.OutputRegister(), r0, Operand(-32)); |
| 1803 __ SubP(i.OutputRegister(), Operand(32)); | 1762 // No need to zero-ext b/c llgfr is done already |
| 1804 } break; | 1763 break; |
| 1764 } |
| 1805 #if V8_TARGET_ARCH_S390X | 1765 #if V8_TARGET_ARCH_S390X |
| 1806 case kS390_Cntlz64: { | 1766 case kS390_Cntlz64: { |
| 1807 __ flogr(r0, i.InputRegister(0)); | 1767 __ flogr(r0, i.InputRegister(0)); |
| 1808 __ LoadRR(i.OutputRegister(), r0); | 1768 __ LoadRR(i.OutputRegister(), r0); |
| 1809 } break; | 1769 break; |
| 1770 } |
| 1810 #endif | 1771 #endif |
| 1811 case kS390_Popcnt32: | 1772 case kS390_Popcnt32: |
| 1812 __ Popcnt32(i.OutputRegister(), i.InputRegister(0)); | 1773 __ Popcnt32(i.OutputRegister(), i.InputRegister(0)); |
| 1813 break; | 1774 break; |
| 1814 #if V8_TARGET_ARCH_S390X | 1775 #if V8_TARGET_ARCH_S390X |
| 1815 case kS390_Popcnt64: | 1776 case kS390_Popcnt64: |
| 1816 __ Popcnt64(i.OutputRegister(), i.InputRegister(0)); | 1777 __ Popcnt64(i.OutputRegister(), i.InputRegister(0)); |
| 1817 break; | 1778 break; |
| 1818 #endif | 1779 #endif |
| 1819 case kS390_Cmp32: | 1780 case kS390_Cmp32: |
| (...skipping 905 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2725 padding_size -= 2; | 2686 padding_size -= 2; |
| 2726 } | 2687 } |
| 2727 } | 2688 } |
| 2728 } | 2689 } |
| 2729 | 2690 |
| 2730 #undef __ | 2691 #undef __ |
| 2731 | 2692 |
| 2732 } // namespace compiler | 2693 } // namespace compiler |
| 2733 } // namespace internal | 2694 } // namespace internal |
| 2734 } // namespace v8 | 2695 } // namespace v8 |
| OLD | NEW |