1  /* { dg-do run { target avx512fp16 } } */
       2  /* { dg-options "-O2 -mavx512fp16 -mavx512vl -mprefer-vector-width=512" } */
       3  
       4  static void condmov_test (void);
       5  #define DO_TEST condmov_test
       6  #define AVX512FP16
       7  #define AVX512VL
       8  #include "avx512f-check.h"
       9  #include "avx512fp16-vcondmn-loop-1.c"
      10  
      11  _Float16 a[32], b[32], c[32], fexp[32], fref[32];
      12  s16 sa[32], sb[32], sc[32], sexp[32], sref[32];
      13  u16 ua[32], ub[32], uc[32], uexp[32], uref[32];
      14  
      15  #define EMULATE_CONDMOV_LOOP(size, type, ptype, op, name) \
      16  void \
      17  __attribute__ ((noinline, noclone)) \
      18  scalar_cond_##size##ptype##type##name ( \
      19    ptype * restrict a, ptype * restrict b,	\
      20    type * restrict c, type * restrict d)  \
      21  { \
      22    int i;  \
      23    for (i = 0; i < size; i++)  \
      24      { \
      25        if (a[i] op b[i])	\
      26  	d[i] = c[i];  \
      27      } \
      28  }
      29  
      30  EMULATE_CONDMOV_LOOP (32, _Float16, _Float16, <, lt)
      31  EMULATE_CONDMOV_LOOP (32, _Float16, _Float16, >, gt)
      32  EMULATE_CONDMOV_LOOP (32, _Float16, _Float16, ==, eq)
      33  EMULATE_CONDMOV_LOOP (16, _Float16, _Float16, <, lt)
      34  EMULATE_CONDMOV_LOOP (16, _Float16, _Float16, >, gt)
      35  EMULATE_CONDMOV_LOOP (16, _Float16, _Float16, ==, eq)
      36  EMULATE_CONDMOV_LOOP (8, _Float16, _Float16, <, lt)
      37  EMULATE_CONDMOV_LOOP (8, _Float16, _Float16, >, gt)
      38  EMULATE_CONDMOV_LOOP (8, _Float16, _Float16, ==, eq)
      39  EMULATE_CONDMOV_LOOP (32, _Float16, s16, <, lt)
      40  EMULATE_CONDMOV_LOOP (32, _Float16, s16, >, gt)
      41  EMULATE_CONDMOV_LOOP (32, _Float16, s16, ==, eq)
      42  EMULATE_CONDMOV_LOOP (16, _Float16, s16, <, lt)
      43  EMULATE_CONDMOV_LOOP (16, _Float16, s16, >, gt)
      44  EMULATE_CONDMOV_LOOP (16, _Float16, s16, ==, eq)
      45  EMULATE_CONDMOV_LOOP (8, _Float16, s16, <, lt)
      46  EMULATE_CONDMOV_LOOP (8, _Float16, s16, >, gt)
      47  EMULATE_CONDMOV_LOOP (8, _Float16, s16, ==, eq)
      48  EMULATE_CONDMOV_LOOP (32, s16, _Float16, <, lt)
      49  EMULATE_CONDMOV_LOOP (32, s16, _Float16, >, gt)
      50  EMULATE_CONDMOV_LOOP (32, s16, _Float16, ==, eq)
      51  EMULATE_CONDMOV_LOOP (16, s16, _Float16, <, lt)
      52  EMULATE_CONDMOV_LOOP (16, s16, _Float16, >, gt)
      53  EMULATE_CONDMOV_LOOP (16, s16, _Float16, ==, eq)
      54  EMULATE_CONDMOV_LOOP (8, s16, _Float16, <, lt)
      55  EMULATE_CONDMOV_LOOP (8, s16, _Float16, >, gt)
      56  EMULATE_CONDMOV_LOOP (8, s16, _Float16, ==, eq)
      57  EMULATE_CONDMOV_LOOP (32, _Float16, u16, <, lt)
      58  EMULATE_CONDMOV_LOOP (32, _Float16, u16, >, gt)
      59  EMULATE_CONDMOV_LOOP (32, _Float16, u16, ==, eq)
      60  EMULATE_CONDMOV_LOOP (16, _Float16, u16, <, lt)
      61  EMULATE_CONDMOV_LOOP (16, _Float16, u16, >, gt)
      62  EMULATE_CONDMOV_LOOP (16, _Float16, u16, ==, eq)
      63  EMULATE_CONDMOV_LOOP (8, _Float16, u16, <, lt)
      64  EMULATE_CONDMOV_LOOP (8, _Float16, u16, >, gt)
      65  EMULATE_CONDMOV_LOOP (8, _Float16, u16, ==, eq)
      66  EMULATE_CONDMOV_LOOP (32, u16, _Float16, <, lt)
      67  EMULATE_CONDMOV_LOOP (32, u16, _Float16, >, gt)
      68  EMULATE_CONDMOV_LOOP (32, u16, _Float16, ==, eq)
      69  EMULATE_CONDMOV_LOOP (16, u16, _Float16, <, lt)
      70  EMULATE_CONDMOV_LOOP (16, u16, _Float16, >, gt)
      71  EMULATE_CONDMOV_LOOP (16, u16, _Float16, ==, eq)
      72  EMULATE_CONDMOV_LOOP (8, u16, _Float16, <, lt)
      73  EMULATE_CONDMOV_LOOP (8, u16, _Float16, >, gt)
      74  EMULATE_CONDMOV_LOOP (8, u16, _Float16, ==, eq)
      75  
      76  void init()
      77  {
      78    int i;
      79    for (i = 0; i < 32; i++)
      80      {
      81        ua[i] = sa[i] = a[i] = i; 
      82        ub[i] = sb[i] = b[i] = i;
      83        uc[i] = sc[i] = c[i] = (32 - i) * 2;
      84        uexp[i] = sexp[i] = fexp[i] = -1;
      85        uref[i] = sref[i] = fref[i] = -1;
      86      }
      87  }
      88  
      89  int check_cond(void *a, void *b, int size)
      90  {
      91    int i;
      92    u16 *pa = (u16 *)a, *pb = (u16 *)b;
      93    for (i = 0; i < size; i++)
      94      if (pa[i] != pb[i])
      95        return 0;
      96    return 1;
      97  }
      98  
      99  #define TEST_CONDMOV_LOOP(size, name)	\
     100  { \
     101    init ();  \
     102    scalar_cond_##size##_Float16_Float16##name (a, b, c, fexp);  \
     103    loop_cond_##size##_Float16_Float16##name (a, b, c, fref);  \
     104    if (!check_cond ((void *)fexp, (void *)fref, size)) \
     105      abort();  \
     106    \
     107    init ();  \
     108    scalar_cond_##size##_Float16s16##name (a, b, sc, sexp);  \
     109    loop_cond_##size##_Float16s16##name (a, b, sc, sref);  \
     110    if (!check_cond ((void *)sexp, (void *)sref, size)) \
     111      abort();  \
     112    \
     113    init ();  \
     114    scalar_cond_##size##s16_Float16##name (sa, sb, c, fexp);  \
     115    loop_cond_##size##s16_Float16##name (sa, sb, c, fref);  \
     116    if (!check_cond ((void *)fexp, (void *)fref, size)) \
     117      abort();  \
     118    \
     119    init ();  \
     120    scalar_cond_##size##_Float16u16##name (a, b, uc, uexp);  \
     121    loop_cond_##size##_Float16u16##name (a, b, uc, uref);  \
     122    if (!check_cond ((void *)uexp, (void *)uref, size)) \
     123      abort();  \
     124    \
     125    init ();  \
     126    scalar_cond_##size##u16_Float16##name (ua, ub, c, fexp);  \
     127    loop_cond_##size##u16_Float16##name (ua, ub, c, fref);  \
     128    if (!check_cond ((void *)fexp, (void *)fref, size)) \
     129      abort();  \
     130  }
     131  
     132  static void condmov_test()
     133  {
     134    TEST_CONDMOV_LOOP (32, lt)
     135    TEST_CONDMOV_LOOP (32, gt)
     136    TEST_CONDMOV_LOOP (32, eq)
     137    TEST_CONDMOV_LOOP (16, lt)
     138    TEST_CONDMOV_LOOP (16, gt)
     139    TEST_CONDMOV_LOOP (16, eq)
     140    TEST_CONDMOV_LOOP (8, lt)
     141    TEST_CONDMOV_LOOP (8, gt)
     142    TEST_CONDMOV_LOOP (8, eq)
     143  }