On Wed, Jan 12, 2022 at 8:56 PM Kewen.Lin <li...@linux.ibm.com> wrote:
>
> Hi,
>
> This patch is to clean up some codes with GET_MODE_UNIT_SIZE or
> GET_MODE_NUNITS, which can use known constant instead.

I'll let Segher decide, but often the additional code is useful
self-documentation instead of magic constants.  Or at least the change
requires comments documenting the derivation of the constants
currently described by the code itself.

Thanks, David

>
> Bootstrapped and regtested on powerpc64le-linux-gnu P9 and
> powerpc64-linux-gnu P8.
>
> Is it ok for trunk?
>
> BR,
> Kewen
> -----
> gcc/ChangeLog:
>
>         * config/rs6000/altivec.md (altivec_vreveti2): Use known constant
>         values to simplify code.
>         * config/rs6000/vsx.md (*vsx_extract_si, 
> *vsx_extract_si_<uns>float_df,
>         *vsx_extract_si_<uns>float_<mode>, *vsx_insert_extract_v4sf_p9):
>         Likewise.
> ---
>  gcc/config/rs6000/altivec.md | 11 +++--------
>  gcc/config/rs6000/vsx.md     |  8 ++++----
>  2 files changed, 7 insertions(+), 12 deletions(-)
>
> diff --git a/gcc/config/rs6000/altivec.md b/gcc/config/rs6000/altivec.md
> index c2312cc1e0f..d5c4ecfa9b7 100644
> --- a/gcc/config/rs6000/altivec.md
> +++ b/gcc/config/rs6000/altivec.md
> @@ -3957,17 +3957,12 @@ (define_expand "altivec_vreveti2"
>                       UNSPEC_VREVEV))]
>    "TARGET_ALTIVEC"
>  {
> -  int i, j, size, num_elements;
> +  int i;
>    rtvec v = rtvec_alloc (16);
>    rtx mask = gen_reg_rtx (V16QImode);
>
> -  size = GET_MODE_UNIT_SIZE (TImode);
> -  num_elements = GET_MODE_NUNITS (TImode);
> -
> -  for (j = 0; j < num_elements; j++)
> -    for (i = 0; i < size; i++)
> -      RTVEC_ELT (v, i + j * size)
> -       = GEN_INT (i + (num_elements - 1 - j) * size);
> +  for (i = 0; i < 16; i++)
> +    RTVEC_ELT (v, i) = GEN_INT (i);
>
>    emit_insn (gen_vec_initv16qiqi (mask, gen_rtx_PARALLEL (V16QImode, v)));
>    emit_insn (gen_altivec_vperm_ti (operands[0], operands[1],
> diff --git a/gcc/config/rs6000/vsx.md b/gcc/config/rs6000/vsx.md
> index 802db0d112b..892b99c6d6b 100644
> --- a/gcc/config/rs6000/vsx.md
> +++ b/gcc/config/rs6000/vsx.md
> @@ -3855,7 +3855,7 @@ (define_insn_and_split  "*vsx_extract_si"
>    int value;
>
>    if (!BYTES_BIG_ENDIAN)
> -    element = GEN_INT (GET_MODE_NUNITS (V4SImode) - 1 - INTVAL (element));
> +    element = GEN_INT (3 - INTVAL (element));
>
>    /* If the value is in the correct position, we can avoid doing the VSPLT<x>
>       instruction.  */
> @@ -4231,7 +4231,7 @@ (define_insn_and_split "*vsx_extract_si_<uns>float_df"
>    int value;
>
>    if (!BYTES_BIG_ENDIAN)
> -    element = GEN_INT (GET_MODE_NUNITS (V4SImode) - 1 - INTVAL (element));
> +    element = GEN_INT (3 - INTVAL (element));
>
>    /* If the value is in the correct position, we can avoid doing the VSPLT<x>
>       instruction.  */
> @@ -4274,7 +4274,7 @@ (define_insn_and_split 
> "*vsx_extract_si_<uns>float_<mode>"
>    int value;
>
>    if (!BYTES_BIG_ENDIAN)
> -    element = GEN_INT (GET_MODE_NUNITS (V4SImode) - 1 - INTVAL (element));
> +    element = GEN_INT (3 - INTVAL (element));
>
>    /* If the value is in the correct position, we can avoid doing the VSPLT<x>
>       instruction.  */
> @@ -4467,7 +4467,7 @@ (define_insn "*vsx_insert_extract_v4sf_p9"
>    int ele = INTVAL (operands[4]);
>
>    if (!BYTES_BIG_ENDIAN)
> -    ele = GET_MODE_NUNITS (V4SFmode) - 1 - ele;
> +    ele = 3 - ele;
>
>    operands[4] = GEN_INT (GET_MODE_SIZE (SFmode) * ele);
>    return "xxinsertw %x0,%x2,%4";
> --
> 2.27.0
>

Reply via email to