1/* PR target/49411 */
2/* { dg-do run } */
3/* { dg-require-effective-target xop } */
4/* { dg-options "-O2 -mxop" } */
5
6#include "xop-check.h"
7
8#include <x86intrin.h>
9
10extern void abort (void);
11
12union
13{
14  __m128i v;
15  unsigned char c[16];
16  unsigned short s[8];
17  unsigned int i[4];
18  unsigned long long l[2];
19} a, b, c, d;
20
21#define TEST1(F, N, S, SS) \
22do {							\
23  for (i = 0; i < sizeof (a.F) / sizeof (a.F[0]); i++)	\
24    a.F[i] = i * 17;					\
25  s = _mm_set1_epi##SS (N);				\
26  b.v = _mm_roti_epi##S (a.v, N);			\
27  c.v = _mm_rot_epi##S (a.v, s);			\
28  for (i = 0; i < sizeof (a.F) / sizeof (a.F[0]); i++)	\
29    {							\
30      int mask = __CHAR_BIT__ * sizeof (a.F[i]) - 1;	\
31      d.F[i] = a.F[i] << (N & mask);			\
32      if (N & mask)					\
33	d.F[i] |= a.F[i] >> (mask + 1 - (N & mask));	\
34      if (b.F[i] != c.F[i] || b.F[i] != d.F[i])		\
35	abort ();					\
36    }							\
37} while (0)
38#define TEST(N) \
39  TEST1 (c, N, 8, 8);					\
40  TEST1 (s, N, 16, 16);					\
41  TEST1 (i, N, 32, 32);					\
42  TEST1 (l, N, 64, 64x)
43
44volatile int n;
45
46static void
47xop_test (void)
48{
49  unsigned int i;
50  __m128i s;
51
52#ifndef NON_CONST
53  TEST (5);
54  TEST (-5);
55  TEST (0);
56  TEST (31);
57#else
58  n = 5; TEST (n);
59  n = -5; TEST (n);
60  n = 0; TEST (n);
61  n = 31; TEST (n);
62#endif
63}
64