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

Subversion Repositories openrisc

[/] [openrisc/] [tags/] [gnu-src/] [gcc-4.5.1/] [gcc-4.5.1-or32-1.0rc1/] [gcc/] [testsuite/] [gcc.target/] [i386/] [mmx-4.c] - Diff between revs 318 and 338

Only display areas with differences | Details | Blame | View Log

Rev 318 Rev 338
/* { dg-do run } */
/* { dg-do run } */
/* { dg-options "-O2 -mmmx" } */
/* { dg-options "-O2 -mmmx" } */
 
 
#include "mmx-check.h"
#include "mmx-check.h"
 
 
#include <mmintrin.h>
#include <mmintrin.h>
#include <string.h>
#include <string.h>
 
 
#define SHIFT (4)
#define SHIFT (4)
 
 
typedef union {
typedef union {
  __m64 v;
  __m64 v;
  unsigned char c[8];
  unsigned char c[8];
  unsigned short int s[4];
  unsigned short int s[4];
  unsigned long long t;
  unsigned long long t;
  unsigned int u[2];
  unsigned int u[2];
}vecInWord;
}vecInWord;
 
 
void mmx_tests (void) __attribute__((noinline));
void mmx_tests (void) __attribute__((noinline));
void dump64_16 (char *, char *, vecInWord);
void dump64_16 (char *, char *, vecInWord);
void dump64_32 (char *, char *, vecInWord);
void dump64_32 (char *, char *, vecInWord);
void dump64_64 (char *, char *, vecInWord);
void dump64_64 (char *, char *, vecInWord);
int check (const char *, const char *[]);
int check (const char *, const char *[]);
 
 
char buf[8000];
char buf[8000];
char comparison[8000];
char comparison[8000];
static int errors = 0;
static int errors = 0;
 
 
vecInWord a64, b64, c64, d64, e64;
vecInWord a64, b64, c64, d64, e64;
__m64 m64_16, s64, m64_32, m64_64;
__m64 m64_16, s64, m64_32, m64_64;
 
 
const char *reference_mmx[] = {
const char *reference_mmx[] = {
  "_mm_srai_pi16 0012 0012 0012 0012 \n",
  "_mm_srai_pi16 0012 0012 0012 0012 \n",
  "_mm_sra_pi16 0012 0012 0012 0012 \n",
  "_mm_sra_pi16 0012 0012 0012 0012 \n",
  "_mm_srai_pi32 00123456 00123456 \n",
  "_mm_srai_pi32 00123456 00123456 \n",
  "_mm_sra_pi32 00123456 00123456 \n",
  "_mm_sra_pi32 00123456 00123456 \n",
  "_mm_srli_pi16 0012 0012 0012 0012 \n",
  "_mm_srli_pi16 0012 0012 0012 0012 \n",
  "_mm_srl_pi16 0012 0012 0012 0012 \n",
  "_mm_srl_pi16 0012 0012 0012 0012 \n",
  "_mm_srli_pi32 00123456 00123456 \n",
  "_mm_srli_pi32 00123456 00123456 \n",
  "_mm_srl_pi32 00123456 00123456 \n",
  "_mm_srl_pi32 00123456 00123456 \n",
  "_mm_srli_si64 00123456789abcde\n",
  "_mm_srli_si64 00123456789abcde\n",
  "_mm_srl_si64 00123456789abcde\n",
  "_mm_srl_si64 00123456789abcde\n",
  "_mm_slli_pi16 1230 1230 1230 1230 \n",
  "_mm_slli_pi16 1230 1230 1230 1230 \n",
  "_mm_sll_pi16 1230 1230 1230 1230 \n",
  "_mm_sll_pi16 1230 1230 1230 1230 \n",
  "_mm_slli_pi32 12345670 12345670 \n",
  "_mm_slli_pi32 12345670 12345670 \n",
  "_mm_sll_pi32 12345670 12345670 \n",
  "_mm_sll_pi32 12345670 12345670 \n",
  "_mm_slli_si64 123456789abcdef0\n",
  "_mm_slli_si64 123456789abcdef0\n",
  "_mm_sll_si64 123456789abcdef0\n",
  "_mm_sll_si64 123456789abcdef0\n",
  ""
  ""
};
};
 
 
 
 
static void
static void
mmx_test (void)
mmx_test (void)
{
{
  d64.u[0]  = 0x01234567;
  d64.u[0]  = 0x01234567;
  d64.u[1]  = 0x01234567;
  d64.u[1]  = 0x01234567;
 
 
  m64_32 = d64.v;
  m64_32 = d64.v;
 
 
  e64.t  = 0x0123456789abcdefULL;
  e64.t  = 0x0123456789abcdefULL;
 
 
  m64_64 = e64.v;
  m64_64 = e64.v;
 
 
  a64.s[0] = 0x0123;
  a64.s[0] = 0x0123;
  a64.s[1] = 0x0123;
  a64.s[1] = 0x0123;
  a64.s[2] = 0x0123;
  a64.s[2] = 0x0123;
  a64.s[3] = 0x0123;
  a64.s[3] = 0x0123;
 
 
  m64_16 = a64.v;
  m64_16 = a64.v;
 
 
  b64.s[0] = SHIFT;
  b64.s[0] = SHIFT;
  b64.s[1] = 0;
  b64.s[1] = 0;
  b64.s[2] = 0;
  b64.s[2] = 0;
  b64.s[3] = 0;
  b64.s[3] = 0;
 
 
  s64 = b64.v;
  s64 = b64.v;
 
 
  mmx_tests();
  mmx_tests();
  check (buf, reference_mmx);
  check (buf, reference_mmx);
#ifdef DEBUG
#ifdef DEBUG
  printf ("mmx testing:\n");
  printf ("mmx testing:\n");
  printf (buf);
  printf (buf);
  printf ("\ncomparison:\n");
  printf ("\ncomparison:\n");
  printf (comparison);
  printf (comparison);
#endif
#endif
  buf[0] = '\0';
  buf[0] = '\0';
 
 
  if (errors != 0)
  if (errors != 0)
    abort ();
    abort ();
}
}
 
 
void __attribute__((noinline))
void __attribute__((noinline))
mmx_tests (void)
mmx_tests (void)
{
{
  /* psraw */
  /* psraw */
  c64.v = _mm_srai_pi16 (m64_16, SHIFT);
  c64.v = _mm_srai_pi16 (m64_16, SHIFT);
  dump64_16 (buf, "_mm_srai_pi16", c64);
  dump64_16 (buf, "_mm_srai_pi16", c64);
  c64.v  = _mm_sra_pi16 (m64_16, s64);
  c64.v  = _mm_sra_pi16 (m64_16, s64);
  dump64_16 (buf, "_mm_sra_pi16", c64);
  dump64_16 (buf, "_mm_sra_pi16", c64);
 
 
  /* psrad */
  /* psrad */
  c64.v  = _mm_srai_pi32 (m64_32, SHIFT);
  c64.v  = _mm_srai_pi32 (m64_32, SHIFT);
  dump64_32 (buf, "_mm_srai_pi32", c64);
  dump64_32 (buf, "_mm_srai_pi32", c64);
  c64.v = _mm_sra_pi32 (m64_32, s64);
  c64.v = _mm_sra_pi32 (m64_32, s64);
  dump64_32 (buf, "_mm_sra_pi32", c64);
  dump64_32 (buf, "_mm_sra_pi32", c64);
 
 
  /* psrlw */
  /* psrlw */
  c64.v = _mm_srli_pi16 (m64_16, SHIFT);
  c64.v = _mm_srli_pi16 (m64_16, SHIFT);
  dump64_16 (buf, "_mm_srli_pi16", c64);
  dump64_16 (buf, "_mm_srli_pi16", c64);
  c64.v = _mm_srl_pi16 (m64_16, s64);
  c64.v = _mm_srl_pi16 (m64_16, s64);
  dump64_16 (buf, "_mm_srl_pi16", c64);
  dump64_16 (buf, "_mm_srl_pi16", c64);
 
 
  /* psrld */
  /* psrld */
  c64.v = _mm_srli_pi32 (m64_32, SHIFT);
  c64.v = _mm_srli_pi32 (m64_32, SHIFT);
  dump64_32 (buf, "_mm_srli_pi32", c64);
  dump64_32 (buf, "_mm_srli_pi32", c64);
  c64.v = _mm_srl_pi32 (m64_32, s64);
  c64.v = _mm_srl_pi32 (m64_32, s64);
  dump64_32 (buf, "_mm_srl_pi32", c64);
  dump64_32 (buf, "_mm_srl_pi32", c64);
 
 
  /* psrlq */
  /* psrlq */
  c64.v = _mm_srli_si64 (m64_64, SHIFT);
  c64.v = _mm_srli_si64 (m64_64, SHIFT);
  dump64_64 (buf, "_mm_srli_si64", c64);
  dump64_64 (buf, "_mm_srli_si64", c64);
  c64.v = _mm_srl_si64 (m64_64, s64);
  c64.v = _mm_srl_si64 (m64_64, s64);
  dump64_64 (buf, "_mm_srl_si64", c64);
  dump64_64 (buf, "_mm_srl_si64", c64);
 
 
  /* psllw */
  /* psllw */
  c64.v = _mm_slli_pi16 (m64_16, SHIFT);
  c64.v = _mm_slli_pi16 (m64_16, SHIFT);
  dump64_16 (buf, "_mm_slli_pi16", c64);
  dump64_16 (buf, "_mm_slli_pi16", c64);
  c64.v = _mm_sll_pi16 (m64_16, s64);
  c64.v = _mm_sll_pi16 (m64_16, s64);
  dump64_16 (buf, "_mm_sll_pi16", c64);
  dump64_16 (buf, "_mm_sll_pi16", c64);
 
 
  /* pslld */
  /* pslld */
  c64.v = _mm_slli_pi32 (m64_32, SHIFT);
  c64.v = _mm_slli_pi32 (m64_32, SHIFT);
  dump64_32 (buf, "_mm_slli_pi32", c64);
  dump64_32 (buf, "_mm_slli_pi32", c64);
  c64.v = _mm_sll_pi32 (m64_32, s64);
  c64.v = _mm_sll_pi32 (m64_32, s64);
  dump64_32 (buf, "_mm_sll_pi32", c64);
  dump64_32 (buf, "_mm_sll_pi32", c64);
 
 
  /* psllq */
  /* psllq */
  c64.v = _mm_slli_si64 (m64_64, SHIFT);
  c64.v = _mm_slli_si64 (m64_64, SHIFT);
  dump64_64 (buf, "_mm_slli_si64", c64);
  dump64_64 (buf, "_mm_slli_si64", c64);
  c64.v = _mm_sll_si64 (m64_64, s64);
  c64.v = _mm_sll_si64 (m64_64, s64);
  dump64_64 (buf, "_mm_sll_si64", c64);
  dump64_64 (buf, "_mm_sll_si64", c64);
}
}
 
 
void
void
dump64_16 (char *buf, char *name, vecInWord x)
dump64_16 (char *buf, char *name, vecInWord x)
{
{
  int i;
  int i;
  char *p = buf + strlen (buf);
  char *p = buf + strlen (buf);
 
 
  sprintf (p, "%s ", name);
  sprintf (p, "%s ", name);
  p += strlen (p);
  p += strlen (p);
 
 
  for (i=0; i<4; i++)
  for (i=0; i<4; i++)
    {
    {
      sprintf (p, "%4.4x ", x.s[i]);
      sprintf (p, "%4.4x ", x.s[i]);
      p += strlen (p);
      p += strlen (p);
    }
    }
  strcat (p, "\n");
  strcat (p, "\n");
}
}
 
 
void
void
dump64_32 (char *buf, char *name, vecInWord x)
dump64_32 (char *buf, char *name, vecInWord x)
{
{
  int i;
  int i;
  char *p = buf + strlen (buf);
  char *p = buf + strlen (buf);
 
 
  sprintf (p, "%s ", name);
  sprintf (p, "%s ", name);
  p += strlen (p);
  p += strlen (p);
 
 
  for (i=0; i<2; i++)
  for (i=0; i<2; i++)
    {
    {
      sprintf (p, "%8.8x ", x.u[i]);
      sprintf (p, "%8.8x ", x.u[i]);
      p += strlen (p);
      p += strlen (p);
    }
    }
  strcat (p, "\n");
  strcat (p, "\n");
}
}
 
 
void
void
dump64_64 (char *buf, char *name, vecInWord x)
dump64_64 (char *buf, char *name, vecInWord x)
{
{
  char *p = buf + strlen (buf);
  char *p = buf + strlen (buf);
 
 
  sprintf (p, "%s ", name);
  sprintf (p, "%s ", name);
  p += strlen (p);
  p += strlen (p);
 
 
#if defined(_WIN32) && !defined(__CYGWIN__)
#if defined(_WIN32) && !defined(__CYGWIN__)
  sprintf (p, "%16.16I64x\n", x.t);
  sprintf (p, "%16.16I64x\n", x.t);
#else
#else
  sprintf (p, "%16.16llx\n", x.t);
  sprintf (p, "%16.16llx\n", x.t);
#endif
#endif
}
}
 
 
int
int
check (const char *input, const char *reference[])
check (const char *input, const char *reference[])
{
{
  int broken, i, j, len;
  int broken, i, j, len;
  const char *p_input;
  const char *p_input;
  char *p_comparison;
  char *p_comparison;
  int new_errors = 0;
  int new_errors = 0;
 
 
  p_comparison = &comparison[0];
  p_comparison = &comparison[0];
  p_input = input;
  p_input = input;
 
 
  for (i = 0; *reference[i] != '\0'; i++)
  for (i = 0; *reference[i] != '\0'; i++)
    {
    {
      broken = 0;
      broken = 0;
      len = strlen (reference[i]);
      len = strlen (reference[i]);
      for (j = 0; j < len; j++)
      for (j = 0; j < len; j++)
        {
        {
          /* Ignore the terminating NUL characters at the end of every string in 'reference[]'.  */
          /* Ignore the terminating NUL characters at the end of every string in 'reference[]'.  */
          if (!broken && *p_input != reference[i][j])
          if (!broken && *p_input != reference[i][j])
            {
            {
              *p_comparison = '\0';
              *p_comparison = '\0';
              strcat (p_comparison, " >>> ");
              strcat (p_comparison, " >>> ");
              p_comparison += strlen (p_comparison);
              p_comparison += strlen (p_comparison);
              new_errors++;
              new_errors++;
              broken = 1;
              broken = 1;
            }
            }
          *p_comparison = *p_input;
          *p_comparison = *p_input;
          p_comparison++;
          p_comparison++;
          p_input++;
          p_input++;
        }
        }
      if (broken)
      if (broken)
        {
        {
          *p_comparison = '\0';
          *p_comparison = '\0';
          strcat (p_comparison, "expected:\n");
          strcat (p_comparison, "expected:\n");
          strcat (p_comparison, reference[i]);
          strcat (p_comparison, reference[i]);
          p_comparison += strlen (p_comparison);
          p_comparison += strlen (p_comparison);
        }
        }
    }
    }
  *p_comparison = '\0';
  *p_comparison = '\0';
  strcat (p_comparison, new_errors ? "failure\n\n" : "O.K.\n\n") ;
  strcat (p_comparison, new_errors ? "failure\n\n" : "O.K.\n\n") ;
  errors += new_errors;
  errors += new_errors;
  return 0;
  return 0;
}
}
 
 

powered by: WebSVN 2.1.0

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