[PATCH] Fix float->uint conversion for inputs less than 0

Derek Schuff dschuff at google.com
Mon Apr 27 14:22:29 PDT 2015


Hi joerg, howard.hinnant,

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

http://reviews.llvm.org/D9305

Files:
  lib/builtins/fixunsdfdi.c
  lib/builtins/fixunsdfti.c
  lib/builtins/fixunssfdi.c

Index: lib/builtins/fixunsdfdi.c
===================================================================
--- lib/builtins/fixunsdfdi.c
+++ lib/builtins/fixunsdfdi.c
@@ -21,6 +21,7 @@
 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: lib/builtins/fixunsdfti.c
===================================================================
--- lib/builtins/fixunsdfti.c
+++ lib/builtins/fixunsdfti.c
@@ -17,7 +17,7 @@
 #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: lib/builtins/fixunssfdi.c
===================================================================
--- lib/builtins/fixunssfdi.c
+++ lib/builtins/fixunssfdi.c
@@ -21,6 +21,7 @@
 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;

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D9305.24504.patch
Type: text/x-patch
Size: 1072 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150427/45eeebe1/attachment.bin>


More information about the llvm-commits mailing list