Daily bump.
[official-gcc.git] / gcc / testsuite / gcc.target / i386 / xop-rotate1-int.c
bloba58cd726b2b767afe60d2ab5010ccc431cf105f7
1 /* PR target/49411 */
2 /* { dg-do run } */
3 /* { dg-require-effective-target xop } */
4 /* { dg-options "-O2 -mxop" } */
6 #include "xop-check.h"
8 #include <x86intrin.h>
10 extern void abort (void);
12 union
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;
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)
44 volatile int n;
46 static void
47 xop_test (void)
49 unsigned int i;
50 __m128i s;
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