On Mon, Oct 17, 2016 at 12:38:36PM +0000, Wilco Dijkstra wrote:
> 
> ping
> 
> 
> From: Wilco Dijkstra
> Sent: 10 August 2016 17:20
> To: Richard Earnshaw; GCC Patches
> Cc: nd
> Subject: Re: [PATCH][AArch64] Improve stack adjustment
>     
> Richard Earnshaw wrote:
> > I see you've added a default argument for your new parameter.  I think
> > doing that is fine, but I have two comments about how we might use that
> > in this case.
> > 
> > Firstly, if this parameter is suitable for having a default value, then
> > I think the preceding one should also be treated in the same way.
> > 
> > Secondly, I think (due to these parameters being BOOL with no useful
> > context to make it clear which is which) that having wrapper functions
> > (inlined, of course) that describe the intended behaviour more clearly
> > would be useful.  So, defining
> > 
> > static inline void
> > aarch64_add_frame_constant (mode, regnum, scratchreg, delta)
> > {
> >    aarch64_add_frame_constant (mode, regnum, scratchreg, delta, true);
> > }
> > 
> > would make it clearer at the call point than having a lot of true and
> > false parameters scattered round the code.
> > 
> > Alternatively we might remove all the default parameters and require
> > wrappers like the above to make it more explicit which API is intended -
> > this might make more sense if not all combinations make sense.
> 
> OK here is the new version using simple wrapper functions and no
> default parameters:

I've got a simple suggestion for one of your comments, and I'd like
clarification on something I'm not understanding...

> gcc/
>         * config/aarch64/aarch64.c (aarch64_add_constant_internal):
>         Add extra argument to allow emitting the move immediate.
>         Use add/sub with positive immediate.
>         (aarch64_add_constant): Add inline function.
>         (aarch64_add_sp): Likewise.
>         (aarch64_sub_sp): Likewise.
>         (aarch64_expand_prologue): Call aarch64_sub_sp.
>         (aarch64_expand_epilogue): Call aarch64_add_sp.
>         Decide when to leave out move.
>         (aarch64_output_mi_thunk): Call aarch64_add_constant.
> @@ -1967,11 +1973,11 @@ aarch64_add_constant (machine_mode mode, int regnum, 
> int scratchreg,
>        return;
>      }
>  
> -  /* We need two add/sub instructions, each one performing part of the
> -     calculation.  Don't do this if the addend can be loaded into register 
> with
> -     a single instruction, in that case we prefer a move to a scratch 
> register
> -     following by an addition.  */
> -  if (mdelta < 0x1000000 && !aarch64_move_imm (delta, mode))
> +  /* We need two add/sub instructions, each one perform part of the
> +     addition/subtraction, but don't this if the addend can be loaded into
> +     register by single instruction, in that case we prefer a move to scratch
> +     register following by addition.  */

This sentence is missing some words.

> +  if (mdelta < 0x1000000 && !aarch64_move_imm (mdelta, mode))

Could you explain this change? The comment makes it seem like delta would
still be correct. Probably the comment needs to say "followed by
addition/subtraction" rather than what is currently written?

>      {
>        HOST_WIDE_INT low_off = mdelta & 0xfff;
>  
> @@ -1985,8 +1991,10 @@ aarch64_add_constant (machine_mode mode, int regnum, 
> int scratchreg,
>  
>    /* Otherwise use generic function to handle all other situations.  */
>    rtx scratch_rtx = gen_rtx_REG (mode, scratchreg);
> -  aarch64_internal_mov_immediate (scratch_rtx, GEN_INT (delta), true, mode);
> -  insn = emit_insn (gen_add2_insn (this_rtx, scratch_rtx));
> +  if (emit_move_imm)
> +    aarch64_internal_mov_immediate (scratch_rtx, GEN_INT (mdelta), true, 
> mode);
> +  insn = emit_insn (delta < 0 ? gen_sub2_insn (this_rtx, scratch_rtx)
> +                             : gen_add2_insn (this_rtx, scratch_rtx));

What is contained in scratch_rtx here if we didn't set it up with
aarch64_internal_move_immediate? Are you not adding junk values in the
!emit_move_imm case?

Thanks,
James

>    if (frame_related_p)
>      {
>        RTX_FRAME_RELATED_P (insn) = frame_related_p;

Reply via email to