diff options
author | Ulrich Weigand <ulrich.weigand@de.ibm.com> | 2018-03-02 20:40:11 +0000 |
---|---|---|
committer | Ulrich Weigand <ulrich.weigand@de.ibm.com> | 2018-03-02 20:40:11 +0000 |
commit | 8b19be46c770754cbeb4c8990c2cae0773203904 (patch) | |
tree | 8b0b619af9b45e5c748af94b27ebf7bbe8bd2fed /llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp | |
parent | 5eb64110d241cf2506f54ade3c2693beed42dd8f (diff) | |
download | bcm5719-llvm-8b19be46c770754cbeb4c8990c2cae0773203904.tar.gz bcm5719-llvm-8b19be46c770754cbeb4c8990c2cae0773203904.zip |
[SystemZ] Add support for anyregcc calling convention
This adds back-end support for the anyregcc calling convention
for use with patchpoints.
Since all registers are considered call-saved with anyregcc
(except for 0 and 1 which may still be clobbered by PLT stubs
and the like), this required adding support for saving and
restoring vector registers in prologue/epilogue code for the
first time. This is not used by any other calling convention.
llvm-svn: 326612
Diffstat (limited to 'llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp')
-rw-r--r-- | llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp | 39 |
1 files changed, 27 insertions, 12 deletions
diff --git a/llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp b/llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp index b2d59b1706d..565299c9013 100644 --- a/llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp +++ b/llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp @@ -204,7 +204,7 @@ spillCalleeSavedRegisters(MachineBasicBlock &MBB, addSavedGPR(MBB, MIB, SystemZ::ArgGPRs[I], true); } - // Save FPRs in the normal TargetInstrInfo way. + // Save FPRs/VRs 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)) { @@ -212,6 +212,11 @@ spillCalleeSavedRegisters(MachineBasicBlock &MBB, TII->storeRegToStackSlot(MBB, MBBI, Reg, true, CSI[I].getFrameIdx(), &SystemZ::FP64BitRegClass, TRI); } + if (SystemZ::VR128BitRegClass.contains(Reg)) { + MBB.addLiveIn(Reg); + TII->storeRegToStackSlot(MBB, MBBI, Reg, true, CSI[I].getFrameIdx(), + &SystemZ::VR128BitRegClass, TRI); + } } return true; @@ -231,12 +236,15 @@ restoreCalleeSavedRegisters(MachineBasicBlock &MBB, bool HasFP = hasFP(MF); DebugLoc DL = MBBI != MBB.end() ? MBBI->getDebugLoc() : DebugLoc(); - // Restore FPRs in the normal TargetInstrInfo way. + // Restore FPRs/VRs 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 @@ -425,7 +433,7 @@ void SystemZFrameLowering::emitPrologue(MachineFunction &MF, I->addLiveIn(SystemZ::R11D); } - // Skip over the FPR saves. + // Skip over the FPR/VR saves. SmallVector<unsigned, 8> CFIIndexes; for (auto &Save : CSI) { unsigned Reg = Save.getReg(); @@ -436,19 +444,26 @@ void SystemZFrameLowering::emitPrologue(MachineFunction &MF, ++MBBI; else llvm_unreachable("Couldn't skip over FPR save"); + } else if (SystemZ::VR128BitRegClass.contains(Reg)) { + if (MBBI != MBB.end() && + MBBI->getOpcode() == SystemZ::VST) + ++MBBI; + else + llvm_unreachable("Couldn't skip over VR save"); + } else + continue; - // Add CFI for the this save. - unsigned DwarfReg = MRI->getDwarfRegNum(Reg, true); - unsigned IgnoredFrameReg; - int64_t Offset = - getFrameIndexReference(MF, Save.getFrameIdx(), IgnoredFrameReg); + // Add CFI for the this save. + unsigned DwarfReg = MRI->getDwarfRegNum(Reg, true); + unsigned IgnoredFrameReg; + int64_t Offset = + getFrameIndexReference(MF, Save.getFrameIdx(), IgnoredFrameReg); - unsigned CFIIndex = MF.addFrameInst(MCCFIInstruction::createOffset( + unsigned CFIIndex = MF.addFrameInst(MCCFIInstruction::createOffset( nullptr, DwarfReg, SPOffsetFromCFA + Offset)); - CFIIndexes.push_back(CFIIndex); - } + CFIIndexes.push_back(CFIIndex); } - // Complete the CFI for the FPR saves, modelling them as taking effect + // Complete the CFI for the FPR/VR saves, modelling them as taking effect // after the last save. for (auto CFIIndex : CFIIndexes) { BuildMI(MBB, MBBI, DL, ZII->get(TargetOpcode::CFI_INSTRUCTION)) |