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