1  /* { dg-do run } */
       2  /* { dg-options "-O2 -mavx512vl -mprefer-vector-width=256" } */
       3  /* { dg-require-effective-target avx512vl } */
       4  
       5  #define AVX512VL
       6  #ifndef CHECK
       7  #define CHECK "avx512f-helper.h"
       8  #endif
       9  
      10  #include CHECK
      11  
      12  #include "cond_op_fma_double-1.c"
      13  #define FMA3_O2(OPNAME, OP1, OP2)				\
      14    void								\
      15    __attribute__ ((noipa,optimize ("O2")))			\
      16    foo3_o2_##OPNAME ()						\
      17    {								\
      18      for (int i = 0; i != NUM; i++)				\
      19        {								\
      20  	TYPE tmp = MAX(d[i], e[i]);				\
      21  	if (b[i] < c[i])					\
      22  	  j[i] = __BUILTIN_FMA (OP1 d[i], e[i], OP2 tmp);	\
      23  	else							\
      24  	  j[i] = tmp;						\
      25        }								\
      26    }
      27  
      28  #define FMAZ_O2(OPNAME, OP1, OP2)				\
      29    void								\
      30    __attribute__ ((noipa,optimize ("O2")))			\
      31    fooz_o2_##OPNAME ()						\
      32    {								\
      33      for (int i = 0; i != NUM; i++)				\
      34        if (b[i] < c[i])						\
      35  	j[i] = __BUILTIN_FMA (OP1 d[i], e[i], OP2 a[i]);	\
      36        else							\
      37  	j[i] = .0;						\
      38    }
      39  
      40  #define FMA1_O2(OPNAME, OP1, OP2)				\
      41    void								\
      42    __attribute__ ((noipa,optimize ("O2")))			\
      43    foo1_o2_##OPNAME ()						\
      44    {								\
      45      for (int i = 0; i != NUM; i++)				\
      46        if (b[i] < c[i])						\
      47  	j[i] = __BUILTIN_FMA (OP1 d[i], e[i], OP2 a[i]);	\
      48        else							\
      49  	j[i] = d[i];						\
      50    }
      51  
      52  FMAZ_O2 (fma,, +);
      53  FMAZ_O2 (fms,, -);
      54  FMAZ_O2 (fnma, -, +);
      55  FMAZ_O2 (fnms, -, -);
      56  
      57  FMA1_O2 (fma,, +);
      58  FMA1_O2 (fms,, -);
      59  FMA1_O2 (fnma, -, +);
      60  FMA1_O2 (fnms, -, -);
      61  
      62  FMA3_O2 (fma,, +);
      63  FMA3_O2 (fms,, -);
      64  FMA3_O2 (fnma, -, +);
      65  FMA3_O2 (fnms, -, -);
      66  
      67  static void
      68  test_256 (void)
      69  {
      70    int sign = -1;
      71    for (int i = 0; i != NUM; i++)
      72      {
      73        a[i] = 0;
      74        d[i] = i * 2;
      75        e[i] = i * i * 3 - i * 9 + 153;
      76        b[i] = i * 83;
      77        c[i] = b[i] + sign;
      78        sign *= -1;
      79        j[i] = 1;
      80      }
      81    foo1_o2_fma ();
      82    /* foo1_fma need to be after foo1_o2_fma since
      83       it changes a[i] which is used by foo1_o2_fma.  */
      84    foo1_fma ();
      85    for (int i = 0; i != NUM; i++)
      86      {
      87        if (a[i] != j[i])
      88  	abort ();
      89        a[i] = 0;
      90        b[i] = 1;
      91      }
      92  
      93    foo1_o2_fms ();
      94    foo1_fms ();
      95    for (int i = 0; i != NUM; i++)
      96      {
      97        if (a[i] != j[i])
      98    	abort ();
      99        a[i] = 0;
     100        j[i] = 1;
     101      }
     102  
     103    foo1_o2_fnma ();
     104    foo1_fnma ();
     105    for (int i = 0; i != NUM; i++)
     106      {
     107        if (a[i] != j[i])
     108    	abort ();
     109        a[i] = 0;
     110        j[i] = 1;
     111      }
     112  
     113    foo1_o2_fnms ();
     114    foo1_fnms ();
     115    for (int i = 0; i != NUM; i++)
     116      {
     117        if (a[i] != j[i])
     118    	abort ();
     119        a[i] = 0;
     120        j[i] = 1;
     121      }
     122  
     123    fooz_o2_fma ();
     124    fooz_fma ();
     125    for (int i = 0; i != NUM; i++)
     126      {
     127        if (a[i] != j[i])
     128    	abort ();
     129        a[i] = 0;
     130        b[i] = 1;
     131      }
     132  
     133    fooz_o2_fms ();
     134    fooz_fms ();
     135    for (int i = 0; i != NUM; i++)
     136      {
     137        if (a[i] != j[i])
     138    	abort ();
     139        a[i] = 0;
     140        j[i] = 1;
     141      }
     142  
     143    fooz_o2_fnma ();
     144    fooz_fnma ();
     145    for (int i = 0; i != NUM; i++)
     146      {
     147        if (a[i] != j[i])
     148    	abort ();
     149        a[i] = 0;
     150        j[i] = 1;
     151      }
     152  
     153    fooz_o2_fnms ();
     154    fooz_fnms ();
     155    for (int i = 0; i != NUM; i++)
     156      {
     157        if (a[i] != j[i])
     158    	abort ();
     159        a[i] = 0;
     160        j[i] = 1;
     161      }
     162  
     163    foo3_o2_fma ();
     164    foo3_fma ();
     165    for (int i = 0; i != NUM; i++)
     166      {
     167        if (a[i] != j[i])
     168    	abort ();
     169        a[i] = 0;
     170        b[i] = 1;
     171      }
     172  
     173    foo3_o2_fms ();
     174    foo3_fms ();
     175    for (int i = 0; i != NUM; i++)
     176      {
     177        if (a[i] != j[i])
     178    	abort ();
     179        a[i] = 0;
     180        j[i] = 1;
     181      }
     182  
     183    foo3_o2_fnma ();
     184    foo3_fnma ();
     185    for (int i = 0; i != NUM; i++)
     186      {
     187        if (a[i] != j[i])
     188    	abort ();
     189        a[i] = 0;
     190        j[i] = 1;
     191      }
     192  
     193    foo3_o2_fnms ();
     194    foo3_fnms ();
     195    for (int i = 0; i != NUM; i++)
     196      {
     197        if (a[i] != j[i])
     198    	abort ();
     199        a[i] = 0;
     200        j[i] = 1;
     201      }
     202  }
     203  
     204  static void
     205  test_128 ()
     206  {
     207    
     208  }