This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: PowerPC prologue and epilogue 6


On Sat, Apr 21, 2012 at 2:48 AM, Alan Modra <amodra@gmail.com> wrote:
> This patch adds out-of-line vector saves and restores. ?To do this I
> made some infrastructure changes to various functions like
> rs6000_emit_savres_rtx that currently take boolean parameters (savep,
> gpr, and lr). ?Rather than add yet another boolean to specify vector
> regs, I chose to lump them all together in a bitmask. ?This made the
> patch a little larger but overall is a better interface, I think.
>
> I also revert a change I made in
> http://gcc.gnu.org/ml/gcc-patches/2012-04/msg01014.html to always use
> r11 as a frame reg whenever abiv4 emits out-of-line saves. ?Code
> quality in functions with small frames is better without that
> particular change. ?This however meant some changes are required later
> when setting up pointer regs for gpr and fpr out-of-line saves.
>
> What else is here? ?Improved register selection when saving vrsave in
> the prologue and when restoring cr in the epilogue, allowing better
> scheduling. ?A fix to rs6000_output_function_prologue to output the
> correct .extern for ELF, then deciding we don't need such things
> anyway. ?And various other little code cleanups. ?Bootstrapped and
> regression tested powerpc-linux.
>
> gcc/
> ? ? ? ?* config/rs6000/rs6000 (SAVE_INLINE_VRS, REST_INLINE_VRS,
> ? ? ? ?V_SAVE_INLINE, SAVRES_LR, SAVRES_SAVE, SAVRES_REG,
> ? ? ? ?SAVRES_GPR, SAVRES_FPR, SAVRES_VR): Define.
> ? ? ? ?(no_global_regs_above): Delete.
> ? ? ? ?(no_global_regs): New function.
> ? ? ? ?(rs6000_savres_strategy): Handle vector regs. ?Use proper lr_save_p
> ? ? ? ?value for load multiple test.
> ? ? ? ?(savres_routine_syms): Increase size.
> ? ? ? ?(rs6000_savres_routine_name, rs6000_savres_routine_sym,
> ? ? ? ?ptr_regno_for_savres, rs6000_emit_savres_rtx): Pass in int selector
> ? ? ? ?rather than a number of boolean flags. ?Update all callers.
> ? ? ? ?(rs6000_savres_routine_name): Generate vector save/restore names.
> ? ? ? ?(rs6000_savres_routine_sym): Handle vector regs. ?Delete forward decl.
> ? ? ? ?(ptr_regno_for_savres, rs6000_emit_savres_rtx): Likewise.
> ? ? ? ?(rs6000_emit_prologue): Delete saving_FPRs_inline, saving_GPRs_inline
> ? ? ? ?and using_store_multiple. ?Expand uses. ?Don't always use r11 as
> ? ? ? ?frame reg when needed for out-of-line saves. ?Set up initial offset
> ? ? ? ?for out-of-line vector saves when buying stack frame. ?Handle pointer
> ? ? ? ?reg setup for out-of-line fp save. ?Emit call to out-of-line vector
> ? ? ? ?save function. ?Choose r11 or r12 for vrsave reg when available for
> ? ? ? ?better scheduling.
> ? ? ? ?(rs6000_output_function_prologue): Don't emit .extern for ELF.
> ? ? ? ?(rs6000_emit_epilogue): Choose a better frame reg when restoring
> ? ? ? ?from back-chain to suit out-of-line vector restore functions. ?Emit
> ? ? ? ?call to out-of-line vector restore function. ?Adjust register used
> ? ? ? ?for cr restore. ?Tweak pointer register setup for gpr restore.
> ? ? ? ?* config/rs6000/rs6000.h (FIRST_SAVED_GP_REGNO): Take into account
> ? ? ? ?FIXED_R13.
> ? ? ? ?* config/rs6000/sysv4.h (FP_SAVE_INLINE, GP_SAVE_INLINE): Simplify.
> ? ? ? ?(V_SAVE_INLINE): Define.
> ? ? ? ?* config/rs6000/altivec.md (save_vregs_*, restore_vregs_*): New insns.
> libgcc/
> ? ? ? ?* config/rs6000/crtsavevr.S: New file.
> ? ? ? ?* config/rs6000/crtrestvr.S: New file.
> ? ? ? ?* config/rs6000/t-savresfgpr: Build the above.
> ? ? ? ?* config/rs6000/t-netbsd: Likewise.

This patch is okay with the macro usage fix.

Thanks, David


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]