(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
i386/
avx512f-vect-fmaddsubXXXps.c
       1  /* { dg-do run } */
       2  /* { dg-require-effective-target avx512f } */
       3  /* { dg-options "-O3 -mavx512f -mprefer-vector-width=512 -save-temps" } */
       4  
       5  #include "fma-check.h"
       6  void __attribute__((noipa))
       7  check_fmaddsub (float * __restrict a, float *b, float *c, int n)
       8  {
       9    for (int i = 0; i < n; ++i)
      10      {
      11        a[16*i + 0] = b[16*i + 0] * c[16*i + 0] - a[16*i + 0];
      12        a[16*i + 1] = b[16*i + 1] * c[16*i + 1] + a[16*i + 1];
      13        a[16*i + 2] = b[16*i + 2] * c[16*i + 2] - a[16*i + 2];
      14        a[16*i + 3] = b[16*i + 3] * c[16*i + 3] + a[16*i + 3];
      15        a[16*i + 4] = b[16*i + 4] * c[16*i + 4] - a[16*i + 4];
      16        a[16*i + 5] = b[16*i + 5] * c[16*i + 5] + a[16*i + 5];
      17        a[16*i + 6] = b[16*i + 6] * c[16*i + 6] - a[16*i + 6];
      18        a[16*i + 7] = b[16*i + 7] * c[16*i + 7] + a[16*i + 7];
      19        a[16*i + 8] = b[16*i + 8] * c[16*i + 8] - a[16*i + 8];
      20        a[16*i + 9] = b[16*i + 9] * c[16*i + 9] + a[16*i + 9];
      21        a[16*i + 10] = b[16*i + 10] * c[16*i + 10] - a[16*i + 10];
      22        a[16*i + 11] = b[16*i + 11] * c[16*i + 11] + a[16*i + 11];
      23        a[16*i + 12] = b[16*i + 12] * c[16*i + 12] - a[16*i + 12];
      24        a[16*i + 13] = b[16*i + 13] * c[16*i + 13] + a[16*i + 13];
      25        a[16*i + 14] = b[16*i + 14] * c[16*i + 14] - a[16*i + 14];
      26        a[16*i + 15] = b[16*i + 15] * c[16*i + 15] + a[16*i + 15];
      27      }
      28  }
      29  
      30  static void
      31  fma_test (void)
      32  {
      33    if (!__builtin_cpu_supports ("avx512f"))
      34      return;
      35    float a[16], b[16], c[16];
      36    for (int i = 0; i < 16; ++i)
      37      {
      38        a[i] = i;
      39        b[i] = 3*i;
      40        c[i] = 7*i;
      41      }
      42    check_fmaddsub (a, b, c, 1);
      43    const float d[16] = { 0., 22., 82., 192., 332., 530., 750., 1036.,
      44  			1336, 1710., 2090., 2552., 3012., 3562., 4102., 4740.};
      45    for (int i = 0; i < 16; ++i)
      46      if (a[i] != d[i])
      47        __builtin_abort ();
      48  }
      49  
      50  /* { dg-final { scan-assembler {(?n)fmaddsub...ps[ \t].*%zmm[0-9]} } } */