LLVM: lib/Target/VE/VERegisterInfo.cpp Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
14#include "VE.h"
23
24using namespace llvm;
25
26#define DEBUG_TYPE "ve-register-info"
27
28#define GET_REGINFO_TARGET_DESC
29#include "VEGenRegisterInfo.inc"
30
31
33
38
39 default:
40 return CSR_SaveList;
42 return CSR_preserve_all_SaveList;
43 }
44}
45
48 switch (CC) {
50
51 default:
52 return CSR_RegMask;
54 return CSR_preserve_all_RegMask;
55 }
56}
57
59 return CSR_NoRegs_RegMask;
60}
61
64
65 const Register ReservedRegs[] = {
66 VE::SX8,
67 VE::SX9,
68 VE::SX10,
69 VE::SX11,
70
71
72 VE::SX12,
73 VE::SX13,
74
75 VE::SX14,
76 VE::SX15,
77 VE::SX16,
78 VE::SX17,
79
80
81 };
82
83 for (auto R : ReservedRegs)
85 ++ItAlias)
87
88
91
93}
94
97 return &VE::I64RegClass;
98}
99
101
102 unsigned OffDisp = 2;
103
104#define RRCAS_multi_cases(NAME) NAME##rir : case NAME##rii
105
106 {
108 switch (MI.getOpcode()) {
109 case INLINEASM:
114
115 OffDisp = 1;
116 break;
117 }
118 }
119#undef RRCAS_multi_cases
120
121 return OffDisp;
122}
123
124namespace {
125class EliminateFrameIndex {
126 const TargetInstrInfo &TII;
127 const TargetRegisterInfo &TRI;
129 MachineBasicBlock &MBB;
132
133
134 MachineFunction &getFunc() const { return *MBB.getParent(); }
135 inline MCRegister getSubReg(MCRegister Reg, unsigned Idx) const {
136 return TRI.getSubReg(Reg, Idx);
137 }
138 inline const MCInstrDesc &get(unsigned Opcode) const {
139 return TII.get(Opcode);
140 }
141 inline MachineInstrBuilder build(const MCInstrDesc &MCID, Register DestReg) {
143 }
144 inline MachineInstrBuilder build(unsigned InstOpc, Register DestReg) {
145 return build(get(InstOpc), DestReg);
146 }
147 inline MachineInstrBuilder build(const MCInstrDesc &MCID) {
149 }
150 inline MachineInstrBuilder build(unsigned InstOpc) {
152 }
153
154
155
156
157 void prepareReplaceFI(MachineInstr &MI, Register &FrameReg, int64_t &Offset,
158 int64_t Bytes = 0);
159
160
161
163 int FIOperandNum);
164
165
166 void processSTQ(MachineInstr &MI, Register FrameReg, int64_t Offset,
167 int FIOperandNum);
168 void processLDQ(MachineInstr &MI, Register FrameReg, int64_t Offset,
169 int FIOperandNum);
170
171 void processSTVM(MachineInstr &MI, Register FrameReg, int64_t Offset,
172 int FIOperandNum);
173 void processLDVM(MachineInstr &MI, Register FrameReg, int64_t Offset,
174 int FIOperandNum);
175
176 void processSTVM512(MachineInstr &MI, Register FrameReg, int64_t Offset,
177 int FIOperandNum);
178 void processLDVM512(MachineInstr &MI, Register FrameReg, int64_t Offset,
179 int FIOperandNum);
180
181public:
182 EliminateFrameIndex(const TargetInstrInfo &TII, const TargetRegisterInfo &TRI,
186
187
188 void processMI(MachineInstr &MI, Register FrameReg, int64_t Offset,
189 int FIOperandNum);
190};
191}
192
193
194
196 int64_t &Offset, int64_t Bytes) {
198
199
200 return;
201 }
202
203
204
205
206
207
208 build(VE::LEAzii, clobber).addImm(0).addImm(0).addImm(Lo_32(Offset));
209 build(VE::ANDrm, clobber).addReg(clobber).addImm(M0(32));
210 build(VE::LEASLrri, clobber)
211 .addReg(clobber)
212 .addReg(FrameReg)
214
215
216 FrameReg = clobber;
218}
219
220
222 int64_t Offset, int FIOperandNum) {
224
225
226
227 MI.getOperand(FIOperandNum).ChangeToRegister(FrameReg, false);
229}
230
232 int64_t Offset, int FIOperandNum) {
233 assert(MI.getOpcode() == VE::STQrii);
235
236 prepareReplaceFI(MI, FrameReg, Offset, 8);
237
238 Register SrcReg = MI.getOperand(3).getReg();
239 Register SrcHiReg = getSubReg(SrcReg, VE::sub_even);
240 Register SrcLoReg = getSubReg(SrcReg, VE::sub_odd);
241
243 build(VE::STrii).addReg(FrameReg).addImm(0).addImm(0).addReg(SrcLoReg);
245
246 MI.setDesc(get(VE::STrii));
247 MI.getOperand(3).setReg(SrcHiReg);
250}
251
253 int64_t Offset, int FIOperandNum) {
254 assert(MI.getOpcode() == VE::LDQrii);
256
257 prepareReplaceFI(MI, FrameReg, Offset, 8);
258
259 Register DestReg = MI.getOperand(0).getReg();
260 Register DestHiReg = getSubReg(DestReg, VE::sub_even);
261 Register DestLoReg = getSubReg(DestReg, VE::sub_odd);
262
264 build(VE::LDrii, DestLoReg).addReg(FrameReg).addImm(0).addImm(0);
266 MI.setDesc(get(VE::LDrii));
267 MI.getOperand(0).setReg(DestHiReg);
270}
271
273 int64_t Offset, int FIOperandNum) {
274 assert(MI.getOpcode() == VE::STVMrii);
276
277
278
279
280
281
282
283
284
285
286
287
288
289 prepareReplaceFI(MI, FrameReg, Offset, 24);
290
291 Register SrcReg = MI.getOperand(3).getReg();
292 bool isKill = MI.getOperand(3).isKill();
293
294
296 for (int i = 0; i < 3; ++i) {
297 build(VE::SVMmr, TmpReg).addReg(SrcReg).addImm(i);
299 build(VE::STrii).addReg(FrameReg).addImm(0).addImm(0).addReg(
303 }
305 MI.setDesc(get(VE::STrii));
306 MI.getOperand(3).ChangeToRegister(TmpReg, false, false, true);
308}
309
311 int64_t Offset, int FIOperandNum) {
312 assert(MI.getOpcode() == VE::LDVMrii);
314
315
316
317
318
319
320
321
322
323
324
325
326
327 prepareReplaceFI(MI, FrameReg, Offset, 24);
328
329 Register DestReg = MI.getOperand(0).getReg();
330
331
332 unsigned TmpReg = VE::SX16;
333 for (int i = 0; i < 4; ++i) {
334 if (i != 3) {
336 build(VE::LDrii, TmpReg).addReg(FrameReg).addImm(0).addImm(0);
339 } else {
340
341 MI.setDesc(get(VE::LDrii));
342 MI.getOperand(0).ChangeToRegister(TmpReg, true);
343 }
344
345
346 if (i == 0)
348 else if (i != 3)
349 build(VE::LVMir_m, DestReg)
350 .addImm(i)
352 .addReg(DestReg);
353 else
354 BuildMI(*MI.getParent(), std::next(II), DL, get(VE::LVMir_m), DestReg)
358 }
360}
361
363 int64_t Offset, int FIOperandNum) {
364 assert(MI.getOpcode() == VE::STVM512rii);
366
367 prepareReplaceFI(MI, FrameReg, Offset, 56);
368
369 Register SrcReg = MI.getOperand(3).getReg();
370 Register SrcLoReg = getSubReg(SrcReg, VE::sub_vm_odd);
371 Register SrcHiReg = getSubReg(SrcReg, VE::sub_vm_even);
372 bool isKill = MI.getOperand(3).isKill();
373
374
376
378 for (int i = 0; i < 4; ++i) {
379 LastMI = build(VE::SVMmr, TmpReg).addReg(SrcLoReg).addImm(i);
381 build(VE::STrii).addReg(FrameReg).addImm(0).addImm(0).addReg(
385 }
386 if (isKill)
388
389 for (int i = 0; i < 3; ++i) {
390 build(VE::SVMmr, TmpReg).addReg(SrcHiReg).addImm(i);
392 build(VE::STrii).addReg(FrameReg).addImm(0).addImm(0).addReg(
396 }
397 LastMI = build(VE::SVMmr, TmpReg).addReg(SrcHiReg).addImm(3);
398 if (isKill) {
400
402 }
403 MI.setDesc(get(VE::STrii));
404 MI.getOperand(3).ChangeToRegister(TmpReg, false, false, true);
406}
407
409 int64_t Offset, int FIOperandNum) {
410 assert(MI.getOpcode() == VE::LDVM512rii);
412
413 prepareReplaceFI(MI, FrameReg, Offset, 56);
414
415 Register DestReg = MI.getOperand(0).getReg();
416 Register DestLoReg = getSubReg(DestReg, VE::sub_vm_odd);
417 Register DestHiReg = getSubReg(DestReg, VE::sub_vm_even);
418
419
421 build(VE::IMPLICIT_DEF, DestReg);
422 for (int i = 0; i < 4; ++i) {
424 build(VE::LDrii, TmpReg).addReg(FrameReg).addImm(0).addImm(0);
426 build(VE::LVMir_m, DestLoReg)
427 .addImm(i)
429 .addReg(DestLoReg);
431 }
432 for (int i = 0; i < 3; ++i) {
434 build(VE::LDrii, TmpReg).addReg(FrameReg).addImm(0).addImm(0);
436 build(VE::LVMir_m, DestHiReg)
437 .addImm(i)
439 .addReg(DestHiReg);
441 }
442 MI.setDesc(get(VE::LDrii));
443 MI.getOperand(0).ChangeToRegister(TmpReg, true);
444 BuildMI(*MI.getParent(), std::next(II), DL, get(VE::LVMir_m), DestHiReg)
449}
450
452 int64_t Offset, int FIOperandNum) {
453 switch (MI.getOpcode()) {
454 case VE::STQrii:
455 processSTQ(MI, FrameReg, Offset, FIOperandNum);
456 return;
457 case VE::LDQrii:
458 processLDQ(MI, FrameReg, Offset, FIOperandNum);
459 return;
460 case VE::STVMrii:
461 processSTVM(MI, FrameReg, Offset, FIOperandNum);
462 return;
463 case VE::LDVMrii:
464 processLDVM(MI, FrameReg, Offset, FIOperandNum);
465 return;
466 case VE::STVM512rii:
467 processSTVM512(MI, FrameReg, Offset, FIOperandNum);
468 return;
469 case VE::LDVM512rii:
470 processLDVM512(MI, FrameReg, Offset, FIOperandNum);
471 return;
472 }
473 prepareReplaceFI(MI, FrameReg, Offset);
475}
476
478 int SPAdj, unsigned FIOperandNum,
480 assert(SPAdj == 0 && "Unexpected");
481
483 int FrameIndex = MI.getOperand(FIOperandNum).getIndex();
484
491 EliminateFrameIndex EFI(TII, TRI, DL, *MI.getParent(), II);
492
493
496 TFI.getFrameIndexReference(MF, FrameIndex, FrameReg).getFixed();
498
499 EFI.processMI(MI, FrameReg, Offset, FIOperandNum);
500 return false;
501}
502
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
This file implements the BitVector class.
const HexagonInstrInfo * TII
Register const TargetRegisterInfo * TRI
Promote Memory to Register
uint64_t IntrinsicInst * II
static void replaceFI(MachineFunction &MF, MachineBasicBlock::iterator II, MachineInstr &MI, const DebugLoc &dl, unsigned FIOperandNum, int Offset, unsigned FramePtr)
static unsigned offsetToDisp(MachineInstr &MI)
Definition VERegisterInfo.cpp:100
#define RRCAS_multi_cases(NAME)
CallingConv::ID getCallingConv() const
getCallingConv()/setCallingConv(CC) - These method get and set the calling convention of this functio...
MCRegAliasIterator enumerates all registers aliasing Reg.
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
MachineInstrBundleIterator< MachineInstr > iterator
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
Function & getFunction()
Return the LLVM function that this machine code represents.
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.
LLVM_ABI bool addRegisterKilled(Register IncomingReg, const TargetRegisterInfo *RegInfo, bool AddIfNotFound=false)
We have determined MI kills a register.
Wrapper class representing virtual and physical registers.
TargetInstrInfo - Interface to description of machine instruction set.
const VEInstrInfo * getInstrInfo() const override
const VERegisterInfo * getRegisterInfo() const override
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
@ PreserveAll
Used for runtime calls that preserves (almost) all registers.
@ Fast
Attempts to make calls as fast as possible (e.g.
LLVM_ABI Error build(ArrayRef< Module * > Mods, SmallVector< char, 0 > &Symtab, StringTableBuilder &StrtabBuilder, BumpPtrAllocator &Alloc)
Fills in Symtab and StrtabBuilder with a valid symbol and string table for Mods.
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.
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
constexpr uint32_t Hi_32(uint64_t Value)
Return the high 32 bits of a 64 bit value.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
constexpr uint32_t Lo_32(uint64_t Value)
Return the low 32 bits of a 64 bit value.
unsigned getKillRegState(bool B)
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
unsigned M0(unsigned Val)
BitVector getReservedRegs(const MachineFunction &MF) const override
Definition VERegisterInfo.cpp:62
const uint32_t * getNoPreservedMask() const override
Definition VERegisterInfo.cpp:58
const MCPhysReg * getCalleeSavedRegs(const MachineFunction *MF) const override
Code Generation virtual methods...
Definition VERegisterInfo.cpp:35
bool eliminateFrameIndex(MachineBasicBlock::iterator II, int SPAdj, unsigned FIOperandNum, RegScavenger *RS=nullptr) const override
Definition VERegisterInfo.cpp:477
const uint32_t * getCallPreservedMask(const MachineFunction &MF, CallingConv::ID CC) const override
Definition VERegisterInfo.cpp:46
Register getFrameRegister(const MachineFunction &MF) const override
Definition VERegisterInfo.cpp:503
VERegisterInfo()
Definition VERegisterInfo.cpp:32
const TargetRegisterClass * getPointerRegClass(unsigned Kind) const override
Definition VERegisterInfo.cpp:96