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 avx512vl_test
14 #endif
15 
16 #include "avx512vl-pr92686-movcc-1.c"
17 #include "pr92686.inc"
18 
19 #define NUM 256
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
TEST(void)84 TEST (void)
85 {
86   TEST_SIGNED (v32qi, signed char, 32, f1, cmpb, 5);
87   TEST_UNSIGNED (v32uqi, unsigned char, 32, f2, cmpub, 5);
88   TEST_SIGNED (v32qi, signed char, 32, f3, cmpb, 2);
89   TEST_UNSIGNED (v32uqi, unsigned char, 32, f4, cmpub, 2);
90   TEST_SIGNED (v16hi, short int, 16, f5, cmpw, 5);
91   TEST_UNSIGNED (v16uhi, unsigned short int, 16, f6, cmpuw, 5);
92   TEST_SIGNED (v16hi, short int, 16, f7, cmpw, 2);
93   TEST_UNSIGNED (v16uhi, unsigned short int, 16, f8, cmpuw, 2);
94   TEST_SIGNED (v8si, int, 8, f9, cmpd, 5);
95   TEST_UNSIGNED (v8usi, unsigned int, 8, f10, cmpud, 5);
96   TEST_SIGNED (v8si, int, 8, f11, cmpd, 2);
97   TEST_UNSIGNED (v8usi, unsigned int, 8, f12, cmpud, 2);
98   TEST_SIGNED (v4di, long long int, 4, f13, cmpq, 5);
99   TEST_UNSIGNED (v4udi, unsigned long long int, 4, f14, cmpuq, 5);
100   TEST_SIGNED (v4di, long long int, 4, f15, cmpq, 2);
101   TEST_UNSIGNED (v4udi, unsigned long long int, 4, f16, cmpuq, 2);
102 }
103