OLD | NEW |
---|---|
1 //===- subzero/src/IceTargetLoweringARM32.cpp - ARM32 lowering ------------===// | 1 //===- subzero/src/IceTargetLoweringARM32.cpp - ARM32 lowering ------------===// |
2 // | 2 // |
3 // The Subzero Code Generator | 3 // The Subzero Code Generator |
4 // | 4 // |
5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
7 // | 7 // |
8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
9 /// | 9 /// |
10 /// \file | 10 /// \file |
(...skipping 1810 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1821 } | 1821 } |
1822 Variable *BaseR = legalizeToReg(Base); | 1822 Variable *BaseR = legalizeToReg(Base); |
1823 return OperandARM32Mem::create(Func, SplitType, BaseR, Offset, | 1823 return OperandARM32Mem::create(Func, SplitType, BaseR, Offset, |
1824 Mem->getAddrMode()); | 1824 Mem->getAddrMode()); |
1825 } | 1825 } |
1826 } | 1826 } |
1827 llvm::report_fatal_error("Unsupported operand type"); | 1827 llvm::report_fatal_error("Unsupported operand type"); |
1828 return nullptr; | 1828 return nullptr; |
1829 } | 1829 } |
1830 | 1830 |
1831 namespace { | |
1832 | |
1833 void applyUseRestrictedRegisters( | |
1834 llvm::SmallBitVector &Registers, | |
1835 const std::unordered_set<std::string> &RestrictedUses) { | |
1836 assert(Registers.size() == RegARM32::Reg_NUM); | |
1837 | |
1838 llvm::SmallBitVector GPKeepRegisters(RegARM32::Reg_NUM); | |
Jim Stichnoth
2016/01/10 16:51:25
I think it might not be too hard to generalize thi
Karl
2016/01/12 23:44:04
Ok. Refactored the code to put this function in Ic
| |
1839 llvm::SmallBitVector NotGPRegisters(RegARM32::Reg_NUM); | |
1840 llvm::SmallBitVector SKeepRegisters(RegARM32::Reg_NUM); | |
1841 llvm::SmallBitVector NotSRegisters(RegARM32::Reg_NUM); | |
1842 llvm::SmallBitVector DKeepRegisters(RegARM32::Reg_NUM); | |
1843 llvm::SmallBitVector NotDRegisters(RegARM32::Reg_NUM); | |
1844 llvm::SmallBitVector VectorKeepRegisters(RegARM32::Reg_NUM); | |
1845 llvm::SmallBitVector NotVectorRegisters(RegARM32::Reg_NUM); | |
Jim Stichnoth
2016/01/10 16:51:25
Do we need IsI64Pair as well? If so, there are so
John
2016/01/11 15:43:26
I64 pairs should probably be turned off by disabli
Karl
2016/01/12 23:44:05
Kept the register pairs, so that all registers can
| |
1846 for (size_t i = 0; i < RegARM32::Reg_NUM; ++i) { | |
1847 const auto &Entry = RegARM32::Table[i]; | |
1848 NotGPRegisters[i] = !Entry.IsGPR; | |
John
2016/01/11 15:43:26
Register pairs are not being handled here at all.
Karl
2016/01/12 23:44:04
Fixed this by adding enum "RegClass" and static me
| |
1849 NotSRegisters[i] = !Entry.IsFP32; | |
1850 NotDRegisters[i] = !Entry.IsFP64; | |
1851 NotVectorRegisters[i] = !Entry.IsVec128; | |
1852 if (RestrictedUses.find(Entry.Name) != RestrictedUses.end()) { | |
1853 GPKeepRegisters[i] = Entry.IsGPR; | |
1854 SKeepRegisters[i] = Entry.IsFP32; | |
1855 DKeepRegisters[i] = Entry.IsFP64; | |
1856 VectorKeepRegisters[i] = Entry.IsVec128; | |
1857 } | |
1858 } | |
1859 if (GPKeepRegisters.any()) { | |
1860 Registers &= NotGPRegisters; | |
1861 Registers |= GPKeepRegisters; | |
1862 } | |
1863 if (SKeepRegisters.any()) { | |
1864 Registers &= NotSRegisters; | |
1865 Registers |= SKeepRegisters; | |
1866 } | |
1867 if (DKeepRegisters.any()) { | |
1868 Registers &= NotDRegisters; | |
1869 Registers |= DKeepRegisters; | |
1870 } | |
1871 if (VectorKeepRegisters.any()) { | |
1872 Registers &= NotVectorRegisters; | |
1873 Registers |= VectorKeepRegisters; | |
1874 } | |
1875 } | |
1876 | |
1877 void applyExcludedRegisters(llvm::SmallBitVector &Registers, | |
John
2016/01/11 15:43:26
pass registers by pointer (i.e., SmallBitVector *)
Karl
2016/01/12 23:44:05
Removed. Now refactored into Ice::TargetLowering::
| |
1878 const std::unordered_set<std::string> Excluded) { | |
Jim Stichnoth
2016/01/10 16:51:26
&Excluded
Karl
2016/01/12 23:44:05
No longer applicable.
| |
1879 for (size_t i = 0; i < RegARM32::Reg_NUM; ++i) { | |
1880 const auto &Entry = RegARM32::Table[i]; | |
1881 if (Excluded.find(Entry.Name) != Excluded.end()) { | |
John
2016/01/11 15:43:26
nit: this is less efficient than
Excluded.count(E
Karl
2016/01/12 23:44:04
Changed code to use method count rather than find.
| |
1882 if (Registers[i]) | |
1883 Registers[i] = 0; | |
Jim Stichnoth
2016/01/10 16:51:25
Registers[i] = false;
Might as well remove the "i
Karl
2016/01/12 23:44:05
Acknowledged.
| |
1884 } | |
1885 } | |
1886 } | |
1887 | |
1888 } // end of anonymous namespace | |
1889 | |
1831 llvm::SmallBitVector TargetARM32::getRegisterSet(RegSetMask Include, | 1890 llvm::SmallBitVector TargetARM32::getRegisterSet(RegSetMask Include, |
1832 RegSetMask Exclude) const { | 1891 RegSetMask Exclude) const { |
1833 llvm::SmallBitVector Registers(RegARM32::Reg_NUM); | 1892 llvm::SmallBitVector Registers(RegARM32::Reg_NUM); |
1834 | 1893 |
1835 for (int i = 0; i < RegARM32::Reg_NUM; ++i) { | 1894 for (size_t i = 0; i < RegARM32::Reg_NUM; ++i) { |
John
2016/01/11 15:43:26
why? just curious...
Karl
2016/01/12 23:44:05
Actually, I probably should have used SizeT. I did
| |
1836 const auto &Entry = RegARM32::Table[i]; | 1895 const auto &Entry = RegARM32::Table[i]; |
1837 if (Entry.Scratch && (Include & RegSet_CallerSave)) | 1896 if (Entry.Scratch && (Include & RegSet_CallerSave)) |
1838 Registers[i] = true; | 1897 Registers[i] = true; |
1839 if (Entry.Preserved && (Include & RegSet_CalleeSave)) | 1898 if (Entry.Preserved && (Include & RegSet_CalleeSave)) |
1840 Registers[i] = true; | 1899 Registers[i] = true; |
1841 if (Entry.StackPtr && (Include & RegSet_StackPointer)) | 1900 if (Entry.StackPtr && (Include & RegSet_StackPointer)) |
1842 Registers[i] = true; | 1901 Registers[i] = true; |
1843 if (Entry.FramePtr && (Include & RegSet_FramePointer)) | 1902 if (Entry.FramePtr && (Include & RegSet_FramePointer)) |
1844 Registers[i] = true; | 1903 Registers[i] = true; |
1845 if (Entry.Scratch && (Exclude & RegSet_CallerSave)) | 1904 if (Entry.Scratch && (Exclude & RegSet_CallerSave)) |
1846 Registers[i] = false; | 1905 Registers[i] = false; |
1847 if (Entry.Preserved && (Exclude & RegSet_CalleeSave)) | 1906 if (Entry.Preserved && (Exclude & RegSet_CalleeSave)) |
1848 Registers[i] = false; | 1907 Registers[i] = false; |
1849 if (Entry.StackPtr && (Exclude & RegSet_StackPointer)) | 1908 if (Entry.StackPtr && (Exclude & RegSet_StackPointer)) |
1850 Registers[i] = false; | 1909 Registers[i] = false; |
1851 if (Entry.FramePtr && (Exclude & RegSet_FramePointer)) | 1910 if (Entry.FramePtr && (Exclude & RegSet_FramePointer)) |
1852 Registers[i] = false; | 1911 Registers[i] = false; |
1853 } | 1912 } |
1854 | 1913 |
1914 const std::unordered_set<std::string> &RestrictedUses = | |
Jim Stichnoth
2016/01/10 16:51:25
A problem with calculating the restrictions here i
John
2016/01/11 15:43:26
s/RestrictedUses/RestrictedRegisters
s/ExcludedUse
Karl
2016/01/12 23:44:05
Factored out into staticInit() that sets static fi
| |
1915 Ctx->getFlags().getUseRestrictedRegisters(); | |
1916 if (!RestrictedUses.empty()) | |
1917 applyUseRestrictedRegisters(Registers, RestrictedUses); | |
1918 | |
1919 const std::unordered_set<std::string> &ExcludedUses = | |
John
2016/01/11 15:43:26
I **really** wish we used `auto' here and above.
Karl
2016/01/12 23:44:05
Acknowledged.
| |
1920 Ctx->getFlags().getExcludedRegisters(); | |
1921 if (!ExcludedUses.empty()) | |
1922 applyExcludedRegisters(Registers, ExcludedUses); | |
1923 | |
1855 return Registers; | 1924 return Registers; |
1856 } | 1925 } |
1857 | 1926 |
1858 void TargetARM32::lowerAlloca(const InstAlloca *Inst) { | 1927 void TargetARM32::lowerAlloca(const InstAlloca *Inst) { |
1859 // Conservatively require the stack to be aligned. Some stack adjustment | 1928 // Conservatively require the stack to be aligned. Some stack adjustment |
1860 // operations implemented below assume that the stack is aligned before the | 1929 // operations implemented below assume that the stack is aligned before the |
1861 // alloca. All the alloca code ensures that the stack alignment is preserved | 1930 // alloca. All the alloca code ensures that the stack alignment is preserved |
1862 // after the alloca. The stack alignment restriction can be relaxed in some | 1931 // after the alloca. The stack alignment restriction can be relaxed in some |
1863 // cases. | 1932 // cases. |
1864 NeedsStackAlignment = true; | 1933 NeedsStackAlignment = true; |
(...skipping 4583 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
6448 // However, for compatibility with current NaCl LLVM, don't claim that. | 6517 // However, for compatibility with current NaCl LLVM, don't claim that. |
6449 Str << ".eabi_attribute 14, 3 @ Tag_ABI_PCS_R9_use: Not used\n"; | 6518 Str << ".eabi_attribute 14, 3 @ Tag_ABI_PCS_R9_use: Not used\n"; |
6450 } | 6519 } |
6451 | 6520 |
6452 llvm::SmallBitVector TargetARM32::TypeToRegisterSet[IceType_NUM]; | 6521 llvm::SmallBitVector TargetARM32::TypeToRegisterSet[IceType_NUM]; |
6453 llvm::SmallBitVector TargetARM32::RegisterAliases[RegARM32::Reg_NUM]; | 6522 llvm::SmallBitVector TargetARM32::RegisterAliases[RegARM32::Reg_NUM]; |
6454 llvm::SmallBitVector TargetARM32::ScratchRegs; | 6523 llvm::SmallBitVector TargetARM32::ScratchRegs; |
6455 | 6524 |
6456 } // end of namespace ARM32 | 6525 } // end of namespace ARM32 |
6457 } // end of namespace Ice | 6526 } // end of namespace Ice |
OLD | NEW |