1  /* { dg-do run } */
       2  /* { dg-require-effective-target avx512f } */
       3  /* { dg-options "-O3 -mfma -save-temps -mavx512f -mprefer-vector-width=512" } */
       4  
       5  #include "fma-check.h"
       6  void __attribute__((noipa))
       7  check_fmaddsub (double * __restrict a, double *b, double *c, int n)
       8  {
       9    for (int i = 0; i < n; ++i)
      10      {
      11        a[8*i + 0] = b[8*i + 0] * c[8*i + 0] - a[8*i + 0];
      12        a[8*i + 1] = b[8*i + 1] * c[8*i + 1] + a[8*i + 1];
      13        a[8*i + 2] = b[8*i + 2] * c[8*i + 2] - a[8*i + 2];
      14        a[8*i + 3] = b[8*i + 3] * c[8*i + 3] + a[8*i + 3];
      15        a[8*i + 4] = b[8*i + 4] * c[8*i + 4] - a[8*i + 4];
      16        a[8*i + 5] = b[8*i + 5] * c[8*i + 5] + a[8*i + 5];
      17        a[8*i + 6] = b[8*i + 6] * c[8*i + 6] - a[8*i + 6];
      18        a[8*i + 7] = b[8*i + 7] * c[8*i + 7] + a[8*i + 7];
      19      }
      20  }
      21  
      22  static void
      23  fma_test (void)
      24  {
      25    if (!__builtin_cpu_supports ("avx512f"))
      26      return;
      27    double a[8], b[8], c[8];
      28    for (int i = 0; i < 8; ++i)
      29      {
      30        a[i] = i;
      31        b[i] = 3*i;
      32        c[i] = 7*i;
      33      }
      34    check_fmaddsub (a, b, c, 1);
      35    const double d[8] = { 0., 22., 82., 192., 332., 530., 750., 1036.};
      36    for (int i = 0; i < 8; ++i)
      37      if (a[i] != d[i])
      38        __builtin_abort ();
      39  }
      40  
      41  /* { dg-final { scan-assembler {(?n)fmaddsub...pd[ \t].*%zmm[0-9]} } } */