public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc(refs/users/meissner/heads/work157-dmf)] PowerPC: Switch to dense math names for all MMA operations.
@ 2024-02-09 19:11 Michael Meissner
  0 siblings, 0 replies; only message in thread
From: Michael Meissner @ 2024-02-09 19:11 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:1982bc61d48c404f0784df087ab2078446c6e60d

commit 1982bc61d48c404f0784df087ab2078446c6e60d
Author: Michael Meissner <meissner@linux.ibm.com>
Date:   Wed Feb 7 15:39:11 2024 -0500

    PowerPC: Switch to dense math names for all MMA operations.
    
    This patch changes the assembler instruction names for MMA instructions from
    the original name used in power10 to the new name when used with the dense math
    system.  I.e. xvf64gerpp becomes dmxvf64gerpp.  The assembler will emit the
    same bits for either spelling.
    
    The patches have been tested on both little and big endian systems.  Can I check
    it into the master branch?
    
    For the non-prefixed MMA instructions, we add a 'dm' prefix in front of the
    instruction.  However, the prefixed instructions have a 'pm' prefix, and we add
    the 'dm' prefix afterwards.  To prevent having two sets of parallel int
    attributes, we remove the "pm" prefix from the instruction string in the
    attributes, and add it later, both in the insn name and in the output template.
    
    For example, previously we had
    
      (define_int_attr vvi4i4i8 [(UNSPEC_MMA_PMXVI4GER8 "pmxvi4ger8")])
    
      ;; ...
    
      (define_insn "mma_<vvi4i4i8>"
        [(set (match_operand:XO 0 "accumulator_operand" "=wD,&d,&d")
              (unspec:XO [(match_operand:V16QI 1 "vsx_register_operand" "wa,v,?wa")
                          (match_operand:V16QI 2 "vsx_register_operand" "wa,v,?wa")
                          (match_operand:SI 3 "const_0_to_15_operand" "n,n,n")
                          (match_operand:SI 4 "const_0_to_15_operand" "n,n,n")
                          (match_operand:SI 5 "u8bit_cint_operand" "n,n,n")]
                          MMA_VVI4I4I8))]
        "TARGET_MMA"
        "<vvi4i4i8> %A0,%x1,%x2,%3,%4,%5"
        [(set_attr "type" "mma")
         (set_attr "prefixed" "yes")
         (set_attr "isa" "dm,not_dm,not_dm")])
    
    And now we have:
    
      (define_int_attr vvi4i4i8 [(UNSPEC_MMA_PMXVI4GER8 "xvi4ger8")])
    
      ;; ...
    
      (define_insn "mma_pm<vvi4i4i8>"
        [(set (match_operand:XO 0 "accumulator_operand" "=wD,&d,&d")
              (unspec:XO [(match_operand:V16QI 1 "vsx_register_operand" "wa,v,?wa")
                          (match_operand:V16QI 2 "vsx_register_operand" "wa,v,?wa")
                          (match_operand:SI 3 "const_0_to_15_operand" "n,n,n")
                          (match_operand:SI 4 "const_0_to_15_operand" "n,n,n")
                          (match_operand:SI 5 "u8bit_cint_operand" "n,n,n")]
                          MMA_VVI4I4I8))]
        "TARGET_MMA"
        "@
         pmdm<vvi4i4i8> %A0,%x1,%x2,%3,%4,%5
         pm<vvi4i4i8> %A0,%x1,%x2,%3,%4,%5
         pm<vvi4i4i8> %A0,%x1,%x2,%3,%4,%5"
        [(set_attr "type" "mma")
         (set_attr "prefixed" "yes")
         (set_attr "isa" "dm,not_dm,not_dm")])
    
    2024-02-07   Michael Meissner  <meissner@linux.ibm.com>
    
    gcc/
    
            * config/rs6000/mma.md (vvi4i4i8): Change the instruction to not have a
            "pm" prefix.
            (avvi4i4i8): Likewise.
            (vvi4i4i2): Likewise.
            (avvi4i4i2): Likewise.
            (vvi4i4): Likewise.
            (avvi4i4): Likewise.
            (pvi4i2): Likewise.
            (apvi4i2): Likewise.
            (vvi4i4i4): Likewise.
            (avvi4i4i4): Likewise.
            (mma_<vv>): Add support for running on DMF systems, generating the dense
            math instruction and using the dense math accumulators.
            (mma_<pv>): Likewise.
            (mma_<avv>): Likewise.
            (mma_<apv>): Likewise.
            (mma_pm<vvi4i4i8>): Add support for running on DMF systems, generating
            the dense math instruction and using the dense math accumulators.
            Rename the insn with a 'pm' prefix and add either 'pm' or 'pmdm'
            prefixes based on whether we have the original MMA specification or if
            we have dense math support.
            (mma_pm<avvi4i4i8>): Likewise.
            (mma_pm<vvi4i4i2>): Likewise.
            (mma_pm<avvi4i4i2>): Likewise.
            (mma_pm<vvi4i4>): Likewise.
            (mma_pm<avvi4i4): Likewise.
            (mma_pm<pvi4i2>): Likewise.
            (mma_pm<apvi4i2): Likewise.
            (mma_pm<vvi4i4i4>): Likewise.
            (mma_pm<avvi4i4i4>): Likewise.
    
    gcc/testsuite/
    
            * gcc.target/powerpc/dm-double-test.c: New test.
            * lib/target-supports.exp (check_effective_target_ppc_dmr_ok): New
            target test.

Diff:
---
 gcc/config/rs6000/mma.md                          | 147 ++++++++++------
 gcc/testsuite/gcc.target/powerpc/dm-double-test.c | 194 ++++++++++++++++++++++
 gcc/testsuite/lib/target-supports.exp             |  19 +++
 3 files changed, 308 insertions(+), 52 deletions(-)

diff --git a/gcc/config/rs6000/mma.md b/gcc/config/rs6000/mma.md
index 90dfa56bab25..0b1da140d4e7 100644
--- a/gcc/config/rs6000/mma.md
+++ b/gcc/config/rs6000/mma.md
@@ -225,44 +225,48 @@
 				 (UNSPEC_MMA_XVF64GERNP		"xvf64gernp")
 				 (UNSPEC_MMA_XVF64GERNN		"xvf64gernn")])
 
-(define_int_attr vvi4i4i8	[(UNSPEC_MMA_PMXVI4GER8		"pmxvi4ger8")])
+;; Do not include the "pm" prefix in these instructions.  If we have MMA but we
+;; don't have dense math register support we want to issue the instruction with
+;; a "pm" prefix, but if we have dense math registers, we want to issue it with
+;; a "pmdm" prefix.  I.e. pmxvi4ger8 vs. pmdmxvi4ger8
+(define_int_attr vvi4i4i8	[(UNSPEC_MMA_PMXVI4GER8		"xvi4ger8")])
 
-(define_int_attr avvi4i4i8	[(UNSPEC_MMA_PMXVI4GER8PP	"pmxvi4ger8pp")])
+(define_int_attr avvi4i4i8	[(UNSPEC_MMA_PMXVI4GER8PP	"xvi4ger8pp")])
 
-(define_int_attr vvi4i4i2	[(UNSPEC_MMA_PMXVI16GER2	"pmxvi16ger2")
-				 (UNSPEC_MMA_PMXVI16GER2S	"pmxvi16ger2s")
-				 (UNSPEC_MMA_PMXVF16GER2	"pmxvf16ger2")
-				 (UNSPEC_MMA_PMXVBF16GER2	"pmxvbf16ger2")])
+(define_int_attr vvi4i4i2	[(UNSPEC_MMA_PMXVI16GER2	"xvi16ger2")
+				 (UNSPEC_MMA_PMXVI16GER2S	"xvi16ger2s")
+				 (UNSPEC_MMA_PMXVF16GER2	"xvf16ger2")
+				 (UNSPEC_MMA_PMXVBF16GER2	"xvbf16ger2")])
 
-(define_int_attr avvi4i4i2	[(UNSPEC_MMA_PMXVI16GER2PP	"pmxvi16ger2pp")
-				 (UNSPEC_MMA_PMXVI16GER2SPP	"pmxvi16ger2spp")
-				 (UNSPEC_MMA_PMXVF16GER2PP	"pmxvf16ger2pp")
-				 (UNSPEC_MMA_PMXVF16GER2PN	"pmxvf16ger2pn")
-				 (UNSPEC_MMA_PMXVF16GER2NP	"pmxvf16ger2np")
-				 (UNSPEC_MMA_PMXVF16GER2NN	"pmxvf16ger2nn")
-				 (UNSPEC_MMA_PMXVBF16GER2PP	"pmxvbf16ger2pp")
-				 (UNSPEC_MMA_PMXVBF16GER2PN	"pmxvbf16ger2pn")
-				 (UNSPEC_MMA_PMXVBF16GER2NP	"pmxvbf16ger2np")
-				 (UNSPEC_MMA_PMXVBF16GER2NN	"pmxvbf16ger2nn")])
+(define_int_attr avvi4i4i2	[(UNSPEC_MMA_PMXVI16GER2PP	"xvi16ger2pp")
+				 (UNSPEC_MMA_PMXVI16GER2SPP	"xvi16ger2spp")
+				 (UNSPEC_MMA_PMXVF16GER2PP	"xvf16ger2pp")
+				 (UNSPEC_MMA_PMXVF16GER2PN	"xvf16ger2pn")
+				 (UNSPEC_MMA_PMXVF16GER2NP	"xvf16ger2np")
+				 (UNSPEC_MMA_PMXVF16GER2NN	"xvf16ger2nn")
+				 (UNSPEC_MMA_PMXVBF16GER2PP	"xvbf16ger2pp")
+				 (UNSPEC_MMA_PMXVBF16GER2PN	"xvbf16ger2pn")
+				 (UNSPEC_MMA_PMXVBF16GER2NP	"xvbf16ger2np")
+				 (UNSPEC_MMA_PMXVBF16GER2NN	"xvbf16ger2nn")])
 
-(define_int_attr vvi4i4		[(UNSPEC_MMA_PMXVF32GER		"pmxvf32ger")])
+(define_int_attr vvi4i4		[(UNSPEC_MMA_PMXVF32GER		"xvf32ger")])
 
-(define_int_attr avvi4i4	[(UNSPEC_MMA_PMXVF32GERPP	"pmxvf32gerpp")
-				 (UNSPEC_MMA_PMXVF32GERPN	"pmxvf32gerpn")
-				 (UNSPEC_MMA_PMXVF32GERNP	"pmxvf32gernp")
-				 (UNSPEC_MMA_PMXVF32GERNN	"pmxvf32gernn")])
+(define_int_attr avvi4i4	[(UNSPEC_MMA_PMXVF32GERPP	"xvf32gerpp")
+				 (UNSPEC_MMA_PMXVF32GERPN	"xvf32gerpn")
+				 (UNSPEC_MMA_PMXVF32GERNP	"xvf32gernp")
+				 (UNSPEC_MMA_PMXVF32GERNN	"xvf32gernn")])
 
-(define_int_attr pvi4i2		[(UNSPEC_MMA_PMXVF64GER		"pmxvf64ger")])
+(define_int_attr pvi4i2		[(UNSPEC_MMA_PMXVF64GER		"xvf64ger")])
 
-(define_int_attr apvi4i2	[(UNSPEC_MMA_PMXVF64GERPP	"pmxvf64gerpp")
-				 (UNSPEC_MMA_PMXVF64GERPN	"pmxvf64gerpn")
-				 (UNSPEC_MMA_PMXVF64GERNP	"pmxvf64gernp")
-				 (UNSPEC_MMA_PMXVF64GERNN	"pmxvf64gernn")])
+(define_int_attr apvi4i2	[(UNSPEC_MMA_PMXVF64GERPP	"xvf64gerpp")
+				 (UNSPEC_MMA_PMXVF64GERPN	"xvf64gerpn")
+				 (UNSPEC_MMA_PMXVF64GERNP	"xvf64gernp")
+				 (UNSPEC_MMA_PMXVF64GERNN	"xvf64gernn")])
 
-(define_int_attr vvi4i4i4	[(UNSPEC_MMA_PMXVI8GER4		"pmxvi8ger4")])
+(define_int_attr vvi4i4i4	[(UNSPEC_MMA_PMXVI8GER4		"xvi8ger4")])
 
-(define_int_attr avvi4i4i4	[(UNSPEC_MMA_PMXVI8GER4PP	"pmxvi8ger4pp")
-				 (UNSPEC_MMA_PMXVI8GER4SPP	"pmxvi8ger4spp")])
+(define_int_attr avvi4i4i4	[(UNSPEC_MMA_PMXVI8GER4PP	"xvi8ger4pp")
+				 (UNSPEC_MMA_PMXVI8GER4SPP	"xvi8ger4spp")])
 
 
 ;; Vector pair support.  OOmode can only live in VSRs.
@@ -629,7 +633,10 @@
 		    (match_operand:V16QI 2 "vsx_register_operand" "wa,v,?wa")]
 		    MMA_VV))]
   "TARGET_MMA"
-  "<vv> %A0,%x1,%x2"
+  "@
+   dm<vv> %A0,%x1,%x2
+   <vv> %A0,%x1,%x2
+   <vv> %A0,%x1,%x2"
   [(set_attr "type" "mma")
    (set_attr "isa" "dm,not_dm,not_dm")])
 
@@ -650,7 +657,10 @@
 		    (match_operand:V16QI 2 "vsx_register_operand" "wa,v,?wa")]
 		    MMA_PV))]
   "TARGET_MMA"
-  "<pv> %A0,%x1,%x2"
+  "@
+   dm<pv> %A0,%x1,%x2
+   <pv> %A0,%x1,%x2
+   <pv> %A0,%x1,%x2"
   [(set_attr "type" "mma")
    (set_attr "isa" "dm,not_dm,not_dm")])
 
@@ -661,11 +671,14 @@
 		    (match_operand:V16QI 3 "vsx_register_operand" "wa,v,?wa")]
 		    MMA_APV))]
   "TARGET_MMA"
-  "<apv> %A0,%x2,%x3"
+  "@
+   dm<apv> %A0,%x2,%x3
+   <apv> %A0,%x2,%x3
+   <apv> %A0,%x2,%x3"
   [(set_attr "type" "mma")
    (set_attr "isa" "dm,not_dm,not_dm")])
 
-(define_insn "mma_<vvi4i4i8>"
+(define_insn "mma_pm<vvi4i4i8>"
   [(set (match_operand:XO 0 "accumulator_operand" "=wD,&d,&d")
 	(unspec:XO [(match_operand:V16QI 1 "vsx_register_operand" "wa,v,?wa")
 		    (match_operand:V16QI 2 "vsx_register_operand" "wa,v,?wa")
@@ -674,12 +687,15 @@
 		    (match_operand:SI 5 "u8bit_cint_operand" "n,n,n")]
 		    MMA_VVI4I4I8))]
   "TARGET_MMA"
-  "<vvi4i4i8> %A0,%x1,%x2,%3,%4,%5"
+  "@
+   pmdm<vvi4i4i8> %A0,%x1,%x2,%3,%4,%5
+   pm<vvi4i4i8> %A0,%x1,%x2,%3,%4,%5
+   pm<vvi4i4i8> %A0,%x1,%x2,%3,%4,%5"
   [(set_attr "type" "mma")
    (set_attr "prefixed" "yes")
    (set_attr "isa" "dm,not_dm,not_dm")])
 
-(define_insn "mma_<avvi4i4i8>"
+(define_insn "mma_pm<avvi4i4i8>"
   [(set (match_operand:XO 0 "accumulator_operand" "=wD,&d,&d")
 	(unspec:XO [(match_operand:XO 1 "accumulator_operand" "0,0,0")
 		    (match_operand:V16QI 2 "vsx_register_operand" "wa,v,?wa")
@@ -689,12 +705,15 @@
 		    (match_operand:SI 6 "u8bit_cint_operand" "n,n,n")]
 		    MMA_AVVI4I4I8))]
   "TARGET_MMA"
-  "<avvi4i4i8> %A0,%x2,%x3,%4,%5,%6"
+  "@
+   pmdm<avvi4i4i8> %A0,%x2,%x3,%4,%5,%6
+   pm<avvi4i4i8> %A0,%x2,%x3,%4,%5,%6
+   pm<avvi4i4i8> %A0,%x2,%x3,%4,%5,%6"
   [(set_attr "type" "mma")
    (set_attr "prefixed" "yes")
    (set_attr "isa" "dm,not_dm,not_dm")])
 
-(define_insn "mma_<vvi4i4i2>"
+(define_insn "mma_pm<vvi4i4i2>"
   [(set (match_operand:XO 0 "accumulator_operand" "=wD,&d,&d")
 	(unspec:XO [(match_operand:V16QI 1 "vsx_register_operand" "wa,v,?wa")
 		    (match_operand:V16QI 2 "vsx_register_operand" "wa,v,?wa")
@@ -703,12 +722,15 @@
 		    (match_operand:SI 5 "const_0_to_3_operand" "n,n,n")]
 		    MMA_VVI4I4I2))]
   "TARGET_MMA"
-  "<vvi4i4i2> %A0,%x1,%x2,%3,%4,%5"
+  "@
+   pmdm<vvi4i4i2> %A0,%x1,%x2,%3,%4,%5
+   pm<vvi4i4i2> %A0,%x1,%x2,%3,%4,%5
+   pm<vvi4i4i2> %A0,%x1,%x2,%3,%4,%5"
   [(set_attr "type" "mma")
    (set_attr "prefixed" "yes")
    (set_attr "isa" "dm,not_dm,not_dm")])
 
-(define_insn "mma_<avvi4i4i2>"
+(define_insn "mma_pm<avvi4i4i2>"
   [(set (match_operand:XO 0 "accumulator_operand" "=wD,&d,&d")
 	(unspec:XO [(match_operand:XO 1 "accumulator_operand" "0,0,0")
 		    (match_operand:V16QI 2 "vsx_register_operand" "wa,v,?wa")
@@ -718,12 +740,15 @@
 		    (match_operand:SI 6 "const_0_to_3_operand" "n,n,n")]
 		    MMA_AVVI4I4I2))]
   "TARGET_MMA"
-  "<avvi4i4i2> %A0,%x2,%x3,%4,%5,%6"
+  "@
+   pm<avvi4i4i2> %A0,%x2,%x3,%4,%5,%6
+   pmdm<avvi4i4i2> %A0,%x2,%x3,%4,%5,%6
+   pm<avvi4i4i2> %A0,%x2,%x3,%4,%5,%6"
   [(set_attr "type" "mma")
    (set_attr "prefixed" "yes")
    (set_attr "isa" "dm,not_dm,not_dm")])
 
-(define_insn "mma_<vvi4i4>"
+(define_insn "mma_pm<vvi4i4>"
   [(set (match_operand:XO 0 "accumulator_operand" "=wD,&d,&d")
 	(unspec:XO [(match_operand:V16QI 1 "vsx_register_operand" "wa,v,?wa")
 		    (match_operand:V16QI 2 "vsx_register_operand" "wa,v,?wa")
@@ -731,12 +756,15 @@
 		    (match_operand:SI 4 "const_0_to_15_operand" "n,n,n")]
 		    MMA_VVI4I4))]
   "TARGET_MMA"
-  "<vvi4i4> %A0,%x1,%x2,%3,%4"
+  "@
+   pmdm<vvi4i4> %A0,%x1,%x2,%3,%4
+   pm<vvi4i4> %A0,%x1,%x2,%3,%4
+   pm<vvi4i4> %A0,%x1,%x2,%3,%4"
   [(set_attr "type" "mma")
    (set_attr "prefixed" "yes")
    (set_attr "isa" "dm,not_dm,not_dm")])
 
-(define_insn "mma_<avvi4i4>"
+(define_insn "mma_pm<avvi4i4>"
   [(set (match_operand:XO 0 "accumulator_operand" "=wD,&d,&d")
 	(unspec:XO [(match_operand:XO 1 "accumulator_operand" "0,0,0")
 		    (match_operand:V16QI 2 "vsx_register_operand" "wa,v,?wa")
@@ -745,12 +773,15 @@
 		    (match_operand:SI 5 "const_0_to_15_operand" "n,n,n")]
 		    MMA_AVVI4I4))]
   "TARGET_MMA"
-  "<avvi4i4> %A0,%x2,%x3,%4,%5"
+  "@
+   pmdm<avvi4i4> %A0,%x2,%x3,%4,%5
+   pm<avvi4i4> %A0,%x2,%x3,%4,%5
+   pm<avvi4i4> %A0,%x2,%x3,%4,%5"
   [(set_attr "type" "mma")
    (set_attr "prefixed" "yes")
    (set_attr "isa" "dm,not_dm,not_dm")])
 
-(define_insn "mma_<pvi4i2>"
+(define_insn "mma_pm<pvi4i2>"
   [(set (match_operand:XO 0 "accumulator_operand" "=wD,&d,&d")
 	(unspec:XO [(match_operand:OO 1 "vsx_register_operand" "wa,v,?wa")
 		    (match_operand:V16QI 2 "vsx_register_operand" "wa,v,?wa")
@@ -758,12 +789,15 @@
 		    (match_operand:SI 4 "const_0_to_3_operand" "n,n,n")]
 		    MMA_PVI4I2))]
   "TARGET_MMA"
-  "<pvi4i2> %A0,%x1,%x2,%3,%4"
+  "@
+   dmpm<pvi4i2> %A0,%x1,%x2,%3,%4
+   dm<pvi4i2> %A0,%x1,%x2,%3,%4
+   dm<pvi4i2> %A0,%x1,%x2,%3,%4"
   [(set_attr "type" "mma")
    (set_attr "prefixed" "yes")
    (set_attr "isa" "dm,not_dm,not_dm")])
 
-(define_insn "mma_<apvi4i2>"
+(define_insn "mma_pm<apvi4i2>"
   [(set (match_operand:XO 0 "accumulator_operand" "=wD,&d,&d")
 	(unspec:XO [(match_operand:XO 1 "accumulator_operand" "0,0,0")
 		    (match_operand:OO 2 "vsx_register_operand" "wa,v,?wa")
@@ -772,12 +806,15 @@
 		    (match_operand:SI 5 "const_0_to_3_operand" "n,n,n")]
 		    MMA_APVI4I2))]
   "TARGET_MMA"
-  "<apvi4i2> %A0,%x2,%x3,%4,%5"
+  "@
+   pmdm<apvi4i2> %A0,%x2,%x3,%4,%5
+   pm<apvi4i2> %A0,%x2,%x3,%4,%5
+   pm<apvi4i2> %A0,%x2,%x3,%4,%5"
   [(set_attr "type" "mma")
    (set_attr "prefixed" "yes")
    (set_attr "isa" "dm,not_dm,not_dm")])
 
-(define_insn "mma_<vvi4i4i4>"
+(define_insn "mma_pm<vvi4i4i4>"
   [(set (match_operand:XO 0 "accumulator_operand" "=wD,&d,&d")
 	(unspec:XO [(match_operand:V16QI 1 "vsx_register_operand" "wa,v,?wa")
 		    (match_operand:V16QI 2 "vsx_register_operand" "wa,v,?wa")
@@ -786,12 +823,15 @@
 		    (match_operand:SI 5 "const_0_to_15_operand" "n,n,n")]
 		    MMA_VVI4I4I4))]
   "TARGET_MMA"
-  "<vvi4i4i4> %A0,%x1,%x2,%3,%4,%5"
+  "@
+   pmdm<vvi4i4i4> %A0,%x1,%x2,%3,%4,%5
+   pm<vvi4i4i4> %A0,%x1,%x2,%3,%4,%5
+   pm<vvi4i4i4> %A0,%x1,%x2,%3,%4,%5"
   [(set_attr "type" "mma")
    (set_attr "prefixed" "yes")
    (set_attr "isa" "dm,not_dm,not_dm")])
 
-(define_insn "mma_<avvi4i4i4>"
+(define_insn "mma_pm<avvi4i4i4>"
   [(set (match_operand:XO 0 "accumulator_operand" "=wD,&d,&d")
 	(unspec:XO [(match_operand:XO 1 "accumulator_operand" "0,0,0")
 		    (match_operand:V16QI 2 "vsx_register_operand" "wa,v,?wa")
@@ -801,7 +841,10 @@
 		    (match_operand:SI 6 "const_0_to_15_operand" "n,n,n")]
 		    MMA_AVVI4I4I4))]
   "TARGET_MMA"
-  "<avvi4i4i4> %A0,%x2,%x3,%4,%5,%6"
+  "@
+   pmdm<avvi4i4i4> %A0,%x2,%x3,%4,%5,%6
+   pm<avvi4i4i4> %A0,%x2,%x3,%4,%5,%6
+   pm<avvi4i4i4> %A0,%x2,%x3,%4,%5,%6"
   [(set_attr "type" "mma")
    (set_attr "prefixed" "yes")
    (set_attr "isa" "dm,not_dm,not_dm")])
diff --git a/gcc/testsuite/gcc.target/powerpc/dm-double-test.c b/gcc/testsuite/gcc.target/powerpc/dm-double-test.c
new file mode 100644
index 000000000000..66c197795856
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/dm-double-test.c
@@ -0,0 +1,194 @@
+/* Test derived from mma-double-1.c, modified for dense math.  */
+/* { dg-do compile } */
+/* { dg-require-effective-target powerpc_dense_math_ok } */
+/* { dg-options "-mdejagnu-cpu=future -O2" } */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <altivec.h>
+
+typedef unsigned char vec_t __attribute__ ((vector_size (16)));
+typedef double v4sf_t __attribute__ ((vector_size (16)));
+#define SAVE_ACC(ACC, ldc, J)  \
+	  __builtin_mma_disassemble_acc (result, ACC); \
+	  rowC = (v4sf_t *) &CO[0*ldc+J]; \
+          rowC[0] += result[0]; \
+          rowC = (v4sf_t *) &CO[1*ldc+J]; \
+          rowC[0] += result[1]; \
+          rowC = (v4sf_t *) &CO[2*ldc+J]; \
+          rowC[0] += result[2]; \
+          rowC = (v4sf_t *) &CO[3*ldc+J]; \
+	  rowC[0] += result[3];
+
+void
+DM (int m, int n, int k, double *A, double *B, double *C)
+{
+  __vector_quad acc0, acc1, acc2, acc3, acc4, acc5, acc6, acc7;
+  v4sf_t result[4];
+  v4sf_t *rowC;
+  for (int l = 0; l < n; l += 4)
+    {
+      double *CO;
+      double *AO;
+      AO = A;
+      CO = C;
+      C += m * 4;
+      for (int j = 0; j < m; j += 16)
+	{
+	  double *BO = B;
+	  __builtin_mma_xxsetaccz (&acc0);
+	  __builtin_mma_xxsetaccz (&acc1);
+	  __builtin_mma_xxsetaccz (&acc2);
+	  __builtin_mma_xxsetaccz (&acc3);
+	  __builtin_mma_xxsetaccz (&acc4);
+	  __builtin_mma_xxsetaccz (&acc5);
+	  __builtin_mma_xxsetaccz (&acc6);
+	  __builtin_mma_xxsetaccz (&acc7);
+	  unsigned long i;
+
+	  for (i = 0; i < k; i++)
+	    {
+	      vec_t *rowA = (vec_t *) & AO[i * 16];
+	      __vector_pair rowB;
+	      vec_t *rb = (vec_t *) & BO[i * 4];
+	      __builtin_mma_assemble_pair (&rowB, rb[1], rb[0]);
+	      __builtin_mma_xvf64gerpp (&acc0, rowB, rowA[0]);
+	      __builtin_mma_xvf64gerpp (&acc1, rowB, rowA[1]);
+	      __builtin_mma_xvf64gerpp (&acc2, rowB, rowA[2]);
+	      __builtin_mma_xvf64gerpp (&acc3, rowB, rowA[3]);
+	      __builtin_mma_xvf64gerpp (&acc4, rowB, rowA[4]);
+	      __builtin_mma_xvf64gerpp (&acc5, rowB, rowA[5]);
+	      __builtin_mma_xvf64gerpp (&acc6, rowB, rowA[6]);
+	      __builtin_mma_xvf64gerpp (&acc7, rowB, rowA[7]);
+	    }
+	  SAVE_ACC (&acc0, m, 0);
+	  SAVE_ACC (&acc2, m, 4);
+	  SAVE_ACC (&acc1, m, 2);
+	  SAVE_ACC (&acc3, m, 6);
+	  SAVE_ACC (&acc4, m, 8);
+	  SAVE_ACC (&acc6, m, 12);
+	  SAVE_ACC (&acc5, m, 10);
+	  SAVE_ACC (&acc7, m, 14);
+	  AO += k * 16;
+	  BO += k * 4;
+	  CO += 16;
+	}
+      B += k * 4;
+    }
+}
+
+void
+init (double *matrix, int row, int column)
+{
+  for (int j = 0; j < column; j++)
+    {
+      for (int i = 0; i < row; i++)
+	{
+	  matrix[j * row + i] = (i * 16 + 2 + j) / 0.123;
+	}
+    }
+}
+
+void
+init0 (double *matrix, double *matrix1, int row, int column)
+{
+  for (int j = 0; j < column; j++)
+    for (int i = 0; i < row; i++)
+      matrix[j * row + i] = matrix1[j * row + i] = 0;
+}
+
+
+void
+print (const char *name, const double *matrix, int row, int column)
+{
+  printf ("Matrix %s has %d rows and %d columns:\n", name, row, column);
+  for (int i = 0; i < row; i++)
+    {
+      for (int j = 0; j < column; j++)
+	{
+	  printf ("%f ", matrix[j * row + i]);
+	}
+      printf ("\n");
+    }
+  printf ("\n");
+}
+
+int
+main (int argc, char *argv[])
+{
+  int rowsA, colsB, common;
+  int i, j, k;
+  int ret = 0;
+
+  for (int t = 16; t <= 128; t += 16)
+    {
+      for (int t1 = 4; t1 <= 16; t1 += 4)
+	{
+	  rowsA = t;
+	  colsB = t1;
+	  common = 1;
+	  /* printf ("Running test for rows = %d,cols = %d\n", t, t1); */
+	  double A[rowsA * common];
+	  double B[common * colsB];
+	  double C[rowsA * colsB];
+	  double D[rowsA * colsB];
+
+
+	  init (A, rowsA, common);
+	  init (B, common, colsB);
+	  init0 (C, D, rowsA, colsB);
+	  DM (rowsA, colsB, common, A, B, C);
+
+	  for (i = 0; i < colsB; i++)
+	    {
+	      for (j = 0; j < rowsA; j++)
+		{
+		  D[i * rowsA + j] = 0;
+		  for (k = 0; k < common; k++)
+		    {
+		      D[i * rowsA + j] +=
+			A[k * rowsA + j] * B[k + common * i];
+		    }
+		}
+	    }
+	  for (i = 0; i < colsB; i++)
+	    {
+	      for (j = 0; j < rowsA; j++)
+		{
+		  for (k = 0; k < common; k++)
+		    {
+		      if (D[i * rowsA + j] != C[i * rowsA + j])
+			{
+			  printf ("Error %d,%d,%d\n",i,j,k);
+			  ret++;
+			}
+		    }
+		}
+	    }
+	  if (ret)
+	    {
+	      print ("A", A, rowsA, common);
+	      print ("B", B, common, colsB);
+	      print ("C", C, rowsA, colsB);
+	      print ("D", D, rowsA, colsB);
+	    }
+	}
+    }
+  
+#ifdef VERBOSE
+  if (ret)
+    printf ("DM double test fail: %d errors\n",ret);
+  else
+    printf ("DM double test success: 0 DM errors\n");
+#else
+  if (ret)
+    abort();
+#endif
+      
+  return ret;
+}
+
+/* { dg-final { scan-assembler {\mdmsetdmrz\M}      } } */
+/* { dg-final { scan-assembler {\mdmxvf64gerpp\M}   } } */
+/* { dg-final { scan-assembler {\mdmxxextfdmr512\M} } } */
+
diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp
index b1faaf4aa955..c1c3b1047ad5 100644
--- a/gcc/testsuite/lib/target-supports.exp
+++ b/gcc/testsuite/lib/target-supports.exp
@@ -7160,6 +7160,25 @@ proc check_effective_target_power10_ok { } {
     }
 }
 
+# Return 1 if this is a PowerPC target supporting -mcpu=future which enables
+# the dense math operations.
+proc check_effective_target_powerpc_dense_math_ok { } {
+	return [check_no_compiler_messages_nocache powerpc_dense_math_ok assembly {
+		__vector_quad vq;
+		void test (void)
+		{
+		#ifndef __PPC_DMR__
+		#error "target does not have dense math support."
+		#else
+		/* Make sure we have dense math support.  */
+		  __vector_quad dmr;
+		  __asm__ ("dmsetaccz %A0" : "=wD" (dmr));
+		  vq = dmr;
+		#endif
+		}
+	} "-mcpu=future"]
+}
+
 # Return 1 if this is a PowerPC target supporting -mfloat128 via either
 # software emulation on power7/power8 systems or hardware support on power9.

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2024-02-09 19:11 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-02-09 19:11 [gcc(refs/users/meissner/heads/work157-dmf)] PowerPC: Switch to dense math names for all MMA operations Michael Meissner

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).