LLVM: lib/Target/Lanai/LanaiRegisterInfo.cpp Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
26
27#define GET_REGINFO_TARGET_DESC
28#include "LanaiGenRegisterInfo.inc"
29
30using namespace llvm;
31
33
36 return CSR_SaveList;
37}
38
60
65
67 switch (Opcode) {
68 case Lanai::ADD_I_LO:
69 case Lanai::SUB_I_LO:
70 case Lanai::ADD_F_I_LO:
71 case Lanai::SUB_F_I_LO:
72 case Lanai::ADDC_I_LO:
73 case Lanai::SUBB_I_LO:
74 case Lanai::ADDC_F_I_LO:
75 case Lanai::SUBB_F_I_LO:
76 return true;
77 default:
78 return false;
79 }
80}
81
83 switch (Opcode) {
84 case Lanai::ADD_I_LO:
85 return Lanai::SUB_I_LO;
86 case Lanai::SUB_I_LO:
87 return Lanai::ADD_I_LO;
88 case Lanai::ADD_F_I_LO:
89 return Lanai::SUB_F_I_LO;
90 case Lanai::SUB_F_I_LO:
91 return Lanai::ADD_F_I_LO;
92 case Lanai::ADDC_I_LO:
93 return Lanai::SUBB_I_LO;
94 case Lanai::SUBB_I_LO:
95 return Lanai::ADDC_I_LO;
96 case Lanai::ADDC_F_I_LO:
97 return Lanai::SUBB_F_I_LO;
98 case Lanai::SUBB_F_I_LO:
99 return Lanai::ADDC_F_I_LO;
100 default:
102 }
103}
104
106 switch (Opcode) {
107 case Lanai::LDBs_RI:
108 return Lanai::LDBs_RR;
109 case Lanai::LDBz_RI:
110 return Lanai::LDBz_RR;
111 case Lanai::LDHs_RI:
112 return Lanai::LDHs_RR;
113 case Lanai::LDHz_RI:
114 return Lanai::LDHz_RR;
115 case Lanai::LDW_RI:
116 return Lanai::LDW_RR;
117 case Lanai::STB_RI:
118 return Lanai::STB_RR;
119 case Lanai::STH_RI:
120 return Lanai::STH_RR;
121 case Lanai::SW_RI:
122 return Lanai::SW_RR;
123 default:
125 }
126}
127
129 int SPAdj, unsigned FIOperandNum,
131 assert(SPAdj == 0 && "Unexpected");
132
137 bool HasFP = TFI->hasFP(MF);
139
140 int FrameIndex = MI.getOperand(FIOperandNum).getIndex();
141
143 MI.getOperand(FIOperandNum + 1).getImm();
144
145
146
147 if (!HasFP || (hasStackRealignment(MF) && FrameIndex >= 0))
149
151 if (FrameIndex >= 0) {
154 else if (hasStackRealignment(MF))
155 FrameReg = Lanai::SP;
156 }
157
158
159
160
161
164 assert(RS && "Register scavenging must be on");
165 Register Reg = RS->FindUnusedReg(&Lanai::GPRRegClass);
166 if (!Reg)
167 Reg = RS->scavengeRegisterBackwards(Lanai::GPRRegClass, II, false, SPAdj);
168 assert(Reg && "Register scavenger failed");
169
170 bool HasNegOffset = false;
171
172
174 HasNegOffset = true;
176 }
177
179
180 BuildMI(*MI.getParent(), II, DL, TII->get(Lanai::MOVHI), Reg)
182 BuildMI(*MI.getParent(), II, DL, TII->get(Lanai::OR_I_LO), Reg)
185 } else {
186
187 BuildMI(*MI.getParent(), II, DL, TII->get(Lanai::ADD_I_LO), Reg)
190 }
191
192 if (MI.getOpcode() == Lanai::ADD_I_LO) {
194 HasNegOffset ? TII->get(Lanai::SUB_R) : TII->get(Lanai::ADD_R),
195 MI.getOperand(0).getReg())
199 MI.eraseFromParent();
200 return true;
201 }
204 if (HasNegOffset) {
205
206
208 "Unexpected ALU op in RRM instruction");
210 }
211 } else
212 llvm_unreachable("Unexpected opcode in frame index operation");
213
214 MI.getOperand(FIOperandNum).ChangeToRegister(FrameReg, false);
215 MI.getOperand(FIOperandNum + 1)
216 .ChangeToRegister(Reg, false, false,
217 true);
218 return false;
219 }
220
221
222
223
226
227
228
229
231 MI.getOperand(0).getReg())
234 MI.eraseFromParent();
235 return true;
236 }
237
238 MI.getOperand(FIOperandNum).ChangeToRegister(FrameReg, false);
239 MI.getOperand(FIOperandNum + 1).ChangeToImmediate(Offset);
240 return false;
241}
242
245
246
248 return true;
249
250 return false;
251}
252
254
257 return Lanai::FP;
258}
259
261
265 return CSR_RegMask;
266}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
const TargetInstrInfo & TII
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
This file implements the BitVector class.
static unsigned getRRMOpcodeVariant(unsigned Opcode)
Definition LanaiRegisterInfo.cpp:105
static bool isALUArithLoOpcode(unsigned Opcode)
Definition LanaiRegisterInfo.cpp:66
static unsigned getOppositeALULoOpcode(unsigned Opcode)
Definition LanaiRegisterInfo.cpp:82
uint64_t IntrinsicInst * II
This file declares the machine register scavenger class.
MachineInstrBundleIterator< MachineInstr > iterator
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
bool hasVarSizedObjects() const
This method may be called any time after instruction selection is complete to determine if the stack ...
uint64_t getStackSize() const
Return the number of bytes that must be allocated to hold all of the fixed size frame objects.
int64_t getObjectOffset(int ObjectIdx) const
Return the assigned stack offset of the specified object from the incoming stack pointer.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
const MachineInstrBuilder & addReg(Register RegNo, unsigned flags=0, unsigned SubReg=0) const
Add a new virtual register operand.
Representation of each machine instruction.
Wrapper class representing virtual and physical registers.
Information about stack frame layout on the target.
bool hasFP(const MachineFunction &MF) const
hasFP - Return true if the specified function should have a dedicated frame pointer register.
TargetInstrInfo - Interface to description of machine instruction set.
virtual const TargetFrameLowering * getFrameLowering() const
virtual const TargetInstrInfo * getInstrInfo() const
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
This is an optimization pass for GlobalISel generic memory operations.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
constexpr bool isInt(int64_t x)
Checks if an integer fits into the given bit width.
static bool isRMOpcode(unsigned Opcode)
static bool isSPLSOpcode(unsigned Opcode)
LanaiRegisterInfo()
Definition LanaiRegisterInfo.cpp:32
Register getBaseRegister() const
Definition LanaiRegisterInfo.cpp:260
unsigned getRARegister() const
Definition LanaiRegisterInfo.cpp:253
bool hasBasePointer(const MachineFunction &MF) const
Definition LanaiRegisterInfo.cpp:243
bool requiresRegisterScavenging(const MachineFunction &MF) const override
Definition LanaiRegisterInfo.cpp:61
const uint16_t * getCalleeSavedRegs(const MachineFunction *MF=nullptr) const override
Definition LanaiRegisterInfo.cpp:35
const uint32_t * getCallPreservedMask(const MachineFunction &MF, CallingConv::ID) const override
Definition LanaiRegisterInfo.cpp:263
bool eliminateFrameIndex(MachineBasicBlock::iterator II, int SPAdj, unsigned FIOperandNum, RegScavenger *RS=nullptr) const override
Definition LanaiRegisterInfo.cpp:128
Register getFrameRegister(const MachineFunction &MF) const override
Definition LanaiRegisterInfo.cpp:256
BitVector getReservedRegs(const MachineFunction &MF) const override
Definition LanaiRegisterInfo.cpp:39