MCRegisterInfo.h revision 46c0dc7858da65707340ca62b258f8956def78e8
1a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng//=== MC/MCRegisterInfo.h - Target Register Description ---------*- C++ -*-===// 2a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng// 3a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng// The LLVM Compiler Infrastructure 4a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng// 5a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng// This file is distributed under the University of Illinois Open Source 6a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng// License. See LICENSE.TXT for details. 7a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng// 8a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng//===----------------------------------------------------------------------===// 9a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng// 10a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng// This file describes an abstract interface used to get information about a 11a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng// target machines register file. This information is used for a variety of 12a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng// purposed, especially register allocation. 13a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng// 14a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng//===----------------------------------------------------------------------===// 15a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng 16a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng#ifndef LLVM_MC_MCREGISTERINFO_H 17a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng#define LLVM_MC_MCREGISTERINFO_H 18a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng 190e6a052331f674dd70e28af41f654a7874405eabEvan Cheng#include "llvm/ADT/DenseMap.h" 2050bee42b54cd9aec5f49566307df2b0cf23afcf6Craig Topper#include "llvm/Support/ErrorHandling.h" 21a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng#include <cassert> 22a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng 23a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Chengnamespace llvm { 24a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng 25a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer/// MCRegisterClass - Base class of TargetRegisterClass. 26a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramerclass MCRegisterClass { 27a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramerpublic: 28b6632ba380cf624e60fe16b03d6e21b05dd07724Craig Topper typedef const uint16_t* iterator; 29b6632ba380cf624e60fe16b03d6e21b05dd07724Craig Topper typedef const uint16_t* const_iterator; 3090a468c424f7d0a85b3dc783634106d9a46d6688Benjamin Kramer 31a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer const char *Name; 32f3e3783012dc7875ed37be8aaaefd96f98454781Craig Topper const iterator RegsBegin; 33b6632ba380cf624e60fe16b03d6e21b05dd07724Craig Topper const uint8_t *const RegSet; 34aff18aee5632d8cb5ed7e299df4cb451bf12c834Craig Topper const uint16_t RegsSize; 35aff18aee5632d8cb5ed7e299df4cb451bf12c834Craig Topper const uint16_t RegSetSize; 36aff18aee5632d8cb5ed7e299df4cb451bf12c834Craig Topper const uint16_t ID; 37aff18aee5632d8cb5ed7e299df4cb451bf12c834Craig Topper const uint16_t RegSize, Alignment; // Size & Alignment of register in bytes 3852b89dd303424582d054e18417099f3a7e343b41Craig Topper const int8_t CopyCost; 3952b89dd303424582d054e18417099f3a7e343b41Craig Topper const bool Allocatable; 40a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer 41a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer /// getID() - Return the register class ID number. 42a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer /// 43a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer unsigned getID() const { return ID; } 44a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer 45a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer /// getName() - Return the register class name for debugging. 46a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer /// 47a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer const char *getName() const { return Name; } 48a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer 49a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer /// begin/end - Return all of the registers in this class. 50a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer /// 51a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer iterator begin() const { return RegsBegin; } 52f3e3783012dc7875ed37be8aaaefd96f98454781Craig Topper iterator end() const { return RegsBegin + RegsSize; } 53a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer 54a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer /// getNumRegs - Return the number of registers in this class. 55a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer /// 56f3e3783012dc7875ed37be8aaaefd96f98454781Craig Topper unsigned getNumRegs() const { return RegsSize; } 57a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer 58a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer /// getRegister - Return the specified register in the class. 59a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer /// 60a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer unsigned getRegister(unsigned i) const { 61a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer assert(i < getNumRegs() && "Register number out of range!"); 62a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer return RegsBegin[i]; 63a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer } 64a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer 65a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer /// contains - Return true if the specified register is included in this 66a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer /// register class. This does not include virtual registers. 67a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer bool contains(unsigned Reg) const { 689df8567548e15c6cd91e8a5851784574c4f09528Benjamin Kramer unsigned InByte = Reg % 8; 699df8567548e15c6cd91e8a5851784574c4f09528Benjamin Kramer unsigned Byte = Reg / 8; 7059a4f9af0a2e94ec04840a066251eca34bf3e3f8Benjamin Kramer if (Byte >= RegSetSize) 719df8567548e15c6cd91e8a5851784574c4f09528Benjamin Kramer return false; 729df8567548e15c6cd91e8a5851784574c4f09528Benjamin Kramer return (RegSet[Byte] & (1 << InByte)) != 0; 73a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer } 74a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer 75a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer /// contains - Return true if both registers are in this class. 76a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer bool contains(unsigned Reg1, unsigned Reg2) const { 77a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer return contains(Reg1) && contains(Reg2); 78a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer } 79a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer 80a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer /// getSize - Return the size of the register in bytes, which is also the size 81a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer /// of a stack slot allocated to hold a spilled copy of this register. 82a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer unsigned getSize() const { return RegSize; } 83a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer 84a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer /// getAlignment - Return the minimum required alignment for a register of 85a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer /// this class. 86a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer unsigned getAlignment() const { return Alignment; } 87a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer 88a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer /// getCopyCost - Return the cost of copying a value between two registers in 89a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer /// this class. A negative number means the register class is very expensive 90a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer /// to copy e.g. status flag register classes. 91a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer int getCopyCost() const { return CopyCost; } 92a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer 93a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer /// isAllocatable - Return true if this register class may be used to create 94a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer /// virtual registers. 95a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer bool isAllocatable() const { return Allocatable; } 96a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer}; 97a50c175fe3c7a3034df18747cfacb3b153c493c8Benjamin Kramer 985e6b4605bd620a864055276a6d454e5a18f9fee8Evan Cheng/// MCRegisterDesc - This record contains all of the information known about 99a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng/// a particular register. The Overlaps field contains a pointer to a zero 100a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng/// terminated array of registers that this register aliases, starting with 101a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng/// itself. This is needed for architectures like X86 which have AL alias AX 102a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng/// alias EAX. The SubRegs field is a zero terminated array of registers that 103a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng/// are sub-registers of the specific register, e.g. AL, AH are sub-registers of 104a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng/// AX. The SuperRegs field is a zero terminated array of registers that are 105a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng/// super-registers of the specific register, e.g. RAX, EAX, are super-registers 106a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng/// of AX. 107a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng/// 108f5fa52ed064098be7130aa4ec1236037907ce3faEvan Chengstruct MCRegisterDesc { 109d5ce3ffa67698b9d21f58011f370a210a214d301Jakob Stoklund Olesen uint32_t Name; // Printable name for the reg (for debugging) 110d5ce3ffa67698b9d21f58011f370a210a214d301Jakob Stoklund Olesen uint32_t Overlaps; // Overlapping registers, described above 111d5ce3ffa67698b9d21f58011f370a210a214d301Jakob Stoklund Olesen uint32_t SubRegs; // Sub-register set, described above 112d5ce3ffa67698b9d21f58011f370a210a214d301Jakob Stoklund Olesen uint32_t SuperRegs; // Super-register set, described above 113f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen 1140371cd8b1c0d2101295ca9381a0b437e1f2d8fa2Jakob Stoklund Olesen // Offset into MCRI::SubRegIndices of a list of sub-register indices for each 1150371cd8b1c0d2101295ca9381a0b437e1f2d8fa2Jakob Stoklund Olesen // sub-register in SubRegs. 1160371cd8b1c0d2101295ca9381a0b437e1f2d8fa2Jakob Stoklund Olesen uint32_t SubRegIndices; 1170371cd8b1c0d2101295ca9381a0b437e1f2d8fa2Jakob Stoklund Olesen 118f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen // RegUnits - Points to the list of register units. The low 4 bits holds the 119f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen // Scale, the high bits hold an offset into DiffLists. See MCRegUnitIterator. 120f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen uint32_t RegUnits; 121a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng}; 122a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng 123a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng/// MCRegisterInfo base class - We assume that the target defines a static 1245e6b4605bd620a864055276a6d454e5a18f9fee8Evan Cheng/// array of MCRegisterDesc objects that represent all of the machine 125a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng/// registers that the target has. As such, we simply have to track a pointer 126a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng/// to this array so that we can turn register number into a register 127a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng/// descriptor. 128a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng/// 129f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng/// Note this class is designed to be a base class of TargetRegisterInfo, which 130f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng/// is the interface used by codegen. However, specific targets *should never* 131f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng/// specialize this class. MCRegisterInfo should only contain getters to access 132f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng/// TableGen generated physical register data. It must not be extended with 133f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng/// virtual methods. 134f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng/// 135a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Chengclass MCRegisterInfo { 1368ca9a862038e8c4e9a2ca73b3b75e1be3425155fBenjamin Kramerpublic: 1378ca9a862038e8c4e9a2ca73b3b75e1be3425155fBenjamin Kramer typedef const MCRegisterClass *regclass_iterator; 138243018ffcf764e4dde2968f909f4a2e578aafe86Benjamin Kramer 139243018ffcf764e4dde2968f909f4a2e578aafe86Benjamin Kramer /// DwarfLLVMRegPair - Emitted by tablegen so Dwarf<->LLVM reg mappings can be 140243018ffcf764e4dde2968f909f4a2e578aafe86Benjamin Kramer /// performed with a binary search. 141243018ffcf764e4dde2968f909f4a2e578aafe86Benjamin Kramer struct DwarfLLVMRegPair { 142243018ffcf764e4dde2968f909f4a2e578aafe86Benjamin Kramer unsigned FromReg; 143243018ffcf764e4dde2968f909f4a2e578aafe86Benjamin Kramer unsigned ToReg; 144243018ffcf764e4dde2968f909f4a2e578aafe86Benjamin Kramer 14532d1774d45532508c9c76fa8e4dad9454ec50656Benjamin Kramer bool operator<(DwarfLLVMRegPair RHS) const { return FromReg < RHS.FromReg; } 146243018ffcf764e4dde2968f909f4a2e578aafe86Benjamin Kramer }; 147a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Chengprivate: 1480e6a052331f674dd70e28af41f654a7874405eabEvan Cheng const MCRegisterDesc *Desc; // Pointer to the descriptor array 1490e6a052331f674dd70e28af41f654a7874405eabEvan Cheng unsigned NumRegs; // Number of entries in the array 1500e6a052331f674dd70e28af41f654a7874405eabEvan Cheng unsigned RAReg; // Return address register 1518ca9a862038e8c4e9a2ca73b3b75e1be3425155fBenjamin Kramer const MCRegisterClass *Classes; // Pointer to the regclass array 1528ca9a862038e8c4e9a2ca73b3b75e1be3425155fBenjamin Kramer unsigned NumClasses; // Number of entries in the array 153f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen unsigned NumRegUnits; // Number of regunits. 154f5d4e5158fcbec26d1c243daa725878ca1ae560bJakob Stoklund Olesen const uint16_t (*RegUnitRoots)[2]; // Pointer to regunit root table. 155f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen const uint16_t *DiffLists; // Pointer to the difflists array 156d5ce3ffa67698b9d21f58011f370a210a214d301Jakob Stoklund Olesen const char *RegStrings; // Pointer to the string table. 157b6632ba380cf624e60fe16b03d6e21b05dd07724Craig Topper const uint16_t *SubRegIndices; // Pointer to the subreg lookup 158b3acdcc00c9dfb01663780e858e586cc5f04423fJim Grosbach // array. 159b3acdcc00c9dfb01663780e858e586cc5f04423fJim Grosbach unsigned NumSubRegIndices; // Number of subreg indices. 1600ee07e013095e8c298fbcc5203e0bc9f334e15e1Jim Grosbach const uint16_t *RegEncodingTable; // Pointer to array of register 1610ee07e013095e8c298fbcc5203e0bc9f334e15e1Jim Grosbach // encodings. 162243018ffcf764e4dde2968f909f4a2e578aafe86Benjamin Kramer 163243018ffcf764e4dde2968f909f4a2e578aafe86Benjamin Kramer unsigned L2DwarfRegsSize; 164243018ffcf764e4dde2968f909f4a2e578aafe86Benjamin Kramer unsigned EHL2DwarfRegsSize; 165243018ffcf764e4dde2968f909f4a2e578aafe86Benjamin Kramer unsigned Dwarf2LRegsSize; 166243018ffcf764e4dde2968f909f4a2e578aafe86Benjamin Kramer unsigned EHDwarf2LRegsSize; 167243018ffcf764e4dde2968f909f4a2e578aafe86Benjamin Kramer const DwarfLLVMRegPair *L2DwarfRegs; // LLVM to Dwarf regs mapping 168243018ffcf764e4dde2968f909f4a2e578aafe86Benjamin Kramer const DwarfLLVMRegPair *EHL2DwarfRegs; // LLVM to Dwarf regs mapping EH 169243018ffcf764e4dde2968f909f4a2e578aafe86Benjamin Kramer const DwarfLLVMRegPair *Dwarf2LRegs; // Dwarf to LLVM regs mapping 170243018ffcf764e4dde2968f909f4a2e578aafe86Benjamin Kramer const DwarfLLVMRegPair *EHDwarf2LRegs; // Dwarf to LLVM regs mapping EH 1710e6a052331f674dd70e28af41f654a7874405eabEvan Cheng DenseMap<unsigned, int> L2SEHRegs; // LLVM to SEH regs mapping 172a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng 173209cdc2999208e9783349e970bd96fc37557fd97Jakob Stoklund Olesenpublic: 174f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen /// DiffListIterator - Base iterator class that can traverse the 175f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen /// differentially encoded register and regunit lists in DiffLists. 176f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen /// Don't use this class directly, use one of the specialized sub-classes 177f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen /// defined below. 178f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen class DiffListIterator { 179f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen uint16_t Val; 180f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen const uint16_t *List; 181f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen 182f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen protected: 183f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen /// Create an invalid iterator. Call init() to point to something useful. 184f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen DiffListIterator() : Val(0), List(0) {} 185f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen 186f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen /// init - Point the iterator to InitVal, decoding subsequent values from 187f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen /// DiffList. The iterator will initially point to InitVal, sub-classes are 188f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen /// responsible for skipping the seed value if it is not part of the list. 189f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen void init(uint16_t InitVal, const uint16_t *DiffList) { 190f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen Val = InitVal; 191f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen List = DiffList; 192f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen } 193f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen 194f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen /// advance - Move to the next list position, return the applied 195f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen /// differential. This function does not detect the end of the list, that 196f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen /// is the caller's responsibility (by checking for a 0 return value). 197f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen unsigned advance() { 198f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen assert(isValid() && "Cannot move off the end of the list."); 199f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen uint16_t D = *List++; 200f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen Val += D; 201f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen return D; 202f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen } 203f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen 204f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen public: 205f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen 206f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen /// isValid - returns true if this iterator is not yet at the end. 207f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen bool isValid() const { return List; } 208f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen 209f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen /// Dereference the iterator to get the value at the current position. 210f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen unsigned operator*() const { return Val; } 211f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen 212f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen /// Pre-increment to move to the next position. 213f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen void operator++() { 214f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen // The end of the list is encoded as a 0 differential. 215f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen if (!advance()) 216f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen List = 0; 217f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen } 218f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen }; 219f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen 220303c909d5bb014fbeec395090eb467d724969195Jakob Stoklund Olesen // These iterators are allowed to sub-class DiffListIterator and access 221303c909d5bb014fbeec395090eb467d724969195Jakob Stoklund Olesen // internal list pointers. 222cd00ef033cf944fc96a0d06ffcf49cd805fc4ee3Jakob Stoklund Olesen friend class MCSubRegIterator; 223cd00ef033cf944fc96a0d06ffcf49cd805fc4ee3Jakob Stoklund Olesen friend class MCSuperRegIterator; 224cd00ef033cf944fc96a0d06ffcf49cd805fc4ee3Jakob Stoklund Olesen friend class MCRegAliasIterator; 225f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen friend class MCRegUnitIterator; 226f5d4e5158fcbec26d1c243daa725878ca1ae560bJakob Stoklund Olesen friend class MCRegUnitRootIterator; 227f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen 228a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// InitMCRegisterInfo - Initialize MCRegisterInfo, called by TableGen 229a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// auto-generated routines. *DO NOT USE*. 2308ca9a862038e8c4e9a2ca73b3b75e1be3425155fBenjamin Kramer void InitMCRegisterInfo(const MCRegisterDesc *D, unsigned NR, unsigned RA, 231f5d4e5158fcbec26d1c243daa725878ca1ae560bJakob Stoklund Olesen const MCRegisterClass *C, unsigned NC, 232f5d4e5158fcbec26d1c243daa725878ca1ae560bJakob Stoklund Olesen const uint16_t (*RURoots)[2], 233f5d4e5158fcbec26d1c243daa725878ca1ae560bJakob Stoklund Olesen unsigned NRU, 234f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen const uint16_t *DL, 235d5ce3ffa67698b9d21f58011f370a210a214d301Jakob Stoklund Olesen const char *Strings, 236b6632ba380cf624e60fe16b03d6e21b05dd07724Craig Topper const uint16_t *SubIndices, 2370ee07e013095e8c298fbcc5203e0bc9f334e15e1Jim Grosbach unsigned NumIndices, 2380ee07e013095e8c298fbcc5203e0bc9f334e15e1Jim Grosbach const uint16_t *RET) { 239a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng Desc = D; 240a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng NumRegs = NR; 2410e6a052331f674dd70e28af41f654a7874405eabEvan Cheng RAReg = RA; 2428ca9a862038e8c4e9a2ca73b3b75e1be3425155fBenjamin Kramer Classes = C; 243f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen DiffLists = DL; 244d5ce3ffa67698b9d21f58011f370a210a214d301Jakob Stoklund Olesen RegStrings = Strings; 2458ca9a862038e8c4e9a2ca73b3b75e1be3425155fBenjamin Kramer NumClasses = NC; 246f5d4e5158fcbec26d1c243daa725878ca1ae560bJakob Stoklund Olesen RegUnitRoots = RURoots; 247f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen NumRegUnits = NRU; 248b3acdcc00c9dfb01663780e858e586cc5f04423fJim Grosbach SubRegIndices = SubIndices; 249b3acdcc00c9dfb01663780e858e586cc5f04423fJim Grosbach NumSubRegIndices = NumIndices; 2500ee07e013095e8c298fbcc5203e0bc9f334e15e1Jim Grosbach RegEncodingTable = RET; 2510e6a052331f674dd70e28af41f654a7874405eabEvan Cheng } 2520e6a052331f674dd70e28af41f654a7874405eabEvan Cheng 253243018ffcf764e4dde2968f909f4a2e578aafe86Benjamin Kramer /// mapLLVMRegsToDwarfRegs - Used to initialize LLVM register to Dwarf 2540e6a052331f674dd70e28af41f654a7874405eabEvan Cheng /// register number mapping. Called by TableGen auto-generated routines. 2550e6a052331f674dd70e28af41f654a7874405eabEvan Cheng /// *DO NOT USE*. 256243018ffcf764e4dde2968f909f4a2e578aafe86Benjamin Kramer void mapLLVMRegsToDwarfRegs(const DwarfLLVMRegPair *Map, unsigned Size, 257243018ffcf764e4dde2968f909f4a2e578aafe86Benjamin Kramer bool isEH) { 258243018ffcf764e4dde2968f909f4a2e578aafe86Benjamin Kramer if (isEH) { 259243018ffcf764e4dde2968f909f4a2e578aafe86Benjamin Kramer EHL2DwarfRegs = Map; 260243018ffcf764e4dde2968f909f4a2e578aafe86Benjamin Kramer EHL2DwarfRegsSize = Size; 261243018ffcf764e4dde2968f909f4a2e578aafe86Benjamin Kramer } else { 262243018ffcf764e4dde2968f909f4a2e578aafe86Benjamin Kramer L2DwarfRegs = Map; 263243018ffcf764e4dde2968f909f4a2e578aafe86Benjamin Kramer L2DwarfRegsSize = Size; 264243018ffcf764e4dde2968f909f4a2e578aafe86Benjamin Kramer } 265a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng } 266492be647722fc2f372e650ce4a5d9e10171dbe0eJim Grosbach 267243018ffcf764e4dde2968f909f4a2e578aafe86Benjamin Kramer /// mapDwarfRegsToLLVMRegs - Used to initialize Dwarf register to LLVM 2680e6a052331f674dd70e28af41f654a7874405eabEvan Cheng /// register number mapping. Called by TableGen auto-generated routines. 2690e6a052331f674dd70e28af41f654a7874405eabEvan Cheng /// *DO NOT USE*. 270243018ffcf764e4dde2968f909f4a2e578aafe86Benjamin Kramer void mapDwarfRegsToLLVMRegs(const DwarfLLVMRegPair *Map, unsigned Size, 271243018ffcf764e4dde2968f909f4a2e578aafe86Benjamin Kramer bool isEH) { 272243018ffcf764e4dde2968f909f4a2e578aafe86Benjamin Kramer if (isEH) { 273243018ffcf764e4dde2968f909f4a2e578aafe86Benjamin Kramer EHDwarf2LRegs = Map; 274243018ffcf764e4dde2968f909f4a2e578aafe86Benjamin Kramer EHDwarf2LRegsSize = Size; 275243018ffcf764e4dde2968f909f4a2e578aafe86Benjamin Kramer } else { 276243018ffcf764e4dde2968f909f4a2e578aafe86Benjamin Kramer Dwarf2LRegs = Map; 277243018ffcf764e4dde2968f909f4a2e578aafe86Benjamin Kramer Dwarf2LRegsSize = Size; 278243018ffcf764e4dde2968f909f4a2e578aafe86Benjamin Kramer } 2790e6a052331f674dd70e28af41f654a7874405eabEvan Cheng } 280492be647722fc2f372e650ce4a5d9e10171dbe0eJim Grosbach 2810e6a052331f674dd70e28af41f654a7874405eabEvan Cheng /// mapLLVMRegToSEHReg - Used to initialize LLVM register to SEH register 2820e6a052331f674dd70e28af41f654a7874405eabEvan Cheng /// number mapping. By default the SEH register number is just the same 2830e6a052331f674dd70e28af41f654a7874405eabEvan Cheng /// as the LLVM register number. 2840e6a052331f674dd70e28af41f654a7874405eabEvan Cheng /// FIXME: TableGen these numbers. Currently this requires target specific 2850e6a052331f674dd70e28af41f654a7874405eabEvan Cheng /// initialization code. 2860e6a052331f674dd70e28af41f654a7874405eabEvan Cheng void mapLLVMRegToSEHReg(unsigned LLVMReg, int SEHReg) { 2870e6a052331f674dd70e28af41f654a7874405eabEvan Cheng L2SEHRegs[LLVMReg] = SEHReg; 2880e6a052331f674dd70e28af41f654a7874405eabEvan Cheng } 2890e6a052331f674dd70e28af41f654a7874405eabEvan Cheng 2900e6a052331f674dd70e28af41f654a7874405eabEvan Cheng /// getRARegister - This method should return the register where the return 2910e6a052331f674dd70e28af41f654a7874405eabEvan Cheng /// address can be found. 2920e6a052331f674dd70e28af41f654a7874405eabEvan Cheng unsigned getRARegister() const { 2930e6a052331f674dd70e28af41f654a7874405eabEvan Cheng return RAReg; 2940e6a052331f674dd70e28af41f654a7874405eabEvan Cheng } 2950e6a052331f674dd70e28af41f654a7874405eabEvan Cheng 296f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng const MCRegisterDesc &operator[](unsigned RegNo) const { 297a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng assert(RegNo < NumRegs && 298a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng "Attempting to access record for invalid register number!"); 299a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng return Desc[RegNo]; 300a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng } 301a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng 302a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// Provide a get method, equivalent to [], but more useful if we have a 303a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// pointer to this object. 304a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// 305f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng const MCRegisterDesc &get(unsigned RegNo) const { 306a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng return operator[](RegNo); 307a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng } 308a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng 309b3acdcc00c9dfb01663780e858e586cc5f04423fJim Grosbach /// getSubReg - Returns the physical register number of sub-register "Index" 310b3acdcc00c9dfb01663780e858e586cc5f04423fJim Grosbach /// for physical register RegNo. Return zero if the sub-register does not 311b3acdcc00c9dfb01663780e858e586cc5f04423fJim Grosbach /// exist. 3120371cd8b1c0d2101295ca9381a0b437e1f2d8fa2Jakob Stoklund Olesen unsigned getSubReg(unsigned Reg, unsigned Idx) const; 313b3acdcc00c9dfb01663780e858e586cc5f04423fJim Grosbach 31433ca87affb81b60c4d50214eb7458bd26d397d53Jim Grosbach /// getMatchingSuperReg - Return a super-register of the specified register 31533ca87affb81b60c4d50214eb7458bd26d397d53Jim Grosbach /// Reg so its sub-register of index SubIdx is Reg. 31633ca87affb81b60c4d50214eb7458bd26d397d53Jim Grosbach unsigned getMatchingSuperReg(unsigned Reg, unsigned SubIdx, 317396618b43a85e12d290a90b181c6af5d7c0c5f11Jakob Stoklund Olesen const MCRegisterClass *RC) const; 31833ca87affb81b60c4d50214eb7458bd26d397d53Jim Grosbach 3194b1212b4bfac98c688d484bf22ae158875f06ad5Benjamin Kramer /// getSubRegIndex - For a given register pair, return the sub-register index 3204b1212b4bfac98c688d484bf22ae158875f06ad5Benjamin Kramer /// if the second register is a sub-register of the first. Return zero 3214b1212b4bfac98c688d484bf22ae158875f06ad5Benjamin Kramer /// otherwise. 3220371cd8b1c0d2101295ca9381a0b437e1f2d8fa2Jakob Stoklund Olesen unsigned getSubRegIndex(unsigned RegNo, unsigned SubRegNo) const; 3234b1212b4bfac98c688d484bf22ae158875f06ad5Benjamin Kramer 324a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// getName - Return the human-readable symbolic target-specific name for the 325a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// specified physical register. 326a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng const char *getName(unsigned RegNo) const { 327d5ce3ffa67698b9d21f58011f370a210a214d301Jakob Stoklund Olesen return RegStrings + get(RegNo).Name; 328a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng } 329a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng 330a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// getNumRegs - Return the number of registers this target has (useful for 331a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// sizing arrays holding per register information) 332a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng unsigned getNumRegs() const { 333a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng return NumRegs; 334a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng } 3350e6a052331f674dd70e28af41f654a7874405eabEvan Cheng 336f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen /// getNumRegUnits - Return the number of (native) register units in the 337f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen /// target. Register units are numbered from 0 to getNumRegUnits() - 1. They 338f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen /// can be accessed through MCRegUnitIterator defined below. 339f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen unsigned getNumRegUnits() const { 340f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen return NumRegUnits; 341f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen } 342f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen 3430e6a052331f674dd70e28af41f654a7874405eabEvan Cheng /// getDwarfRegNum - Map a target register to an equivalent dwarf register 3440e6a052331f674dd70e28af41f654a7874405eabEvan Cheng /// number. Returns -1 if there is no equivalent value. The second 3450e6a052331f674dd70e28af41f654a7874405eabEvan Cheng /// parameter allows targets to use different numberings for EH info and 3460e6a052331f674dd70e28af41f654a7874405eabEvan Cheng /// debugging info. 34746c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen int getDwarfRegNum(unsigned RegNum, bool isEH) const; 3480e6a052331f674dd70e28af41f654a7874405eabEvan Cheng 3490e6a052331f674dd70e28af41f654a7874405eabEvan Cheng /// getLLVMRegNum - Map a dwarf register back to a target register. 3500e6a052331f674dd70e28af41f654a7874405eabEvan Cheng /// 35146c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen int getLLVMRegNum(unsigned RegNum, bool isEH) const; 3520e6a052331f674dd70e28af41f654a7874405eabEvan Cheng 3530e6a052331f674dd70e28af41f654a7874405eabEvan Cheng /// getSEHRegNum - Map a target register to an equivalent SEH register 3540e6a052331f674dd70e28af41f654a7874405eabEvan Cheng /// number. Returns LLVM register number if there is no equivalent value. 35546c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen int getSEHRegNum(unsigned RegNum) const; 3568ca9a862038e8c4e9a2ca73b3b75e1be3425155fBenjamin Kramer 3578ca9a862038e8c4e9a2ca73b3b75e1be3425155fBenjamin Kramer regclass_iterator regclass_begin() const { return Classes; } 3588ca9a862038e8c4e9a2ca73b3b75e1be3425155fBenjamin Kramer regclass_iterator regclass_end() const { return Classes+NumClasses; } 3598ca9a862038e8c4e9a2ca73b3b75e1be3425155fBenjamin Kramer 3608ca9a862038e8c4e9a2ca73b3b75e1be3425155fBenjamin Kramer unsigned getNumRegClasses() const { 3618ca9a862038e8c4e9a2ca73b3b75e1be3425155fBenjamin Kramer return (unsigned)(regclass_end()-regclass_begin()); 3628ca9a862038e8c4e9a2ca73b3b75e1be3425155fBenjamin Kramer } 3638ca9a862038e8c4e9a2ca73b3b75e1be3425155fBenjamin Kramer 3648ca9a862038e8c4e9a2ca73b3b75e1be3425155fBenjamin Kramer /// getRegClass - Returns the register class associated with the enumeration 3658ca9a862038e8c4e9a2ca73b3b75e1be3425155fBenjamin Kramer /// value. See class MCOperandInfo. 3668ca9a862038e8c4e9a2ca73b3b75e1be3425155fBenjamin Kramer const MCRegisterClass getRegClass(unsigned i) const { 3678ca9a862038e8c4e9a2ca73b3b75e1be3425155fBenjamin Kramer assert(i < getNumRegClasses() && "Register Class ID out of range"); 3688ca9a862038e8c4e9a2ca73b3b75e1be3425155fBenjamin Kramer return Classes[i]; 3698ca9a862038e8c4e9a2ca73b3b75e1be3425155fBenjamin Kramer } 3700ee07e013095e8c298fbcc5203e0bc9f334e15e1Jim Grosbach 3710ee07e013095e8c298fbcc5203e0bc9f334e15e1Jim Grosbach /// getEncodingValue - Returns the encoding for RegNo 3720ee07e013095e8c298fbcc5203e0bc9f334e15e1Jim Grosbach uint16_t getEncodingValue(unsigned RegNo) const { 3730ee07e013095e8c298fbcc5203e0bc9f334e15e1Jim Grosbach assert(RegNo < NumRegs && 3740ee07e013095e8c298fbcc5203e0bc9f334e15e1Jim Grosbach "Attempting to get encoding for invalid register number!"); 3750ee07e013095e8c298fbcc5203e0bc9f334e15e1Jim Grosbach return RegEncodingTable[RegNo]; 3760ee07e013095e8c298fbcc5203e0bc9f334e15e1Jim Grosbach } 3770ee07e013095e8c298fbcc5203e0bc9f334e15e1Jim Grosbach 378a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng}; 379492be647722fc2f372e650ce4a5d9e10171dbe0eJim Grosbach 380f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen//===----------------------------------------------------------------------===// 381cd00ef033cf944fc96a0d06ffcf49cd805fc4ee3Jakob Stoklund Olesen// Register List Iterators 382cd00ef033cf944fc96a0d06ffcf49cd805fc4ee3Jakob Stoklund Olesen//===----------------------------------------------------------------------===// 383cd00ef033cf944fc96a0d06ffcf49cd805fc4ee3Jakob Stoklund Olesen 384cd00ef033cf944fc96a0d06ffcf49cd805fc4ee3Jakob Stoklund Olesen// MCRegisterInfo provides lists of super-registers, sub-registers, and 385cd00ef033cf944fc96a0d06ffcf49cd805fc4ee3Jakob Stoklund Olesen// aliasing registers. Use these iterator classes to traverse the lists. 386cd00ef033cf944fc96a0d06ffcf49cd805fc4ee3Jakob Stoklund Olesen 387cd00ef033cf944fc96a0d06ffcf49cd805fc4ee3Jakob Stoklund Olesen/// MCSubRegIterator enumerates all sub-registers of Reg. 388303c909d5bb014fbeec395090eb467d724969195Jakob Stoklund Olesenclass MCSubRegIterator : public MCRegisterInfo::DiffListIterator { 389cd00ef033cf944fc96a0d06ffcf49cd805fc4ee3Jakob Stoklund Olesenpublic: 390303c909d5bb014fbeec395090eb467d724969195Jakob Stoklund Olesen MCSubRegIterator(unsigned Reg, const MCRegisterInfo *MCRI) { 391303c909d5bb014fbeec395090eb467d724969195Jakob Stoklund Olesen init(Reg, MCRI->DiffLists + MCRI->get(Reg).SubRegs); 392303c909d5bb014fbeec395090eb467d724969195Jakob Stoklund Olesen ++*this; 393303c909d5bb014fbeec395090eb467d724969195Jakob Stoklund Olesen } 394cd00ef033cf944fc96a0d06ffcf49cd805fc4ee3Jakob Stoklund Olesen}; 395cd00ef033cf944fc96a0d06ffcf49cd805fc4ee3Jakob Stoklund Olesen 396cd00ef033cf944fc96a0d06ffcf49cd805fc4ee3Jakob Stoklund Olesen/// MCSuperRegIterator enumerates all super-registers of Reg. 397303c909d5bb014fbeec395090eb467d724969195Jakob Stoklund Olesenclass MCSuperRegIterator : public MCRegisterInfo::DiffListIterator { 398cd00ef033cf944fc96a0d06ffcf49cd805fc4ee3Jakob Stoklund Olesenpublic: 399303c909d5bb014fbeec395090eb467d724969195Jakob Stoklund Olesen MCSuperRegIterator(unsigned Reg, const MCRegisterInfo *MCRI) { 400303c909d5bb014fbeec395090eb467d724969195Jakob Stoklund Olesen init(Reg, MCRI->DiffLists + MCRI->get(Reg).SuperRegs); 401303c909d5bb014fbeec395090eb467d724969195Jakob Stoklund Olesen ++*this; 402303c909d5bb014fbeec395090eb467d724969195Jakob Stoklund Olesen } 403cd00ef033cf944fc96a0d06ffcf49cd805fc4ee3Jakob Stoklund Olesen}; 404cd00ef033cf944fc96a0d06ffcf49cd805fc4ee3Jakob Stoklund Olesen 405cd00ef033cf944fc96a0d06ffcf49cd805fc4ee3Jakob Stoklund Olesen/// MCRegAliasIterator enumerates all registers aliasing Reg. 406cd00ef033cf944fc96a0d06ffcf49cd805fc4ee3Jakob Stoklund Olesen/// If IncludeSelf is set, Reg itself is included in the list. 407303c909d5bb014fbeec395090eb467d724969195Jakob Stoklund Olesenclass MCRegAliasIterator : public MCRegisterInfo::DiffListIterator { 408cd00ef033cf944fc96a0d06ffcf49cd805fc4ee3Jakob Stoklund Olesenpublic: 409303c909d5bb014fbeec395090eb467d724969195Jakob Stoklund Olesen MCRegAliasIterator(unsigned Reg, const MCRegisterInfo *MCRI, 410303c909d5bb014fbeec395090eb467d724969195Jakob Stoklund Olesen bool IncludeSelf) { 411303c909d5bb014fbeec395090eb467d724969195Jakob Stoklund Olesen init(Reg, MCRI->DiffLists + MCRI->get(Reg).Overlaps); 412303c909d5bb014fbeec395090eb467d724969195Jakob Stoklund Olesen // Initially, the iterator points to Reg itself. 413303c909d5bb014fbeec395090eb467d724969195Jakob Stoklund Olesen if (!IncludeSelf) 414303c909d5bb014fbeec395090eb467d724969195Jakob Stoklund Olesen ++*this; 415303c909d5bb014fbeec395090eb467d724969195Jakob Stoklund Olesen } 416cd00ef033cf944fc96a0d06ffcf49cd805fc4ee3Jakob Stoklund Olesen}; 417cd00ef033cf944fc96a0d06ffcf49cd805fc4ee3Jakob Stoklund Olesen 418cd00ef033cf944fc96a0d06ffcf49cd805fc4ee3Jakob Stoklund Olesen//===----------------------------------------------------------------------===// 419f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen// Register Units 420f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen//===----------------------------------------------------------------------===// 421f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen 422f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen// Register units are used to compute register aliasing. Every register has at 423f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen// least one register unit, but it can have more. Two registers overlap if and 424f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen// only if they have a common register unit. 425f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen// 426f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen// A target with a complicated sub-register structure will typically have many 427f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen// fewer register units than actual registers. MCRI::getNumRegUnits() returns 428f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen// the number of register units in the target. 429f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen 430f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen// MCRegUnitIterator enumerates a list of register units for Reg. The list is 431f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen// in ascending numerical order. 432f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesenclass MCRegUnitIterator : public MCRegisterInfo::DiffListIterator { 433f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesenpublic: 434f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen /// MCRegUnitIterator - Create an iterator that traverses the register units 435f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen /// in Reg. 436f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen MCRegUnitIterator(unsigned Reg, const MCRegisterInfo *MCRI) { 437f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen // Decode the RegUnits MCRegisterDesc field. 438f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen unsigned RU = MCRI->get(Reg).RegUnits; 439f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen unsigned Scale = RU & 15; 440f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen unsigned Offset = RU >> 4; 441f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen 442f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen // Initialize the iterator to Reg * Scale, and the List pointer to 443f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen // DiffLists + Offset. 444f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen init(Reg * Scale, MCRI->DiffLists + Offset); 445f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen 446f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen // That may not be a valid unit, we need to advance by one to get the real 447f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen // unit number. The first differential can be 0 which would normally 448f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen // terminate the list, but since we know every register has at least one 449f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen // unit, we can allow a 0 differential here. 450f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen advance(); 451f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen } 452f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen}; 453f52baf72c116d9cf8680d25a8e751ce354c7d44bJakob Stoklund Olesen 454f5d4e5158fcbec26d1c243daa725878ca1ae560bJakob Stoklund Olesen// Each register unit has one or two root registers. The complete set of 455f5d4e5158fcbec26d1c243daa725878ca1ae560bJakob Stoklund Olesen// registers containing a register unit is the union of the roots and their 456f5d4e5158fcbec26d1c243daa725878ca1ae560bJakob Stoklund Olesen// super-registers. All registers aliasing Unit can be visited like this: 457f5d4e5158fcbec26d1c243daa725878ca1ae560bJakob Stoklund Olesen// 458f5d4e5158fcbec26d1c243daa725878ca1ae560bJakob Stoklund Olesen// for (MCRegUnitRootIterator RI(Unit, MCRI); RI.isValid(); ++RI) { 459f5d4e5158fcbec26d1c243daa725878ca1ae560bJakob Stoklund Olesen// unsigned Root = *RI; 460f5d4e5158fcbec26d1c243daa725878ca1ae560bJakob Stoklund Olesen// visit(Root); 461f5d4e5158fcbec26d1c243daa725878ca1ae560bJakob Stoklund Olesen// for (MCSuperRegIterator SI(Root, MCRI); SI.isValid(); ++SI) 462f5d4e5158fcbec26d1c243daa725878ca1ae560bJakob Stoklund Olesen// visit(*SI); 463f5d4e5158fcbec26d1c243daa725878ca1ae560bJakob Stoklund Olesen// } 464f5d4e5158fcbec26d1c243daa725878ca1ae560bJakob Stoklund Olesen 465f5d4e5158fcbec26d1c243daa725878ca1ae560bJakob Stoklund Olesen/// MCRegUnitRootIterator enumerates the root registers of a register unit. 466f5d4e5158fcbec26d1c243daa725878ca1ae560bJakob Stoklund Olesenclass MCRegUnitRootIterator { 467f5d4e5158fcbec26d1c243daa725878ca1ae560bJakob Stoklund Olesen uint16_t Reg0; 468f5d4e5158fcbec26d1c243daa725878ca1ae560bJakob Stoklund Olesen uint16_t Reg1; 469f5d4e5158fcbec26d1c243daa725878ca1ae560bJakob Stoklund Olesenpublic: 470f5d4e5158fcbec26d1c243daa725878ca1ae560bJakob Stoklund Olesen MCRegUnitRootIterator(unsigned RegUnit, const MCRegisterInfo *MCRI) { 471f5d4e5158fcbec26d1c243daa725878ca1ae560bJakob Stoklund Olesen assert(RegUnit < MCRI->getNumRegUnits() && "Invalid register unit"); 472f5d4e5158fcbec26d1c243daa725878ca1ae560bJakob Stoklund Olesen Reg0 = MCRI->RegUnitRoots[RegUnit][0]; 473f5d4e5158fcbec26d1c243daa725878ca1ae560bJakob Stoklund Olesen Reg1 = MCRI->RegUnitRoots[RegUnit][1]; 474f5d4e5158fcbec26d1c243daa725878ca1ae560bJakob Stoklund Olesen } 475f5d4e5158fcbec26d1c243daa725878ca1ae560bJakob Stoklund Olesen 476f5d4e5158fcbec26d1c243daa725878ca1ae560bJakob Stoklund Olesen /// Dereference to get the current root register. 477f5d4e5158fcbec26d1c243daa725878ca1ae560bJakob Stoklund Olesen unsigned operator*() const { 478f5d4e5158fcbec26d1c243daa725878ca1ae560bJakob Stoklund Olesen return Reg0; 479f5d4e5158fcbec26d1c243daa725878ca1ae560bJakob Stoklund Olesen } 480f5d4e5158fcbec26d1c243daa725878ca1ae560bJakob Stoklund Olesen 481f5d4e5158fcbec26d1c243daa725878ca1ae560bJakob Stoklund Olesen /// isValid - Check if the iterator is at the end of the list. 482f5d4e5158fcbec26d1c243daa725878ca1ae560bJakob Stoklund Olesen bool isValid() const { 483f5d4e5158fcbec26d1c243daa725878ca1ae560bJakob Stoklund Olesen return Reg0; 484f5d4e5158fcbec26d1c243daa725878ca1ae560bJakob Stoklund Olesen } 485f5d4e5158fcbec26d1c243daa725878ca1ae560bJakob Stoklund Olesen 486f5d4e5158fcbec26d1c243daa725878ca1ae560bJakob Stoklund Olesen /// Preincrement to move to the next root register. 487f5d4e5158fcbec26d1c243daa725878ca1ae560bJakob Stoklund Olesen void operator++() { 488f5d4e5158fcbec26d1c243daa725878ca1ae560bJakob Stoklund Olesen assert(isValid() && "Cannot move off the end of the list."); 489f5d4e5158fcbec26d1c243daa725878ca1ae560bJakob Stoklund Olesen Reg0 = Reg1; 490f5d4e5158fcbec26d1c243daa725878ca1ae560bJakob Stoklund Olesen Reg1 = 0; 491f5d4e5158fcbec26d1c243daa725878ca1ae560bJakob Stoklund Olesen } 492f5d4e5158fcbec26d1c243daa725878ca1ae560bJakob Stoklund Olesen}; 493f5d4e5158fcbec26d1c243daa725878ca1ae560bJakob Stoklund Olesen 494a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng} // End llvm namespace 495a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng 496a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng#endif 497