Chromium Code Reviews| 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 |