OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [testsuite/] [gcc.target/] [i386/] [xop-rotate1-int.c] - Rev 691

Compare with Previous | Blame | View Log

/* PR target/49411 */
/* { dg-do run } */
/* { dg-require-effective-target xop } */
/* { dg-options "-O2 -mxop" } */
 
#include "xop-check.h"
 
#include <x86intrin.h>
 
extern void abort (void);
 
union
{
  __m128i v;
  unsigned char c[16];
  unsigned short s[8];
  unsigned int i[4];
  unsigned long long l[2];
} a, b, c, d;
 
#define TEST1(F, N, S, SS) \
do {							\
  for (i = 0; i < sizeof (a.F) / sizeof (a.F[0]); i++)	\
    a.F[i] = i * 17;					\
  s = _mm_set1_epi##SS (N);				\
  b.v = _mm_roti_epi##S (a.v, N);			\
  c.v = _mm_rot_epi##S (a.v, s);			\
  for (i = 0; i < sizeof (a.F) / sizeof (a.F[0]); i++)	\
    {							\
      int mask = __CHAR_BIT__ * sizeof (a.F[i]) - 1;	\
      d.F[i] = a.F[i] << (N & mask);			\
      if (N & mask)					\
	d.F[i] |= a.F[i] >> (mask + 1 - (N & mask));	\
      if (b.F[i] != c.F[i] || b.F[i] != d.F[i])		\
	abort ();					\
    }							\
} while (0)
#define TEST(N) \
  TEST1 (c, N, 8, 8);					\
  TEST1 (s, N, 16, 16);					\
  TEST1 (i, N, 32, 32);					\
  TEST1 (l, N, 64, 64x)
 
volatile int n;
 
static void
xop_test (void)
{
  unsigned int i;
  __m128i s;
 
#ifndef NON_CONST
  TEST (5);
  TEST (-5);
  TEST (0);
  TEST (31);
#else
  n = 5; TEST (n);
  n = -5; TEST (n);
  n = 0; TEST (n);
  n = 31; TEST (n);
#endif
}
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.