On 1/5/24 4:18 PM, Michael Meissner wrote:
> @@ -14504,13 +14504,17 @@ print_operand (FILE *file, rtx x, int code)
> print_operand (file, x, 0);
> return;
>
> + case 'S':
> case 'x':
> - /* X is a FPR or Altivec register used in a VSX context. */
> + /* X is a FPR or Altivec register used in a VSX context. %x<n> prints
> + the VSX register number, %S<n> prints the 2nd register number for
> + vector pair, decimal 128-bit floating and IBM 128-bit binary floating
> + values. */
> if (!REG_P (x) || !VSX_REGNO_P (REGNO (x)))
> - output_operand_lossage ("invalid %%x value");
> + output_operand_lossage ("invalid %%%c value", (code == 'S' ? 'S' :
> 'x'));
> else
> {
> - int reg = REGNO (x);
> + int reg = REGNO (x) + (code == 'S' ? 1 : 0);
> int vsx_reg = (FP_REGNO_P (reg)
> ? reg - 32
> : reg - FIRST_ALTIVEC_REGNO + 32);
The above looks good to me. However:
> + : "=v" (*p)
> + : "v" (*q), "v" (*r));
These really should use "wa" rather than "v", since these are
VSX instructions... or did you use those to ensure you got
Altivec registers numbers assigned?
> +/* { dg-final { scan-assembler-times {\mxvadddp
> (3[2-9]|[45][0-9]|6[0-3]),(3[2-9]|[45][0-9]|6[0-3]),(3[2-9]|[45][0-9]|6[0-3])\M}
> 2 } } */
...and this is really ugly and hard to read/understand. Can't we use
register variables to make it simpler? Something like the following
which tests having both FPR and Altivec reg numbers assigned?
...
void
test (__vector_pair *ptr)
{
register __vector_pair p asm ("vs10");
register __vector_pair q asm ("vs42");
register __vector_pair r asm ("vs44");
q = ptr[1];
r = ptr[2];
__asm__ ("xvadddp %x0,%x1,%x2\n\txvadddp %S0,%S1,%S2"
: "=wa" (p)
: "wa" (q), "wa" (r));
ptr[2] = p;
}
/* { dg-final { scan-assembler-times {\mxvadddp 10,42,44\M} 1 } } */
/* { dg-final { scan-assembler-times {\mxvadddp 11,43,45\M} 1 } } */
...
Peter