blob: 162cb1aa1711d639599c20dd5c1e84f6a8e3ec43 [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
Eli Friedmanf0d0e9e2008-05-14 20:32:22 +000029typedef int __v2si __attribute__((__vector_size__(8)));
30typedef short __v4hi __attribute__((__vector_size__(8)));
Anders Carlsson327c8df2009-09-18 19:18:19 +000031typedef char __v8qi __attribute__((__vector_size__(8)));
Anders Carlssona5e2e602008-03-03 19:29:06 +000032
Eric Christopher4d1851682015-06-17 07:09:20 +000033/* Define the default attributes for the functions in this file. */
Michael Kupersteine45af542015-06-30 13:36:19 +000034#define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__, __target__("mmx")))
Eric Christopher4d1851682015-06-17 07:09:20 +000035
Michael Kupersteine45af542015-06-30 13:36:19 +000036static __inline__ void __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +000037_mm_empty(void)
Anders Carlssona5e2e602008-03-03 19:29:06 +000038{
39 __builtin_ia32_emms();
40}
41
Michael Kupersteine45af542015-06-30 13:36:19 +000042static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +000043_mm_cvtsi32_si64(int __i)
Anders Carlssona5e2e602008-03-03 19:29:06 +000044{
Dale Johannesen39d6f4b2010-09-30 23:57:50 +000045 return (__m64)__builtin_ia32_vec_init_v2si(__i, 0);
Anders Carlssona5e2e602008-03-03 19:29:06 +000046}
47
Michael Kupersteine45af542015-06-30 13:36:19 +000048static __inline__ int __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +000049_mm_cvtsi64_si32(__m64 __m)
Anders Carlssona5e2e602008-03-03 19:29:06 +000050{
Dale Johannesen39d6f4b2010-09-30 23:57:50 +000051 return __builtin_ia32_vec_ext_v2si((__v2si)__m, 0);
Anders Carlssona5e2e602008-03-03 19:29:06 +000052}
53
Michael Kupersteine45af542015-06-30 13:36:19 +000054static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +000055_mm_cvtsi64_m64(long long __i)
Anders Carlssona5e2e602008-03-03 19:29:06 +000056{
Eli Friedmanf0d0e9e2008-05-14 20:32:22 +000057 return (__m64)__i;
Anders Carlssona5e2e602008-03-03 19:29:06 +000058}
59
Michael Kupersteine45af542015-06-30 13:36:19 +000060static __inline__ long long __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +000061_mm_cvtm64_si64(__m64 __m)
Anders Carlssona5e2e602008-03-03 19:29:06 +000062{
Eli Friedmanf0d0e9e2008-05-14 20:32:22 +000063 return (long long)__m;
Anders Carlssona5e2e602008-03-03 19:29:06 +000064}
65
Michael Kupersteine45af542015-06-30 13:36:19 +000066static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +000067_mm_packs_pi16(__m64 __m1, __m64 __m2)
Anders Carlssona5e2e602008-03-03 19:29:06 +000068{
Eli Friedmanf0d0e9e2008-05-14 20:32:22 +000069 return (__m64)__builtin_ia32_packsswb((__v4hi)__m1, (__v4hi)__m2);
Anders Carlssona5e2e602008-03-03 19:29:06 +000070}
71
Michael Kupersteine45af542015-06-30 13:36:19 +000072static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +000073_mm_packs_pi32(__m64 __m1, __m64 __m2)
Anders Carlssona5e2e602008-03-03 19:29:06 +000074{
Eli Friedmanf0d0e9e2008-05-14 20:32:22 +000075 return (__m64)__builtin_ia32_packssdw((__v2si)__m1, (__v2si)__m2);
Anders Carlssona5e2e602008-03-03 19:29:06 +000076}
77
Michael Kupersteine45af542015-06-30 13:36:19 +000078static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +000079_mm_packs_pu16(__m64 __m1, __m64 __m2)
Anders Carlssona5e2e602008-03-03 19:29:06 +000080{
Eli Friedmanf0d0e9e2008-05-14 20:32:22 +000081 return (__m64)__builtin_ia32_packuswb((__v4hi)__m1, (__v4hi)__m2);
Anders Carlssona5e2e602008-03-03 19:29:06 +000082}
83
Michael Kupersteine45af542015-06-30 13:36:19 +000084static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +000085_mm_unpackhi_pi8(__m64 __m1, __m64 __m2)
Anders Carlssona5e2e602008-03-03 19:29:06 +000086{
Dale Johannesen39d6f4b2010-09-30 23:57:50 +000087 return (__m64)__builtin_ia32_punpckhbw((__v8qi)__m1, (__v8qi)__m2);
Anders Carlssona5e2e602008-03-03 19:29:06 +000088}
89
Michael Kupersteine45af542015-06-30 13:36:19 +000090static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +000091_mm_unpackhi_pi16(__m64 __m1, __m64 __m2)
Anders Carlssona5e2e602008-03-03 19:29:06 +000092{
Dale Johannesen39d6f4b2010-09-30 23:57:50 +000093 return (__m64)__builtin_ia32_punpckhwd((__v4hi)__m1, (__v4hi)__m2);
Anders Carlssona5e2e602008-03-03 19:29:06 +000094}
95
Michael Kupersteine45af542015-06-30 13:36:19 +000096static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +000097_mm_unpackhi_pi32(__m64 __m1, __m64 __m2)
Anders Carlssona5e2e602008-03-03 19:29:06 +000098{
Dale Johannesen39d6f4b2010-09-30 23:57:50 +000099 return (__m64)__builtin_ia32_punpckhdq((__v2si)__m1, (__v2si)__m2);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000100}
101
Michael Kupersteine45af542015-06-30 13:36:19 +0000102static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +0000103_mm_unpacklo_pi8(__m64 __m1, __m64 __m2)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000104{
Dale Johannesen39d6f4b2010-09-30 23:57:50 +0000105 return (__m64)__builtin_ia32_punpcklbw((__v8qi)__m1, (__v8qi)__m2);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000106}
107
Michael Kupersteine45af542015-06-30 13:36:19 +0000108static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +0000109_mm_unpacklo_pi16(__m64 __m1, __m64 __m2)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000110{
Dale Johannesen39d6f4b2010-09-30 23:57:50 +0000111 return (__m64)__builtin_ia32_punpcklwd((__v4hi)__m1, (__v4hi)__m2);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000112}
113
Michael Kupersteine45af542015-06-30 13:36:19 +0000114static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +0000115_mm_unpacklo_pi32(__m64 __m1, __m64 __m2)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000116{
Dale Johannesen39d6f4b2010-09-30 23:57:50 +0000117 return (__m64)__builtin_ia32_punpckldq((__v2si)__m1, (__v2si)__m2);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000118}
119
Michael Kupersteine45af542015-06-30 13:36:19 +0000120static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +0000121_mm_add_pi8(__m64 __m1, __m64 __m2)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000122{
Dale Johannesen39d6f4b2010-09-30 23:57:50 +0000123 return (__m64)__builtin_ia32_paddb((__v8qi)__m1, (__v8qi)__m2);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000124}
125
Michael Kupersteine45af542015-06-30 13:36:19 +0000126static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +0000127_mm_add_pi16(__m64 __m1, __m64 __m2)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000128{
Dale Johannesen39d6f4b2010-09-30 23:57:50 +0000129 return (__m64)__builtin_ia32_paddw((__v4hi)__m1, (__v4hi)__m2);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000130}
131
Michael Kupersteine45af542015-06-30 13:36:19 +0000132static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +0000133_mm_add_pi32(__m64 __m1, __m64 __m2)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000134{
Dale Johannesen39d6f4b2010-09-30 23:57:50 +0000135 return (__m64)__builtin_ia32_paddd((__v2si)__m1, (__v2si)__m2);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000136}
137
Michael Kupersteine45af542015-06-30 13:36:19 +0000138static __inline__ __m64 __DEFAULT_FN_ATTRS
Sean Silvae4c37602015-09-12 02:55:19 +0000139_mm_adds_pi8(__m64 __m1, __m64 __m2)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000140{
Eli Friedmanf0d0e9e2008-05-14 20:32:22 +0000141 return (__m64)__builtin_ia32_paddsb((__v8qi)__m1, (__v8qi)__m2);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000142}
143
Michael Kupersteine45af542015-06-30 13:36:19 +0000144static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +0000145_mm_adds_pi16(__m64 __m1, __m64 __m2)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000146{
Sean Silvae4c37602015-09-12 02:55:19 +0000147 return (__m64)__builtin_ia32_paddsw((__v4hi)__m1, (__v4hi)__m2);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000148}
149
Michael Kupersteine45af542015-06-30 13:36:19 +0000150static __inline__ __m64 __DEFAULT_FN_ATTRS
Sean Silvae4c37602015-09-12 02:55:19 +0000151_mm_adds_pu8(__m64 __m1, __m64 __m2)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000152{
Eli Friedmanf0d0e9e2008-05-14 20:32:22 +0000153 return (__m64)__builtin_ia32_paddusb((__v8qi)__m1, (__v8qi)__m2);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000154}
Sean Silvae4c37602015-09-12 02:55:19 +0000155
Michael Kupersteine45af542015-06-30 13:36:19 +0000156static __inline__ __m64 __DEFAULT_FN_ATTRS
Sean Silvae4c37602015-09-12 02:55:19 +0000157_mm_adds_pu16(__m64 __m1, __m64 __m2)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000158{
Eli Friedmanf0d0e9e2008-05-14 20:32:22 +0000159 return (__m64)__builtin_ia32_paddusw((__v4hi)__m1, (__v4hi)__m2);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000160}
161
Michael Kupersteine45af542015-06-30 13:36:19 +0000162static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +0000163_mm_sub_pi8(__m64 __m1, __m64 __m2)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000164{
Dale Johannesen39d6f4b2010-09-30 23:57:50 +0000165 return (__m64)__builtin_ia32_psubb((__v8qi)__m1, (__v8qi)__m2);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000166}
Sean Silvae4c37602015-09-12 02:55:19 +0000167
Michael Kupersteine45af542015-06-30 13:36:19 +0000168static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +0000169_mm_sub_pi16(__m64 __m1, __m64 __m2)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000170{
Dale Johannesen39d6f4b2010-09-30 23:57:50 +0000171 return (__m64)__builtin_ia32_psubw((__v4hi)__m1, (__v4hi)__m2);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000172}
Sean Silvae4c37602015-09-12 02:55:19 +0000173
Michael Kupersteine45af542015-06-30 13:36:19 +0000174static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +0000175_mm_sub_pi32(__m64 __m1, __m64 __m2)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000176{
Dale Johannesen39d6f4b2010-09-30 23:57:50 +0000177 return (__m64)__builtin_ia32_psubd((__v2si)__m1, (__v2si)__m2);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000178}
179
Michael Kupersteine45af542015-06-30 13:36:19 +0000180static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +0000181_mm_subs_pi8(__m64 __m1, __m64 __m2)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000182{
Eli Friedmanf0d0e9e2008-05-14 20:32:22 +0000183 return (__m64)__builtin_ia32_psubsb((__v8qi)__m1, (__v8qi)__m2);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000184}
185
Michael Kupersteine45af542015-06-30 13:36:19 +0000186static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +0000187_mm_subs_pi16(__m64 __m1, __m64 __m2)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000188{
Eli Friedmanf0d0e9e2008-05-14 20:32:22 +0000189 return (__m64)__builtin_ia32_psubsw((__v4hi)__m1, (__v4hi)__m2);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000190}
191
Michael Kupersteine45af542015-06-30 13:36:19 +0000192static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +0000193_mm_subs_pu8(__m64 __m1, __m64 __m2)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000194{
Eli Friedmanf0d0e9e2008-05-14 20:32:22 +0000195 return (__m64)__builtin_ia32_psubusb((__v8qi)__m1, (__v8qi)__m2);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000196}
Sean Silvae4c37602015-09-12 02:55:19 +0000197
Michael Kupersteine45af542015-06-30 13:36:19 +0000198static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +0000199_mm_subs_pu16(__m64 __m1, __m64 __m2)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000200{
Eli Friedmanf0d0e9e2008-05-14 20:32:22 +0000201 return (__m64)__builtin_ia32_psubusw((__v4hi)__m1, (__v4hi)__m2);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000202}
203
Michael Kupersteine45af542015-06-30 13:36:19 +0000204static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +0000205_mm_madd_pi16(__m64 __m1, __m64 __m2)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000206{
Eli Friedmanf0d0e9e2008-05-14 20:32:22 +0000207 return (__m64)__builtin_ia32_pmaddwd((__v4hi)__m1, (__v4hi)__m2);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000208}
209
Michael Kupersteine45af542015-06-30 13:36:19 +0000210static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +0000211_mm_mulhi_pi16(__m64 __m1, __m64 __m2)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000212{
Eli Friedmanf0d0e9e2008-05-14 20:32:22 +0000213 return (__m64)__builtin_ia32_pmulhw((__v4hi)__m1, (__v4hi)__m2);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000214}
Sean Silvae4c37602015-09-12 02:55:19 +0000215
Michael Kupersteine45af542015-06-30 13:36:19 +0000216static __inline__ __m64 __DEFAULT_FN_ATTRS
Sean Silvae4c37602015-09-12 02:55:19 +0000217_mm_mullo_pi16(__m64 __m1, __m64 __m2)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000218{
Dale Johannesen39d6f4b2010-09-30 23:57:50 +0000219 return (__m64)__builtin_ia32_pmullw((__v4hi)__m1, (__v4hi)__m2);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000220}
221
Michael Kupersteine45af542015-06-30 13:36:19 +0000222static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +0000223_mm_sll_pi16(__m64 __m, __m64 __count)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000224{
Eli Friedmanf0d0e9e2008-05-14 20:32:22 +0000225 return (__m64)__builtin_ia32_psllw((__v4hi)__m, __count);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000226}
227
Michael Kupersteine45af542015-06-30 13:36:19 +0000228static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +0000229_mm_slli_pi16(__m64 __m, int __count)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000230{
Sean Silvae4c37602015-09-12 02:55:19 +0000231 return (__m64)__builtin_ia32_psllwi((__v4hi)__m, __count);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000232}
233
Michael Kupersteine45af542015-06-30 13:36:19 +0000234static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +0000235_mm_sll_pi32(__m64 __m, __m64 __count)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000236{
Eli Friedmanf0d0e9e2008-05-14 20:32:22 +0000237 return (__m64)__builtin_ia32_pslld((__v2si)__m, __count);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000238}
239
Michael Kupersteine45af542015-06-30 13:36:19 +0000240static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +0000241_mm_slli_pi32(__m64 __m, int __count)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000242{
Eli Friedmanf0d0e9e2008-05-14 20:32:22 +0000243 return (__m64)__builtin_ia32_pslldi((__v2si)__m, __count);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000244}
245
Michael Kupersteine45af542015-06-30 13:36:19 +0000246static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +0000247_mm_sll_si64(__m64 __m, __m64 __count)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000248{
Dale Johannesen39d6f4b2010-09-30 23:57:50 +0000249 return (__m64)__builtin_ia32_psllq(__m, __count);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000250}
251
Michael Kupersteine45af542015-06-30 13:36:19 +0000252static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +0000253_mm_slli_si64(__m64 __m, int __count)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000254{
Sean Silvae4c37602015-09-12 02:55:19 +0000255 return (__m64)__builtin_ia32_psllqi(__m, __count);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000256}
257
Michael Kupersteine45af542015-06-30 13:36:19 +0000258static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +0000259_mm_sra_pi16(__m64 __m, __m64 __count)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000260{
Sean Silvae4c37602015-09-12 02:55:19 +0000261 return (__m64)__builtin_ia32_psraw((__v4hi)__m, __count);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000262}
263
Michael Kupersteine45af542015-06-30 13:36:19 +0000264static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +0000265_mm_srai_pi16(__m64 __m, int __count)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000266{
Eli Friedmanf0d0e9e2008-05-14 20:32:22 +0000267 return (__m64)__builtin_ia32_psrawi((__v4hi)__m, __count);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000268}
269
Michael Kupersteine45af542015-06-30 13:36:19 +0000270static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +0000271_mm_sra_pi32(__m64 __m, __m64 __count)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000272{
Sean Silvae4c37602015-09-12 02:55:19 +0000273 return (__m64)__builtin_ia32_psrad((__v2si)__m, __count);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000274}
275
Michael Kupersteine45af542015-06-30 13:36:19 +0000276static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +0000277_mm_srai_pi32(__m64 __m, int __count)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000278{
Eli Friedmanf0d0e9e2008-05-14 20:32:22 +0000279 return (__m64)__builtin_ia32_psradi((__v2si)__m, __count);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000280}
281
Michael Kupersteine45af542015-06-30 13:36:19 +0000282static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +0000283_mm_srl_pi16(__m64 __m, __m64 __count)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000284{
Sean Silvae4c37602015-09-12 02:55:19 +0000285 return (__m64)__builtin_ia32_psrlw((__v4hi)__m, __count);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000286}
287
Michael Kupersteine45af542015-06-30 13:36:19 +0000288static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +0000289_mm_srli_pi16(__m64 __m, int __count)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000290{
Sean Silvae4c37602015-09-12 02:55:19 +0000291 return (__m64)__builtin_ia32_psrlwi((__v4hi)__m, __count);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000292}
293
Michael Kupersteine45af542015-06-30 13:36:19 +0000294static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +0000295_mm_srl_pi32(__m64 __m, __m64 __count)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000296{
Sean Silvae4c37602015-09-12 02:55:19 +0000297 return (__m64)__builtin_ia32_psrld((__v2si)__m, __count);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000298}
299
Michael Kupersteine45af542015-06-30 13:36:19 +0000300static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +0000301_mm_srli_pi32(__m64 __m, int __count)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000302{
Eli Friedmanf0d0e9e2008-05-14 20:32:22 +0000303 return (__m64)__builtin_ia32_psrldi((__v2si)__m, __count);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000304}
305
Michael Kupersteine45af542015-06-30 13:36:19 +0000306static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +0000307_mm_srl_si64(__m64 __m, __m64 __count)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000308{
Sean Silvae4c37602015-09-12 02:55:19 +0000309 return (__m64)__builtin_ia32_psrlq(__m, __count);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000310}
311
Michael Kupersteine45af542015-06-30 13:36:19 +0000312static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +0000313_mm_srli_si64(__m64 __m, int __count)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000314{
Sean Silvae4c37602015-09-12 02:55:19 +0000315 return (__m64)__builtin_ia32_psrlqi(__m, __count);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000316}
317
Michael Kupersteine45af542015-06-30 13:36:19 +0000318static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +0000319_mm_and_si64(__m64 __m1, __m64 __m2)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000320{
Dale Johannesen39d6f4b2010-09-30 23:57:50 +0000321 return __builtin_ia32_pand(__m1, __m2);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000322}
323
Michael Kupersteine45af542015-06-30 13:36:19 +0000324static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +0000325_mm_andnot_si64(__m64 __m1, __m64 __m2)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000326{
Dale Johannesen39d6f4b2010-09-30 23:57:50 +0000327 return __builtin_ia32_pandn(__m1, __m2);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000328}
329
Michael Kupersteine45af542015-06-30 13:36:19 +0000330static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +0000331_mm_or_si64(__m64 __m1, __m64 __m2)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000332{
Dale Johannesen39d6f4b2010-09-30 23:57:50 +0000333 return __builtin_ia32_por(__m1, __m2);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000334}
335
Michael Kupersteine45af542015-06-30 13:36:19 +0000336static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +0000337_mm_xor_si64(__m64 __m1, __m64 __m2)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000338{
Dale Johannesen39d6f4b2010-09-30 23:57:50 +0000339 return __builtin_ia32_pxor(__m1, __m2);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000340}
341
Michael Kupersteine45af542015-06-30 13:36:19 +0000342static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +0000343_mm_cmpeq_pi8(__m64 __m1, __m64 __m2)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000344{
Dale Johannesen39d6f4b2010-09-30 23:57:50 +0000345 return (__m64)__builtin_ia32_pcmpeqb((__v8qi)__m1, (__v8qi)__m2);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000346}
347
Michael Kupersteine45af542015-06-30 13:36:19 +0000348static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +0000349_mm_cmpeq_pi16(__m64 __m1, __m64 __m2)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000350{
Dale Johannesen39d6f4b2010-09-30 23:57:50 +0000351 return (__m64)__builtin_ia32_pcmpeqw((__v4hi)__m1, (__v4hi)__m2);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000352}
353
Michael Kupersteine45af542015-06-30 13:36:19 +0000354static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +0000355_mm_cmpeq_pi32(__m64 __m1, __m64 __m2)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000356{
Dale Johannesen39d6f4b2010-09-30 23:57:50 +0000357 return (__m64)__builtin_ia32_pcmpeqd((__v2si)__m1, (__v2si)__m2);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000358}
359
Michael Kupersteine45af542015-06-30 13:36:19 +0000360static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +0000361_mm_cmpgt_pi8(__m64 __m1, __m64 __m2)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000362{
Dale Johannesen39d6f4b2010-09-30 23:57:50 +0000363 return (__m64)__builtin_ia32_pcmpgtb((__v8qi)__m1, (__v8qi)__m2);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000364}
365
Michael Kupersteine45af542015-06-30 13:36:19 +0000366static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +0000367_mm_cmpgt_pi16(__m64 __m1, __m64 __m2)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000368{
Dale Johannesen39d6f4b2010-09-30 23:57:50 +0000369 return (__m64)__builtin_ia32_pcmpgtw((__v4hi)__m1, (__v4hi)__m2);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000370}
371
Michael Kupersteine45af542015-06-30 13:36:19 +0000372static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +0000373_mm_cmpgt_pi32(__m64 __m1, __m64 __m2)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000374{
Dale Johannesen39d6f4b2010-09-30 23:57:50 +0000375 return (__m64)__builtin_ia32_pcmpgtd((__v2si)__m1, (__v2si)__m2);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000376}
377
Michael Kupersteine45af542015-06-30 13:36:19 +0000378static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +0000379_mm_setzero_si64(void)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000380{
381 return (__m64){ 0LL };
382}
383
Michael Kupersteine45af542015-06-30 13:36:19 +0000384static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +0000385_mm_set_pi32(int __i1, int __i0)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000386{
Dale Johannesen39d6f4b2010-09-30 23:57:50 +0000387 return (__m64)__builtin_ia32_vec_init_v2si(__i0, __i1);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000388}
389
Michael Kupersteine45af542015-06-30 13:36:19 +0000390static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +0000391_mm_set_pi16(short __s3, short __s2, short __s1, short __s0)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000392{
Dale Johannesen39d6f4b2010-09-30 23:57:50 +0000393 return (__m64)__builtin_ia32_vec_init_v4hi(__s0, __s1, __s2, __s3);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000394}
395
Michael Kupersteine45af542015-06-30 13:36:19 +0000396static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +0000397_mm_set_pi8(char __b7, char __b6, char __b5, char __b4, char __b3, char __b2,
398 char __b1, char __b0)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000399{
Dale Johannesen39d6f4b2010-09-30 23:57:50 +0000400 return (__m64)__builtin_ia32_vec_init_v8qi(__b0, __b1, __b2, __b3,
401 __b4, __b5, __b6, __b7);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000402}
403
Michael Kupersteine45af542015-06-30 13:36:19 +0000404static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +0000405_mm_set1_pi32(int __i)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000406{
Dale Johannesen39d6f4b2010-09-30 23:57:50 +0000407 return _mm_set_pi32(__i, __i);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000408}
409
Michael Kupersteine45af542015-06-30 13:36:19 +0000410static __inline__ __m64 __DEFAULT_FN_ATTRS
Dale Johannesen39d6f4b2010-09-30 23:57:50 +0000411_mm_set1_pi16(short __w)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000412{
Dale Johannesen39d6f4b2010-09-30 23:57:50 +0000413 return _mm_set_pi16(__w, __w, __w, __w);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000414}
415
Michael Kupersteine45af542015-06-30 13:36:19 +0000416static __inline__ __m64 __DEFAULT_FN_ATTRS
Mike Stumpeff0cc92009-02-14 18:02:21 +0000417_mm_set1_pi8(char __b)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000418{
Dale Johannesen39d6f4b2010-09-30 23:57:50 +0000419 return _mm_set_pi8(__b, __b, __b, __b, __b, __b, __b, __b);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000420}
421
Michael Kupersteine45af542015-06-30 13:36:19 +0000422static __inline__ __m64 __DEFAULT_FN_ATTRS
Eli Friedmancb59baa2011-05-05 20:21:54 +0000423_mm_setr_pi32(int __i0, int __i1)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000424{
Dale Johannesen39d6f4b2010-09-30 23:57:50 +0000425 return _mm_set_pi32(__i1, __i0);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000426}
427
Michael Kupersteine45af542015-06-30 13:36:19 +0000428static __inline__ __m64 __DEFAULT_FN_ATTRS
Eli Friedmancb59baa2011-05-05 20:21:54 +0000429_mm_setr_pi16(short __w0, short __w1, short __w2, short __w3)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000430{
Dale Johannesen39d6f4b2010-09-30 23:57:50 +0000431 return _mm_set_pi16(__w3, __w2, __w1, __w0);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000432}
433
Michael Kupersteine45af542015-06-30 13:36:19 +0000434static __inline__ __m64 __DEFAULT_FN_ATTRS
Eli Friedmancb59baa2011-05-05 20:21:54 +0000435_mm_setr_pi8(char __b0, char __b1, char __b2, char __b3, char __b4, char __b5,
436 char __b6, char __b7)
Anders Carlssona5e2e602008-03-03 19:29:06 +0000437{
Dale Johannesen39d6f4b2010-09-30 23:57:50 +0000438 return _mm_set_pi8(__b7, __b6, __b5, __b4, __b3, __b2, __b1, __b0);
Anders Carlssona5e2e602008-03-03 19:29:06 +0000439}
440
Michael Kupersteine45af542015-06-30 13:36:19 +0000441#undef __DEFAULT_FN_ATTRS
Chandler Carruth96f2e9e2010-07-22 06:47:28 +0000442
443/* Aliases for compatibility. */
444#define _m_empty _mm_empty
445#define _m_from_int _mm_cvtsi32_si64
Michael Kuperstein591278c2015-12-20 12:37:18 +0000446#define _m_from_int64 _mm_cvtsi64_m64
Chandler Carruth96f2e9e2010-07-22 06:47:28 +0000447#define _m_to_int _mm_cvtsi64_si32
Michael Kuperstein591278c2015-12-20 12:37:18 +0000448#define _m_to_int64 _mm_cvtm64_si64
Chandler Carruth96f2e9e2010-07-22 06:47:28 +0000449#define _m_packsswb _mm_packs_pi16
450#define _m_packssdw _mm_packs_pi32
451#define _m_packuswb _mm_packs_pu16
452#define _m_punpckhbw _mm_unpackhi_pi8
453#define _m_punpckhwd _mm_unpackhi_pi16
454#define _m_punpckhdq _mm_unpackhi_pi32
455#define _m_punpcklbw _mm_unpacklo_pi8
456#define _m_punpcklwd _mm_unpacklo_pi16
457#define _m_punpckldq _mm_unpacklo_pi32
458#define _m_paddb _mm_add_pi8
459#define _m_paddw _mm_add_pi16
460#define _m_paddd _mm_add_pi32
461#define _m_paddsb _mm_adds_pi8
462#define _m_paddsw _mm_adds_pi16
463#define _m_paddusb _mm_adds_pu8
464#define _m_paddusw _mm_adds_pu16
465#define _m_psubb _mm_sub_pi8
466#define _m_psubw _mm_sub_pi16
467#define _m_psubd _mm_sub_pi32
468#define _m_psubsb _mm_subs_pi8
469#define _m_psubsw _mm_subs_pi16
470#define _m_psubusb _mm_subs_pu8
471#define _m_psubusw _mm_subs_pu16
472#define _m_pmaddwd _mm_madd_pi16
473#define _m_pmulhw _mm_mulhi_pi16
474#define _m_pmullw _mm_mullo_pi16
475#define _m_psllw _mm_sll_pi16
476#define _m_psllwi _mm_slli_pi16
477#define _m_pslld _mm_sll_pi32
478#define _m_pslldi _mm_slli_pi32
Chandler Carruth42cf8182010-08-08 08:44:32 +0000479#define _m_psllq _mm_sll_si64
480#define _m_psllqi _mm_slli_si64
Chandler Carruth96f2e9e2010-07-22 06:47:28 +0000481#define _m_psraw _mm_sra_pi16
482#define _m_psrawi _mm_srai_pi16
483#define _m_psrad _mm_sra_pi32
484#define _m_psradi _mm_srai_pi32
485#define _m_psrlw _mm_srl_pi16
486#define _m_psrlwi _mm_srli_pi16
487#define _m_psrld _mm_srl_pi32
488#define _m_psrldi _mm_srli_pi32
Chandler Carruth42cf8182010-08-08 08:44:32 +0000489#define _m_psrlq _mm_srl_si64
490#define _m_psrlqi _mm_srli_si64
Chandler Carruth96f2e9e2010-07-22 06:47:28 +0000491#define _m_pand _mm_and_si64
492#define _m_pandn _mm_andnot_si64
493#define _m_por _mm_or_si64
494#define _m_pxor _mm_xor_si64
495#define _m_pcmpeqb _mm_cmpeq_pi8
496#define _m_pcmpeqw _mm_cmpeq_pi16
497#define _m_pcmpeqd _mm_cmpeq_pi32
498#define _m_pcmpgtb _mm_cmpgt_pi8
499#define _m_pcmpgtw _mm_cmpgt_pi16
500#define _m_pcmpgtd _mm_cmpgt_pi32
501
Anders Carlssona5e2e602008-03-03 19:29:06 +0000502#endif /* __MMINTRIN_H */
503