MCRegisterInfo.h revision 7d9b20792bfc528647f8bd7644934b228cc6c60b
1a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com//=== MC/MCRegisterInfo.h - Target Register Description ---------*- C++ -*-===//
2a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com//
3a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com//                     The LLVM Compiler Infrastructure
4a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com//
5a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com// This file is distributed under the University of Illinois Open Source
6a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com// License. See LICENSE.TXT for details.
7a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com//
8a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com//===----------------------------------------------------------------------===//
9a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com//
10a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com// This file describes an abstract interface used to get information about a
11a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com// target machines register file.  This information is used for a variety of
12a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com// purposed, especially register allocation.
13a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com//
14a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com//===----------------------------------------------------------------------===//
15a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com
16a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com#ifndef LLVM_MC_MCREGISTERINFO_H
17a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com#define LLVM_MC_MCREGISTERINFO_H
18a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com
19a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com#include "llvm/ADT/DenseMap.h"
20a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com#include "llvm/Support/ErrorHandling.h"
21a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com#include <cassert>
22a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com
23a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.comnamespace llvm {
24a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com
25a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com/// MCRegisterClass - Base class of TargetRegisterClass.
26a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.comclass MCRegisterClass {
27a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.compublic:
28a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  typedef const unsigned* iterator;
29bbf4dbba6127ef96e316060b2b4ec292627a4078JesusFreke@JesusFreke.com  typedef const unsigned* const_iterator;
30a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com
31a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  const unsigned ID;
32a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  const char *Name;
33a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  const unsigned RegSize, Alignment; // Size & Alignment of register in bytes
34d868692e33220a20685b8c68a2e01ff8e7f76580Ben Gruver  const int CopyCost;
35a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  const bool Allocatable;
36a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  const iterator RegsBegin;
37b9f9e85d84d3e0f84abd5146a16ef605c2a0bb7bJesusFreke@JesusFreke.com  const unsigned char *const RegSet;
38a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  const unsigned RegsSize;
39bbf4dbba6127ef96e316060b2b4ec292627a4078JesusFreke@JesusFreke.com  const unsigned RegSetSize;
40bbf4dbba6127ef96e316060b2b4ec292627a4078JesusFreke@JesusFreke.com
41bbf4dbba6127ef96e316060b2b4ec292627a4078JesusFreke@JesusFreke.com  /// getID() - Return the register class ID number.
42bbf4dbba6127ef96e316060b2b4ec292627a4078JesusFreke@JesusFreke.com  ///
43bbf4dbba6127ef96e316060b2b4ec292627a4078JesusFreke@JesusFreke.com  unsigned getID() const { return ID; }
44bbf4dbba6127ef96e316060b2b4ec292627a4078JesusFreke@JesusFreke.com
45d868692e33220a20685b8c68a2e01ff8e7f76580Ben Gruver  /// getName() - Return the register class name for debugging.
46d868692e33220a20685b8c68a2e01ff8e7f76580Ben Gruver  ///
47d868692e33220a20685b8c68a2e01ff8e7f76580Ben Gruver  const char *getName() const { return Name; }
48a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com
49bbf4dbba6127ef96e316060b2b4ec292627a4078JesusFreke@JesusFreke.com  /// begin/end - Return all of the registers in this class.
50b9f9e85d84d3e0f84abd5146a16ef605c2a0bb7bJesusFreke@JesusFreke.com  ///
51a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  iterator       begin() const { return RegsBegin; }
52bbf4dbba6127ef96e316060b2b4ec292627a4078JesusFreke@JesusFreke.com  iterator         end() const { return RegsBegin + RegsSize; }
53a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com
54bbf4dbba6127ef96e316060b2b4ec292627a4078JesusFreke@JesusFreke.com  /// getNumRegs - Return the number of registers in this class.
55b9f9e85d84d3e0f84abd5146a16ef605c2a0bb7bJesusFreke@JesusFreke.com  ///
56a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  unsigned getNumRegs() const { return RegsSize; }
57a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com
58a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  /// getRegister - Return the specified register in the class.
59a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  ///
60a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  unsigned getRegister(unsigned i) const {
61a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com    assert(i < getNumRegs() && "Register number out of range!");
62a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com    return RegsBegin[i];
63a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  }
64a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com
65a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  /// contains - Return true if the specified register is included in this
66a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  /// register class.  This does not include virtual registers.
67a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  bool contains(unsigned Reg) const {
68a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com    unsigned InByte = Reg % 8;
69a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com    unsigned Byte = Reg / 8;
70a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com    if (Byte >= RegSetSize)
71a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com      return false;
7206bc17a75e0e2d100d60c8f7f08de21630fa9606Ben Gruver    return (RegSet[Byte] & (1 << InByte)) != 0;
73a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  }
74a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com
75a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  /// contains - Return true if both registers are in this class.
76a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  bool contains(unsigned Reg1, unsigned Reg2) const {
77a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com    return contains(Reg1) && contains(Reg2);
78a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  }
79a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com
80a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  /// getSize - Return the size of the register in bytes, which is also the size
81a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  /// of a stack slot allocated to hold a spilled copy of this register.
82a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  unsigned getSize() const { return RegSize; }
83a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com
8406bc17a75e0e2d100d60c8f7f08de21630fa9606Ben Gruver  /// getAlignment - Return the minimum required alignment for a register of
8506bc17a75e0e2d100d60c8f7f08de21630fa9606Ben Gruver  /// this class.
8606bc17a75e0e2d100d60c8f7f08de21630fa9606Ben Gruver  unsigned getAlignment() const { return Alignment; }
8706bc17a75e0e2d100d60c8f7f08de21630fa9606Ben Gruver
8806bc17a75e0e2d100d60c8f7f08de21630fa9606Ben Gruver  /// getCopyCost - Return the cost of copying a value between two registers in
8906bc17a75e0e2d100d60c8f7f08de21630fa9606Ben Gruver  /// this class. A negative number means the register class is very expensive
90d868692e33220a20685b8c68a2e01ff8e7f76580Ben Gruver  /// to copy e.g. status flag register classes.
91d868692e33220a20685b8c68a2e01ff8e7f76580Ben Gruver  int getCopyCost() const { return CopyCost; }
92d868692e33220a20685b8c68a2e01ff8e7f76580Ben Gruver
93d868692e33220a20685b8c68a2e01ff8e7f76580Ben Gruver  /// isAllocatable - Return true if this register class may be used to create
9406bc17a75e0e2d100d60c8f7f08de21630fa9606Ben Gruver  /// virtual registers.
95a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  bool isAllocatable() const { return Allocatable; }
96a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com};
97a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com
98a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com/// MCRegisterDesc - This record contains all of the information known about
99a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com/// a particular register.  The Overlaps field contains a pointer to a zero
100a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com/// terminated array of registers that this register aliases, starting with
101a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com/// itself. This is needed for architectures like X86 which have AL alias AX
102a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com/// alias EAX. The SubRegs field is a zero terminated array of registers that
103a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com/// are sub-registers of the specific register, e.g. AL, AH are sub-registers of
104a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com/// AX. The SuperRegs field is a zero terminated array of registers that are
105a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com/// super-registers of the specific register, e.g. RAX, EAX, are super-registers
10606bc17a75e0e2d100d60c8f7f08de21630fa9606Ben Gruver/// of AX.
10706bc17a75e0e2d100d60c8f7f08de21630fa9606Ben Gruver///
10806bc17a75e0e2d100d60c8f7f08de21630fa9606Ben Gruverstruct MCRegisterDesc {
10906bc17a75e0e2d100d60c8f7f08de21630fa9606Ben Gruver  const char *Name;         // Printable name for the reg (for debugging)
11006bc17a75e0e2d100d60c8f7f08de21630fa9606Ben Gruver  int        Overlaps;      // Overlapping registers, described above
11106bc17a75e0e2d100d60c8f7f08de21630fa9606Ben Gruver  int        SubRegs;       // Sub-register set, described above
112d868692e33220a20685b8c68a2e01ff8e7f76580Ben Gruver  int        SuperRegs;     // Super-register set, described above
113d868692e33220a20685b8c68a2e01ff8e7f76580Ben Gruver};
114d868692e33220a20685b8c68a2e01ff8e7f76580Ben Gruver
115d868692e33220a20685b8c68a2e01ff8e7f76580Ben Gruver/// MCRegisterInfo base class - We assume that the target defines a static
11606bc17a75e0e2d100d60c8f7f08de21630fa9606Ben Gruver/// array of MCRegisterDesc objects that represent all of the machine
117a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com/// registers that the target has.  As such, we simply have to track a pointer
118a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com/// to this array so that we can turn register number into a register
119a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com/// descriptor.
120a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com///
121d868692e33220a20685b8c68a2e01ff8e7f76580Ben Gruver/// Note this class is designed to be a base class of TargetRegisterInfo, which
122d868692e33220a20685b8c68a2e01ff8e7f76580Ben Gruver/// is the interface used by codegen. However, specific targets *should never*
123d868692e33220a20685b8c68a2e01ff8e7f76580Ben Gruver/// specialize this class. MCRegisterInfo should only contain getters to access
124d868692e33220a20685b8c68a2e01ff8e7f76580Ben Gruver/// TableGen generated physical register data. It must not be extended with
125d868692e33220a20685b8c68a2e01ff8e7f76580Ben Gruver/// virtual methods.
126d868692e33220a20685b8c68a2e01ff8e7f76580Ben Gruver///
127d868692e33220a20685b8c68a2e01ff8e7f76580Ben Gruverclass MCRegisterInfo {
128d868692e33220a20685b8c68a2e01ff8e7f76580Ben Gruverpublic:
129b9f9e85d84d3e0f84abd5146a16ef605c2a0bb7bJesusFreke@JesusFreke.com  typedef const MCRegisterClass *regclass_iterator;
1306cd686fbf504a9eeb66caa3a4e4b9f9e1aa8b5b0Ben Gruverprivate:
1316cd686fbf504a9eeb66caa3a4e4b9f9e1aa8b5b0Ben Gruver  const MCRegisterDesc *Desc;                 // Pointer to the descriptor array
1326cd686fbf504a9eeb66caa3a4e4b9f9e1aa8b5b0Ben Gruver  unsigned NumRegs;                           // Number of entries in the array
1336cd686fbf504a9eeb66caa3a4e4b9f9e1aa8b5b0Ben Gruver  unsigned RAReg;                             // Return address register
1346cd686fbf504a9eeb66caa3a4e4b9f9e1aa8b5b0Ben Gruver  const MCRegisterClass *Classes;             // Pointer to the regclass array
1356cd686fbf504a9eeb66caa3a4e4b9f9e1aa8b5b0Ben Gruver  unsigned NumClasses;                        // Number of entries in the array
1366cd686fbf504a9eeb66caa3a4e4b9f9e1aa8b5b0Ben Gruver  const unsigned *Overlaps;                   // Pointer to the overlaps array
137b9f9e85d84d3e0f84abd5146a16ef605c2a0bb7bJesusFreke@JesusFreke.com  const unsigned *SubRegs;                    // Pointer to the subregs array
1386cd686fbf504a9eeb66caa3a4e4b9f9e1aa8b5b0Ben Gruver  const unsigned *SuperRegs;                  // Pointer to the superregs array
1396cd686fbf504a9eeb66caa3a4e4b9f9e1aa8b5b0Ben Gruver  DenseMap<unsigned, int> L2DwarfRegs;        // LLVM to Dwarf regs mapping
1406cd686fbf504a9eeb66caa3a4e4b9f9e1aa8b5b0Ben Gruver  DenseMap<unsigned, int> EHL2DwarfRegs;      // LLVM to Dwarf regs mapping EH
1416cd686fbf504a9eeb66caa3a4e4b9f9e1aa8b5b0Ben Gruver  DenseMap<unsigned, unsigned> Dwarf2LRegs;   // Dwarf to LLVM regs mapping
1426cd686fbf504a9eeb66caa3a4e4b9f9e1aa8b5b0Ben Gruver  DenseMap<unsigned, unsigned> EHDwarf2LRegs; // Dwarf to LLVM regs mapping EH
1436cd686fbf504a9eeb66caa3a4e4b9f9e1aa8b5b0Ben Gruver  DenseMap<unsigned, int> L2SEHRegs;          // LLVM to SEH regs mapping
1446cd686fbf504a9eeb66caa3a4e4b9f9e1aa8b5b0Ben Gruver
14568564258a316e41cb014f98d2777b5944bf37de3Ben Gruverpublic:
1466cd686fbf504a9eeb66caa3a4e4b9f9e1aa8b5b0Ben Gruver  /// InitMCRegisterInfo - Initialize MCRegisterInfo, called by TableGen
1476cd686fbf504a9eeb66caa3a4e4b9f9e1aa8b5b0Ben Gruver  /// auto-generated routines. *DO NOT USE*.
148b9f9e85d84d3e0f84abd5146a16ef605c2a0bb7bJesusFreke@JesusFreke.com  void InitMCRegisterInfo(const MCRegisterDesc *D, unsigned NR, unsigned RA,
1496cd686fbf504a9eeb66caa3a4e4b9f9e1aa8b5b0Ben Gruver                          const MCRegisterClass *C, unsigned NC,
150b9f9e85d84d3e0f84abd5146a16ef605c2a0bb7bJesusFreke@JesusFreke.com                          const unsigned *O, const unsigned *Sub,
151b9f9e85d84d3e0f84abd5146a16ef605c2a0bb7bJesusFreke@JesusFreke.com                          const unsigned *Super) {
152b9f9e85d84d3e0f84abd5146a16ef605c2a0bb7bJesusFreke@JesusFreke.com    Desc = D;
153b9f9e85d84d3e0f84abd5146a16ef605c2a0bb7bJesusFreke@JesusFreke.com    NumRegs = NR;
154b9f9e85d84d3e0f84abd5146a16ef605c2a0bb7bJesusFreke@JesusFreke.com    RAReg = RA;
155b9f9e85d84d3e0f84abd5146a16ef605c2a0bb7bJesusFreke@JesusFreke.com    Classes = C;
156b9f9e85d84d3e0f84abd5146a16ef605c2a0bb7bJesusFreke@JesusFreke.com    Overlaps = O;
157b9f9e85d84d3e0f84abd5146a16ef605c2a0bb7bJesusFreke@JesusFreke.com    SubRegs = Sub;
158bbf4dbba6127ef96e316060b2b4ec292627a4078JesusFreke@JesusFreke.com    SuperRegs = Super;
159a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com    NumClasses = NC;
160a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  }
161a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com
162a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  /// mapLLVMRegToDwarfReg - Used to initialize LLVM register to Dwarf
163a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  /// register number mapping. Called by TableGen auto-generated routines.
164a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  /// *DO NOT USE*.
165a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  void mapLLVMRegToDwarfReg(unsigned LLVMReg, int DwarfReg, bool isEH) {
166a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com    if (isEH)
167a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com      EHL2DwarfRegs[LLVMReg] = DwarfReg;
168a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com    else
169a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com      L2DwarfRegs[LLVMReg] = DwarfReg;
170a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  }
171a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com
172bbf4dbba6127ef96e316060b2b4ec292627a4078JesusFreke@JesusFreke.com  /// mapDwarfRegToLLVMReg - Used to initialize Dwarf register to LLVM
173a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  /// register number mapping. Called by TableGen auto-generated routines.
174a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  /// *DO NOT USE*.
175a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  void mapDwarfRegToLLVMReg(unsigned DwarfReg, unsigned LLVMReg, bool isEH) {
176a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com    if (isEH)
177a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com      EHDwarf2LRegs[DwarfReg] = LLVMReg;
178a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com    else
179a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com      Dwarf2LRegs[DwarfReg] = LLVMReg;
180a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  }
181a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com
182a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  /// mapLLVMRegToSEHReg - Used to initialize LLVM register to SEH register
183a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  /// number mapping. By default the SEH register number is just the same
184a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  /// as the LLVM register number.
185a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  /// FIXME: TableGen these numbers. Currently this requires target specific
1867e25c35df7786c98bc6fa96958e93146ca73367aBen Gruver  /// initialization code.
187a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  void mapLLVMRegToSEHReg(unsigned LLVMReg, int SEHReg) {
188a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com    L2SEHRegs[LLVMReg] = SEHReg;
189a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  }
190a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com
191b9f9e85d84d3e0f84abd5146a16ef605c2a0bb7bJesusFreke@JesusFreke.com  /// getRARegister - This method should return the register where the return
192b9f9e85d84d3e0f84abd5146a16ef605c2a0bb7bJesusFreke@JesusFreke.com  /// address can be found.
193a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  unsigned getRARegister() const {
194a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com    return RAReg;
195a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  }
196a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com
197a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  const MCRegisterDesc &operator[](unsigned RegNo) const {
198a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com    assert(RegNo < NumRegs &&
199a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com           "Attempting to access record for invalid register number!");
200a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com    return Desc[RegNo];
201a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  }
202a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com
203a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  /// Provide a get method, equivalent to [], but more useful if we have a
204a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  /// pointer to this object.
205a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  ///
206a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  const MCRegisterDesc &get(unsigned RegNo) const {
207a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com    return operator[](RegNo);
208a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  }
209a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com
210a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  /// getAliasSet - Return the set of registers aliased by the specified
211a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  /// register, or a null list of there are none.  The list returned is zero
212a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  /// terminated.
213a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  ///
214a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  const unsigned *getAliasSet(unsigned RegNo) const {
215a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com    // The Overlaps set always begins with Reg itself.
216a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com    if (get(RegNo).Overlaps < 0) return 0;
217a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com    return Overlaps + get(RegNo).Overlaps + 1;
218a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  }
219a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com
220a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  /// getOverlaps - Return a list of registers that overlap Reg, including
221a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  /// itself. This is the same as the alias set except Reg is included in the
222a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  /// list.
223a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  /// These are exactly the registers in { x | regsOverlap(x, Reg) }.
224a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  ///
225a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  const unsigned *getOverlaps(unsigned RegNo) const {
226a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com    if (get(RegNo).Overlaps < 0) return 0;
227a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com    return Overlaps + get(RegNo).Overlaps;
228a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  }
229a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com
230a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  /// getSubRegisters - Return the list of registers that are sub-registers of
231a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  /// the specified register, or a null list of there are none. The list
232a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  /// returned is zero terminated and sorted according to super-sub register
233a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  /// relations. e.g. X86::RAX's sub-register list is EAX, AX, AL, AH.
234bbf4dbba6127ef96e316060b2b4ec292627a4078JesusFreke@JesusFreke.com  ///
235a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  const unsigned *getSubRegisters(unsigned RegNo) const {
236a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com    if (get(RegNo).SubRegs < 0) return 0;
237a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com    return SubRegs + get(RegNo).SubRegs;
238a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  }
239a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com
240a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  /// getSuperRegisters - Return the list of registers that are super-registers
241a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  /// of the specified register, or a null list of there are none. The list
242a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  /// returned is zero terminated and sorted according to super-sub register
243a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  /// relations. e.g. X86::AL's super-register list is AX, EAX, RAX.
244a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  ///
245a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  const unsigned *getSuperRegisters(unsigned RegNo) const {
246a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com    if (get(RegNo).SuperRegs < 0) return 0;
247a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com    return SuperRegs + get(RegNo).SuperRegs;
248a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  }
249a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com
250a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  /// getName - Return the human-readable symbolic target-specific name for the
251a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  /// specified physical register.
252a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  const char *getName(unsigned RegNo) const {
253a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com    return get(RegNo).Name;
254a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  }
255a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com
256a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  /// getNumRegs - Return the number of registers this target has (useful for
257bbf4dbba6127ef96e316060b2b4ec292627a4078JesusFreke@JesusFreke.com  /// sizing arrays holding per register information)
258a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  unsigned getNumRegs() const {
259a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com    return NumRegs;
260a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  }
261a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com
262a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  /// getDwarfRegNum - Map a target register to an equivalent dwarf register
263a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  /// number.  Returns -1 if there is no equivalent value.  The second
264a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  /// parameter allows targets to use different numberings for EH info and
265a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  /// debugging info.
266a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  int getDwarfRegNum(unsigned RegNum, bool isEH) const {
267a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com    const DenseMap<unsigned, int> &M = isEH ? EHL2DwarfRegs : L2DwarfRegs;
268a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com    const DenseMap<unsigned, int>::const_iterator I = M.find(RegNum);
269a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com    if (I == M.end()) return -1;
270a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com    return I->second;
271a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  }
272bbf4dbba6127ef96e316060b2b4ec292627a4078JesusFreke@JesusFreke.com
273a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  /// getLLVMRegNum - Map a dwarf register back to a target register.
274a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  ///
275a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  int getLLVMRegNum(unsigned RegNum, bool isEH) const {
276a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com    const DenseMap<unsigned, unsigned> &M = isEH ? EHDwarf2LRegs : Dwarf2LRegs;
277a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com    const DenseMap<unsigned, unsigned>::const_iterator I = M.find(RegNum);
278a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com    if (I == M.end()) {
279a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com      llvm_unreachable("Invalid RegNum");
280a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com    }
281a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com    return I->second;
282a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  }
283a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com
284a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  /// getSEHRegNum - Map a target register to an equivalent SEH register
285a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  /// number.  Returns LLVM register number if there is no equivalent value.
286a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  int getSEHRegNum(unsigned RegNum) const {
287a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com    const DenseMap<unsigned, int>::const_iterator I = L2SEHRegs.find(RegNum);
288a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com    if (I == L2SEHRegs.end()) return (int)RegNum;
289a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com    return I->second;
290a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  }
291a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com
292a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  regclass_iterator regclass_begin() const { return Classes; }
293a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  regclass_iterator regclass_end() const { return Classes+NumClasses; }
294a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com
295a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  unsigned getNumRegClasses() const {
296a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com    return (unsigned)(regclass_end()-regclass_begin());
297a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  }
298a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com
299a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  /// getRegClass - Returns the register class associated with the enumeration
300a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  /// value.  See class MCOperandInfo.
301a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  const MCRegisterClass getRegClass(unsigned i) const {
302a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com    assert(i < getNumRegClasses() && "Register Class ID out of range");
303a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com    return Classes[i];
304a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com  }
305a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com};
306a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com
307a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com} // End llvm namespace
308a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com
309a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com#endif
310a6e5671a627284347484db96f40a29a45e4e4ed1JesusFreke@JesusFreke.com