diff options
author | Chris Lattner <sabre@nondot.org> | 2005-12-19 00:50:12 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2005-12-19 00:50:12 +0000 |
commit | beecfd2b2dc94b2b164f40c4443cc0506f228ed7 (patch) | |
tree | c63d8ee9465caa746a775a9b80b3190350e34f89 /lib/Target/Sparc/FPMover.cpp | |
parent | da5a7fd8d4bcf61e92e30ab2907ba01d30c0755a (diff) |
add fneg/fabs support for doubles
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24847 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/Sparc/FPMover.cpp')
-rw-r--r-- | lib/Target/Sparc/FPMover.cpp | 42 |
1 files changed, 27 insertions, 15 deletions
diff --git a/lib/Target/Sparc/FPMover.cpp b/lib/Target/Sparc/FPMover.cpp index feeadc52a7..af11eb8f7f 100644 --- a/lib/Target/Sparc/FPMover.cpp +++ b/lib/Target/Sparc/FPMover.cpp @@ -84,27 +84,39 @@ bool FPMover::runOnMachineBasicBlock(MachineBasicBlock &MBB) { bool Changed = false; for (MachineBasicBlock::iterator I = MBB.begin(); I != MBB.end(); ) { MachineInstr *MI = I++; - if (MI->getOpcode() == V8::FpMOVD) { + if (MI->getOpcode() == V8::FpMOVD || MI->getOpcode() == V8::FpABSD || + MI->getOpcode() == V8::FpNEGD) { + Changed = true; unsigned DestDReg = MI->getOperand(0).getReg(); unsigned SrcDReg = MI->getOperand(1).getReg(); - if (DestDReg != SrcDReg || MI->getOpcode() != V8::FpMOVD) { - unsigned EvenSrcReg = 0, OddSrcReg = 0, EvenDestReg = 0, OddDestReg = 0; - getDoubleRegPair(DestDReg, EvenDestReg, OddDestReg); - getDoubleRegPair(SrcDReg, EvenSrcReg, OddSrcReg); + if (DestDReg == SrcDReg && MI->getOpcode() == V8::FpMOVD) { + MBB.erase(MI); // Eliminate the noop copy. + ++NoopFpDs; + continue; + } + + unsigned EvenSrcReg = 0, OddSrcReg = 0, EvenDestReg = 0, OddDestReg = 0; + getDoubleRegPair(DestDReg, EvenDestReg, OddDestReg); + getDoubleRegPair(SrcDReg, EvenSrcReg, OddSrcReg); - I->setOpcode(V8::FMOVS); - I->SetMachineOperandReg(0, EvenDestReg); - I->SetMachineOperandReg(1, EvenSrcReg); - DEBUG(std::cerr << "FPMover: the modified instr is: " << *I); - // Insert copy for the other half of the double: + if (MI->getOpcode() == V8::FpMOVD) + MI->setOpcode(V8::FMOVS); + else if (MI->getOpcode() == V8::FpNEGD) + MI->setOpcode(V8::FNEGS); + else if (MI->getOpcode() == V8::FpABSD) + MI->setOpcode(V8::FABSS); + else + assert(0 && "Unknown opcode!"); + + MI->SetMachineOperandReg(0, EvenDestReg); + MI->SetMachineOperandReg(1, EvenSrcReg); + DEBUG(std::cerr << "FPMover: the modified instr is: " << *MI); + // Insert copy for the other half of the double. + if (DestDReg != SrcDReg) { MI = BuildMI(MBB, I, V8::FMOVS, 1, OddDestReg).addReg(OddSrcReg); DEBUG(std::cerr << "FPMover: the inserted instr is: " << *MI); - ++NumFpDs; - } else { - MBB.erase(MI); - ++NoopFpDs; } - Changed = true; + ++NumFpDs; } } return Changed; |