[gcc r16-9389] rs6000: Add Dense Math builtin infrastructure

jeevitha via Gcc-cvs <[email protected]>
Newsgroups gmane.comp.gcc.cvs
Message-ID <[email protected]>
https://gcc.gnu.org/g:fc5afddda114dd8cb7311fa5acc87719a8e1f76f

commit r16-9389-gfc5afddda114dd8cb7311fa5acc87719a8e1f76f
Author: Kishan Parmar <[email protected]>
Date:   Wed Jul 15 09:42:16 2026 +0530

    rs6000: Add Dense Math builtin infrastructure
    
    Add the initial infrastructure required to support Dense Math Facility
    (DMF) builtins.
    
    Extend the builtin generator with a new "dm" stanza, ENB_DM enable flag,
    DMR base type, and DM-specific builtin attributes used for Dense Math
    builtins.  Also add TARGET_DMF builtin enablement checks.
    
    These changes provide the foundation for subsequent Dense Math builtin
    support. The infrastructure is enabled only when TARGET_DMF is active
    (for example, via -mdense-math) and targets a future Power ISA that may
    or may not be be implemented in future Power processors and the builtin
    interfaces may change accordingly.
    
    2026-07-15  Peter Bergner  <[email protected]>
                Kishan Parmar  <[email protected]>
    
    gcc/ChangeLog
            * config/rs6000/rs6000-builtin.cc (rs6000_invalid_builtin): Add
            ENB_DM diagnostic.
            (rs6000_builtin_is_supported): Handle ENB_DM.
            * config/rs6000/rs6000-gen-builtins.cc: Update comments for new
            Dense Math builtin attributes.
            (bif_stanza): Add BSTZ_DM.
            (stanza_map): Add "dm" stanza.
            (enable_string): Add ENB_DM.
            (basetype): Add BT_DMR.
            (attrinfo): Add isdm, isdmint and isdmr fields.
            (type_map): Add dmr1024 and ptr_dmr1024 type mappings.
            (match_type): Recognize dmr1024 type.
            (parse_bif_attrs): Parse dm, dmint and dmr attributes.
            (complete_vector_type): Handle BT_DMR.
            (write_decls): Emit ENB_DM and Dense Math builtin attribute bits
            and predicates.
            (write_bif_static_init): Initialize Dense Math builtin attributes
            and associate dmint builtins with their internal variants.
    
    (cherry picked from commit 0bb7002b87e7454af0cb79d59ff76e6e31085efc)

Diff:
---
 gcc/config/rs6000/rs6000-builtin.cc      |  5 +++
 gcc/config/rs6000/rs6000-gen-builtins.cc | 63 ++++++++++++++++++++++++++++----
 2 files changed, 60 insertions(+), 8 deletions(-)

diff --git a/gcc/config/rs6000/rs6000-builtin.cc b/gcc/config/rs6000/rs6000-builtin.cc
index e3aab2b6ef16..2d35d5861246 100644
--- a/gcc/config/rs6000/rs6000-builtin.cc
+++ b/gcc/config/rs6000/rs6000-builtin.cc
@@ -150,6 +150,9 @@ rs6000_invalid_builtin (enum rs6000_gen_builtins fncode)
       error ("%qs requires the %qs and %qs options", name, "-mcpu=future",
 	     "-mvsx");
       break;
+    case ENB_DM:
+      error ("%qs requires the %qs option", name, "-mdense-math");
+      break;
     default:
     case ENB_ALWAYS:
       gcc_unreachable ();
@@ -211,6 +214,8 @@ rs6000_builtin_is_supported (enum rs6000_gen_builtins fncode)
       return TARGET_FUTURE && TARGET_ALTIVEC;
     case ENB_FUTURE_VSX:
       return TARGET_FUTURE && TARGET_VSX;
+    case ENB_DM:
+      return TARGET_DMF;
     default:
       gcc_unreachable ();
     }
diff --git a/gcc/config/rs6000/rs6000-gen-builtins.cc b/gcc/config/rs6000/rs6000-gen-builtins.cc
index 28ba90cea0f7..08068ba78fd4 100644
--- a/gcc/config/rs6000/rs6000-gen-builtins.cc
+++ b/gcc/config/rs6000/rs6000-gen-builtins.cc
@@ -94,6 +94,9 @@ along with GCC; see the file COPYING3.  If not see
      ibmld    Restrict usage to the case when TFmode is IBM-128
      ibm128   Restrict usage to the case where __ibm128 is supported or
               if ibmld
+     dm       Needs special handling for DMF/MMA+ instructions
+     dmint    DMF/MMA+ instruction expanding to internal call at GIMPLE time
+     dmr      MMA+ instruction using a dmr register as an input operand
 
    An example stanza might look like this:
 
@@ -235,6 +238,7 @@ enum bif_stanza
  BSTZ_FUTURE,
  BSTZ_FUTURE_ALTIVEC,
  BSTZ_FUTURE_VSX,
+ BSTZ_DM,
  NUMBIFSTANZAS
 };
 
@@ -271,7 +275,8 @@ static stanza_entry stanza_map[NUMBIFSTANZAS] =
     { "mma",		BSTZ_MMA	},
     { "future",	BSTZ_FUTURE	},
     { "future-altivec", BSTZ_FUTURE_ALTIVEC },
-    { "future-vsx",	BSTZ_FUTURE_VSX	}
+    { "future-vsx",	BSTZ_FUTURE_VSX	},
+    { "dm",		BSTZ_DM		}
   };
 
 static const char *enable_string[NUMBIFSTANZAS] =
@@ -299,7 +304,8 @@ static const char *enable_string[NUMBIFSTANZAS] =
     "ENB_MMA",
     "ENB_FUTURE",
     "ENB_FUTURE_ALTIVEC",
-    "ENB_FUTURE_VSX"
+    "ENB_FUTURE_VSX",
+    "ENB_DM"
   };
 
 /* Function modifiers provide special handling for const, pure, and fpmath
@@ -333,7 +339,8 @@ enum basetype
   BT_DECIMAL128,
   BT_IBM128,
   BT_VPAIR,
-  BT_VQUAD
+  BT_VQUAD,
+  BT_DMR
 };
 
 /* Ways in which a const int value can be restricted.  RES_BITS indicates
@@ -401,6 +408,9 @@ struct attrinfo
   bool isendian;
   bool isibmld;
   bool isibm128;
+  bool isdm;
+  bool isdmint;
+  bool isdmr;
 };
 
 /* Fields associated with a function prototype (bif or overload).  */
@@ -552,6 +562,7 @@ static typemap type_map[] =
     { "pv16qi",		"ptr_V16QI" },
     { "pv1poi",		"ptr_vector_pair" },
     { "pv1pxi",		"ptr_vector_quad" },
+    { "pv1tdoi",	"ptr_dmr1024" },
     { "pv1ti",		"ptr_V1TI" },
     { "pv2df",		"ptr_V2DF" },
     { "pv2di",		"ptr_V2DI" },
@@ -582,6 +593,7 @@ static typemap type_map[] =
     { "v16qi",		"V16QI" },
     { "v1poi",		"vector_pair" },
     { "v1pxi",		"vector_quad" },
+    { "v1tdoi",	"dmr1024" },
     { "v1ti",		"V1TI" },
     { "v2df",		"V2DF" },
     { "v2di",		"V2DI" },
@@ -1067,6 +1079,7 @@ match_type (typeinfo *typedata, int voidok)
        vd	vector double
        v256	__vector_pair
        v512	__vector_quad
+       dmr1024	__dmr1024
 
      For simplicity, We don't support "short int" and "long long int".
      We don't currently support a <basetype> of "_Float16".  "signed"
@@ -1248,6 +1261,13 @@ match_type (typeinfo *typedata, int voidok)
       handle_pointer (typedata);
       return 1;
     }
+  else if (!strcmp (token, "dmr1024"))
+    {
+      typedata->isvector = 1;
+      typedata->base = BT_DMR;
+      handle_pointer (typedata);
+      return 1;
+    }
   else if (!strcmp (token, "signed"))
     typedata->issigned = 1;
   else if (!strcmp (token, "unsigned"))
@@ -1446,6 +1466,12 @@ parse_bif_attrs (attrinfo *attrptr)
 	  attrptr->isibmld = 1;
 	else if (!strcmp (attrname, "ibm128"))
 	  attrptr->isibm128 = 1;
+       else if (!strcmp (attrname, "dm"))
+	  attrptr->isdm = 1;
+       else if (!strcmp (attrname, "dmint"))
+	  attrptr->isdmint = 1;
+       else if (!strcmp (attrname, "dmr"))
+	  attrptr->isdmr = 1;
 	else
 	  {
 	    diag (oldpos, "unknown attribute.\n");
@@ -1479,14 +1505,15 @@ parse_bif_attrs (attrinfo *attrptr)
 	"pred = %d, htm = %d, htmspr = %d, htmcr = %d, mma = %d, "
 	"quad = %d, pair = %d, mmaint = %d, no32bit = %d, 32bit = %d, "
 	"cpu = %d, ldstmask = %d, lxvrse = %d, lxvrze = %d, endian = %d, "
-	"ibmdld = %d, ibm128 = %d.\n",
+	"ibmdld = %d, ibm128 = %d, dm = %d, dmint = %d, dmr = %d.\n",
 	attrptr->isextract, attrptr->isnosoft,attrptr->isldvec,
 	attrptr->isstvec, attrptr->isreve, attrptr->ispred, attrptr->ishtm,
 	attrptr->ishtmspr, attrptr->ishtmcr, attrptr->ismma,
 	attrptr->isquad, attrptr->ispair, attrptr->ismmaint,
 	attrptr->isno32bit, attrptr->is32bit, attrptr->iscpu,
 	attrptr->isldstmask, attrptr->islxvrse,	attrptr->islxvrze,
-	attrptr->isendian, attrptr->isibmld, attrptr->isibm128);
+	attrptr->isendian, attrptr->isibmld, attrptr->isibm128,
+	attrptr->isdm, attrptr->isdmint, attrptr->isdmr);
 #endif
 
   return PC_OK;
@@ -1547,6 +1574,10 @@ complete_vector_type (typeinfo *typeptr, char *buf, int *bufi)
       memcpy (&buf[*bufi], "1pxi", 4);
       *bufi += 4;
       break;
+    case BT_DMR:
+      memcpy (&buf[*bufi], "1tdoi", 5);
+      *bufi += 5;
+      break;
     default:
       diag (pos, "unhandled basetype %d.\n", typeptr->base);
       exit (1);
@@ -2261,7 +2292,8 @@ write_decls (void)
   fprintf (header_file, "  ENB_MMA,\n");
   fprintf (header_file, "  ENB_FUTURE,\n");
   fprintf (header_file, "  ENB_FUTURE_ALTIVEC,\n");
-  fprintf (header_file, "  ENB_FUTURE_VSX\n");
+  fprintf (header_file, "  ENB_FUTURE_VSX,\n");
+  fprintf (header_file, "  ENB_DM\n");
   fprintf (header_file, "};\n\n");
 
   fprintf (header_file, "#define PPC_MAXRESTROPNDS 3\n");
@@ -2303,6 +2335,9 @@ write_decls (void)
   fprintf (header_file, "#define bif_endian_bit\t\t(0x00200000)\n");
   fprintf (header_file, "#define bif_ibmld_bit\t\t(0x00400000)\n");
   fprintf (header_file, "#define bif_ibm128_bit\t\t(0x00800000)\n");
+  fprintf (header_file, "#define bif_dm_bit\t\t(0x02000000)\n");
+  fprintf (header_file, "#define bif_dmint_bit\t\t(0x04000000)\n");
+  fprintf (header_file, "#define bif_dmr_bit\t\t(0x08000000)\n");
   fprintf (header_file, "\n");
   fprintf (header_file,
 	   "#define bif_is_extract(x)\t((x).bifattrs & bif_extract_bit)\n");
@@ -2348,6 +2383,12 @@ write_decls (void)
 	   "#define bif_is_ibmld(x)\t((x).bifattrs & bif_ibmld_bit)\n");
   fprintf (header_file,
 	   "#define bif_is_ibm128(x)\t((x).bifattrs & bif_ibm128_bit)\n");
+  fprintf (header_file,
+	   "#define bif_is_dm(x)\t((x).bifattrs & bif_dm_bit)\n");
+  fprintf (header_file,
+	   "#define bif_is_dmint(x)\t((x).bifattrs & bif_dmint_bit)\n");
+  fprintf (header_file,
+	   "#define bif_is_dmr(x)\t((x).bifattrs & bif_dmr_bit)\n");
   fprintf (header_file, "\n");
 
   fprintf (header_file,
@@ -2547,6 +2588,12 @@ write_bif_static_init (void)
 	fprintf (init_file, " | bif_ibmld_bit");
       if (bifp->attrs.isibm128)
 	fprintf (init_file, " | bif_ibm128_bit");
+      if (bifp->attrs.isdm)
+	fprintf (init_file, " | bif_dm_bit");
+      if (bifp->attrs.isdmint)
+	fprintf (init_file, " | bif_dmint_bit");
+      if (bifp->attrs.isdmr)
+	fprintf (init_file, " | bif_dmr_bit");
       fprintf (init_file, ",\n");
       fprintf (init_file, "      /* restr_opnd */\t{%d, %d, %d},\n",
 	       bifp->proto.restr_opnd[0], bifp->proto.restr_opnd[1],
@@ -2580,8 +2627,8 @@ write_bif_static_init (void)
 		   : (bifp->kind == FNK_FPMATH ? "= fp, const"
 		      : ""))));
       fprintf (init_file, "      /* assoc_bif */\tRS6000_BIF_%s%s\n",
-	       bifp->attrs.ismmaint ? bifp->idname : "NONE",
-	       bifp->attrs.ismmaint ? "_INTERNAL" : "");
+	       (bifp->attrs.ismmaint || bifp->attrs.isdmint) ? bifp->idname : "NONE",
+	       (bifp->attrs.ismmaint || bifp->attrs.isdmint) ? "_INTERNAL" : "");
       fprintf (init_file, "    },\n");
     }
   fprintf (init_file, "  };\n\n");
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.