[llvm-commits] [compiler-rt] r107524 - in /compiler-rt/trunk/lib: fixdfsi.c fixsfsi.c

Stephen Canon scanon at apple.com
Fri Jul 2 15:10:59 PDT 2010


Author: scanon
Date: Fri Jul  2 17:10:58 2010
New Revision: 107524

URL: http://llvm.org/viewvc/llvm-project?rev=107524&view=rev
Log:
float- and double-to-integer soft-float conversions for compiler-rt

Added:
    compiler-rt/trunk/lib/fixdfsi.c
    compiler-rt/trunk/lib/fixsfsi.c

Added: compiler-rt/trunk/lib/fixdfsi.c
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/fixdfsi.c?rev=107524&view=auto
==============================================================================
--- compiler-rt/trunk/lib/fixdfsi.c (added)
+++ compiler-rt/trunk/lib/fixdfsi.c Fri Jul  2 17:10:58 2010
@@ -0,0 +1,45 @@
+//===-- lib/fixdfsi.c - Double-precision -> integer conversion ----*- C -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. 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.
+//
+//===----------------------------------------------------------------------===//
+
+#define DOUBLE_PRECISION
+#include "fp_lib.h"
+
+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));
+    }
+}

Added: compiler-rt/trunk/lib/fixsfsi.c
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/fixsfsi.c?rev=107524&view=auto
==============================================================================
--- compiler-rt/trunk/lib/fixsfsi.c (added)
+++ compiler-rt/trunk/lib/fixsfsi.c Fri Jul  2 17:10:58 2010
@@ -0,0 +1,45 @@
+//===-- lib/fixsfsi.c - Single-precision -> integer conversion ----*- C -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file implements single-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.
+//
+//===----------------------------------------------------------------------===//
+
+#define SINGLE_PRECISION
+#include "fp_lib.h"
+
+int __fixsfsi(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));
+    }
+}





More information about the llvm-commits mailing list