diff options
author | Chris Lattner <sabre@nondot.org> | 2006-03-05 23:57:58 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2006-03-05 23:57:58 +0000 |
commit | 3c232c83be461b741c40fb25b932a1f60256a462 (patch) | |
tree | 2da0c9711f96cc71a4480563d494f7d4760b7166 /lib/CodeGen | |
parent | 03182bfd89799e539abad52ec35a493da18f0484 (diff) |
Don't depend on the C99 copysign function, implement it ourselves.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@26566 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen')
-rw-r--r-- | lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index ec77817169..1a965a22e6 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -29,11 +29,6 @@ #include <algorithm> using namespace llvm; -#ifdef _MSC_VER -#include <float.h> -#define copysign _copysign -#endif - static bool isCommutativeBinOp(unsigned Opcode) { switch (Opcode) { case ISD::ADD: @@ -1255,8 +1250,23 @@ SDOperand SelectionDAG::getNode(unsigned Opcode, MVT::ValueType VT, case ISD::FREM : if (C2) return getConstantFP(fmod(C1, C2), VT); break; - case ISD::FCOPYSIGN: - return getConstantFP(copysign(C1, C2), VT); + case ISD::FCOPYSIGN: { + union { + double F; + uint64_t I; + } u1; + union { + double F; + int64_t I; + } u2; + u1.F = C1; + u2.F = C2; + if (u2.I < 0) // Sign bit of RHS set? + u1.I |= 1ULL << 63; // Set the sign bit of the LHS. + else + u1.I &= (1ULL << 63)-1; // Clear the sign bit of the LHS. + return getConstantFP(u1.F, VT); + } default: break; } } else { // Cannonicalize constant to RHS if commutative |