Hi Mike,

on 2024/1/6 07:40, Michael Meissner wrote:
> 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?
> 
> 2024-01-05   Michael Meissner  <meiss...@linux.ibm.com>
> 
> gcc/
> 
>       * config/rs6000/mma.md (vvi4i4i8_dm): New int attribute.
>       (avvi4i4i8_dm): Likewise.
>       (vvi4i4i2_dm): Likewise.
>       (avvi4i4i2_dm): Likewise.
>       (vvi4i4_dm): Likewise.
>       (avvi4i4_dm): Likewise.
>       (pvi4i2_dm): Likewise.
>       (apvi4i2_dm): Likewise.
>       (vvi4i4i4_dm): Likewise.
>       (avvi4i4i4_dm): Likewise.
>       (mma_<vv>): Add support for running on DMF systems, generating the dense
>       math instruction and using the dense math accumulators.
>       (mma_<avv>): Likewise.
>       (mma_<pv>): Likewise.
>       (mma_<apv>): Likewise.
>       (mma_<vvi4i4i8>): Likewise.
>       (mma_<avvi4i4i8>): Likewise.
>       (mma_<vvi4i4i2>): Likewise.
>       (mma_<avvi4i4i2>): Likewise.
>       (mma_<vvi4i4>): Likewise.
>       (mma_<avvi4i4): Likewise.
>       (mma_<pvi4i2>): Likewise.
>       (mma_<apvi4i2): Likewise.
>       (mma_<vvi4i4i4>): Likewise.
>       (mma_<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.
> ---
>  gcc/config/rs6000/mma.md                      |  98 +++++++--
>  .../gcc.target/powerpc/dm-double-test.c       | 194 ++++++++++++++++++
>  gcc/testsuite/lib/target-supports.exp         |  19 ++
>  3 files changed, 299 insertions(+), 12 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/dm-double-test.c
> 
> diff --git a/gcc/config/rs6000/mma.md b/gcc/config/rs6000/mma.md
> index 525a85146ff..f06e6bbb184 100644
> --- a/gcc/config/rs6000/mma.md
> +++ b/gcc/config/rs6000/mma.md
> @@ -227,13 +227,22 @@ (define_int_attr apv            [(UNSPEC_MMA_XVF64GERPP 
>         "xvf64gerpp")
>  
>  (define_int_attr vvi4i4i8    [(UNSPEC_MMA_PMXVI4GER8         "pmxvi4ger8")])
>  
> +(define_int_attr vvi4i4i8_dm [(UNSPEC_MMA_PMXVI4GER8         
> "pmdmxvi4ger8")])

Can we update vvi4i4i8 to

(define_int_attr vvi4i4i8       [(UNSPEC_MMA_PMXVI4GER8         "xvi4ger8")])

by avoiding to introduce vvi4i4i8_dm, then its use places would be like:

-  "<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"

and 

- define_insn "mma_<vvi4i4i8>"
+ define_insn "mma_pm<vvi4i4i8>"

(or updating its use in corresponding bif expander field)

?  

This comment is also applied for the other iterators changes.

> +
>  (define_int_attr avvi4i4i8   [(UNSPEC_MMA_PMXVI4GER8PP       
> "pmxvi4ger8pp")])
>  
> +(define_int_attr avvi4i4i8_dm        [(UNSPEC_MMA_PMXVI4GER8PP       
> "pmdmxvi4ger8pp")])
> +
>  (define_int_attr vvi4i4i2    [(UNSPEC_MMA_PMXVI16GER2        "pmxvi16ger2")
>                                (UNSPEC_MMA_PMXVI16GER2S       "pmxvi16ger2s")
>                                (UNSPEC_MMA_PMXVF16GER2        "pmxvf16ger2")
>                                (UNSPEC_MMA_PMXVBF16GER2       
> "pmxvbf16ger2")])
>  
> +(define_int_attr vvi4i4i2_dm [(UNSPEC_MMA_PMXVI16GER2        "pmdmxvi16ger2")
> +                              (UNSPEC_MMA_PMXVI16GER2S       
> "pmdmxvi16ger2s")
> +                              (UNSPEC_MMA_PMXVF16GER2        "pmdmxvf16ger2")
> +                              (UNSPEC_MMA_PMXVBF16GER2       
> "pmdmxvbf16ger2")])
> +
>  (define_int_attr avvi4i4i2   [(UNSPEC_MMA_PMXVI16GER2PP      "pmxvi16ger2pp")
>                                (UNSPEC_MMA_PMXVI16GER2SPP     
> "pmxvi16ger2spp")
>                                (UNSPEC_MMA_PMXVF16GER2PP      "pmxvf16ger2pp")
> @@ -245,25 +254,54 @@ (define_int_attr avvi4i4i2      
> [(UNSPEC_MMA_PMXVI16GER2PP      "pmxvi16ger2pp")
>                                (UNSPEC_MMA_PMXVBF16GER2NP     
> "pmxvbf16ger2np")
>                                (UNSPEC_MMA_PMXVBF16GER2NN     
> "pmxvbf16ger2nn")])
>  
> +(define_int_attr avvi4i4i2_dm        [(UNSPEC_MMA_PMXVI16GER2PP      
> "pmdmxvi16ger2pp")
> +                              (UNSPEC_MMA_PMXVI16GER2SPP     
> "pmdmxvi16ger2spp")
> +                              (UNSPEC_MMA_PMXVF16GER2PP      
> "pmdmxvf16ger2pp")
> +                              (UNSPEC_MMA_PMXVF16GER2PN      
> "pmdmxvf16ger2pn")
> +                              (UNSPEC_MMA_PMXVF16GER2NP      
> "pmdmxvf16ger2np")
> +                              (UNSPEC_MMA_PMXVF16GER2NN      
> "pmdmxvf16ger2nn")
> +                              (UNSPEC_MMA_PMXVBF16GER2PP     
> "pmdmxvbf16ger2pp")
> +                              (UNSPEC_MMA_PMXVBF16GER2PN     
> "pmdmxvbf16ger2pn")
> +                              (UNSPEC_MMA_PMXVBF16GER2NP     
> "pmdmxvbf16ger2np")
> +                              (UNSPEC_MMA_PMXVBF16GER2NN     
> "pmdmxvbf16ger2nn")])
> +
>  (define_int_attr vvi4i4              [(UNSPEC_MMA_PMXVF32GER         
> "pmxvf32ger")])
>  
> +(define_int_attr vvi4i4_dm   [(UNSPEC_MMA_PMXVF32GER         
> "pmdmxvf32ger")])
> +
>  (define_int_attr avvi4i4     [(UNSPEC_MMA_PMXVF32GERPP       "pmxvf32gerpp")
>                                (UNSPEC_MMA_PMXVF32GERPN       "pmxvf32gerpn")
>                                (UNSPEC_MMA_PMXVF32GERNP       "pmxvf32gernp")
>                                (UNSPEC_MMA_PMXVF32GERNN       
> "pmxvf32gernn")])
>  
> +(define_int_attr avvi4i4_dm  [(UNSPEC_MMA_PMXVF32GERPP       
> "pmdmxvf32gerpp")
> +                              (UNSPEC_MMA_PMXVF32GERPN       
> "pmdmxvf32gerpn")
> +                              (UNSPEC_MMA_PMXVF32GERNP       
> "pmdmxvf32gernp")
> +                              (UNSPEC_MMA_PMXVF32GERNN       
> "pmdmxvf32gernn")])
> +
>  (define_int_attr pvi4i2              [(UNSPEC_MMA_PMXVF64GER         
> "pmxvf64ger")])
>  
> +(define_int_attr pvi4i2_dm   [(UNSPEC_MMA_PMXVF64GER         
> "pmdmxvf64ger")])
> +
>  (define_int_attr apvi4i2     [(UNSPEC_MMA_PMXVF64GERPP       "pmxvf64gerpp")
>                                (UNSPEC_MMA_PMXVF64GERPN       "pmxvf64gerpn")
>                                (UNSPEC_MMA_PMXVF64GERNP       "pmxvf64gernp")
>                                (UNSPEC_MMA_PMXVF64GERNN       
> "pmxvf64gernn")])
>  
> +(define_int_attr apvi4i2_dm  [(UNSPEC_MMA_PMXVF64GERPP       
> "pmdmxvf64gerpp")
> +                              (UNSPEC_MMA_PMXVF64GERPN       
> "pmdmxvf64gerpn")
> +                              (UNSPEC_MMA_PMXVF64GERNP       
> "pmdmxvf64gernp")
> +                              (UNSPEC_MMA_PMXVF64GERNN       
> "pmdmxvf64gernn")])
> +
>  (define_int_attr vvi4i4i4    [(UNSPEC_MMA_PMXVI8GER4         "pmxvi8ger4")])
>  
> +(define_int_attr vvi4i4i4_dm [(UNSPEC_MMA_PMXVI8GER4         
> "pmdmxvi8ger4")])
> +
>  (define_int_attr avvi4i4i4   [(UNSPEC_MMA_PMXVI8GER4PP       "pmxvi8ger4pp")
>                                (UNSPEC_MMA_PMXVI8GER4SPP      
> "pmxvi8ger4spp")])
>  
> +(define_int_attr avvi4i4i4_dm        [(UNSPEC_MMA_PMXVI8GER4PP       
> "pmdmxvi8ger4pp")
> +                              (UNSPEC_MMA_PMXVI8GER4SPP      
> "pmdmxvi8ger4spp")])
>  
>  ;; Vector pair support.  OOmode can only live in VSRs.
>  (define_expand "movoo"
> @@ -629,7 +667,10 @@ (define_insn "mma_<vv>"
>                   (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 +691,10 @@ (define_insn "mma_<pv>"
>                   (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,7 +705,10 @@ (define_insn "mma_<apv>"
>                   (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")])
>  
> @@ -674,7 +721,10 @@ (define_insn "mma_<vvi4i4i8>"
>                   (match_operand:SI 5 "u8bit_cint_operand" "n,n,n")]
>                   MMA_VVI4I4I8))]
>    "TARGET_MMA"
> -  "<vvi4i4i8> %A0,%x1,%x2,%3,%4,%5"
> +  "@
> +   dm<vvi4i4i8> %A0,%x1,%x2,%3,%4,%5

typo?  I think you meant <vvi4i4i8_dm>, but it doesn't matter any more with the
above suggestion.

> +   <vvi4i4i8> %A0,%x1,%x2,%3,%4,%5
> +   <vvi4i4i8> %A0,%x1,%x2,%3,%4,%5"
>    [(set_attr "type" "mma")
>     (set_attr "prefixed" "yes")
>     (set_attr "isa" "dm,not_dm,not_dm")])
> @@ -703,7 +753,10 @@ (define_insn "mma_<vvi4i4i2>"
>                   (match_operand:SI 5 "const_0_to_3_operand" "n,n,n")]
>                   MMA_VVI4I4I2))]
>    "TARGET_MMA"
> -  "<vvi4i4i2> %A0,%x1,%x2,%3,%4,%5"
> +  "@
> +   <vvi4i4i2_dm> %A0,%x1,%x2,%3,%4,%5
> +   <vvi4i4i2> %A0,%x1,%x2,%3,%4,%5
> +   <vvi4i4i2> %A0,%x1,%x2,%3,%4,%5"
>    [(set_attr "type" "mma")
>     (set_attr "prefixed" "yes")
>     (set_attr "isa" "dm,not_dm,not_dm")])
> @@ -718,7 +771,10 @@ (define_insn "mma_<avvi4i4i2>"
>                   (match_operand:SI 6 "const_0_to_3_operand" "n,n,n")]
>                   MMA_AVVI4I4I2))]
>    "TARGET_MMA"
> -  "<avvi4i4i2> %A0,%x2,%x3,%4,%5,%6"
> +  "@
> +   <avvi4i4i2_dm> %A0,%x2,%x3,%4,%5,%6
> +   <avvi4i4i2> %A0,%x2,%x3,%4,%5,%6
> +   <avvi4i4i2> %A0,%x2,%x3,%4,%5,%6"
>    [(set_attr "type" "mma")
>     (set_attr "prefixed" "yes")
>     (set_attr "isa" "dm,not_dm,not_dm")])
> @@ -731,7 +787,10 @@ (define_insn "mma_<vvi4i4>"
>                   (match_operand:SI 4 "const_0_to_15_operand" "n,n,n")]
>                   MMA_VVI4I4))]
>    "TARGET_MMA"
> -  "<vvi4i4> %A0,%x1,%x2,%3,%4"
> +  "@
> +   <vvi4i4_dm> %A0,%x1,%x2,%3,%4
> +   <vvi4i4> %A0,%x1,%x2,%3,%4
> +   <vvi4i4> %A0,%x1,%x2,%3,%4"
>    [(set_attr "type" "mma")
>     (set_attr "prefixed" "yes")
>     (set_attr "isa" "dm,not_dm,not_dm")])
> @@ -745,7 +804,10 @@ (define_insn "mma_<avvi4i4>"
>                   (match_operand:SI 5 "const_0_to_15_operand" "n,n,n")]
>                   MMA_AVVI4I4))]
>    "TARGET_MMA"
> -  "<avvi4i4> %A0,%x2,%x3,%4,%5"
> +  "@
> +   <avvi4i4_dm> %A0,%x2,%x3,%4,%5
> +   <avvi4i4> %A0,%x2,%x3,%4,%5
> +   <avvi4i4> %A0,%x2,%x3,%4,%5"
>    [(set_attr "type" "mma")
>     (set_attr "prefixed" "yes")
>     (set_attr "isa" "dm,not_dm,not_dm")])
> @@ -758,7 +820,10 @@ (define_insn "mma_<pvi4i2>"
>                   (match_operand:SI 4 "const_0_to_3_operand" "n,n,n")]
>                   MMA_PVI4I2))]
>    "TARGET_MMA"
> -  "<pvi4i2> %A0,%x1,%x2,%3,%4"
> +  "@
> +   <pvi4i2_dm> %A0,%x1,%x2,%3,%4
> +   <pvi4i2> %A0,%x1,%x2,%3,%4
> +   <pvi4i2> %A0,%x1,%x2,%3,%4"
>    [(set_attr "type" "mma")
>     (set_attr "prefixed" "yes")
>     (set_attr "isa" "dm,not_dm,not_dm")])
> @@ -772,7 +837,10 @@ (define_insn "mma_<apvi4i2>"
>                   (match_operand:SI 5 "const_0_to_3_operand" "n,n,n")]
>                   MMA_APVI4I2))]
>    "TARGET_MMA"
> -  "<apvi4i2> %A0,%x2,%x3,%4,%5"
> +  "@
> +   <apvi4i2_dm> %A0,%x2,%x3,%4,%5
> +   <apvi4i2> %A0,%x2,%x3,%4,%5
> +   <apvi4i2> %A0,%x2,%x3,%4,%5"
>    [(set_attr "type" "mma")
>     (set_attr "prefixed" "yes")
>     (set_attr "isa" "dm,not_dm,not_dm")])
> @@ -786,7 +854,10 @@ (define_insn "mma_<vvi4i4i4>"
>                   (match_operand:SI 5 "const_0_to_15_operand" "n,n,n")]
>                   MMA_VVI4I4I4))]
>    "TARGET_MMA"
> -  "<vvi4i4i4> %A0,%x1,%x2,%3,%4,%5"
> +  "@
> +   <vvi4i4i4_dm> %A0,%x1,%x2,%3,%4,%5
> +   <vvi4i4i4> %A0,%x1,%x2,%3,%4,%5
> +   <vvi4i4i4> %A0,%x1,%x2,%3,%4,%5"
>    [(set_attr "type" "mma")
>     (set_attr "prefixed" "yes")
>     (set_attr "isa" "dm,not_dm,not_dm")])
> @@ -801,7 +872,10 @@ (define_insn "mma_<avvi4i4i4>"
>                   (match_operand:SI 6 "const_0_to_15_operand" "n,n,n")]
>                   MMA_AVVI4I4I4))]
>    "TARGET_MMA"
> -  "<avvi4i4i4> %A0,%x2,%x3,%4,%5,%6"
> +  "@
> +   <avvi4i4i4_dm> %A0,%x2,%x3,%4,%5,%6
> +   <avvi4i4i4> %A0,%x2,%x3,%4,%5,%6
> +   <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 00000000000..66c19779585
> --- /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 1b4a3fb18df..2dec3682a2f 100644
> --- a/gcc/testsuite/lib/target-supports.exp
> +++ b/gcc/testsuite/lib/target-supports.exp
> @@ -7101,6 +7101,25 @@ proc check_effective_target_power10_ok { } {
>      }
>  }
>  
> +# Return 1 if this is a PowerPC target supporting -mcpu=future or 
> -mdense-math

s/ or -mdense-math//

The others look good to me, thanks!

BR,
Kewen

> +# 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.
>  

Reply via email to