15 #define GET_REGINFO_TARGET_DESC
16 #include "SystemZGenRegisterInfo.inc"
25 static const uint16_t CalleeSavedRegs[] = {
26 SystemZ::R6D, SystemZ::R7D, SystemZ::R8D, SystemZ::R9D,
27 SystemZ::R10D, SystemZ::R11D, SystemZ::R12D, SystemZ::R13D,
28 SystemZ::R14D, SystemZ::R15D,
29 SystemZ::F8D, SystemZ::F9D, SystemZ::F10D, SystemZ::F11D,
30 SystemZ::F12D, SystemZ::F13D, SystemZ::F14D, SystemZ::F15D,
34 return CalleeSavedRegs;
44 Reserved.
set(SystemZ::R11D);
45 Reserved.
set(SystemZ::R11L);
46 Reserved.
set(SystemZ::R11H);
47 Reserved.
set(SystemZ::R10Q);
51 Reserved.
set(SystemZ::R15D);
52 Reserved.
set(SystemZ::R15L);
53 Reserved.
set(SystemZ::R15H);
54 Reserved.
set(SystemZ::R14Q);
60 int SPAdj,
unsigned FIOperandNum,
62 assert(SPAdj == 0 &&
"Outgoing arguments should be part of the frame");
72 int FrameIndex = MI->getOperand(FIOperandNum).getIndex();
75 MI->getOperand(FIOperandNum + 1).getImm());
78 if (MI->isDebugValue()) {
79 MI->getOperand(FIOperandNum).ChangeToRegister(BasePtr,
false);
80 MI->getOperand(FIOperandNum + 1).ChangeToImmediate(Offset);
86 unsigned Opcode = MI->getOpcode();
89 MI->getOperand(FIOperandNum).ChangeToRegister(BasePtr,
false);
93 int64_t OldOffset = Offset;
94 int64_t Mask = 0xffff;
96 Offset = OldOffset & Mask;
99 assert(Mask &&
"One offset must be OK");
100 }
while (!OpcodeForOffset);
102 unsigned ScratchReg =
104 int64_t HighOffset = OldOffset - Offset;
107 && MI->getOperand(FIOperandNum + 2).getReg() == 0) {
111 MI->getOperand(FIOperandNum).ChangeToRegister(BasePtr,
false);
112 MI->getOperand(FIOperandNum + 2).ChangeToRegister(ScratchReg,
118 BuildMI(MBB, MI, DL, TII.get(LAOpcode),ScratchReg)
124 BuildMI(MBB, MI, DL, TII.get(SystemZ::AGR),ScratchReg)
133 MI->setDesc(TII.get(OpcodeForOffset));
134 MI->getOperand(FIOperandNum + 1).ChangeToImmediate(Offset);
140 return TFI->
hasFP(MF) ? SystemZ::R11D : SystemZ::R15D;
const MachineFunction * getParent() const
void ChangeToRegister(unsigned Reg, bool isDef, bool isImp=false, bool isKill=false, bool isDead=false, bool isUndef=false, bool isDebug=false)
unsigned createVirtualRegister(const TargetRegisterClass *RegClass)
virtual void eliminateFrameIndex(MachineBasicBlock::iterator MI, int SPAdj, unsigned FIOperandNum, RegScavenger *RS) const LLVM_OVERRIDE
virtual const SystemZInstrInfo * getInstrInfo() const LLVM_OVERRIDE
const HexagonInstrInfo * TII
virtual bool hasFP(const MachineFunction &MF) const =0
void loadImmediate(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, unsigned Reg, uint64_t Value) const
const MachineInstrBuilder & addImm(int64_t Val) const
bundle_iterator< MachineInstr, instr_iterator > iterator
unsigned getOpcodeForOffset(unsigned Opcode, int64_t Offset) const
const MachineOperand & getOperand(unsigned i) const
SystemZRegisterInfo(SystemZTargetMachine &tm)
MachineInstrBuilder BuildMI(MachineFunction &MF, DebugLoc DL, const MCInstrDesc &MCID)
virtual BitVector getReservedRegs(const MachineFunction &MF) const LLVM_OVERRIDE
virtual const TargetFrameLowering * getFrameLowering() const
virtual int getFrameIndexOffset(const MachineFunction &MF, int FI) const
virtual unsigned getFrameRegister(const MachineFunction &MF) const LLVM_OVERRIDE
MachineRegisterInfo & getRegInfo()
const TargetMachine & getTarget() const
virtual const uint16_t * getCalleeSavedRegs(const MachineFunction *MF=0) const LLVM_OVERRIDE
const MachineInstrBuilder & addReg(unsigned RegNo, unsigned flags=0, unsigned SubReg=0) const