1 /* { dg-do run } */
2 /* { dg-require-effective-target avx2 } */
3 /* { dg-options "-O2 -mavx2" } */
4 
5 #ifndef CHECK
6 #define CHECK "avx2-check.h"
7 #endif
8 
9 #ifndef TEST
10 #define TEST avx2_test
11 #endif
12 
13 #include CHECK
14 
15 #include "avx2-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
TEST(void)72 TEST (void)
73 {
74   TEST_SIGNED (v32qi, signed char, 32, f1, <=);
75   TEST_UNSIGNED (v32uqi, unsigned char, 32, f2, <=);
76   TEST_SIGNED (v32qi, signed char, 32, f3, >=);
77   TEST_UNSIGNED (v32uqi, unsigned char, 32, f4, >=);
78   TEST_SIGNED (v16hi, short int, 16, f5, <=);
79   TEST_UNSIGNED (v16uhi, unsigned short int, 16, f6, <=);
80   TEST_SIGNED (v16hi, short int, 16, f7, >=);
81   TEST_UNSIGNED (v16uhi, unsigned short int, 16, f8, >=);
82   TEST_SIGNED (v8si, int, 8, f9, <=);
83   TEST_UNSIGNED (v8usi, unsigned int, 8, f10, <=);
84   TEST_SIGNED (v8si, int, 8, f11, >=);
85   TEST_UNSIGNED (v8usi, unsigned int, 8, f12, >=);
86   TEST_SIGNED (v4di, long long int, 4, f13, <=);
87   TEST_UNSIGNED (v4udi, unsigned long long int, 4, f14, <=);
88   TEST_SIGNED (v4di, long long int, 4, f15, >=);
89   TEST_UNSIGNED (v4udi, unsigned long long int, 4, f16, >=);
90 }
91