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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [gcc-4.2.2/] [gcc/] [testsuite/] [gcc.target/] [i386/] [sse-7.c] - Blame information for rev 867

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 149 jeremybenn
/* { dg-do run { target i?86-*-* x86_64-*-* } } */
2
/* { dg-options "-O2 -msse" } */
3
#include <xmmintrin.h>
4
#include <stdio.h>
5
#include <stdlib.h>
6
#include <string.h>
7
#include "../../gcc.dg/i386-cpuid.h"
8
 
9
#ifndef NOINLINE
10
#define NOINLINE __attribute__ ((noinline))
11
#endif
12
 
13
#define SHIFT (4)
14
 
15
typedef union {
16
  __m64 v;
17
  unsigned char c[8];
18
  unsigned short int s[4];
19
  unsigned long long t;
20
  unsigned int u[2];
21
}vecInWord;
22
 
23
void sse_tests (void) NOINLINE;
24
void dump64_16 (char *, char *, vecInWord);
25
int check (const char *, const char *[]);
26
 
27
char buf[8000];
28
char comparison[8000];
29
static int errors = 0;
30
 
31
vecInWord c64, e64;
32
__m64 m64_64;
33
 
34
const char *reference_sse[] = {
35
  "_mm_shuffle_pi16 0123 4567 89ab cdef \n",
36
  ""
37
};
38
 
39
int main()
40
{
41
  unsigned long cpu_facilities;
42
 
43
  cpu_facilities = i386_cpuid ();
44
 
45
  if ((cpu_facilities & (bit_MMX | bit_SSE | bit_CMOV))
46
      != (bit_MMX | bit_SSE | bit_CMOV))
47
    /* If host has no vector support, pass.  */
48
    exit (0);
49
 
50
  e64.t  = 0x0123456789abcdefULL;
51
 
52
  m64_64 = e64.v;
53
 
54
  if (cpu_facilities & bit_SSE)
55
    {
56
      sse_tests();
57
      check (buf, reference_sse);
58
#ifdef DEBUG
59
      printf ("sse testing:\n");
60
      printf (buf);
61
      printf ("\ncomparison:\n");
62
      printf (comparison);
63
#endif
64
      buf[0] = '\0';
65
    }
66
 
67
  if (errors != 0)
68
    abort ();
69
  exit (0);
70
}
71
 
72
void NOINLINE
73
sse_tests (void)
74
{
75
  /* pshufw */
76
  c64.v = _mm_shuffle_pi16 (m64_64, 0x1b);
77
  dump64_16 (buf, "_mm_shuffle_pi16", c64);
78
}
79
 
80
void
81
dump64_16 (char *buf, char *name, vecInWord x)
82
{
83
  int i;
84
  char *p = buf + strlen (buf);
85
 
86
  sprintf (p, "%s ", name);
87
  p += strlen (p);
88
 
89
  for (i=0; i<4; i++)
90
    {
91
      sprintf (p, "%4.4x ", x.s[i]);
92
      p += strlen (p);
93
    }
94
  strcat (p, "\n");
95
}
96
 
97
int
98
check (const char *input, const char *reference[])
99
{
100
  int broken, i, j, len;
101
  const char *p_input;
102
  char *p_comparison;
103
  int new_errors = 0;
104
 
105
  p_comparison = &comparison[0];
106
  p_input = input;
107
 
108
  for (i = 0; *reference[i] != '\0'; i++)
109
    {
110
      broken = 0;
111
      len = strlen (reference[i]);
112
      for (j = 0; j < len; j++)
113
        {
114
          /* Ignore the terminating NUL characters at the end of every string in 'reference[]'.  */
115
          if (!broken && *p_input != reference[i][j])
116
            {
117
              *p_comparison = '\0';
118
              strcat (p_comparison, " >>> ");
119
              p_comparison += strlen (p_comparison);
120
              new_errors++;
121
              broken = 1;
122
            }
123
          *p_comparison = *p_input;
124
          p_comparison++;
125
          p_input++;
126
        }
127
      if (broken)
128
        {
129
          *p_comparison = '\0';
130
          strcat (p_comparison, "expected:\n");
131
          strcat (p_comparison, reference[i]);
132
          p_comparison += strlen (p_comparison);
133
        }
134
    }
135
  *p_comparison = '\0';
136
  strcat (p_comparison, new_errors ? "failure\n\n" : "O.K.\n\n") ;
137
  errors += new_errors;
138
  return 0;
139
}

powered by: WebSVN 2.1.0

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