[gcc(refs/vendors/ibm/heads/mmaplus-new)] MMA+: Add support for dmr disassemble builtins
kishan parmar
kishan@gcc.gnu.org
Tue Apr 28 18:13:33 GMT 2026
https://gcc.gnu.org/g:73c2534d50c082f20aac4f0d3728f0f3e7faf897
commit 73c2534d50c082f20aac4f0d3728f0f3e7faf897
Author: Surya Kumari Jangala <jskumari@linux.ibm.com>
Date: Mon Jul 14 07:05:58 2025 -0500
MMA+: Add support for dmr disassemble builtins
Add support for __builtin_mma_dmr_extract512 and
__builtin_mma_disassemble_dmr.
Diff:
---
gcc/ChangeLog.mmaplus-new | 17 +++++
gcc/config/rs6000/mma.md | 1 +
gcc/config/rs6000/rs6000-builtin.cc | 73 +++++++++++++++++++++-
gcc/config/rs6000/rs6000-builtins.def | 9 +++
.../gcc.target/powerpc/dmf-disassemble-dmr.c | 22 +++++++
gcc/testsuite/gcc.target/powerpc/dmf-extract512.c | 18 ++++++
6 files changed, 138 insertions(+), 2 deletions(-)
diff --git a/gcc/ChangeLog.mmaplus-new b/gcc/ChangeLog.mmaplus-new
index e40a1da9f310..e5212d1e7467 100644
--- a/gcc/ChangeLog.mmaplus-new
+++ b/gcc/ChangeLog.mmaplus-new
@@ -1,4 +1,21 @@
+MMA+: Add support for dmr disassemble builtins
+
+Add support for __builtin_mma_dmr_extract512 and
+__builtin_mma_disassemble_dmr.
+----------------
+
+
+--------------
+
+Author: Surya Kumari Jangala <jskumari@linux.ibm.com>
+Date: Mon Jul 14 07:05:58 2025 -0500
+
+ MMA+: Add support for dmr disassemble builtins
+
+ Add support for __builtin_mma_dmr_extract512 and
+ __builtin_mma_disassemble_dmr.
+
----------------
Author: Peter Bergner <bergner@linux.ibm.com>
diff --git a/gcc/config/rs6000/mma.md b/gcc/config/rs6000/mma.md
index 8cf91ab117fc..efa47a0c897a 100644
--- a/gcc/config/rs6000/mma.md
+++ b/gcc/config/rs6000/mma.md
@@ -98,6 +98,7 @@
UNSPEC_DM_EXTRACT512
UNSPEC_DM_RELOAD_FROM_MEMORY
UNSPEC_DM_RELOAD_TO_MEMORY
+ UNSPEC_DM_EXTRACT1024
UNSPEC_DMF_DMXOR
UNSPEC_DMF_DMXVI8GERX4
UNSPEC_DMF_DMXVI8GERX4PP
diff --git a/gcc/config/rs6000/rs6000-builtin.cc b/gcc/config/rs6000/rs6000-builtin.cc
index 8e10bf9c3de1..46e154966139 100644
--- a/gcc/config/rs6000/rs6000-builtin.cc
+++ b/gcc/config/rs6000/rs6000-builtin.cc
@@ -1092,11 +1092,12 @@ rs6000_gimple_fold_mma_builtin (gimple_stmt_iterator *gsi,
/* Each call that can be gimple-expanded has an associated built-in
function that it will expand into. If this one doesn't, we have
- already expanded it! Exceptions: lxvp and stxvp. */
+ already expanded it! Exceptions: lxvp, stxvp and disassemble_dmr. */
if (rs6000_builtin_info[fncode].assoc_bif == RS6000_BIF_NONE
&& fncode != RS6000_BIF_LXVP
&& fncode != RS6000_BIF_STXVP
- && fncode != RS6000_BIF_DMMR)
+ && fncode != RS6000_BIF_DMMR
+ && fncode != RS6000_BIF_DISASSEMBLE_DMR)
return false;
bifdata *bd = &rs6000_builtin_info[fncode];
@@ -1104,6 +1105,74 @@ rs6000_gimple_fold_mma_builtin (gimple_stmt_iterator *gsi,
gimple *new_call;
tree new_decl;
+ if (fncode == RS6000_BIF_DM_EXTRACT512
+ || fncode == RS6000_BIF_DISASSEMBLE_DMR)
+ {
+ unsigned num_extract512;
+ push_gimplify_context (true);
+ tree dst_ptr = gimple_call_arg (stmt, 0);
+ tree src_ptr = gimple_call_arg (stmt, 1);
+ tree src_type = build_pointer_type (dmr_type_node);
+
+ if (TREE_TYPE (src_ptr) != src_type)
+ src_ptr = build1 (NOP_EXPR, src_type, src_ptr);
+
+ // the following code will ensure we are sending *src as parameter
+ tree src = create_tmp_reg_or_ssa_name (TREE_TYPE (src_type));
+ gimplify_assign (src, build_simple_mem_ref (src_ptr), &new_seq);
+
+ // now we should call the internal builtin RS6000_BIF_DM_EXTRACT512_INTERNAL
+ if (fncode == RS6000_BIF_DISASSEMBLE_DMR)
+ num_extract512 = 2;
+ else
+ num_extract512 = 1;
+
+ tree extract_decl = rs6000_builtin_decls[RS6000_BIF_DM_EXTRACT512_INTERNAL];
+
+ for (unsigned i = 0; i < num_extract512; i++)
+ {
+ tree const_arg;
+ if (fncode == RS6000_BIF_DISASSEMBLE_DMR)
+ const_arg = build_int_cstu (uint16_type_node, i);
+ else
+ const_arg = gimple_call_arg (stmt, 2);
+
+ // create call
+ new_call = gimple_build_call (extract_decl, 2, src, const_arg);
+ // create a tmp reg to denote lhs of call
+ tree lhs = create_tmp_reg_or_ssa_name (vector_quad_type_node);
+
+ // lhs = new_call
+ gimple_call_set_lhs (new_call, lhs);
+
+ // add gimple stmt to gimple sequence
+ gimple_seq_add_stmt (&new_seq, new_call);
+
+ // Now lhs contains the 512-bit value in vector_quad. We have to now
+ // split up the vector_quad into individual vectors
+
+ new_decl = rs6000_builtin_decls[RS6000_BIF_DISASSEMBLE_ACC_INTERNAL];
+ tree dst_type = build_pointer_type_for_mode (unsigned_V16QI_type_node,
+ ptr_mode, true);
+
+ tree dst_base = build1 (NOP_EXPR, dst_type, dst_ptr);
+ for (unsigned j = 0; j < 4; j++)
+ {
+ tree dst = build2 (MEM_REF, unsigned_V16QI_type_node, dst_base,
+ build_int_cst (dst_type, j * 16 + i * 64));
+ tree dstssa = create_tmp_reg_or_ssa_name (unsigned_V16QI_type_node);
+ new_call = gimple_build_call (new_decl, 2, lhs,
+ build_int_cstu (uint16_type_node, j));
+ gimple_call_set_lhs (new_call, dstssa);
+ gimple_seq_add_stmt (&new_seq, new_call);
+ gimplify_assign (dst, dstssa, &new_seq);
+ }
+ }
+ pop_gimplify_context (NULL);
+ gsi_replace_with_seq (gsi, new_seq, true);
+ return true;
+ }
+
/* Compatibility built-ins; we used to call these
__builtin_mma_{dis,}assemble_pair, but now we call them
__builtin_vsx_{dis,}assemble_pair. Handle the old versions. */
diff --git a/gcc/config/rs6000/rs6000-builtins.def b/gcc/config/rs6000/rs6000-builtins.def
index 3cb12b678522..f04131878dd4 100644
--- a/gcc/config/rs6000/rs6000-builtins.def
+++ b/gcc/config/rs6000/rs6000-builtins.def
@@ -3934,6 +3934,12 @@
dm1024 __builtin_mma_dmsetdmrz_internal ();
DMSETDMRZ_INTERNAL mma_dmsetdmrz {dm}
+ void __builtin_mma_dmr_extract512 (void *, dm1024 *, const int<2>);
+ DM_EXTRACT512 nothing {dm,dmint}
+
+ v512 __builtin_mma_dmr_extract512_internal (dm1024, const int<2>);
+ DM_EXTRACT512_INTERNAL movtdo_extract512 {dm}
+
void __builtin_mma_dmmr (dm1024 *, dm1024 *);
DMMR nothing {dm,dmint}
@@ -3952,6 +3958,9 @@
dm1024 __builtin_mma_build_dmr_internal (vuc, vuc, vuc, vuc, vuc, vuc, vuc, vuc);
BUILD_DMR_INTERNAL mma_build_dmr {dm}
+ void __builtin_mma_disassemble_dmr (void *, dm1024 *);
+ DISASSEMBLE_DMR nothing {dm}
+
void __builtin_mma_dmxvi8gerx4 (dm1024 *, v256, vuc);
DMXVI8GERX4 nothing {dm,dmint}
diff --git a/gcc/testsuite/gcc.target/powerpc/dmf-disassemble-dmr.c b/gcc/testsuite/gcc.target/powerpc/dmf-disassemble-dmr.c
new file mode 100644
index 000000000000..b1406ec380e1
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/dmf-disassemble-dmr.c
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-mdejagnu-cpu=future -O2" } */
+
+typedef unsigned char vec_t __attribute__((vector_size(16)));
+
+void
+bar (vec_t *dst, __dmr *src)
+{
+ vec_t res[8];
+ __builtin_mma_disassemble_dmr (res, src);
+ dst[0] = res[0];
+ dst[2] = res[1];
+ dst[4] = res[2];
+ dst[6] = res[3];
+ dst[8] = res[4];
+ dst[10] = res[5];
+ dst[12] = res[6];
+ dst[14] = res[7];
+}
+
+/* { dg-final { scan-assembler-times {\mdmxxextfdmr512\M} 2 } } */
+/* { dg-final { scan-assembler-times {\mstxv\M} 8 } } */
diff --git a/gcc/testsuite/gcc.target/powerpc/dmf-extract512.c b/gcc/testsuite/gcc.target/powerpc/dmf-extract512.c
new file mode 100644
index 000000000000..35c1cfaff509
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/dmf-extract512.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-mdejagnu-cpu=future -O2" } */
+
+typedef unsigned char vec_t __attribute__((vector_size(16)));
+
+void
+bar (vec_t *dst, __dmr *src)
+{
+ vec_t res[4];
+ __builtin_mma_dmr_extract512 (res, src);
+ dst[0] = res[0];
+ dst[2] = res[1];
+ dst[4] = res[2];
+ dst[6] = res[3];
+}
+
+/* { dg-final { scan-assembler-times {\mdmxxextfdmr512\M} 1 } } */
+/* { dg-final { scan-assembler-times {\mstxv\M} 4 } } */
More information about the Gcc-cvs
mailing list