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
      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  }