aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp
diff options
context:
space:
mode:
authorAhsan Saghir <saghir@ca.ibm.com>2022-06-01 12:12:34 -0500
committerAhsan Saghir <saghir@ca.ibm.com>2022-06-16 10:47:38 -0500
commit3d259a82da3ed5cf721452cc97404e3c26527799 (patch)
tree08b2572e131759e5e5ae610cd2b2b6804967b25e /llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp
parent37fa5850f1c0b59537aa6cd7c45866ee640f928d (diff)
downloadllvm-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.cpp27
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 {