Commit 6f85d0c4 by David Edelsohn Committed by David Edelsohn

re PR target/19019 (GCC ldouble format incompatibility with XLC long double)

        PR target/19019
        * config/rs6000/darwin-ldouble.c (_xlqadd): Rename to __gcc_qadd.
        (_xlqsub): Rename to __gcc_qsub.
        (_xlqmul): Rename to __gcc_qmul.
        (_xlqdiv): Rename to __gcc_qdiv.
        Provide versioned symbol aliases with old names.
        * config/rs6000/libgcc-ppc64.ver: Rename symbols.
        * config/rs6000/rs6000.c (rs6000_init_libfuncs): Rename symbols.
        * config/rs6000/t-aix43 (LIB2FUNCS_EXTRA): New.
        * config/rs6000/t-aix52 (LIB2FUNCS_EXTRA): New.
        * config/rs6000/t-newas (LIB2FUNCS_EXTRA): New.

From-SVN: r95079
parent 342e3b23
2005-02-15 David Edelsohn <edelsohn@gnu.org>
PR target/19019
* config/rs6000/darwin-ldouble.c (_xlqadd): Rename to __gcc_qadd.
(_xlqsub): Rename to __gcc_qsub.
(_xlqmul): Rename to __gcc_qmul.
(_xlqdiv): Rename to __gcc_qdiv.
Provide versioned symbol aliases with old names.
* config/rs6000/libgcc-ppc64.ver: Rename symbols.
* config/rs6000/rs6000.c (rs6000_init_libfuncs): Rename symbols.
* config/rs6000/t-aix43 (LIB2FUNCS_EXTRA): New.
* config/rs6000/t-aix52 (LIB2FUNCS_EXTRA): New.
* config/rs6000/t-newas (LIB2FUNCS_EXTRA): New.
2005-02-15 James A. Morrison <phython@gcc.gnu.org> 2005-02-15 James A. Morrison <phython@gcc.gnu.org>
* fold-const.c (fold): Fold -(~A) to A + 1. Fold ~(-A) to A - 1. * fold-const.c (fold): Fold -(~A) to A + 1. Fold ~(-A) to A - 1.
......
/* 128-bit long double support routines for Darwin. /* 128-bit long double support routines for Darwin.
Copyright (C) 1993, 2003, 2004 Free Software Foundation, Inc. Copyright (C) 1993, 2003, 2004, 2005 Free Software Foundation, Inc.
This file is part of GCC. This file is part of GCC.
...@@ -30,12 +30,12 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA ...@@ -30,12 +30,12 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
/* Implementations of floating-point long double basic arithmetic /* Implementations of floating-point long double basic arithmetic
functions called by the IBM C compiler when generating code for functions called by the IBM C compiler when generating code for
PowerPC platforms. In particular, the following functions are PowerPC platforms. In particular, the following functions are
implemented: _xlqadd, _xlqsub, _xlqmul, and _xlqdiv. Double-double implemented: __gcc_qadd, __gcc_qsub, __gcc_qmul, and __gcc_qdiv.
algorithms are based on the paper "Doubled-Precision IEEE Standard Double-double algorithms are based on the paper "Doubled-Precision
754 Floating-Point Arithmetic" by W. Kahan, February 26, 1987. An IEEE Standard 754 Floating-Point Arithmetic" by W. Kahan, February 26,
alternative published reference is "Software for Doubled-Precision 1987. An alternative published reference is "Software for
Floating-Point Computations", by Seppo Linnainmaa, ACM TOMS vol 7 Doubled-Precision Floating-Point Computations", by Seppo Linnainmaa,
no 3, September 1981, pages 272-283. */ ACM TOMS vol 7 no 3, September 1981, pages 272-283. */
/* Each long double is made up of two IEEE doubles. The value of the /* Each long double is made up of two IEEE doubles. The value of the
long double is the sum of the values of the two parts. The most long double is the sum of the values of the two parts. The most
...@@ -48,7 +48,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA ...@@ -48,7 +48,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
This code currently assumes big-endian. */ This code currently assumes big-endian. */
#if !_SOFT_FLOAT && (defined (__MACH__) || defined (__powerpc64__)) #if !_SOFT_FLOAT && (defined (__MACH__) || defined (__powerpc64__) || defined (_AIX))
#define fabs(x) __builtin_fabs(x) #define fabs(x) __builtin_fabs(x)
#define isless(x, y) __builtin_isless (x, y) #define isless(x, y) __builtin_isless (x, y)
...@@ -62,10 +62,27 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA ...@@ -62,10 +62,27 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
but GCC currently generates poor code when a union is used to turn but GCC currently generates poor code when a union is used to turn
a long double into a pair of doubles. */ a long double into a pair of doubles. */
extern long double _xlqadd (double, double, double, double); extern long double __gcc_qadd (double, double, double, double);
extern long double _xlqsub (double, double, double, double); extern long double __gcc_qsub (double, double, double, double);
extern long double _xlqmul (double, double, double, double); extern long double __gcc_qmul (double, double, double, double);
extern long double _xlqdiv (double, double, double, double); extern long double __gcc_qdiv (double, double, double, double);
#ifdef __ELF__
/* Provide definitions of the old symbol names to statisfy apps and
shared libs built against an older libgcc. To access the _xlq
symbols an explicit version reference is needed, so these won't
satisfy an unadorned reference like _xlqadd. If dot symbols are
not needed, the assembler will remove the aliases from the symbol
table. */
__asm__ (".symver __gcc_qadd,_xlqadd@GCC_3.4\n\t"
".symver __gcc_qsub,_xlqsub@GCC_3.4\n\t"
".symver __gcc_qmul,_xlqmul@GCC_3.4\n\t"
".symver __gcc_qdiv,_xlqdiv@GCC_3.4\n\t"
".symver .__gcc_qadd,._xlqadd@GCC_3.4\n\t"
".symver .__gcc_qsub,._xlqsub@GCC_3.4\n\t"
".symver .__gcc_qmul,._xlqmul@GCC_3.4\n\t"
".symver .__gcc_qdiv,._xlqdiv@GCC_3.4");
#endif
typedef union typedef union
{ {
...@@ -75,7 +92,7 @@ typedef union ...@@ -75,7 +92,7 @@ typedef union
/* Add two 'long double' values and return the result. */ /* Add two 'long double' values and return the result. */
long double long double
_xlqadd (double a, double aa, double c, double cc) __gcc_qadd (double a, double aa, double c, double cc)
{ {
longDblUnion x; longDblUnion x;
double z, q, zz, xh; double z, q, zz, xh;
...@@ -110,13 +127,13 @@ _xlqadd (double a, double aa, double c, double cc) ...@@ -110,13 +127,13 @@ _xlqadd (double a, double aa, double c, double cc)
} }
long double long double
_xlqsub (double a, double b, double c, double d) __gcc_qsub (double a, double b, double c, double d)
{ {
return _xlqadd (a, b, -c, -d); return __gcc_qadd (a, b, -c, -d);
} }
long double long double
_xlqmul (double a, double b, double c, double d) __gcc_qmul (double a, double b, double c, double d)
{ {
longDblUnion z; longDblUnion z;
double t, tau, u, v, w; double t, tau, u, v, w;
...@@ -145,7 +162,7 @@ _xlqmul (double a, double b, double c, double d) ...@@ -145,7 +162,7 @@ _xlqmul (double a, double b, double c, double d)
} }
long double long double
_xlqdiv (double a, double b, double c, double d) __gcc_qdiv (double a, double b, double c, double d)
{ {
longDblUnion z; longDblUnion z;
double s, sigma, t, tau, u, v, w; double s, sigma, t, tau, u, v, w;
......
GCC_3.4 { GCC_3.4.4 {
# long double support # long double support
_xlqadd __gcc_qadd
_xlqsub __gcc_qsub
_xlqmul __gcc_qmul
_xlqdiv __gcc_qdiv
} }
...@@ -8871,10 +8871,10 @@ rs6000_init_libfuncs (void) ...@@ -8871,10 +8871,10 @@ rs6000_init_libfuncs (void)
} }
/* Standard AIX/Darwin/64-bit SVR4 quad floating point routines. */ /* Standard AIX/Darwin/64-bit SVR4 quad floating point routines. */
set_optab_libfunc (add_optab, TFmode, "_xlqadd"); set_optab_libfunc (add_optab, TFmode, "__gcc_qadd");
set_optab_libfunc (sub_optab, TFmode, "_xlqsub"); set_optab_libfunc (sub_optab, TFmode, "__gcc_qsub");
set_optab_libfunc (smul_optab, TFmode, "_xlqmul"); set_optab_libfunc (smul_optab, TFmode, "__gcc_qmul");
set_optab_libfunc (sdiv_optab, TFmode, "_xlqdiv"); set_optab_libfunc (sdiv_optab, TFmode, "__gcc_qdiv");
} }
else else
{ {
......
...@@ -61,6 +61,9 @@ SHLIB_MKMAP = $(srcdir)/mkmap-flat.awk ...@@ -61,6 +61,9 @@ SHLIB_MKMAP = $(srcdir)/mkmap-flat.awk
SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver
SHLIB_NM_FLAGS = -Bpg -X32_64 SHLIB_NM_FLAGS = -Bpg -X32_64
# GCC 128-bit long double support routines.
LIB2FUNCS_EXTRA = $(srcdir)/config/rs6000/darwin-ldouble.c
# Either 32-bit and 64-bit objects in archives. # Either 32-bit and 64-bit objects in archives.
AR_FLAGS_FOR_TARGET = -X32_64 AR_FLAGS_FOR_TARGET = -X32_64
......
...@@ -42,6 +42,9 @@ SHLIB_MKMAP = $(srcdir)/mkmap-flat.awk ...@@ -42,6 +42,9 @@ SHLIB_MKMAP = $(srcdir)/mkmap-flat.awk
SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver
SHLIB_NM_FLAGS = -Bpg -X32_64 SHLIB_NM_FLAGS = -Bpg -X32_64
# GCC 128-bit long double support routines.
LIB2FUNCS_EXTRA = $(srcdir)/config/rs6000/darwin-ldouble.c
# Either 32-bit and 64-bit objects in archives. # Either 32-bit and 64-bit objects in archives.
AR_FLAGS_FOR_TARGET = -X32_64 AR_FLAGS_FOR_TARGET = -X32_64
......
...@@ -27,6 +27,9 @@ MULTILIB_MATCHES = $(MULTILIB_MATCHES_FLOAT) \ ...@@ -27,6 +27,9 @@ MULTILIB_MATCHES = $(MULTILIB_MATCHES_FLOAT) \
mcpu?powerpc=mpowerpc-gpopt \ mcpu?powerpc=mpowerpc-gpopt \
mcpu?powerpc=mpowerpc-gfxopt mcpu?powerpc=mpowerpc-gfxopt
# GCC 128-bit long double support routines.
LIB2FUNCS_EXTRA = $(srcdir)/config/rs6000/darwin-ldouble.c
# Aix 3.2.x needs milli.exp for -mcpu=common # Aix 3.2.x needs milli.exp for -mcpu=common
EXTRA_PARTS = milli.exp EXTRA_PARTS = milli.exp
milli.exp: $(srcdir)/config/rs6000/milli.exp milli.exp: $(srcdir)/config/rs6000/milli.exp
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment