This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Simplify pad_below implementation


On Mon, Aug 21, 2017 at 1:14 PM, Richard Sandiford
<richard.sandiford@linaro.org> wrote:
> This patch simplifies the alignment calculations in pad_below.
> The first arm of the "if" was:
>
> - taking GET_MODE_BITSIZE (always equal to GET_MODE_SIZE * BITS_PER_UNIT),
> - rounding up to the next multiple of PARM_BOUNDARY
> - converting bits to bytes and
> - subtracting the GET_MODE_SIZE
>
> so was in effect calculating the number of bytes needed to round
> GET_MODE_SIZE up to (PARM_BOUNDARY / BITS_PER_UNIT).  That can be
> done more directly as -size & (align - 1), which is easier to
> convert to variable-sized modes.
>
> Tested on aarch64-linux-gnu and x86_64-linux-gnu, and by building
> one target per CPU and checking that there were no differences in
> assembly for the testsuite.  OK to install?

Ok.

Richard.

> Richard
>
>
> 2017-08-21  Richard Sandiford  <richard.sandiford@linaro.org>
>             Alan Hayward  <alan.hayward@arm.com>
>             David Sherwood  <david.sherwood@arm.com>
>
> gcc/
>         * function.c (pad_below): Simplify padding calculation.
>
> Index: gcc/function.c
> ===================================================================
> --- gcc/function.c      2017-08-21 10:42:34.185530464 +0100
> +++ gcc/function.c      2017-08-21 11:55:41.018148268 +0100
> @@ -4322,21 +4322,16 @@ pad_to_arg_alignment (struct args_size *
>  static void
>  pad_below (struct args_size *offset_ptr, machine_mode passed_mode, tree sizetree)
>  {
> +  unsigned int align = PARM_BOUNDARY / BITS_PER_UNIT;
>    if (passed_mode != BLKmode)
> -    {
> -      if (GET_MODE_BITSIZE (passed_mode) % PARM_BOUNDARY)
> -       offset_ptr->constant
> -         += (((GET_MODE_BITSIZE (passed_mode) + PARM_BOUNDARY - 1)
> -              / PARM_BOUNDARY * PARM_BOUNDARY / BITS_PER_UNIT)
> -             - GET_MODE_SIZE (passed_mode));
> -    }
> +    offset_ptr->constant += -GET_MODE_SIZE (passed_mode) & (align - 1);
>    else
>      {
>        if (TREE_CODE (sizetree) != INTEGER_CST
> -         || (TREE_INT_CST_LOW (sizetree) * BITS_PER_UNIT) % PARM_BOUNDARY)
> +         || (TREE_INT_CST_LOW (sizetree) & (align - 1)) != 0)
>         {
>           /* Round the size up to multiple of PARM_BOUNDARY bits.  */
> -         tree s2 = round_up (sizetree, PARM_BOUNDARY / BITS_PER_UNIT);
> +         tree s2 = round_up (sizetree, align);
>           /* Add it in.  */
>           ADD_PARM_SIZE (*offset_ptr, s2);
>           SUB_PARM_SIZE (*offset_ptr, sizetree);


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]