]> CyberLeo.Net >> Repos - FreeBSD/releng/9.0.git/blob - contrib/gcc/config/i386/tmmintrin.h
Copy stable/9 to releng/9.0 as part of the FreeBSD 9.0-RELEASE release
[FreeBSD/releng/9.0.git] / contrib / gcc / config / i386 / tmmintrin.h
1 /* Copyright (C) 2006 Free Software Foundation, Inc.
2
3    This file is part of GCC.
4
5    GCC is free software; you can redistribute it and/or modify
6    it under the terms of the GNU General Public License as published by
7    the Free Software Foundation; either version 2, or (at your option)
8    any later version.
9
10    GCC is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13    GNU General Public License for more details.
14
15    You should have received a copy of the GNU General Public License
16    along with GCC; see the file COPYING.  If not, write to
17    the Free Software Foundation, 59 Temple Place - Suite 330,
18    Boston, MA 02111-1307, USA.  */
19
20 /* As a special exception, if you include this header file into source
21    files compiled by GCC, this header file does not by itself cause
22    the resulting executable to be covered by the GNU General Public
23    License.  This exception does not however invalidate any other
24    reasons why the executable file might be covered by the GNU General
25    Public License.  */
26
27 /* Implemented from the specification included in the Intel C++ Compiler
28    User Guide and Reference, version 9.1.  */
29
30 #ifndef _TMMINTRIN_H_INCLUDED
31 #define _TMMINTRIN_H_INCLUDED
32
33 #ifdef __SSSE3__
34 #include <pmmintrin.h>
35
36 static __inline __m128i __attribute__((__always_inline__))
37 _mm_hadd_epi16 (__m128i __X, __m128i __Y)
38 {
39   return (__m128i) __builtin_ia32_phaddw128 ((__v8hi)__X, (__v8hi)__Y);
40 }
41
42 static __inline __m128i __attribute__((__always_inline__))
43 _mm_hadd_epi32 (__m128i __X, __m128i __Y)
44 {
45   return (__m128i) __builtin_ia32_phaddd128 ((__v4si)__X, (__v4si)__Y);
46 }
47
48 static __inline __m128i __attribute__((__always_inline__))
49 _mm_hadds_epi16 (__m128i __X, __m128i __Y)
50 {
51   return (__m128i) __builtin_ia32_phaddsw128 ((__v8hi)__X, (__v8hi)__Y);
52 }
53
54 static __inline __m64 __attribute__((__always_inline__))
55 _mm_hadd_pi16 (__m64 __X, __m64 __Y)
56 {
57   return (__m64) __builtin_ia32_phaddw ((__v4hi)__X, (__v4hi)__Y);
58 }
59
60 static __inline __m64 __attribute__((__always_inline__))
61 _mm_hadd_pi32 (__m64 __X, __m64 __Y)
62 {
63   return (__m64) __builtin_ia32_phaddd ((__v2si)__X, (__v2si)__Y);
64 }
65
66 static __inline __m64 __attribute__((__always_inline__))
67 _mm_hadds_pi16 (__m64 __X, __m64 __Y)
68 {
69   return (__m64) __builtin_ia32_phaddsw ((__v4hi)__X, (__v4hi)__Y);
70 }
71
72 static __inline __m128i __attribute__((__always_inline__))
73 _mm_hsub_epi16 (__m128i __X, __m128i __Y)
74 {
75   return (__m128i) __builtin_ia32_phsubw128 ((__v8hi)__X, (__v8hi)__Y);
76 }
77
78 static __inline __m128i __attribute__((__always_inline__))
79 _mm_hsub_epi32 (__m128i __X, __m128i __Y)
80 {
81   return (__m128i) __builtin_ia32_phsubd128 ((__v4si)__X, (__v4si)__Y);
82 }
83
84 static __inline __m128i __attribute__((__always_inline__))
85 _mm_hsubs_epi16 (__m128i __X, __m128i __Y)
86 {
87   return (__m128i) __builtin_ia32_phsubsw128 ((__v8hi)__X, (__v8hi)__Y);
88 }
89
90 static __inline __m64 __attribute__((__always_inline__))
91 _mm_hsub_pi16 (__m64 __X, __m64 __Y)
92 {
93   return (__m64) __builtin_ia32_phsubw ((__v4hi)__X, (__v4hi)__Y);
94 }
95
96 static __inline __m64 __attribute__((__always_inline__))
97 _mm_hsub_pi32 (__m64 __X, __m64 __Y)
98 {
99   return (__m64) __builtin_ia32_phsubd ((__v2si)__X, (__v2si)__Y);
100 }
101
102 static __inline __m64 __attribute__((__always_inline__))
103 _mm_hsubs_pi16 (__m64 __X, __m64 __Y)
104 {
105   return (__m64) __builtin_ia32_phsubsw ((__v4hi)__X, (__v4hi)__Y);
106 }
107
108 static __inline __m128i __attribute__((__always_inline__))
109 _mm_maddubs_epi16 (__m128i __X, __m128i __Y)
110 {
111   return (__m128i) __builtin_ia32_pmaddubsw128 ((__v16qi)__X, (__v16qi)__Y);
112 }
113
114 static __inline __m64 __attribute__((__always_inline__))
115 _mm_maddubs_pi16 (__m64 __X, __m64 __Y)
116 {
117   return (__m64) __builtin_ia32_pmaddubsw ((__v8qi)__X, (__v8qi)__Y);
118 }
119
120 static __inline __m128i __attribute__((__always_inline__))
121 _mm_mulhrs_epi16 (__m128i __X, __m128i __Y)
122 {
123   return (__m128i) __builtin_ia32_pmulhrsw128 ((__v8hi)__X, (__v8hi)__Y);
124 }
125
126 static __inline __m64 __attribute__((__always_inline__))
127 _mm_mulhrs_pi16 (__m64 __X, __m64 __Y)
128 {
129   return (__m64) __builtin_ia32_pmulhrsw ((__v4hi)__X, (__v4hi)__Y);
130 }
131
132 static __inline __m128i __attribute__((__always_inline__))
133 _mm_shuffle_epi8 (__m128i __X, __m128i __Y)
134 {
135   return (__m128i) __builtin_ia32_pshufb128 ((__v16qi)__X, (__v16qi)__Y);
136 }
137
138 static __inline __m64 __attribute__((__always_inline__))
139 _mm_shuffle_pi8 (__m64 __X, __m64 __Y)
140 {
141   return (__m64) __builtin_ia32_pshufb ((__v8qi)__X, (__v8qi)__Y);
142 }
143
144 static __inline __m128i __attribute__((__always_inline__))
145 _mm_sign_epi8 (__m128i __X, __m128i __Y)
146 {
147   return (__m128i) __builtin_ia32_psignb128 ((__v16qi)__X, (__v16qi)__Y);
148 }
149
150 static __inline __m128i __attribute__((__always_inline__))
151 _mm_sign_epi16 (__m128i __X, __m128i __Y)
152 {
153   return (__m128i) __builtin_ia32_psignw128 ((__v8hi)__X, (__v8hi)__Y);
154 }
155
156 static __inline __m128i __attribute__((__always_inline__))
157 _mm_sign_epi32 (__m128i __X, __m128i __Y)
158 {
159   return (__m128i) __builtin_ia32_psignd128 ((__v4si)__X, (__v4si)__Y);
160 }
161
162 static __inline __m64 __attribute__((__always_inline__))
163 _mm_sign_pi8 (__m64 __X, __m64 __Y)
164 {
165   return (__m64) __builtin_ia32_psignb ((__v8qi)__X, (__v8qi)__Y);
166 }
167
168 static __inline __m64 __attribute__((__always_inline__))
169 _mm_sign_pi16 (__m64 __X, __m64 __Y)
170 {
171   return (__m64) __builtin_ia32_psignw ((__v4hi)__X, (__v4hi)__Y);
172 }
173
174 static __inline __m64 __attribute__((__always_inline__))
175 _mm_sign_pi32 (__m64 __X, __m64 __Y)
176 {
177   return (__m64) __builtin_ia32_psignd ((__v2si)__X, (__v2si)__Y);
178 }
179
180 #define _mm_alignr_epi8(__X, __Y, __N) \
181   ((__m128i)__builtin_ia32_palignr128 ((__v2di) __X, (__v2di) __Y, (__N) * 8))
182
183 #define _mm_alignr_pi8(__X, __Y, __N) \
184   ((__m64)__builtin_ia32_palignr ((long long) (__X), (long long) (__Y), (__N) * 8))
185
186 static __inline __m128i __attribute__((__always_inline__))
187 _mm_abs_epi8 (__m128i __X)
188 {
189   return (__m128i) __builtin_ia32_pabsb128 ((__v16qi)__X);
190 }
191
192 static __inline __m128i __attribute__((__always_inline__))
193 _mm_abs_epi16 (__m128i __X)
194 {
195   return (__m128i) __builtin_ia32_pabsw128 ((__v8hi)__X);
196 }
197
198 static __inline __m128i __attribute__((__always_inline__))
199 _mm_abs_epi32 (__m128i __X)
200 {
201   return (__m128i) __builtin_ia32_pabsd128 ((__v4si)__X);
202 }
203
204 static __inline __m64 __attribute__((__always_inline__))
205 _mm_abs_pi8 (__m64 __X)
206 {
207   return (__m64) __builtin_ia32_pabsb ((__v8qi)__X);
208 }
209
210 static __inline __m64 __attribute__((__always_inline__))
211 _mm_abs_pi16 (__m64 __X)
212 {
213   return (__m64) __builtin_ia32_pabsw ((__v4hi)__X);
214 }
215
216 static __inline __m64 __attribute__((__always_inline__))
217 _mm_abs_pi32 (__m64 __X)
218 {
219   return (__m64) __builtin_ia32_pabsd ((__v2si)__X);
220 }
221
222 #endif /* __SSSE3__ */
223
224 #endif /* _TMMINTRIN_H_INCLUDED */
225 /* Copyright (C) 2006 Free Software Foundation, Inc.
226
227    This file is part of GCC.
228
229    GCC is free software; you can redistribute it and/or modify
230    it under the terms of the GNU General Public License as published by
231    the Free Software Foundation; either version 2, or (at your option)
232    any later version.
233
234    GCC is distributed in the hope that it will be useful,
235    but WITHOUT ANY WARRANTY; without even the implied warranty of
236    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
237    GNU General Public License for more details.
238
239    You should have received a copy of the GNU General Public License
240    along with GCC; see the file COPYING.  If not, write to
241    the Free Software Foundation, 59 Temple Place - Suite 330,
242    Boston, MA 02111-1307, USA.  */
243
244 /* As a special exception, if you include this header file into source
245    files compiled by GCC, this header file does not by itself cause
246    the resulting executable to be covered by the GNU General Public
247    License.  This exception does not however invalidate any other
248    reasons why the executable file might be covered by the GNU General
249    Public License.  */
250
251 /* Implemented from the specification included in the Intel C++ Compiler
252    User Guide and Reference, version 9.1.  */
253
254 #ifndef _TMMINTRIN_H_INCLUDED
255 #define _TMMINTRIN_H_INCLUDED
256
257 #ifdef __SSSE3__
258 #include <pmmintrin.h>
259
260 static __inline __m128i __attribute__((__always_inline__))
261 _mm_hadd_epi16 (__m128i __X, __m128i __Y)
262 {
263   return (__m128i) __builtin_ia32_phaddw128 ((__v8hi)__X, (__v8hi)__Y);
264 }
265
266 static __inline __m128i __attribute__((__always_inline__))
267 _mm_hadd_epi32 (__m128i __X, __m128i __Y)
268 {
269   return (__m128i) __builtin_ia32_phaddd128 ((__v4si)__X, (__v4si)__Y);
270 }
271
272 static __inline __m128i __attribute__((__always_inline__))
273 _mm_hadds_epi16 (__m128i __X, __m128i __Y)
274 {
275   return (__m128i) __builtin_ia32_phaddsw128 ((__v8hi)__X, (__v8hi)__Y);
276 }
277
278 static __inline __m64 __attribute__((__always_inline__))
279 _mm_hadd_pi16 (__m64 __X, __m64 __Y)
280 {
281   return (__m64) __builtin_ia32_phaddw ((__v4hi)__X, (__v4hi)__Y);
282 }
283
284 static __inline __m64 __attribute__((__always_inline__))
285 _mm_hadd_pi32 (__m64 __X, __m64 __Y)
286 {
287   return (__m64) __builtin_ia32_phaddd ((__v2si)__X, (__v2si)__Y);
288 }
289
290 static __inline __m64 __attribute__((__always_inline__))
291 _mm_hadds_pi16 (__m64 __X, __m64 __Y)
292 {
293   return (__m64) __builtin_ia32_phaddsw ((__v4hi)__X, (__v4hi)__Y);
294 }
295
296 static __inline __m128i __attribute__((__always_inline__))
297 _mm_hsub_epi16 (__m128i __X, __m128i __Y)
298 {
299   return (__m128i) __builtin_ia32_phsubw128 ((__v8hi)__X, (__v8hi)__Y);
300 }
301
302 static __inline __m128i __attribute__((__always_inline__))
303 _mm_hsub_epi32 (__m128i __X, __m128i __Y)
304 {
305   return (__m128i) __builtin_ia32_phsubd128 ((__v4si)__X, (__v4si)__Y);
306 }
307
308 static __inline __m128i __attribute__((__always_inline__))
309 _mm_hsubs_epi16 (__m128i __X, __m128i __Y)
310 {
311   return (__m128i) __builtin_ia32_phsubsw128 ((__v8hi)__X, (__v8hi)__Y);
312 }
313
314 static __inline __m64 __attribute__((__always_inline__))
315 _mm_hsub_pi16 (__m64 __X, __m64 __Y)
316 {
317   return (__m64) __builtin_ia32_phsubw ((__v4hi)__X, (__v4hi)__Y);
318 }
319
320 static __inline __m64 __attribute__((__always_inline__))
321 _mm_hsub_pi32 (__m64 __X, __m64 __Y)
322 {
323   return (__m64) __builtin_ia32_phsubd ((__v2si)__X, (__v2si)__Y);
324 }
325
326 static __inline __m64 __attribute__((__always_inline__))
327 _mm_hsubs_pi16 (__m64 __X, __m64 __Y)
328 {
329   return (__m64) __builtin_ia32_phsubsw ((__v4hi)__X, (__v4hi)__Y);
330 }
331
332 static __inline __m128i __attribute__((__always_inline__))
333 _mm_maddubs_epi16 (__m128i __X, __m128i __Y)
334 {
335   return (__m128i) __builtin_ia32_pmaddubsw128 ((__v16qi)__X, (__v16qi)__Y);
336 }
337
338 static __inline __m64 __attribute__((__always_inline__))
339 _mm_maddubs_pi16 (__m64 __X, __m64 __Y)
340 {
341   return (__m64) __builtin_ia32_pmaddubsw ((__v8qi)__X, (__v8qi)__Y);
342 }
343
344 static __inline __m128i __attribute__((__always_inline__))
345 _mm_mulhrs_epi16 (__m128i __X, __m128i __Y)
346 {
347   return (__m128i) __builtin_ia32_pmulhrsw128 ((__v8hi)__X, (__v8hi)__Y);
348 }
349
350 static __inline __m64 __attribute__((__always_inline__))
351 _mm_mulhrs_pi16 (__m64 __X, __m64 __Y)
352 {
353   return (__m64) __builtin_ia32_pmulhrsw ((__v4hi)__X, (__v4hi)__Y);
354 }
355
356 static __inline __m128i __attribute__((__always_inline__))
357 _mm_shuffle_epi8 (__m128i __X, __m128i __Y)
358 {
359   return (__m128i) __builtin_ia32_pshufb128 ((__v16qi)__X, (__v16qi)__Y);
360 }
361
362 static __inline __m64 __attribute__((__always_inline__))
363 _mm_shuffle_pi8 (__m64 __X, __m64 __Y)
364 {
365   return (__m64) __builtin_ia32_pshufb ((__v8qi)__X, (__v8qi)__Y);
366 }
367
368 static __inline __m128i __attribute__((__always_inline__))
369 _mm_sign_epi8 (__m128i __X, __m128i __Y)
370 {
371   return (__m128i) __builtin_ia32_psignb128 ((__v16qi)__X, (__v16qi)__Y);
372 }
373
374 static __inline __m128i __attribute__((__always_inline__))
375 _mm_sign_epi16 (__m128i __X, __m128i __Y)
376 {
377   return (__m128i) __builtin_ia32_psignw128 ((__v8hi)__X, (__v8hi)__Y);
378 }
379
380 static __inline __m128i __attribute__((__always_inline__))
381 _mm_sign_epi32 (__m128i __X, __m128i __Y)
382 {
383   return (__m128i) __builtin_ia32_psignd128 ((__v4si)__X, (__v4si)__Y);
384 }
385
386 static __inline __m64 __attribute__((__always_inline__))
387 _mm_sign_pi8 (__m64 __X, __m64 __Y)
388 {
389   return (__m64) __builtin_ia32_psignb ((__v8qi)__X, (__v8qi)__Y);
390 }
391
392 static __inline __m64 __attribute__((__always_inline__))
393 _mm_sign_pi16 (__m64 __X, __m64 __Y)
394 {
395   return (__m64) __builtin_ia32_psignw ((__v4hi)__X, (__v4hi)__Y);
396 }
397
398 static __inline __m64 __attribute__((__always_inline__))
399 _mm_sign_pi32 (__m64 __X, __m64 __Y)
400 {
401   return (__m64) __builtin_ia32_psignd ((__v2si)__X, (__v2si)__Y);
402 }
403
404 #define _mm_alignr_epi8(__X, __Y, __N) \
405   ((__m128i)__builtin_ia32_palignr128 ((__v2di) __X, (__v2di) __Y, (__N) * 8))
406
407 #define _mm_alignr_pi8(__X, __Y, __N) \
408   ((__m64)__builtin_ia32_palignr ((long long) (__X), (long long) (__Y), (__N) * 8))
409
410 static __inline __m128i __attribute__((__always_inline__))
411 _mm_abs_epi8 (__m128i __X)
412 {
413   return (__m128i) __builtin_ia32_pabsb128 ((__v16qi)__X);
414 }
415
416 static __inline __m128i __attribute__((__always_inline__))
417 _mm_abs_epi16 (__m128i __X)
418 {
419   return (__m128i) __builtin_ia32_pabsw128 ((__v8hi)__X);
420 }
421
422 static __inline __m128i __attribute__((__always_inline__))
423 _mm_abs_epi32 (__m128i __X)
424 {
425   return (__m128i) __builtin_ia32_pabsd128 ((__v4si)__X);
426 }
427
428 static __inline __m64 __attribute__((__always_inline__))
429 _mm_abs_pi8 (__m64 __X)
430 {
431   return (__m64) __builtin_ia32_pabsb ((__v8qi)__X);
432 }
433
434 static __inline __m64 __attribute__((__always_inline__))
435 _mm_abs_pi16 (__m64 __X)
436 {
437   return (__m64) __builtin_ia32_pabsw ((__v4hi)__X);
438 }
439
440 static __inline __m64 __attribute__((__always_inline__))
441 _mm_abs_pi32 (__m64 __X)
442 {
443   return (__m64) __builtin_ia32_pabsd ((__v2si)__X);
444 }
445
446 #endif /* __SSSE3__ */
447
448 #endif /* _TMMINTRIN_H_INCLUDED */