OSDN Git Service

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