diff options
author | Ahsan Saghir <saghir@ca.ibm.com> | 2022-06-01 12:12:34 -0500 |
---|---|---|
committer | Ahsan Saghir <saghir@ca.ibm.com> | 2022-06-16 10:47:38 -0500 |
commit | 3d259a82da3ed5cf721452cc97404e3c26527799 (patch) | |
tree | 08b2572e131759e5e5ae610cd2b2b6804967b25e /llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp | |
parent | 37fa5850f1c0b59537aa6cd7c45866ee640f928d (diff) | |
download | llvm-3d259a82da3ed5cf721452cc97404e3c26527799.zip llvm-3d259a82da3ed5cf721452cc97404e3c26527799.tar.gz llvm-3d259a82da3ed5cf721452cc97404e3c26527799.tar.bz2 |
[PowerPC] Fix LQ-STQ instructions to use correct offset and base
This patch fixes the load and store quadword instructions on
PowerPC to use correct offset and base address.
Reviewed By: #powerpc, nemanjai, lkail
Differential Revision: https://reviews.llvm.org/D126807
Diffstat (limited to 'llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp')
-rw-r--r-- | llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp b/llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp index 39bb005..b98d293 100644 --- a/llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp +++ b/llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp @@ -114,6 +114,8 @@ PPCRegisterInfo::PPCRegisterInfo(const PPCTargetMachine &TM) ImmToIdxMap[PPC::STB8] = PPC::STBX8; ImmToIdxMap[PPC::STH8] = PPC::STHX8; ImmToIdxMap[PPC::STW8] = PPC::STWX8; ImmToIdxMap[PPC::STDU] = PPC::STDUX; ImmToIdxMap[PPC::ADDI8] = PPC::ADD8; + ImmToIdxMap[PPC::LQ] = PPC::LQX_PSEUDO; + ImmToIdxMap[PPC::STQ] = PPC::STQX_PSEUDO; // VSX ImmToIdxMap[PPC::DFLOADf32] = PPC::LXSSPX; @@ -489,6 +491,14 @@ bool PPCRegisterInfo::requiresFrameIndexScavenging(const MachineFunction &MF) co LLVM_DEBUG(dbgs() << "TRUE - Memory operand is X-Form.\n"); return true; } + + // This is a spill/restore of a quadword. + if ((Opcode == PPC::RESTORE_QUADWORD) || (Opcode == PPC::SPILL_QUADWORD)) { + LLVM_DEBUG(dbgs() << "Memory Operand: " << InstrInfo->getName(Opcode) + << " for register " << printReg(Reg, this) << ".\n"); + LLVM_DEBUG(dbgs() << "TRUE - Memory operand is a quadword.\n"); + return true; + } } LLVM_DEBUG(dbgs() << "FALSE - Scavenging is not required.\n"); return false; @@ -1533,6 +1543,7 @@ PPCRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II, const TargetRegisterClass *RC = is64Bit ? G8RC : GPRC; Register SRegHi = MF.getRegInfo().createVirtualRegister(RC), SReg = MF.getRegInfo().createVirtualRegister(RC); + unsigned NewOpcode = 0u; // Insert a set of rA with the full offset value before the ld, st, or add if (isInt<16>(Offset)) @@ -1561,7 +1572,7 @@ PPCRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II, OpC != TargetOpcode::INLINEASM_BR) { assert(ImmToIdxMap.count(OpC) && "No indexed form of load or store available!"); - unsigned NewOpcode = ImmToIdxMap.find(OpC)->second; + NewOpcode = ImmToIdxMap.find(OpC)->second; MI.setDesc(TII.get(NewOpcode)); OperandBase = 1; } else { @@ -1571,6 +1582,20 @@ PPCRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II, Register StackReg = MI.getOperand(FIOperandNum).getReg(); MI.getOperand(OperandBase).ChangeToRegister(StackReg, false); MI.getOperand(OperandBase + 1).ChangeToRegister(SReg, false, false, true); + + // Since these are not real X-Form instructions, we must + // add the registers and access 0(NewReg) rather than + // emitting the X-Form pseudo. + if (NewOpcode == PPC::LQX_PSEUDO || NewOpcode == PPC::STQX_PSEUDO) { + assert(is64Bit && "Quadword loads/stores only supported in 64-bit mode"); + Register NewReg = MF.getRegInfo().createVirtualRegister(&PPC::G8RCRegClass); + BuildMI(MBB, II, dl, TII.get(PPC::ADD8), NewReg) + .addReg(SReg, RegState::Kill) + .addReg(StackReg); + MI.setDesc(TII.get(NewOpcode == PPC::LQX_PSEUDO ? PPC::LQ : PPC::STQ)); + MI.getOperand(OperandBase + 1).ChangeToRegister(NewReg, false); + MI.getOperand(OperandBase).ChangeToImmediate(0); + } } Register PPCRegisterInfo::getFrameRegister(const MachineFunction &MF) const { |