From 3b8318052298eb22355dad37ff842d871c409b3d Mon Sep 17 00:00:00 2001 From: Roger Sayle Date: Wed, 8 Feb 2006 18:31:36 +0000 Subject: [PATCH] re PR target/22209 (libgfortran unresolvable symbols on irix6.5) PR target/22209 * config/mips/mips.h (MIN_UNITS_PER_WORD): Don't define for libgcc. * config/mips/_tilib.c: Remove. * config/fixtfdi.c: New libgcc source file. * config/fixunstfdi.c: New source file. * config/floatditf.c: New source file. * config/floatunditf.c: New souce file. * config/mips/t-iris6 (LIB2FUNCS_EXTRA): Include the new source files above instead of config/mips/_tilib.c. * config/mips/t-linux64 (LIB2FUNCS_EXTRA): Likewise. From-SVN: r110760 --- gcc/ChangeLog | 13 ++++ gcc/config/fixtfdi.c | 18 +++++ gcc/config/fixunstfdi.c | 35 +++++++++ gcc/config/floatditf.c | 25 ++++++ gcc/config/floatunditf.c | 25 ++++++ gcc/config/mips/_tilib.c | 158 -------------------------------------- gcc/config/mips/mips.h | 2 + gcc/config/mips/t-iris6 | 2 +- gcc/config/mips/t-linux64 | 2 +- 9 files changed, 120 insertions(+), 160 deletions(-) create mode 100644 gcc/config/fixtfdi.c create mode 100644 gcc/config/fixunstfdi.c create mode 100644 gcc/config/floatditf.c create mode 100644 gcc/config/floatunditf.c delete mode 100644 gcc/config/mips/_tilib.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 224642c314e..719437489de 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,16 @@ +2006-02-08 Roger Sayle + + PR target/22209 + * config/mips/mips.h (MIN_UNITS_PER_WORD): Don't define for libgcc. + * config/mips/_tilib.c: Remove. + * config/fixtfdi.c: New libgcc source file. + * config/fixunstfdi.c: New source file. + * config/floatditf.c: New source file. + * config/floatunditf.c: New souce file. + * config/mips/t-iris6 (LIB2FUNCS_EXTRA): Include the new source + files above instead of config/mips/_tilib.c. + * config/mips/t-linux64 (LIB2FUNCS_EXTRA): Likewise. + 2006-02-08 Jeff Law PR tree-optimization/26169 diff --git a/gcc/config/fixtfdi.c b/gcc/config/fixtfdi.c new file mode 100644 index 00000000000..9fa13c24847 --- /dev/null +++ b/gcc/config/fixtfdi.c @@ -0,0 +1,18 @@ +/* Public domain. */ +#if __LDBL_MANT_DIG__ == 106 +typedef int DItype __attribute__ ((mode (DI))); +typedef float TFtype __attribute__ ((mode (TF))); + +DItype __fixtfdi (TFtype); +DItype __fixunstfdi (TFtype); + + +DItype +__fixtfdi (TFtype x) +{ + if (x < 0) + return - __fixunstfdi (-x); + return __fixunstfdi (x); +} + +#endif diff --git a/gcc/config/fixunstfdi.c b/gcc/config/fixunstfdi.c new file mode 100644 index 00000000000..ed81366dcfa --- /dev/null +++ b/gcc/config/fixunstfdi.c @@ -0,0 +1,35 @@ +/* Public domain. */ +#if __LDBL_MANT_DIG__ == 106 +typedef int DItype __attribute__ ((mode (DI))); +typedef int SItype __attribute__ ((mode (SI))); +typedef unsigned int UDItype __attribute__ ((mode (DI))); +typedef unsigned int USItype __attribute__ ((mode (SI))); +typedef float TFtype __attribute__ ((mode (TF))); + +DItype __fixunstfdi (TFtype); + +DItype +__fixunstfdi (TFtype a) +{ + if (a < 0) + return 0; + + /* Compute high word of result, as a flonum. */ + const TFtype b = (a / (((UDItype) 1) << (sizeof (SItype) * 8))); + /* Convert that to fixed (but not to DItype!), + and shift it into the high word. */ + UDItype v = (USItype) b; + v <<= (sizeof (SItype) * 8); + /* Remove high part from the TFtype, leaving the low part as flonum. */ + a -= (TFtype) v; + /* Convert that to fixed (but not to DItype!) and add it in. + Sometimes A comes out negative. This is significant, since + A has more bits than a long int does. */ + if (a < 0) + v -= (USItype) (-a); + else + v += (USItype) a; + return v; +} + +#endif diff --git a/gcc/config/floatditf.c b/gcc/config/floatditf.c new file mode 100644 index 00000000000..7656f2db37f --- /dev/null +++ b/gcc/config/floatditf.c @@ -0,0 +1,25 @@ +/* Public domain. */ +#if __LDBL_MANT_DIG__ == 106 +typedef int DItype __attribute__ ((mode (DI))); +typedef int SItype __attribute__ ((mode (SI))); +typedef unsigned int UDItype __attribute__ ((mode (DI))); +typedef unsigned int USItype __attribute__ ((mode (SI))); +typedef float DFtype __attribute__ ((mode (DF))); +typedef float TFtype __attribute__ ((mode (TF))); + +TFtype __floatditf (UDItype); + +TFtype +__floatditf (UDItype u) +{ + DFtype dh, dl; + + dh = (SItype) (u >> (sizeof (SItype) * 8)); + dh *= 2.0 * (((UDItype) 1) << ((sizeof (SItype) * 8) - 1)); + dl = (USItype) (u & ((((UDItype) 1) << (sizeof (SItype) * 8)) - 1)); + + return (TFtype) dh + (TFtype) dl; +} + +#endif + diff --git a/gcc/config/floatunditf.c b/gcc/config/floatunditf.c new file mode 100644 index 00000000000..27fa058e79c --- /dev/null +++ b/gcc/config/floatunditf.c @@ -0,0 +1,25 @@ +/* Public domain. */ +#if __LDBL_MANT_DIG__ == 106 +typedef int DItype __attribute__ ((mode (DI))); +typedef int SItype __attribute__ ((mode (SI))); +typedef unsigned int UDItype __attribute__ ((mode (DI))); +typedef unsigned int USItype __attribute__ ((mode (SI))); +typedef float DFtype __attribute__ ((mode (DF))); +typedef float TFtype __attribute__ ((mode (TF))); + +TFtype __floatunditf (UDItype); + +TFtype +__floatunditf (UDItype u) +{ + DFtype dh, dl; + + dh = (USItype) (u >> (sizeof (SItype) * 8)); + dh *= 2.0 * (((UDItype) 1) << ((sizeof (SItype) * 8) - 1)); + dl = (USItype) (u & ((((UDItype) 1) << (sizeof (SItype) * 8)) - 1)); + + return (TFtype) dh + (TFtype) dl; +} + +#endif + diff --git a/gcc/config/mips/_tilib.c b/gcc/config/mips/_tilib.c deleted file mode 100644 index 8e5e1ef15e7..00000000000 --- a/gcc/config/mips/_tilib.c +++ /dev/null @@ -1,158 +0,0 @@ -/* A few TImode functions needed for TFmode emulated arithmetic. - Copyright 2002, 2003 Free Software Foundation, Inc. - Contributed by Alexandre Oliva - -This file is part of GCC. - -GCC is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2, or (at your option) -any later version. - -GCC is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GCC; see the file COPYING. If not, write to -the Free Software Foundation, 51 Franklin Street, Fifth Floor, -Boston, MA 02110-1301, USA. */ - - -#include "tconfig.h" -#include "coretypes.h" -#include "tm.h" - -#if _MIPS_SIM == _ABIN32 || _MIPS_SIM == _ABI64 - -typedef int TItype __attribute__ ((mode (TI))); -typedef int DItype __attribute__ ((mode (DI))); -typedef int SItype __attribute__ ((mode (SI))); - -typedef unsigned int UDItype __attribute__ ((mode (DI))); - -typedef union -{ - struct TIstruct { -#if LIBGCC2_WORDS_BIG_ENDIAN - DItype high, low; -#else - DItype low, high; -#endif - } s; - TItype ll; -} TIunion; - -TItype __negti2 (TItype); -TItype __ashlti3 (TItype, int); -#if 0 -TItype __ashrti3 (TItype, int); -#endif -TItype __lshrti3 (TItype, int); - -TItype -__negti2 (TItype u) -{ - TIunion w; - TIunion uu; - - uu.ll = u; - - w.s.low = -uu.s.low; - w.s.high = -uu.s.high - ((UDItype) w.s.low > 0); - - return w.ll; -} - -TItype -__ashlti3 (TItype u, int b) -{ - TIunion w; - int bm; - TIunion uu; - - if (b == 0) - return u; - - uu.ll = u; - - bm = (sizeof (DItype) * BITS_PER_UNIT) - b; - if (bm <= 0) - { - w.s.low = 0; - w.s.high = (UDItype) uu.s.low << -bm; - } - else - { - UDItype carries = (UDItype) uu.s.low >> bm; - - w.s.low = (UDItype) uu.s.low << b; - w.s.high = ((UDItype) uu.s.high << b) | carries; - } - - return w.ll; -} - -#if 0 -TItype -__ashrti3 (TItype u, int b) -{ - TIunion w; - int bm; - TIunion uu; - - if (b == 0) - return u; - - uu.ll = u; - - bm = (sizeof (DItype) * BITS_PER_UNIT) - b; - if (bm <= 0) - { - /* w.s.high = 1..1 or 0..0 */ - w.s.high = uu.s.high >> (sizeof (DItype) * BITS_PER_UNIT - 1); - w.s.low = uu.s.high >> -bm; - } - else - { - UDItype carries = (UDItype) uu.s.high << bm; - - w.s.high = uu.s.high >> b; - w.s.low = ((UDItype) uu.s.low >> b) | carries; - } - - return w.ll; -} -#endif - -TItype -__lshrti3 (TItype u, int b) -{ - TIunion w; - int bm; - TIunion uu; - - if (b == 0) - return u; - - uu.ll = u; - - bm = (sizeof (DItype) * BITS_PER_UNIT) - b; - if (bm <= 0) - { - w.s.high = 0; - w.s.low = (UDItype) uu.s.high >> -bm; - } - else - { - UDItype carries = (UDItype) uu.s.high << bm; - - w.s.high = (UDItype) uu.s.high >> b; - w.s.low = ((UDItype) uu.s.low >> b) | carries; - } - - return w.ll; -} - -#endif /* N32 or N64 */ diff --git a/gcc/config/mips/mips.h b/gcc/config/mips/mips.h index 7a1837f68fd..8ebb3c58e2b 100644 --- a/gcc/config/mips/mips.h +++ b/gcc/config/mips/mips.h @@ -975,7 +975,9 @@ extern const struct mips_rtx_cost_data *mips_cost; /* Width of a word, in units (bytes). */ #define UNITS_PER_WORD (TARGET_64BIT ? 8 : 4) +#ifndef IN_LIBGCC2 #define MIN_UNITS_PER_WORD 4 +#endif /* For MIPS, width of a floating point register. */ #define UNITS_PER_FPREG (TARGET_FLOAT64 ? 8 : 4) diff --git a/gcc/config/mips/t-iris6 b/gcc/config/mips/t-iris6 index 254480cb43f..0ddf3391593 100644 --- a/gcc/config/mips/t-iris6 +++ b/gcc/config/mips/t-iris6 @@ -6,7 +6,7 @@ MULTILIB_OSDIRNAMES=../lib32 ../lib ../lib64 LIBGCC = stmp-multilib INSTALL_LIBGCC = install-multilib -LIB2FUNCS_EXTRA = $(srcdir)/config/mips/_tilib.c +LIB2FUNCS_EXTRA = $(srcdir)/config/fixtfdi.c $(srcdir)/config/fixunstfdi.c $(srcdir)/config/floatditf.c $(srcdir)/config/floatunditf.c TPBIT = tp-bit.c diff --git a/gcc/config/mips/t-linux64 b/gcc/config/mips/t-linux64 index 1896f491e93..c96d5ed581f 100644 --- a/gcc/config/mips/t-linux64 +++ b/gcc/config/mips/t-linux64 @@ -4,7 +4,7 @@ MULTILIB_OSDIRNAMES = ../lib32 ../lib ../lib64 EXTRA_MULTILIB_PARTS=crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o -LIB2FUNCS_EXTRA = $(srcdir)/config/mips/_tilib.c +LIB2FUNCS_EXTRA = $(srcdir)/config/fixtfdi.c $(srcdir)/config/fixunstfdi.c $(srcdir)/config/floatditf.c $(srcdir)/config/floatunditf.c TPBIT = tp-bit.c -- 2.30.2