blob: 97b7b0d6aee31a7eb2c0e5e449170eaa9208ca68 [file] [log] [blame]
Anders Carlssonb4b6fa02008-03-03 19:29:06 +00001/*===---- mmintrin.h - MMX intrinsics --------------------------------------===
2 *
Anders Carlssonb4b6fa02008-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 Friedmanbc03d0d2008-05-14 20:32:22 +000031typedef long long __m64 __attribute__((__vector_size__(8)));
Anders Carlssonb4b6fa02008-03-03 19:29:06 +000032
Eli Friedmanbc03d0d2008-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 Carlssonb4b6fa02008-03-03 19:29:06 +000036
Anders Carlssona18a0b92008-03-04 21:11:29 +000037inline void __attribute__((__always_inline__)) _mm_empty()
Anders Carlssonb4b6fa02008-03-03 19:29:06 +000038{
39 __builtin_ia32_emms();
40}
41
Eli Friedmanbc03d0d2008-05-14 20:32:22 +000042inline __m64 __attribute__((__always_inline__)) _mm_cvtsi32_si64(int __i)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +000043{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +000044 return (__m64)(__v2si){__i, 0};
Anders Carlssonb4b6fa02008-03-03 19:29:06 +000045}
46
Eli Friedmanbc03d0d2008-05-14 20:32:22 +000047inline int __attribute__((__always_inline__)) _mm_cvtsi64_si32(__m64 __m)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +000048{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +000049 __v2si __mmx_var2 = (__v2si)__m;
Eli Friedman8fc30672008-05-14 20:11:29 +000050 return __mmx_var2[0];
Anders Carlssonb4b6fa02008-03-03 19:29:06 +000051}
52
Eli Friedmanbc03d0d2008-05-14 20:32:22 +000053inline __m64 __attribute__((__always_inline__)) _mm_cvtsi64_m64(long long __i)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +000054{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +000055 return (__m64)__i;
Anders Carlssonb4b6fa02008-03-03 19:29:06 +000056}
57
Eli Friedmanbc03d0d2008-05-14 20:32:22 +000058inline long long __attribute__((__always_inline__)) _mm_cvtm64_si64(__m64 __m)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +000059{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +000060 return (long long)__m;
Anders Carlssonb4b6fa02008-03-03 19:29:06 +000061}
62
Eli Friedmanbc03d0d2008-05-14 20:32:22 +000063inline __m64 __attribute__((__always_inline__)) _mm_packs_pi16(__m64 __m1, __m64 __m2)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +000064{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +000065 return (__m64)__builtin_ia32_packsswb((__v4hi)__m1, (__v4hi)__m2);
Anders Carlssonb4b6fa02008-03-03 19:29:06 +000066}
67
Eli Friedmanbc03d0d2008-05-14 20:32:22 +000068inline __m64 __attribute__((__always_inline__)) _mm_packs_pi32(__m64 __m1, __m64 __m2)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +000069{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +000070 return (__m64)__builtin_ia32_packssdw((__v2si)__m1, (__v2si)__m2);
Anders Carlssonb4b6fa02008-03-03 19:29:06 +000071}
72
Eli Friedmanbc03d0d2008-05-14 20:32:22 +000073inline __m64 __attribute__((__always_inline__)) _mm_packs_pu16(__m64 __m1, __m64 __m2)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +000074{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +000075 return (__m64)__builtin_ia32_packuswb((__v4hi)__m1, (__v4hi)__m2);
Anders Carlssonb4b6fa02008-03-03 19:29:06 +000076}
77
Eli Friedmanbc03d0d2008-05-14 20:32:22 +000078inline __m64 __attribute__((__always_inline__)) _mm_unpackhi_pi8(__m64 __m1, __m64 __m2)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +000079{
Eli Friedmanbc03d0d2008-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 Carlssonb4b6fa02008-03-03 19:29:06 +000081}
82
Eli Friedmanbc03d0d2008-05-14 20:32:22 +000083inline __m64 __attribute__((__always_inline__)) _mm_unpackhi_pi16(__m64 __m1, __m64 __m2)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +000084{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +000085 return (__m64)__builtin_shufflevector((__v4hi)__m1, (__v4hi)__m2, 2, 4+2, 3, 4+3);
Anders Carlssonb4b6fa02008-03-03 19:29:06 +000086}
87
Eli Friedmanbc03d0d2008-05-14 20:32:22 +000088inline __m64 __attribute__((__always_inline__)) _mm_unpackhi_pi32(__m64 __m1, __m64 __m2)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +000089{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +000090 return (__m64)__builtin_shufflevector((__v2si)__m1, (__v2si)__m2, 1, 2+1);
Anders Carlssonb4b6fa02008-03-03 19:29:06 +000091}
92
Eli Friedmanbc03d0d2008-05-14 20:32:22 +000093inline __m64 __attribute__((__always_inline__)) _mm_unpacklo_pi8(__m64 __m1, __m64 __m2)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +000094{
Eli Friedmanbc03d0d2008-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 Carlssonb4b6fa02008-03-03 19:29:06 +000096}
97
Eli Friedmanbc03d0d2008-05-14 20:32:22 +000098inline __m64 __attribute__((__always_inline__)) _mm_unpacklo_pi16(__m64 __m1, __m64 __m2)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +000099{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000100 return (__m64)__builtin_shufflevector((__v4hi)__m1, (__v4hi)__m2, 0, 4+0, 1, 4+1);
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000101}
102
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000103inline __m64 __attribute__((__always_inline__)) _mm_unpacklo_pi32(__m64 __m1, __m64 __m2)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000104{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000105 return (__m64)__builtin_shufflevector((__v2si)__m1, (__v2si)__m2, 0, 2+0);
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000106}
107
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000108inline __m64 __attribute__((__always_inline__)) _mm_add_pi8(__m64 __m1, __m64 __m2)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000109{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000110 return (__m64)((__v8qi)__m1 + (__v8qi)__m2);
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000111}
112
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000113inline __m64 __attribute__((__always_inline__)) _mm_add_pi16(__m64 __m1, __m64 __m2)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000114{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000115 return (__m64)((__v4hi)__m1 + (__v4hi)__m2);
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000116}
117
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000118inline __m64 __attribute__((__always_inline__)) _mm_add_pi32(__m64 __m1, __m64 __m2)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000119{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000120 return (__m64)((__v2si)__m1 + (__v2si)__m2);
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000121}
122
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000123inline __m64 __attribute__((__always_inline__)) _mm_adds_pi8(__m64 __m1, __m64 __m2)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000124{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000125 return (__m64)__builtin_ia32_paddsb((__v8qi)__m1, (__v8qi)__m2);
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000126}
127
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000128inline __m64 __attribute__((__always_inline__)) _mm_adds_pi16(__m64 __m1, __m64 __m2)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000129{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000130 return (__m64)__builtin_ia32_paddsw((__v4hi)__m1, (__v4hi)__m2);
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000131}
132
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000133inline __m64 __attribute__((__always_inline__)) _mm_adds_pu8(__m64 __m1, __m64 __m2)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000134{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000135 return (__m64)__builtin_ia32_paddusb((__v8qi)__m1, (__v8qi)__m2);
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000136}
137
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000138inline __m64 __attribute__((__always_inline__)) _mm_adds_pu16(__m64 __m1, __m64 __m2)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000139{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000140 return (__m64)__builtin_ia32_paddusw((__v4hi)__m1, (__v4hi)__m2);
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000141}
142
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000143inline __m64 __attribute__((__always_inline__)) _mm_sub_pi8(__m64 __m1, __m64 __m2)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000144{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000145 return (__m64)((__v8qi)__m1 - (__v8qi)__m2);
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000146}
147
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000148inline __m64 __attribute__((__always_inline__)) _mm_sub_pi16(__m64 __m1, __m64 __m2)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000149{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000150 return (__m64)((__v4hi)__m1 - (__v4hi)__m2);
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000151}
152
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000153inline __m64 __attribute__((__always_inline__)) _mm_sub_pi32(__m64 __m1, __m64 __m2)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000154{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000155 return (__m64)((__v2si)__m1 - (__v2si)__m2);
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000156}
157
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000158inline __m64 __attribute__((__always_inline__)) _mm_subs_pi8(__m64 __m1, __m64 __m2)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000159{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000160 return (__m64)__builtin_ia32_psubsb((__v8qi)__m1, (__v8qi)__m2);
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000161}
162
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000163inline __m64 __attribute__((__always_inline__)) _mm_subs_pi16(__m64 __m1, __m64 __m2)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000164{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000165 return (__m64)__builtin_ia32_psubsw((__v4hi)__m1, (__v4hi)__m2);
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000166}
167
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000168inline __m64 __attribute__((__always_inline__)) _mm_subs_pu8(__m64 __m1, __m64 __m2)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000169{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000170 return (__m64)__builtin_ia32_psubusb((__v8qi)__m1, (__v8qi)__m2);
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000171}
172
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000173inline __m64 __attribute__((__always_inline__)) _mm_subs_pu16(__m64 __m1, __m64 __m2)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000174{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000175 return (__m64)__builtin_ia32_psubusw((__v4hi)__m1, (__v4hi)__m2);
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000176}
177
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000178inline __m64 __attribute__((__always_inline__)) _mm_madd_pi16(__m64 __m1, __m64 __m2)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000179{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000180 return (__m64)__builtin_ia32_pmaddwd((__v4hi)__m1, (__v4hi)__m2);
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000181}
182
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000183inline __m64 __attribute__((__always_inline__)) _mm_mulhi_pi16(__m64 __m1, __m64 __m2)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000184{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000185 return (__m64)__builtin_ia32_pmulhw((__v4hi)__m1, (__v4hi)__m2);
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000186}
187
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000188inline __m64 __attribute__((__always_inline__)) _mm_mullo_pi16(__m64 __m1, __m64 __m2)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000189{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000190 return (__m64)((__v4hi)__m1 * (__v4hi)__m2);
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000191}
192
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000193inline __m64 __attribute__((__always_inline__)) _mm_sll_pi16(__m64 __m, __m64 __count)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000194{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000195 return (__m64)__builtin_ia32_psllw((__v4hi)__m, __count);
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000196}
197
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000198inline __m64 __attribute__((__always_inline__)) _mm_slli_pi16(__m64 __m, int __count)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000199{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000200 return (__m64)__builtin_ia32_psllwi((__v4hi)__m, __count);
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000201}
202
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000203inline __m64 __attribute__((__always_inline__)) _mm_sll_pi32(__m64 __m, __m64 __count)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000204{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000205 return (__m64)__builtin_ia32_pslld((__v2si)__m, __count);
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000206}
207
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000208inline __m64 __attribute__((__always_inline__)) _mm_slli_pi32(__m64 __m, int __count)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000209{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000210 return (__m64)__builtin_ia32_pslldi((__v2si)__m, __count);
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000211}
212
Anders Carlsson96ad1ae2008-10-06 02:07:50 +0000213inline __m64 __attribute__((__always_inline__)) _mm_sll_si64(__m64 __m, __m64 __count)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000214{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000215 return __builtin_ia32_psllq(__m, __count);
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000216}
217
Anders Carlsson96ad1ae2008-10-06 02:07:50 +0000218inline __m64 __attribute__((__always_inline__)) _mm_slli_si64(__m64 __m, int __count)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000219{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000220 return __builtin_ia32_psllqi(__m, __count);
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000221}
222
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000223inline __m64 __attribute__((__always_inline__)) _mm_sra_pi16(__m64 __m, __m64 __count)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000224{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000225 return (__m64)__builtin_ia32_psraw((__v4hi)__m, __count);
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000226}
227
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000228inline __m64 __attribute__((__always_inline__)) _mm_srai_pi16(__m64 __m, int __count)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000229{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000230 return (__m64)__builtin_ia32_psrawi((__v4hi)__m, __count);
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000231}
232
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000233inline __m64 __attribute__((__always_inline__)) _mm_sra_pi32(__m64 __m, __m64 __count)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000234{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000235 return (__m64)__builtin_ia32_psrad((__v2si)__m, __count);
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000236}
237
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000238inline __m64 __attribute__((__always_inline__)) _mm_srai_pi32(__m64 __m, int __count)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000239{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000240 return (__m64)__builtin_ia32_psradi((__v2si)__m, __count);
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000241}
242
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000243inline __m64 __attribute__((__always_inline__)) _mm_srl_pi16(__m64 __m, __m64 __count)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000244{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000245 return (__m64)__builtin_ia32_psrlw((__v4hi)__m, __count);
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000246}
247
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000248inline __m64 __attribute__((__always_inline__)) _mm_srli_pi16(__m64 __m, int __count)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000249{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000250 return (__m64)__builtin_ia32_psrlwi((__v4hi)__m, __count);
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000251}
252
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000253inline __m64 __attribute__((__always_inline__)) _mm_srl_pi32(__m64 __m, __m64 __count)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000254{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000255 return (__m64)__builtin_ia32_psrld((__v2si)__m, __count);
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000256}
257
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000258inline __m64 __attribute__((__always_inline__)) _mm_srli_pi32(__m64 __m, int __count)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000259{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000260 return (__m64)__builtin_ia32_psrldi((__v2si)__m, __count);
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000261}
262
Anders Carlsson96ad1ae2008-10-06 02:07:50 +0000263inline __m64 __attribute__((__always_inline__)) _mm_srl_si64(__m64 __m, __m64 __count)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000264{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000265 return (__m64)__builtin_ia32_psrlq(__m, __count);
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000266}
267
Anders Carlsson96ad1ae2008-10-06 02:07:50 +0000268inline __m64 __attribute__((__always_inline__)) _mm_srli_si64(__m64 __m, int __count)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000269{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000270 return __builtin_ia32_psrlqi(__m, __count);
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000271}
272
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000273inline __m64 __attribute__((__always_inline__)) _mm_and_si64(__m64 __m1, __m64 __m2)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000274{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000275 return __m1 & __m2;
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000276}
277
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000278inline __m64 __attribute__((__always_inline__)) _mm_andnot_si64(__m64 __m1, __m64 __m2)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000279{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000280 return ~__m1 & __m2;
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000281}
282
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000283inline __m64 __attribute__((__always_inline__)) _mm_or_si64(__m64 __m1, __m64 __m2)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000284{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000285 return __m1 | __m2;
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000286}
287
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000288inline __m64 __attribute__((__always_inline__)) _mm_xor_si64(__m64 __m1, __m64 __m2)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000289{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000290 return __m1 ^ __m2;
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000291}
292
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000293inline __m64 __attribute__((__always_inline__)) _mm_cmpeq_pi8(__m64 __m1, __m64 __m2)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000294{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000295 return (__m64)__builtin_ia32_pcmpeqb((__v8qi)__m1, (__v8qi)__m2);
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000296}
297
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000298inline __m64 __attribute__((__always_inline__)) _mm_cmpeq_pi16(__m64 __m1, __m64 __m2)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000299{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000300 return (__m64)__builtin_ia32_pcmpeqw((__v4hi)__m1, (__v4hi)__m2);
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000301}
302
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000303inline __m64 __attribute__((__always_inline__)) _mm_cmpeq_pi32(__m64 __m1, __m64 __m2)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000304{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000305 return (__m64)__builtin_ia32_pcmpeqd((__v2si)__m1, (__v2si)__m2);
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000306}
307
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000308inline __m64 __attribute__((__always_inline__)) _mm_cmpgt_pi8(__m64 __m1, __m64 __m2)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000309{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000310 return (__m64)__builtin_ia32_pcmpgtb((__v8qi)__m1, (__v8qi)__m2);
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000311}
312
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000313inline __m64 __attribute__((__always_inline__)) _mm_cmpgt_pi16(__m64 __m1, __m64 __m2)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000314{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000315 return (__m64)__builtin_ia32_pcmpgtw((__v4hi)__m1, (__v4hi)__m2);
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000316}
317
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000318inline __m64 __attribute__((__always_inline__)) _mm_cmpgt_pi32(__m64 __m1, __m64 __m2)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000319{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000320 return (__m64)__builtin_ia32_pcmpgtd((__v2si)__m1, (__v2si)__m2);
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000321}
322
Anders Carlssona18a0b92008-03-04 21:11:29 +0000323inline __m64 __attribute__((__always_inline__)) _mm_setzero_si64()
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000324{
325 return (__m64){ 0LL };
326}
327
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000328inline __m64 __attribute__((__always_inline__)) _mm_set_pi32(int __i1, int __i0)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000329{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000330 return (__m64)(__v2si){ __i0, __i1 };
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000331}
332
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000333inline __m64 __attribute__((__always_inline__)) _mm_set_pi16(short __s3, short __s2, short __s1, short __s0)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000334{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000335 return (__m64)(__v4hi){ __s0, __s1, __s2, __s3 };
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000336}
337
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000338inline __m64 __attribute__((__always_inline__)) _mm_set_pi8(char __b7, char __b6, char __b5, char __b4, char __b3, char __b2, char __b1, char __b0)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000339{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000340 return (__m64)(__v8qi){ __b0, __b1, __b2, __b3, __b4, __b5, __b6, __b7 };
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000341}
342
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000343inline __m64 __attribute__((__always_inline__)) _mm_set1_pi32(int __i)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000344{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000345 return (__m64)(__v2si){ __i, __i };
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000346}
347
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000348inline __m64 __attribute__((__always_inline__)) _mm_set1_pi16(short __s)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000349{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000350 return (__m64)(__v4hi){ __s };
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000351}
352
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000353inline __m64 __attribute__((__always_inline__)) _mm_set1_pi8(char __b)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000354{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000355 return (__m64)(__v8qi){ __b };
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000356}
357
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000358inline __m64 __attribute__((__always_inline__)) _mm_setr_pi32(int __i1, int __i0)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000359{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000360 return (__m64)(__v2si){ __i1, __i0 };
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000361}
362
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000363inline __m64 __attribute__((__always_inline__)) _mm_setr_pi16(short __s3, short __s2, short __s1, short __s0)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000364{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000365 return (__m64)(__v4hi){ __s3, __s2, __s1, __s0 };
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000366}
367
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000368inline __m64 __attribute__((__always_inline__)) _mm_setr_pi8(char __b7, char __b6, char __b5, char __b4, char __b3, char __b2, char __b1, char __b0)
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000369{
Eli Friedmanbc03d0d2008-05-14 20:32:22 +0000370 return (__m64)(__v8qi){ __b7, __b6, __b5, __b4, __b3, __b2, __b1, __b0 };
Anders Carlssonb4b6fa02008-03-03 19:29:06 +0000371}
372
373#endif /* __MMX__ */
374
375#endif /* __MMINTRIN_H */
376