On Fri, Feb 14, 2014 at 4:19 PM, Kai Tietz <ktiet...@googlemail.com> wrote:
> Adjusted my original testcase so that eax isn't redeclared and > shadows. Additional moved > initialization of eax_live up. > ChangeLog > > 2014-02-14 Kai Tietz <kti...@redhat.com> > > PR target/60193 > * config/i386/i386.c (ix86_expand_prologue): Use > rax register as displacement for restoring %r10, %rax. > Additional fix wrong offset for restoring both-registers. > > ChangeLog testsuite > > 2014-02-14 Kai Tietz <kti...@redhat.com> > > PR target/60193 > * gcc.target/i386/nest-1.c: New testcase. > > Regression-tested for x86_64-unknown-linux-gnu, and > x86_64-w64-mingw32, and i686-w64-mingw32. Ok for apply? > > Regards, > Kai > > Index: i386.c > =================================================================== > --- i386.c (Revision 207686) > +++ i386.c (Arbeitskopie) > @@ -11023,13 +11023,12 @@ ix86_expand_prologue (void) > rtx r10 = NULL; > rtx (*adjust_stack_insn)(rtx, rtx, rtx); > const bool sp_is_cfa_reg = (m->fs.cfa_reg == stack_pointer_rtx); > - bool eax_live = false; > + bool eax_live = ix86_eax_live_at_start_p (); > bool r10_live = false; > > if (TARGET_64BIT) > r10_live = (DECL_STATIC_CHAIN (current_function_decl) != 0); > > - eax_live = ix86_eax_live_at_start_p (); > if (eax_live) > { > insn = emit_insn (gen_push (eax)); > @@ -11084,17 +11083,20 @@ ix86_expand_prologue (void) > works for realigned stack, too. */ > if (r10_live && eax_live) > { > - t = plus_constant (Pmode, stack_pointer_rtx, allocate); > + t = gen_rtx_PLUS (Pmode, stack_pointer_rtx, eax); > emit_move_insn (gen_rtx_REG (word_mode, R10_REG), > gen_frame_mem (word_mode, t)); > - t = plus_constant (Pmode, stack_pointer_rtx, > - allocate - UNITS_PER_WORD); > + > + t = plus_constant (Pmode, eax, UNITS_PER_WORD); > + emit_move_insn (eax, t); > + t = gen_rtx_PLUS (Pmode, stack_pointer_rtx, eax); only t = plus_constant (Pmode, t, UNITS_PER_WORD); is enough here. > emit_move_insn (gen_rtx_REG (word_mode, AX_REG), > gen_frame_mem (word_mode, t)); > } > else if (eax_live || r10_live) > { > - t = plus_constant (Pmode, stack_pointer_rtx, allocate); > + /* Don't exceed displacement-range for 64-bit. */ Stalled comment.