> > @@ -7753,8 +7762,12 @@ pro_epilogue_adjust_stack (rtx dest, rtx src,
> > rtx
> offset,
> >         add_frame_related_expr = true;
> >      }
> >
> > +  if (crtl->shrink_wrapped_separate)  insn = emit_insn (gen_rtx_SET
 > > + (dest, gen_rtx_PLUS (Pmode, src, addend)));
 >
 > Please use ix86_expand_binary_operator here, it will correctly
 > generate LEA during pro/epilogue generation. Also, please check indenting.
 >
Hi Uros, 

I'm confused here,  ix86_expand_binary_operator cannot return insn, and insn 
needs to be used later. Another thing is in ix86_expand_binary_operator,  if 
!rtx_equal_p (dst, src1), it will generate clobber for it.

Our case is:
DEST = %rsp;
SRC   = %rsp;
Addend = offset;

void
ix86_expand_binary_operator (enum rtx_code code, machine_mode mode,
                             rtx operands[], bool use_ndd)
{
  rtx src1, src2, dst, op, clob;

  dst = ix86_fixup_binary_operands (code, mode, operands, use_ndd);
  src1 = operands[1];
  src2 = operands[2];

 /* Emit the instruction.  */

  op = gen_rtx_SET (dst, gen_rtx_fmt_ee (code, mode, src1, src2));

  if (reload_completed
      && code == PLUS
      && !rtx_equal_p (dst, src1)
      && !use_ndd)
    {
      /* This is going to be an LEA; avoid splitting it later.  */
      emit_insn (op);
    }
  else
    {
      clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
      emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, op, clob)));
    }

  /* Fix up the destination if needed.  */
  if (dst != operands[0])
    emit_move_insn (operands[0], dst);
}

Thanks,
Lili.

Reply via email to