Fix uint64->{float, double} conversion to do rounding correctly in 32-bit.
authorDale Johannesen <dalej@apple.com>
Sat, 15 May 2010 18:51:12 +0000 (18:51 +0000)
committerDale Johannesen <dalej@apple.com>
Sat, 15 May 2010 18:51:12 +0000 (18:51 +0000)
commit8d908ebd1926d00ff47d8284e52657705efb7f9b
tree6f99a9d91e94b814c44ca2a68df75f077046fa4b
parent789955127e06774b629e9db1cfa983184ceeda76
Fix uint64->{float, double} conversion to do rounding correctly in 32-bit.

The implementation in LegalizeIntegerTypes to handle this as
sint64->float + appropriate power of 2 is subject to double rounding,
considered incorrect by numerics people.  Use this implementation only
when it is safe.  This leads to using library calls in some cases
that produced inline code before, but it's correct now.
(EVTToAPFloatSemantics belongs somewhere else, any suggestions?)

Add a correctly rounding (though not particularly fast) conversion
that uses X87 80-bit computations for x86-32.

78853995901940.  This shows up in gcc.c-torture/execute/ieee/rbug.c
in the gcc testsuite on some platforms.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@103883 91177308-0d34-0410-b5e6-96231b3b80d8
lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
lib/Target/X86/X86ISelLowering.cpp