mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-29 08:19:01 -04:00

__inline is a vendor specific spelling for inline. clang and gcc treat it the same as inline, and is available in MSVC 2013 which does not implement C99 (VS2015 supports the inline keyword though). This will allow us to build the builtins using MSVC. llvm-svn: 249953
42 lines
1.5 KiB
C
42 lines
1.5 KiB
C
//===-- 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 float to integer conversion for the
|
|
// compiler-rt library.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "fp_lib.h"
|
|
|
|
static __inline fixint_t __fixint(fp_t a) {
|
|
const fixint_t fixint_max = (fixint_t)((~(fixuint_t)0) / 2);
|
|
const fixint_t fixint_min = -fixint_max - 1;
|
|
// Break a into sign, exponent, significand
|
|
const rep_t aRep = toRep(a);
|
|
const rep_t aAbs = aRep & absMask;
|
|
const fixint_t sign = aRep & signBit ? -1 : 1;
|
|
const int exponent = (aAbs >> significandBits) - exponentBias;
|
|
const rep_t significand = (aAbs & significandMask) | implicitBit;
|
|
|
|
// If exponent is negative, the result is zero.
|
|
if (exponent < 0)
|
|
return 0;
|
|
|
|
// If the value is too large for the integer type, saturate.
|
|
if ((unsigned)exponent >= sizeof(fixint_t) * CHAR_BIT)
|
|
return sign == 1 ? fixint_max : fixint_min;
|
|
|
|
// If 0 <= exponent < significandBits, right shift to get the result.
|
|
// Otherwise, shift left.
|
|
if (exponent < significandBits)
|
|
return sign * (significand >> (significandBits - exponent));
|
|
else
|
|
return sign * ((fixint_t)significand << (exponent - significandBits));
|
|
}
|