bool Z80FrameLowering::restoreCalleeSavedRegisters( MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, std::vector<CalleeSavedInfo> &CSI, const TargetRegisterInfo *TRI) const { const MachineFunction &MF = *MBB.getParent(); bool UseShadow = shouldUseShadow(MF); DebugLoc DL = MBB.findDebugLoc(MI); for (unsigned i = 0, e = CSI.size(); i != e; ++i) { unsigned Reg = CSI[i].getReg(); // Non-index registers can be spilled to shadow registers. if (UseShadow && !Z80::I24RegClass.contains(Reg) && !Z80::I16RegClass.contains(Reg)) continue; MachineInstrBuilder MIB; if (Reg == Z80::AF) MIB = BuildMI(MBB, MI, DL, TII.get(Is24Bit ? Z80::POP24AF : Z80::POP16AF)); else MIB = BuildMI(MBB, MI, DL, TII.get(Is24Bit ? Z80::POP24r : Z80::POP16r), Reg); MIB.setMIFlag(MachineInstr::FrameDestroy); } if (UseShadow) shadowCalleeSavedRegisters(MBB, MI, DL, MachineInstr::FrameDestroy, CSI); return true; }
bool Z80FrameLowering::spillCalleeSavedRegisters( MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, const std::vector<CalleeSavedInfo> &CSI, const TargetRegisterInfo *TRI) const { const MachineFunction &MF = *MBB.getParent(); const MachineRegisterInfo &MRI = MF.getRegInfo(); bool UseShadow = shouldUseShadow(MF); DebugLoc DL = MBB.findDebugLoc(MI); if (UseShadow) shadowCalleeSavedRegisters(MBB, MI, DL, MachineInstr::FrameSetup, CSI); for (unsigned i = CSI.size(); i != 0; --i) { unsigned Reg = CSI[i - 1].getReg(); // Non-index registers can be spilled to shadow registers. if (UseShadow && !Z80::I24RegClass.contains(Reg) && !Z80::I16RegClass.contains(Reg)) continue; bool isLiveIn = MRI.isLiveIn(Reg); if (!isLiveIn) MBB.addLiveIn(Reg); // Decide whether we can add a kill flag to the use. bool CanKill = !isLiveIn; // Check if any subregister is live-in if (CanKill) { for (MCRegAliasIterator AReg(Reg, TRI, false); AReg.isValid(); ++AReg) { if (MRI.isLiveIn(*AReg)) { CanKill = false; break; } } } // Do not set a kill flag on values that are also marked as live-in. This // happens with the @llvm-returnaddress intrinsic and with arguments // passed in callee saved registers. // Omitting the kill flags is conservatively correct even if the live-in // is not used after all. MachineInstrBuilder MIB; if (Reg == Z80::AF) MIB = BuildMI(MBB, MI, DL, TII.get(Is24Bit ? Z80::PUSH24AF : Z80::PUSH16AF)); else MIB = BuildMI(MBB, MI, DL, TII.get(Is24Bit ? Z80::PUSH24r : Z80::PUSH16r)) .addReg(Reg, getKillRegState(CanKill)); MIB.setMIFlag(MachineInstr::FrameSetup); } return true; }