summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.target/i386/avx2-shiftqihi-constant-2.c
blob: 509d5a8d762b3a43237b2c4905767db8e4083972 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
/* PR target/95524 */
/* { dg-do run } */
/* { dg-options "-O2 -mavx512bw -Wno-shift-count-overflow" } */

#ifndef CHECK
#define CHECK "avx512bw-check.h"
#endif

#include CHECK

#ifndef TEST
#define TEST avx512bw_test
#endif

typedef char v64qi  __attribute__ ((vector_size (64)));
typedef unsigned char v64uqi  __attribute__ ((vector_size (64)));

#define TEST_SHIFT(N)					\
  do							\
    {							\
      int i;						\
      for (i = 0; i < 64; i++)				\
	exp1.a[i] = op1.a[i] << N;			\
      res1.x = (__m512i) (((v64qi) op1.x) << N);	\
      if (check_union512i_b (res1, exp1.a))		\
	abort ();					\
							\
      for (i = 0; i < 64; i++)				\
	exp1.a[i] = op1.a[i] >> N;			\
      res1.x = (__m512i) (((v64qi) op1.x) >> N);	\
      if (check_union512i_b (res1, exp1.a))		\
	abort ();					\
							\
      for (i = 0; i < 64; i++)				\
	exp2.a[i] = op2.a[i] >> N;			\
      res2.x = (__m512i) (((v64uqi) op2.x >> N));	\
      if (check_union512i_ub (res2, exp2.a))		\
	abort ();					\
    }							\
  while (0)

static void
TEST (void)
{
  union512i_b op1, exp1, res1;
  union512i_ub op2, exp2, res2;
  for (int i = 0; i != 64; i++)
    {
      op2.a[i] = i * i;
      op1.a[i] = i * i + 200 * i;
    }
  TEST_SHIFT (0);
  TEST_SHIFT (1);
  TEST_SHIFT (2);
  TEST_SHIFT (3);
  TEST_SHIFT (4);
  TEST_SHIFT (5);
  TEST_SHIFT (6);
  TEST_SHIFT (7);
  TEST_SHIFT (8);
}