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