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
This commit is contained in:
parent
855dd2bcff
commit
3b83180522
9 changed files with 120 additions and 160 deletions
|
@ -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
|
||||
|
|
18
gcc/config/fixtfdi.c
Normal file
18
gcc/config/fixtfdi.c
Normal file
|
@ -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
|
35
gcc/config/fixunstfdi.c
Normal file
35
gcc/config/fixunstfdi.c
Normal file
|
@ -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
|
25
gcc/config/floatditf.c
Normal file
25
gcc/config/floatditf.c
Normal file
|
@ -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
|
||||
|
25
gcc/config/floatunditf.c
Normal file
25
gcc/config/floatunditf.c
Normal file
|
@ -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
|
||||
|
|
@ -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 */
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue