On Wed, Dec 19, 2018 at 01:53:05PM -0600, Aaron Sawdey wrote:
> Because of POWER9 dd2.1 issues with certain unaligned vsx instructions
> to cache inhibited memory, here is a patch that keeps memmove (and memcpy)
> inline expansion from doing unaligned vector or using vector load/store
> other than lvx/stvx. More description of the issue is here:
> 
> https://patchwork.ozlabs.org/patch/814059/
> 
> OK for trunk if bootstrap/regtest ok?

Okay, but see below.

> 2018-12-19  Aaron Sawdey  <acsaw...@linux.ibm.com>
> 
>       * config/rs6000/rs6000-string.c (expand_block_move): Don't use
>       unaligned vsx and avoid lxvd2x/stxvd2x.
>       (gen_lvx_v4si_move): New function.

> +static rtx
> +gen_lvx_v4si_move (rtx dest, rtx src)
> +{
> +  rtx rv = NULL;
> +  if (MEM_P (dest))
> +    {
> +      gcc_assert (!MEM_P (src));
> +      gcc_assert (GET_MODE (src) == V4SImode);
> +      rv = gen_altivec_stvx_v4si_internal (dest, src);
> +    }
> +  else if (MEM_P (src))
> +    {
> +      gcc_assert (!MEM_P (dest));
> +      gcc_assert (GET_MODE (dest) == V4SImode);
> +      rv = gen_altivec_lvx_v4si_internal (dest, src);
> +    }
> +  else
> +    gcc_unreachable ();
> +
> +  return rv;
> +}

This is extraordinarily clumsy :-)  Maybe something like:

static rtx
gen_lvx_v4si_move (rtx dest, rtx src)
{
  gcc_assert (!(MEM_P (dest) && MEM_P (src));
  gcc_assert (GET_MODE (dest) == V4SImode && GET_MODE (src) == V4SImode);
  if (MEM_P (dest))
    return gen_altivec_stvx_v4si_internal (dest, src);
  else if (MEM_P (src))
    return gen_altivec_lvx_v4si_internal (dest, src);
  else
    gcc_unreachable ();
}

(Or do you allow VOIDmode for src as well?)  Anyway, at least get rid of
the useless extra variable.

Thanks!


Segher

Reply via email to