(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
i386/
avx512bw-pr92686-movcc-2.c
       1  /* { dg-do run } */
       2  /* { dg-require-effective-target avx512bw } */
       3  /* { dg-require-effective-target avx512vl } */
       4  /* { dg-options "-Ofast -mavx512bw -mavx512vl -mprefer-vector-width=256" } */
       5  
       6  #ifndef CHECK
       7  #define CHECK "avx512f-helper.h"
       8  #endif
       9  
      10  #include CHECK
      11  
      12  #ifndef TEST
      13  #define TEST avx512bw_test
      14  #endif
      15  
      16  #include "avx512bw-pr92686-movcc-1.c"
      17  #include "pr92686.inc"
      18  
      19  #define NUM 512
      20  
      21  
      22  #define TEST_SIGNED(vtype, type, N, fn, fn2, op)		\
      23  do								\
      24    {								\
      25      type dst[NUM], src1[NUM], src2[NUM];			\
      26      int i, j,  sign = 1;					\
      27      type res[N];						\
      28      for (i = 0; i < NUM; i++)					\
      29        {								\
      30  	src1[i] = i * i * sign;					\
      31  	src2[i] = (i + 20) * sign;				\
      32  	dst[i] = i * i * i + 100;				\
      33  	sign = -sign;						\
      34        }								\
      35      for (i = 0; i < NUM; i += N)				\
      36        {								\
      37  	for (j = 0; j < N; j++)					\
      38  	  res[j] = dst[i + j];					\
      39  	fn (&dst[i], &src1[i], &src2[i]);			\
      40  	for (j = 0; j < N; j++)					\
      41  	  {							\
      42  	    res[j] = fn2 (res[j], src1[i + j],			\
      43  			  src2[i+ j], op);			\
      44  	    if (res[j] != dst[i+ j])				\
      45  	      abort();						\
      46  	  }							\
      47        }								\
      48    }								\
      49  while (0)
      50  
      51  #define TEST_UNSIGNED(vtype, type, N, fn, fn2, op)		\
      52  do								\
      53    {								\
      54      type dst[NUM], src1[NUM], src2[NUM];			\
      55      int i,j;							\
      56      type res[N];						\
      57  								\
      58      for (i = 0; i < NUM; i++)					\
      59        {								\
      60  	src1[i] = i * i;					\
      61  	src2[i] = i + 20;					\
      62  	dst[i] = i * i * i + 100;				\
      63  	if ((i % 4))						\
      64  	  src2[i] |= (1ULL << (sizeof (type)			\
      65  				 * __CHAR_BIT__ - 1));		\
      66        }								\
      67      for (i = 0; i < NUM; i += N)				\
      68        {								\
      69  	for (j = 0; j < N; j++)					\
      70  	  res[j] = dst[i + j];					\
      71  	fn (&dst[i], &src1[i], &src2[i]);			\
      72  	for (j = 0; j < N; j++)					\
      73  	  {							\
      74  	    res[j] = fn2 (res[j], src1[i + j],			\
      75  			  src2[i + j], op);			\
      76  	    if (res[j] != dst[i + j])				\
      77  	      abort();						\
      78  	  }							\
      79        }								\
      80    }								\
      81  while (0)
      82  
      83  static void
      84  TEST (void)
      85  {
      86    TEST_SIGNED (v64qi, signed char, 64, f1, cmpb, 5);
      87    TEST_UNSIGNED (v64uqi, unsigned char, 64, f2, cmpub, 5);
      88    TEST_SIGNED (v64qi, signed char, 64, f3, cmpb, 2);
      89    TEST_UNSIGNED (v64uqi, unsigned char, 64, f4, cmpub, 2);
      90    TEST_SIGNED (v32hi, short int, 32, f5, cmpw, 5);
      91    TEST_UNSIGNED (v32uhi, unsigned short int, 32, f6, cmpuw, 5);
      92    TEST_SIGNED (v32hi, short int, 32, f7, cmpw, 2);
      93    TEST_UNSIGNED (v32uhi, unsigned short int, 32, f8, cmpuw, 2);
      94    TEST_SIGNED (v16si, int, 16, f9, cmpd, 5);
      95    TEST_UNSIGNED (v16usi, unsigned int, 16, f10, cmpud, 5);
      96    TEST_SIGNED (v16si, int, 16, f11, cmpd, 2);
      97    TEST_UNSIGNED (v16usi, unsigned int, 16, f12, cmpud, 2);
      98    TEST_SIGNED (v8di, long long int, 8, f13, cmpq, 5);
      99    TEST_UNSIGNED (v8udi, unsigned long long int, 8, f14, cmpuq, 5);
     100    TEST_SIGNED (v8di, long long int, 8, f15, cmpq, 2);
     101    TEST_UNSIGNED (v8udi, unsigned long long int, 8, f16, cmpuq, 2);
     102  }