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