15#ifndef LLVM_MC_MCREGISTERINFO_H
16#define LLVM_MC_MCREGISTERINFO_H
75 unsigned RegNo =
Reg.id();
76 unsigned InByte = RegNo % 8;
77 unsigned Byte = RegNo / 8;
80 return (
RegSet[Byte] & (1 << InByte)) != 0;
170 unsigned NumRegUnits;
172 const int16_t *DiffLists;
175 const char *RegStrings;
176 const char *RegClassStrings;
179 unsigned NumSubRegIndices;
183 unsigned L2DwarfRegsSize;
184 unsigned EHL2DwarfRegsSize;
185 unsigned Dwarf2LRegsSize;
186 unsigned EHDwarf2LRegsSize;
187 const DwarfLLVMRegPair *L2DwarfRegs;
188 const DwarfLLVMRegPair *EHL2DwarfRegs;
189 const DwarfLLVMRegPair *Dwarf2LRegs;
190 const DwarfLLVMRegPair *EHDwarf2LRegs;
194 mutable std::vector<std::vector<MCPhysReg>> RegAliasesCache;
199 class DiffListIterator
203 const int16_t *
List =
nullptr;
208 DiffListIterator() =
default;
211 void init(
unsigned InitVal,
const int16_t *DiffList) {
217 bool isValid()
const {
return List; }
220 const unsigned &
operator*()
const {
return Val; }
222 using DiffListIterator::iterator_facade_base::operator++;
224 DiffListIterator &operator++() {
234 bool operator==(
const DiffListIterator &Other)
const {
242 iterator_range<MCSubRegIterator> subregs(MCRegister
Reg)
const;
246 iterator_range<MCSubRegIterator> subregs_inclusive(MCRegister
Reg)
const;
250 iterator_range<MCSuperRegIterator> superregs(MCRegister
Reg)
const;
254 iterator_range<MCSuperRegIterator> superregs_inclusive(MCRegister
Reg)
const;
258 detail::concat_range<const MCPhysReg, iterator_range<MCSubRegIterator>,
259 iterator_range<MCSuperRegIterator>>
260 sub_and_superregs_inclusive(MCRegister
Reg)
const;
263 iterator_range<MCRegUnitIterator> regunits(MCRegister
Reg)
const;
281 const MCPhysReg (*RURoots)[2],
unsigned NRU,
283 const char *Strings,
const char *ClassStrings,
284 const uint16_t *SubIndices,
unsigned NumIndices,
292 RegUnitMaskSequences = RUMS;
293 RegStrings = Strings;
294 RegClassStrings = ClassStrings;
296 RegUnitRoots = RURoots;
298 SubRegIndices = SubIndices;
299 NumSubRegIndices = NumIndices;
300 RegEncodingTable = RET;
303 EHL2DwarfRegs =
nullptr;
304 EHL2DwarfRegsSize = 0;
305 L2DwarfRegs =
nullptr;
307 EHDwarf2LRegs =
nullptr;
308 EHDwarf2LRegsSize = 0;
309 Dwarf2LRegs =
nullptr;
312 RegAliasesCache.resize(NumRegs);
322 EHL2DwarfRegsSize =
Size;
325 L2DwarfRegsSize =
Size;
336 EHDwarf2LRegsSize =
Size;
339 Dwarf2LRegsSize =
Size;
349 L2SEHRegs[LLVMReg] = SEHReg;
353 L2CVRegs[LLVMReg] = CVReg;
369 "Attempting to access record for invalid register number!");
370 return Desc[
Reg.id()];
397 return RegStrings +
get(RegNo).Name;
411 bool isArtificialRegUnit(
MCRegUnit Unit)
const;
423 return NumSubRegIndices;
441 std::optional<MCRegister> getLLVMRegNum(
uint64_t RegNum,
bool isEH)
const;
445 int64_t getDwarfRegNumFromDwarfEHRegNum(
uint64_t RegNum)
const;
453 int getCodeViewRegNum(
MCRegister RegNum)
const;
473 return RegClassStrings + Class->NameIdx;
479 "Attempting to get encoding for invalid register number!");
480 return RegEncodingTable[
Reg.id()];
523 MCRegisterInfo::DiffListIterator,
524 std::forward_iterator_tag, const MCPhysReg> {
533 bool IncludeSelf =
false) {
544 using iterator_adaptor_base::operator++;
564 : SRIter(
Reg, MCRI) {
565 SRIndex = MCRI->SubRegIndices + MCRI->
get(
Reg).SubRegIndices;
579 bool isValid()
const {
return SRIter.isValid(); }
593 MCRegisterInfo::DiffListIterator,
594 std::forward_iterator_tag, const MCPhysReg> {
603 bool IncludeSelf =
false) {
614 using iterator_adaptor_base::operator++;
638 MCRegisterInfo::DiffListIterator,
639 std::forward_iterator_tag, const MCRegUnit> {
641 static constexpr unsigned RegUnitBits = 12;
653 unsigned FirstRU = RU & ((1u << RegUnitBits) - 1);
654 unsigned Offset = RU >> RegUnitBits;
655 I.init(FirstRU, MCRI->DiffLists +
Offset);
661 using iterator_adaptor_base::operator++;
684 : RUIter(
Reg, MCRI) {
686 MaskListIter = &MCRI->RegUnitMaskSequences[Idx];
691 return std::make_pair(*RUIter, *MaskListIter);
695 bool isValid()
const {
return RUIter.isValid(); }
723 assert(RegUnit < MCRI->getNumRegUnits() &&
"Invalid register unit");
724 Reg0 = MCRI->RegUnitRoots[RegUnit][0];
725 Reg1 = MCRI->RegUnitRoots[RegUnit][1];
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
This file defines the DenseMap class.
A common definition of LaneBitmask for use in TableGen and CodeGen.
bool operator==(const MergedFunctionsInfo &LHS, const MergedFunctionsInfo &RHS)
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
static constexpr MCPhysReg RAReg
static bool isValid(const char C)
Returns true if C is a valid mangled character: <0-9a-zA-Z_>.
SI optimize exec mask operations pre RA
static unsigned getDwarfRegNum(MCRegister Reg, const TargetRegisterInfo *TRI)
Go up the super-register chain until we hit a valid dwarf register number.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
MCRegAliasIterator(MCRegister Reg, const MCRegisterInfo *MCRI, bool IncludeSelf)
MCRegister operator*() const
MCRegAliasIterator & operator++()
const MCRegUnit & operator*() const
MCRegUnitIterator()=default
Constructs an end iterator.
bool isValid() const
Returns true if this iterator is not yet at the end.
MCRegUnitIterator & operator++()
MCRegUnitIterator(MCRegister Reg, const MCRegisterInfo *MCRI)
MCRegUnitMaskIterator()=default
MCRegUnitMaskIterator(MCRegister Reg, const MCRegisterInfo *MCRI)
Constructs an iterator that traverses the register units and their associated LaneMasks in Reg.
MCRegUnitMaskIterator & operator++()
Moves to the next position.
bool isValid() const
Returns true if this iterator is not yet at the end.
std::pair< unsigned, LaneBitmask > operator*() const
Returns a (RegUnit, LaneMask) pair.
MCRegUnitRootIterator()=default
MCRegUnitRootIterator & operator++()
Preincrement to move to the next root register.
unsigned operator*() const
Dereference to get the current root register.
MCRegUnitRootIterator(unsigned RegUnit, const MCRegisterInfo *MCRI)
bool isValid() const
Check if the iterator is at the end of the list.
MCRegisterClass - Base class of TargetRegisterClass.
unsigned getID() const
getID() - Return the register class ID number.
bool isAllocatable() const
isAllocatable - Return true if this register class may be used to create virtual registers.
const MCPhysReg * iterator
MCRegister getRegister(unsigned i) const
getRegister - Return the specified register in the class.
const uint16_t RegSizeInBits
unsigned getSizeInBits() const
Return the size of the physical register in bits if we are able to determine it.
const uint16_t RegSetSize
bool contains(MCRegister Reg1, MCRegister Reg2) const
contains - Return true if both registers are in this class.
unsigned getNumRegs() const
getNumRegs - Return the number of registers in this class.
iterator begin() const
begin/end - Return all of the registers in this class.
bool contains(MCRegister Reg) const
contains - Return true if the specified register is included in this register class.
const uint8_t *const RegSet
bool isBaseClass() const
Return true if this register class has a defined BaseClassOrder.
int getCopyCost() const
getCopyCost - Return the cost of copying a value between two registers in this class.
const MCPhysReg * const_iterator
MCRegisterInfo base class - We assume that the target defines a static array of MCRegisterDesc object...
unsigned getNumSubRegIndices() const
Return the number of sub-register indices understood by the target.
const MCRegisterDesc & operator[](MCRegister Reg) const
bool isSuperRegisterEq(MCRegister RegA, MCRegister RegB) const
Returns true if RegB is a super-register of RegA or if RegB == RegA.
unsigned getNumRegClasses() const
MCRegister getRARegister() const
This method should return the register where the return address can be found.
MCRegister getProgramCounter() const
Return the register which is the program counter.
regclass_iterator regclass_end() const
void mapDwarfRegsToLLVMRegs(const DwarfLLVMRegPair *Map, unsigned Size, bool isEH)
Used to initialize Dwarf register to LLVM register number mapping.
unsigned getNumRegUnits() const
Return the number of (native) register units in the target.
friend class MCRegAliasIterator
const MCRegisterDesc & get(MCRegister Reg) const
Provide a get method, equivalent to [], but more useful with a pointer to this object.
const MCRegisterClass * regclass_iterator
iterator_range< regclass_iterator > regclasses() const
regclass_iterator regclass_begin() const
void mapLLVMRegToCVReg(MCRegister LLVMReg, int CVReg)
iterator_range< MCSuperRegIterator > superregs(MCRegister Reg) const
Return an iterator range over all super-registers of Reg, excluding Reg.
virtual ~MCRegisterInfo()
const char * getName(MCRegister RegNo) const
Return the human-readable symbolic target-specific name for the specified physical register.
void InitMCRegisterInfo(const MCRegisterDesc *D, unsigned NR, unsigned RA, unsigned PC, const MCRegisterClass *C, unsigned NC, const MCPhysReg(*RURoots)[2], unsigned NRU, const int16_t *DL, const LaneBitmask *RUMS, const char *Strings, const char *ClassStrings, const uint16_t *SubIndices, unsigned NumIndices, const uint16_t *RET)
Initialize MCRegisterInfo, called by TableGen auto-generated routines.
const char * getRegClassName(const MCRegisterClass *Class) const
friend class MCSubRegIterator
friend class MCRegUnitRootIterator
uint16_t getEncodingValue(MCRegister Reg) const
Returns the encoding for Reg.
iterator_range< MCSubRegIterator > subregs_inclusive(MCRegister Reg) const
Return an iterator range over all sub-registers of Reg, including Reg.
bool isSuperOrSubRegisterEq(MCRegister RegA, MCRegister RegB) const
Returns true if RegB is a super-register or sub-register of RegA or if RegB == RegA.
bool isSubRegister(MCRegister RegA, MCRegister RegB) const
Returns true if RegB is a sub-register of RegA.
friend class MCSuperRegIterator
iterator_range< MCSubRegIterator > subregs(MCRegister Reg) const
Return an iterator range over all sub-registers of Reg, excluding Reg.
bool isConstant(MCRegister RegNo) const
Returns true if the given register is constant.
friend class MCRegUnitMaskIterator
void mapLLVMRegsToDwarfRegs(const DwarfLLVMRegPair *Map, unsigned Size, bool isEH)
Used to initialize LLVM register to Dwarf register number mapping.
bool isSuperRegister(MCRegister RegA, MCRegister RegB) const
Returns true if RegB is a super-register of RegA.
iterator_range< MCRegUnitIterator > regunits(MCRegister Reg) const
Returns an iterator range over all regunits for Reg.
bool isArtificial(MCRegister RegNo) const
Returns true if the given register is artificial, which means it represents a regunit that is not sep...
bool isSubRegisterEq(MCRegister RegA, MCRegister RegB) const
Returns true if RegB is a sub-register of RegA or if RegB == RegA.
friend class MCRegUnitIterator
void mapLLVMRegToSEHReg(MCRegister LLVMReg, int SEHReg)
mapLLVMRegToSEHReg - Used to initialize LLVM register to SEH register number mapping.
iterator_range< MCSuperRegIterator > superregs_inclusive(MCRegister Reg) const
Return an iterator range over all super-registers of Reg, including Reg.
detail::concat_range< const MCPhysReg, iterator_range< MCSubRegIterator >, iterator_range< MCSuperRegIterator > > sub_and_superregs_inclusive(MCRegister Reg) const
Return an iterator range over all sub- and super-registers of Reg, including Reg.
const MCRegisterClass & getRegClass(unsigned i) const
Returns the register class associated with the enumeration value.
unsigned getNumRegs() const
Return the number of registers this target has (useful for sizing arrays holding per register informa...
friend class MCSubRegIndexIterator
Wrapper class representing physical registers. Should be passed by value.
MCSubRegIndexIterator(MCRegister Reg, const MCRegisterInfo *MCRI)
Constructs an iterator that traverses subregisters and their associated subregister indices.
MCSubRegIndexIterator & operator++()
Moves to the next position.
bool isValid() const
Returns true if this iterator is not yet at the end.
unsigned getSubRegIndex() const
Returns sub-register index of the current sub-register.
MCRegister getSubReg() const
Returns current sub-register.
MCSubRegIterator enumerates all sub-registers of Reg.
const MCPhysReg & operator*() const
MCSubRegIterator & operator++()
bool isValid() const
Returns true if this iterator is not yet at the end.
MCSubRegIterator()=default
Constructs an end iterator.
MCSubRegIterator(MCRegister Reg, const MCRegisterInfo *MCRI, bool IncludeSelf=false)
MCSuperRegIterator enumerates all super-registers of Reg.
MCSuperRegIterator(MCRegister Reg, const MCRegisterInfo *MCRI, bool IncludeSelf=false)
MCSuperRegIterator & operator++()
const MCPhysReg & operator*() const
MCSuperRegIterator()=default
Constructs an end iterator.
bool isValid() const
Returns true if this iterator is not yet at the end.
Helper to store a sequence of ranges being concatenated and access them.
MCRegisterInfo::DiffListIterator I
iterator_adaptor_base()=default
CRTP base class which implements the entire standard iterator facade in terms of a minimal subset of ...
A range adaptor for a pair of iterators.
This provides a very simple, boring adaptor for a begin and end iterator into a range type.
@ C
The default llvm calling convention, compatible with C.
This is an optimization pass for GlobalISel generic memory operations.
APInt operator*(APInt a, uint64_t RHS)
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
detail::concat_range< ValueT, RangeTs... > concat(RangeTs &&...Ranges)
Returns a concatenated range across two or more ranges.
unsigned MCRegUnit
Register units are used to compute register aliasing.
iterator_range(Container &&) -> iterator_range< llvm::detail::IterOfRange< Container > >
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
MCRegisterDesc - This record contains information about a particular register.
uint16_t RegUnitLaneMasks
Index into list with lane mask sequences.
DwarfLLVMRegPair - Emitted by tablegen so Dwarf<->LLVM reg mappings can be performed with a binary se...
bool operator<(DwarfLLVMRegPair RHS) const