From de036eb170cc12e5cb91ab219ae623c0c9f710ef Mon Sep 17 00:00:00 2001 From: Derek Schuff Date: Fri, 1 May 2015 16:02:16 +0000 Subject: [PATCH] Fix float->uint conversion for inputs less than 0 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 | 1 + compiler-rt/lib/builtins/fixunsdfti.c | 2 +- compiler-rt/lib/builtins/fixunssfdi.c | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/compiler-rt/lib/builtins/fixunsdfdi.c b/compiler-rt/lib/builtins/fixunsdfdi.c index b93d1c1..2e0d87e 100644 --- a/compiler-rt/lib/builtins/fixunsdfdi.c +++ b/compiler-rt/lib/builtins/fixunsdfdi.c @@ -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; diff --git a/compiler-rt/lib/builtins/fixunsdfti.c b/compiler-rt/lib/builtins/fixunsdfti.c index c3d7df9..f8046a0 100644 --- a/compiler-rt/lib/builtins/fixunsdfti.c +++ b/compiler-rt/lib/builtins/fixunsdfti.c @@ -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 */ diff --git a/compiler-rt/lib/builtins/fixunssfdi.c b/compiler-rt/lib/builtins/fixunssfdi.c index 374ebbe..5a154e8 100644 --- a/compiler-rt/lib/builtins/fixunssfdi.c +++ b/compiler-rt/lib/builtins/fixunssfdi.c @@ -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; -- 2.7.4