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