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)
99#define RRCAS_multi_cases(NAME) NAME##rir : case NAME##rii
103 switch (
MI.getOpcode()) {
114#undef RRCAS_multi_cases
120class EliminateFrameIndex {
121 const TargetInstrInfo &
TII;
122 const TargetRegisterInfo &
TRI;
124 MachineBasicBlock &
MBB;
130 inline MCRegister getSubReg(MCRegister
Reg,
unsigned Idx)
const {
131 return TRI.getSubReg(
Reg, Idx);
133 inline const MCInstrDesc &
get(
unsigned Opcode)
const {
134 return TII.get(Opcode);
136 inline MachineInstrBuilder
build(
const MCInstrDesc &MCID,
Register DestReg) {
139 inline MachineInstrBuilder
build(
unsigned InstOpc,
Register DestReg) {
140 return build(
get(InstOpc), DestReg);
142 inline MachineInstrBuilder
build(
const MCInstrDesc &MCID) {
145 inline MachineInstrBuilder
build(
unsigned InstOpc) {
152 void prepareReplaceFI(MachineInstr &
MI,
Register &FrameReg, int64_t &
Offset,
177 EliminateFrameIndex(
const TargetInstrInfo &
TII,
const TargetRegisterInfo &
TRI,
191 int64_t &
Offset, int64_t Bytes) {
204 build(VE::ANDrm, clobber).addReg(clobber).addImm(
M0(32));
205 build(VE::LEASLrri, clobber)
217 int64_t
Offset,
int FIOperandNum) {
222 MI.getOperand(FIOperandNum).ChangeToRegister(FrameReg,
false);
227 int64_t
Offset,
int FIOperandNum) {
228 assert(
MI.getOpcode() == VE::STQrii);
231 prepareReplaceFI(
MI, FrameReg,
Offset, 8);
234 Register SrcHiReg = getSubReg(SrcReg, VE::sub_even);
235 Register SrcLoReg = getSubReg(SrcReg, VE::sub_odd);
238 build(VE::STrii).addReg(FrameReg).addImm(0).addImm(0).addReg(SrcLoReg);
241 MI.setDesc(
get(VE::STrii));
242 MI.getOperand(3).setReg(SrcHiReg);
248 int64_t
Offset,
int FIOperandNum) {
249 assert(
MI.getOpcode() == VE::LDQrii);
252 prepareReplaceFI(
MI, FrameReg,
Offset, 8);
255 Register DestHiReg = getSubReg(DestReg, VE::sub_even);
256 Register DestLoReg = getSubReg(DestReg, VE::sub_odd);
259 build(VE::LDrii, DestLoReg).addReg(FrameReg).addImm(0).addImm(0);
261 MI.setDesc(
get(VE::LDrii));
262 MI.getOperand(0).setReg(DestHiReg);
268 int64_t
Offset,
int FIOperandNum) {
269 assert(
MI.getOpcode() == VE::STVMrii);
284 prepareReplaceFI(
MI, FrameReg,
Offset, 24);
287 bool isKill =
MI.getOperand(3).isKill();
291 for (
int i = 0; i < 3; ++i) {
292 build(VE::SVMmr, TmpReg).addReg(SrcReg).addImm(i);
294 build(VE::STrii).addReg(FrameReg).addImm(0).addImm(0).addReg(
300 MI.setDesc(
get(VE::STrii));
301 MI.getOperand(3).ChangeToRegister(TmpReg,
false,
false,
true);
306 int64_t
Offset,
int FIOperandNum) {
307 assert(
MI.getOpcode() == VE::LDVMrii);
322 prepareReplaceFI(
MI, FrameReg,
Offset, 24);
327 unsigned TmpReg = VE::SX16;
328 for (
int i = 0; i < 4; ++i) {
331 build(VE::LDrii, TmpReg).addReg(FrameReg).addImm(0).addImm(0);
336 MI.setDesc(
get(VE::LDrii));
337 MI.getOperand(0).ChangeToRegister(TmpReg,
true);
344 build(VE::LVMir_m, DestReg)
358 int64_t
Offset,
int FIOperandNum) {
359 assert(
MI.getOpcode() == VE::STVM512rii);
362 prepareReplaceFI(
MI, FrameReg,
Offset, 56);
365 Register SrcLoReg = getSubReg(SrcReg, VE::sub_vm_odd);
366 Register SrcHiReg = getSubReg(SrcReg, VE::sub_vm_even);
367 bool isKill =
MI.getOperand(3).isKill();
373 for (
int i = 0; i < 4; ++i) {
374 LastMI =
build(VE::SVMmr, TmpReg).addReg(SrcLoReg).addImm(i);
376 build(VE::STrii).addReg(FrameReg).addImm(0).addImm(0).addReg(
384 for (
int i = 0; i < 3; ++i) {
385 build(VE::SVMmr, TmpReg).addReg(SrcHiReg).addImm(i);
387 build(VE::STrii).addReg(FrameReg).addImm(0).addImm(0).addReg(
392 LastMI =
build(VE::SVMmr, TmpReg).addReg(SrcHiReg).addImm(3);
398 MI.setDesc(
get(VE::STrii));
399 MI.getOperand(3).ChangeToRegister(TmpReg,
false,
false,
true);
404 int64_t
Offset,
int FIOperandNum) {
405 assert(
MI.getOpcode() == VE::LDVM512rii);
408 prepareReplaceFI(
MI, FrameReg,
Offset, 56);
411 Register DestLoReg = getSubReg(DestReg, VE::sub_vm_odd);
412 Register DestHiReg = getSubReg(DestReg, VE::sub_vm_even);
416 build(VE::IMPLICIT_DEF, DestReg);
417 for (
int i = 0; i < 4; ++i) {
419 build(VE::LDrii, TmpReg).addReg(FrameReg).addImm(0).addImm(0);
421 build(VE::LVMir_m, DestLoReg)
427 for (
int i = 0; i < 3; ++i) {
429 build(VE::LDrii, TmpReg).addReg(FrameReg).addImm(0).addImm(0);
431 build(VE::LVMir_m, DestHiReg)
437 MI.setDesc(
get(VE::LDrii));
438 MI.getOperand(0).ChangeToRegister(TmpReg,
true);
447 int64_t
Offset,
int FIOperandNum) {
448 switch (
MI.getOpcode()) {
450 processSTQ(
MI, FrameReg,
Offset, FIOperandNum);
453 processLDQ(
MI, FrameReg,
Offset, FIOperandNum);
456 processSTVM(
MI, FrameReg,
Offset, FIOperandNum);
459 processLDVM(
MI, FrameReg,
Offset, FIOperandNum);
462 processSTVM512(
MI, FrameReg,
Offset, FIOperandNum);
465 processLDVM512(
MI, FrameReg,
Offset, FIOperandNum);
468 prepareReplaceFI(
MI, FrameReg,
Offset);
473 int SPAdj,
unsigned FIOperandNum,
475 assert(SPAdj == 0 &&
"Unexpected");
478 int FrameIndex =
MI.getOperand(FIOperandNum).getIndex();
486 EliminateFrameIndex EFI(
TII,
TRI,
DL, *
MI.getParent(),
II);
491 TFI.getFrameIndexReference(MF, FrameIndex, FrameReg).getFixed();
494 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 & addReg(Register RegNo, RegState Flags={}, unsigned SubReg=0) const
Add a new virtual register operand.
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate 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.
constexpr RegState getKillRegState(bool B)
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.
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