1  /* { dg-do run } */
       2  /* { dg-require-effective-target avx512f } */
       3  /* { dg-options "-O2 -mavx512f" } */
       4  
       5  #include "avx512-check.h"
       6  
       7  #include "pr88547-1.c"
       8  
       9  #define NUM 512
      10  
      11  #define TEST_SIGNED(vtype, type, N, fn, op) \
      12  do								\
      13    {								\
      14      union { vtype x[NUM / N]; type i[NUM]; } dst, src1, src2;	\
      15      int i, sign = 1;						\
      16      type res;							\
      17      for (i = 0; i < NUM; i++)					\
      18        {								\
      19  	src1.i[i] = i * i * sign;				\
      20  	src2.i[i] = (i + 20) * sign;				\
      21  	sign = -sign;						\
      22        }								\
      23      for (i = 0; i < NUM; i += N)				\
      24        dst.x[i / N] = fn (src1.x[i / N], src2.x[i / N]);		\
      25  								\
      26      for (i = 0; i < NUM; i++)					\
      27        {								\
      28  	res = src1.i[i] op src2.i[i] ? -1 : 0;			\
      29  	if (res != dst.i[i])					\
      30  	  abort ();						\
      31        }								\
      32    }								\
      33  while (0)
      34  
      35  #define TEST_UNSIGNED(vtype, type, N, fn, op) \
      36  do								\
      37    {								\
      38      union { vtype x[NUM / N]; type i[NUM]; } dst, src1, src2;	\
      39      int i;							\
      40      type res;							\
      41  								\
      42      for (i = 0; i < NUM; i++)					\
      43        {								\
      44  	src1.i[i] = i * i;					\
      45  	src2.i[i] = i + 20;					\
      46  	if ((i % 4))						\
      47  	  src2.i[i] |= (1ULL << (sizeof (type)			\
      48  				 * __CHAR_BIT__ - 1));		\
      49        }								\
      50  								\
      51      for (i = 0; i < NUM; i += N)				\
      52        dst.x[i / N] = fn (src1.x[i / N], src2.x[i / N]);		\
      53  								\
      54      for (i = 0; i < NUM; i++)					\
      55        {								\
      56  	res = src1.i[i] op src2.i[i] ? -1 : 0;			\
      57  	if (res != dst.i[i])					\
      58  	  abort ();						\
      59        }								\
      60    }								\
      61  while (0)
      62  
      63  static void
      64  test_512 (void)
      65  {
      66    TEST_SIGNED (v64qi, signed char, 64, f1, <=);
      67    TEST_UNSIGNED (v64uqi, unsigned char, 64, f2, <=);
      68    TEST_SIGNED (v64qi, signed char, 64, f3, >=);
      69    TEST_UNSIGNED (v64uqi, unsigned char, 64, f4, >=);
      70    TEST_SIGNED (v32hi, short int, 32, f5, <=);
      71    TEST_UNSIGNED (v32uhi, unsigned short int, 32, f6, <=);
      72    TEST_SIGNED (v32hi, short int, 32, f7, >=);
      73    TEST_UNSIGNED (v32uhi, unsigned short int, 32, f8, >=);
      74    TEST_SIGNED (v16si, int, 16, f9, <=);
      75    TEST_UNSIGNED (v16usi, unsigned int, 16, f10, <=);
      76    TEST_SIGNED (v16si, int, 16, f11, >=);
      77    TEST_UNSIGNED (v16usi, unsigned int, 16, f12, >=);
      78    TEST_SIGNED (v8di, long long int, 8, f13, <=);
      79    TEST_UNSIGNED (v8udi, unsigned long long int, 8, f14, <=);
      80    TEST_SIGNED (v8di, long long int, 8, f15, >=);
      81    TEST_UNSIGNED (v8udi, unsigned long long int, 8, f16, >=);
      82  }