diff options
Diffstat (limited to 'llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp')
-rw-r--r-- | llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp | 179 |
1 files changed, 4 insertions, 175 deletions
diff --git a/llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp b/llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp index 638e4e00d028..2f7cdfcf7bde 100644 --- a/llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp +++ b/llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp @@ -818,7 +818,7 @@ bool SystemZELFFrameLowering::usePackedStack(MachineFunction &MF) const { } SystemZXPLINKFrameLowering::SystemZXPLINKFrameLowering() - : SystemZFrameLowering(TargetFrameLowering::StackGrowsDown, Align(32), 0, + : SystemZFrameLowering(TargetFrameLowering::StackGrowsUp, Align(32), 128, Align(32), /* StackRealignable */ false), RegSpillOffsets(-1) { @@ -990,183 +990,12 @@ bool SystemZXPLINKFrameLowering::spillCalleeSavedRegisters( return true; } -bool SystemZXPLINKFrameLowering::restoreCalleeSavedRegisters( - MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, - MutableArrayRef<CalleeSavedInfo> CSI, const TargetRegisterInfo *TRI) const { - - if (CSI.empty()) - return false; - - MachineFunction &MF = *MBB.getParent(); - SystemZMachineFunctionInfo *ZFI = MF.getInfo<SystemZMachineFunctionInfo>(); - const SystemZSubtarget &Subtarget = MF.getSubtarget<SystemZSubtarget>(); - const TargetInstrInfo *TII = Subtarget.getInstrInfo(); - auto &Regs = Subtarget.getSpecialRegisters<SystemZXPLINK64Registers>(); - - DebugLoc DL = MBBI != MBB.end() ? MBBI->getDebugLoc() : DebugLoc(); - - // Restore FPRs in the normal TargetInstrInfo way. - for (unsigned I = 0, E = CSI.size(); I != E; ++I) { - unsigned Reg = CSI[I].getReg(); - if (SystemZ::FP64BitRegClass.contains(Reg)) - TII->loadRegFromStackSlot(MBB, MBBI, Reg, CSI[I].getFrameIdx(), - &SystemZ::FP64BitRegClass, TRI); - if (SystemZ::VR128BitRegClass.contains(Reg)) - TII->loadRegFromStackSlot(MBB, MBBI, Reg, CSI[I].getFrameIdx(), - &SystemZ::VR128BitRegClass, TRI); - } - - // Restore call-saved GPRs (but not call-clobbered varargs, which at - // this point might hold return values). - SystemZ::GPRRegs RestoreGPRs = ZFI->getRestoreGPRRegs(); - if (RestoreGPRs.LowGPR) { - assert(isInt<20>(Regs.getStackPointerBias() + RestoreGPRs.GPROffset)); - if (RestoreGPRs.LowGPR == RestoreGPRs.HighGPR) - // Build an LG/L instruction. - BuildMI(MBB, MBBI, DL, TII->get(SystemZ::LG), RestoreGPRs.LowGPR) - .addReg(Regs.getStackPointerRegister()) - .addImm(Regs.getStackPointerBias() + RestoreGPRs.GPROffset) - .addReg(0); - else { - // Build an LMG/LM instruction. - MachineInstrBuilder MIB = BuildMI(MBB, MBBI, DL, TII->get(SystemZ::LMG)); - - // Add the explicit register operands. - MIB.addReg(RestoreGPRs.LowGPR, RegState::Define); - MIB.addReg(RestoreGPRs.HighGPR, RegState::Define); - - // Add the address. - MIB.addReg(Regs.getStackPointerRegister()); - MIB.addImm(Regs.getStackPointerBias() + RestoreGPRs.GPROffset); - - // Do a second scan adding regs as being defined by instruction - for (unsigned I = 0, E = CSI.size(); I != E; ++I) { - unsigned Reg = CSI[I].getReg(); - if (Reg > RestoreGPRs.LowGPR && Reg < RestoreGPRs.HighGPR) - MIB.addReg(Reg, RegState::ImplicitDefine); - } - } - } - - return true; -} - void SystemZXPLINKFrameLowering::emitPrologue(MachineFunction &MF, - MachineBasicBlock &MBB) const { - assert(&MF.front() == &MBB && "Shrink-wrapping not yet supported"); - const SystemZSubtarget &Subtarget = MF.getSubtarget<SystemZSubtarget>(); - SystemZMachineFunctionInfo *ZFI = MF.getInfo<SystemZMachineFunctionInfo>(); - MachineBasicBlock::iterator MBBI = MBB.begin(); - auto *ZII = static_cast<const SystemZInstrInfo *>(Subtarget.getInstrInfo()); - auto &Regs = Subtarget.getSpecialRegisters<SystemZXPLINK64Registers>(); - MachineFrameInfo &MFFrame = MF.getFrameInfo(); - MachineInstr *StoreInstr = nullptr; - bool HasFP = hasFP(MF); - // Debug location must be unknown since the first debug location is used - // to determine the end of the prologue. - DebugLoc DL; - uint64_t Offset = 0; - - // TODO: Support leaf functions; only add size of save+reserved area when - // function is non-leaf. - MFFrame.setStackSize(MFFrame.getStackSize() + Regs.getCallFrameSize()); - uint64_t StackSize = MFFrame.getStackSize(); - - // FIXME: Implement support for large stack sizes, when the stack extension - // routine needs to be called. - if (StackSize > 1024 * 1024) { - llvm_unreachable("Huge Stack Frame not yet supported on z/OS"); - } - - if (ZFI->getSpillGPRRegs().LowGPR) { - // Skip over the GPR saves. - if ((MBBI != MBB.end()) && ((MBBI->getOpcode() == SystemZ::STMG))) { - const int Operand = 3; - // Now we can set the offset for the operation, since now the Stack - // has been finalized. - Offset = Regs.getStackPointerBias() + MBBI->getOperand(Operand).getImm(); - // Maximum displacement for STMG instruction. - if (isInt<20>(Offset - StackSize)) - Offset -= StackSize; - else - StoreInstr = &*MBBI; - MBBI->getOperand(Operand).setImm(Offset); - ++MBBI; - } else - llvm_unreachable("Couldn't skip over GPR saves"); - } - - if (StackSize) { - MachineBasicBlock::iterator InsertPt = StoreInstr ? StoreInstr : MBBI; - // Allocate StackSize bytes. - int64_t Delta = -int64_t(StackSize); - - // In case the STM(G) instruction also stores SP (R4), but the displacement - // is too large, the SP register is manipulated first before storing, - // resulting in the wrong value stored and retrieved later. In this case, we - // need to temporarily save the value of SP, and store it later to memory. - if (StoreInstr && HasFP) { - // Insert LR r0,r4 before STMG instruction. - BuildMI(MBB, InsertPt, DL, ZII->get(SystemZ::LGR)) - .addReg(SystemZ::R0D, RegState::Define) - .addReg(SystemZ::R4D); - // Insert ST r0,xxx(,r4) after STMG instruction. - BuildMI(MBB, MBBI, DL, ZII->get(SystemZ::STG), SystemZ::R0D) - .addReg(SystemZ::R4D) - .addImm(Offset) - .addReg(0); - } - - emitIncrement(MBB, InsertPt, DL, Regs.getStackPointerRegister(), Delta, - ZII); - } - - if (HasFP) { - // Copy the base of the frame to Frame Pointer Register. - BuildMI(MBB, MBBI, DL, ZII->get(SystemZ::LGR), - Regs.getFramePointerRegister()) - .addReg(Regs.getStackPointerRegister()); - - // Mark the FramePtr as live at the beginning of every block except - // the entry block. (We'll have marked R8 as live on entry when - // saving the GPRs.) - for (auto I = std::next(MF.begin()), E = MF.end(); I != E; ++I) - I->addLiveIn(Regs.getFramePointerRegister()); - } -} + MachineBasicBlock &MBB) const {} void SystemZXPLINKFrameLowering::emitEpilogue(MachineFunction &MF, - MachineBasicBlock &MBB) const { - const SystemZSubtarget &Subtarget = MF.getSubtarget<SystemZSubtarget>(); - MachineBasicBlock::iterator MBBI = MBB.getLastNonDebugInstr(); - SystemZMachineFunctionInfo *ZFI = MF.getInfo<SystemZMachineFunctionInfo>(); - MachineFrameInfo &MFFrame = MF.getFrameInfo(); - auto *ZII = static_cast<const SystemZInstrInfo *>(Subtarget.getInstrInfo()); - auto &Regs = Subtarget.getSpecialRegisters<SystemZXPLINK64Registers>(); - - // Skip the return instruction. - assert(MBBI->isReturn() && "Can only insert epilogue into returning blocks"); - - uint64_t StackSize = MFFrame.getStackSize(); - if (StackSize) { - unsigned SPReg = Regs.getStackPointerRegister(); - if (ZFI->getRestoreGPRRegs().LowGPR != SPReg) { - DebugLoc DL = MBBI->getDebugLoc(); - emitIncrement(MBB, MBBI, DL, SPReg, StackSize, ZII); - } - } -} + MachineBasicBlock &MBB) const {} bool SystemZXPLINKFrameLowering::hasFP(const MachineFunction &MF) const { - return (MF.getFrameInfo().hasVarSizedObjects()); -} - -void SystemZXPLINKFrameLowering::processFunctionBeforeFrameFinalized( - MachineFunction &MF, RegScavenger *RS) const { - MachineFrameInfo &MFFrame = MF.getFrameInfo(); - const SystemZSubtarget &Subtarget = MF.getSubtarget<SystemZSubtarget>(); - auto &Regs = Subtarget.getSpecialRegisters<SystemZXPLINK64Registers>(); - - // Setup stack frame offset - MFFrame.setOffsetAdjustment(Regs.getStackPointerBias()); + return false; } |