https://gcc.gnu.org/g:27af5a06e3202daba4b131a2c1450102cc8f8814

commit 27af5a06e3202daba4b131a2c1450102cc8f8814
Author: Surya Kumari Jangala <jskum...@linux.ibm.com>
Date:   Mon Jul 14 09:12:40 2025 -0500

    MMA+: __builtin_mma_build_dmr does not build DMR correctly
    
    The vectors are placed at incorrect locations in the DMR register.
    This patch ensures that the DMR is populated correctly.
    Also fix testcase dmf-extract512.c.

Diff:
---
 gcc/config/rs6000/mma.md                          |  8 ++++----
 gcc/testsuite/gcc.target/powerpc/dmf-build-dmr.c  | 13 +++++++++++++
 gcc/testsuite/gcc.target/powerpc/dmf-extract512.c |  2 +-
 3 files changed, 18 insertions(+), 5 deletions(-)

diff --git a/gcc/config/rs6000/mma.md b/gcc/config/rs6000/mma.md
index 6de45acd4175..a4ae785171ca 100644
--- a/gcc/config/rs6000/mma.md
+++ b/gcc/config/rs6000/mma.md
@@ -600,10 +600,10 @@
   rtx vp1 = gen_reg_rtx (OOmode);
   rtx vp2 = gen_reg_rtx (OOmode);
   rtx vp3 = gen_reg_rtx (OOmode);
-  emit_insn (gen_vsx_assemble_pair (vp0, operands[1], operands[2]));
-  emit_insn (gen_vsx_assemble_pair (vp1, operands[3], operands[4]));
-  emit_insn (gen_vsx_assemble_pair (vp2, operands[5], operands[6]));
-  emit_insn (gen_vsx_assemble_pair (vp3, operands[7], operands[8]));
+  emit_insn (gen_vsx_assemble_pair (vp0, operands[2], operands[1]));
+  emit_insn (gen_vsx_assemble_pair (vp1, operands[4], operands[3]));
+  emit_insn (gen_vsx_assemble_pair (vp2, operands[6], operands[5]));
+  emit_insn (gen_vsx_assemble_pair (vp3, operands[8], operands[7]));
   emit_insn (gen_dm_insert1024 (operands[0], vp0, vp1, vp2, vp3));
   DONE;
 })
diff --git a/gcc/testsuite/gcc.target/powerpc/dmf-build-dmr.c 
b/gcc/testsuite/gcc.target/powerpc/dmf-build-dmr.c
new file mode 100644
index 000000000000..a3f908efd432
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/dmf-build-dmr.c
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-mdejagnu-cpu=future -O2" } */
+
+typedef unsigned char vec_t __attribute__((vector_size(16)));
+
+void
+foo2 (__dmr *dst, vec_t *src)
+{
+  __builtin_mma_build_dmr (dst, src[0], src[1], src[2], src[3], src[4], 
src[5], src[6], src[7]);
+}
+
+/* { dg-final { scan-assembler-times {\mdmxxinstdmr512\M} 2 } } */
+/* { dg-final { scan-assembler-times {\mlxv\M} 8 } } */
diff --git a/gcc/testsuite/gcc.target/powerpc/dmf-extract512.c 
b/gcc/testsuite/gcc.target/powerpc/dmf-extract512.c
index 35c1cfaff509..17757898b579 100644
--- a/gcc/testsuite/gcc.target/powerpc/dmf-extract512.c
+++ b/gcc/testsuite/gcc.target/powerpc/dmf-extract512.c
@@ -7,7 +7,7 @@ void
 bar (vec_t *dst, __dmr *src)
 {
   vec_t res[4];
-  __builtin_mma_dmr_extract512 (res, src);
+  __builtin_mma_dmr_extract512 (res, src, 0);
   dst[0] = res[0];
   dst[2] = res[1];
   dst[4] = res[2];

Reply via email to