diff options
author | Owen Anderson <resistor@mac.com> | 2008-01-07 01:35:02 +0000 |
---|---|---|
committer | Owen Anderson <resistor@mac.com> | 2008-01-07 01:35:02 +0000 |
commit | 9a184efddb63e9b0327cb6cfccb9130fbfe464c5 (patch) | |
tree | b767b17e91b91d3bb7f897f507175fd60ebadb6b /lib/Target/Sparc/SparcInstrInfo.cpp | |
parent | 36464772ded6499fa5876398bb55ba31c020e4f2 (diff) | |
download | external_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.cpp | 38 |
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 |