26#define DEBUG_TYPE "ve-register-info"
28#define GET_REGINFO_TARGET_DESC
29#include "VEGenRegisterInfo.inc"
42 return CSR_preserve_all_SaveList;
54 return CSR_preserve_all_RegMask;
59 return CSR_NoRegs_RegMask;
83 for (
auto R : ReservedRegs)
97 return &VE::I64RegClass;
102 unsigned OffDisp = 2;
104#define RRCAS_multi_cases(NAME) NAME##rir : case NAME##rii
108 switch (
MI.getOpcode()) {
119#undef RRCAS_multi_cases
125class EliminateFrameIndex {
126 const TargetInstrInfo &
TII;
127 const TargetRegisterInfo &
TRI;
129 MachineBasicBlock &
MBB;
134 MachineFunction &getFunc()
const {
return *
MBB.
getParent(); }
135 inline MCRegister getSubReg(MCRegister
Reg,
unsigned Idx)
const {
136 return TRI.getSubReg(
Reg, Idx);
138 inline const MCInstrDesc &
get(
unsigned Opcode)
const {
139 return TII.get(Opcode);
141 inline MachineInstrBuilder
build(
const MCInstrDesc &MCID,
Register DestReg) {
144 inline MachineInstrBuilder
build(
unsigned InstOpc,
Register DestReg) {
145 return build(
get(InstOpc), DestReg);
147 inline MachineInstrBuilder
build(
const MCInstrDesc &MCID) {
150 inline MachineInstrBuilder
build(
unsigned InstOpc) {
157 void prepareReplaceFI(MachineInstr &
MI,
Register &FrameReg, int64_t &
Offset,
182 EliminateFrameIndex(
const TargetInstrInfo &
TII,
const TargetRegisterInfo &
TRI,
196 int64_t &
Offset, int64_t Bytes) {
209 build(VE::ANDrm, clobber).addReg(clobber).addImm(
M0(32));
210 build(VE::LEASLrri, clobber)
222 int64_t
Offset,
int FIOperandNum) {
227 MI.getOperand(FIOperandNum).ChangeToRegister(FrameReg,
false);
232 int64_t
Offset,
int FIOperandNum) {
233 assert(
MI.getOpcode() == VE::STQrii);
236 prepareReplaceFI(
MI, FrameReg,
Offset, 8);
239 Register SrcHiReg = getSubReg(SrcReg, VE::sub_even);
240 Register SrcLoReg = getSubReg(SrcReg, VE::sub_odd);
243 build(VE::STrii).addReg(FrameReg).addImm(0).addImm(0).addReg(SrcLoReg);
246 MI.setDesc(
get(VE::STrii));
247 MI.getOperand(3).setReg(SrcHiReg);
253 int64_t
Offset,
int FIOperandNum) {
254 assert(
MI.getOpcode() == VE::LDQrii);
257 prepareReplaceFI(
MI, FrameReg,
Offset, 8);
260 Register DestHiReg = getSubReg(DestReg, VE::sub_even);
261 Register DestLoReg = getSubReg(DestReg, VE::sub_odd);
264 build(VE::LDrii, DestLoReg).addReg(FrameReg).addImm(0).addImm(0);
266 MI.setDesc(
get(VE::LDrii));
267 MI.getOperand(0).setReg(DestHiReg);
273 int64_t
Offset,
int FIOperandNum) {
274 assert(
MI.getOpcode() == VE::STVMrii);
289 prepareReplaceFI(
MI, FrameReg,
Offset, 24);
292 bool isKill =
MI.getOperand(3).isKill();
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(
305 MI.setDesc(
get(VE::STrii));
306 MI.getOperand(3).ChangeToRegister(TmpReg,
false,
false,
true);
311 int64_t
Offset,
int FIOperandNum) {
312 assert(
MI.getOpcode() == VE::LDVMrii);
327 prepareReplaceFI(
MI, FrameReg,
Offset, 24);
332 unsigned TmpReg = VE::SX16;
333 for (
int i = 0; i < 4; ++i) {
336 build(VE::LDrii, TmpReg).addReg(FrameReg).addImm(0).addImm(0);
341 MI.setDesc(
get(VE::LDrii));
342 MI.getOperand(0).ChangeToRegister(TmpReg,
true);
349 build(VE::LVMir_m, DestReg)
363 int64_t
Offset,
int FIOperandNum) {
364 assert(
MI.getOpcode() == VE::STVM512rii);
367 prepareReplaceFI(
MI, FrameReg,
Offset, 56);
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();
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(
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(
397 LastMI =
build(VE::SVMmr, TmpReg).addReg(SrcHiReg).addImm(3);
403 MI.setDesc(
get(VE::STrii));
404 MI.getOperand(3).ChangeToRegister(TmpReg,
false,
false,
true);
409 int64_t
Offset,
int FIOperandNum) {
410 assert(
MI.getOpcode() == VE::LDVM512rii);
413 prepareReplaceFI(
MI, FrameReg,
Offset, 56);
416 Register DestLoReg = getSubReg(DestReg, VE::sub_vm_odd);
417 Register DestHiReg = getSubReg(DestReg, VE::sub_vm_even);
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)
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)
442 MI.setDesc(
get(VE::LDrii));
443 MI.getOperand(0).ChangeToRegister(TmpReg,
true);
452 int64_t
Offset,
int FIOperandNum) {
453 switch (
MI.getOpcode()) {
455 processSTQ(
MI, FrameReg,
Offset, FIOperandNum);
458 processLDQ(
MI, FrameReg,
Offset, FIOperandNum);
461 processSTVM(
MI, FrameReg,
Offset, FIOperandNum);
464 processLDVM(
MI, FrameReg,
Offset, FIOperandNum);
467 processSTVM512(
MI, FrameReg,
Offset, FIOperandNum);
470 processLDVM512(
MI, FrameReg,
Offset, FIOperandNum);
473 prepareReplaceFI(
MI, FrameReg,
Offset);
478 int SPAdj,
unsigned FIOperandNum,
480 assert(SPAdj == 0 &&
"Unexpected");
483 int FrameIndex =
MI.getOperand(FIOperandNum).getIndex();
491 EliminateFrameIndex EFI(
TII,
TRI,
DL, *
MI.getParent(),
II);
496 TFI.getFrameIndexReference(MF, FrameIndex, FrameReg).getFixed();
499 EFI.processMI(
MI, FrameReg,
Offset, FIOperandNum);
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)
#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
const uint32_t * getNoPreservedMask() const override
const MCPhysReg * getCalleeSavedRegs(const MachineFunction *MF) const override
Code Generation virtual methods...
bool eliminateFrameIndex(MachineBasicBlock::iterator II, int SPAdj, unsigned FIOperandNum, RegScavenger *RS=nullptr) const override
const uint32_t * getCallPreservedMask(const MachineFunction &MF, CallingConv::ID CC) const override
Register getFrameRegister(const MachineFunction &MF) const override
const TargetRegisterClass * getPointerRegClass(unsigned Kind) const override