blob: 858f441d6a679f3737360e915f458a55c769f0f0 [file] [log] [blame]
Anders Carlsson37958ee2008-03-03 19:29:06 +00001/*===---- mmintrin.h - MMX intrinsics --------------------------------------===
2 *
3 * Copyright (c) 2008 Anders Carlsson
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining a copy
6 * of this software and associated documentation files (the "Software"), to deal
7 * in the Software without restriction, including without limitation the rights
8 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 * copies of the Software, and to permit persons to whom the Software is
10 * furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice shall be included in
13 * all copies or substantial portions of the Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 * THE SOFTWARE.
22 *
23 *===-----------------------------------------------------------------------===
24 */
25
26#ifndef __MMINTRIN_H
27#define __MMINTRIN_H
28
29#ifndef __MMX__
30#error "MMX instruction set not enabled"
31#else
32
Eli Friedmanedbd9282008-05-14 20:32:22 +000033typedef long long __m64 __attribute__((__vector_size__(8)));
Anders Carlsson37958ee2008-03-03 19:29:06 +000034
Eli Friedmanedbd9282008-05-14 20:32:22 +000035typedef int __v2si __attribute__((__vector_size__(8)));
36typedef short __v4hi __attribute__((__vector_size__(8)));
37typedef char __v8qi __attribute__((__vector_size__(8)));
Anders Carlsson37958ee2008-03-03 19:29:06 +000038
Anders Carlsson365db3b2008-03-04 21:11:29 +000039inline void __attribute__((__always_inline__)) _mm_empty()
Anders Carlsson37958ee2008-03-03 19:29:06 +000040{
41 __builtin_ia32_emms();
42}
43
Eli Friedmanedbd9282008-05-14 20:32:22 +000044inline __m64 __attribute__((__always_inline__)) _mm_cvtsi32_si64(int __i)
Anders Carlsson37958ee2008-03-03 19:29:06 +000045{
Eli Friedmanedbd9282008-05-14 20:32:22 +000046 return (__m64)(__v2si){__i, 0};
Anders Carlsson37958ee2008-03-03 19:29:06 +000047}
48
Eli Friedmanedbd9282008-05-14 20:32:22 +000049inline int __attribute__((__always_inline__)) _mm_cvtsi64_si32(__m64 __m)
Anders Carlsson37958ee2008-03-03 19:29:06 +000050{
Eli Friedmanedbd9282008-05-14 20:32:22 +000051 __v2si __mmx_var2 = (__v2si)__m;
Eli Friedman1e6d14f2008-05-14 20:11:29 +000052 return __mmx_var2[0];
Anders Carlsson37958ee2008-03-03 19:29:06 +000053}
54
Eli Friedmanedbd9282008-05-14 20:32:22 +000055inline __m64 __attribute__((__always_inline__)) _mm_cvtsi64_m64(long long __i)
Anders Carlsson37958ee2008-03-03 19:29:06 +000056{
Eli Friedmanedbd9282008-05-14 20:32:22 +000057 return (__m64)__i;
Anders Carlsson37958ee2008-03-03 19:29:06 +000058}
59
Eli Friedmanedbd9282008-05-14 20:32:22 +000060inline long long __attribute__((__always_inline__)) _mm_cvtm64_si64(__m64 __m)
Anders Carlsson37958ee2008-03-03 19:29:06 +000061{
Eli Friedmanedbd9282008-05-14 20:32:22 +000062 return (long long)__m;
Anders Carlsson37958ee2008-03-03 19:29:06 +000063}
64
Eli Friedmanedbd9282008-05-14 20:32:22 +000065inline __m64 __attribute__((__always_inline__)) _mm_packs_pi16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +000066{
Eli Friedmanedbd9282008-05-14 20:32:22 +000067 return (__m64)__builtin_ia32_packsswb((__v4hi)__m1, (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +000068}
69
Eli Friedmanedbd9282008-05-14 20:32:22 +000070inline __m64 __attribute__((__always_inline__)) _mm_packs_pi32(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +000071{
Eli Friedmanedbd9282008-05-14 20:32:22 +000072 return (__m64)__builtin_ia32_packssdw((__v2si)__m1, (__v2si)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +000073}
74
Eli Friedmanedbd9282008-05-14 20:32:22 +000075inline __m64 __attribute__((__always_inline__)) _mm_packs_pu16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +000076{
Eli Friedmanedbd9282008-05-14 20:32:22 +000077 return (__m64)__builtin_ia32_packuswb((__v4hi)__m1, (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +000078}
79
Eli Friedmanedbd9282008-05-14 20:32:22 +000080inline __m64 __attribute__((__always_inline__)) _mm_unpackhi_pi8(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +000081{
Eli Friedmanedbd9282008-05-14 20:32:22 +000082 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 +000083}
84
Eli Friedmanedbd9282008-05-14 20:32:22 +000085inline __m64 __attribute__((__always_inline__)) _mm_unpackhi_pi16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +000086{
Eli Friedmanedbd9282008-05-14 20:32:22 +000087 return (__m64)__builtin_shufflevector((__v4hi)__m1, (__v4hi)__m2, 2, 4+2, 3, 4+3);
Anders Carlsson37958ee2008-03-03 19:29:06 +000088}
89
Eli Friedmanedbd9282008-05-14 20:32:22 +000090inline __m64 __attribute__((__always_inline__)) _mm_unpackhi_pi32(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +000091{
Eli Friedmanedbd9282008-05-14 20:32:22 +000092 return (__m64)__builtin_shufflevector((__v2si)__m1, (__v2si)__m2, 1, 2+1);
Anders Carlsson37958ee2008-03-03 19:29:06 +000093}
94
Eli Friedmanedbd9282008-05-14 20:32:22 +000095inline __m64 __attribute__((__always_inline__)) _mm_unpacklo_pi8(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +000096{
Eli Friedmanedbd9282008-05-14 20:32:22 +000097 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 +000098}
99
Eli Friedmanedbd9282008-05-14 20:32:22 +0000100inline __m64 __attribute__((__always_inline__)) _mm_unpacklo_pi16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000101{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000102 return (__m64)__builtin_shufflevector((__v4hi)__m1, (__v4hi)__m2, 0, 4+0, 1, 4+1);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000103}
104
Eli Friedmanedbd9282008-05-14 20:32:22 +0000105inline __m64 __attribute__((__always_inline__)) _mm_unpacklo_pi32(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000106{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000107 return (__m64)__builtin_shufflevector((__v2si)__m1, (__v2si)__m2, 0, 2+0);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000108}
109
Eli Friedmanedbd9282008-05-14 20:32:22 +0000110inline __m64 __attribute__((__always_inline__)) _mm_add_pi8(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000111{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000112 return (__m64)((__v8qi)__m1 + (__v8qi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000113}
114
Eli Friedmanedbd9282008-05-14 20:32:22 +0000115inline __m64 __attribute__((__always_inline__)) _mm_add_pi16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000116{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000117 return (__m64)((__v4hi)__m1 + (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000118}
119
Eli Friedmanedbd9282008-05-14 20:32:22 +0000120inline __m64 __attribute__((__always_inline__)) _mm_add_pi32(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000121{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000122 return (__m64)((__v2si)__m1 + (__v2si)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000123}
124
Eli Friedmanedbd9282008-05-14 20:32:22 +0000125inline __m64 __attribute__((__always_inline__)) _mm_adds_pi8(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000126{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000127 return (__m64)__builtin_ia32_paddsb((__v8qi)__m1, (__v8qi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000128}
129
Eli Friedmanedbd9282008-05-14 20:32:22 +0000130inline __m64 __attribute__((__always_inline__)) _mm_adds_pi16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000131{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000132 return (__m64)__builtin_ia32_paddsw((__v4hi)__m1, (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000133}
134
Eli Friedmanedbd9282008-05-14 20:32:22 +0000135inline __m64 __attribute__((__always_inline__)) _mm_adds_pu8(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000136{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000137 return (__m64)__builtin_ia32_paddusb((__v8qi)__m1, (__v8qi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000138}
139
Eli Friedmanedbd9282008-05-14 20:32:22 +0000140inline __m64 __attribute__((__always_inline__)) _mm_adds_pu16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000141{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000142 return (__m64)__builtin_ia32_paddusw((__v4hi)__m1, (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000143}
144
Eli Friedmanedbd9282008-05-14 20:32:22 +0000145inline __m64 __attribute__((__always_inline__)) _mm_sub_pi8(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000146{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000147 return (__m64)((__v8qi)__m1 - (__v8qi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000148}
149
Eli Friedmanedbd9282008-05-14 20:32:22 +0000150inline __m64 __attribute__((__always_inline__)) _mm_sub_pi16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000151{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000152 return (__m64)((__v4hi)__m1 - (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000153}
154
Eli Friedmanedbd9282008-05-14 20:32:22 +0000155inline __m64 __attribute__((__always_inline__)) _mm_sub_pi32(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000156{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000157 return (__m64)((__v2si)__m1 - (__v2si)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000158}
159
Eli Friedmanedbd9282008-05-14 20:32:22 +0000160inline __m64 __attribute__((__always_inline__)) _mm_subs_pi8(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000161{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000162 return (__m64)__builtin_ia32_psubsb((__v8qi)__m1, (__v8qi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000163}
164
Eli Friedmanedbd9282008-05-14 20:32:22 +0000165inline __m64 __attribute__((__always_inline__)) _mm_subs_pi16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000166{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000167 return (__m64)__builtin_ia32_psubsw((__v4hi)__m1, (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000168}
169
Eli Friedmanedbd9282008-05-14 20:32:22 +0000170inline __m64 __attribute__((__always_inline__)) _mm_subs_pu8(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000171{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000172 return (__m64)__builtin_ia32_psubusb((__v8qi)__m1, (__v8qi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000173}
174
Eli Friedmanedbd9282008-05-14 20:32:22 +0000175inline __m64 __attribute__((__always_inline__)) _mm_subs_pu16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000176{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000177 return (__m64)__builtin_ia32_psubusw((__v4hi)__m1, (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000178}
179
Eli Friedmanedbd9282008-05-14 20:32:22 +0000180inline __m64 __attribute__((__always_inline__)) _mm_madd_pi16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000181{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000182 return (__m64)__builtin_ia32_pmaddwd((__v4hi)__m1, (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000183}
184
Eli Friedmanedbd9282008-05-14 20:32:22 +0000185inline __m64 __attribute__((__always_inline__)) _mm_mulhi_pi16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000186{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000187 return (__m64)__builtin_ia32_pmulhw((__v4hi)__m1, (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000188}
189
Eli Friedmanedbd9282008-05-14 20:32:22 +0000190inline __m64 __attribute__((__always_inline__)) _mm_mullo_pi16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000191{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000192 return (__m64)((__v4hi)__m1 * (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000193}
194
Eli Friedmanedbd9282008-05-14 20:32:22 +0000195inline __m64 __attribute__((__always_inline__)) _mm_sll_pi16(__m64 __m, __m64 __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000196{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000197 return (__m64)__builtin_ia32_psllw((__v4hi)__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000198}
199
Eli Friedmanedbd9282008-05-14 20:32:22 +0000200inline __m64 __attribute__((__always_inline__)) _mm_slli_pi16(__m64 __m, int __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000201{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000202 return (__m64)__builtin_ia32_psllwi((__v4hi)__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000203}
204
Eli Friedmanedbd9282008-05-14 20:32:22 +0000205inline __m64 __attribute__((__always_inline__)) _mm_sll_pi32(__m64 __m, __m64 __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000206{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000207 return (__m64)__builtin_ia32_pslld((__v2si)__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000208}
209
Eli Friedmanedbd9282008-05-14 20:32:22 +0000210inline __m64 __attribute__((__always_inline__)) _mm_slli_pi32(__m64 __m, int __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000211{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000212 return (__m64)__builtin_ia32_pslldi((__v2si)__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000213}
214
Eli Friedmanedbd9282008-05-14 20:32:22 +0000215inline __m64 __attribute__((__always_inline__)) _mm_sll_pi64(__m64 __m, __m64 __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000216{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000217 return __builtin_ia32_psllq(__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000218}
219
Eli Friedmanedbd9282008-05-14 20:32:22 +0000220inline __m64 __attribute__((__always_inline__)) _mm_slli_pi64(__m64 __m, int __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000221{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000222 return __builtin_ia32_psllqi(__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000223}
224
Eli Friedmanedbd9282008-05-14 20:32:22 +0000225inline __m64 __attribute__((__always_inline__)) _mm_sra_pi16(__m64 __m, __m64 __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000226{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000227 return (__m64)__builtin_ia32_psraw((__v4hi)__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000228}
229
Eli Friedmanedbd9282008-05-14 20:32:22 +0000230inline __m64 __attribute__((__always_inline__)) _mm_srai_pi16(__m64 __m, int __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000231{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000232 return (__m64)__builtin_ia32_psrawi((__v4hi)__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000233}
234
Eli Friedmanedbd9282008-05-14 20:32:22 +0000235inline __m64 __attribute__((__always_inline__)) _mm_sra_pi32(__m64 __m, __m64 __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000236{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000237 return (__m64)__builtin_ia32_psrad((__v2si)__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000238}
239
Eli Friedmanedbd9282008-05-14 20:32:22 +0000240inline __m64 __attribute__((__always_inline__)) _mm_srai_pi32(__m64 __m, int __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000241{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000242 return (__m64)__builtin_ia32_psradi((__v2si)__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000243}
244
Eli Friedmanedbd9282008-05-14 20:32:22 +0000245inline __m64 __attribute__((__always_inline__)) _mm_srl_pi16(__m64 __m, __m64 __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000246{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000247 return (__m64)__builtin_ia32_psrlw((__v4hi)__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000248}
249
Eli Friedmanedbd9282008-05-14 20:32:22 +0000250inline __m64 __attribute__((__always_inline__)) _mm_srli_pi16(__m64 __m, int __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000251{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000252 return (__m64)__builtin_ia32_psrlwi((__v4hi)__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000253}
254
Eli Friedmanedbd9282008-05-14 20:32:22 +0000255inline __m64 __attribute__((__always_inline__)) _mm_srl_pi32(__m64 __m, __m64 __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000256{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000257 return (__m64)__builtin_ia32_psrld((__v2si)__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000258}
259
Eli Friedmanedbd9282008-05-14 20:32:22 +0000260inline __m64 __attribute__((__always_inline__)) _mm_srli_pi32(__m64 __m, int __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000261{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000262 return (__m64)__builtin_ia32_psrldi((__v2si)__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000263}
264
Eli Friedmanedbd9282008-05-14 20:32:22 +0000265inline __m64 __attribute__((__always_inline__)) _mm_srl_pi64(__m64 __m, __m64 __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000266{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000267 return (__m64)__builtin_ia32_psrlq(__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000268}
269
Eli Friedmanedbd9282008-05-14 20:32:22 +0000270inline __m64 __attribute__((__always_inline__)) _mm_srli_pi64(__m64 __m, int __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000271{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000272 return __builtin_ia32_psrlqi(__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000273}
274
Eli Friedmanedbd9282008-05-14 20:32:22 +0000275inline __m64 __attribute__((__always_inline__)) _mm_and_si64(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000276{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000277 return __m1 & __m2;
Anders Carlsson37958ee2008-03-03 19:29:06 +0000278}
279
Eli Friedmanedbd9282008-05-14 20:32:22 +0000280inline __m64 __attribute__((__always_inline__)) _mm_andnot_si64(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000281{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000282 return ~__m1 & __m2;
Anders Carlsson37958ee2008-03-03 19:29:06 +0000283}
284
Eli Friedmanedbd9282008-05-14 20:32:22 +0000285inline __m64 __attribute__((__always_inline__)) _mm_or_si64(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000286{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000287 return __m1 | __m2;
Anders Carlsson37958ee2008-03-03 19:29:06 +0000288}
289
Eli Friedmanedbd9282008-05-14 20:32:22 +0000290inline __m64 __attribute__((__always_inline__)) _mm_xor_si64(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000291{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000292 return __m1 ^ __m2;
Anders Carlsson37958ee2008-03-03 19:29:06 +0000293}
294
Eli Friedmanedbd9282008-05-14 20:32:22 +0000295inline __m64 __attribute__((__always_inline__)) _mm_cmpeq_pi8(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000296{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000297 return (__m64)__builtin_ia32_pcmpeqb((__v8qi)__m1, (__v8qi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000298}
299
Eli Friedmanedbd9282008-05-14 20:32:22 +0000300inline __m64 __attribute__((__always_inline__)) _mm_cmpeq_pi16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000301{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000302 return (__m64)__builtin_ia32_pcmpeqw((__v4hi)__m1, (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000303}
304
Eli Friedmanedbd9282008-05-14 20:32:22 +0000305inline __m64 __attribute__((__always_inline__)) _mm_cmpeq_pi32(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000306{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000307 return (__m64)__builtin_ia32_pcmpeqd((__v2si)__m1, (__v2si)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000308}
309
Eli Friedmanedbd9282008-05-14 20:32:22 +0000310inline __m64 __attribute__((__always_inline__)) _mm_cmpgt_pi8(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000311{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000312 return (__m64)__builtin_ia32_pcmpgtb((__v8qi)__m1, (__v8qi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000313}
314
Eli Friedmanedbd9282008-05-14 20:32:22 +0000315inline __m64 __attribute__((__always_inline__)) _mm_cmpgt_pi16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000316{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000317 return (__m64)__builtin_ia32_pcmpgtw((__v4hi)__m1, (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000318}
319
Eli Friedmanedbd9282008-05-14 20:32:22 +0000320inline __m64 __attribute__((__always_inline__)) _mm_cmpgt_pi32(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000321{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000322 return (__m64)__builtin_ia32_pcmpgtd((__v2si)__m1, (__v2si)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000323}
324
Anders Carlsson365db3b2008-03-04 21:11:29 +0000325inline __m64 __attribute__((__always_inline__)) _mm_setzero_si64()
Anders Carlsson37958ee2008-03-03 19:29:06 +0000326{
327 return (__m64){ 0LL };
328}
329
Eli Friedmanedbd9282008-05-14 20:32:22 +0000330inline __m64 __attribute__((__always_inline__)) _mm_set_pi32(int __i1, int __i0)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000331{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000332 return (__m64)(__v2si){ __i0, __i1 };
Anders Carlsson37958ee2008-03-03 19:29:06 +0000333}
334
Eli Friedmanedbd9282008-05-14 20:32:22 +0000335inline __m64 __attribute__((__always_inline__)) _mm_set_pi16(short __s3, short __s2, short __s1, short __s0)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000336{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000337 return (__m64)(__v4hi){ __s0, __s1, __s2, __s3 };
Anders Carlsson37958ee2008-03-03 19:29:06 +0000338}
339
Eli Friedmanedbd9282008-05-14 20:32:22 +0000340inline __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 +0000341{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000342 return (__m64)(__v8qi){ __b0, __b1, __b2, __b3, __b4, __b5, __b6, __b7 };
Anders Carlsson37958ee2008-03-03 19:29:06 +0000343}
344
Eli Friedmanedbd9282008-05-14 20:32:22 +0000345inline __m64 __attribute__((__always_inline__)) _mm_set1_pi32(int __i)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000346{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000347 return (__m64)(__v2si){ __i, __i };
Anders Carlsson37958ee2008-03-03 19:29:06 +0000348}
349
Eli Friedmanedbd9282008-05-14 20:32:22 +0000350inline __m64 __attribute__((__always_inline__)) _mm_set1_pi16(short __s)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000351{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000352 return (__m64)(__v4hi){ __s };
Anders Carlsson37958ee2008-03-03 19:29:06 +0000353}
354
Eli Friedmanedbd9282008-05-14 20:32:22 +0000355inline __m64 __attribute__((__always_inline__)) _mm_set1_pi8(char __b)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000356{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000357 return (__m64)(__v8qi){ __b };
Anders Carlsson37958ee2008-03-03 19:29:06 +0000358}
359
Eli Friedmanedbd9282008-05-14 20:32:22 +0000360inline __m64 __attribute__((__always_inline__)) _mm_setr_pi32(int __i1, int __i0)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000361{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000362 return (__m64)(__v2si){ __i1, __i0 };
Anders Carlsson37958ee2008-03-03 19:29:06 +0000363}
364
Eli Friedmanedbd9282008-05-14 20:32:22 +0000365inline __m64 __attribute__((__always_inline__)) _mm_setr_pi16(short __s3, short __s2, short __s1, short __s0)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000366{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000367 return (__m64)(__v4hi){ __s3, __s2, __s1, __s0 };
Anders Carlsson37958ee2008-03-03 19:29:06 +0000368}
369
Eli Friedmanedbd9282008-05-14 20:32:22 +0000370inline __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 +0000371{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000372 return (__m64)(__v8qi){ __b7, __b6, __b5, __b4, __b3, __b2, __b1, __b0 };
Anders Carlsson37958ee2008-03-03 19:29:06 +0000373}
374
375#endif /* __MMX__ */
376
377#endif /* __MMINTRIN_H */
378