This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PowerPC] linuxspe vs. ibm long double.
- From: Alan Modra <amodra at bigpond dot net dot au>
- To: gcc-patches at gcc dot gnu dot org
- Cc: David Edelsohn <dje at watson dot ibm dot com>
- Date: Thu, 30 Mar 2006 14:11:57 +0930
- Subject: [PowerPC] linuxspe vs. ibm long double.
This patch fixes a problem I noticed when fiddling with PR26459, namely,
that -mabi=ieeelongdouble or -mabi=ibmlongdouble stops the default
setting of rs6000_spe_abi. Accomplished by only setting
rs6000_explicit_options.abi when -mabi=spe/no-spe/altivec is given,
and using a separate field in rs6000_explicit_options for
-mabi=ibmlongdouble/ieeelongdouble. I figure that is reasonable to
separate the ieee/ibm long double selection from other abi selection.
I also select IEEE long double for linux spe by default, because the
E500 ABI doc quite clearly states that while other long double formats
may be used by the compiler that they must not be the default. Whether
compatibilty with the ABI matters more than compatibility with the new
linux default is arguable, but I'm inclined to favour E500 ABI
compatibility over linux compatibility in this case.
Tested with a powerpc-linux -> powerpc-linuxspe cross build. OK for
mainline? 4.1 too?
* config/rs6000/rs6000.c (rs6000_explicit_options): Add ieee.
(rs6000_override_options): Use it.
(rs6000_handle_option): Set it. Set rs6000_explicit_options.abi
only for -mabi=spe/no-spe and -mabi=altivec.
* config/rs6000/linuxspe.h (SUBSUBTARGET_OVERRIDE_OPTIONS): Set
rs6000_ieeequad when spe abi.
Index: gcc/config/rs6000/linuxspe.h
===================================================================
--- gcc/config/rs6000/linuxspe.h (revision 112399)
+++ gcc/config/rs6000/linuxspe.h (working copy)
@@ -49,6 +49,8 @@
rs6000_cpu = PROCESSOR_PPC8540; \
if (!rs6000_explicit_options.abi) \
rs6000_spe_abi = 1; \
+ if (rs6000_spe_abi && !rs6000_explicit_options.ieee) \
+ rs6000_ieeequad = 1; \
if (!rs6000_explicit_options.float_gprs) \
rs6000_float_gprs = 1; \
/* See note below. */ \
Index: gcc/config/rs6000/rs6000.c
===================================================================
--- gcc/config/rs6000/rs6000.c (revision 112399)
+++ gcc/config/rs6000/rs6000.c (working copy)
@@ -249,11 +249,12 @@ int rs6000_alignment_flags;
struct {
bool aix_struct_ret; /* True if -maix-struct-ret was used. */
bool alignment; /* True if -malign- was used. */
- bool abi; /* True if -mabi= was used. */
+ bool abi; /* True if -mabi=spe/nospe was used. */
bool spe; /* True if -mspe= was used. */
bool float_gprs; /* True if -mfloat-gprs= was used. */
bool isel; /* True if -misel was used. */
bool long_double; /* True if -mlong-double- was used. */
+ bool ieee; /* True if -mabi=ieee/ibmlongdouble used. */
} rs6000_explicit_options;
struct builtin_description
@@ -1292,7 +1293,7 @@ rs6000_override_options (const char *def
rs6000_long_double_type_size = RS6000_DEFAULT_LONG_DOUBLE_SIZE;
#ifndef POWERPC_LINUX
- if (!rs6000_explicit_options.abi)
+ if (!rs6000_explicit_options.ieee)
rs6000_ieeequad = 1;
#endif
@@ -1750,23 +1751,31 @@ rs6000_handle_option (size_t code, const
#endif
case OPT_mabi_:
- rs6000_explicit_options.abi = true;
if (!strcmp (arg, "altivec"))
{
+ rs6000_explicit_options.abi = true;
rs6000_altivec_abi = 1;
rs6000_spe_abi = 0;
}
else if (! strcmp (arg, "no-altivec"))
- rs6000_altivec_abi = 0;
+ {
+ /* ??? Don't set rs6000_explicit_options.abi here, to allow
+ the default for rs6000_spe_abi to be chosen later. */
+ rs6000_altivec_abi = 0;
+ }
else if (! strcmp (arg, "spe"))
{
+ rs6000_explicit_options.abi = true;
rs6000_spe_abi = 1;
rs6000_altivec_abi = 0;
if (!TARGET_SPE_ABI)
error ("not configured for ABI: '%s'", arg);
}
else if (! strcmp (arg, "no-spe"))
- rs6000_spe_abi = 0;
+ {
+ rs6000_explicit_options.abi = true;
+ rs6000_spe_abi = 0;
+ }
/* These are here for testing during development only, do not
document in the manual please. */
@@ -1783,11 +1792,13 @@ rs6000_handle_option (size_t code, const
else if (! strcmp (arg, "ibmlongdouble"))
{
+ rs6000_explicit_options.ieee = true;
rs6000_ieeequad = 0;
warning (0, "Using IBM extended precision long double");
}
else if (! strcmp (arg, "ieeelongdouble"))
{
+ rs6000_explicit_options.ieee = true;
rs6000_ieeequad = 1;
warning (0, "Using IEEE extended precision long double");
}
--
Alan Modra
IBM OzLabs - Linux Technology Centre