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

Side by Side Diff: src/IceTargetLoweringARM32.cpp

Issue 1571433004: Implements include/exclude register lists for translation. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: fix nits. Created 4 years, 11 months 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
OLDNEW
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698