xref: /aosp_15_r20/external/llvm/lib/MC/MCRegisterInfo.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //=== MC/MCRegisterInfo.cpp - Target Register Description -------*- C++ -*-===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // This file implements MCRegisterInfo functions.
11*9880d681SAndroid Build Coastguard Worker //
12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker 
14*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCRegisterInfo.h"
15*9880d681SAndroid Build Coastguard Worker 
16*9880d681SAndroid Build Coastguard Worker using namespace llvm;
17*9880d681SAndroid Build Coastguard Worker 
getMatchingSuperReg(unsigned Reg,unsigned SubIdx,const MCRegisterClass * RC) const18*9880d681SAndroid Build Coastguard Worker unsigned MCRegisterInfo::getMatchingSuperReg(unsigned Reg, unsigned SubIdx,
19*9880d681SAndroid Build Coastguard Worker                                              const MCRegisterClass *RC) const {
20*9880d681SAndroid Build Coastguard Worker   for (MCSuperRegIterator Supers(Reg, this); Supers.isValid(); ++Supers)
21*9880d681SAndroid Build Coastguard Worker     if (RC->contains(*Supers) && Reg == getSubReg(*Supers, SubIdx))
22*9880d681SAndroid Build Coastguard Worker       return *Supers;
23*9880d681SAndroid Build Coastguard Worker   return 0;
24*9880d681SAndroid Build Coastguard Worker }
25*9880d681SAndroid Build Coastguard Worker 
getSubReg(unsigned Reg,unsigned Idx) const26*9880d681SAndroid Build Coastguard Worker unsigned MCRegisterInfo::getSubReg(unsigned Reg, unsigned Idx) const {
27*9880d681SAndroid Build Coastguard Worker   assert(Idx && Idx < getNumSubRegIndices() &&
28*9880d681SAndroid Build Coastguard Worker          "This is not a subregister index");
29*9880d681SAndroid Build Coastguard Worker   // Get a pointer to the corresponding SubRegIndices list. This list has the
30*9880d681SAndroid Build Coastguard Worker   // name of each sub-register in the same order as MCSubRegIterator.
31*9880d681SAndroid Build Coastguard Worker   const uint16_t *SRI = SubRegIndices + get(Reg).SubRegIndices;
32*9880d681SAndroid Build Coastguard Worker   for (MCSubRegIterator Subs(Reg, this); Subs.isValid(); ++Subs, ++SRI)
33*9880d681SAndroid Build Coastguard Worker     if (*SRI == Idx)
34*9880d681SAndroid Build Coastguard Worker       return *Subs;
35*9880d681SAndroid Build Coastguard Worker   return 0;
36*9880d681SAndroid Build Coastguard Worker }
37*9880d681SAndroid Build Coastguard Worker 
getSubRegIndex(unsigned Reg,unsigned SubReg) const38*9880d681SAndroid Build Coastguard Worker unsigned MCRegisterInfo::getSubRegIndex(unsigned Reg, unsigned SubReg) const {
39*9880d681SAndroid Build Coastguard Worker   assert(SubReg && SubReg < getNumRegs() && "This is not a register");
40*9880d681SAndroid Build Coastguard Worker   // Get a pointer to the corresponding SubRegIndices list. This list has the
41*9880d681SAndroid Build Coastguard Worker   // name of each sub-register in the same order as MCSubRegIterator.
42*9880d681SAndroid Build Coastguard Worker   const uint16_t *SRI = SubRegIndices + get(Reg).SubRegIndices;
43*9880d681SAndroid Build Coastguard Worker   for (MCSubRegIterator Subs(Reg, this); Subs.isValid(); ++Subs, ++SRI)
44*9880d681SAndroid Build Coastguard Worker     if (*Subs == SubReg)
45*9880d681SAndroid Build Coastguard Worker       return *SRI;
46*9880d681SAndroid Build Coastguard Worker   return 0;
47*9880d681SAndroid Build Coastguard Worker }
48*9880d681SAndroid Build Coastguard Worker 
getSubRegIdxSize(unsigned Idx) const49*9880d681SAndroid Build Coastguard Worker unsigned MCRegisterInfo::getSubRegIdxSize(unsigned Idx) const {
50*9880d681SAndroid Build Coastguard Worker   assert(Idx && Idx < getNumSubRegIndices() &&
51*9880d681SAndroid Build Coastguard Worker          "This is not a subregister index");
52*9880d681SAndroid Build Coastguard Worker   return SubRegIdxRanges[Idx].Size;
53*9880d681SAndroid Build Coastguard Worker }
54*9880d681SAndroid Build Coastguard Worker 
getSubRegIdxOffset(unsigned Idx) const55*9880d681SAndroid Build Coastguard Worker unsigned MCRegisterInfo::getSubRegIdxOffset(unsigned Idx) const {
56*9880d681SAndroid Build Coastguard Worker   assert(Idx && Idx < getNumSubRegIndices() &&
57*9880d681SAndroid Build Coastguard Worker          "This is not a subregister index");
58*9880d681SAndroid Build Coastguard Worker   return SubRegIdxRanges[Idx].Offset;
59*9880d681SAndroid Build Coastguard Worker }
60*9880d681SAndroid Build Coastguard Worker 
getDwarfRegNum(unsigned RegNum,bool isEH) const61*9880d681SAndroid Build Coastguard Worker int MCRegisterInfo::getDwarfRegNum(unsigned RegNum, bool isEH) const {
62*9880d681SAndroid Build Coastguard Worker   const DwarfLLVMRegPair *M = isEH ? EHL2DwarfRegs : L2DwarfRegs;
63*9880d681SAndroid Build Coastguard Worker   unsigned Size = isEH ? EHL2DwarfRegsSize : L2DwarfRegsSize;
64*9880d681SAndroid Build Coastguard Worker 
65*9880d681SAndroid Build Coastguard Worker   DwarfLLVMRegPair Key = { RegNum, 0 };
66*9880d681SAndroid Build Coastguard Worker   const DwarfLLVMRegPair *I = std::lower_bound(M, M+Size, Key);
67*9880d681SAndroid Build Coastguard Worker   if (I == M+Size || I->FromReg != RegNum)
68*9880d681SAndroid Build Coastguard Worker     return -1;
69*9880d681SAndroid Build Coastguard Worker   return I->ToReg;
70*9880d681SAndroid Build Coastguard Worker }
71*9880d681SAndroid Build Coastguard Worker 
getLLVMRegNum(unsigned RegNum,bool isEH) const72*9880d681SAndroid Build Coastguard Worker int MCRegisterInfo::getLLVMRegNum(unsigned RegNum, bool isEH) const {
73*9880d681SAndroid Build Coastguard Worker   const DwarfLLVMRegPair *M = isEH ? EHDwarf2LRegs : Dwarf2LRegs;
74*9880d681SAndroid Build Coastguard Worker   unsigned Size = isEH ? EHDwarf2LRegsSize : Dwarf2LRegsSize;
75*9880d681SAndroid Build Coastguard Worker 
76*9880d681SAndroid Build Coastguard Worker   DwarfLLVMRegPair Key = { RegNum, 0 };
77*9880d681SAndroid Build Coastguard Worker   const DwarfLLVMRegPair *I = std::lower_bound(M, M+Size, Key);
78*9880d681SAndroid Build Coastguard Worker   assert(I != M+Size && I->FromReg == RegNum && "Invalid RegNum");
79*9880d681SAndroid Build Coastguard Worker   return I->ToReg;
80*9880d681SAndroid Build Coastguard Worker }
81*9880d681SAndroid Build Coastguard Worker 
getSEHRegNum(unsigned RegNum) const82*9880d681SAndroid Build Coastguard Worker int MCRegisterInfo::getSEHRegNum(unsigned RegNum) const {
83*9880d681SAndroid Build Coastguard Worker   const DenseMap<unsigned, int>::const_iterator I = L2SEHRegs.find(RegNum);
84*9880d681SAndroid Build Coastguard Worker   if (I == L2SEHRegs.end()) return (int)RegNum;
85*9880d681SAndroid Build Coastguard Worker   return I->second;
86*9880d681SAndroid Build Coastguard Worker }
87*9880d681SAndroid Build Coastguard Worker 
getCodeViewRegNum(unsigned RegNum) const88*9880d681SAndroid Build Coastguard Worker int MCRegisterInfo::getCodeViewRegNum(unsigned RegNum) const {
89*9880d681SAndroid Build Coastguard Worker   if (L2CVRegs.empty())
90*9880d681SAndroid Build Coastguard Worker     report_fatal_error("target does not implement codeview register mapping");
91*9880d681SAndroid Build Coastguard Worker   const DenseMap<unsigned, int>::const_iterator I = L2CVRegs.find(RegNum);
92*9880d681SAndroid Build Coastguard Worker   if (I == L2CVRegs.end())
93*9880d681SAndroid Build Coastguard Worker     report_fatal_error("unknown codeview register");
94*9880d681SAndroid Build Coastguard Worker   return I->second;
95*9880d681SAndroid Build Coastguard Worker }
96