1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
//===- TGSIRegisterInfo.cpp - TGSI Register Information -------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file contains the TGSI implementation of the TargetRegisterInfo class.
//
//===----------------------------------------------------------------------===//
#include "TGSI.h"
#include "TGSIRegisterInfo.h"
#include "TGSISubtarget.h"
#include "llvm/CodeGen/MachineInstrBuilder.h"
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Target/TargetInstrInfo.h"
#include "llvm/IR/Type.h"
#include "llvm/ADT/BitVector.h"
#include "llvm/ADT/STLExtras.h"
#define GET_REGINFO_TARGET_DESC
#include "TGSIGenRegisterInfo.inc"
using namespace llvm;
TGSIRegisterInfo::TGSIRegisterInfo(TGSISubtarget &st,
const TargetInstrInfo &tii)
: TGSIGenRegisterInfo(0), Subtarget(st), TII(tii) {
}
const MCPhysReg *TGSIRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF)
const {
static const MCPhysReg regs[] = {
TGSI::TEMP2, TGSI::TEMP3, TGSI::TEMP4, TGSI::TEMP5, TGSI::TEMP6,
TGSI::TEMP7, TGSI::TEMP8, TGSI::TEMP9, TGSI::TEMP10, TGSI::TEMP11,
TGSI::TEMP12, TGSI::TEMP13, TGSI::TEMP14, TGSI::TEMP15, TGSI::TEMP16,
TGSI::TEMP17, TGSI::TEMP18, TGSI::TEMP19, TGSI::TEMP20, TGSI::TEMP21,
TGSI::TEMP22, TGSI::TEMP23, TGSI::TEMP24, TGSI::TEMP25, TGSI::TEMP26,
TGSI::TEMP27, TGSI::TEMP28, TGSI::TEMP29, TGSI::TEMP30, TGSI::TEMP31
};
return regs;
}
BitVector TGSIRegisterInfo::getReservedRegs(const MachineFunction &MF) const {
BitVector rsv(getNumRegs());
rsv.set(TGSI::TEMP0x);
rsv.set(TGSI::TEMP0y);
rsv.set(TGSI::TEMP0z);
rsv.set(TGSI::TEMP0w);
rsv.set(TGSI::TEMP0);
rsv.set(TGSI::SV0x);
rsv.set(TGSI::SV0y);
rsv.set(TGSI::SV0z);
rsv.set(TGSI::SV0w);
rsv.set(TGSI::SV0);
rsv.set(TGSI::SV1x);
rsv.set(TGSI::SV1y);
rsv.set(TGSI::SV1z);
rsv.set(TGSI::SV1w);
rsv.set(TGSI::SV1);
rsv.set(TGSI::SV2x);
rsv.set(TGSI::SV2y);
rsv.set(TGSI::SV2z);
rsv.set(TGSI::SV2w);
rsv.set(TGSI::SV2);
rsv.set(TGSI::SV3x);
rsv.set(TGSI::SV3y);
rsv.set(TGSI::SV3z);
rsv.set(TGSI::SV3w);
rsv.set(TGSI::SV3);
rsv.set(TGSI::ADDR0x);
rsv.set(TGSI::ADDR0y);
rsv.set(TGSI::ADDR0z);
rsv.set(TGSI::ADDR0w);
rsv.set(TGSI::ADDR0);
return rsv;
}
void TGSIRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator ii,
int spadj, unsigned int fiop,
RegScavenger *rs) const {
unsigned i = 0;
MachineInstr &mi = *ii;
DebugLoc dl = mi.getDebugLoc();
MachineFunction &mf = *mi.getParent()->getParent();
assert(spadj == 0);
while (!mi.getOperand(i).isFI()) {
++i;
assert(i < mi.getNumOperands() && "Instr doesn't have FrameIndex operand!");
}
int frameidx = mi.getOperand(i).getIndex();
int offset = mf.getFrameInfo()->getObjectOffset(frameidx);
// Replace frame index with a frame pointer reference.
BuildMI(*mi.getParent(), ii, dl, TII.get(TGSI::UADDs), TGSI::TEMP0y)
.addReg(TGSI::TEMP0x).addImm(offset);
mi.getOperand(i).ChangeToRegister(TGSI::TEMP0y, false);
}
unsigned TGSIRegisterInfo::getFrameRegister(const MachineFunction &MF) const {
llvm_unreachable("What is the frame register");
return 0;
}
unsigned TGSIRegisterInfo::getEHExceptionRegister() const {
llvm_unreachable("What is the exception register");
return 0;
}
unsigned TGSIRegisterInfo::getEHHandlerRegister() const {
llvm_unreachable("What is the exception handler register");
return 0;
}
|