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 
10 extern void abort (void);
11 
12 union
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) \
22 do {							\
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 
44 volatile int n;
45 
46 static void
xop_test(void)47 xop_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