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

Side by Side Diff: src/IceTargetLoweringMIPS32.cpp

Issue 2432373002: [SubZero] Fix f64 to/from i64 moves (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Addressed review comments Created 4 years, 1 month 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 | « pydir/crosstest.py ('k') | tests_lit/llvm2ice_tests/bitcast.ll » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // 1 //
2 // The Subzero Code Generator 2 // The Subzero Code Generator
3 // 3 //
4 // This file is distributed under the University of Illinois Open Source 4 // This file is distributed under the University of Illinois Open Source
5 // License. See LICENSE.TXT for details. 5 // License. See LICENSE.TXT for details.
6 // 6 //
7 //===----------------------------------------------------------------------===// 7 //===----------------------------------------------------------------------===//
8 /// 8 ///
9 /// \file 9 /// \file
10 /// \brief Implements the TargetLoweringMIPS32 class, which consists almost 10 /// \brief Implements the TargetLoweringMIPS32 class, which consists almost
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
108 108
109 void TargetMIPS32::assignVarStackSlots(VarList &SortedSpilledVariables, 109 void TargetMIPS32::assignVarStackSlots(VarList &SortedSpilledVariables,
110 size_t SpillAreaPaddingBytes, 110 size_t SpillAreaPaddingBytes,
111 size_t SpillAreaSizeBytes, 111 size_t SpillAreaSizeBytes,
112 size_t GlobalsAndSubsequentPaddingSize) { 112 size_t GlobalsAndSubsequentPaddingSize) {
113 const VariablesMetadata *VMetadata = Func->getVMetadata(); 113 const VariablesMetadata *VMetadata = Func->getVMetadata();
114 size_t GlobalsSpaceUsed = SpillAreaPaddingBytes; 114 size_t GlobalsSpaceUsed = SpillAreaPaddingBytes;
115 size_t NextStackOffset = SpillAreaPaddingBytes; 115 size_t NextStackOffset = SpillAreaPaddingBytes;
116 CfgVector<size_t> LocalsSize(Func->getNumNodes()); 116 CfgVector<size_t> LocalsSize(Func->getNumNodes());
117 const bool SimpleCoalescing = !callsReturnsTwice(); 117 const bool SimpleCoalescing = !callsReturnsTwice();
118
119 for (Variable *Var : SortedSpilledVariables) { 118 for (Variable *Var : SortedSpilledVariables) {
120 size_t Increment = typeWidthInBytesOnStack(Var->getType()); 119 size_t Increment = typeWidthInBytesOnStack(Var->getType());
121 if (SimpleCoalescing && VMetadata->isTracked(Var)) { 120 if (SimpleCoalescing && VMetadata->isTracked(Var)) {
122 if (VMetadata->isMultiBlock(Var)) { 121 if (VMetadata->isMultiBlock(Var)) {
123 GlobalsSpaceUsed += Increment; 122 GlobalsSpaceUsed += Increment;
124 NextStackOffset = GlobalsSpaceUsed; 123 NextStackOffset = GlobalsSpaceUsed;
125 } else { 124 } else {
126 SizeT NodeIndex = VMetadata->getLocalUseNode(Var)->getIndex(); 125 SizeT NodeIndex = VMetadata->getLocalUseNode(Var)->getIndex();
127 LocalsSize[NodeIndex] += Increment; 126 LocalsSize[NodeIndex] += Increment;
128 NextStackOffset = SpillAreaPaddingBytes + 127 NextStackOffset = SpillAreaPaddingBytes +
(...skipping 1605 matching lines...) Expand 10 before | Expand all | Expand 10 after
1734 } else { 1733 } else {
1735 // Split it into two mtc1 instructions 1734 // Split it into two mtc1 instructions
1736 if (MovInstr->getSrcSize() == 2) { 1735 if (MovInstr->getSrcSize() == 2) {
1737 const auto FirstReg = 1736 const auto FirstReg =
1738 (llvm::cast<Variable>(MovInstr->getSrc(0)))->getRegNum(); 1737 (llvm::cast<Variable>(MovInstr->getSrc(0)))->getRegNum();
1739 const auto SecondReg = 1738 const auto SecondReg =
1740 (llvm::cast<Variable>(MovInstr->getSrc(1)))->getRegNum(); 1739 (llvm::cast<Variable>(MovInstr->getSrc(1)))->getRegNum();
1741 SrcGPRHi = Target->makeReg(IceType_i32, FirstReg); 1740 SrcGPRHi = Target->makeReg(IceType_i32, FirstReg);
1742 SrcGPRLo = Target->makeReg(IceType_i32, SecondReg); 1741 SrcGPRLo = Target->makeReg(IceType_i32, SecondReg);
1743 } else { 1742 } else {
1743 SrcGPRLo = Target->makeReg(
1744 IceType_i32, RegMIPS32::get64PairFirstRegNum(SRegNum));
1744 SrcGPRHi = Target->makeReg( 1745 SrcGPRHi = Target->makeReg(
1745 IceType_i32, RegMIPS32::get64PairFirstRegNum(SRegNum));
1746 SrcGPRLo = Target->makeReg(
1747 IceType_i32, RegMIPS32::get64PairSecondRegNum(SRegNum)); 1746 IceType_i32, RegMIPS32::get64PairSecondRegNum(SRegNum));
1748 } 1747 }
1749 } 1748 }
1750 Variable *DstFPRHi = Target->makeReg( 1749 Variable *DstFPRHi = Target->makeReg(
1751 IceType_f32, RegMIPS32::get64PairFirstRegNum(DRegNum)); 1750 IceType_f32, RegMIPS32::get64PairFirstRegNum(DRegNum));
1752 Variable *DstFPRLo = Target->makeReg( 1751 Variable *DstFPRLo = Target->makeReg(
1753 IceType_f32, RegMIPS32::get64PairSecondRegNum(DRegNum)); 1752 IceType_f32, RegMIPS32::get64PairSecondRegNum(DRegNum));
1754 Target->_mov(DstFPRHi, SrcGPRLo); 1753 Target->_mov(DstFPRHi, SrcGPRLo);
1755 Target->_mov(DstFPRLo, SrcGPRHi); 1754 Target->_mov(DstFPRLo, SrcGPRHi);
1756 Legalized = true; 1755 Legalized = true;
(...skipping 11 matching lines...) Expand all
1768 } 1767 }
1769 MovInstr->setDeleted(); 1768 MovInstr->setDeleted();
1770 return; 1769 return;
1771 } 1770 }
1772 } 1771 }
1773 1772
1774 if (!Dest->hasReg()) { 1773 if (!Dest->hasReg()) {
1775 auto *SrcR = llvm::cast<Variable>(Src); 1774 auto *SrcR = llvm::cast<Variable>(Src);
1776 assert(SrcR->hasReg()); 1775 assert(SrcR->hasReg());
1777 assert(!SrcR->isRematerializable()); 1776 assert(!SrcR->isRematerializable());
1778 int32_t Offset = 0; 1777 int32_t Offset = Dest->getStackOffset();
1779
1780 if (MovInstr->getDestHi() != nullptr)
1781 Offset = MovInstr->getDestHi()->getStackOffset();
1782 else
1783 Offset = Dest->getStackOffset();
1784 1778
1785 // This is a _mov(Mem(), Variable), i.e., a store. 1779 // This is a _mov(Mem(), Variable), i.e., a store.
1786 auto *Base = Target->getPhysicalRegister(Target->getFrameOrStackReg()); 1780 auto *Base = Target->getPhysicalRegister(Target->getFrameOrStackReg());
1787 1781
1788 OperandMIPS32Mem *Addr = OperandMIPS32Mem::create( 1782 OperandMIPS32Mem *TAddr = OperandMIPS32Mem::create(
1789 Target->Func, DestTy, Base, 1783 Target->Func, DestTy, Base,
1790 llvm::cast<ConstantInteger32>(Target->Ctx->getConstantInt32(Offset))); 1784 llvm::cast<ConstantInteger32>(Target->Ctx->getConstantInt32(Offset)));
1785 OperandMIPS32Mem *TAddrHi = OperandMIPS32Mem::create(
1786 Target->Func, DestTy, Base,
1787 llvm::cast<ConstantInteger32>(
1788 Target->Ctx->getConstantInt32(Offset + 4)));
1789 OperandMIPS32Mem *Addr = legalizeMemOperand(TAddr);
1791 1790
1792 // FP arguments are passed in GP reg if first argument is in GP. In this 1791 // FP arguments are passed in GP reg if first argument is in GP. In this
1793 // case type of the SrcR is still FP thus we need to explicitly generate sw 1792 // case type of the SrcR is still FP thus we need to explicitly generate sw
1794 // instead of swc1. 1793 // instead of swc1.
1795 const RegNumT RegNum = SrcR->getRegNum(); 1794 const RegNumT RegNum = SrcR->getRegNum();
1796 const bool IsSrcGPReg = RegMIPS32::isGPRReg(SrcR->getRegNum()); 1795 const bool IsSrcGPReg = RegMIPS32::isGPRReg(SrcR->getRegNum());
1797 if (SrcTy == IceType_f32 && IsSrcGPReg) { 1796 if (SrcTy == IceType_f32 && IsSrcGPReg) {
1798 Variable *SrcGPR = Target->makeReg(IceType_i32, RegNum); 1797 Variable *SrcGPR = Target->makeReg(IceType_i32, RegNum);
1799 Target->_sw(SrcGPR, Addr); 1798 Target->_sw(SrcGPR, Addr);
1800 } else if (SrcTy == IceType_f64 && IsSrcGPReg) { 1799 } else if (SrcTy == IceType_f64 && IsSrcGPReg) {
1801 Variable *SrcGPRHi = 1800 Variable *SrcGPRHi =
1802 Target->makeReg(IceType_i32, RegMIPS32::get64PairFirstRegNum(RegNum)); 1801 Target->makeReg(IceType_i32, RegMIPS32::get64PairFirstRegNum(RegNum));
1803 Variable *SrcGPRLo = Target->makeReg( 1802 Variable *SrcGPRLo = Target->makeReg(
1804 IceType_i32, RegMIPS32::get64PairSecondRegNum(RegNum)); 1803 IceType_i32, RegMIPS32::get64PairSecondRegNum(RegNum));
1805 OperandMIPS32Mem *AddrHi = OperandMIPS32Mem::create( 1804 Target->_sw(SrcGPRHi, Addr);
1806 Target->Func, DestTy, Base, 1805 OperandMIPS32Mem *AddrHi = legalizeMemOperand(TAddrHi);
1807 llvm::cast<ConstantInteger32>( 1806 Target->_sw(SrcGPRLo, AddrHi);
1808 Target->Ctx->getConstantInt32(Offset + 4)));
1809 Target->_sw(SrcGPRLo, Addr);
1810 Target->_sw(SrcGPRHi, AddrHi);
1811 } else if (DestTy == IceType_f64 && IsSrcGPReg) { 1807 } else if (DestTy == IceType_f64 && IsSrcGPReg) {
1812 const auto FirstReg = 1808 const auto FirstReg =
1813 (llvm::cast<Variable>(MovInstr->getSrc(0)))->getRegNum(); 1809 (llvm::cast<Variable>(MovInstr->getSrc(0)))->getRegNum();
1814 const auto SecondReg = 1810 const auto SecondReg =
1815 (llvm::cast<Variable>(MovInstr->getSrc(1)))->getRegNum(); 1811 (llvm::cast<Variable>(MovInstr->getSrc(1)))->getRegNum();
1816 Variable *SrcGPRHi = Target->makeReg(IceType_i32, SecondReg); 1812 Variable *SrcGPRHi = Target->makeReg(IceType_i32, FirstReg);
1817 Variable *SrcGPRLo = Target->makeReg(IceType_i32, FirstReg); 1813 Variable *SrcGPRLo = Target->makeReg(IceType_i32, SecondReg);
1818 OperandMIPS32Mem *AddrHi = OperandMIPS32Mem::create(
1819 Target->Func, DestTy, Base,
1820 llvm::cast<ConstantInteger32>(
1821 Target->Ctx->getConstantInt32(Offset + 4)));
1822 Target->_sw(SrcGPRLo, Addr); 1814 Target->_sw(SrcGPRLo, Addr);
1815 OperandMIPS32Mem *AddrHi = legalizeMemOperand(TAddrHi);
1823 Target->_sw(SrcGPRHi, AddrHi); 1816 Target->_sw(SrcGPRHi, AddrHi);
1824 } else { 1817 } else {
1825 Target->_sw(SrcR, Addr); 1818 Target->_sw(SrcR, Addr);
1826 } 1819 }
1827 1820
1828 Target->Context.insert<InstFakeDef>(Dest); 1821 Target->Context.insert<InstFakeDef>(Dest);
1829 Legalized = true; 1822 Legalized = true;
1830 } else if (auto *Var = llvm::dyn_cast<Variable>(Src)) { 1823 } else if (auto *Var = llvm::dyn_cast<Variable>(Src)) {
1831 if (Var->isRematerializable()) { 1824 if (Var->isRematerializable()) {
1832 // This is equivalent to an x86 _lea(RematOffset(%esp/%ebp), Variable). 1825 // This is equivalent to an x86 _lea(RematOffset(%esp/%ebp), Variable).
1833 1826
1834 // ExtraOffset is only needed for stack-pointer based frames as we have 1827 // ExtraOffset is only needed for stack-pointer based frames as we have
1835 // to account for spill storage. 1828 // to account for spill storage.
1836 const int32_t ExtraOffset = (Var->getRegNum() == Target->getStackReg()) 1829 const int32_t ExtraOffset = (Var->getRegNum() == Target->getStackReg())
1837 ? Target->getFrameFixedAllocaOffset() 1830 ? Target->getFrameFixedAllocaOffset()
1838 : 0; 1831 : 0;
1839 1832
1840 const int32_t Offset = Var->getStackOffset() + ExtraOffset; 1833 const int32_t Offset = Var->getStackOffset() + ExtraOffset;
1841 Variable *Base = Target->getPhysicalRegister(Var->getRegNum()); 1834 Variable *Base = Target->getPhysicalRegister(Var->getRegNum());
1842 Variable *T = newBaseRegister(Base, Offset, Dest->getRegNum()); 1835 Variable *T = newBaseRegister(Base, Offset, Dest->getRegNum());
1843 Target->_mov(Dest, T); 1836 Target->_mov(Dest, T);
1844 Legalized = true; 1837 Legalized = true;
1845 } else { 1838 } else {
1846 if (!Var->hasReg()) { 1839 if (!Var->hasReg()) {
1847 // This is a _mov(Variable, Mem()), i.e., a load. 1840 // This is a _mov(Variable, Mem()), i.e., a load.
1848 const int32_t Offset = Var->getStackOffset(); 1841 const int32_t Offset = Var->getStackOffset();
1849 auto *Base = Target->getPhysicalRegister(Target->getFrameOrStackReg()); 1842 auto *Base = Target->getPhysicalRegister(Target->getFrameOrStackReg());
1850 OperandMIPS32Mem *Addr; 1843 const RegNumT RegNum = Dest->getRegNum();
1851 Addr = OperandMIPS32Mem::create( 1844 const bool IsDstGPReg = RegMIPS32::isGPRReg(Dest->getRegNum());
1852 Target->Func, DestTy, Base, 1845 // If we are moving i64 to a double using stack then the address may
1853 llvm::cast<ConstantInteger32>( 1846 // not be aligned to 8-byte boundary as we split i64 into Hi-Lo parts
1854 Target->Ctx->getConstantInt32(Offset))); 1847 // and store them individually with 4-byte alignment. Load the Hi-Lo
1855 Target->_lw(Dest, Addr); 1848 // parts in TmpReg and move them to the dest using mtc1.
1849 if (DestTy == IceType_f64 && !Utils::IsAligned(Offset, 8)
1850 && !IsDstGPReg) {
1851 auto *Reg = Target->makeReg(IceType_i32, Target->getReservedTmpReg());
1852 const RegNumT RegNum = Dest->getRegNum();
1853 Variable *DestLo = Target->makeReg(
1854 IceType_f32, RegMIPS32::get64PairFirstRegNum(RegNum));
1855 Variable *DestHi = Target->makeReg(
1856 IceType_f32, RegMIPS32::get64PairSecondRegNum(RegNum));
1857 OperandMIPS32Mem *AddrLo = OperandMIPS32Mem::create(
1858 Target->Func, IceType_i32, Base,
1859 llvm::cast<ConstantInteger32>(
1860 Target->Ctx->getConstantInt32(Offset)));
1861 OperandMIPS32Mem *AddrHi = OperandMIPS32Mem::create(
1862 Target->Func, IceType_i32, Base,
1863 llvm::cast<ConstantInteger32>(
1864 Target->Ctx->getConstantInt32(Offset + 4)));
1865 Target->_lw(Reg, AddrLo);
1866 Target->_mov(DestLo, Reg);
1867 Target->_lw(Reg, AddrHi);
1868 Target->_mov(DestHi, Reg);
1869 } else {
1870 OperandMIPS32Mem *TAddr = OperandMIPS32Mem::create(
1871 Target->Func, DestTy, Base, llvm::cast<ConstantInteger32>(
1872 Target->Ctx->getConstantInt32(Offset)));
1873 OperandMIPS32Mem *Addr = legalizeMemOperand(TAddr);
1874 OperandMIPS32Mem *TAddrHi = OperandMIPS32Mem::create(
1875 Target->Func, DestTy, Base, llvm::cast<ConstantInteger32>(
1876 Target->Ctx->getConstantInt32(Offset + 4)));
1877 // FP arguments are passed in GP reg if first argument is in GP.
1878 // In this case type of the Dest is still FP thus we need to
1879 // explicitly generate lw instead of lwc1.
1880 if (DestTy == IceType_f32 && IsDstGPReg) {
1881 Variable *DstGPR = Target->makeReg(IceType_i32, RegNum);
1882 Target->_lw(DstGPR, Addr);
1883 } else if (DestTy == IceType_f64 && IsDstGPReg) {
1884 Variable *DstGPRHi = Target->makeReg(
1885 IceType_i32, RegMIPS32::get64PairFirstRegNum(RegNum));
1886 Variable *DstGPRLo = Target->makeReg(
1887 IceType_i32, RegMIPS32::get64PairSecondRegNum(RegNum));
1888 Target->_lw(DstGPRHi, Addr);
1889 OperandMIPS32Mem *AddrHi = legalizeMemOperand(TAddrHi);
1890 Target->_lw(DstGPRLo, AddrHi);
1891 } else if (DestTy == IceType_f64 && IsDstGPReg) {
1892 const auto FirstReg =
1893 (llvm::cast<Variable>(MovInstr->getSrc(0)))->getRegNum();
1894 const auto SecondReg =
1895 (llvm::cast<Variable>(MovInstr->getSrc(1)))->getRegNum();
1896 Variable *DstGPRHi = Target->makeReg(IceType_i32, FirstReg);
1897 Variable *DstGPRLo = Target->makeReg(IceType_i32, SecondReg);
1898 Target->_lw(DstGPRLo, Addr);
1899 OperandMIPS32Mem *AddrHi = legalizeMemOperand(TAddrHi);
1900 Target->_lw(DstGPRHi, AddrHi);
1901 } else {
1902 Target->_lw(Dest, Addr);
1903 }
1904 }
1856 Legalized = true; 1905 Legalized = true;
1857 } 1906 }
1858 } 1907 }
1859 } 1908 }
1860 1909
1861 if (Legalized) { 1910 if (Legalized) {
1862 if (MovInstr->isDestRedefined()) { 1911 if (MovInstr->isDestRedefined()) {
1863 Target->_set_dest_redefined(); 1912 Target->_set_dest_redefined();
1864 } 1913 }
1865 MovInstr->setDeleted(); 1914 MovInstr->setDeleted();
(...skipping 663 matching lines...) Expand 10 before | Expand all | Expand 10 after
2529 _mul(T, Src0R, Src1R); 2578 _mul(T, Src0R, Src1R);
2530 _mov(Dest, T); 2579 _mov(Dest, T);
2531 return; 2580 return;
2532 } 2581 }
2533 case InstArithmetic::Shl: { 2582 case InstArithmetic::Shl: {
2534 _sllv(T, Src0R, Src1R); 2583 _sllv(T, Src0R, Src1R);
2535 _mov(Dest, T); 2584 _mov(Dest, T);
2536 return; 2585 return;
2537 } 2586 }
2538 case InstArithmetic::Lshr: { 2587 case InstArithmetic::Lshr: {
2539 _srlv(T, Src0R, Src1R); 2588 auto *T0R = Src0R;
2589 auto *T1R = Src1R;
2590 if (Dest->getType() != IceType_i32) {
2591 T0R = makeReg(IceType_i32);
2592 lowerCast(InstCast::create(Func, InstCast::Zext, T0R, Src0R));
2593 T1R = makeReg(IceType_i32);
2594 lowerCast(InstCast::create(Func, InstCast::Zext, T1R, Src1R));
2595 }
2596 _srlv(T, T0R, T1R);
2540 _mov(Dest, T); 2597 _mov(Dest, T);
2541 return; 2598 return;
2542 } 2599 }
2543 case InstArithmetic::Ashr: { 2600 case InstArithmetic::Ashr: {
2544 _srav(T, Src0R, Src1R); 2601 _srav(T, Src0R, Src1R);
2545 _mov(Dest, T); 2602 _mov(Dest, T);
2546 return; 2603 return;
2547 } 2604 }
2548 case InstArithmetic::Udiv: { 2605 case InstArithmetic::Udiv: {
2549 auto *T_Zero = I32Reg(RegMIPS32::Reg_ZERO); 2606 auto *T_Zero = I32Reg(RegMIPS32::Reg_ZERO);
2550 _divu(T_Zero, Src0R, Src1R); 2607 auto *T0R = Src0R;
2551 _teq(Src1R, T_Zero, DivideByZeroTrapCode); // Trap if divide-by-zero 2608 auto *T1R = Src1R;
2609 if (Dest->getType() != IceType_i32) {
2610 T0R = makeReg(IceType_i32);
2611 lowerCast(InstCast::create(Func, InstCast::Zext, T0R, Src0R));
2612 T1R = makeReg(IceType_i32);
2613 lowerCast(InstCast::create(Func, InstCast::Zext, T1R, Src1R));
2614 }
2615 _divu(T_Zero, T0R, T1R);
2616 _teq(T1R, T_Zero, DivideByZeroTrapCode); // Trap if divide-by-zero
2552 _mflo(T, T_Zero); 2617 _mflo(T, T_Zero);
2553 _mov(Dest, T); 2618 _mov(Dest, T);
2554 return; 2619 return;
2555 } 2620 }
2556 case InstArithmetic::Sdiv: { 2621 case InstArithmetic::Sdiv: {
2557 auto *T_Zero = I32Reg(RegMIPS32::Reg_ZERO); 2622 auto *T_Zero = I32Reg(RegMIPS32::Reg_ZERO);
2558 _div(T_Zero, Src0R, Src1R); 2623 _div(T_Zero, Src0R, Src1R);
2559 _teq(Src1R, T_Zero, DivideByZeroTrapCode); // Trap if divide-by-zero 2624 _teq(Src1R, T_Zero, DivideByZeroTrapCode); // Trap if divide-by-zero
2560 _mflo(T, T_Zero); 2625 _mflo(T, T_Zero);
2561 _mov(Dest, T); 2626 _mov(Dest, T);
2562 return; 2627 return;
2563 } 2628 }
2564 case InstArithmetic::Urem: { 2629 case InstArithmetic::Urem: {
2565 auto *T_Zero = I32Reg(RegMIPS32::Reg_ZERO); 2630 auto *T_Zero = I32Reg(RegMIPS32::Reg_ZERO);
2566 _divu(T_Zero, Src0R, Src1R); 2631 auto *T0R = Src0R;
2567 _teq(Src1R, T_Zero, DivideByZeroTrapCode); // Trap if divide-by-zero 2632 auto *T1R = Src1R;
2633 if (Dest->getType() != IceType_i32) {
2634 T0R = makeReg(IceType_i32);
2635 lowerCast(InstCast::create(Func, InstCast::Zext, T0R, Src0R));
2636 T1R = makeReg(IceType_i32);
2637 lowerCast(InstCast::create(Func, InstCast::Zext, T1R, Src1R));
2638 }
2639 _divu(T_Zero, T0R, T1R);
2640 _teq(T1R, T_Zero, DivideByZeroTrapCode); // Trap if divide-by-zero
2568 _mfhi(T, T_Zero); 2641 _mfhi(T, T_Zero);
2569 _mov(Dest, T); 2642 _mov(Dest, T);
2570 return; 2643 return;
2571 } 2644 }
2572 case InstArithmetic::Srem: { 2645 case InstArithmetic::Srem: {
2573 auto *T_Zero = I32Reg(RegMIPS32::Reg_ZERO); 2646 auto *T_Zero = I32Reg(RegMIPS32::Reg_ZERO);
2574 _div(T_Zero, Src0R, Src1R); 2647 _div(T_Zero, Src0R, Src1R);
2575 _teq(Src1R, T_Zero, DivideByZeroTrapCode); // Trap if divide-by-zero 2648 _teq(Src1R, T_Zero, DivideByZeroTrapCode); // Trap if divide-by-zero
2576 _mfhi(T, T_Zero); 2649 _mfhi(T, T_Zero);
2577 _mov(Dest, T); 2650 _mov(Dest, T);
(...skipping 763 matching lines...) Expand 10 before | Expand all | Expand 10 after
3341 UnimplementedLoweringError(this, Instr); 3414 UnimplementedLoweringError(this, Instr);
3342 break; 3415 break;
3343 } 3416 }
3344 case InstCast::Sitofp: 3417 case InstCast::Sitofp:
3345 case InstCast::Uitofp: { 3418 case InstCast::Uitofp: {
3346 if (llvm::isa<Variable64On32>(Dest)) { 3419 if (llvm::isa<Variable64On32>(Dest)) {
3347 llvm::report_fatal_error("i64-to-fp should have been prelowered."); 3420 llvm::report_fatal_error("i64-to-fp should have been prelowered.");
3348 return; 3421 return;
3349 } 3422 }
3350 if (Src0Ty != IceType_i64) { 3423 if (Src0Ty != IceType_i64) {
3424 Variable *Src0R = legalizeToReg(Src0);
3425 auto *T0R = Src0R;
3426 if (Src0Ty != IceType_i32 && CastKind == InstCast::Uitofp) {
3427 T0R = makeReg(IceType_i32);
3428 lowerCast(InstCast::create(Func, InstCast::Zext, T0R, Src0R));
3429 }
3351 if (isScalarIntegerType(Src0Ty) && DestTy == IceType_f32) { 3430 if (isScalarIntegerType(Src0Ty) && DestTy == IceType_f32) {
3352 Variable *Src0R = legalizeToReg(Src0);
3353 Variable *FTmp1 = makeReg(IceType_f32); 3431 Variable *FTmp1 = makeReg(IceType_f32);
3354 Variable *FTmp2 = makeReg(IceType_f32); 3432 Variable *FTmp2 = makeReg(IceType_f32);
3355 _mtc1(FTmp1, Src0R); 3433 _mtc1(FTmp1, T0R);
3356 _cvt_s_w(FTmp2, FTmp1); 3434 _cvt_s_w(FTmp2, FTmp1);
3357 _mov(Dest, FTmp2); 3435 _mov(Dest, FTmp2);
3358 return; 3436 return;
3359 } 3437 }
3360 if (isScalarIntegerType(Src0Ty) && DestTy == IceType_f64) { 3438 if (isScalarIntegerType(Src0Ty) && DestTy == IceType_f64) {
3361 Variable *Src0R = legalizeToReg(Src0);
3362 Variable *FTmp1 = makeReg(IceType_f64); 3439 Variable *FTmp1 = makeReg(IceType_f64);
3363 Variable *FTmp2 = makeReg(IceType_f64); 3440 Variable *FTmp2 = makeReg(IceType_f64);
3364 _mtc1(FTmp1, Src0R); 3441 _mtc1(FTmp1, T0R);
3365 _cvt_d_w(FTmp2, FTmp1); 3442 _cvt_d_w(FTmp2, FTmp1);
3366 _mov(Dest, FTmp2); 3443 _mov(Dest, FTmp2);
3367 return; 3444 return;
3368 } 3445 }
3369 } 3446 }
3370 UnimplementedLoweringError(this, Instr); 3447 UnimplementedLoweringError(this, Instr);
3371 break; 3448 break;
3372 } 3449 }
3373 case InstCast::Bitcast: { 3450 case InstCast::Bitcast: {
3374 Operand *Src0 = Instr->getSrc(0); 3451 Operand *Src0 = Instr->getSrc(0);
(...skipping 26 matching lines...) Expand all
3401 break; 3478 break;
3402 case IceType_i32: 3479 case IceType_i32:
3403 case IceType_f32: { 3480 case IceType_f32: {
3404 Variable *Src0R = legalizeToReg(Src0); 3481 Variable *Src0R = legalizeToReg(Src0);
3405 _mov(Dest, Src0R); 3482 _mov(Dest, Src0R);
3406 break; 3483 break;
3407 } 3484 }
3408 case IceType_i64: { 3485 case IceType_i64: {
3409 assert(Src0->getType() == IceType_f64); 3486 assert(Src0->getType() == IceType_f64);
3410 Variable *Src0R = legalizeToReg(Src0); 3487 Variable *Src0R = legalizeToReg(Src0);
3411 auto *Dest64 = llvm::cast<Variable64On32>(Dest); 3488 auto *T = llvm::cast<Variable64On32>(Func->makeVariable(IceType_i64));
3412 _mov(Dest64, Src0R); 3489 T->initHiLo(Func);
3490 T->getHi()->setMustHaveReg();
3491 T->getLo()->setMustHaveReg();
3492 _mov(T, Src0R);
3493 lowerAssign(InstAssign::create(Func, Dest, T));
3413 break; 3494 break;
3414 } 3495 }
3415 case IceType_f64: { 3496 case IceType_f64: {
3416 assert(Src0->getType() == IceType_i64); 3497 assert(Src0->getType() == IceType_i64);
3417 const uint32_t Mask = 0xFFFFFFFF; 3498 const uint32_t Mask = 0xFFFFFFFF;
3418 if (auto *C64 = llvm::dyn_cast<ConstantInteger64>(Src0)) { 3499 if (auto *C64 = llvm::dyn_cast<ConstantInteger64>(Src0)) {
3419 Variable *RegHi, *RegLo; 3500 Variable *RegHi, *RegLo;
3420 const uint64_t Value = C64->getValue(); 3501 const uint64_t Value = C64->getValue();
3421 uint64_t Upper32Bits = (Value >> INT32_BITS) & Mask; 3502 uint64_t Upper32Bits = (Value >> INT32_BITS) & Mask;
3422 uint64_t Lower32Bits = Value & Mask; 3503 uint64_t Lower32Bits = Value & Mask;
(...skipping 1811 matching lines...) Expand 10 before | Expand all | Expand 10 after
5234 TargetHeaderMIPS32::TargetHeaderMIPS32(GlobalContext *Ctx) 5315 TargetHeaderMIPS32::TargetHeaderMIPS32(GlobalContext *Ctx)
5235 : TargetHeaderLowering(Ctx) {} 5316 : TargetHeaderLowering(Ctx) {}
5236 5317
5237 void TargetHeaderMIPS32::lower() { 5318 void TargetHeaderMIPS32::lower() {
5238 OstreamLocker L(Ctx); 5319 OstreamLocker L(Ctx);
5239 Ostream &Str = Ctx->getStrEmit(); 5320 Ostream &Str = Ctx->getStrEmit();
5240 Str << "\t.set\t" 5321 Str << "\t.set\t"
5241 << "nomicromips\n"; 5322 << "nomicromips\n";
5242 Str << "\t.set\t" 5323 Str << "\t.set\t"
5243 << "nomips16\n"; 5324 << "nomips16\n";
5325 Str << "\t.set\t"
5326 << "noat\n";
5244 } 5327 }
5245 5328
5246 SmallBitVector TargetMIPS32::TypeToRegisterSet[RCMIPS32_NUM]; 5329 SmallBitVector TargetMIPS32::TypeToRegisterSet[RCMIPS32_NUM];
5247 SmallBitVector TargetMIPS32::TypeToRegisterSetUnfiltered[RCMIPS32_NUM]; 5330 SmallBitVector TargetMIPS32::TypeToRegisterSetUnfiltered[RCMIPS32_NUM];
5248 SmallBitVector TargetMIPS32::RegisterAliases[RegMIPS32::Reg_NUM]; 5331 SmallBitVector TargetMIPS32::RegisterAliases[RegMIPS32::Reg_NUM];
5249 5332
5250 } // end of namespace MIPS32 5333 } // end of namespace MIPS32
5251 } // end of namespace Ice 5334 } // end of namespace Ice
OLDNEW
« no previous file with comments | « pydir/crosstest.py ('k') | tests_lit/llvm2ice_tests/bitcast.ll » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698