blob: 986870a96883c2a02cb92a18ac73382fa275ac7f [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)));
Anders Carlsson4bf4e302009-09-18 19:18:19 +000035typedef char __v8qi __attribute__((__vector_size__(8)));
Anders Carlsson37958ee2008-03-03 19:29:06 +000036
Chris Lattner1bddbcb2010-03-22 18:14:12 +000037static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +000038_mm_empty(void)
Anders Carlsson37958ee2008-03-03 19:29:06 +000039{
40 __builtin_ia32_emms();
41}
42
Chris Lattner1bddbcb2010-03-22 18:14:12 +000043static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +000044_mm_cvtsi32_si64(int __i)
Anders Carlsson37958ee2008-03-03 19:29:06 +000045{
Dale Johannesend47e2622010-09-30 23:57:50 +000046 return (__m64)__builtin_ia32_vec_init_v2si(__i, 0);
Anders Carlsson37958ee2008-03-03 19:29:06 +000047}
48
Chris Lattner1bddbcb2010-03-22 18:14:12 +000049static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +000050_mm_cvtsi64_si32(__m64 __m)
Anders Carlsson37958ee2008-03-03 19:29:06 +000051{
Dale Johannesend47e2622010-09-30 23:57:50 +000052 return __builtin_ia32_vec_ext_v2si((__v2si)__m, 0);
Anders Carlsson37958ee2008-03-03 19:29:06 +000053}
54
Chris Lattner1bddbcb2010-03-22 18:14:12 +000055static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +000056_mm_cvtsi64_m64(long long __i)
Anders Carlsson37958ee2008-03-03 19:29:06 +000057{
Eli Friedmanedbd9282008-05-14 20:32:22 +000058 return (__m64)__i;
Anders Carlsson37958ee2008-03-03 19:29:06 +000059}
60
Chris Lattner1bddbcb2010-03-22 18:14:12 +000061static __inline__ long long __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +000062_mm_cvtm64_si64(__m64 __m)
Anders Carlsson37958ee2008-03-03 19:29:06 +000063{
Eli Friedmanedbd9282008-05-14 20:32:22 +000064 return (long long)__m;
Anders Carlsson37958ee2008-03-03 19:29:06 +000065}
66
Chris Lattner1bddbcb2010-03-22 18:14:12 +000067static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +000068_mm_packs_pi16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +000069{
Eli Friedmanedbd9282008-05-14 20:32:22 +000070 return (__m64)__builtin_ia32_packsswb((__v4hi)__m1, (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +000071}
72
Chris Lattner1bddbcb2010-03-22 18:14:12 +000073static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +000074_mm_packs_pi32(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +000075{
Eli Friedmanedbd9282008-05-14 20:32:22 +000076 return (__m64)__builtin_ia32_packssdw((__v2si)__m1, (__v2si)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +000077}
78
Chris Lattner1bddbcb2010-03-22 18:14:12 +000079static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +000080_mm_packs_pu16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +000081{
Eli Friedmanedbd9282008-05-14 20:32:22 +000082 return (__m64)__builtin_ia32_packuswb((__v4hi)__m1, (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +000083}
84
Chris Lattner1bddbcb2010-03-22 18:14:12 +000085static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +000086_mm_unpackhi_pi8(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +000087{
Dale Johannesend47e2622010-09-30 23:57:50 +000088 return (__m64)__builtin_ia32_punpckhbw((__v8qi)__m1, (__v8qi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +000089}
90
Chris Lattner1bddbcb2010-03-22 18:14:12 +000091static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +000092_mm_unpackhi_pi16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +000093{
Dale Johannesend47e2622010-09-30 23:57:50 +000094 return (__m64)__builtin_ia32_punpckhwd((__v4hi)__m1, (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +000095}
96
Chris Lattner1bddbcb2010-03-22 18:14:12 +000097static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +000098_mm_unpackhi_pi32(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +000099{
Dale Johannesend47e2622010-09-30 23:57:50 +0000100 return (__m64)__builtin_ia32_punpckhdq((__v2si)__m1, (__v2si)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000101}
102
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000103static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000104_mm_unpacklo_pi8(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000105{
Dale Johannesend47e2622010-09-30 23:57:50 +0000106 return (__m64)__builtin_ia32_punpcklbw((__v8qi)__m1, (__v8qi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000107}
108
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000109static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000110_mm_unpacklo_pi16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000111{
Dale Johannesend47e2622010-09-30 23:57:50 +0000112 return (__m64)__builtin_ia32_punpcklwd((__v4hi)__m1, (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000113}
114
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000115static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000116_mm_unpacklo_pi32(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000117{
Dale Johannesend47e2622010-09-30 23:57:50 +0000118 return (__m64)__builtin_ia32_punpckldq((__v2si)__m1, (__v2si)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000119}
120
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000121static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000122_mm_add_pi8(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000123{
Dale Johannesend47e2622010-09-30 23:57:50 +0000124 return (__m64)__builtin_ia32_paddb((__v8qi)__m1, (__v8qi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000125}
126
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000127static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000128_mm_add_pi16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000129{
Dale Johannesend47e2622010-09-30 23:57:50 +0000130 return (__m64)__builtin_ia32_paddw((__v4hi)__m1, (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000131}
132
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000133static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000134_mm_add_pi32(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000135{
Dale Johannesend47e2622010-09-30 23:57:50 +0000136 return (__m64)__builtin_ia32_paddd((__v2si)__m1, (__v2si)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000137}
138
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000139static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000140_mm_adds_pi8(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000141{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000142 return (__m64)__builtin_ia32_paddsb((__v8qi)__m1, (__v8qi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000143}
144
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000145static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000146_mm_adds_pi16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000147{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000148 return (__m64)__builtin_ia32_paddsw((__v4hi)__m1, (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000149}
150
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000151static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000152_mm_adds_pu8(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000153{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000154 return (__m64)__builtin_ia32_paddusb((__v8qi)__m1, (__v8qi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000155}
156
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000157static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000158_mm_adds_pu16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000159{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000160 return (__m64)__builtin_ia32_paddusw((__v4hi)__m1, (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000161}
162
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000163static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000164_mm_sub_pi8(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000165{
Dale Johannesend47e2622010-09-30 23:57:50 +0000166 return (__m64)__builtin_ia32_psubb((__v8qi)__m1, (__v8qi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000167}
168
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000169static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000170_mm_sub_pi16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000171{
Dale Johannesend47e2622010-09-30 23:57:50 +0000172 return (__m64)__builtin_ia32_psubw((__v4hi)__m1, (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000173}
174
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000175static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000176_mm_sub_pi32(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000177{
Dale Johannesend47e2622010-09-30 23:57:50 +0000178 return (__m64)__builtin_ia32_psubd((__v2si)__m1, (__v2si)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000179}
180
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000181static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000182_mm_subs_pi8(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000183{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000184 return (__m64)__builtin_ia32_psubsb((__v8qi)__m1, (__v8qi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000185}
186
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000187static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000188_mm_subs_pi16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000189{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000190 return (__m64)__builtin_ia32_psubsw((__v4hi)__m1, (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000191}
192
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000193static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000194_mm_subs_pu8(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000195{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000196 return (__m64)__builtin_ia32_psubusb((__v8qi)__m1, (__v8qi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000197}
198
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000199static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000200_mm_subs_pu16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000201{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000202 return (__m64)__builtin_ia32_psubusw((__v4hi)__m1, (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000203}
204
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000205static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000206_mm_madd_pi16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000207{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000208 return (__m64)__builtin_ia32_pmaddwd((__v4hi)__m1, (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000209}
210
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000211static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000212_mm_mulhi_pi16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000213{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000214 return (__m64)__builtin_ia32_pmulhw((__v4hi)__m1, (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000215}
216
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000217static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000218_mm_mullo_pi16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000219{
Dale Johannesend47e2622010-09-30 23:57:50 +0000220 return (__m64)__builtin_ia32_pmullw((__v4hi)__m1, (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000221}
222
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000223static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000224_mm_sll_pi16(__m64 __m, __m64 __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000225{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000226 return (__m64)__builtin_ia32_psllw((__v4hi)__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000227}
228
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000229static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000230_mm_slli_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_psllwi((__v4hi)__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000233}
234
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000235static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000236_mm_sll_pi32(__m64 __m, __m64 __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000237{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000238 return (__m64)__builtin_ia32_pslld((__v2si)__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000239}
240
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000241static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000242_mm_slli_pi32(__m64 __m, int __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000243{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000244 return (__m64)__builtin_ia32_pslldi((__v2si)__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000245}
246
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000247static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000248_mm_sll_si64(__m64 __m, __m64 __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000249{
Dale Johannesend47e2622010-09-30 23:57:50 +0000250 return (__m64)__builtin_ia32_psllq(__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000251}
252
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000253static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000254_mm_slli_si64(__m64 __m, int __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000255{
Dale Johannesend47e2622010-09-30 23:57:50 +0000256 return (__m64)__builtin_ia32_psllqi(__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000257}
258
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000259static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000260_mm_sra_pi16(__m64 __m, __m64 __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000261{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000262 return (__m64)__builtin_ia32_psraw((__v4hi)__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000263}
264
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000265static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000266_mm_srai_pi16(__m64 __m, int __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000267{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000268 return (__m64)__builtin_ia32_psrawi((__v4hi)__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000269}
270
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000271static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000272_mm_sra_pi32(__m64 __m, __m64 __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000273{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000274 return (__m64)__builtin_ia32_psrad((__v2si)__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000275}
276
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000277static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000278_mm_srai_pi32(__m64 __m, int __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000279{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000280 return (__m64)__builtin_ia32_psradi((__v2si)__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000281}
282
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000283static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000284_mm_srl_pi16(__m64 __m, __m64 __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000285{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000286 return (__m64)__builtin_ia32_psrlw((__v4hi)__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000287}
288
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000289static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000290_mm_srli_pi16(__m64 __m, int __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000291{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000292 return (__m64)__builtin_ia32_psrlwi((__v4hi)__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000293}
294
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000295static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000296_mm_srl_pi32(__m64 __m, __m64 __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000297{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000298 return (__m64)__builtin_ia32_psrld((__v2si)__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000299}
300
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000301static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000302_mm_srli_pi32(__m64 __m, int __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000303{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000304 return (__m64)__builtin_ia32_psrldi((__v2si)__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000305}
306
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000307static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000308_mm_srl_si64(__m64 __m, __m64 __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000309{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000310 return (__m64)__builtin_ia32_psrlq(__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000311}
312
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000313static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000314_mm_srli_si64(__m64 __m, int __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000315{
Dale Johannesend47e2622010-09-30 23:57:50 +0000316 return (__m64)__builtin_ia32_psrlqi(__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000317}
318
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000319static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000320_mm_and_si64(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000321{
Dale Johannesend47e2622010-09-30 23:57:50 +0000322 return __builtin_ia32_pand(__m1, __m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000323}
324
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000325static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000326_mm_andnot_si64(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000327{
Dale Johannesend47e2622010-09-30 23:57:50 +0000328 return __builtin_ia32_pandn(__m1, __m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000329}
330
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000331static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000332_mm_or_si64(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000333{
Dale Johannesend47e2622010-09-30 23:57:50 +0000334 return __builtin_ia32_por(__m1, __m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000335}
336
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000337static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000338_mm_xor_si64(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000339{
Dale Johannesend47e2622010-09-30 23:57:50 +0000340 return __builtin_ia32_pxor(__m1, __m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000341}
342
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000343static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000344_mm_cmpeq_pi8(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000345{
Dale Johannesend47e2622010-09-30 23:57:50 +0000346 return (__m64)__builtin_ia32_pcmpeqb((__v8qi)__m1, (__v8qi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000347}
348
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000349static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000350_mm_cmpeq_pi16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000351{
Dale Johannesend47e2622010-09-30 23:57:50 +0000352 return (__m64)__builtin_ia32_pcmpeqw((__v4hi)__m1, (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000353}
354
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000355static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000356_mm_cmpeq_pi32(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000357{
Dale Johannesend47e2622010-09-30 23:57:50 +0000358 return (__m64)__builtin_ia32_pcmpeqd((__v2si)__m1, (__v2si)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000359}
360
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000361static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000362_mm_cmpgt_pi8(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000363{
Dale Johannesend47e2622010-09-30 23:57:50 +0000364 return (__m64)__builtin_ia32_pcmpgtb((__v8qi)__m1, (__v8qi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000365}
366
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000367static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000368_mm_cmpgt_pi16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000369{
Dale Johannesend47e2622010-09-30 23:57:50 +0000370 return (__m64)__builtin_ia32_pcmpgtw((__v4hi)__m1, (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000371}
372
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000373static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000374_mm_cmpgt_pi32(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000375{
Dale Johannesend47e2622010-09-30 23:57:50 +0000376 return (__m64)__builtin_ia32_pcmpgtd((__v2si)__m1, (__v2si)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000377}
378
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000379static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000380_mm_setzero_si64(void)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000381{
382 return (__m64){ 0LL };
383}
384
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000385static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000386_mm_set_pi32(int __i1, int __i0)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000387{
Dale Johannesend47e2622010-09-30 23:57:50 +0000388 return (__m64)__builtin_ia32_vec_init_v2si(__i0, __i1);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000389}
390
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000391static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000392_mm_set_pi16(short __s3, short __s2, short __s1, short __s0)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000393{
Dale Johannesend47e2622010-09-30 23:57:50 +0000394 return (__m64)__builtin_ia32_vec_init_v4hi(__s0, __s1, __s2, __s3);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000395}
396
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000397static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000398_mm_set_pi8(char __b7, char __b6, char __b5, char __b4, char __b3, char __b2,
399 char __b1, char __b0)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000400{
Dale Johannesend47e2622010-09-30 23:57:50 +0000401 return (__m64)__builtin_ia32_vec_init_v8qi(__b0, __b1, __b2, __b3,
402 __b4, __b5, __b6, __b7);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000403}
404
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000405static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000406_mm_set1_pi32(int __i)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000407{
Dale Johannesend47e2622010-09-30 23:57:50 +0000408 return _mm_set_pi32(__i, __i);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000409}
410
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000411static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Dale Johannesend47e2622010-09-30 23:57:50 +0000412_mm_set1_pi16(short __w)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000413{
Dale Johannesend47e2622010-09-30 23:57:50 +0000414 return _mm_set_pi16(__w, __w, __w, __w);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000415}
416
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000417static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000418_mm_set1_pi8(char __b)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000419{
Dale Johannesend47e2622010-09-30 23:57:50 +0000420 return _mm_set_pi8(__b, __b, __b, __b, __b, __b, __b, __b);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000421}
422
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000423static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Eli Friedman83a401b2011-05-05 20:21:54 +0000424_mm_setr_pi32(int __i0, int __i1)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000425{
Dale Johannesend47e2622010-09-30 23:57:50 +0000426 return _mm_set_pi32(__i1, __i0);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000427}
428
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000429static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Eli Friedman83a401b2011-05-05 20:21:54 +0000430_mm_setr_pi16(short __w0, short __w1, short __w2, short __w3)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000431{
Dale Johannesend47e2622010-09-30 23:57:50 +0000432 return _mm_set_pi16(__w3, __w2, __w1, __w0);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000433}
434
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000435static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Eli Friedman83a401b2011-05-05 20:21:54 +0000436_mm_setr_pi8(char __b0, char __b1, char __b2, char __b3, char __b4, char __b5,
437 char __b6, char __b7)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000438{
Dale Johannesend47e2622010-09-30 23:57:50 +0000439 return _mm_set_pi8(__b7, __b6, __b5, __b4, __b3, __b2, __b1, __b0);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000440}
441
Chandler Carruthfa38c812010-07-22 06:47:28 +0000442
443/* Aliases for compatibility. */
444#define _m_empty _mm_empty
445#define _m_from_int _mm_cvtsi32_si64
446#define _m_to_int _mm_cvtsi64_si32
447#define _m_packsswb _mm_packs_pi16
448#define _m_packssdw _mm_packs_pi32
449#define _m_packuswb _mm_packs_pu16
450#define _m_punpckhbw _mm_unpackhi_pi8
451#define _m_punpckhwd _mm_unpackhi_pi16
452#define _m_punpckhdq _mm_unpackhi_pi32
453#define _m_punpcklbw _mm_unpacklo_pi8
454#define _m_punpcklwd _mm_unpacklo_pi16
455#define _m_punpckldq _mm_unpacklo_pi32
456#define _m_paddb _mm_add_pi8
457#define _m_paddw _mm_add_pi16
458#define _m_paddd _mm_add_pi32
459#define _m_paddsb _mm_adds_pi8
460#define _m_paddsw _mm_adds_pi16
461#define _m_paddusb _mm_adds_pu8
462#define _m_paddusw _mm_adds_pu16
463#define _m_psubb _mm_sub_pi8
464#define _m_psubw _mm_sub_pi16
465#define _m_psubd _mm_sub_pi32
466#define _m_psubsb _mm_subs_pi8
467#define _m_psubsw _mm_subs_pi16
468#define _m_psubusb _mm_subs_pu8
469#define _m_psubusw _mm_subs_pu16
470#define _m_pmaddwd _mm_madd_pi16
471#define _m_pmulhw _mm_mulhi_pi16
472#define _m_pmullw _mm_mullo_pi16
473#define _m_psllw _mm_sll_pi16
474#define _m_psllwi _mm_slli_pi16
475#define _m_pslld _mm_sll_pi32
476#define _m_pslldi _mm_slli_pi32
Chandler Carruth6b6fe282010-08-08 08:44:32 +0000477#define _m_psllq _mm_sll_si64
478#define _m_psllqi _mm_slli_si64
Chandler Carruthfa38c812010-07-22 06:47:28 +0000479#define _m_psraw _mm_sra_pi16
480#define _m_psrawi _mm_srai_pi16
481#define _m_psrad _mm_sra_pi32
482#define _m_psradi _mm_srai_pi32
483#define _m_psrlw _mm_srl_pi16
484#define _m_psrlwi _mm_srli_pi16
485#define _m_psrld _mm_srl_pi32
486#define _m_psrldi _mm_srli_pi32
Chandler Carruth6b6fe282010-08-08 08:44:32 +0000487#define _m_psrlq _mm_srl_si64
488#define _m_psrlqi _mm_srli_si64
Chandler Carruthfa38c812010-07-22 06:47:28 +0000489#define _m_pand _mm_and_si64
490#define _m_pandn _mm_andnot_si64
491#define _m_por _mm_or_si64
492#define _m_pxor _mm_xor_si64
493#define _m_pcmpeqb _mm_cmpeq_pi8
494#define _m_pcmpeqw _mm_cmpeq_pi16
495#define _m_pcmpeqd _mm_cmpeq_pi32
496#define _m_pcmpgtb _mm_cmpgt_pi8
497#define _m_pcmpgtw _mm_cmpgt_pi16
498#define _m_pcmpgtd _mm_cmpgt_pi32
499
Anders Carlsson37958ee2008-03-03 19:29:06 +0000500#endif /* __MMX__ */
501
502#endif /* __MMINTRIN_H */
503