1  /* { dg-do run { target avx512fp16 } } */
       2  /* { dg-options "-O2 -mavx512fp16 -mavx512vl" } */
       3  
       4  static void vec_op_test (void);
       5  #define DO_TEST vec_op_test
       6  #define AVX512FP16
       7  #define AVX512VL
       8  #include "avx512f-check.h"
       9  #include "avx512fp16-64-32-vecop-1.c"
      10  
      11  _Float16 a[4], b[4], fexp[4], fref[4];
      12  
      13  #define EMULATE_VEC_OP_VV(size, op, name) \
      14  void \
      15  __attribute__ ((noinline, noclone)) \
      16  scalar_vecop_v##size##hf##name ( \
      17    _Float16 * restrict dst, _Float16 * restrict src1,  \
      18    _Float16 * restrict src2)  \
      19  { \
      20    int i;  \
      21    for (i = 0; i < size; i++)  \
      22      dst[i] = src1[i] op src2[i];  \
      23  }
      24  
      25  EMULATE_VEC_OP_VV (4, +, add)
      26  EMULATE_VEC_OP_VV (2, +, add)
      27  EMULATE_VEC_OP_VV (4, -, sub)
      28  EMULATE_VEC_OP_VV (2, -, sub)
      29  EMULATE_VEC_OP_VV (4, *, mul)
      30  EMULATE_VEC_OP_VV (2, *, mul)
      31  EMULATE_VEC_OP_VV (4, /, div)
      32  EMULATE_VEC_OP_VV (2, /, div)
      33  
      34  void init()
      35  {
      36    int i;
      37    for (i = 0; i < 4; i++)
      38      {
      39        a[i] = i + 0.5; 
      40        b[i] = i * 1.5;
      41        fexp[i] = fref[i] = 2.75 * i;
      42      }
      43  }
      44  
      45  int check_cond(void *a, void *b, int size)
      46  {
      47    int i;
      48    unsigned short *pa = (unsigned short *)a,
      49  		 *pb = (unsigned short *)b;
      50    for (i = 0; i < size; i++)
      51      if (pa[i] != pb[i])
      52        return 0;
      53    return 1;
      54  }
      55  
      56  #define TEST_VEC_OP_VV(size, name)	\
      57  { \
      58    init ();  \
      59    scalar_vecop_v##size##hf##name (a, b, fexp);  \
      60    vecop_v##size##hf##name (a, b, fref);  \
      61    if (!check_cond ((void *)fexp, (void *)fref, size)) \
      62      abort();  \
      63  }
      64  
      65  static void vec_op_test()
      66  {
      67    TEST_VEC_OP_VV (4, add)
      68    TEST_VEC_OP_VV (2, add)
      69    TEST_VEC_OP_VV (4, sub)
      70    TEST_VEC_OP_VV (2, sub)
      71    TEST_VEC_OP_VV (4, mul)
      72    TEST_VEC_OP_VV (2, mul)
      73    TEST_VEC_OP_VV (4, div)
      74    TEST_VEC_OP_VV (2, div)
      75  }