blob: 3c69925525bdc62014e09929b43907ae68133491 [file] [log] [blame]
Anders Carlsson37958ee2008-03-03 19:29:06 +00001/*===---- mmintrin.h - MMX intrinsics --------------------------------------===
2 *
Anders Carlsson37958ee2008-03-03 19:29:06 +00003 * Permission is hereby granted, free of charge, to any person obtaining a copy
4 * of this software and associated documentation files (the "Software"), to deal
5 * in the Software without restriction, including without limitation the rights
6 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 * copies of the Software, and to permit persons to whom the Software is
8 * furnished to do so, subject to the following conditions:
9 *
10 * The above copyright notice and this permission notice shall be included in
11 * all copies or substantial portions of the Software.
12 *
13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19 * THE SOFTWARE.
20 *
21 *===-----------------------------------------------------------------------===
22 */
23
24#ifndef __MMINTRIN_H
25#define __MMINTRIN_H
26
27#ifndef __MMX__
28#error "MMX instruction set not enabled"
29#else
30
Eli Friedmanedbd9282008-05-14 20:32:22 +000031typedef long long __m64 __attribute__((__vector_size__(8)));
Anders Carlsson37958ee2008-03-03 19:29:06 +000032
Eli Friedmanedbd9282008-05-14 20:32:22 +000033typedef int __v2si __attribute__((__vector_size__(8)));
34typedef short __v4hi __attribute__((__vector_size__(8)));
35typedef char __v8qi __attribute__((__vector_size__(8)));
Anders Carlsson37958ee2008-03-03 19:29:06 +000036
Daniel Dunbar0b4f69f2008-10-29 03:37:55 +000037static inline void __attribute__((__always_inline__)) _mm_empty(void)
Anders Carlsson37958ee2008-03-03 19:29:06 +000038{
39 __builtin_ia32_emms();
40}
41
Daniel Dunbar83e61e52008-10-28 00:06:25 +000042static inline __m64 __attribute__((__always_inline__)) _mm_cvtsi32_si64(int __i)
Anders Carlsson37958ee2008-03-03 19:29:06 +000043{
Eli Friedmanedbd9282008-05-14 20:32:22 +000044 return (__m64)(__v2si){__i, 0};
Anders Carlsson37958ee2008-03-03 19:29:06 +000045}
46
Daniel Dunbar83e61e52008-10-28 00:06:25 +000047static inline int __attribute__((__always_inline__)) _mm_cvtsi64_si32(__m64 __m)
Anders Carlsson37958ee2008-03-03 19:29:06 +000048{
Eli Friedmanedbd9282008-05-14 20:32:22 +000049 __v2si __mmx_var2 = (__v2si)__m;
Eli Friedman1e6d14f2008-05-14 20:11:29 +000050 return __mmx_var2[0];
Anders Carlsson37958ee2008-03-03 19:29:06 +000051}
52
Daniel Dunbar83e61e52008-10-28 00:06:25 +000053static inline __m64 __attribute__((__always_inline__)) _mm_cvtsi64_m64(long long __i)
Anders Carlsson37958ee2008-03-03 19:29:06 +000054{
Eli Friedmanedbd9282008-05-14 20:32:22 +000055 return (__m64)__i;
Anders Carlsson37958ee2008-03-03 19:29:06 +000056}
57
Daniel Dunbar83e61e52008-10-28 00:06:25 +000058static inline long long __attribute__((__always_inline__)) _mm_cvtm64_si64(__m64 __m)
Anders Carlsson37958ee2008-03-03 19:29:06 +000059{
Eli Friedmanedbd9282008-05-14 20:32:22 +000060 return (long long)__m;
Anders Carlsson37958ee2008-03-03 19:29:06 +000061}
62
Daniel Dunbar83e61e52008-10-28 00:06:25 +000063static inline __m64 __attribute__((__always_inline__)) _mm_packs_pi16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +000064{
Eli Friedmanedbd9282008-05-14 20:32:22 +000065 return (__m64)__builtin_ia32_packsswb((__v4hi)__m1, (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +000066}
67
Daniel Dunbar83e61e52008-10-28 00:06:25 +000068static inline __m64 __attribute__((__always_inline__)) _mm_packs_pi32(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +000069{
Eli Friedmanedbd9282008-05-14 20:32:22 +000070 return (__m64)__builtin_ia32_packssdw((__v2si)__m1, (__v2si)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +000071}
72
Daniel Dunbar83e61e52008-10-28 00:06:25 +000073static inline __m64 __attribute__((__always_inline__)) _mm_packs_pu16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +000074{
Eli Friedmanedbd9282008-05-14 20:32:22 +000075 return (__m64)__builtin_ia32_packuswb((__v4hi)__m1, (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +000076}
77
Daniel Dunbar83e61e52008-10-28 00:06:25 +000078static inline __m64 __attribute__((__always_inline__)) _mm_unpackhi_pi8(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +000079{
Eli Friedmanedbd9282008-05-14 20:32:22 +000080 return (__m64)__builtin_shufflevector((__v8qi)__m1, (__v8qi)__m2, 4, 8+4, 5, 8+5, 6, 8+6, 7, 8+7);
Anders Carlsson37958ee2008-03-03 19:29:06 +000081}
82
Daniel Dunbar83e61e52008-10-28 00:06:25 +000083static inline __m64 __attribute__((__always_inline__)) _mm_unpackhi_pi16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +000084{
Eli Friedmanedbd9282008-05-14 20:32:22 +000085 return (__m64)__builtin_shufflevector((__v4hi)__m1, (__v4hi)__m2, 2, 4+2, 3, 4+3);
Anders Carlsson37958ee2008-03-03 19:29:06 +000086}
87
Daniel Dunbar83e61e52008-10-28 00:06:25 +000088static inline __m64 __attribute__((__always_inline__)) _mm_unpackhi_pi32(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +000089{
Eli Friedmanedbd9282008-05-14 20:32:22 +000090 return (__m64)__builtin_shufflevector((__v2si)__m1, (__v2si)__m2, 1, 2+1);
Anders Carlsson37958ee2008-03-03 19:29:06 +000091}
92
Daniel Dunbar83e61e52008-10-28 00:06:25 +000093static inline __m64 __attribute__((__always_inline__)) _mm_unpacklo_pi8(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +000094{
Eli Friedmanedbd9282008-05-14 20:32:22 +000095 return (__m64)__builtin_shufflevector((__v8qi)__m1, (__v8qi)__m2, 0, 8+0, 1, 8+1, 2, 8+2, 3, 8+3);
Anders Carlsson37958ee2008-03-03 19:29:06 +000096}
97
Daniel Dunbar83e61e52008-10-28 00:06:25 +000098static inline __m64 __attribute__((__always_inline__)) _mm_unpacklo_pi16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +000099{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000100 return (__m64)__builtin_shufflevector((__v4hi)__m1, (__v4hi)__m2, 0, 4+0, 1, 4+1);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000101}
102
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000103static inline __m64 __attribute__((__always_inline__)) _mm_unpacklo_pi32(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000104{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000105 return (__m64)__builtin_shufflevector((__v2si)__m1, (__v2si)__m2, 0, 2+0);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000106}
107
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000108static inline __m64 __attribute__((__always_inline__)) _mm_add_pi8(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000109{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000110 return (__m64)((__v8qi)__m1 + (__v8qi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000111}
112
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000113static inline __m64 __attribute__((__always_inline__)) _mm_add_pi16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000114{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000115 return (__m64)((__v4hi)__m1 + (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000116}
117
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000118static inline __m64 __attribute__((__always_inline__)) _mm_add_pi32(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000119{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000120 return (__m64)((__v2si)__m1 + (__v2si)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000121}
122
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000123static inline __m64 __attribute__((__always_inline__)) _mm_adds_pi8(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000124{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000125 return (__m64)__builtin_ia32_paddsb((__v8qi)__m1, (__v8qi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000126}
127
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000128static inline __m64 __attribute__((__always_inline__)) _mm_adds_pi16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000129{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000130 return (__m64)__builtin_ia32_paddsw((__v4hi)__m1, (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000131}
132
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000133static inline __m64 __attribute__((__always_inline__)) _mm_adds_pu8(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000134{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000135 return (__m64)__builtin_ia32_paddusb((__v8qi)__m1, (__v8qi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000136}
137
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000138static inline __m64 __attribute__((__always_inline__)) _mm_adds_pu16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000139{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000140 return (__m64)__builtin_ia32_paddusw((__v4hi)__m1, (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000141}
142
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000143static inline __m64 __attribute__((__always_inline__)) _mm_sub_pi8(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000144{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000145 return (__m64)((__v8qi)__m1 - (__v8qi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000146}
147
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000148static inline __m64 __attribute__((__always_inline__)) _mm_sub_pi16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000149{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000150 return (__m64)((__v4hi)__m1 - (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000151}
152
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000153static inline __m64 __attribute__((__always_inline__)) _mm_sub_pi32(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000154{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000155 return (__m64)((__v2si)__m1 - (__v2si)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000156}
157
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000158static inline __m64 __attribute__((__always_inline__)) _mm_subs_pi8(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000159{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000160 return (__m64)__builtin_ia32_psubsb((__v8qi)__m1, (__v8qi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000161}
162
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000163static inline __m64 __attribute__((__always_inline__)) _mm_subs_pi16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000164{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000165 return (__m64)__builtin_ia32_psubsw((__v4hi)__m1, (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000166}
167
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000168static inline __m64 __attribute__((__always_inline__)) _mm_subs_pu8(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000169{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000170 return (__m64)__builtin_ia32_psubusb((__v8qi)__m1, (__v8qi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000171}
172
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000173static inline __m64 __attribute__((__always_inline__)) _mm_subs_pu16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000174{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000175 return (__m64)__builtin_ia32_psubusw((__v4hi)__m1, (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000176}
177
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000178static inline __m64 __attribute__((__always_inline__)) _mm_madd_pi16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000179{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000180 return (__m64)__builtin_ia32_pmaddwd((__v4hi)__m1, (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000181}
182
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000183static inline __m64 __attribute__((__always_inline__)) _mm_mulhi_pi16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000184{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000185 return (__m64)__builtin_ia32_pmulhw((__v4hi)__m1, (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000186}
187
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000188static inline __m64 __attribute__((__always_inline__)) _mm_mullo_pi16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000189{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000190 return (__m64)((__v4hi)__m1 * (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000191}
192
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000193static inline __m64 __attribute__((__always_inline__)) _mm_sll_pi16(__m64 __m, __m64 __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000194{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000195 return (__m64)__builtin_ia32_psllw((__v4hi)__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000196}
197
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000198static inline __m64 __attribute__((__always_inline__)) _mm_slli_pi16(__m64 __m, int __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000199{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000200 return (__m64)__builtin_ia32_psllwi((__v4hi)__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000201}
202
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000203static inline __m64 __attribute__((__always_inline__)) _mm_sll_pi32(__m64 __m, __m64 __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000204{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000205 return (__m64)__builtin_ia32_pslld((__v2si)__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000206}
207
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000208static inline __m64 __attribute__((__always_inline__)) _mm_slli_pi32(__m64 __m, int __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000209{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000210 return (__m64)__builtin_ia32_pslldi((__v2si)__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000211}
212
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000213static inline __m64 __attribute__((__always_inline__)) _mm_sll_si64(__m64 __m, __m64 __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000214{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000215 return __builtin_ia32_psllq(__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000216}
217
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000218static inline __m64 __attribute__((__always_inline__)) _mm_slli_si64(__m64 __m, int __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000219{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000220 return __builtin_ia32_psllqi(__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000221}
222
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000223static inline __m64 __attribute__((__always_inline__)) _mm_sra_pi16(__m64 __m, __m64 __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000224{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000225 return (__m64)__builtin_ia32_psraw((__v4hi)__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000226}
227
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000228static inline __m64 __attribute__((__always_inline__)) _mm_srai_pi16(__m64 __m, int __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000229{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000230 return (__m64)__builtin_ia32_psrawi((__v4hi)__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000231}
232
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000233static inline __m64 __attribute__((__always_inline__)) _mm_sra_pi32(__m64 __m, __m64 __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000234{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000235 return (__m64)__builtin_ia32_psrad((__v2si)__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000236}
237
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000238static inline __m64 __attribute__((__always_inline__)) _mm_srai_pi32(__m64 __m, int __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000239{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000240 return (__m64)__builtin_ia32_psradi((__v2si)__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000241}
242
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000243static inline __m64 __attribute__((__always_inline__)) _mm_srl_pi16(__m64 __m, __m64 __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000244{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000245 return (__m64)__builtin_ia32_psrlw((__v4hi)__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000246}
247
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000248static inline __m64 __attribute__((__always_inline__)) _mm_srli_pi16(__m64 __m, int __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000249{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000250 return (__m64)__builtin_ia32_psrlwi((__v4hi)__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000251}
252
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000253static inline __m64 __attribute__((__always_inline__)) _mm_srl_pi32(__m64 __m, __m64 __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000254{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000255 return (__m64)__builtin_ia32_psrld((__v2si)__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000256}
257
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000258static inline __m64 __attribute__((__always_inline__)) _mm_srli_pi32(__m64 __m, int __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000259{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000260 return (__m64)__builtin_ia32_psrldi((__v2si)__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000261}
262
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000263static inline __m64 __attribute__((__always_inline__)) _mm_srl_si64(__m64 __m, __m64 __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000264{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000265 return (__m64)__builtin_ia32_psrlq(__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000266}
267
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000268static inline __m64 __attribute__((__always_inline__)) _mm_srli_si64(__m64 __m, int __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000269{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000270 return __builtin_ia32_psrlqi(__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000271}
272
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000273static inline __m64 __attribute__((__always_inline__)) _mm_and_si64(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000274{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000275 return __m1 & __m2;
Anders Carlsson37958ee2008-03-03 19:29:06 +0000276}
277
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000278static inline __m64 __attribute__((__always_inline__)) _mm_andnot_si64(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000279{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000280 return ~__m1 & __m2;
Anders Carlsson37958ee2008-03-03 19:29:06 +0000281}
282
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000283static inline __m64 __attribute__((__always_inline__)) _mm_or_si64(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000284{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000285 return __m1 | __m2;
Anders Carlsson37958ee2008-03-03 19:29:06 +0000286}
287
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000288static inline __m64 __attribute__((__always_inline__)) _mm_xor_si64(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000289{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000290 return __m1 ^ __m2;
Anders Carlsson37958ee2008-03-03 19:29:06 +0000291}
292
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000293static inline __m64 __attribute__((__always_inline__)) _mm_cmpeq_pi8(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000294{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000295 return (__m64)__builtin_ia32_pcmpeqb((__v8qi)__m1, (__v8qi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000296}
297
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000298static inline __m64 __attribute__((__always_inline__)) _mm_cmpeq_pi16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000299{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000300 return (__m64)__builtin_ia32_pcmpeqw((__v4hi)__m1, (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000301}
302
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000303static inline __m64 __attribute__((__always_inline__)) _mm_cmpeq_pi32(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000304{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000305 return (__m64)__builtin_ia32_pcmpeqd((__v2si)__m1, (__v2si)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000306}
307
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000308static inline __m64 __attribute__((__always_inline__)) _mm_cmpgt_pi8(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000309{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000310 return (__m64)__builtin_ia32_pcmpgtb((__v8qi)__m1, (__v8qi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000311}
312
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000313static inline __m64 __attribute__((__always_inline__)) _mm_cmpgt_pi16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000314{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000315 return (__m64)__builtin_ia32_pcmpgtw((__v4hi)__m1, (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000316}
317
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000318static inline __m64 __attribute__((__always_inline__)) _mm_cmpgt_pi32(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000319{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000320 return (__m64)__builtin_ia32_pcmpgtd((__v2si)__m1, (__v2si)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000321}
322
Daniel Dunbar0b4f69f2008-10-29 03:37:55 +0000323static inline __m64 __attribute__((__always_inline__)) _mm_setzero_si64(void)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000324{
325 return (__m64){ 0LL };
326}
327
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000328static inline __m64 __attribute__((__always_inline__)) _mm_set_pi32(int __i1, int __i0)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000329{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000330 return (__m64)(__v2si){ __i0, __i1 };
Anders Carlsson37958ee2008-03-03 19:29:06 +0000331}
332
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000333static inline __m64 __attribute__((__always_inline__)) _mm_set_pi16(short __s3, short __s2, short __s1, short __s0)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000334{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000335 return (__m64)(__v4hi){ __s0, __s1, __s2, __s3 };
Anders Carlsson37958ee2008-03-03 19:29:06 +0000336}
337
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000338static inline __m64 __attribute__((__always_inline__)) _mm_set_pi8(char __b7, char __b6, char __b5, char __b4, char __b3, char __b2, char __b1, char __b0)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000339{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000340 return (__m64)(__v8qi){ __b0, __b1, __b2, __b3, __b4, __b5, __b6, __b7 };
Anders Carlsson37958ee2008-03-03 19:29:06 +0000341}
342
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000343static inline __m64 __attribute__((__always_inline__)) _mm_set1_pi32(int __i)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000344{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000345 return (__m64)(__v2si){ __i, __i };
Anders Carlsson37958ee2008-03-03 19:29:06 +0000346}
347
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000348static inline __m64 __attribute__((__always_inline__)) _mm_set1_pi16(short __s)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000349{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000350 return (__m64)(__v4hi){ __s };
Anders Carlsson37958ee2008-03-03 19:29:06 +0000351}
352
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000353static inline __m64 __attribute__((__always_inline__)) _mm_set1_pi8(char __b)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000354{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000355 return (__m64)(__v8qi){ __b };
Anders Carlsson37958ee2008-03-03 19:29:06 +0000356}
357
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000358static inline __m64 __attribute__((__always_inline__)) _mm_setr_pi32(int __i1, int __i0)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000359{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000360 return (__m64)(__v2si){ __i1, __i0 };
Anders Carlsson37958ee2008-03-03 19:29:06 +0000361}
362
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000363static inline __m64 __attribute__((__always_inline__)) _mm_setr_pi16(short __s3, short __s2, short __s1, short __s0)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000364{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000365 return (__m64)(__v4hi){ __s3, __s2, __s1, __s0 };
Anders Carlsson37958ee2008-03-03 19:29:06 +0000366}
367
Daniel Dunbar83e61e52008-10-28 00:06:25 +0000368static inline __m64 __attribute__((__always_inline__)) _mm_setr_pi8(char __b7, char __b6, char __b5, char __b4, char __b3, char __b2, char __b1, char __b0)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000369{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000370 return (__m64)(__v8qi){ __b7, __b6, __b5, __b4, __b3, __b2, __b1, __b0 };
Anders Carlsson37958ee2008-03-03 19:29:06 +0000371}
372
373#endif /* __MMX__ */
374
375#endif /* __MMINTRIN_H */
376