OSDN Git Service

Update Copyright years for files modified in 2008 and/or 2009.
[pf3gnuchains/gcc-fork.git] / gcc / config / i386 / mmintrin.h
1 /* Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008
2    Free Software Foundation, Inc.
3
4    This file is part of GCC.
5
6    GCC is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 2, or (at your option)
9    any later version.
10
11    GCC is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with GCC; see the file COPYING.  If not, write to
18    the Free Software Foundation, 51 Franklin Street, Fifth Floor,
19    Boston, MA 02110-1301, USA.  */
20
21 /* As a special exception, if you include this header file into source
22    files compiled by GCC, this header file does not by itself cause
23    the resulting executable to be covered by the GNU General Public
24    License.  This exception does not however invalidate any other
25    reasons why the executable file might be covered by the GNU General
26    Public License.  */
27
28 /* Implemented from the specification included in the Intel C++ Compiler
29    User Guide and Reference, version 9.0.  */
30
31 #ifndef _MMINTRIN_H_INCLUDED
32 #define _MMINTRIN_H_INCLUDED
33
34 #ifndef __MMX__
35 # error "MMX instruction set not enabled"
36 #else
37 /* The Intel API is flexible enough that we must allow aliasing with other
38    vector types, and their scalar components.  */
39 typedef int __m64 __attribute__ ((__vector_size__ (8), __may_alias__));
40
41 /* Internal data types for implementing the intrinsics.  */
42 typedef int __v2si __attribute__ ((__vector_size__ (8)));
43 typedef short __v4hi __attribute__ ((__vector_size__ (8)));
44 typedef char __v8qi __attribute__ ((__vector_size__ (8)));
45 typedef long long __v1di __attribute__ ((__vector_size__ (8)));
46 typedef float __v2sf __attribute__ ((__vector_size__ (8)));
47
48 /* Empty the multimedia state.  */
49 extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__))
50 _mm_empty (void)
51 {
52   __builtin_ia32_emms ();
53 }
54
55 extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__))
56 _m_empty (void)
57 {
58   _mm_empty ();
59 }
60
61 /* Convert I to a __m64 object.  The integer is zero-extended to 64-bits.  */
62 extern __inline __m64  __attribute__((__gnu_inline__, __always_inline__, __artificial__))
63 _mm_cvtsi32_si64 (int __i)
64 {
65   return (__m64) __builtin_ia32_vec_init_v2si (__i, 0);
66 }
67
68 extern __inline __m64  __attribute__((__gnu_inline__, __always_inline__, __artificial__))
69 _m_from_int (int __i)
70 {
71   return _mm_cvtsi32_si64 (__i);
72 }
73
74 #ifdef __x86_64__
75 /* Convert I to a __m64 object.  */
76
77 /* Intel intrinsic.  */
78 extern __inline __m64  __attribute__((__gnu_inline__, __always_inline__, __artificial__))
79 _m_from_int64 (long long __i)
80 {
81   return (__m64) __i;
82 }
83
84 extern __inline __m64  __attribute__((__gnu_inline__, __always_inline__, __artificial__))
85 _mm_cvtsi64_m64 (long long __i)
86 {
87   return (__m64) __i;
88 }
89
90 /* Microsoft intrinsic.  */
91 extern __inline __m64  __attribute__((__gnu_inline__, __always_inline__, __artificial__))
92 _mm_cvtsi64x_si64 (long long __i)
93 {
94   return (__m64) __i;
95 }
96
97 extern __inline __m64  __attribute__((__gnu_inline__, __always_inline__, __artificial__))
98 _mm_set_pi64x (long long __i)
99 {
100   return (__m64) __i;
101 }
102 #endif
103
104 /* Convert the lower 32 bits of the __m64 object into an integer.  */
105 extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
106 _mm_cvtsi64_si32 (__m64 __i)
107 {
108   return __builtin_ia32_vec_ext_v2si ((__v2si)__i, 0);
109 }
110
111 extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
112 _m_to_int (__m64 __i)
113 {
114   return _mm_cvtsi64_si32 (__i);
115 }
116
117 #ifdef __x86_64__
118 /* Convert the __m64 object to a 64bit integer.  */
119
120 /* Intel intrinsic.  */
121 extern __inline long long __attribute__((__gnu_inline__, __always_inline__, __artificial__))
122 _m_to_int64 (__m64 __i)
123 {
124   return (long long)__i;
125 }
126
127 extern __inline long long __attribute__((__gnu_inline__, __always_inline__, __artificial__))
128 _mm_cvtm64_si64 (__m64 __i)
129 {
130   return (long long)__i;
131 }
132
133 /* Microsoft intrinsic.  */
134 extern __inline long long __attribute__((__gnu_inline__, __always_inline__, __artificial__))
135 _mm_cvtsi64_si64x (__m64 __i)
136 {
137   return (long long)__i;
138 }
139 #endif
140
141 /* Pack the four 16-bit values from M1 into the lower four 8-bit values of
142    the result, and the four 16-bit values from M2 into the upper four 8-bit
143    values of the result, all with signed saturation.  */
144 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
145 _mm_packs_pi16 (__m64 __m1, __m64 __m2)
146 {
147   return (__m64) __builtin_ia32_packsswb ((__v4hi)__m1, (__v4hi)__m2);
148 }
149
150 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
151 _m_packsswb (__m64 __m1, __m64 __m2)
152 {
153   return _mm_packs_pi16 (__m1, __m2);
154 }
155
156 /* Pack the two 32-bit values from M1 in to the lower two 16-bit values of
157    the result, and the two 32-bit values from M2 into the upper two 16-bit
158    values of the result, all with signed saturation.  */
159 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
160 _mm_packs_pi32 (__m64 __m1, __m64 __m2)
161 {
162   return (__m64) __builtin_ia32_packssdw ((__v2si)__m1, (__v2si)__m2);
163 }
164
165 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
166 _m_packssdw (__m64 __m1, __m64 __m2)
167 {
168   return _mm_packs_pi32 (__m1, __m2);
169 }
170
171 /* Pack the four 16-bit values from M1 into the lower four 8-bit values of
172    the result, and the four 16-bit values from M2 into the upper four 8-bit
173    values of the result, all with unsigned saturation.  */
174 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
175 _mm_packs_pu16 (__m64 __m1, __m64 __m2)
176 {
177   return (__m64) __builtin_ia32_packuswb ((__v4hi)__m1, (__v4hi)__m2);
178 }
179
180 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
181 _m_packuswb (__m64 __m1, __m64 __m2)
182 {
183   return _mm_packs_pu16 (__m1, __m2);
184 }
185
186 /* Interleave the four 8-bit values from the high half of M1 with the four
187    8-bit values from the high half of M2.  */
188 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
189 _mm_unpackhi_pi8 (__m64 __m1, __m64 __m2)
190 {
191   return (__m64) __builtin_ia32_punpckhbw ((__v8qi)__m1, (__v8qi)__m2);
192 }
193
194 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
195 _m_punpckhbw (__m64 __m1, __m64 __m2)
196 {
197   return _mm_unpackhi_pi8 (__m1, __m2);
198 }
199
200 /* Interleave the two 16-bit values from the high half of M1 with the two
201    16-bit values from the high half of M2.  */
202 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
203 _mm_unpackhi_pi16 (__m64 __m1, __m64 __m2)
204 {
205   return (__m64) __builtin_ia32_punpckhwd ((__v4hi)__m1, (__v4hi)__m2);
206 }
207
208 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
209 _m_punpckhwd (__m64 __m1, __m64 __m2)
210 {
211   return _mm_unpackhi_pi16 (__m1, __m2);
212 }
213
214 /* Interleave the 32-bit value from the high half of M1 with the 32-bit
215    value from the high half of M2.  */
216 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
217 _mm_unpackhi_pi32 (__m64 __m1, __m64 __m2)
218 {
219   return (__m64) __builtin_ia32_punpckhdq ((__v2si)__m1, (__v2si)__m2);
220 }
221
222 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
223 _m_punpckhdq (__m64 __m1, __m64 __m2)
224 {
225   return _mm_unpackhi_pi32 (__m1, __m2);
226 }
227
228 /* Interleave the four 8-bit values from the low half of M1 with the four
229    8-bit values from the low half of M2.  */
230 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
231 _mm_unpacklo_pi8 (__m64 __m1, __m64 __m2)
232 {
233   return (__m64) __builtin_ia32_punpcklbw ((__v8qi)__m1, (__v8qi)__m2);
234 }
235
236 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
237 _m_punpcklbw (__m64 __m1, __m64 __m2)
238 {
239   return _mm_unpacklo_pi8 (__m1, __m2);
240 }
241
242 /* Interleave the two 16-bit values from the low half of M1 with the two
243    16-bit values from the low half of M2.  */
244 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
245 _mm_unpacklo_pi16 (__m64 __m1, __m64 __m2)
246 {
247   return (__m64) __builtin_ia32_punpcklwd ((__v4hi)__m1, (__v4hi)__m2);
248 }
249
250 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
251 _m_punpcklwd (__m64 __m1, __m64 __m2)
252 {
253   return _mm_unpacklo_pi16 (__m1, __m2);
254 }
255
256 /* Interleave the 32-bit value from the low half of M1 with the 32-bit
257    value from the low half of M2.  */
258 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
259 _mm_unpacklo_pi32 (__m64 __m1, __m64 __m2)
260 {
261   return (__m64) __builtin_ia32_punpckldq ((__v2si)__m1, (__v2si)__m2);
262 }
263
264 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
265 _m_punpckldq (__m64 __m1, __m64 __m2)
266 {
267   return _mm_unpacklo_pi32 (__m1, __m2);
268 }
269
270 /* Add the 8-bit values in M1 to the 8-bit values in M2.  */
271 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
272 _mm_add_pi8 (__m64 __m1, __m64 __m2)
273 {
274   return (__m64) __builtin_ia32_paddb ((__v8qi)__m1, (__v8qi)__m2);
275 }
276
277 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
278 _m_paddb (__m64 __m1, __m64 __m2)
279 {
280   return _mm_add_pi8 (__m1, __m2);
281 }
282
283 /* Add the 16-bit values in M1 to the 16-bit values in M2.  */
284 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
285 _mm_add_pi16 (__m64 __m1, __m64 __m2)
286 {
287   return (__m64) __builtin_ia32_paddw ((__v4hi)__m1, (__v4hi)__m2);
288 }
289
290 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
291 _m_paddw (__m64 __m1, __m64 __m2)
292 {
293   return _mm_add_pi16 (__m1, __m2);
294 }
295
296 /* Add the 32-bit values in M1 to the 32-bit values in M2.  */
297 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
298 _mm_add_pi32 (__m64 __m1, __m64 __m2)
299 {
300   return (__m64) __builtin_ia32_paddd ((__v2si)__m1, (__v2si)__m2);
301 }
302
303 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
304 _m_paddd (__m64 __m1, __m64 __m2)
305 {
306   return _mm_add_pi32 (__m1, __m2);
307 }
308
309 /* Add the 64-bit values in M1 to the 64-bit values in M2.  */
310 #ifdef __SSE2__
311 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
312 _mm_add_si64 (__m64 __m1, __m64 __m2)
313 {
314   return (__m64) __builtin_ia32_paddq ((__v1di)__m1, (__v1di)__m2);
315 }
316 #endif
317
318 /* Add the 8-bit values in M1 to the 8-bit values in M2 using signed
319    saturated arithmetic.  */
320 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
321 _mm_adds_pi8 (__m64 __m1, __m64 __m2)
322 {
323   return (__m64) __builtin_ia32_paddsb ((__v8qi)__m1, (__v8qi)__m2);
324 }
325
326 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
327 _m_paddsb (__m64 __m1, __m64 __m2)
328 {
329   return _mm_adds_pi8 (__m1, __m2);
330 }
331
332 /* Add the 16-bit values in M1 to the 16-bit values in M2 using signed
333    saturated arithmetic.  */
334 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
335 _mm_adds_pi16 (__m64 __m1, __m64 __m2)
336 {
337   return (__m64) __builtin_ia32_paddsw ((__v4hi)__m1, (__v4hi)__m2);
338 }
339
340 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
341 _m_paddsw (__m64 __m1, __m64 __m2)
342 {
343   return _mm_adds_pi16 (__m1, __m2);
344 }
345
346 /* Add the 8-bit values in M1 to the 8-bit values in M2 using unsigned
347    saturated arithmetic.  */
348 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
349 _mm_adds_pu8 (__m64 __m1, __m64 __m2)
350 {
351   return (__m64) __builtin_ia32_paddusb ((__v8qi)__m1, (__v8qi)__m2);
352 }
353
354 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
355 _m_paddusb (__m64 __m1, __m64 __m2)
356 {
357   return _mm_adds_pu8 (__m1, __m2);
358 }
359
360 /* Add the 16-bit values in M1 to the 16-bit values in M2 using unsigned
361    saturated arithmetic.  */
362 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
363 _mm_adds_pu16 (__m64 __m1, __m64 __m2)
364 {
365   return (__m64) __builtin_ia32_paddusw ((__v4hi)__m1, (__v4hi)__m2);
366 }
367
368 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
369 _m_paddusw (__m64 __m1, __m64 __m2)
370 {
371   return _mm_adds_pu16 (__m1, __m2);
372 }
373
374 /* Subtract the 8-bit values in M2 from the 8-bit values in M1.  */
375 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
376 _mm_sub_pi8 (__m64 __m1, __m64 __m2)
377 {
378   return (__m64) __builtin_ia32_psubb ((__v8qi)__m1, (__v8qi)__m2);
379 }
380
381 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
382 _m_psubb (__m64 __m1, __m64 __m2)
383 {
384   return _mm_sub_pi8 (__m1, __m2);
385 }
386
387 /* Subtract the 16-bit values in M2 from the 16-bit values in M1.  */
388 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
389 _mm_sub_pi16 (__m64 __m1, __m64 __m2)
390 {
391   return (__m64) __builtin_ia32_psubw ((__v4hi)__m1, (__v4hi)__m2);
392 }
393
394 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
395 _m_psubw (__m64 __m1, __m64 __m2)
396 {
397   return _mm_sub_pi16 (__m1, __m2);
398 }
399
400 /* Subtract the 32-bit values in M2 from the 32-bit values in M1.  */
401 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
402 _mm_sub_pi32 (__m64 __m1, __m64 __m2)
403 {
404   return (__m64) __builtin_ia32_psubd ((__v2si)__m1, (__v2si)__m2);
405 }
406
407 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
408 _m_psubd (__m64 __m1, __m64 __m2)
409 {
410   return _mm_sub_pi32 (__m1, __m2);
411 }
412
413 /* Add the 64-bit values in M1 to the 64-bit values in M2.  */
414 #ifdef __SSE2__
415 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
416 _mm_sub_si64 (__m64 __m1, __m64 __m2)
417 {
418   return (__m64) __builtin_ia32_psubq ((__v1di)__m1, (__v1di)__m2);
419 }
420 #endif
421
422 /* Subtract the 8-bit values in M2 from the 8-bit values in M1 using signed
423    saturating arithmetic.  */
424 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
425 _mm_subs_pi8 (__m64 __m1, __m64 __m2)
426 {
427   return (__m64) __builtin_ia32_psubsb ((__v8qi)__m1, (__v8qi)__m2);
428 }
429
430 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
431 _m_psubsb (__m64 __m1, __m64 __m2)
432 {
433   return _mm_subs_pi8 (__m1, __m2);
434 }
435
436 /* Subtract the 16-bit values in M2 from the 16-bit values in M1 using
437    signed saturating arithmetic.  */
438 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
439 _mm_subs_pi16 (__m64 __m1, __m64 __m2)
440 {
441   return (__m64) __builtin_ia32_psubsw ((__v4hi)__m1, (__v4hi)__m2);
442 }
443
444 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
445 _m_psubsw (__m64 __m1, __m64 __m2)
446 {
447   return _mm_subs_pi16 (__m1, __m2);
448 }
449
450 /* Subtract the 8-bit values in M2 from the 8-bit values in M1 using
451    unsigned saturating arithmetic.  */
452 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
453 _mm_subs_pu8 (__m64 __m1, __m64 __m2)
454 {
455   return (__m64) __builtin_ia32_psubusb ((__v8qi)__m1, (__v8qi)__m2);
456 }
457
458 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
459 _m_psubusb (__m64 __m1, __m64 __m2)
460 {
461   return _mm_subs_pu8 (__m1, __m2);
462 }
463
464 /* Subtract the 16-bit values in M2 from the 16-bit values in M1 using
465    unsigned saturating arithmetic.  */
466 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
467 _mm_subs_pu16 (__m64 __m1, __m64 __m2)
468 {
469   return (__m64) __builtin_ia32_psubusw ((__v4hi)__m1, (__v4hi)__m2);
470 }
471
472 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
473 _m_psubusw (__m64 __m1, __m64 __m2)
474 {
475   return _mm_subs_pu16 (__m1, __m2);
476 }
477
478 /* Multiply four 16-bit values in M1 by four 16-bit values in M2 producing
479    four 32-bit intermediate results, which are then summed by pairs to
480    produce two 32-bit results.  */
481 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
482 _mm_madd_pi16 (__m64 __m1, __m64 __m2)
483 {
484   return (__m64) __builtin_ia32_pmaddwd ((__v4hi)__m1, (__v4hi)__m2);
485 }
486
487 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
488 _m_pmaddwd (__m64 __m1, __m64 __m2)
489 {
490   return _mm_madd_pi16 (__m1, __m2);
491 }
492
493 /* Multiply four signed 16-bit values in M1 by four signed 16-bit values in
494    M2 and produce the high 16 bits of the 32-bit results.  */
495 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
496 _mm_mulhi_pi16 (__m64 __m1, __m64 __m2)
497 {
498   return (__m64) __builtin_ia32_pmulhw ((__v4hi)__m1, (__v4hi)__m2);
499 }
500
501 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
502 _m_pmulhw (__m64 __m1, __m64 __m2)
503 {
504   return _mm_mulhi_pi16 (__m1, __m2);
505 }
506
507 /* Multiply four 16-bit values in M1 by four 16-bit values in M2 and produce
508    the low 16 bits of the results.  */
509 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
510 _mm_mullo_pi16 (__m64 __m1, __m64 __m2)
511 {
512   return (__m64) __builtin_ia32_pmullw ((__v4hi)__m1, (__v4hi)__m2);
513 }
514
515 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
516 _m_pmullw (__m64 __m1, __m64 __m2)
517 {
518   return _mm_mullo_pi16 (__m1, __m2);
519 }
520
521 /* Shift four 16-bit values in M left by COUNT.  */
522 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
523 _mm_sll_pi16 (__m64 __m, __m64 __count)
524 {
525   return (__m64) __builtin_ia32_psllw ((__v4hi)__m, (__v4hi)__count);
526 }
527
528 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
529 _m_psllw (__m64 __m, __m64 __count)
530 {
531   return _mm_sll_pi16 (__m, __count);
532 }
533
534 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
535 _mm_slli_pi16 (__m64 __m, int __count)
536 {
537   return (__m64) __builtin_ia32_psllwi ((__v4hi)__m, __count);
538 }
539
540 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
541 _m_psllwi (__m64 __m, int __count)
542 {
543   return _mm_slli_pi16 (__m, __count);
544 }
545
546 /* Shift two 32-bit values in M left by COUNT.  */
547 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
548 _mm_sll_pi32 (__m64 __m, __m64 __count)
549 {
550   return (__m64) __builtin_ia32_pslld ((__v2si)__m, (__v2si)__count);
551 }
552
553 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
554 _m_pslld (__m64 __m, __m64 __count)
555 {
556   return _mm_sll_pi32 (__m, __count);
557 }
558
559 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
560 _mm_slli_pi32 (__m64 __m, int __count)
561 {
562   return (__m64) __builtin_ia32_pslldi ((__v2si)__m, __count);
563 }
564
565 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
566 _m_pslldi (__m64 __m, int __count)
567 {
568   return _mm_slli_pi32 (__m, __count);
569 }
570
571 /* Shift the 64-bit value in M left by COUNT.  */
572 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
573 _mm_sll_si64 (__m64 __m, __m64 __count)
574 {
575   return (__m64) __builtin_ia32_psllq ((__v1di)__m, (__v1di)__count);
576 }
577
578 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
579 _m_psllq (__m64 __m, __m64 __count)
580 {
581   return _mm_sll_si64 (__m, __count);
582 }
583
584 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
585 _mm_slli_si64 (__m64 __m, int __count)
586 {
587   return (__m64) __builtin_ia32_psllqi ((__v1di)__m, __count);
588 }
589
590 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
591 _m_psllqi (__m64 __m, int __count)
592 {
593   return _mm_slli_si64 (__m, __count);
594 }
595
596 /* Shift four 16-bit values in M right by COUNT; shift in the sign bit.  */
597 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
598 _mm_sra_pi16 (__m64 __m, __m64 __count)
599 {
600   return (__m64) __builtin_ia32_psraw ((__v4hi)__m, (__v4hi)__count);
601 }
602
603 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
604 _m_psraw (__m64 __m, __m64 __count)
605 {
606   return _mm_sra_pi16 (__m, __count);
607 }
608
609 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
610 _mm_srai_pi16 (__m64 __m, int __count)
611 {
612   return (__m64) __builtin_ia32_psrawi ((__v4hi)__m, __count);
613 }
614
615 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
616 _m_psrawi (__m64 __m, int __count)
617 {
618   return _mm_srai_pi16 (__m, __count);
619 }
620
621 /* Shift two 32-bit values in M right by COUNT; shift in the sign bit.  */
622 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
623 _mm_sra_pi32 (__m64 __m, __m64 __count)
624 {
625   return (__m64) __builtin_ia32_psrad ((__v2si)__m, (__v2si)__count);
626 }
627
628 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
629 _m_psrad (__m64 __m, __m64 __count)
630 {
631   return _mm_sra_pi32 (__m, __count);
632 }
633
634 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
635 _mm_srai_pi32 (__m64 __m, int __count)
636 {
637   return (__m64) __builtin_ia32_psradi ((__v2si)__m, __count);
638 }
639
640 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
641 _m_psradi (__m64 __m, int __count)
642 {
643   return _mm_srai_pi32 (__m, __count);
644 }
645
646 /* Shift four 16-bit values in M right by COUNT; shift in zeros.  */
647 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
648 _mm_srl_pi16 (__m64 __m, __m64 __count)
649 {
650   return (__m64) __builtin_ia32_psrlw ((__v4hi)__m, (__v4hi)__count);
651 }
652
653 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
654 _m_psrlw (__m64 __m, __m64 __count)
655 {
656   return _mm_srl_pi16 (__m, __count);
657 }
658
659 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
660 _mm_srli_pi16 (__m64 __m, int __count)
661 {
662   return (__m64) __builtin_ia32_psrlwi ((__v4hi)__m, __count);
663 }
664
665 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
666 _m_psrlwi (__m64 __m, int __count)
667 {
668   return _mm_srli_pi16 (__m, __count);
669 }
670
671 /* Shift two 32-bit values in M right by COUNT; shift in zeros.  */
672 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
673 _mm_srl_pi32 (__m64 __m, __m64 __count)
674 {
675   return (__m64) __builtin_ia32_psrld ((__v2si)__m, (__v2si)__count);
676 }
677
678 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
679 _m_psrld (__m64 __m, __m64 __count)
680 {
681   return _mm_srl_pi32 (__m, __count);
682 }
683
684 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
685 _mm_srli_pi32 (__m64 __m, int __count)
686 {
687   return (__m64) __builtin_ia32_psrldi ((__v2si)__m, __count);
688 }
689
690 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
691 _m_psrldi (__m64 __m, int __count)
692 {
693   return _mm_srli_pi32 (__m, __count);
694 }
695
696 /* Shift the 64-bit value in M left by COUNT; shift in zeros.  */
697 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
698 _mm_srl_si64 (__m64 __m, __m64 __count)
699 {
700   return (__m64) __builtin_ia32_psrlq ((__v1di)__m, (__v1di)__count);
701 }
702
703 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
704 _m_psrlq (__m64 __m, __m64 __count)
705 {
706   return _mm_srl_si64 (__m, __count);
707 }
708
709 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
710 _mm_srli_si64 (__m64 __m, int __count)
711 {
712   return (__m64) __builtin_ia32_psrlqi ((__v1di)__m, __count);
713 }
714
715 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
716 _m_psrlqi (__m64 __m, int __count)
717 {
718   return _mm_srli_si64 (__m, __count);
719 }
720
721 /* Bit-wise AND the 64-bit values in M1 and M2.  */
722 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
723 _mm_and_si64 (__m64 __m1, __m64 __m2)
724 {
725   return __builtin_ia32_pand (__m1, __m2);
726 }
727
728 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
729 _m_pand (__m64 __m1, __m64 __m2)
730 {
731   return _mm_and_si64 (__m1, __m2);
732 }
733
734 /* Bit-wise complement the 64-bit value in M1 and bit-wise AND it with the
735    64-bit value in M2.  */
736 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
737 _mm_andnot_si64 (__m64 __m1, __m64 __m2)
738 {
739   return __builtin_ia32_pandn (__m1, __m2);
740 }
741
742 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
743 _m_pandn (__m64 __m1, __m64 __m2)
744 {
745   return _mm_andnot_si64 (__m1, __m2);
746 }
747
748 /* Bit-wise inclusive OR the 64-bit values in M1 and M2.  */
749 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
750 _mm_or_si64 (__m64 __m1, __m64 __m2)
751 {
752   return __builtin_ia32_por (__m1, __m2);
753 }
754
755 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
756 _m_por (__m64 __m1, __m64 __m2)
757 {
758   return _mm_or_si64 (__m1, __m2);
759 }
760
761 /* Bit-wise exclusive OR the 64-bit values in M1 and M2.  */
762 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
763 _mm_xor_si64 (__m64 __m1, __m64 __m2)
764 {
765   return __builtin_ia32_pxor (__m1, __m2);
766 }
767
768 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
769 _m_pxor (__m64 __m1, __m64 __m2)
770 {
771   return _mm_xor_si64 (__m1, __m2);
772 }
773
774 /* Compare eight 8-bit values.  The result of the comparison is 0xFF if the
775    test is true and zero if false.  */
776 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
777 _mm_cmpeq_pi8 (__m64 __m1, __m64 __m2)
778 {
779   return (__m64) __builtin_ia32_pcmpeqb ((__v8qi)__m1, (__v8qi)__m2);
780 }
781
782 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
783 _m_pcmpeqb (__m64 __m1, __m64 __m2)
784 {
785   return _mm_cmpeq_pi8 (__m1, __m2);
786 }
787
788 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
789 _mm_cmpgt_pi8 (__m64 __m1, __m64 __m2)
790 {
791   return (__m64) __builtin_ia32_pcmpgtb ((__v8qi)__m1, (__v8qi)__m2);
792 }
793
794 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
795 _m_pcmpgtb (__m64 __m1, __m64 __m2)
796 {
797   return _mm_cmpgt_pi8 (__m1, __m2);
798 }
799
800 /* Compare four 16-bit values.  The result of the comparison is 0xFFFF if
801    the test is true and zero if false.  */
802 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
803 _mm_cmpeq_pi16 (__m64 __m1, __m64 __m2)
804 {
805   return (__m64) __builtin_ia32_pcmpeqw ((__v4hi)__m1, (__v4hi)__m2);
806 }
807
808 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
809 _m_pcmpeqw (__m64 __m1, __m64 __m2)
810 {
811   return _mm_cmpeq_pi16 (__m1, __m2);
812 }
813
814 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
815 _mm_cmpgt_pi16 (__m64 __m1, __m64 __m2)
816 {
817   return (__m64) __builtin_ia32_pcmpgtw ((__v4hi)__m1, (__v4hi)__m2);
818 }
819
820 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
821 _m_pcmpgtw (__m64 __m1, __m64 __m2)
822 {
823   return _mm_cmpgt_pi16 (__m1, __m2);
824 }
825
826 /* Compare two 32-bit values.  The result of the comparison is 0xFFFFFFFF if
827    the test is true and zero if false.  */
828 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
829 _mm_cmpeq_pi32 (__m64 __m1, __m64 __m2)
830 {
831   return (__m64) __builtin_ia32_pcmpeqd ((__v2si)__m1, (__v2si)__m2);
832 }
833
834 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
835 _m_pcmpeqd (__m64 __m1, __m64 __m2)
836 {
837   return _mm_cmpeq_pi32 (__m1, __m2);
838 }
839
840 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
841 _mm_cmpgt_pi32 (__m64 __m1, __m64 __m2)
842 {
843   return (__m64) __builtin_ia32_pcmpgtd ((__v2si)__m1, (__v2si)__m2);
844 }
845
846 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
847 _m_pcmpgtd (__m64 __m1, __m64 __m2)
848 {
849   return _mm_cmpgt_pi32 (__m1, __m2);
850 }
851
852 /* Creates a 64-bit zero.  */
853 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
854 _mm_setzero_si64 (void)
855 {
856   return (__m64)0LL;
857 }
858
859 /* Creates a vector of two 32-bit values; I0 is least significant.  */
860 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
861 _mm_set_pi32 (int __i1, int __i0)
862 {
863   return (__m64) __builtin_ia32_vec_init_v2si (__i0, __i1);
864 }
865
866 /* Creates a vector of four 16-bit values; W0 is least significant.  */
867 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
868 _mm_set_pi16 (short __w3, short __w2, short __w1, short __w0)
869 {
870   return (__m64) __builtin_ia32_vec_init_v4hi (__w0, __w1, __w2, __w3);
871 }
872
873 /* Creates a vector of eight 8-bit values; B0 is least significant.  */
874 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
875 _mm_set_pi8 (char __b7, char __b6, char __b5, char __b4,
876              char __b3, char __b2, char __b1, char __b0)
877 {
878   return (__m64) __builtin_ia32_vec_init_v8qi (__b0, __b1, __b2, __b3,
879                                                __b4, __b5, __b6, __b7);
880 }
881
882 /* Similar, but with the arguments in reverse order.  */
883 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
884 _mm_setr_pi32 (int __i0, int __i1)
885 {
886   return _mm_set_pi32 (__i1, __i0);
887 }
888
889 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
890 _mm_setr_pi16 (short __w0, short __w1, short __w2, short __w3)
891 {
892   return _mm_set_pi16 (__w3, __w2, __w1, __w0);
893 }
894
895 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
896 _mm_setr_pi8 (char __b0, char __b1, char __b2, char __b3,
897               char __b4, char __b5, char __b6, char __b7)
898 {
899   return _mm_set_pi8 (__b7, __b6, __b5, __b4, __b3, __b2, __b1, __b0);
900 }
901
902 /* Creates a vector of two 32-bit values, both elements containing I.  */
903 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
904 _mm_set1_pi32 (int __i)
905 {
906   return _mm_set_pi32 (__i, __i);
907 }
908
909 /* Creates a vector of four 16-bit values, all elements containing W.  */
910 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
911 _mm_set1_pi16 (short __w)
912 {
913   return _mm_set_pi16 (__w, __w, __w, __w);
914 }
915
916 /* Creates a vector of eight 8-bit values, all elements containing B.  */
917 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
918 _mm_set1_pi8 (char __b)
919 {
920   return _mm_set_pi8 (__b, __b, __b, __b, __b, __b, __b, __b);
921 }
922
923 #endif /* __MMX__ */
924 #endif /* _MMINTRIN_H_INCLUDED */