diff options
author | Dale Johannesen <dalej@apple.com> | 2007-08-31 04:03:46 +0000 |
---|---|---|
committer | Dale Johannesen <dalej@apple.com> | 2007-08-31 04:03:46 +0000 |
commit | eaf089430e7681fcddc3465c3b33b9645273ab02 (patch) | |
tree | 426df38ac585285c3b18e3b4575b297fcd4d9e59 /lib/CodeGen | |
parent | 8c132633c86a7e496f84e3458c47520d0cc4d938 (diff) | |
download | external_llvm-eaf089430e7681fcddc3465c3b33b9645273ab02.zip external_llvm-eaf089430e7681fcddc3465c3b33b9645273ab02.tar.gz external_llvm-eaf089430e7681fcddc3465c3b33b9645273ab02.tar.bz2 |
Enhance APFloat to retain bits of NaNs (fixes oggenc).
Use APFloat interfaces for more references, mostly
of ConstantFPSDNode.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@41632 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen')
-rw-r--r-- | lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 57 | ||||
-rw-r--r-- | lib/CodeGen/SelectionDAG/SelectionDAGPrinter.cpp | 4 |
2 files changed, 45 insertions, 16 deletions
diff --git a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index d544e8e..f4ee33f 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -109,11 +109,13 @@ bool ISD::isBuildVectorAllOnes(const SDNode *N) { } else if (isa<ConstantFPSDNode>(NotZero)) { MVT::ValueType VT = NotZero.getValueType(); if (VT== MVT::f64) { - if (DoubleToBits(cast<ConstantFPSDNode>(NotZero)->getValue()) != + if (DoubleToBits(cast<ConstantFPSDNode>(NotZero)-> + getValueAPF().convertToDouble()) != (uint64_t)-1) return false; } else { - if (FloatToBits(cast<ConstantFPSDNode>(NotZero)->getValue()) != + if (FloatToBits(cast<ConstantFPSDNode>(NotZero)-> + getValueAPF().convertToFloat()) != (uint32_t)-1) return false; } @@ -155,7 +157,7 @@ bool ISD::isBuildVectorAllZeros(const SDNode *N) { if (!cast<ConstantSDNode>(Zero)->isNullValue()) return false; } else if (isa<ConstantFPSDNode>(Zero)) { - if (!cast<ConstantFPSDNode>(Zero)->isExactlyValue(0.0)) + if (!cast<ConstantFPSDNode>(Zero)->getValueAPF().isPosZero()) return false; } else return false; @@ -320,9 +322,16 @@ static void AddNodeIDNode(FoldingSetNodeID &ID, SDNode *N) { ID.AddInteger(cast<ConstantSDNode>(N)->getValue()); break; case ISD::TargetConstantFP: - case ISD::ConstantFP: - ID.AddDouble(cast<ConstantFPSDNode>(N)->getValue()); + case ISD::ConstantFP: { + APFloat V = cast<ConstantFPSDNode>(N)->getValueAPF(); + if (&V.getSemantics() == &APFloat::IEEEdouble) + ID.AddDouble(V.convertToDouble()); + else if (&V.getSemantics() == &APFloat::IEEEsingle) + ID.AddDouble((double)V.convertToFloat()); + else + assert(0); break; + } case ISD::TargetGlobalAddress: case ISD::GlobalAddress: case ISD::TargetGlobalTLSAddress: @@ -966,16 +975,36 @@ SDOperand SelectionDAG::FoldSetCC(MVT::ValueType VT, SDOperand N1, } if (ConstantFPSDNode *N1C = dyn_cast<ConstantFPSDNode>(N1.Val)) if (ConstantFPSDNode *N2C = dyn_cast<ConstantFPSDNode>(N2.Val)) { - double C1 = N1C->getValue(), C2 = N2C->getValue(); - + + APFloat::cmpResult R = N1C->getValueAPF().compare(N2C->getValueAPF()); switch (Cond) { - default: break; // FIXME: Implement the rest of these! - case ISD::SETEQ: return getConstant(C1 == C2, VT); - case ISD::SETNE: return getConstant(C1 != C2, VT); - case ISD::SETLT: return getConstant(C1 < C2, VT); - case ISD::SETGT: return getConstant(C1 > C2, VT); - case ISD::SETLE: return getConstant(C1 <= C2, VT); - case ISD::SETGE: return getConstant(C1 >= C2, VT); + default: break; + case ISD::SETOEQ: + case ISD::SETEQ: return getConstant(R==APFloat::cmpEqual, VT); + case ISD::SETONE: + case ISD::SETNE: return getConstant(R==APFloat::cmpGreaterThan || + R==APFloat::cmpLessThan, VT); + case ISD::SETOLT: + case ISD::SETLT: return getConstant(R==APFloat::cmpLessThan, VT); + case ISD::SETOGT: + case ISD::SETGT: return getConstant(R==APFloat::cmpGreaterThan, VT); + case ISD::SETOLE: + case ISD::SETLE: return getConstant(R==APFloat::cmpLessThan || + R==APFloat::cmpEqual, VT); + case ISD::SETOGE: + case ISD::SETGE: return getConstant(R==APFloat::cmpGreaterThan || + R==APFloat::cmpEqual, VT); + case ISD::SETO: return getConstant(R!=APFloat::cmpUnordered, VT); + case ISD::SETUO: return getConstant(R==APFloat::cmpUnordered, VT); + case ISD::SETUEQ: return getConstant(R==APFloat::cmpUnordered || + R==APFloat::cmpEqual, VT); + case ISD::SETUNE: return getConstant(R!=APFloat::cmpEqual, VT); + case ISD::SETULT: return getConstant(R==APFloat::cmpUnordered || + R==APFloat::cmpLessThan, VT); + case ISD::SETUGT: return getConstant(R==APFloat::cmpGreaterThan || + R==APFloat::cmpUnordered, VT); + case ISD::SETULE: return getConstant(R!=APFloat::cmpGreaterThan, VT); + case ISD::SETUGE: return getConstant(R!=APFloat::cmpLessThan, VT); } } else { // Ensure that the constant occurs on the RHS. diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGPrinter.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGPrinter.cpp index 0ce46fd..d03439b 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAGPrinter.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAGPrinter.cpp @@ -95,7 +95,7 @@ std::string DOTGraphTraits<SelectionDAG*>::getNodeLabel(const SDNode *Node, if (const ConstantSDNode *CSDN = dyn_cast<ConstantSDNode>(Node)) { Op += ": " + utostr(CSDN->getValue()); } else if (const ConstantFPSDNode *CSDN = dyn_cast<ConstantFPSDNode>(Node)) { - Op += ": " + ftostr(CSDN->getValue()); + Op += ": " + ftostr(CSDN->getValueAPF()); } else if (const GlobalAddressSDNode *GADN = dyn_cast<GlobalAddressSDNode>(Node)) { int offset = GADN->getOffset(); @@ -115,7 +115,7 @@ std::string DOTGraphTraits<SelectionDAG*>::getNodeLabel(const SDNode *Node, Op += "<" + SS.str() + ">"; } else { if (ConstantFP *CFP = dyn_cast<ConstantFP>(CP->getConstVal())) - Op += "<" + ftostr(CFP->getValue()) + ">"; + Op += "<" + ftostr(CFP->getValueAPF()) + ">"; else if (ConstantInt *CI = dyn_cast<ConstantInt>(CP->getConstVal())) Op += "<" + utostr(CI->getZExtValue()) + ">"; else { |