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 <[email protected]>
>
> 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.
>