[gcc(refs/users/meissner/heads/work152)] PR target/112886, Add %S<n> to print_operand
Michael Meissner
meissner@gcc.gnu.org
Thu Jan 4 19:03:26 GMT 2024
https://gcc.gnu.org/g:06a750b9af37c5dc717c36179a2f3eeddcca8281
commit 06a750b9af37c5dc717c36179a2f3eeddcca8281
Author: Michael Meissner <meissner@linux.ibm.com>
Date: Thu Jan 4 14:02:58 2024 -0500
PR target/112886, Add %S<n> to print_operand
2024-01-04 Michael Meissner <meissner@linux.ibm.com>
gcc/
PR target/112886
* config/rs6000/rs6000.cc (print_operand): Add %S<n> output modifier.
* doc/md.texi (Modifiers): Mention %S can be used like %x.
gcc/testsuite/
PR target/112886
* /gcc.target/powerpc/pr112886.c: New test.
Diff:
---
gcc/config/rs6000/rs6000.cc | 10 +++++++---
gcc/doc/md.texi | 5 +++--
gcc/testsuite/gcc.target/powerpc/pr112886.c | 19 +++++++++++++++++++
3 files changed, 29 insertions(+), 5 deletions(-)
diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc
index 5a7e00b03d1..ba89377c9ec 100644
--- a/gcc/config/rs6000/rs6000.cc
+++ b/gcc/config/rs6000/rs6000.cc
@@ -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);
diff --git a/gcc/doc/md.texi b/gcc/doc/md.texi
index 47a87d6ceec..53ec957cb23 100644
--- a/gcc/doc/md.texi
+++ b/gcc/doc/md.texi
@@ -3386,8 +3386,9 @@ A VSX register (VSR), @code{vs0}@dots{}@code{vs63}. This is either an
FPR (@code{vs0}@dots{}@code{vs31} are @code{f0}@dots{}@code{f31}) or a VR
(@code{vs32}@dots{}@code{vs63} are @code{v0}@dots{}@code{v31}).
-When using @code{wa}, you should use the @code{%x} output modifier, so that
-the correct register number is printed. For example:
+When using @code{wa}, you should use either the @code{%x} or @code{%S}
+output modifier, so that the correct register number is printed. For
+example:
@smallexample
asm ("xvadddp %x0,%x1,%x2"
diff --git a/gcc/testsuite/gcc.target/powerpc/pr112886.c b/gcc/testsuite/gcc.target/powerpc/pr112886.c
new file mode 100644
index 00000000000..07196bdc220
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/pr112886.c
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target power10_ok } */
+/* { dg-options "-mdejagnu-cpu=power10 -O2" } */
+
+/* PR target/112886: Test that print_operand %S<n> gives the correct register
+ number for VSX registers (i.e. if the register is an Altivec register, the
+ register number is 32..63 instead of 0..31. */
+
+void
+test (__vector_pair *p, __vector_pair *q, __vector_pair *r)
+{
+ __asm__ ("xvadddp %x0,%x1,%x2\n\txvadddp %S0,%S1,%S2"
+ : "=v" (*p)
+ : "v" (*q), "v" (*r));
+}
+
+/* { 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 } } */
+/* { dg-final { scan-assembler-times {\mlxvp\M} 2 } } */
+/* { dg-final { scan-assembler-times {\mstxvp\M} 1 } } */
More information about the Gcc-cvs
mailing list