aboutsummaryrefslogtreecommitdiff
path: root/contrib/compiler-rt/lib/builtins/fixdfsi.c
diff options
context:
space:
mode:
authorGlen Barber <gjb@FreeBSD.org>2015-03-25 22:35:08 +0000
committerGlen Barber <gjb@FreeBSD.org>2015-03-25 22:35:08 +0000
commite6e746bfb086d563bf0ad454a33ecbcab8836dbf (patch)
tree01bc43f0862c8b5e58d45ca2120582bc866babdc /contrib/compiler-rt/lib/builtins/fixdfsi.c
parent6c787c8ff0be41657c0999aeaa9ff6befa5fceb0 (diff)
parent6fb3faab63f8e63e85abffaab6e59c81e49e2e2e (diff)
downloadsrc-e6e746bfb086d563bf0ad454a33ecbcab8836dbf.tar.gz
src-e6e746bfb086d563bf0ad454a33ecbcab8836dbf.zip
MFH: r278968-r280640
Sponsored by: The FreeBSD Foundation
Notes
Notes: svn path=/projects/release-arm-redux/; revision=280641
Diffstat (limited to 'contrib/compiler-rt/lib/builtins/fixdfsi.c')
-rw-r--r--contrib/compiler-rt/lib/builtins/fixdfsi.c56
1 files changed, 14 insertions, 42 deletions
diff --git a/contrib/compiler-rt/lib/builtins/fixdfsi.c b/contrib/compiler-rt/lib/builtins/fixdfsi.c
index 88b2ff5e74a0..704e65bc43a1 100644
--- a/contrib/compiler-rt/lib/builtins/fixdfsi.c
+++ b/contrib/compiler-rt/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);
}