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