summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r--llvm/lib/Target/AArch64/AArch64InstrInfo.cpp86
1 files changed, 68 insertions, 18 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp b/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp
index da555665a75..3bc3a3abe35 100644
--- a/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp
+++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp
@@ -2744,6 +2744,29 @@ void AArch64InstrInfo::copyPhysReg(MachineBasicBlock &MBB,
llvm_unreachable("unimplemented reg-to-reg copy");
}
+static void storeRegPairToStackSlot(const TargetRegisterInfo &TRI,
+ MachineBasicBlock &MBB,
+ MachineBasicBlock::iterator InsertBefore,
+ const MCInstrDesc &MCID,
+ unsigned SrcReg, bool IsKill,
+ unsigned SubIdx0, unsigned SubIdx1, int FI,
+ MachineMemOperand *MMO) {
+ unsigned SrcReg0 = SrcReg;
+ unsigned SrcReg1 = SrcReg;
+ if (TargetRegisterInfo::isPhysicalRegister(SrcReg)) {
+ SrcReg0 = TRI.getSubReg(SrcReg, SubIdx0);
+ SubIdx0 = 0;
+ SrcReg1 = TRI.getSubReg(SrcReg, SubIdx1);
+ SubIdx1 = 0;
+ }
+ BuildMI(MBB, InsertBefore, DebugLoc(), MCID)
+ .addReg(SrcReg0, getKillRegState(IsKill), SubIdx0)
+ .addReg(SrcReg1, getKillRegState(IsKill), SubIdx1)
+ .addFrameIndex(FI)
+ .addImm(0)
+ .addMemOperand(MMO);
+}
+
void AArch64InstrInfo::storeRegToStackSlot(
MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, unsigned SrcReg,
bool isKill, int FI, const TargetRegisterClass *RC,
@@ -2786,8 +2809,14 @@ void AArch64InstrInfo::storeRegToStackSlot(
MF.getRegInfo().constrainRegClass(SrcReg, &AArch64::GPR64RegClass);
else
assert(SrcReg != AArch64::SP);
- } else if (AArch64::FPR64RegClass.hasSubClassEq(RC))
+ } else if (AArch64::FPR64RegClass.hasSubClassEq(RC)) {
Opc = AArch64::STRDui;
+ } else if (AArch64::WSeqPairsClassRegClass.hasSubClassEq(RC)) {
+ storeRegPairToStackSlot(getRegisterInfo(), MBB, MBBI,
+ get(AArch64::STPWi), SrcReg, isKill,
+ AArch64::sube32, AArch64::subo32, FI, MMO);
+ return;
+ }
break;
case 16:
if (AArch64::FPR128RegClass.hasSubClassEq(RC))
@@ -2797,14 +2826,9 @@ void AArch64InstrInfo::storeRegToStackSlot(
Opc = AArch64::ST1Twov1d;
Offset = false;
} else if (AArch64::XSeqPairsClassRegClass.hasSubClassEq(RC)) {
- BuildMI(MBB, MBBI, DL, get(AArch64::STPXi))
- .addReg(TRI->getSubReg(SrcReg, AArch64::sube64),
- getKillRegState(isKill))
- .addReg(TRI->getSubReg(SrcReg, AArch64::subo64),
- getKillRegState(isKill))
- .addFrameIndex(FI)
- .addImm(0)
- .addMemOperand(MMO);
+ storeRegPairToStackSlot(getRegisterInfo(), MBB, MBBI,
+ get(AArch64::STPXi), SrcReg, isKill,
+ AArch64::sube64, AArch64::subo64, FI, MMO);
return;
}
break;
@@ -2852,6 +2876,31 @@ void AArch64InstrInfo::storeRegToStackSlot(
MI.addMemOperand(MMO);
}
+static void loadRegPairFromStackSlot(const TargetRegisterInfo &TRI,
+ MachineBasicBlock &MBB,
+ MachineBasicBlock::iterator InsertBefore,
+ const MCInstrDesc &MCID,
+ unsigned DestReg, unsigned SubIdx0,
+ unsigned SubIdx1, int FI,
+ MachineMemOperand *MMO) {
+ unsigned DestReg0 = DestReg;
+ unsigned DestReg1 = DestReg;
+ bool IsUndef = true;
+ if (TargetRegisterInfo::isPhysicalRegister(DestReg)) {
+ DestReg0 = TRI.getSubReg(DestReg, SubIdx0);
+ SubIdx0 = 0;
+ DestReg1 = TRI.getSubReg(DestReg, SubIdx1);
+ SubIdx1 = 0;
+ IsUndef = false;
+ }
+ BuildMI(MBB, InsertBefore, DebugLoc(), MCID)
+ .addReg(DestReg0, RegState::Define | getUndefRegState(IsUndef), SubIdx0)
+ .addReg(DestReg1, RegState::Define | getUndefRegState(IsUndef), SubIdx1)
+ .addFrameIndex(FI)
+ .addImm(0)
+ .addMemOperand(MMO);
+}
+
void AArch64InstrInfo::loadRegFromStackSlot(
MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, unsigned DestReg,
int FI, const TargetRegisterClass *RC,
@@ -2894,8 +2943,14 @@ void AArch64InstrInfo::loadRegFromStackSlot(
MF.getRegInfo().constrainRegClass(DestReg, &AArch64::GPR64RegClass);
else
assert(DestReg != AArch64::SP);
- } else if (AArch64::FPR64RegClass.hasSubClassEq(RC))
+ } else if (AArch64::FPR64RegClass.hasSubClassEq(RC)) {
Opc = AArch64::LDRDui;
+ } else if (AArch64::WSeqPairsClassRegClass.hasSubClassEq(RC)) {
+ loadRegPairFromStackSlot(getRegisterInfo(), MBB, MBBI,
+ get(AArch64::LDPWi), DestReg, AArch64::sube32,
+ AArch64::subo32, FI, MMO);
+ return;
+ }
break;
case 16:
if (AArch64::FPR128RegClass.hasSubClassEq(RC))
@@ -2905,14 +2960,9 @@ void AArch64InstrInfo::loadRegFromStackSlot(
Opc = AArch64::LD1Twov1d;
Offset = false;
} else if (AArch64::XSeqPairsClassRegClass.hasSubClassEq(RC)) {
- BuildMI(MBB, MBBI, DL, get(AArch64::LDPXi))
- .addReg(TRI->getSubReg(DestReg, AArch64::sube64),
- getDefRegState(true))
- .addReg(TRI->getSubReg(DestReg, AArch64::subo64),
- getDefRegState(true))
- .addFrameIndex(FI)
- .addImm(0)
- .addMemOperand(MMO);
+ loadRegPairFromStackSlot(getRegisterInfo(), MBB, MBBI,
+ get(AArch64::LDPXi), DestReg, AArch64::sube64,
+ AArch64::subo64, FI, MMO);
return;
}
break;
OpenPOWER on IntegriCloud