1 /* PR target/95524 */
2 /* { dg-do run } */
3 /* { dg-options "-O2 -mavx2 -Wno-shift-count-overflow" } */
4 
5 #ifndef CHECK
6 #define CHECK "avx2-check.h"
7 #endif
8 
9 #include CHECK
10 
11 #ifndef TEST
12 #define TEST avx2_test
13 #endif
14 
15 typedef char v32qi  __attribute__ ((vector_size (32)));
16 typedef unsigned char v32uqi  __attribute__ ((vector_size (32)));
17 
18 #define TEST_SHIFT(N)					\
19   do							\
20     {							\
21       int i;						\
22       for (i = 0; i < 32; i++)				\
23 	exp1.a[i] = op1.a[i] << N;			\
24       res1.x = (__m256i) (((v32qi) op1.x) << N);	\
25       if (check_union256i_b (res1, exp1.a))		\
26 	abort ();					\
27 							\
28       for (i = 0; i < 32; i++)				\
29 	exp1.a[i] = op1.a[i] >> N;			\
30       res1.x = (__m256i) (((v32qi) op1.x) >> N);	\
31       if (check_union256i_b (res1, exp1.a))		\
32 	abort ();					\
33 							\
34       for (i = 0; i < 32; i++)				\
35 	exp2.a[i] = op2.a[i] >> N;			\
36       res2.x = (__m256i) (((v32uqi) op2.x >> N));	\
37       if (check_union256i_ub (res2, exp2.a))		\
38 	abort ();					\
39     }							\
40   while (0)
41 
42 static void
TEST(void)43 TEST (void)
44 {
45   union256i_b op1, exp1, res1;
46   union256i_ub op2, exp2, res2;
47   for (int i = 0; i != 32; i++)
48     {
49       op2.a[i] = i * i;
50       op1.a[i] = i * i + 200 * i;
51     }
52   TEST_SHIFT (0);
53   TEST_SHIFT (1);
54   TEST_SHIFT (2);
55   TEST_SHIFT (3);
56   TEST_SHIFT (4);
57   TEST_SHIFT (5);
58   TEST_SHIFT (6);
59   TEST_SHIFT (7);
60   TEST_SHIFT (8);
61 }
62 
63