On Tue, Mar 6, 2012 at 10:46 PM, H.J. Lu <hongjiu...@intel.com> wrote:
> push/pop in x86 only works on word_mode registers. This patch properly
> handles push/pop on registers in x86. Tested on Linux/x86-64. OK for
> 2012-03-06 H.J. Lu <hongjiu...@intel.com>
> * config/i386/i386.c (setup_incoming_varargs_64): Use word_mode
> with integer parameters in registers.
> (gen_push): Push register in word_mode instead of Pmode.
> (ix86_emit_save_regs): Likewise.
> (ix86_emit_save_regs_using_mov): Save integer registers in
> (gen_pop): Pop register in word_mode instead of Pmode.
> (ix86_emit_restore_regs_using_pop): Likewise.
> (ix86_expand_prologue): Replace Pmode with word_mode for push
> immediate. Use ix86_gen_pro_epilogue_adjust_stack. Save and
> restore RAX and R10 in word_mode.
> (ix86_emit_restore_regs_using_mov): Restore integer registers
> in word_mode.
> (ix86_expand_split_stack_prologue): Save R10_REG and restore in
> (ix86_split_to_parts): Use word_mode with PUT_MODE for push.
> (ix86_split_long_move): Likewise.
> * config/i386/i386.md (W): New.
> (*push<mode>2_prologue): Replace :P with :W.
> (*pop<mode>1): Likewise.
> (*pop<mode>1_epilogue): Likewise.
> (push/pop peephole2): Use word_mode scratch registers.
The patch looks good to me. Based on the comment by Ian, I feel
confident that prologue/epilogue changes are OK, too. But I didn't
re-check all and every mode change here (since I can't test these
changes by myself), so please double check them. Admittely, the patch
doesn't break any x86 target.
So, OK for mainline.