This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
rs6000 -mcpu overrides -msoft-float
- From: Alan Modra <amodra at bigpond dot net dot au>
- To: gcc-patches at gcc dot gnu dot org
- Cc: Geoff Keating <geoffk at geoffk dot org>,David Edelsohn <dje at watson dot ibm dot com>
- Date: Sat, 21 Feb 2004 23:22:05 +1030
- Subject: rs6000 -mcpu overrides -msoft-float
Building a current Linux kernel using gcc-3.4 is currently broken
when compiling with -mcpu=power4. The problem being that -mcpu
overrides -msoft-float, and you get a kernel that uses fprs.
* config/rs6000/rs6000.c (rs6000_override_options): Don't override
-msoft-float by -mcpu. Consolidate similar code for MASK_MULTIPLE
and MASK_STRING.
Bootstrapped etc. powerpc-linux and powerpc64-linux. OK mainline and
3.4?
Index: gcc/config/rs6000/rs6000.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/rs6000/rs6000.c,v
retrieving revision 1.576.2.8
diff -u -p -r1.576.2.8 rs6000.c
--- gcc/config/rs6000/rs6000.c 12 Feb 2004 10:19:28 -0000 1.576.2.8
+++ gcc/config/rs6000/rs6000.c 21 Feb 2004 12:46:16 -0000
@@ -704,11 +704,6 @@ rs6000_override_options (const char *def
const size_t ptt_size = ARRAY_SIZE (processor_target_table);
- /* Save current -mmultiple/-mno-multiple status. */
- int multiple = TARGET_MULTIPLE;
- /* Save current -mstring/-mno-string status. */
- int string = TARGET_STRING;
-
/* Some OSs don't support saving the high part of 64-bit registers on
context switch. Other OSs don't support saving Altivec registers.
On those OSs, we don't touch the MASK_POWERPC64 or MASK_ALTIVEC
@@ -731,6 +726,10 @@ rs6000_override_options (const char *def
set_masks &= ~MASK_ALTIVEC;
#endif
+ /* Don't override these by the processor default if given explicitly. */
+ set_masks &= ~(target_flags_explicit
+ & (MASK_MULTIPLE | MASK_STRING | MASK_SOFT_FLOAT));
+
/* Identify the processor type. */
rs6000_select[0].string = default_cpu;
rs6000_cpu = TARGET_POWERPC64 ? PROCESSOR_DEFAULT64 : PROCESSOR_DEFAULT;
@@ -766,17 +765,7 @@ rs6000_override_options (const char *def
/* If we are optimizing big endian systems for space, use the load/store
multiple and string instructions. */
if (BYTES_BIG_ENDIAN && optimize_size)
- target_flags |= MASK_MULTIPLE | MASK_STRING;
-
- /* If -mmultiple or -mno-multiple was explicitly used, don't
- override with the processor default */
- if ((target_flags_explicit & MASK_MULTIPLE) != 0)
- target_flags = (target_flags & ~MASK_MULTIPLE) | multiple;
-
- /* If -mstring or -mno-string was explicitly used, don't override
- with the processor default. */
- if ((target_flags_explicit & MASK_STRING) != 0)
- target_flags = (target_flags & ~MASK_STRING) | string;
+ target_flags |= ~target_flags_explicit & (MASK_MULTIPLE | MASK_STRING);
/* Don't allow -mmultiple or -mstring on little endian systems
unless the cpu is a 750, because the hardware doesn't support the
--
Alan Modra
IBM OzLabs - Linux Technology Centre