------- Comment #15 from joseph at codesourcery dot com 2005-11-26 03:55 ------- Subject: Patch for ia64-hpux problems
This patch fixes the ia64-hpux problems with my __floatun* patch. It adds a full set of C implementations of __floatunsi* which should also be usable to solve the arm-netbsdelf problems. Bootstrapped with no regressions on ia64-hp-hpux11.23. OK to commit? 2005-11-26 Joseph S. Myers <[EMAIL PROTECTED]> * config/floatunsisf.c, config/floatunsidf.c, config/floatunsixf.c, config/floatunsitf.c: New files. * config/ia64/t-hpux: Add floatunsitf.c. * config/ia64/ia64.c (ia64_init_libfuncs): Use _U_Qfcnvxuf_dbl_to_quad for unsigned DImode-to-TFmode conversion. diff -rupN GCC.orig/gcc/config/floatunsidf.c GCC/gcc/config/floatunsidf.c --- GCC.orig/gcc/config/floatunsidf.c 1970-01-01 00:00:00.000000000 +0000 +++ GCC/gcc/config/floatunsidf.c 2005-11-25 15:21:38.000000000 +0000 @@ -0,0 +1,15 @@ +/* Public domain. */ +typedef int SItype __attribute__ ((mode (SI))); +typedef unsigned int USItype __attribute__ ((mode (SI))); +typedef float DFtype __attribute__ ((mode (DF))); + +DFtype +__floatunsidf (USItype u) +{ + SItype s = (SItype) u; + DFtype r = (DFtype) s; + if (s < 0) + r += (DFtype)2.0 * (DFtype) ((USItype) 1 + << (sizeof (USItype) * __CHAR_BIT__ - 1)); + return r; +} diff -rupN GCC.orig/gcc/config/floatunsisf.c GCC/gcc/config/floatunsisf.c --- GCC.orig/gcc/config/floatunsisf.c 1970-01-01 00:00:00.000000000 +0000 +++ GCC/gcc/config/floatunsisf.c 2005-11-25 15:26:54.000000000 +0000 @@ -0,0 +1,18 @@ +/* Public domain. */ +typedef int SItype __attribute__ ((mode (SI))); +typedef unsigned int USItype __attribute__ ((mode (SI))); +typedef float SFtype __attribute__ ((mode (SF))); + +SFtype +__floatunsisf (USItype u) +{ + SItype s = (SItype) u; + if (s < 0) + { + /* As in expand_float, compute (u & 1) | (u >> 1) to ensure + correct rounding if a nonzero bit is shifted out. */ + return (SFtype) 2.0 * (SFtype) (SItype) ((u & 1) | (u >> 1)); + } + else + return (SFtype) s; +} diff -rupN GCC.orig/gcc/config/floatunsitf.c GCC/gcc/config/floatunsitf.c --- GCC.orig/gcc/config/floatunsitf.c 1970-01-01 00:00:00.000000000 +0000 +++ GCC/gcc/config/floatunsitf.c 2005-11-25 15:21:48.000000000 +0000 @@ -0,0 +1,15 @@ +/* Public domain. */ +typedef int SItype __attribute__ ((mode (SI))); +typedef unsigned int USItype __attribute__ ((mode (SI))); +typedef float TFtype __attribute__ ((mode (TF))); + +TFtype +__floatunsitf (USItype u) +{ + SItype s = (SItype) u; + TFtype r = (TFtype) s; + if (s < 0) + r += (TFtype)2.0 * (TFtype) ((USItype) 1 + << (sizeof (USItype) * __CHAR_BIT__ - 1)); + return r; +} diff -rupN GCC.orig/gcc/config/floatunsixf.c GCC/gcc/config/floatunsixf.c --- GCC.orig/gcc/config/floatunsixf.c 1970-01-01 00:00:00.000000000 +0000 +++ GCC/gcc/config/floatunsixf.c 2005-11-25 15:21:43.000000000 +0000 @@ -0,0 +1,15 @@ +/* Public domain. */ +typedef int SItype __attribute__ ((mode (SI))); +typedef unsigned int USItype __attribute__ ((mode (SI))); +typedef float XFtype __attribute__ ((mode (XF))); + +XFtype +__floatunsixf (USItype u) +{ + SItype s = (SItype) u; + XFtype r = (XFtype) s; + if (s < 0) + r += (XFtype)2.0 * (XFtype) ((USItype) 1 + << (sizeof (USItype) * __CHAR_BIT__ - 1)); + return r; +} diff -rupN GCC.orig/gcc/config/ia64/ia64.c GCC/gcc/config/ia64/ia64.c --- GCC.orig/gcc/config/ia64/ia64.c 2005-11-20 16:20:24.000000000 +0000 +++ GCC/gcc/config/ia64/ia64.c 2005-11-25 15:10:32.000000000 +0000 @@ -8437,6 +8437,9 @@ ia64_init_libfuncs (void) set_conv_libfunc (sfloat_optab, TFmode, SImode, "_U_Qfcnvxf_sgl_to_quad"); set_conv_libfunc (sfloat_optab, TFmode, DImode, "_U_Qfcnvxf_dbl_to_quad"); + /* HP-UX 11.23 libc does not have a function for unsigned + SImode-to-TFmode conversion. */ + set_conv_libfunc (ufloat_optab, TFmode, DImode, "_U_Qfcnvxuf_dbl_to_quad"); } /* Rename all the TFmode libfuncs using the HPUX conventions. */ diff -rupN GCC.orig/gcc/config/ia64/t-hpux GCC/gcc/config/ia64/t-hpux --- GCC.orig/gcc/config/ia64/t-hpux 2005-10-28 23:33:38.000000000 +0000 +++ GCC/gcc/config/ia64/t-hpux 2005-11-25 15:38:27.000000000 +0000 @@ -9,7 +9,7 @@ MULTILIB_MATCHES = # Support routines for HP-UX 128 bit floats. -LIB2FUNCS_EXTRA=quadlib.c +LIB2FUNCS_EXTRA=quadlib.c $(srcdir)/config/floatunsitf.c quadlib.c: $(srcdir)/config/ia64/quadlib.c cat $(srcdir)/config/ia64/quadlib.c > quadlib.c -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24998