On Sat, Apr 21, 2012 at 2:48 AM, Alan Modra <amo...@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