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
> trunk?

> 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
>        word_mode.
>        (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
>        word_mode.
>        (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.


Reply via email to