Fix float->uint conversion for inputs less than 0
authorDerek Schuff <dschuff@google.com>
Fri, 1 May 2015 16:02:16 +0000 (16:02 +0000)
committerDerek Schuff <dschuff@google.com>
Fri, 1 May 2015 16:02:16 +0000 (16:02 +0000)
Summary:
The spec for these functions says that they should return 0 in this case but
this regressed in r234148. That revision essentially delegates the conversion
to the hardware, but that has different behavior on different platforms (e.g.
it is wrong on x86).

Also fix a typo in the name of __fixunsdfti

Test Plan: The existing unit tests now pass

Reviewers: joerg, howard.hinnant

Subscribers: llvm-commits

Differential Revision: http://reviews.llvm.org/D9305

llvm-svn: 236319

compiler-rt/lib/builtins/fixunsdfdi.c
compiler-rt/lib/builtins/fixunsdfti.c
compiler-rt/lib/builtins/fixunssfdi.c

index b93d1c1..2e0d87e 100644 (file)
@@ -21,6 +21,7 @@ ARM_EABI_FNALIAS(d2ulz, fixunsdfdi)
 COMPILER_RT_ABI du_int
 __fixunsdfdi(double a)
 {
+    if (a <= 0.0) return 0;
     su_int high = a/0x1p32f;
     su_int low = a - (double)high*0x1p32f;
     return ((du_int)high << 32) | low;
index c3d7df9..f8046a0 100644 (file)
@@ -17,7 +17,7 @@ typedef tu_int fixuint_t;
 #include "fp_fixuint_impl.inc"
 
 COMPILER_RT_ABI tu_int
-__fixunsdftti(fp_t a) {
+__fixunsdfti(fp_t a) {
     return __fixuint(a);
 }
 #endif /* CRT_HAS_128BIT */
index 374ebbe..5a154e8 100644 (file)
@@ -21,6 +21,7 @@ ARM_EABI_FNALIAS(f2ulz, fixunssfdi)
 COMPILER_RT_ABI du_int
 __fixunssfdi(float a)
 {
+    if (a <= 0.0f) return 0;
     double da = a;
     su_int high = da/0x1p32f;
     su_int low = da - (double)high*0x1p32f;