Okay, I finally made it. Here is my list of gcc for powerpcspe: - no_fpr_in_libgcc.diff It does not really harm by including them since nobody should use them but gas does not wont to assmebly hard float since they are not available on this cpu. Upstream did respond. - powerpc_remove_many.diff this helps to to detect opcodes which are not part of the current CPU because without -many gas won't touch them. This currently could break the kernel build as the 603 on steroids cpus use performance counter opcodes which are not available on the steroid less 603 core.
- pr44364.diff This patch made it into trunk. I don't get it into the 4.4 branch because I can't prove that it is a regression since 4.3. If you worry about caller-save.c changes I could ifdef __SPE__ them. I dropped pr44606 because I saw it in svn-updates.diff as of the -12 release. I also dropped the lwsync & eieio patches because this nightmare is allready addressed in gas. Sebastian
Index: gcc-4.4.5/src/gcc/config/rs6000/crtresfpr.asm =================================================================== --- gcc-4.4.5.orig/src/gcc/config/rs6000/crtresfpr.asm 2011-02-13 17:25:36.000000000 +0100 +++ gcc-4.4.5/src/gcc/config/rs6000/crtresfpr.asm 2011-02-13 17:26:14.000000000 +0100 @@ -33,6 +33,7 @@ /* On PowerPC64 Linux, these functions are provided by the linker. */ #ifndef __powerpc64__ +#ifndef __NO_FPRS__ /* Routines for restoring floating point registers, called by the compiler. */ /* Called with r11 pointing to the stack header word of the caller of the */ @@ -77,3 +78,4 @@ FUNC_END(_restfpr_14) #endif +#endif Index: gcc-4.4.5/src/gcc/config/rs6000/crtresxfpr.asm =================================================================== --- gcc-4.4.5.orig/src/gcc/config/rs6000/crtresxfpr.asm 2011-02-13 17:25:36.000000000 +0100 +++ gcc-4.4.5/src/gcc/config/rs6000/crtresxfpr.asm 2011-02-13 17:26:29.000000000 +0100 @@ -33,6 +33,7 @@ /* On PowerPC64 Linux, these functions are provided by the linker. */ #ifndef __powerpc64__ +#ifndef __NO_FPRS__ /* Routines for restoring floating point registers, called by the compiler. */ /* Called with r11 pointing to the stack header word of the caller of the */ @@ -82,3 +83,4 @@ FUNC_END(_restfpr_14_x) #endif +#endif Index: gcc-4.4.5/src/gcc/config/rs6000/crtsavfpr.asm =================================================================== --- gcc-4.4.5.orig/src/gcc/config/rs6000/crtsavfpr.asm 2011-02-13 17:25:36.000000000 +0100 +++ gcc-4.4.5/src/gcc/config/rs6000/crtsavfpr.asm 2011-02-13 17:26:42.000000000 +0100 @@ -33,6 +33,7 @@ /* On PowerPC64 Linux, these functions are provided by the linker. */ #ifndef __powerpc64__ +#ifndef __NO_FPRS__ /* Routines for saving floating point registers, called by the compiler. */ /* Called with r11 pointing to the stack header word of the caller of the */ @@ -77,3 +78,4 @@ FUNC_END(_savefpr_14) #endif +#endif
Subject: [PATCH] remove -many on __SPE__ target Signed-off-by: Sebastian Andrzej Siewior <sebast...@breakpoint.cc> --- Index: gcc-4.4.5/src/gcc/config/rs6000/rs6000.h =================================================================== --- gcc-4.4.5.orig/src/gcc/config/rs6000/rs6000.h 2009-04-10 01:23:07.000000000 +0200 +++ gcc-4.4.5/src/gcc/config/rs6000/rs6000.h 2011-02-13 17:57:17.000000000 +0100 @@ -83,6 +83,12 @@ #define ASM_CPU_POWER7_SPEC "-mpower4 -maltivec" #endif +#ifndef __SPE__ +#define ASM_CPU_SPU_MANY_NOT_SPE "-many" +#else +#define ASM_CPU_SPU_MANY_NOT_SPE +#endif + /* Common ASM definitions used by ASM_SPEC among the various targets for handling -mcpu=xxx switches. */ #define ASM_CPU_SPEC \ @@ -147,7 +153,8 @@ %{mcpu=e300c3: -me300} \ %{mcpu=e500mc: -me500mc} \ %{maltivec: -maltivec} \ --many" +" \ +ASM_CPU_SPU_MANY_NOT_SPE #define CPP_DEFAULT_SPEC ""
Index: gcc/caller-save.c =================================================================== --- a/src/gcc/caller-save.c (revision 160245) +++ b/src/gcc/caller-save.c (working copy) @@ -1080,7 +1080,7 @@ insert_restore (struct insn_chain *chain /* Check that insn to restore REGNO in save_mode[regno] is correct. */ && reg_save_code (regno, save_mode[regno]) >= 0) - mem = adjust_address (mem, save_mode[regno], 0); + mem = adjust_address_nv (mem, save_mode[regno], 0); else mem = copy_rtx (mem); @@ -1161,7 +1161,7 @@ insert_save (struct insn_chain *chain, i /* Check that insn to save REGNO in save_mode[regno] is correct. */ && reg_save_code (regno, save_mode[regno]) >= 0) - mem = adjust_address (mem, save_mode[regno], 0); + mem = adjust_address_nv (mem, save_mode[regno], 0); else mem = copy_rtx (mem); Index: gcc/config/rs6000/e500.h =================================================================== --- a/src/gcc/config/rs6000/e500.h (revision 160245) +++ b/src/gcc/config/rs6000/e500.h (working copy) @@ -43,3 +43,10 @@ error ("E500 and FPRs not supported"); \ } \ } while (0) + +/* When setting up caller-save slots (MODE == VOIDmode) ensure we + allocate space for DFmode. Save gprs in the correct mode too. */ +#define HARD_REGNO_CALLER_SAVE_MODE(REGNO, NREGS, MODE) \ + (TARGET_E500_DOUBLE && ((MODE) == VOIDmode || (MODE) == DFmode) \ + ? DFmode \ + : choose_hard_reg_mode ((REGNO), (NREGS), false))