diff options
| author | Joerg Sonnenberger <joerg@bec.de> | 2015-03-11 21:13:56 +0000 |
|---|---|---|
| committer | Joerg Sonnenberger <joerg@bec.de> | 2015-03-11 21:13:56 +0000 |
| commit | 91bd698eafe5014cd2852d3bb6f5119b73128c6e (patch) | |
| tree | 96ddcff3b700a5cb291bc4f10693e601d379ef29 /compiler-rt/lib/builtins/fixunssfti.c | |
| parent | d6c9bd509eafe6e087a3a58a727c021c6406f3e4 (diff) | |
| download | bcm5719-llvm-91bd698eafe5014cd2852d3bb6f5119b73128c6e.tar.gz bcm5719-llvm-91bd698eafe5014cd2852d3bb6f5119b73128c6e.zip | |
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
llvm-svn: 231965
Diffstat (limited to 'compiler-rt/lib/builtins/fixunssfti.c')
| -rw-r--r-- | compiler-rt/lib/builtins/fixunssfti.c | 36 |
1 files changed, 6 insertions, 30 deletions
diff --git a/compiler-rt/lib/builtins/fixunssfti.c b/compiler-rt/lib/builtins/fixunssfti.c index 4da9e242ad0..9593153745c 100644 --- a/compiler-rt/lib/builtins/fixunssfti.c +++ b/compiler-rt/lib/builtins/fixunssfti.c @@ -12,36 +12,12 @@ * ===----------------------------------------------------------------------=== */ -#include "int_lib.h" - -#ifdef CRT_HAS_128BIT - -/* Returns: convert a to a unsigned long long, rounding toward zero. - * Negative values all become zero. - */ - -/* Assumption: float is a IEEE 32 bit floating point type - * tu_int is a 64 bit integral type - * value in float is representable in tu_int or is negative - * (no range checking performed) - */ - -/* seee eeee emmm mmmm mmmm mmmm mmmm mmmm */ +#if defined(CRT_HAS_128BIT) +typedef tu_int fixuint_t; +#include "fp_fixuint_impl.inc" COMPILER_RT_ABI tu_int -__fixunssfti(float a) -{ - float_bits fb; - fb.f = a; - int e = ((fb.u & 0x7F800000) >> 23) - 127; - if (e < 0 || (fb.u & 0x80000000)) - return 0; - tu_int r = (fb.u & 0x007FFFFF) | 0x00800000; - if (e > 23) - r <<= (e - 23); - else - r >>= (23 - e); - return r; +__fixunssfti(fp_t a) { + return __fixuint(a); } - -#endif /* CRT_HAS_128BIT */ +#endif |

