Skip to content

Commit ddffa0e

Browse files
committed
Introduce the DwarfRegAlias class for declaring that two registers have the
same dwarf number. This will be used for creating a dwarf number to register mapping. The only case that needs this so far is the XMM/YMM registers that unfortunately do have the same numbers. llvm-svn: 132314
1 parent ea8ca34 commit ddffa0e

File tree

3 files changed

+35
-16
lines changed

3 files changed

+35
-16
lines changed

llvm/include/llvm/Target/Target.td

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,14 @@ class DwarfRegNum<list<int> Numbers> {
151151
list<int> DwarfNumbers = Numbers;
152152
}
153153

154+
// DwarfRegAlias - This class declares that a given register uses the same dwarf
155+
// numbers as another one. This is useful for making it clear that the two
156+
// registers do have the same number. It also lets us build a mapping
157+
// from dwarf register number to llvm register.
158+
class DwarfRegAlias<Register reg> {
159+
Register DwarfAlias = reg;
160+
}
161+
154162
//===----------------------------------------------------------------------===//
155163
// Pull in the common support for scheduling
156164
//

llvm/lib/Target/X86/X86RegisterInfo.td

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -188,22 +188,22 @@ let Namespace = "X86" in {
188188

189189
// YMM Registers, used by AVX instructions
190190
let SubRegIndices = [sub_xmm] in {
191-
def YMM0: RegisterWithSubRegs<"ymm0", [XMM0]>, DwarfRegNum<[17, 21, 21]>;
192-
def YMM1: RegisterWithSubRegs<"ymm1", [XMM1]>, DwarfRegNum<[18, 22, 22]>;
193-
def YMM2: RegisterWithSubRegs<"ymm2", [XMM2]>, DwarfRegNum<[19, 23, 23]>;
194-
def YMM3: RegisterWithSubRegs<"ymm3", [XMM3]>, DwarfRegNum<[20, 24, 24]>;
195-
def YMM4: RegisterWithSubRegs<"ymm4", [XMM4]>, DwarfRegNum<[21, 25, 25]>;
196-
def YMM5: RegisterWithSubRegs<"ymm5", [XMM5]>, DwarfRegNum<[22, 26, 26]>;
197-
def YMM6: RegisterWithSubRegs<"ymm6", [XMM6]>, DwarfRegNum<[23, 27, 27]>;
198-
def YMM7: RegisterWithSubRegs<"ymm7", [XMM7]>, DwarfRegNum<[24, 28, 28]>;
199-
def YMM8: RegisterWithSubRegs<"ymm8", [XMM8]>, DwarfRegNum<[25, -2, -2]>;
200-
def YMM9: RegisterWithSubRegs<"ymm9", [XMM9]>, DwarfRegNum<[26, -2, -2]>;
201-
def YMM10: RegisterWithSubRegs<"ymm10", [XMM10]>, DwarfRegNum<[27, -2, -2]>;
202-
def YMM11: RegisterWithSubRegs<"ymm11", [XMM11]>, DwarfRegNum<[28, -2, -2]>;
203-
def YMM12: RegisterWithSubRegs<"ymm12", [XMM12]>, DwarfRegNum<[29, -2, -2]>;
204-
def YMM13: RegisterWithSubRegs<"ymm13", [XMM13]>, DwarfRegNum<[30, -2, -2]>;
205-
def YMM14: RegisterWithSubRegs<"ymm14", [XMM14]>, DwarfRegNum<[31, -2, -2]>;
206-
def YMM15: RegisterWithSubRegs<"ymm15", [XMM15]>, DwarfRegNum<[32, -2, -2]>;
191+
def YMM0: RegisterWithSubRegs<"ymm0", [XMM0]>, DwarfRegAlias<XMM0>;
192+
def YMM1: RegisterWithSubRegs<"ymm1", [XMM1]>, DwarfRegAlias<XMM1>;
193+
def YMM2: RegisterWithSubRegs<"ymm2", [XMM2]>, DwarfRegAlias<XMM2>;
194+
def YMM3: RegisterWithSubRegs<"ymm3", [XMM3]>, DwarfRegAlias<XMM3>;
195+
def YMM4: RegisterWithSubRegs<"ymm4", [XMM4]>, DwarfRegAlias<XMM4>;
196+
def YMM5: RegisterWithSubRegs<"ymm5", [XMM5]>, DwarfRegAlias<XMM5>;
197+
def YMM6: RegisterWithSubRegs<"ymm6", [XMM6]>, DwarfRegAlias<XMM6>;
198+
def YMM7: RegisterWithSubRegs<"ymm7", [XMM7]>, DwarfRegAlias<XMM7>;
199+
def YMM8: RegisterWithSubRegs<"ymm8", [XMM8]>, DwarfRegAlias<XMM8>;
200+
def YMM9: RegisterWithSubRegs<"ymm9", [XMM9]>, DwarfRegAlias<XMM9>;
201+
def YMM10: RegisterWithSubRegs<"ymm10", [XMM10]>, DwarfRegAlias<XMM10>;
202+
def YMM11: RegisterWithSubRegs<"ymm11", [XMM11]>, DwarfRegAlias<XMM11>;
203+
def YMM12: RegisterWithSubRegs<"ymm12", [XMM12]>, DwarfRegAlias<XMM12>;
204+
def YMM13: RegisterWithSubRegs<"ymm13", [XMM13]>, DwarfRegAlias<XMM13>;
205+
def YMM14: RegisterWithSubRegs<"ymm14", [XMM14]>, DwarfRegAlias<XMM14>;
206+
def YMM15: RegisterWithSubRegs<"ymm15", [XMM15]>, DwarfRegAlias<XMM15>;
207207
}
208208

209209
// Floating point stack registers

llvm/utils/TableGen/RegisterInfoEmitter.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -989,6 +989,17 @@ void RegisterInfoEmitter::run(raw_ostream &OS) {
989989
for (unsigned i = I->second.size(), e = maxLength; i != e; ++i)
990990
I->second.push_back(-1);
991991

992+
for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
993+
Record *Reg = Regs[i].TheDef;
994+
const RecordVal *V = Reg->getValue("DwarfAlias");
995+
if (!V || !V->getValue())
996+
continue;
997+
998+
DefInit *DI = dynamic_cast<DefInit*>(V->getValue());
999+
Record *Alias = DI->getDef();
1000+
DwarfRegNums[Reg] = DwarfRegNums[Alias];
1001+
}
1002+
9921003
// Emit information about the dwarf register numbers.
9931004
OS << "int " << ClassName << "::getDwarfRegNumFull(unsigned RegNum, "
9941005
<< "unsigned Flavour) const {\n"

0 commit comments

Comments
 (0)