aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Target/Sparc/SparcInstrInfo.cpp
diff options
context:
space:
mode:
authorOwen Anderson <resistor@mac.com>2008-01-07 01:35:02 +0000
committerOwen Anderson <resistor@mac.com>2008-01-07 01:35:02 +0000
commit9a184efddb63e9b0327cb6cfccb9130fbfe464c5 (patch)
treeb767b17e91b91d3bb7f897f507175fd60ebadb6b /lib/Target/Sparc/SparcInstrInfo.cpp
parent36464772ded6499fa5876398bb55ba31c020e4f2 (diff)
downloadexternal_llvm-9a184efddb63e9b0327cb6cfccb9130fbfe464c5.zip
external_llvm-9a184efddb63e9b0327cb6cfccb9130fbfe464c5.tar.gz
external_llvm-9a184efddb63e9b0327cb6cfccb9130fbfe464c5.tar.bz2
Move even more functionality from MRegisterInfo into TargetInstrInfo.
Some day I'll get it all moved over... git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@45672 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/Sparc/SparcInstrInfo.cpp')
-rw-r--r--lib/Target/Sparc/SparcInstrInfo.cpp38
1 files changed, 38 insertions, 0 deletions
diff --git a/lib/Target/Sparc/SparcInstrInfo.cpp b/lib/Target/Sparc/SparcInstrInfo.cpp
index baf6d8f..b587c28 100644
--- a/lib/Target/Sparc/SparcInstrInfo.cpp
+++ b/lib/Target/Sparc/SparcInstrInfo.cpp
@@ -221,3 +221,41 @@ void SparcInstrInfo::loadRegFromAddr(MachineFunction &MF, unsigned DestReg,
NewMIs.push_back(MIB);
return;
}
+
+MachineInstr *SparcInstrInfo::foldMemoryOperand(MachineInstr* MI,
+ SmallVectorImpl<unsigned> &Ops,
+ int FI) const {
+ if (Ops.size() != 1) return NULL;
+
+ unsigned OpNum = Ops[0];
+ bool isFloat = false;
+ MachineInstr *NewMI = NULL;
+ switch (MI->getOpcode()) {
+ case SP::ORrr:
+ if (MI->getOperand(1).isRegister() && MI->getOperand(1).getReg() == SP::G0&&
+ MI->getOperand(0).isRegister() && MI->getOperand(2).isRegister()) {
+ if (OpNum == 0) // COPY -> STORE
+ NewMI = BuildMI(get(SP::STri)).addFrameIndex(FI).addImm(0)
+ .addReg(MI->getOperand(2).getReg());
+ else // COPY -> LOAD
+ NewMI = BuildMI(get(SP::LDri), MI->getOperand(0).getReg())
+ .addFrameIndex(FI).addImm(0);
+ }
+ break;
+ case SP::FMOVS:
+ isFloat = true;
+ // FALLTHROUGH
+ case SP::FMOVD:
+ if (OpNum == 0) // COPY -> STORE
+ NewMI = BuildMI(get(isFloat ? SP::STFri : SP::STDFri))
+ .addFrameIndex(FI).addImm(0).addReg(MI->getOperand(1).getReg());
+ else // COPY -> LOAD
+ NewMI = BuildMI(get(isFloat ? SP::LDFri : SP::LDDFri),
+ MI->getOperand(0).getReg()).addFrameIndex(FI).addImm(0);
+ break;
+ }
+
+ if (NewMI)
+ NewMI->copyKillDeadInfo(MI);
+ return NewMI;
+} \ No newline at end of file