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