void AVRInstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, unsigned SrcReg, bool isKill, int FrameIndex, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI) const { MachineFunction &MF = *MBB.getParent(); DebugLoc DL; if (MI != MBB.end()) { DL = MI->getDebugLoc(); } const MachineFrameInfo &MFI = *MF.getFrameInfo(); MachineMemOperand *MMO = MF.getMachineMemOperand( MachinePointerInfo::getFixedStack(MF, FrameIndex), MachineMemOperand::MOStore, MFI.getObjectSize(FrameIndex), MFI.getObjectAlignment(FrameIndex)); unsigned Opcode = 0; if (RC->hasType(MVT::i8)) { Opcode = AVR::STDPtrQRr; } else if (RC->hasType(MVT::i16)) { Opcode = AVR::STDWPtrQRr; } else { llvm_unreachable("Cannot store this register into a stack slot!"); } BuildMI(MBB, MI, DL, get(Opcode)) .addFrameIndex(FrameIndex) .addImm(0) .addReg(SrcReg, getKillRegState(isKill)) .addMemOperand(MMO); }
void AVRInstrInfo::copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, const DebugLoc &DL, unsigned DestReg, unsigned SrcReg, bool KillSrc) const { unsigned Opc; if (AVR::GPR8RegClass.contains(DestReg, SrcReg)) { Opc = AVR::MOVRdRr; } else if (AVR::DREGSRegClass.contains(DestReg, SrcReg)) { Opc = AVR::MOVWRdRr; } else if (SrcReg == AVR::SP && AVR::DREGSRegClass.contains(DestReg)) { Opc = AVR::SPREAD; } else if (DestReg == AVR::SP && AVR::DREGSRegClass.contains(SrcReg)) { Opc = AVR::SPWRITE; } else { llvm_unreachable("Impossible reg-to-reg copy"); } BuildMI(MBB, MI, DL, get(Opc), DestReg) .addReg(SrcReg, getKillRegState(KillSrc)); }
bool AVRFrameLowering::spillCalleeSavedRegisters( MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, const std::vector<CalleeSavedInfo> &CSI, const TargetRegisterInfo *TRI) const { if (CSI.empty()) { return false; } unsigned CalleeFrameSize = 0; DebugLoc DL = MBB.findDebugLoc(MI); MachineFunction &MF = *MBB.getParent(); const AVRSubtarget &STI = MF.getSubtarget<AVRSubtarget>(); const TargetInstrInfo &TII = *STI.getInstrInfo(); AVRMachineFunctionInfo *AVRFI = MF.getInfo<AVRMachineFunctionInfo>(); for (unsigned i = CSI.size(); i != 0; --i) { unsigned Reg = CSI[i - 1].getReg(); bool IsNotLiveIn = !MBB.isLiveIn(Reg); assert(TRI->getRegSizeInBits(*TRI->getMinimalPhysRegClass(Reg)) == 8 && "Invalid register size"); // Add the callee-saved register as live-in only if it is not already a // live-in register, this usually happens with arguments that are passed // through callee-saved registers. if (IsNotLiveIn) { MBB.addLiveIn(Reg); } // Do not kill the register when it is an input argument. BuildMI(MBB, MI, DL, TII.get(AVR::PUSHRr)) .addReg(Reg, getKillRegState(IsNotLiveIn)) .setMIFlag(MachineInstr::FrameSetup); ++CalleeFrameSize; } AVRFI->setCalleeSavedFrameSize(CalleeFrameSize); return true; }