]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/22209 (libgfortran unresolvable symbols on irix6.5)
authorRoger Sayle <roger@eyesopen.com>
Wed, 8 Feb 2006 18:31:36 +0000 (18:31 +0000)
committerRoger Sayle <sayle@gcc.gnu.org>
Wed, 8 Feb 2006 18:31:36 +0000 (18:31 +0000)
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
gcc/config/fixtfdi.c [new file with mode: 0644]
gcc/config/fixunstfdi.c [new file with mode: 0644]
gcc/config/floatditf.c [new file with mode: 0644]
gcc/config/floatunditf.c [new file with mode: 0644]
gcc/config/mips/_tilib.c [deleted file]
gcc/config/mips/mips.h
gcc/config/mips/t-iris6
gcc/config/mips/t-linux64

index 224642c314e3ef04517fdb6dcd2b9a7159d65040..719437489de9ab7aad425cb1153de78140f7a015 100644 (file)
@@ -1,3 +1,16 @@
+2006-02-08  Roger Sayle  <roger@eyesopen.com>
+
+       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  <law@redhat.com>
 
        PR tree-optimization/26169
diff --git a/gcc/config/fixtfdi.c b/gcc/config/fixtfdi.c
new file mode 100644 (file)
index 0000000..9fa13c2
--- /dev/null
@@ -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 (file)
index 0000000..ed81366
--- /dev/null
@@ -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 (file)
index 0000000..7656f2d
--- /dev/null
@@ -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 (file)
index 0000000..27fa058
--- /dev/null
@@ -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 (file)
index 8e5e1ef..0000000
+++ /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 <aoliva@redhat.com>
-
-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 */
index 7a1837f68fd7936850404fbaa34b06111b15bbf2..8ebb3c58e2bf71f517be48d027e779ab5797e5a4 100644 (file)
@@ -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)
index 254480cb43f54cf330538246471fdfbfbc39a367..0ddf33915938b7d6c6580109cbe7198143e72114 100644 (file)
@@ -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
 
index 1896f491e936f673d7d382c947f76b4e81387b5b..c96d5ed581fd86a854459d50bf7636b90c8dfc93 100644 (file)
@@ -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