diff options
Diffstat (limited to 'lib/builtins/fixdfsi.c')
| -rw-r--r-- | lib/builtins/fixdfsi.c | 56 | 
1 files changed, 14 insertions, 42 deletions
diff --git a/lib/builtins/fixdfsi.c b/lib/builtins/fixdfsi.c index 88b2ff5e74a0..704e65bc43a1 100644 --- a/lib/builtins/fixdfsi.c +++ b/lib/builtins/fixdfsi.c @@ -1,50 +1,22 @@ -//===-- lib/fixdfsi.c - Double-precision -> integer conversion ----*- C -*-===// -// -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file implements double-precision to integer conversion for the -// compiler-rt library.  No range checking is performed; the behavior of this -// conversion is undefined for out of range values in the C standard. -// -//===----------------------------------------------------------------------===// +/* ===-- fixdfsi.c - Implement __fixdfsi -----------------------------------=== + * + *                     The LLVM Compiler Infrastructure + * + * This file is dual licensed under the MIT and the University of Illinois Open + * Source Licenses. See LICENSE.TXT for details. + * + * ===----------------------------------------------------------------------=== + */  #define DOUBLE_PRECISION  #include "fp_lib.h" - -#include "int_lib.h" +typedef si_int fixint_t; +typedef su_int fixuint_t; +#include "fp_fixint_impl.inc"  ARM_EABI_FNALIAS(d2iz, fixdfsi) -COMPILER_RT_ABI int +COMPILER_RT_ABI si_int  __fixdfsi(fp_t a) { -     -    // Break a into sign, exponent, significand -    const rep_t aRep = toRep(a); -    const rep_t aAbs = aRep & absMask; -    const int sign = aRep & signBit ? -1 : 1; -    const int exponent = (aAbs >> significandBits) - exponentBias; -    const rep_t significand = (aAbs & significandMask) | implicitBit; -     -    // If 0 < exponent < significandBits, right shift to get the result. -    if ((unsigned int)exponent < significandBits) { -        return sign * (significand >> (significandBits - exponent)); -    } -     -    // If exponent is negative, the result is zero. -    else if (exponent < 0) { -        return 0; -    } -     -    // If significandBits < exponent, left shift to get the result.  This shift -    // may end up being larger than the type width, which incurs undefined -    // behavior, but the conversion itself is undefined in that case, so -    // whatever the compiler decides to do is fine. -    else { -        return sign * (significand << (exponent - significandBits)); -    } +    return __fixint(a);  }  | 
