[gcc(refs/users/wschmidt/heads/builtins4)] rs6000: Get MMA stuff working

William Schmidt wschmidt@gcc.gnu.org
Tue Feb 23 23:23:23 GMT 2021


https://gcc.gnu.org/g:3586794c78153ceb8021bbe1fd45dbb1b84050b2

commit 3586794c78153ceb8021bbe1fd45dbb1b84050b2
Author: Bill Schmidt <wschmidt@linux.ibm.com>
Date:   Tue Feb 23 17:22:29 2021 -0600

    rs6000: Get MMA stuff working
    
    2021-02-23  Bill Schmidt  <wschmidt@linux.ibm.com>
    
    gcc/
            * config/rs6000/rs6000-builtin-new.def: Many MMA changes.
            * config/rs6000/rs6000-call.c (new_mma_expand_builtin): Minor
            cleanup.
            (rs6000_gimple_fold_new_mma_builtin): Use assoc_bif field to
            detect whether or not to do gimple expansion, and to break the
            adjacency dependence; use rs6000_builtin_decls_x; expand
            MAX_BUILTIN_ARGS to 6 and handle that case.
            * config/rs6000/rs6000-gen-builtins.c (write_decls): Add
            assoc_bif.
            (write_bif_static_init): Initialize assoc_bif field.

Diff:
---
 gcc/config/rs6000/rs6000-builtin-new.def | 94 +++++++++++++++++---------------
 gcc/config/rs6000/rs6000-call.c          | 30 ++++++----
 gcc/config/rs6000/rs6000-gen-builtins.c  |  9 ++-
 3 files changed, 76 insertions(+), 57 deletions(-)

diff --git a/gcc/config/rs6000/rs6000-builtin-new.def b/gcc/config/rs6000/rs6000-builtin-new.def
index f7a466c8f0c..6a29726ec09 100644
--- a/gcc/config/rs6000/rs6000-builtin-new.def
+++ b/gcc/config/rs6000/rs6000-builtin-new.def
@@ -3511,9 +3511,15 @@
   void __builtin_mma_disassemble_acc (void *, v512 *);
     DISASSEMBLE_ACC nothing {mma,quad}
 
+  vuc __builtin_mma_disassemble_acc_internal (v512, const int<1>);
+    DISASSEMBLE_ACC_INTERNAL mma_disassemble_acc {mma}
+
   void __builtin_mma_disassemble_pair (void *, v256 *);
     DISASSEMBLE_PAIR nothing {mma,pair}
 
+  vuc __builtin_mma_disassemble_pair_internal (v256, const int<2>);
+    DISASSEMBLE_PAIR_INTERNAL mma_disassemble_pair {mma}
+
   void __builtin_mma_pmxvbf16ger2 (v512 *, vuc, vuc, const int<4>, const int<4>, const int<2>);
     PMXVBF16GER2 nothing {mma}
 
@@ -3523,25 +3529,25 @@
   void __builtin_mma_pmxvbf16ger2nn (v512 *, vuc, vuc, const int<4>, const int<4>, const int<2>);
     PMXVBF16GER2NN nothing {mma,quad}
 
-  v512 __builtin_mma_pmxvbf16ger2nn_internal (vuc, vuc, const int<4>, const int<4>, const int<2>);
+  v512 __builtin_mma_pmxvbf16ger2nn_internal (v512, vuc, vuc, const int<4>, const int<4>, const int<2>);
     PMXVBF16GER2NN_INTERNAL mma_pmxvbf16ger2nn {mma,quad}
 
   void __builtin_mma_pmxvbf16ger2np (v512 *, vuc, vuc, const int<4>, const int<4>, const int<2>);
     PMXVBF16GER2NP nothing {mma,quad}
 
-  v512 __builtin_mma_pmxvbf16ger2np_internal (vuc, vuc, const int<4>, const int<4>, const int<2>);
+  v512 __builtin_mma_pmxvbf16ger2np_internal (v512, vuc, vuc, const int<4>, const int<4>, const int<2>);
     PMXVBF16GER2NP_INTERNAL mma_pmxvbf16ger2np {mma,quad}
 
   void __builtin_mma_pmxvbf16ger2pn (v512 *, vuc, vuc, const int<4>, const int<4>, const int<2>);
     PMXVBF16GER2PN nothing {mma,quad}
 
-  v512 __builtin_mma_pmxvbf16ger2pn_internal (vuc, vuc, const int<4>, const int<4>, const int<2>);
+  v512 __builtin_mma_pmxvbf16ger2pn_internal (v512, vuc, vuc, const int<4>, const int<4>, const int<2>);
     PMXVBF16GER2PN_INTERNAL mma_pmxvbf16ger2pn {mma,quad}
 
   void __builtin_mma_pmxvbf16ger2pp (v512 *, vuc, vuc, const int<4>, const int<4>, const int<2>);
     PMXVBF16GER2PP nothing {mma,quad}
 
-  v512 __builtin_mma_pmxvbf16ger2pp_internal (vuc, vuc, const int<4>, const int<4>, const int<2>);
+  v512 __builtin_mma_pmxvbf16ger2pp_internal (v512, vuc, vuc, const int<4>, const int<4>, const int<2>);
     PMXVBF16GER2PP_INTERNAL mma_pmxvbf16ger2pp {mma,quad}
 
   void __builtin_mma_pmxvf16ger2 (v512 *, vuc, vuc, const int<4>, const int<4>, const int<2>);
@@ -3553,25 +3559,25 @@
   void __builtin_mma_pmxvf16ger2nn (v512 *, vuc, vuc, const int<4>, const int<4>, const int<2>);
     PMXVF16GER2NN nothing {mma,quad}
 
-  v512 __builtin_mma_pmxvf16ger2nn_internal (vuc, vuc, const int<4>, const int<4>, const int<2>);
+  v512 __builtin_mma_pmxvf16ger2nn_internal (v512, vuc, vuc, const int<4>, const int<4>, const int<2>);
     PMXVF16GER2NN_INTERNAL mma_pmxvf16ger2nn {mma,quad}
 
   void __builtin_mma_pmxvf16ger2np (v512 *, vuc, vuc, const int<4>, const int<4>, const int<2>);
     PMXVF16GER2NP nothing {mma,quad}
 
-  v512 __builtin_mma_pmxvf16ger2np_internal (vuc, vuc, const int<4>, const int<4>, const int<2>);
+  v512 __builtin_mma_pmxvf16ger2np_internal (v512, vuc, vuc, const int<4>, const int<4>, const int<2>);
     PMXVF16GER2NP_INTERNAL mma_pmxvf16ger2np {mma,quad}
 
   void __builtin_mma_pmxvf16ger2pn (v512 *, vuc, vuc, const int<4>, const int<4>, const int<2>);
     PMXVF16GER2PN nothing {mma,quad}
 
-  v512 __builtin_mma_pmxvf16ger2pn_internal (vuc, vuc, const int<4>, const int<4>, const int<2>);
+  v512 __builtin_mma_pmxvf16ger2pn_internal (v512, vuc, vuc, const int<4>, const int<4>, const int<2>);
     PMXVF16GER2PN_INTERNAL mma_pmxvf16ger2pn {mma,quad}
 
   void __builtin_mma_pmxvf16ger2pp (v512 *, vuc, vuc, const int<4>, const int<4>, const int<2>);
     PMXVF16GER2PP nothing {mma,quad}
 
-  v512 __builtin_mma_pmxvf16ger2pp_internal (vuc, vuc, const int<4>, const int<4>, const int<2>);
+  v512 __builtin_mma_pmxvf16ger2pp_internal (v512, vuc, vuc, const int<4>, const int<4>, const int<2>);
     PMXVF16GER2PP_INTERNAL mma_pmxvf16ger2pp {mma,quad}
 
   void __builtin_mma_pmxvf32ger (v512 *, vuc, vuc, const int<4>, const int<4>);
@@ -3583,25 +3589,25 @@
   void __builtin_mma_pmxvf32gernn (v512 *, vuc, vuc, const int<4>, const int<4>);
     PMXVF32GERNN nothing {mma,quad}
 
-  v512 __builtin_mma_pmxvf32gernn_internal (vuc, vuc, const int<4>, const int<4>);
+  v512 __builtin_mma_pmxvf32gernn_internal (v512, vuc, vuc, const int<4>, const int<4>);
     PMXVF32GERNN_INTERNAL mma_pmxvf32gernn {mma,quad}
 
   void __builtin_mma_pmxvf32gernp (v512 *, vuc, vuc, const int<4>, const int<4>);
     PMXVF32GERNP nothing {mma,quad}
 
-  v512 __builtin_mma_pmxvf32gernp_internal (vuc, vuc, const int<4>, const int<4>);
+  v512 __builtin_mma_pmxvf32gernp_internal (v512, vuc, vuc, const int<4>, const int<4>);
     PMXVF32GERNP_INTERNAL mma_pmxvf32gernp {mma,quad}
 
   void __builtin_mma_pmxvf32gerpn (v512 *, vuc, vuc, const int<4>, const int<4>);
     PMXVF32GERPN nothing {mma,quad}
 
-  v512 __builtin_mma_pmxvf32gerpn_internal (vuc, vuc, const int<4>, const int<4>);
+  v512 __builtin_mma_pmxvf32gerpn_internal (v512, vuc, vuc, const int<4>, const int<4>);
     PMXVF32GERPN_INTERNAL mma_pmxvf32gerpn {mma,quad}
 
   void __builtin_mma_pmxvf32gerpp (v512 *, vuc, vuc, const int<4>, const int<4>);
     PMXVF32GERPP nothing {mma,quad}
 
-  v512 __builtin_mma_pmxvf32gerpp_internal (vuc, vuc, const int<4>, const int<4>);
+  v512 __builtin_mma_pmxvf32gerpp_internal (v512, vuc, vuc, const int<4>, const int<4>);
     PMXVF32GERPP_INTERNAL mma_pmxvf32gerpp {mma,quad}
 
   void __builtin_mma_pmxvf64ger (v512 *, v256, vuc, const int<4>, const int<2>);
@@ -3613,25 +3619,25 @@
   void __builtin_mma_pmxvf64gernn (v512 *, v256, vuc, const int<4>, const int<2>);
     PMXVF64GERNN nothing {mma,pair,quad}
 
-  v512 __builtin_mma_pmxvf64gernn_internal (v256, vuc, const int<4>, const int<2>);
+  v512 __builtin_mma_pmxvf64gernn_internal (v512, v256, vuc, const int<4>, const int<2>);
     PMXVF64GERNN_INTERNAL mma_pmxvf64gernn {mma,pair,quad}
 
   void __builtin_mma_pmxvf64gernp (v512 *, v256, vuc, const int<4>, const int<2>);
     PMXVF64GERNP nothing {mma,pair,quad}
 
-  v512 __builtin_mma_pmxvf64gernp_internal (v256, vuc, const int<4>, const int<2>);
+  v512 __builtin_mma_pmxvf64gernp_internal (v512, v256, vuc, const int<4>, const int<2>);
     PMXVF64GERNP_INTERNAL mma_pmxvf64gernp {mma,pair,quad}
 
   void __builtin_mma_pmxvf64gerpn (v512 *, v256, vuc, const int<4>, const int<2>);
     PMXVF64GERPN nothing {mma,pair,quad}
 
-  v512 __builtin_mma_pmxvf64gerpn_internal (v256, vuc, const int<4>, const int<2>);
+  v512 __builtin_mma_pmxvf64gerpn_internal (v512, v256, vuc, const int<4>, const int<2>);
     PMXVF64GERPN_INTERNAL mma_pmxvf64gerpn {mma,pair,quad}
 
   void __builtin_mma_pmxvf64gerpp (v512 *, v256, vuc, const int<4>, const int<2>);
     PMXVF64GERPP nothing {mma,pair,quad}
 
-  v512 __builtin_mma_pmxvf64gerpp_internal (v256, vuc, const int<4>, const int<2>);
+  v512 __builtin_mma_pmxvf64gerpp_internal (v512, v256, vuc, const int<4>, const int<2>);
     PMXVF64GERPP_INTERNAL mma_pmxvf64gerpp {mma,pair,quad}
 
   void __builtin_mma_pmxvi16ger2 (v512 *, vuc, vuc, const int<4>, const int<4>, const int<2>);
@@ -3643,7 +3649,7 @@
   void __builtin_mma_pmxvi16ger2pp (v512 *, vuc, vuc, const int<4>, const int<4>, const int<2>);
     PMXVI16GER2PP nothing {mma,quad}
 
-  v512 __builtin_mma_pmxvi16ger2pp_internal (vuc, vuc, const int<4>, const int<4>, const int<2>);
+  v512 __builtin_mma_pmxvi16ger2pp_internal (v512, vuc, vuc, const int<4>, const int<4>, const int<2>);
     PMXVI16GER2PP_INTERNAL mma_pmxvi16ger2pp {mma,quad}
 
   void __builtin_mma_pmxvi16ger2s (v512 *, vuc, vuc, const int<4>, const int<4>, const int<2>);
@@ -3655,7 +3661,7 @@
   void __builtin_mma_pmxvi16ger2spp (v512 *, vuc, vuc, const int<4>, const int<4>, const int<2>);
     PMXVI16GER2SPP nothing {mma,quad}
 
-  v512 __builtin_mma_pmxvi16ger2spp_internal (vuc, vuc, const int<4>, const int<4>, const int<2>);
+  v512 __builtin_mma_pmxvi16ger2spp_internal (v512, vuc, vuc, const int<4>, const int<4>, const int<2>);
     PMXVI16GER2SPP_INTERNAL mma_pmxvi16ger2spp {mma,quad}
 
   void __builtin_mma_pmxvi4ger8 (v512 *, vuc, vuc, const int<4>, const int<4>, const int<8>);
@@ -3667,7 +3673,7 @@
   void __builtin_mma_pmxvi4ger8pp (v512 *, vuc, vuc, const int<4>, const int<4>, const int<4>);
     PMXVI4GER8PP nothing {mma,quad}
 
-  v512 __builtin_mma_pmxvi4ger8pp_internal (vuc, vuc, const int<4>, const int<4>, const int<4>);
+  v512 __builtin_mma_pmxvi4ger8pp_internal (v512, vuc, vuc, const int<4>, const int<4>, const int<4>);
     PMXVI4GER8PP_INTERNAL mma_pmxvi4ger8pp {mma,quad}
 
   void __builtin_mma_pmxvi8ger4 (v512 *, vuc, vuc, const int<4>, const int<4>, const int<4>);
@@ -3679,13 +3685,13 @@
   void __builtin_mma_pmxvi8ger4pp (v512 *, vuc, vuc, const int<4>, const int<4>, const int<4>);
     PMXVI8GER4PP nothing {mma,quad}
 
-  v512 __builtin_mma_pmxvi8ger4pp_internal (vuc, vuc, const int<4>, const int<4>, const int<4>);
+  v512 __builtin_mma_pmxvi8ger4pp_internal (v512, vuc, vuc, const int<4>, const int<4>, const int<4>);
     PMXVI8GER4PP_INTERNAL mma_pmxvi8ger4pp {mma,quad}
 
   void __builtin_mma_pmxvi8ger4spp (v512 *, vuc, vuc, const int<4>, const int<4>, const int<4>);
     PMXVI8GER4SPP nothing {mma,quad}
 
-  v512 __builtin_mma_pmxvi8ger4spp_internal (vuc, vuc, const int<4>, const int<4>, const int<4>);
+  v512 __builtin_mma_pmxvi8ger4spp_internal (v512, vuc, vuc, const int<4>, const int<4>, const int<4>);
     PMXVI8GER4SPP_INTERNAL mma_pmxvi8ger4spp {mma,quad}
 
   void __builtin_mma_xvbf16ger2 (v512 *, vuc, vuc);
@@ -3697,25 +3703,25 @@
   void __builtin_mma_xvbf16ger2nn (v512 *, vuc, vuc);
     XVBF16GER2NN nothing {mma,quad}
 
-  v512 __builtin_mma_xvbf16ger2nn_internal (vuc, vuc);
+  v512 __builtin_mma_xvbf16ger2nn_internal (v512, vuc, vuc);
     XVBF16GER2NN_INTERNAL mma_xvbf16ger2nn {mma,quad}
 
   void __builtin_mma_xvbf16ger2np (v512 *, vuc, vuc);
     XVBF16GER2NP nothing {mma,quad}
 
-  v512 __builtin_mma_xvbf16ger2np_internal (vuc, vuc);
+  v512 __builtin_mma_xvbf16ger2np_internal (v512, vuc, vuc);
     XVBF16GER2NP_INTERNAL mma_xvbf16ger2np {mma,quad}
 
   void __builtin_mma_xvbf16ger2pn (v512 *, vuc, vuc);
     XVBF16GER2PN nothing {mma,quad}
 
-  v512 __builtin_mma_xvbf16ger2pn_internal (vuc, vuc);
+  v512 __builtin_mma_xvbf16ger2pn_internal (v512, vuc, vuc);
     XVBF16GER2PN_INTERNAL mma_xvbf16ger2pn {mma,quad}
 
   void __builtin_mma_xvbf16ger2pp (v512 *, vuc, vuc);
     XVBF16GER2PP nothing {mma,quad}
 
-  v512 __builtin_mma_xvbf16ger2pp_internal (vuc, vuc);
+  v512 __builtin_mma_xvbf16ger2pp_internal (v512, vuc, vuc);
     XVBF16GER2PP_INTERNAL mma_xvbf16ger2pp {mma,quad}
 
   void __builtin_mma_xvf16ger2 (v512 *, vuc, vuc);
@@ -3727,25 +3733,25 @@
   void __builtin_mma_xvf16ger2nn (v512 *, vuc, vuc);
     XVF16GER2NN nothing {mma,quad}
 
-  v512 __builtin_mma_xvf16ger2nn_internal (vuc, vuc);
+  v512 __builtin_mma_xvf16ger2nn_internal (v512, vuc, vuc);
     XVF16GER2NN_INTERNAL mma_xvf16ger2nn {mma,quad}
 
   void __builtin_mma_xvf16ger2np (v512 *, vuc, vuc);
     XVF16GER2NP nothing {mma,quad}
 
-  v512 __builtin_mma_xvf16ger2np_internal (vuc, vuc);
+  v512 __builtin_mma_xvf16ger2np_internal (v512, vuc, vuc);
     XVF16GER2NP_INTERNAL mma_xvf16ger2np {mma,quad}
 
   void __builtin_mma_xvf16ger2pn (v512 *, vuc, vuc);
     XVF16GER2PN nothing {mma,quad}
 
-  v512 __builtin_mma_xvf16ger2pn_internal (vuc, vuc);
+  v512 __builtin_mma_xvf16ger2pn_internal (v512, vuc, vuc);
     XVF16GER2PN_INTERNAL mma_xvf16ger2pn {mma,quad}
 
   void __builtin_mma_xvf16ger2pp (v512 *, vuc, vuc);
     XVF16GER2PP nothing {mma,quad}
 
-  v512 __builtin_mma_xvf16ger2pp_internal (vuc, vuc);
+  v512 __builtin_mma_xvf16ger2pp_internal (v512, vuc, vuc);
     XVF16GER2PP_INTERNAL mma_xvf16ger2pp {mma,quad}
 
   void __builtin_mma_xvf32ger (v512 *, vuc, vuc);
@@ -3757,25 +3763,25 @@
   void __builtin_mma_xvf32gernn (v512 *, vuc, vuc);
     XVF32GERNN nothing {mma,quad}
 
-  v512 __builtin_mma_xvf32gernn_internal (vuc, vuc);
+  v512 __builtin_mma_xvf32gernn_internal (v512, vuc, vuc);
     XVF32GERNN_INTERNAL mma_xvf32gernn {mma,quad}
 
   void __builtin_mma_xvf32gernp (v512 *, vuc, vuc);
     XVF32GERNP nothing {mma,quad}
 
-  v512 __builtin_mma_xvf32gernp_internal (vuc, vuc);
+  v512 __builtin_mma_xvf32gernp_internal (v512, vuc, vuc);
     XVF32GERNP_INTERNAL mma_xvf32gernp {mma,quad}
 
   void __builtin_mma_xvf32gerpn (v512 *, vuc, vuc);
     XVF32GERPN nothing {mma,quad}
 
-  v512 __builtin_mma_xvf32gerpn_internal (vuc, vuc);
+  v512 __builtin_mma_xvf32gerpn_internal (v512, vuc, vuc);
     XVF32GERPN_INTERNAL mma_xvf32gerpn {mma,quad}
 
   void __builtin_mma_xvf32gerpp (v512 *, vuc, vuc);
     XVF32GERPP nothing {mma,quad}
 
-  v512 __builtin_mma_xvf32gerpp_internal (vuc, vuc);
+  v512 __builtin_mma_xvf32gerpp_internal (v512, vuc, vuc);
     XVF32GERPP_INTERNAL mma_xvf32gerpp {mma,quad}
 
   void __builtin_mma_xvf64ger (v512 *, v256, vuc);
@@ -3787,25 +3793,25 @@
   void __builtin_mma_xvf64gernn (v512 *, v256, vuc);
     XVF64GERNN nothing {mma,pair,quad}
 
-  v512 __builtin_mma_xvf64gernn_internal (v256, vuc);
+  v512 __builtin_mma_xvf64gernn_internal (v512, v256, vuc);
     XVF64GERNN_INTERNAL mma_xvf64gernn {mma,pair,quad}
 
   void __builtin_mma_xvf64gernp (v512 *, v256, vuc);
     XVF64GERNP nothing {mma,pair,quad}
 
-  v512 __builtin_mma_xvf64gernp_internal (v256, vuc);
+  v512 __builtin_mma_xvf64gernp_internal (v512, v256, vuc);
     XVF64GERNP_INTERNAL mma_xvf64gernp {mma,pair,quad}
 
   void __builtin_mma_xvf64gerpn (v512 *, v256, vuc);
     XVF64GERPN nothing {mma,pair,quad}
 
-  v512 __builtin_mma_xvf64gerpn_internal (v256, vuc);
+  v512 __builtin_mma_xvf64gerpn_internal (v512, v256, vuc);
     XVF64GERPN_INTERNAL mma_xvf64gerpn {mma,pair,quad}
 
   void __builtin_mma_xvf64gerpp (v512 *, v256, vuc);
     XVF64GERPP nothing {mma,pair,quad}
 
-  v512 __builtin_mma_xvf64gerpp_internal (v256, vuc);
+  v512 __builtin_mma_xvf64gerpp_internal (v512, v256, vuc);
     XVF64GERPP_INTERNAL mma_xvf64gerpp {mma,pair,quad}
 
   void __builtin_mma_xvi16ger2 (v512 *, vuc, vuc);
@@ -3817,7 +3823,7 @@
   void __builtin_mma_xvi16ger2pp (v512 *, vuc, vuc);
     XVI16GER2PP nothing {mma,quad}
 
-  v512 __builtin_mma_xvi16ger2pp_internal (vuc, vuc);
+  v512 __builtin_mma_xvi16ger2pp_internal (v512, vuc, vuc);
     XVI16GER2PP_INTERNAL mma_xvi16ger2pp {mma,quad}
 
   void __builtin_mma_xvi16ger2s (v512 *, vuc, vuc);
@@ -3829,7 +3835,7 @@
   void __builtin_mma_xvi16ger2spp (v512 *, vuc, vuc);
     XVI16GER2SPP nothing {mma,quad}
 
-  v512 __builtin_mma_xvi16ger2spp_internal (vuc, vuc);
+  v512 __builtin_mma_xvi16ger2spp_internal (v512, vuc, vuc);
     XVI16GER2SPP_INTERNAL mma_xvi16ger2spp {mma,quad}
 
   void __builtin_mma_xvi4ger8 (v512 *, vuc, vuc);
@@ -3841,7 +3847,7 @@
   void __builtin_mma_xvi4ger8pp (v512 *, vuc, vuc);
     XVI4GER8PP nothing {mma,quad}
 
-  v512 __builtin_mma_xvi4ger8pp_internal (vuc, vuc);
+  v512 __builtin_mma_xvi4ger8pp_internal (v512, vuc, vuc);
     XVI4GER8PP_INTERNAL mma_xvi4ger8pp {mma,quad}
 
   void __builtin_mma_xvi8ger4 (v512 *, vuc, vuc);
@@ -3853,25 +3859,25 @@
   void __builtin_mma_xvi8ger4pp (v512 *, vuc, vuc);
     XVI8GER4PP nothing {mma,quad}
 
-  v512 __builtin_mma_xvi8ger4pp_internal (vuc, vuc);
+  v512 __builtin_mma_xvi8ger4pp_internal (v512, vuc, vuc);
     XVI8GER4PP_INTERNAL mma_xvi8ger4pp {mma,quad}
 
   void __builtin_mma_xvi8ger4spp (v512 *, vuc, vuc);
     XVI8GER4SPP nothing {mma,quad}
 
-  v512 __builtin_mma_xvi8ger4spp_internal (vuc, vuc);
+  v512 __builtin_mma_xvi8ger4spp_internal (v512, vuc, vuc);
     XVI8GER4SPP_INTERNAL mma_xvi8ger4spp {mma,quad}
 
   void __builtin_mma_xxmfacc (v512 *);
     XXMFACC nothing {mma,quad}
 
-  v512 __builtin_mma_xxmfacc_internal ();
+  v512 __builtin_mma_xxmfacc_internal (v512);
     XXMFACC_INTERNAL mma_xxmfacc {mma,quad}
 
   void __builtin_mma_xxmtacc (v512 *);
     XXMTACC nothing {mma,quad}
 
-  v512 __builtin_mma_xxmtacc_internal ();
+  v512 __builtin_mma_xxmtacc_internal (v512);
     XXMTACC_INTERNAL mma_xxmtacc {mma,quad}
 
   void __builtin_mma_xxsetaccz (v512 *);
diff --git a/gcc/config/rs6000/rs6000-call.c b/gcc/config/rs6000/rs6000-call.c
index 026f9607fe5..18218206e71 100644
--- a/gcc/config/rs6000/rs6000-call.c
+++ b/gcc/config/rs6000/rs6000-call.c
@@ -13706,7 +13706,7 @@ new_mma_expand_builtin (tree exp, rtx target, insn_code icode)
   bool void_func = TREE_TYPE (TREE_TYPE (fndecl)) == void_type_node;
   machine_mode tmode = VOIDmode;
 
-  if (TREE_TYPE (TREE_TYPE (fndecl)) != void_type_node)
+  if (!void_func)
     {
       tmode = insn_data[icode].operand[0].mode;
       if (!target
@@ -14093,9 +14093,11 @@ rs6000_gimple_fold_new_mma_builtin (gimple_stmt_iterator *gsi,
   if (!bif_is_mma (rs6000_builtin_info_x[fncode]))
     return false;
 
-  /* #### Need an attribute to mark only the first of each of the
-     mma builtin pairs as being eligible for folding.  This used to
-     be done with RS6000_BTC_GIMPLE.  */
+  /* 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!  */
+  if (rs6000_builtin_info_x[fncode].assoc_bif == RS6000_BIF_NONE)
+    return false;
 
   bifdata *bd = &rs6000_builtin_info_x[fncode];
   unsigned nopnds = bd->nargs;
@@ -14134,7 +14136,7 @@ rs6000_gimple_fold_new_mma_builtin (gimple_stmt_iterator *gsi,
 	 to emit a xxmfacc instruction now, since we cannot do it later.  */
       if (fncode == RS6000_BIF_DISASSEMBLE_ACC)
 	{
-	  new_decl = rs6000_builtin_decls[RS6000_BIF_XXMFACC_INTERNAL];
+	  new_decl = rs6000_builtin_decls_x[RS6000_BIF_XXMFACC_INTERNAL];
 	  new_call = gimple_build_call (new_decl, 1, src);
 	  src = make_ssa_name (vector_quad_type_node);
 	  gimple_call_set_lhs (new_call, src);
@@ -14142,8 +14144,8 @@ rs6000_gimple_fold_new_mma_builtin (gimple_stmt_iterator *gsi,
 	}
 
       /* Copy the accumulator/pair vector by vector.  */
-      /* #### TODO: Break the adjacency dependency.  */
-      new_decl = rs6000_builtin_decls[fncode + 1];
+      new_decl
+	= rs6000_builtin_decls_x[rs6000_builtin_info_x[fncode].assoc_bif];
       tree dst_type = build_pointer_type_for_mode (unsigned_V16QI_type_node,
 						   ptr_mode, true);
       tree dst_base = build1 (VIEW_CONVERT_EXPR, dst_type, dst_ptr);
@@ -14165,8 +14167,8 @@ rs6000_gimple_fold_new_mma_builtin (gimple_stmt_iterator *gsi,
     }
 
   /* Convert this built-in into an internal version that uses pass-by-value
-     arguments.  The internal built-in follows immediately after this one.  */
-  new_decl = rs6000_builtin_decls_x[fncode + 1];
+     arguments.  The internal built-in is found in the assoc_bif field.  */
+  new_decl = rs6000_builtin_decls_x[rs6000_builtin_info_x[fncode].assoc_bif];
   tree lhs, op[MAX_MMA_OPERANDS];
   tree acc = gimple_call_arg (stmt, 0);
   push_gimplify_context (true);
@@ -15373,7 +15375,7 @@ rs6000_expand_new_builtin (tree exp, rtx target,
     return new_htm_expand_builtin (bifaddr, fcode, exp, target);
 
   rtx pat;
-  const int MAX_BUILTIN_ARGS = 5;
+  const int MAX_BUILTIN_ARGS = 6;
   tree arg[MAX_BUILTIN_ARGS];
   rtx op[MAX_BUILTIN_ARGS];
   machine_mode mode[MAX_BUILTIN_ARGS + 1];
@@ -15535,7 +15537,7 @@ rs6000_expand_new_builtin (tree exp, rtx target,
   switch (nargs)
     {
     default:
-      gcc_assert (MAX_BUILTIN_ARGS == 5);
+      gcc_assert (MAX_BUILTIN_ARGS == 6);
       gcc_unreachable ();
     case 0:
       pat = (void_func
@@ -15567,6 +15569,12 @@ rs6000_expand_new_builtin (tree exp, rtx target,
 	     ? GEN_FCN (icode) (op[0], op[1], op[2], op[3], op[4])
 	     : GEN_FCN (icode) (target, op[0], op[1], op[2], op[3], op[4]));
       break;
+    case 6:
+      pat = (void_func
+	     ? GEN_FCN (icode) (op[0], op[1], op[2], op[3], op[4], op[5])
+	     : GEN_FCN (icode) (target, op[0], op[1],
+				op[2], op[3], op[4], op[5]));
+      break;
     }
 
   if (!pat)
diff --git a/gcc/config/rs6000/rs6000-gen-builtins.c b/gcc/config/rs6000/rs6000-gen-builtins.c
index 588c31e8172..77c9f8b874e 100644
--- a/gcc/config/rs6000/rs6000-gen-builtins.c
+++ b/gcc/config/rs6000/rs6000-gen-builtins.c
@@ -2178,6 +2178,7 @@ write_decls ()
   fprintf (header_file, "  int  restr_val1[PPC_MAXRESTROPNDS];\n");
   fprintf (header_file, "  int  restr_val2[PPC_MAXRESTROPNDS];\n");
   fprintf (header_file, "  const char *attr_string;\n");
+  fprintf (header_file, "  rs6000_gen_builtins assoc_bif;\n");
   fprintf (header_file, "};\n\n");
 
   fprintf (header_file, "#define bif_init_bit\t\t(0x00000001)\n");
@@ -2424,7 +2425,7 @@ write_bif_static_init ()
   fprintf (init_file, "    { /* RS6000_BIF_NONE: */\n");
   fprintf (init_file, "      \"\", ENB_ALWAYS, 0, CODE_FOR_nothing, 0,\n");
   fprintf (init_file, "      0, {0, 0, 0}, {RES_NONE, RES_NONE, RES_NONE},\n");
-  fprintf (init_file, "      {0, 0, 0}, {0, 0, 0}, \"\"\n");
+  fprintf (init_file, "      {0, 0, 0}, {0, 0, 0}, \"\", RS6000_BIF_NONE\n");
   fprintf (init_file, "    },\n");
   for (int i = 0; i <= curr_bif; i++)
     {
@@ -2498,11 +2499,15 @@ write_bif_static_init ()
       fprintf (init_file, "      /* restr_val2 */\t{%d, %d, %d},\n",
 	       bifp->proto.restr_val2[0], bifp->proto.restr_val2[1],
 	       bifp->proto.restr_val2[2]);
-      fprintf (init_file, "      /* attr_string */\t\"%s\"\n",
+      fprintf (init_file, "      /* attr_string */\t\"%s\",\n",
 	       (bifp->kind == FNK_CONST ? "= const"
 		: (bifp->kind == FNK_PURE ? "= pure"
 		   : (bifp->kind == FNK_FPMATH ? "= fp, const"
 		      : ""))));
+      bool no_icode = !strcmp (bifp->patname, "nothing");
+      fprintf (init_file, "      /* assoc_bif */\tRS6000_BIF_%s%s\n",
+	       bifp->attrs.ismma && no_icode ? bifp->idname : "NONE",
+	       bifp->attrs.ismma && no_icode ? "_INTERNAL" : "");
       fprintf (init_file, "    },\n");
     }
   fprintf (init_file, "  };\n\n");


More information about the Gcc-cvs mailing list