summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/Mips/MipsISelDAGToDAG.cpp
diff options
context:
space:
mode:
authorBruno Cardoso Lopes <bruno.cardoso@gmail.com>2010-01-19 12:53:04 +0000
committerBruno Cardoso Lopes <bruno.cardoso@gmail.com>2010-01-19 12:53:04 +0000
commitc9818a77cbb4de4c5a64c8a5835a0101b25aa485 (patch)
tree7bc1d6d5c01696b080da40135cc471e9ea8a64c0 /llvm/lib/Target/Mips/MipsISelDAGToDAG.cpp
parent2f5c8e3495bb0a588f2f4191390805a95ccda14a (diff)
downloadbcm5719-llvm-c9818a77cbb4de4c5a64c8a5835a0101b25aa485.tar.gz
bcm5719-llvm-c9818a77cbb4de4c5a64c8a5835a0101b25aa485.zip
load f64 +0.0 in a cleaner way. This fix part of PR5445
llvm-svn: 93876
Diffstat (limited to 'llvm/lib/Target/Mips/MipsISelDAGToDAG.cpp')
-rw-r--r--llvm/lib/Target/Mips/MipsISelDAGToDAG.cpp15
1 files changed, 12 insertions, 3 deletions
diff --git a/llvm/lib/Target/Mips/MipsISelDAGToDAG.cpp b/llvm/lib/Target/Mips/MipsISelDAGToDAG.cpp
index a53e9185f70..4cd64989ea5 100644
--- a/llvm/lib/Target/Mips/MipsISelDAGToDAG.cpp
+++ b/llvm/lib/Target/Mips/MipsISelDAGToDAG.cpp
@@ -461,9 +461,18 @@ SDNode* MipsDAGToDAGISel::Select(SDNode *Node) {
case ISD::ConstantFP: {
ConstantFPSDNode *CN = dyn_cast<ConstantFPSDNode>(Node);
if (Node->getValueType(0) == MVT::f64 && CN->isExactlyValue(+0.0)) {
- SDValue Zero = CurDAG->getRegister(Mips::ZERO, MVT::i32);
- ReplaceUses(SDValue(Node, 0), Zero);
- return Zero.getNode();
+ SDValue Zero = CurDAG->getCopyFromReg(CurDAG->getEntryNode(), dl,
+ Mips::ZERO, MVT::i32);
+ SDValue Undef = SDValue(
+ CurDAG->getMachineNode(
+ TargetInstrInfo::IMPLICIT_DEF, dl, MVT::f64), 0);
+ SDNode *MTC = CurDAG->getMachineNode(Mips::MTC1, dl, MVT::f32, Zero);
+ SDValue I0 = CurDAG->getTargetInsertSubreg(Mips::SUBREG_FPEVEN, dl,
+ MVT::f64, Undef, SDValue(MTC, 0));
+ SDValue I1 = CurDAG->getTargetInsertSubreg(Mips::SUBREG_FPODD, dl,
+ MVT::f64, I0, SDValue(MTC, 0));
+ ReplaceUses(SDValue(Node, 0), I1);
+ return I1.getNode();
}
break;
}
OpenPOWER on IntegriCloud