diff options
author | Janis Johnson <janis187@us.ibm.com> | 2008-02-22 01:55:40 +0000 |
---|---|---|
committer | Janis Johnson <janis@gcc.gnu.org> | 2008-02-22 01:55:40 +0000 |
commit | a2db2771a0cd17872b78a4cebb40dad70b9e4539 (patch) | |
tree | 1356ee5a501a419436b74e16bdfa0fbb8402eb55 | |
parent | b3184fd133ddc63e481037c1412fa0410a66643d (diff) | |
download | gcc-a2db2771a0cd17872b78a4cebb40dad70b9e4539.zip gcc-a2db2771a0cd17872b78a4cebb40dad70b9e4539.tar.gz gcc-a2db2771a0cd17872b78a4cebb40dad70b9e4539.tar.bz2 |
re PR target/34526 (no-altivec ABI should be fixed or no longer be the default)
PR target/34526
* config/rs6000/rs6000.c (rs6000_altivec_abi): Clarify comment.
(rs6000_explicit_options): Split abi into spe_abi and altivec_abi,
add vrsave.
(rs6000_override_options): Set altivec_abi as default, not override,
for 64-bit GNU/Linux; for 32-bit GNU/Linux default to altivec_abi for
TARGET_ALTIVEC; default to TARGET_ALTIVEC_VRSAVE when AltiVec ABI
is used; use new member spe_abi.
(rs6000_handle_option): Set rs6000_explicit_options.vrsave; use
spe_abi and altivec_abi.
From-SVN: r132537
-rw-r--r-- | gcc/ChangeLog | 13 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.c | 35 |
2 files changed, 36 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index dabadd2..93b1e07 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,16 @@ +2008-02-21 Janis Johnson <janis187@us.ibm.com> + + PR target/34526 + * config/rs6000/rs6000.c (rs6000_altivec_abi): Clarify comment. + (rs6000_explicit_options): Split abi into spe_abi and altivec_abi, + add vrsave. + (rs6000_override_options): Set altivec_abi as default, not override, + for 64-bit GNU/Linux; for 32-bit GNU/Linux default to altivec_abi for + TARGET_ALTIVEC; default to TARGET_ALTIVEC_VRSAVE when AltiVec ABI + is used; use new member spe_abi. + (rs6000_handle_option): Set rs6000_explicit_options.vrsave; use + spe_abi and altivec_abi. + 2008-02-22 Tomas Bily <tbily@suse.cz> * tree-vectorizer.c (vect_is_simple_reduction): Fix comment typo. diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 4ebea38..b3eb055 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -171,7 +171,7 @@ int rs6000_long_double_type_size; /* IEEE quad extended precision long double. */ int rs6000_ieeequad; -/* Whether -mabi=altivec has appeared. */ +/* Nonzero to use AltiVec ABI. */ int rs6000_altivec_abi; /* Nonzero if we want SPE ABI extensions. */ @@ -262,12 +262,14 @@ 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=spe/nospe was used. */ + bool spe_abi; /* True if -mabi=spe/no-spe was used. */ + bool altivec_abi; /* True if -mabi=altivec/no-altivec 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. */ + bool vrsave; /* True if -mvrsave was used. */ } rs6000_explicit_options; struct builtin_description @@ -1590,11 +1592,18 @@ rs6000_override_options (const char *default_cpu) if (TARGET_XCOFF && TARGET_ALTIVEC) rs6000_altivec_abi = 1; - /* Set Altivec ABI as default for PowerPC64 Linux. */ - if (TARGET_ELF && TARGET_64BIT) + /* The AltiVec ABI is the default for PowerPC-64 GNU/Linux. For + PowerPC-32 GNU/Linux, -maltivec implies the AltiVec ABI. It can + be explicitly overridden in either case. */ + if (TARGET_ELF) { - rs6000_altivec_abi = 1; - TARGET_ALTIVEC_VRSAVE = 1; + if (!rs6000_explicit_options.altivec_abi + && (TARGET_64BIT || TARGET_ALTIVEC)) + rs6000_altivec_abi = 1; + + /* Enable VRSAVE for AltiVec ABI, unless explicitly overridden. */ + if (!rs6000_explicit_options.vrsave) + TARGET_ALTIVEC_VRSAVE = rs6000_altivec_abi; } /* Set the Darwin64 ABI as default for 64-bit Darwin. */ @@ -1638,7 +1647,7 @@ rs6000_override_options (const char *default_cpu) /* For the powerpc-eabispe configuration, we set all these by default, so let's unset them if we manually set another CPU that is not the E500. */ - if (!rs6000_explicit_options.abi) + if (!rs6000_explicit_options.spe_abi) rs6000_spe_abi = 0; if (!rs6000_explicit_options.spe) rs6000_spe = 0; @@ -2131,6 +2140,7 @@ rs6000_handle_option (size_t code, const char *arg, int value) break; case OPT_mvrsave_: + rs6000_explicit_options.vrsave = true; rs6000_parse_yes_no_option ("vrsave", arg, &(TARGET_ALTIVEC_VRSAVE)); break; @@ -2188,19 +2198,20 @@ rs6000_handle_option (size_t code, const char *arg, int value) case OPT_mabi_: if (!strcmp (arg, "altivec")) { - rs6000_explicit_options.abi = true; + rs6000_explicit_options.altivec_abi = true; rs6000_altivec_abi = 1; + + /* Enabling the AltiVec ABI turns off the SPE ABI. */ rs6000_spe_abi = 0; } else if (! strcmp (arg, "no-altivec")) { - /* ??? Don't set rs6000_explicit_options.abi here, to allow - the default for rs6000_spe_abi to be chosen later. */ + rs6000_explicit_options.altivec_abi = true; rs6000_altivec_abi = 0; } else if (! strcmp (arg, "spe")) { - rs6000_explicit_options.abi = true; + rs6000_explicit_options.spe_abi = true; rs6000_spe_abi = 1; rs6000_altivec_abi = 0; if (!TARGET_SPE_ABI) @@ -2208,7 +2219,7 @@ rs6000_handle_option (size_t code, const char *arg, int value) } else if (! strcmp (arg, "no-spe")) { - rs6000_explicit_options.abi = true; + rs6000_explicit_options.spe_abi = true; rs6000_spe_abi = 0; } |