OSDN Git Service

e605e070c126fe392ce5bc98a23708602f3a99d7
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / gcc.target / i386 / sse5-haddX.c
1 /* { dg-do run { target i?86-*-* x86_64-*-* } } */
2 /* { dg-require-effective-target sse5 } */
3 /* { dg-options "-O2 -msse5" } */
4
5 #include "sse5-check.h"
6
7 #include <bmmintrin.h>
8 #include <string.h>
9
10 #define NUM 10
11
12 union
13 {
14   __m128i x[NUM];
15   int8_t ssi[NUM * 16];
16   int16_t si[NUM * 8];
17   int32_t li[NUM * 4];
18   int64_t lli[NUM * 2];
19 } dst, res, src1;
20
21 static void
22 init_sbyte ()
23 {
24   int i;
25   for (i=0; i < NUM * 16; i++)
26     src1.ssi[i] = i;
27 }
28
29 static void
30 init_sword ()
31 {
32   int i;
33   for (i=0; i < NUM * 8; i++)
34     src1.si[i] = i;
35 }
36
37
38 static void
39 init_sdword ()
40 {
41   int i;
42   for (i=0; i < NUM * 4; i++)
43     src1.li[i] = i;
44 }
45
46 static int 
47 check_sbyte2word ()
48 {
49   int i, j, s, t, check_fails = 0;
50   for (i = 0; i < NUM * 16; i = i + 16)
51     {
52       for (j = 0; j < 8; j++)
53         {
54           t = i + (2 * j);
55           s = (i / 2) + j;
56           res.si[s] = src1.ssi[t] + src1.ssi[t + 1] ;
57           if (res.si[s] != dst.si[s]) 
58             check_fails++;      
59         }
60     }
61 }
62
63 static int 
64 check_sbyte2dword ()
65 {
66   int i, j, s, t, check_fails = 0;
67   for (i = 0; i < NUM * 16; i = i + 16)
68     {
69       for (j = 0; j < 4; j++)
70         {
71           t = i + (4 * j);
72           s = (i / 4) + j;
73           res.li[s] = (src1.ssi[t] + src1.ssi[t + 1]) + (src1.ssi[t + 2]
74                       + src1.ssi[t + 3]); 
75           if (res.li[s] != dst.li[s]) 
76             check_fails++;
77         }
78     }
79   return check_fails++;
80 }
81
82 static int
83 check_sbyte2qword ()
84 {
85   int i, j, s, t, check_fails = 0;
86   for (i = 0; i < NUM * 16; i = i + 16)
87     {
88       for (j = 0; j < 2; j++)
89         {
90           t = i + (8 * j);
91           s = (i / 8) + j;
92           res.lli[s] = ((src1.ssi[t] + src1.ssi[t + 1]) + (src1.ssi[t + 2] 
93                        + src1.ssi[t + 3])) + ((src1.ssi[t + 4] + src1.ssi[t +5])
94                        + (src1.ssi[t + 6] + src1.ssi[t + 7])); 
95           if (res.lli[s] != dst.lli[s]) 
96             check_fails++;
97         }
98     }
99   return check_fails++;
100 }
101
102 static int
103 check_sword2dword ()
104 {
105   int i, j, s, t, check_fails = 0;
106   for (i = 0; i < (NUM * 8); i = i + 8)
107     {
108       for (j = 0; j < 4; j++)
109         {
110           t = i + (2 * j);
111           s = (i / 2) + j;
112           res.li[s] = src1.si[t] + src1.si[t + 1] ;
113           if (res.li[s] != dst.li[s]) 
114             check_fails++;      
115         }
116     }
117 }
118
119 static int 
120 check_sword2qword ()
121 {
122   int i, j, s, t, check_fails = 0;
123   for (i = 0; i < NUM * 8; i = i + 8)
124     {
125       for (j = 0; j < 2; j++)
126         {
127           t = i + (4 * j);
128           s = (i / 4) + j;
129           res.lli[s] = (src1.si[t] + src1.si[t + 1]) + (src1.si[t + 2]
130                        + src1.si[t + 3]); 
131           if (res.lli[s] != dst.lli[s]) 
132             check_fails++;
133         }
134     }
135   return check_fails++;
136 }
137
138 static int
139 check_dword2qword ()
140 {
141   int i, j, s, t, check_fails = 0;
142   for (i = 0; i < (NUM * 4); i = i + 4)
143     {
144       for (j = 0; j < 2; j++)
145         {
146           t = i + (2 * j);
147           s = (i / 2) + j;
148           res.lli[s] = src1.li[t] + src1.li[t + 1] ;
149           if (res.lli[s] != dst.lli[s]) 
150             check_fails++;      
151         }
152     }
153 }
154
155 static void
156 sse5_test (void)
157 {
158   int i;
159   
160   /* Check haddbw */
161   init_sbyte ();
162   
163   for (i = 0; i < NUM; i++)
164     dst.x[i] = _mm_haddw_epi8 (src1.x[i]);
165   
166   if (check_sbyte2word())
167   abort ();
168   
169   /* Check haddbd */
170   for (i = 0; i < (NUM ); i++)
171     dst.x[i] = _mm_haddd_epi8 (src1.x[i]);
172   
173   if (check_sbyte2dword())
174     abort (); 
175   
176   /* Check haddbq */
177   for (i = 0; i < NUM; i++)
178     dst.x[i] = _mm_haddq_epi8 (src1.x[i]);
179   
180   if (check_sbyte2qword())
181     abort ();
182
183   /* Check haddwd */
184   init_sword ();
185
186   for (i = 0; i < (NUM ); i++)
187     dst.x[i] = _mm_haddd_epi16 (src1.x[i]);
188   
189   if (check_sword2dword())
190     abort (); 
191    
192   /* Check haddbwq */
193  
194   for (i = 0; i < NUM; i++)
195     dst.x[i] = _mm_haddq_epi16 (src1.x[i]);
196   
197   if (check_sword2qword())
198     abort ();
199  
200   /* Check haddq */
201   init_sdword ();
202
203     for (i = 0; i < NUM; i++)
204     dst.x[i] = _mm_haddq_epi32 (src1.x[i]);
205   
206   if (check_dword2qword())
207     abort ();
208 }