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