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];