]>
git.proxmox.com Git - rustc.git/blob - src/llvm/lib/MC/MCRegisterInfo.cpp
1 //=== MC/MCRegisterInfo.cpp - Target Register Description -------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file implements MCRegisterInfo functions.
12 //===----------------------------------------------------------------------===//
14 #include "llvm/MC/MCRegisterInfo.h"
18 unsigned MCRegisterInfo::getMatchingSuperReg(unsigned Reg
, unsigned SubIdx
,
19 const MCRegisterClass
*RC
) const {
20 for (MCSuperRegIterator
Supers(Reg
, this); Supers
.isValid(); ++Supers
)
21 if (RC
->contains(*Supers
) && Reg
== getSubReg(*Supers
, SubIdx
))
26 unsigned MCRegisterInfo::getSubReg(unsigned Reg
, unsigned Idx
) const {
27 assert(Idx
&& Idx
< getNumSubRegIndices() &&
28 "This is not a subregister index");
29 // Get a pointer to the corresponding SubRegIndices list. This list has the
30 // name of each sub-register in the same order as MCSubRegIterator.
31 const uint16_t *SRI
= SubRegIndices
+ get(Reg
).SubRegIndices
;
32 for (MCSubRegIterator
Subs(Reg
, this); Subs
.isValid(); ++Subs
, ++SRI
)
38 unsigned MCRegisterInfo::getSubRegIndex(unsigned Reg
, unsigned SubReg
) const {
39 assert(SubReg
&& SubReg
< getNumRegs() && "This is not a register");
40 // Get a pointer to the corresponding SubRegIndices list. This list has the
41 // name of each sub-register in the same order as MCSubRegIterator.
42 const uint16_t *SRI
= SubRegIndices
+ get(Reg
).SubRegIndices
;
43 for (MCSubRegIterator
Subs(Reg
, this); Subs
.isValid(); ++Subs
, ++SRI
)
49 unsigned MCRegisterInfo::getSubRegIdxSize(unsigned Idx
) const {
50 assert(Idx
&& Idx
< getNumSubRegIndices() &&
51 "This is not a subregister index");
52 return SubRegIdxRanges
[Idx
].Size
;
55 unsigned MCRegisterInfo::getSubRegIdxOffset(unsigned Idx
) const {
56 assert(Idx
&& Idx
< getNumSubRegIndices() &&
57 "This is not a subregister index");
58 return SubRegIdxRanges
[Idx
].Offset
;
61 int MCRegisterInfo::getDwarfRegNum(unsigned RegNum
, bool isEH
) const {
62 const DwarfLLVMRegPair
*M
= isEH
? EHL2DwarfRegs
: L2DwarfRegs
;
63 unsigned Size
= isEH
? EHL2DwarfRegsSize
: L2DwarfRegsSize
;
65 DwarfLLVMRegPair Key
= { RegNum
, 0 };
66 const DwarfLLVMRegPair
*I
= std::lower_bound(M
, M
+Size
, Key
);
67 if (I
== M
+Size
|| I
->FromReg
!= RegNum
)
72 int MCRegisterInfo::getLLVMRegNum(unsigned RegNum
, bool isEH
) const {
73 const DwarfLLVMRegPair
*M
= isEH
? EHDwarf2LRegs
: Dwarf2LRegs
;
74 unsigned Size
= isEH
? EHDwarf2LRegsSize
: Dwarf2LRegsSize
;
76 DwarfLLVMRegPair Key
= { RegNum
, 0 };
77 const DwarfLLVMRegPair
*I
= std::lower_bound(M
, M
+Size
, Key
);
78 assert(I
!= M
+Size
&& I
->FromReg
== RegNum
&& "Invalid RegNum");
82 int MCRegisterInfo::getSEHRegNum(unsigned RegNum
) const {
83 const DenseMap
<unsigned, int>::const_iterator I
= L2SEHRegs
.find(RegNum
);
84 if (I
== L2SEHRegs
.end()) return (int)RegNum
;