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
test_512(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 }
83