]> git.proxmox.com Git - rustc.git/blobdiff - src/libcompiler_builtins/compiler-rt/lib/builtins/floatsidf.c
New upstream version 1.25.0+dfsg1
[rustc.git] / src / libcompiler_builtins / compiler-rt / lib / builtins / floatsidf.c
index 2bf97ba0e3adde6dbf19198ad086b0ad743e2538..fe051123ce7cfe86c31a5bfbe4addcfa7ebe17e0 100644 (file)
 
 #include "int_lib.h"
 
-ARM_EABI_FNALIAS(i2d, floatsidf)
-
 COMPILER_RT_ABI fp_t
 __floatsidf(int a) {
     
     const int aWidth = sizeof a * CHAR_BIT;
-
+    
     // Handle zero as a special case to protect clz
     if (a == 0)
         return fromRep(0);
     
     // All other cases begin by extracting the sign and absolute value of a
     rep_t sign = 0;
-    unsigned aAbs = (unsigned)a;
     if (a < 0) {
         sign = signBit;
-        aAbs = ~(unsigned)a + 1U;
+        a = -a;
     }
     
     // Exponent of (fp_t)a is the width of abs(a).
-    const int exponent = (aWidth - 1) - __builtin_clz(aAbs);
+    const int exponent = (aWidth - 1) - __builtin_clz(a);
     rep_t result;
     
-    // Shift a into the significand field and clear the implicit bit.
+    // Shift a into the significand field and clear the implicit bit.  Extra
+    // cast to unsigned int is necessary to get the correct behavior for
+    // the input INT_MIN.
     const int shift = significandBits - exponent;
-    result = (rep_t)aAbs << shift ^ implicitBit;
+    result = (rep_t)(unsigned int)a << shift ^ implicitBit;
     
     // Insert the exponent
     result += (rep_t)(exponent + exponentBias) << significandBits;
     // Insert the sign bit and return
     return fromRep(result | sign);
 }
+
+#if defined(__ARM_EABI__)
+#if defined(COMPILER_RT_ARMHF_TARGET)
+AEABI_RTABI fp_t __aeabi_i2d(int a) {
+  return __floatsidf(a);
+}
+#else
+AEABI_RTABI fp_t __aeabi_i2d(int a) COMPILER_RT_ALIAS(__floatsidf);
+#endif
+#endif