[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