diff options
author | Jakub Jelinek <jakub@gcc.gnu.org> | 2006-01-27 20:59:49 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2006-01-27 20:59:49 +0100 |
commit | 602ea4d30716a6c72c6ee7fc8207a87e58a40d80 (patch) | |
tree | f8ce337caaf6de64c8851c52894637502cb77c32 /gcc | |
parent | 091c9413bb5e21d619ff38e5a5dcea2e78e0ae42 (diff) | |
download | gcc-602ea4d30716a6c72c6ee7fc8207a87e58a40d80.zip gcc-602ea4d30716a6c72c6ee7fc8207a87e58a40d80.tar.gz gcc-602ea4d30716a6c72c6ee7fc8207a87e58a40d80.tar.bz2 |
[multiple changes]
2006-01-27 Jakub Jelinek <jakub@redhat.com>
PR target/25864
* libgcc-std.ver: Add GCC_4.1.0 symbol version.
* config/rs6000/t-linux64 (TARGET_LIBGCC2_CFLAGS): Only append
-mno-minimal-toc to previous content.
(bispecs): Remove goal.
* config/rs6000/ppc64-fp.c: Define TMODES before including fp-bit.h.
* config/rs6000/darwin-ldouble.c: Don't provide _xlq*@GCC_3.4
compatibility aliases on powerpc-*-*gnu*.
* config/rs6000/libgcc-ppc-glibc.ver: New file.
* config/rs6000/t-ppccomm (SHLIB_MAPFILES): Append
libgcc-ppc-glibc.ver on powerpc*-*-*gnu*.
(TARGET_LIBGCC2_CFLAGS): Append -specs=ldblspecs.
(ldblspecs): New goal.
* config/rs6000/t-linux64 (SHLIB_MAPFILES): Removed.
* mklibgcc.in: If $TPBIT is empty, don't compile _sf_to_tf and
_df_to_tf.
* config/fp-bit.h (TMODES): Don't define if none of TFLOAT,
L_sf_to_tf or L_df_to_tf is defined.
2006-01-27 David Edelsohn <edelsohn@gnu.org>
Alan Modra <amodra@bigpond.net.au>
PR target/25864
* config/rs6000/linux.h (POWERPC_LINUX): Define.
* config/rs6000/linux64.h (POWERPC_LINUX): Define.
* config/rs6000/darwin-ldouble.c: Build on 32-bit PowerPC.
* config/rs6000/darwin.h (TARGET_IEEEQUAD): Define to zero.
* config/rs6000/aix.h (TARGET_IEEEQUAD): Define to zero.
* config/rs6000/rs6000.c (rs6000_ieeequad): New variable.
(rs6000_override_options): Initialize rs6000_ieeequad.
Initialize TFmode format to ibm_extended_format if not
TARGET_IEEEQUAD.
(rs6000_handle_option): Accept -mabi= ibmlongdouble and
ieeelongdouble.
(rs6000_emit_move): Move !TARGET_IEEEQUAD as two parts.
(rs6000_return_in_memory): Only return IEEEQUAD in memory.
(function_arg_advance): IBM long double passed in two FPRs, not
split.
(function_arg): IBM long double passed in FPRs.
(rs6000_pass_by_reference): Only IEEEQUAD passed by reference.
(rs6000_gimplify_va_arg): IBM long double passed in two FPRs.
Only multireg GPR aligned.
(rs6000_init_libfuncs): Enable IBM long double functions if not
IEEEQUAD.
(rs6000_generate_compare): Use IBM long double compare if not
TARGET_IEEEQUAD.
* config/rs6000/rs6000.h (rs6000_ieeequad): Declare.
(TARGET_IEEEQUAD): Define.
(CANNOT_CHANGE_MODE_CLASS): Any mode larger than doubleword if
not TARGET_IEEEQUAD.
* config/rs6000/rs6000.md: Enable TFmode patterns if
!TARGET_IEEEQUAD.
* config/rs6000/t-ppccomm (LIB2FUNCS_EXTRA): Add darwin-ldouble.c.
* config/rs6000/svr4.h (SUBTARGET_OVERRIDE_OPTIONS): -msoft-float
and -mlong-double-128 are incompatible.
* doc/invoke.texi (-mabi): Collect options together. Add
ibmlongdouble and ieeelongdouble.
From-SVN: r110303
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 60 | ||||
-rw-r--r-- | gcc/config/fp-bit.h | 6 | ||||
-rw-r--r-- | gcc/config/rs6000/aix.h | 4 | ||||
-rw-r--r-- | gcc/config/rs6000/darwin-ldouble.c | 8 | ||||
-rw-r--r-- | gcc/config/rs6000/darwin.h | 4 | ||||
-rw-r--r-- | gcc/config/rs6000/libgcc-ppc-glibc.ver | 31 | ||||
-rw-r--r-- | gcc/config/rs6000/linux.h | 6 | ||||
-rw-r--r-- | gcc/config/rs6000/linux64.h | 4 | ||||
-rw-r--r-- | gcc/config/rs6000/ppc64-fp.c | 3 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.c | 107 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.h | 9 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.md | 39 | ||||
-rw-r--r-- | gcc/config/rs6000/sysv4.h | 9 | ||||
-rw-r--r-- | gcc/config/rs6000/t-linux64 | 14 | ||||
-rw-r--r-- | gcc/config/rs6000/t-ppccomm | 14 | ||||
-rw-r--r-- | gcc/doc/invoke.texi | 32 | ||||
-rw-r--r-- | gcc/libgcc-std.ver | 6 | ||||
-rw-r--r-- | gcc/mklibgcc.in | 8 |
18 files changed, 261 insertions, 103 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 589ef6f..7d4e319 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,63 @@ +2006-01-27 Jakub Jelinek <jakub@redhat.com> + + PR target/25864 + * libgcc-std.ver: Add GCC_4.1.0 symbol version. + * config/rs6000/t-linux64 (TARGET_LIBGCC2_CFLAGS): Only append + -mno-minimal-toc to previous content. + (bispecs): Remove goal. + * config/rs6000/ppc64-fp.c: Define TMODES before including fp-bit.h. + * config/rs6000/darwin-ldouble.c: Don't provide _xlq*@GCC_3.4 + compatibility aliases on powerpc-*-*gnu*. + * config/rs6000/libgcc-ppc-glibc.ver: New file. + * config/rs6000/t-ppccomm (SHLIB_MAPFILES): Append + libgcc-ppc-glibc.ver on powerpc*-*-*gnu*. + (TARGET_LIBGCC2_CFLAGS): Append -specs=ldblspecs. + (ldblspecs): New goal. + * config/rs6000/t-linux64 (SHLIB_MAPFILES): Removed. + * mklibgcc.in: If $TPBIT is empty, don't compile _sf_to_tf and + _df_to_tf. + * config/fp-bit.h (TMODES): Don't define if none of TFLOAT, + L_sf_to_tf or L_df_to_tf is defined. + +2006-01-27 David Edelsohn <edelsohn@gnu.org> + Alan Modra <amodra@bigpond.net.au> + + PR target/25864 + * config/rs6000/linux.h (POWERPC_LINUX): Define. + * config/rs6000/linux64.h (POWERPC_LINUX): Define. + * config/rs6000/darwin-ldouble.c: Build on 32-bit PowerPC. + * config/rs6000/darwin.h (TARGET_IEEEQUAD): Define to zero. + * config/rs6000/aix.h (TARGET_IEEEQUAD): Define to zero. + * config/rs6000/rs6000.c (rs6000_ieeequad): New variable. + (rs6000_override_options): Initialize rs6000_ieeequad. + Initialize TFmode format to ibm_extended_format if not + TARGET_IEEEQUAD. + (rs6000_handle_option): Accept -mabi= ibmlongdouble and + ieeelongdouble. + (rs6000_emit_move): Move !TARGET_IEEEQUAD as two parts. + (rs6000_return_in_memory): Only return IEEEQUAD in memory. + (function_arg_advance): IBM long double passed in two FPRs, not + split. + (function_arg): IBM long double passed in FPRs. + (rs6000_pass_by_reference): Only IEEEQUAD passed by reference. + (rs6000_gimplify_va_arg): IBM long double passed in two FPRs. + Only multireg GPR aligned. + (rs6000_init_libfuncs): Enable IBM long double functions if not + IEEEQUAD. + (rs6000_generate_compare): Use IBM long double compare if not + TARGET_IEEEQUAD. + * config/rs6000/rs6000.h (rs6000_ieeequad): Declare. + (TARGET_IEEEQUAD): Define. + (CANNOT_CHANGE_MODE_CLASS): Any mode larger than doubleword if + not TARGET_IEEEQUAD. + * config/rs6000/rs6000.md: Enable TFmode patterns if + !TARGET_IEEEQUAD. + * config/rs6000/t-ppccomm (LIB2FUNCS_EXTRA): Add darwin-ldouble.c. + * config/rs6000/svr4.h (SUBTARGET_OVERRIDE_OPTIONS): -msoft-float + and -mlong-double-128 are incompatible. + * doc/invoke.texi (-mabi): Collect options together. Add + ibmlongdouble and ieeelongdouble. + 2006-01-27 Richard Sandiford <richard@codesourcery.com> * doc/rtl.texi (SYMBOL_REF_DATA): Adjust documentation for new diff --git a/gcc/config/fp-bit.h b/gcc/config/fp-bit.h index 373b659..5ee0279 100644 --- a/gcc/config/fp-bit.h +++ b/gcc/config/fp-bit.h @@ -1,5 +1,5 @@ /* Header file for fp-bit.c. */ -/* Copyright (C) 2000, 2002, 2003 Free Software Foundation, Inc. +/* Copyright (C) 2000, 2002, 2003, 2006 Free Software Foundation, Inc. This file is part of GCC. @@ -89,7 +89,9 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA #endif /* ! FINE_GRAINED_LIBRARIES */ #if __LDBL_MANT_DIG__ == 113 || __LDBL_MANT_DIG__ == 106 -# define TMODES +# if defined(TFLOAT) || defined(L_sf_to_tf) || defined(L_df_to_tf) +# define TMODES +# endif #endif typedef float SFtype __attribute__ ((mode (SF))); diff --git a/gcc/config/rs6000/aix.h b/gcc/config/rs6000/aix.h index e7e2dbd..57f4876 100644 --- a/gcc/config/rs6000/aix.h +++ b/gcc/config/rs6000/aix.h @@ -1,6 +1,6 @@ /* Definitions of target machine for GNU compiler, for IBM RS/6000 POWER running AIX. - Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005 + Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. This file is part of GCC. @@ -42,6 +42,8 @@ #define TARGET_ALTIVEC 0 #undef TARGET_ALTIVEC_ABI #define TARGET_ALTIVEC_ABI 0 +#undef TARGET_IEEEQUAD +#define TARGET_IEEEQUAD 0 /* The AIX linker will discard static constructors in object files before collect has a chance to see them, so scan the object files directly. */ diff --git a/gcc/config/rs6000/darwin-ldouble.c b/gcc/config/rs6000/darwin-ldouble.c index 8faf3a5..11df649 100644 --- a/gcc/config/rs6000/darwin-ldouble.c +++ b/gcc/config/rs6000/darwin-ldouble.c @@ -1,5 +1,6 @@ /* 128-bit long double support routines for Darwin. - Copyright (C) 1993, 2003, 2004, 2005 Free Software Foundation, Inc. + Copyright (C) 1993, 2003, 2004, 2005, 2006 + Free Software Foundation, Inc. This file is part of GCC. @@ -48,7 +49,7 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA This code currently assumes big-endian. */ -#if !_SOFT_FLOAT && (defined (__MACH__) || defined (__powerpc64__) || defined (_AIX)) +#if !_SOFT_FLOAT && (defined (__MACH__) || defined (__powerpc64__) || defined (__powerpc__) || defined (_AIX)) #define fabs(x) __builtin_fabs(x) #define isless(x, y) __builtin_isless (x, y) @@ -67,7 +68,8 @@ extern long double __gcc_qsub (double, double, double, double); extern long double __gcc_qmul (double, double, double, double); extern long double __gcc_qdiv (double, double, double, double); -#if defined __ELF__ && defined SHARED +#if defined __ELF__ && defined SHARED \ + && (defined __powerpc64__ || !(defined __linux__ || defined __gnu_hurd__)) /* Provide definitions of the old symbol names to satisfy apps and shared libs built against an older libgcc. To access the _xlq symbols an explicit version reference is needed, so these won't diff --git a/gcc/config/rs6000/darwin.h b/gcc/config/rs6000/darwin.h index 6c62575..950202a 100644 --- a/gcc/config/rs6000/darwin.h +++ b/gcc/config/rs6000/darwin.h @@ -1,5 +1,5 @@ /* Target definitions for PowerPC running Darwin (Mac OS X). - Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005 + Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. Contributed by Apple Computer Inc. @@ -311,6 +311,8 @@ do { \ /* Darwin only runs on PowerPC, so short-circuit POWER patterns. */ #undef TARGET_POWER #define TARGET_POWER 0 +#undef TARGET_IEEEQUAD +#define TARGET_IEEEQUAD 0 /* Since Darwin doesn't do TOCs, stub this out. */ diff --git a/gcc/config/rs6000/libgcc-ppc-glibc.ver b/gcc/config/rs6000/libgcc-ppc-glibc.ver new file mode 100644 index 0000000..988ed76 --- /dev/null +++ b/gcc/config/rs6000/libgcc-ppc-glibc.ver @@ -0,0 +1,31 @@ +%ifndef _SOFT_FLOAT +%ifndef __powerpc64__ +%exclude { + __multc3 + __divtc3 + __powitf2 + __fixtfdi + __fixunstfdi + __floatditf +} + +GCC_4.1.0 { + # long double support + __multc3 + __divtc3 + __powitf2 + __fixtfdi + __fixunstfdi + __floatditf + +%else +GCC_3.4.4 { +%endif + + # long double support + __gcc_qadd + __gcc_qsub + __gcc_qmul + __gcc_qdiv +} +%endif diff --git a/gcc/config/rs6000/linux.h b/gcc/config/rs6000/linux.h index 497fcca..74aeb2c 100644 --- a/gcc/config/rs6000/linux.h +++ b/gcc/config/rs6000/linux.h @@ -1,7 +1,7 @@ /* Definitions of target machine for GNU compiler, for PowerPC machines running Linux. - Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 - Free Software Foundation, Inc. + Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, + 2004, 2005, 2006 Free Software Foundation, Inc. Contributed by Michael Meissner (meissner@cygnus.com). This file is part of GCC. @@ -118,3 +118,5 @@ /* ppc32 glibc provides __stack_chk_guard in -0x7008(2). */ #define TARGET_THREAD_SSP_OFFSET -0x7008 #endif + +#define POWERPC_LINUX diff --git a/gcc/config/rs6000/linux64.h b/gcc/config/rs6000/linux64.h index bc615e8..c95df9d 100644 --- a/gcc/config/rs6000/linux64.h +++ b/gcc/config/rs6000/linux64.h @@ -1,6 +1,6 @@ /* Definitions of target machine for GNU compiler, for 64 bit PowerPC linux. - Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005 + Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. This file is part of GCC. @@ -567,3 +567,5 @@ while (0) ppc64 glibc provides it at -0x7010(13). */ #define TARGET_THREAD_SSP_OFFSET (TARGET_64BIT ? -0x7010 : -0x7008) #endif + +#define POWERPC_LINUX diff --git a/gcc/config/rs6000/ppc64-fp.c b/gcc/config/rs6000/ppc64-fp.c index 6be3ca82..efa99b6 100644 --- a/gcc/config/rs6000/ppc64-fp.c +++ b/gcc/config/rs6000/ppc64-fp.c @@ -2,7 +2,7 @@ libgcc2.c with macros expanded to force the use of specific types. Copyright (C) 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, - 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + 2000, 2001, 2002, 2003, 2004, 2006 Free Software Foundation, Inc. This file is part of GCC. @@ -31,6 +31,7 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #if defined(__powerpc64__) +#define TMODES #include "config/fp-bit.h" extern DItype __fixtfdi (TFtype); diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index cba6cb7..a2c314b 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -155,10 +155,13 @@ enum rs6000_nop_insertion rs6000_sched_insert_nops; /* Support targetm.vectorize.builtin_mask_for_load. */ static GTY(()) tree altivec_builtin_mask_for_load; -/* Size of long double */ +/* Size of long double. */ int rs6000_long_double_type_size; -/* Whether -mabi=altivec has appeared */ +/* IEEE quad extended precision long double. */ +int rs6000_ieeequad; + +/* Whether -mabi=altivec has appeared. */ int rs6000_altivec_abi; /* Nonzero if we want SPE ABI extensions. */ @@ -1297,6 +1300,11 @@ rs6000_override_options (const char *default_cpu) if (!rs6000_explicit_options.long_double) rs6000_long_double_type_size = RS6000_DEFAULT_LONG_DOUBLE_SIZE; +#ifndef POWERPC_LINUX + if (!rs6000_explicit_options.abi) + rs6000_ieeequad = 1; +#endif + /* Set Altivec ABI as default for powerpc64 linux. */ if (TARGET_ELF && TARGET_64BIT) { @@ -1410,8 +1418,7 @@ rs6000_override_options (const char *default_cpu) if (!rs6000_explicit_options.aix_struct_ret) aix_struct_return = (DEFAULT_ABI != ABI_V4 || DRAFT_V4_STRUCT_RET); - if (TARGET_LONG_DOUBLE_128 - && (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN)) + if (TARGET_LONG_DOUBLE_128 && !TARGET_IEEEQUAD) REAL_MODE_FORMAT (TFmode) = &ibm_extended_format; if (TARGET_TOC) @@ -1780,6 +1787,17 @@ rs6000_handle_option (size_t code, const char *arg, int value) warning (0, "Using old darwin ABI"); } + else if (! strcmp (arg, "ibmlongdouble")) + { + rs6000_ieeequad = 0; + warning (0, "Using IBM extended precision long double"); + } + else if (! strcmp (arg, "ieeelongdouble")) + { + rs6000_ieeequad = 1; + warning (0, "Using IEEE extended precision long double"); + } + else { error ("unknown ABI specified: '%s'", arg); @@ -3902,7 +3920,7 @@ rs6000_emit_move (rtx dest, rtx source, enum machine_mode mode) /* 128-bit constant floating-point values on Darwin should really be loaded as two parts. */ - if ((DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN) + if (!TARGET_IEEEQUAD && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128 && mode == TFmode && GET_CODE (operands[1]) == CONST_DOUBLE) { @@ -4227,7 +4245,7 @@ rs6000_return_in_memory (tree type, tree fntype ATTRIBUTE_UNUSED) return true; } - if (DEFAULT_ABI == ABI_V4 && TYPE_MODE (type) == TFmode) + if (DEFAULT_ABI == ABI_V4 && TARGET_IEEEQUAD && TYPE_MODE (type) == TFmode) return true; return false; @@ -4614,13 +4632,15 @@ function_arg_advance (CUMULATIVE_ARGS *cum, enum machine_mode mode, else if (DEFAULT_ABI == ABI_V4) { if (TARGET_HARD_FLOAT && TARGET_FPRS - && (mode == SFmode || mode == DFmode)) + && (mode == SFmode || mode == DFmode + || (mode == TFmode && !TARGET_IEEEQUAD))) { - if (cum->fregno <= FP_ARG_V4_MAX_REG) - cum->fregno++; + if (cum->fregno + (mode == TFmode ? 1 : 0) <= FP_ARG_V4_MAX_REG) + cum->fregno += (GET_MODE_SIZE (mode) + 7) >> 3; else { - if (mode == DFmode) + cum->fregno = FP_ARG_V4_MAX_REG + 1; + if (mode == DFmode || mode == TFmode) cum->words += cum->words & 1; cum->words += rs6000_arg_size (mode, type); } @@ -5146,9 +5166,10 @@ function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode, else if (abi == ABI_V4) { if (TARGET_HARD_FLOAT && TARGET_FPRS - && (mode == SFmode || mode == DFmode)) + && (mode == SFmode || mode == DFmode + || (mode == TFmode && !TARGET_IEEEQUAD))) { - if (cum->fregno <= FP_ARG_V4_MAX_REG) + if (cum->fregno + (mode == TFmode ? 1 : 0) <= FP_ARG_V4_MAX_REG) return gen_rtx_REG (mode, cum->fregno); else return NULL_RTX; @@ -5351,7 +5372,7 @@ rs6000_pass_by_reference (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED, enum machine_mode mode, tree type, bool named ATTRIBUTE_UNUSED) { - if (DEFAULT_ABI == ABI_V4 && mode == TFmode) + if (DEFAULT_ABI == ABI_V4 && TARGET_IEEEQUAD && mode == TFmode) { if (TARGET_DEBUG_ARG) fprintf (stderr, "function_arg_pass_by_reference: V4 long double\n"); @@ -5802,14 +5823,16 @@ rs6000_gimplify_va_arg (tree valist, tree type, tree *pre_p, tree *post_p) align = 1; if (TARGET_HARD_FLOAT && TARGET_FPRS - && (TYPE_MODE (type) == SFmode || TYPE_MODE (type) == DFmode)) + && (TYPE_MODE (type) == SFmode + || TYPE_MODE (type) == DFmode + || TYPE_MODE (type) == TFmode)) { /* FP args go in FP registers, if present. */ reg = fpr; - n_reg = 1; + n_reg = (size + 7) / 8; sav_ofs = 8*4; sav_scale = 8; - if (TYPE_MODE (type) == DFmode) + if (TYPE_MODE (type) != SFmode) align = 8; } else @@ -5841,7 +5864,7 @@ rs6000_gimplify_va_arg (tree valist, tree type, tree *pre_p, tree *post_p) As are any other 2 gpr item such as complex int due to a historical mistake. */ u = reg; - if (n_reg == 2) + if (n_reg == 2 && reg == gpr) { u = build2 (BIT_AND_EXPR, TREE_TYPE (reg), reg, size_int (n_reg - 1)); @@ -9047,33 +9070,32 @@ rs6000_init_libfuncs (void) if (!TARGET_HARD_FLOAT) return; - if (DEFAULT_ABI != ABI_V4) + if (DEFAULT_ABI != ABI_V4 && TARGET_XCOFF + && !TARGET_POWER2 && !TARGET_POWERPC) { - if (TARGET_XCOFF && ! TARGET_POWER2 && ! TARGET_POWERPC) - { - /* AIX library routines for float->int conversion. */ - set_conv_libfunc (sfix_optab, SImode, DFmode, "__itrunc"); - set_conv_libfunc (ufix_optab, SImode, DFmode, "__uitrunc"); - set_conv_libfunc (sfix_optab, SImode, TFmode, "_qitrunc"); - set_conv_libfunc (ufix_optab, SImode, TFmode, "_quitrunc"); - } + /* AIX library routines for float->int conversion. */ + set_conv_libfunc (sfix_optab, SImode, DFmode, "__itrunc"); + set_conv_libfunc (ufix_optab, SImode, DFmode, "__uitrunc"); + set_conv_libfunc (sfix_optab, SImode, TFmode, "_qitrunc"); + set_conv_libfunc (ufix_optab, SImode, TFmode, "_quitrunc"); + } + if (!TARGET_IEEEQUAD) /* AIX/Darwin/64-bit Linux quad floating point routines. */ - if (!TARGET_XL_COMPAT) - { - set_optab_libfunc (add_optab, TFmode, "__gcc_qadd"); - set_optab_libfunc (sub_optab, TFmode, "__gcc_qsub"); - set_optab_libfunc (smul_optab, TFmode, "__gcc_qmul"); - set_optab_libfunc (sdiv_optab, TFmode, "__gcc_qdiv"); - } - else - { - set_optab_libfunc (add_optab, TFmode, "_xlqadd"); - set_optab_libfunc (sub_optab, TFmode, "_xlqsub"); - set_optab_libfunc (smul_optab, TFmode, "_xlqmul"); - set_optab_libfunc (sdiv_optab, TFmode, "_xlqdiv"); - } - } + if (!TARGET_XL_COMPAT) + { + set_optab_libfunc (add_optab, TFmode, "__gcc_qadd"); + set_optab_libfunc (sub_optab, TFmode, "__gcc_qsub"); + set_optab_libfunc (smul_optab, TFmode, "__gcc_qmul"); + set_optab_libfunc (sdiv_optab, TFmode, "__gcc_qdiv"); + } + else + { + set_optab_libfunc (add_optab, TFmode, "_xlqadd"); + set_optab_libfunc (sub_optab, TFmode, "_xlqsub"); + set_optab_libfunc (smul_optab, TFmode, "_xlqmul"); + set_optab_libfunc (sdiv_optab, TFmode, "_xlqdiv"); + } else { /* 32-bit SVR4 quad floating point routines. */ @@ -11108,7 +11130,7 @@ rs6000_generate_compare (enum rtx_code code) CLOBBERs to match cmptf_internal2 pattern. */ if (comp_mode == CCFPmode && TARGET_XL_COMPAT && GET_MODE (rs6000_compare_op0) == TFmode - && (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN) + && !TARGET_IEEEQUAD && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128) emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (9, @@ -19027,6 +19049,7 @@ rs6000_function_value (tree valtype, tree func ATTRIBUTE_UNUSED) GP_ARG_RETURN + 3), GEN_INT (12)))); } + if ((INTEGRAL_TYPE_P (valtype) && TYPE_PRECISION (valtype) < BITS_PER_WORD) || POINTER_TYPE_P (valtype)) diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h index 8a01d99..bfa7074 100644 --- a/gcc/config/rs6000/rs6000.h +++ b/gcc/config/rs6000/rs6000.h @@ -1,6 +1,7 @@ /* Definitions of target machine for GNU compiler, for IBM RS/6000. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, - 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. + 2000, 2001, 2002, 2003, 2004, 2005, 2006 + Free Software Foundation, Inc. Contributed by Richard Kenner (kenner@vlsi1.ultra.nyu.edu) This file is part of GCC. @@ -291,6 +292,7 @@ extern const char *rs6000_traceback_name; /* Type of traceback table. */ /* These are separate from target_flags because we've run out of bits there. */ extern int rs6000_long_double_type_size; +extern int rs6000_ieeequad; extern int rs6000_altivec_abi; extern int rs6000_spe_abi; extern int rs6000_float_gprs; @@ -316,6 +318,7 @@ extern enum rs6000_nop_insertion rs6000_sched_insert_nops; #endif #define TARGET_LONG_DOUBLE_128 (rs6000_long_double_type_size == 128) +#define TARGET_IEEEQUAD rs6000_ieeequad #define TARGET_ALTIVEC_ABI rs6000_altivec_abi #define TARGET_SPE_ABI 0 @@ -1214,8 +1217,8 @@ enum reg_class /* Return a class of registers that cannot change FROM mode to TO mode. */ #define CANNOT_CHANGE_MODE_CLASS(FROM, TO, CLASS) \ - (((DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN) \ - && GET_MODE_SIZE (FROM) >= 8 && GET_MODE_SIZE (TO) >= 8) \ + (!TARGET_IEEEQUAD \ + && GET_MODE_SIZE (FROM) >= 8 && GET_MODE_SIZE (TO) >= 8 \ ? 0 \ : GET_MODE_SIZE (FROM) != GET_MODE_SIZE (TO) \ ? reg_classes_intersect_p (FLOAT_REGS, CLASS) \ diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md index 17d8ef6..2dabd89 100644 --- a/gcc/config/rs6000/rs6000.md +++ b/gcc/config/rs6000/rs6000.md @@ -1,6 +1,7 @@ ;; Machine description for IBM RISC System 6000 (POWER) for GNU C compiler ;; Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, -;; 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. +;; 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 +;; Free Software Foundation, Inc. ;; Contributed by Richard Kenner (kenner@vlsi1.ultra.nyu.edu) ;; This file is part of GCC. @@ -151,7 +152,7 @@ ; Any hardware-supported floating-point mode (define_mode_macro FP [(SF "TARGET_HARD_FLOAT") (DF "TARGET_HARD_FLOAT && (TARGET_FPRS || TARGET_E500_DOUBLE)") - (TF "(DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN) + (TF "!TARGET_IEEEQUAD && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128")]) ; Various instructions that come in SI and DI forms. @@ -8249,7 +8250,7 @@ (define_expand "movtf" [(set (match_operand:TF 0 "general_operand" "") (match_operand:TF 1 "any_operand" ""))] - "(DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN) + "!TARGET_IEEEQUAD && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128" "{ rs6000_emit_move (operands[0], operands[1], TFmode); DONE; }") @@ -8259,7 +8260,7 @@ (define_insn_and_split "*movtf_internal" [(set (match_operand:TF 0 "nonimmediate_operand" "=o,f,f,r,Y,r") (match_operand:TF 1 "input_operand" "f,o,f,YGHF,r,r"))] - "(DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN) + "!TARGET_IEEEQUAD && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128 && (gpc_reg_operand (operands[0], TFmode) || gpc_reg_operand (operands[1], TFmode))" @@ -8273,7 +8274,7 @@ [(parallel [(set (match_operand:TF 0 "nonimmediate_operand" "") (float_extend:TF (match_operand:DF 1 "input_operand" ""))) (use (match_dup 2))])] - "(DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN) + "!TARGET_IEEEQUAD && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128" { operands[2] = CONST0_RTX (DFmode); @@ -8283,7 +8284,7 @@ [(set (match_operand:TF 0 "nonimmediate_operand" "=o,f,&f,r") (float_extend:TF (match_operand:DF 1 "input_operand" "fr,mf,mf,rmGHF"))) (use (match_operand:DF 2 "zero_reg_mem_operand" "rf,m,f,n"))] - "(DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN) + "!TARGET_IEEEQUAD && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128" "#" "&& reload_completed" @@ -8301,7 +8302,7 @@ (define_expand "extendsftf2" [(set (match_operand:TF 0 "nonimmediate_operand" "") (float_extend:TF (match_operand:SF 1 "gpc_reg_operand" "")))] - "(DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN) + "!TARGET_IEEEQUAD && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128" { rtx tmp = gen_reg_rtx (DFmode); @@ -8313,14 +8314,14 @@ (define_expand "trunctfdf2" [(set (match_operand:DF 0 "gpc_reg_operand" "") (float_truncate:DF (match_operand:TF 1 "gpc_reg_operand" "")))] - "(DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN) + "!TARGET_IEEEQUAD && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128" "") (define_insn_and_split "trunctfdf2_internal1" [(set (match_operand:DF 0 "gpc_reg_operand" "=f,?f") (float_truncate:DF (match_operand:TF 1 "gpc_reg_operand" "0,f")))] - "(DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN) && !TARGET_XL_COMPAT + "!TARGET_IEEEQUAD && !TARGET_XL_COMPAT && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128" "@ # @@ -8336,7 +8337,7 @@ (define_insn "trunctfdf2_internal2" [(set (match_operand:DF 0 "gpc_reg_operand" "=f") (float_truncate:DF (match_operand:TF 1 "gpc_reg_operand" "f")))] - "(DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN) && TARGET_XL_COMPAT + "!TARGET_IEEEQUAD && TARGET_XL_COMPAT && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128" "fadd %0,%1,%L1" [(set_attr "type" "fp")]) @@ -8345,7 +8346,7 @@ [(set (match_operand:SF 0 "gpc_reg_operand" "=f") (float_truncate:SF (match_operand:TF 1 "gpc_reg_operand" "f"))) (clobber (match_scratch:DF 2 "=f"))] - "(DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN) + "!TARGET_IEEEQUAD && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128" "#" "&& reload_completed" @@ -8358,7 +8359,7 @@ (define_expand "floatsitf2" [(set (match_operand:TF 0 "gpc_reg_operand" "=f") (float:TF (match_operand:SI 1 "gpc_reg_operand" "r")))] - "(DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN) + "!TARGET_IEEEQUAD && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128" { rtx tmp = gen_reg_rtx (DFmode); @@ -8386,7 +8387,7 @@ (clobber (match_dup 3)) (clobber (match_dup 4)) (clobber (match_dup 5))])] - "(DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN) + "!TARGET_IEEEQUAD && (TARGET_POWER2 || TARGET_POWERPC) && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128" { @@ -8403,7 +8404,7 @@ (clobber (match_operand:DF 3 "gpc_reg_operand" "=&f")) (clobber (match_operand:DI 4 "gpc_reg_operand" "=f")) (clobber (match_operand:DI 5 "memory_operand" "=o"))] - "(DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN) + "!TARGET_IEEEQUAD && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128" "#" "&& (!no_new_pseudos || offsettable_nonstrict_memref_p (operands[5]))" @@ -8424,7 +8425,7 @@ (define_insn "negtf2" [(set (match_operand:TF 0 "gpc_reg_operand" "=f") (neg:TF (match_operand:TF 1 "gpc_reg_operand" "f")))] - "(DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN) + "!TARGET_IEEEQUAD && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128" "* { @@ -8439,7 +8440,7 @@ (define_expand "abstf2" [(set (match_operand:TF 0 "gpc_reg_operand" "=f") (abs:TF (match_operand:TF 1 "gpc_reg_operand" "f")))] - "(DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN) + "!TARGET_IEEEQUAD && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128" " { @@ -8459,7 +8460,7 @@ (label_ref (match_operand 2 "" "")) (pc))) (set (match_dup 6) (neg:DF (match_dup 6)))] - "(DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN) + "!TARGET_IEEEQUAD && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128" " { @@ -11398,7 +11399,7 @@ [(set (match_operand:CCFP 0 "cc_reg_operand" "=y") (compare:CCFP (match_operand:TF 1 "gpc_reg_operand" "f") (match_operand:TF 2 "gpc_reg_operand" "f")))] - "(DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN) && !TARGET_XL_COMPAT + "!TARGET_IEEEQUAD && !TARGET_XL_COMPAT && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128" "fcmpu %0,%1,%2\;bne %0,$+8\;fcmpu %0,%L1,%L2" [(set_attr "type" "fpcompare") @@ -11416,7 +11417,7 @@ (clobber (match_scratch:DF 8 "=f")) (clobber (match_scratch:DF 9 "=f")) (clobber (match_scratch:DF 10 "=f"))] - "(DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN) && TARGET_XL_COMPAT + "!TARGET_IEEEQUAD && TARGET_XL_COMPAT && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128" "#" "&& reload_completed" diff --git a/gcc/config/rs6000/sysv4.h b/gcc/config/rs6000/sysv4.h index 62690f4..2ed454a 100644 --- a/gcc/config/rs6000/sysv4.h +++ b/gcc/config/rs6000/sysv4.h @@ -1,6 +1,6 @@ /* Target definitions for GNU compiler for PowerPC running System V.4 Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, - 2004, 2005 Free Software Foundation, Inc. + 2004, 2005, 2006 Free Software Foundation, Inc. Contributed by Cygnus Support. This file is part of GCC. @@ -215,6 +215,13 @@ do { \ error ("-msecure-plt not supported by your assembler"); \ } \ \ + if (TARGET_SOFT_FLOAT && TARGET_LONG_DOUBLE_128) \ + { \ + rs6000_long_double_type_size = 64; \ + if (rs6000_explicit_options.long_double) \ + warning (0, "soft-float and long-double-128 are incompatible"); \ + } \ + \ /* Treat -fPIC the same as -mrelocatable. */ \ if (flag_pic > 1 && DEFAULT_ABI != ABI_AIX) \ target_flags |= MASK_RELOCATABLE | MASK_MINIMAL_TOC | MASK_NO_FP_IN_TOC; \ diff --git a/gcc/config/rs6000/t-linux64 b/gcc/config/rs6000/t-linux64 index 77ba93e..2c30a89 100644 --- a/gcc/config/rs6000/t-linux64 +++ b/gcc/config/rs6000/t-linux64 @@ -4,9 +4,7 @@ LIB2FUNCS_EXTRA = tramp.S $(srcdir)/config/rs6000/ppc64-fp.c \ $(srcdir)/config/rs6000/darwin-ldouble.c -TARGET_LIBGCC2_CFLAGS = -mno-minimal-toc -fPIC -specs=bispecs - -SHLIB_MAPFILES += $(srcdir)/config/rs6000/libgcc-ppc64.ver +TARGET_LIBGCC2_CFLAGS += -mno-minimal-toc MULTILIB_OPTIONS = m64/m32 msoft-float MULTILIB_DIRNAMES = 64 32 nof @@ -32,13 +30,3 @@ fp-bit32.c: $(srcdir)/config/fp-bit.c echo '#define FLOAT'; \ cat $(srcdir)/config/fp-bit.c; \ echo '#endif' ) > fp-bit32.c - -# Hack to use -mlong-double-128 just for compiling 64 bit libgcc -mklibgcc: bispecs - -bispecs: specs - if [ x`$(GCC_FOR_TARGET) -print-multi-os-directory` = x../lib ]; then \ - sed -e '/cc1_options/{ n; s/$$/ %{m64:-mlong-double-128}/; }' < specs > $@; \ - else \ - sed -e '/cc1_options/{ n; s/$$/ %{!m32:-mlong-double-128}/; }' < specs > $@; \ - fi diff --git a/gcc/config/rs6000/t-ppccomm b/gcc/config/rs6000/t-ppccomm index eaa3252..e58dfe5 100644 --- a/gcc/config/rs6000/t-ppccomm +++ b/gcc/config/rs6000/t-ppccomm @@ -1,6 +1,6 @@ # Common support for PowerPC ELF targets (both EABI and SVR4). -LIB2FUNCS_EXTRA = tramp.S +LIB2FUNCS_EXTRA = tramp.S $(srcdir)/config/rs6000/darwin-ldouble.c # This one can't end up in shared libgcc LIB2FUNCS_STATIC_EXTRA = eabi.S @@ -11,6 +11,18 @@ eabi.S: $(srcdir)/config/rs6000/eabi.asm tramp.S: $(srcdir)/config/rs6000/tramp.asm cat $(srcdir)/config/rs6000/tramp.asm > tramp.S +ifneq (,$findstring gnu,$(target)) +TARGET_LIBGCC2_CFLAGS += -specs=ldblspecs + +SHLIB_MAPFILES += $(srcdir)/config/rs6000/libgcc-ppc-glibc.ver + +# Hack to use -mlong-double-128 only when not compiling nof libgcc +mklibgcc: ldblspecs + +ldblspecs: specs + sed -e '/cc1_options/{ n; s/$$/ %{!msoft-float:-mlong-double-128}/; }' < specs > $@ +endif + # Switch synonyms MULTILIB_MATCHES_ENDIAN = mlittle=mlittle-endian mbig=mbig-endian MULTILIB_MATCHES_SYSV = mcall-sysv=mcall-sysv-eabi mcall-sysv=mcall-sysv-noeabi mcall-sysv=mcall-linux mcall-sysv=mcall-netbsd diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 8c48d42..8301a0a 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -11118,16 +11118,6 @@ enhancements. @opindex mno-vrsave Generate VRSAVE instructions when generating AltiVec code. -@item -mabi=spe -@opindex mabi=spe -Extend the current ABI with SPE ABI extensions. This does not change -the default ABI, instead it adds the SPE ABI extensions to the current -ABI@. - -@item -mabi=no-spe -@opindex mabi=no-spe -Disable Booke SPE ABI extensions for the current ABI@. - @item -msecure-plt @opindex msecure-plt Generate code that allows ld and ld.so to build executables and shared @@ -11490,7 +11480,27 @@ SVR4 ABI)@. @opindex mabi Extend the current ABI with a particular extension, or remove such extension. Valid values are @var{altivec}, @var{no-altivec}, @var{spe}, -@var{no-spe}@. +@var{no-spe}, @var{ibmlongdouble}, @var{ieeelongdouble}@. + +@item -mabi=spe +@opindex mabi=spe +Extend the current ABI with SPE ABI extensions. This does not change +the default ABI, instead it adds the SPE ABI extensions to the current +ABI@. + +@item -mabi=no-spe +@opindex mabi=no-spe +Disable Booke SPE ABI extensions for the current ABI@. + +@item -mabi=ibmlongdouble +@opindex mabi=ibmlongdouble +Change the current ABI to use IBM extended precision long double. +This is a PowerPC 32-bit SYSV ABI option. + +@item -mabi=ieeelongdouble +@opindex mabi=ieeelongdouble +Change the current ABI to use IEEE extended precision long double. +This is a PowerPC 32-bit Linux ABI option. @item -mprototype @itemx -mno-prototype diff --git a/gcc/libgcc-std.ver b/gcc/libgcc-std.ver index a98ddb4..cb2e7fe 100644 --- a/gcc/libgcc-std.ver +++ b/gcc/libgcc-std.ver @@ -253,7 +253,11 @@ GCC_4.0.0 { __multc3 } -%inherit GCC_4.2.0 GCC_4.0.0 +%inherit GCC_4.1.0 GCC_4.0.0 +GCC_4.1.0 { +} + +%inherit GCC_4.2.0 GCC_4.1.0 GCC_4.2.0 { # unsigned-to-floating conversions __floatunsisf diff --git a/gcc/mklibgcc.in b/gcc/mklibgcc.in index 2162c05..88e0df0 100644 --- a/gcc/mklibgcc.in +++ b/gcc/mklibgcc.in @@ -1,6 +1,7 @@ #!/bin/sh # Construct makefile for libgcc. -# Copyright (C) 2000, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. +# Copyright (C) 2000, 2002, 2003, 2004, 2005, 2006 +# Free Software Foundation, Inc. # # This file is part of GCC. @@ -332,6 +333,11 @@ for ml in $MULTILIBS; do if [ "$fpbit" ] ; then for name in $fpfuncs; do + case "$name" in + # _sf_to_tf and _df_to_tf require tp-bit.c + # being compiled in. + _[sd]f_to_tf) [ -z "$TPBIT" ] && continue;; + esac if [ "$libgcc_s_so" ]; then out="libgcc/${dir}/${name}${objext}" outS="libgcc/${dir}/${name}_s${objext}" |