diff options
author | dim <dim@FreeBSD.org> | 2015-03-14 12:40:19 +0000 |
---|---|---|
committer | dim <dim@FreeBSD.org> | 2015-03-14 12:40:19 +0000 |
commit | 73a5b102bba947d10e5dd482c1f14bc444d4fcb3 (patch) | |
tree | 22c96169e9ec91b9a5b31830347710371a91096d /contrib/compiler-rt/lib/builtins/fixdfti.c | |
parent | d202cb2c64432c785dfaf1544f77b27349d33d56 (diff) | |
download | FreeBSD-src-73a5b102bba947d10e5dd482c1f14bc444d4fcb3.zip FreeBSD-src-73a5b102bba947d10e5dd482c1f14bc444d4fcb3.tar.gz |
Pull in r231965 from upstream compiler-rt trunk (by Jörg Sonnenberger):
Refactor float to integer conversion to share the same code.
80bit Intel/PPC long double is excluded due to lacking support
for the abstraction. Consistently provide saturation logic.
Extend to long double on 128bit IEEE extended platforms.
Initial patch with test cases from GuanHong Liu.
Reviewed by Steve Canon.
Differential Revision: http://reviews.llvm.org/D2804
Pull in r232107 from upstream compiler-rt trunk (by Ed Maste):
Use signed int implementation for __fixint
Requested by: emaste
Diffstat (limited to 'contrib/compiler-rt/lib/builtins/fixdfti.c')
-rw-r--r-- | contrib/compiler-rt/lib/builtins/fixdfti.c | 33 |
1 files changed, 7 insertions, 26 deletions
diff --git a/contrib/compiler-rt/lib/builtins/fixdfti.c b/contrib/compiler-rt/lib/builtins/fixdfti.c index 2c27f4b..aaf225e 100644 --- a/contrib/compiler-rt/lib/builtins/fixdfti.c +++ b/contrib/compiler-rt/lib/builtins/fixdfti.c @@ -6,40 +6,21 @@ * Source Licenses. See LICENSE.TXT for details. * * ===----------------------------------------------------------------------=== - * - * This file implements __fixdfti for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== */ #include "int_lib.h" #ifdef CRT_HAS_128BIT +#define DOUBLE_PRECISION +#include "fp_lib.h" -/* Returns: convert a to a signed long long, rounding toward zero. */ - -/* Assumption: double is a IEEE 64 bit floating point type - * su_int is a 32 bit integral type - * value in double is representable in ti_int (no range checking performed) - */ - -/* seee eeee eeee mmmm mmmm mmmm mmmm mmmm | mmmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm */ +typedef ti_int fixint_t; +typedef tu_int fixuint_t; +#include "fp_fixint_impl.inc" COMPILER_RT_ABI ti_int -__fixdfti(double a) -{ - double_bits fb; - fb.f = a; - int e = ((fb.u.s.high & 0x7FF00000) >> 20) - 1023; - if (e < 0) - return 0; - ti_int s = (si_int)(fb.u.s.high & 0x80000000) >> 31; - ti_int r = 0x0010000000000000uLL | (0x000FFFFFFFFFFFFFuLL & fb.u.all); - if (e > 52) - r <<= (e - 52); - else - r >>= (52 - e); - return (r ^ s) - s; +__fixdfti(fp_t a) { + return __fixint(a); } #endif /* CRT_HAS_128BIT */ |