blob: 401d8a7aaededeec96ed68e7ed23e13e3514d031 [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{
Eli Friedmanedbd9282008-05-14 20:32:22 +000046 return (__m64)(__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{
Eli Friedmanedbd9282008-05-14 20:32:22 +000052 __v2si __mmx_var2 = (__v2si)__m;
Eli Friedman1e6d14f2008-05-14 20:11:29 +000053 return __mmx_var2[0];
Anders Carlsson37958ee2008-03-03 19:29:06 +000054}
55
Chris Lattner1bddbcb2010-03-22 18:14:12 +000056static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +000057_mm_cvtsi64_m64(long long __i)
Anders Carlsson37958ee2008-03-03 19:29:06 +000058{
Eli Friedmanedbd9282008-05-14 20:32:22 +000059 return (__m64)__i;
Anders Carlsson37958ee2008-03-03 19:29:06 +000060}
61
Chris Lattner1bddbcb2010-03-22 18:14:12 +000062static __inline__ long long __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +000063_mm_cvtm64_si64(__m64 __m)
Anders Carlsson37958ee2008-03-03 19:29:06 +000064{
Eli Friedmanedbd9282008-05-14 20:32:22 +000065 return (long long)__m;
Anders Carlsson37958ee2008-03-03 19:29:06 +000066}
67
Chris Lattner1bddbcb2010-03-22 18:14:12 +000068static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +000069_mm_packs_pi16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +000070{
Eli Friedmanedbd9282008-05-14 20:32:22 +000071 return (__m64)__builtin_ia32_packsswb((__v4hi)__m1, (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +000072}
73
Chris Lattner1bddbcb2010-03-22 18:14:12 +000074static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +000075_mm_packs_pi32(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +000076{
Eli Friedmanedbd9282008-05-14 20:32:22 +000077 return (__m64)__builtin_ia32_packssdw((__v2si)__m1, (__v2si)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +000078}
79
Chris Lattner1bddbcb2010-03-22 18:14:12 +000080static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +000081_mm_packs_pu16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +000082{
Eli Friedmanedbd9282008-05-14 20:32:22 +000083 return (__m64)__builtin_ia32_packuswb((__v4hi)__m1, (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +000084}
85
Chris Lattner1bddbcb2010-03-22 18:14:12 +000086static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +000087_mm_unpackhi_pi8(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +000088{
Mike Stumpe308c412009-02-14 18:02:21 +000089 return (__m64)__builtin_shufflevector((__v8qi)__m1, (__v8qi)__m2, 4, 8+4, 5,
90 8+5, 6, 8+6, 7, 8+7);
Anders Carlsson37958ee2008-03-03 19:29:06 +000091}
92
Chris Lattner1bddbcb2010-03-22 18:14:12 +000093static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +000094_mm_unpackhi_pi16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +000095{
Mike Stumpe308c412009-02-14 18:02:21 +000096 return (__m64)__builtin_shufflevector((__v4hi)__m1, (__v4hi)__m2, 2, 4+2, 3,
97 4+3);
Anders Carlsson37958ee2008-03-03 19:29:06 +000098}
99
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000100static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000101_mm_unpackhi_pi32(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000102{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000103 return (__m64)__builtin_shufflevector((__v2si)__m1, (__v2si)__m2, 1, 2+1);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000104}
105
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000106static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000107_mm_unpacklo_pi8(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000108{
Mike Stumpe308c412009-02-14 18:02:21 +0000109 return (__m64)__builtin_shufflevector((__v8qi)__m1, (__v8qi)__m2, 0, 8+0, 1,
110 8+1, 2, 8+2, 3, 8+3);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000111}
112
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000113static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000114_mm_unpacklo_pi16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000115{
Mike Stumpe308c412009-02-14 18:02:21 +0000116 return (__m64)__builtin_shufflevector((__v4hi)__m1, (__v4hi)__m2, 0, 4+0, 1,
117 4+1);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000118}
119
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000120static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000121_mm_unpacklo_pi32(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000122{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000123 return (__m64)__builtin_shufflevector((__v2si)__m1, (__v2si)__m2, 0, 2+0);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000124}
125
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000126static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000127_mm_add_pi8(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000128{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000129 return (__m64)((__v8qi)__m1 + (__v8qi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000130}
131
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000132static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000133_mm_add_pi16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000134{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000135 return (__m64)((__v4hi)__m1 + (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000136}
137
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000138static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000139_mm_add_pi32(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000140{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000141 return (__m64)((__v2si)__m1 + (__v2si)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000142}
143
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000144static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000145_mm_adds_pi8(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000146{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000147 return (__m64)__builtin_ia32_paddsb((__v8qi)__m1, (__v8qi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000148}
149
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000150static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000151_mm_adds_pi16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000152{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000153 return (__m64)__builtin_ia32_paddsw((__v4hi)__m1, (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000154}
155
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000156static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000157_mm_adds_pu8(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000158{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000159 return (__m64)__builtin_ia32_paddusb((__v8qi)__m1, (__v8qi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000160}
161
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000162static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000163_mm_adds_pu16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000164{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000165 return (__m64)__builtin_ia32_paddusw((__v4hi)__m1, (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000166}
167
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000168static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000169_mm_sub_pi8(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000170{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000171 return (__m64)((__v8qi)__m1 - (__v8qi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000172}
173
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000174static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000175_mm_sub_pi16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000176{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000177 return (__m64)((__v4hi)__m1 - (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000178}
179
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000180static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000181_mm_sub_pi32(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000182{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000183 return (__m64)((__v2si)__m1 - (__v2si)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000184}
185
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000186static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000187_mm_subs_pi8(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000188{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000189 return (__m64)__builtin_ia32_psubsb((__v8qi)__m1, (__v8qi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000190}
191
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000192static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000193_mm_subs_pi16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000194{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000195 return (__m64)__builtin_ia32_psubsw((__v4hi)__m1, (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000196}
197
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000198static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000199_mm_subs_pu8(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000200{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000201 return (__m64)__builtin_ia32_psubusb((__v8qi)__m1, (__v8qi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000202}
203
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000204static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000205_mm_subs_pu16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000206{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000207 return (__m64)__builtin_ia32_psubusw((__v4hi)__m1, (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000208}
209
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000210static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000211_mm_madd_pi16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000212{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000213 return (__m64)__builtin_ia32_pmaddwd((__v4hi)__m1, (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000214}
215
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000216static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000217_mm_mulhi_pi16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000218{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000219 return (__m64)__builtin_ia32_pmulhw((__v4hi)__m1, (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000220}
221
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000222static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000223_mm_mullo_pi16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000224{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000225 return (__m64)((__v4hi)__m1 * (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000226}
227
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000228static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000229_mm_sll_pi16(__m64 __m, __m64 __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000230{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000231 return (__m64)__builtin_ia32_psllw((__v4hi)__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000232}
233
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000234static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000235_mm_slli_pi16(__m64 __m, int __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000236{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000237 return (__m64)__builtin_ia32_psllwi((__v4hi)__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000238}
239
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000240static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000241_mm_sll_pi32(__m64 __m, __m64 __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000242{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000243 return (__m64)__builtin_ia32_pslld((__v2si)__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000244}
245
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000246static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000247_mm_slli_pi32(__m64 __m, int __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000248{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000249 return (__m64)__builtin_ia32_pslldi((__v2si)__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000250}
251
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000252static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000253_mm_sll_si64(__m64 __m, __m64 __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000254{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000255 return __builtin_ia32_psllq(__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000256}
257
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000258static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000259_mm_slli_si64(__m64 __m, int __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000260{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000261 return __builtin_ia32_psllqi(__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000262}
263
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000264static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000265_mm_sra_pi16(__m64 __m, __m64 __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000266{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000267 return (__m64)__builtin_ia32_psraw((__v4hi)__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000268}
269
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000270static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000271_mm_srai_pi16(__m64 __m, int __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000272{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000273 return (__m64)__builtin_ia32_psrawi((__v4hi)__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000274}
275
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000276static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000277_mm_sra_pi32(__m64 __m, __m64 __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000278{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000279 return (__m64)__builtin_ia32_psrad((__v2si)__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000280}
281
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000282static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000283_mm_srai_pi32(__m64 __m, int __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000284{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000285 return (__m64)__builtin_ia32_psradi((__v2si)__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000286}
287
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000288static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000289_mm_srl_pi16(__m64 __m, __m64 __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000290{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000291 return (__m64)__builtin_ia32_psrlw((__v4hi)__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000292}
293
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000294static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000295_mm_srli_pi16(__m64 __m, int __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000296{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000297 return (__m64)__builtin_ia32_psrlwi((__v4hi)__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000298}
299
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000300static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000301_mm_srl_pi32(__m64 __m, __m64 __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000302{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000303 return (__m64)__builtin_ia32_psrld((__v2si)__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000304}
305
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000306static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000307_mm_srli_pi32(__m64 __m, int __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000308{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000309 return (__m64)__builtin_ia32_psrldi((__v2si)__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000310}
311
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000312static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000313_mm_srl_si64(__m64 __m, __m64 __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000314{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000315 return (__m64)__builtin_ia32_psrlq(__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000316}
317
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000318static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000319_mm_srli_si64(__m64 __m, int __count)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000320{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000321 return __builtin_ia32_psrlqi(__m, __count);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000322}
323
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000324static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000325_mm_and_si64(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000326{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000327 return __m1 & __m2;
Anders Carlsson37958ee2008-03-03 19:29:06 +0000328}
329
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000330static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000331_mm_andnot_si64(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000332{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000333 return ~__m1 & __m2;
Anders Carlsson37958ee2008-03-03 19:29:06 +0000334}
335
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000336static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000337_mm_or_si64(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000338{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000339 return __m1 | __m2;
Anders Carlsson37958ee2008-03-03 19:29:06 +0000340}
341
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000342static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000343_mm_xor_si64(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000344{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000345 return __m1 ^ __m2;
Anders Carlsson37958ee2008-03-03 19:29:06 +0000346}
347
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000348static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000349_mm_cmpeq_pi8(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000350{
Eli Friedman3a266f22009-07-22 17:08:01 +0000351 return (__m64)((__v8qi)__m1 == (__v8qi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000352}
353
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000354static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000355_mm_cmpeq_pi16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000356{
Eli Friedman3a266f22009-07-22 17:08:01 +0000357 return (__m64)((__v4hi)__m1 == (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000358}
359
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000360static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000361_mm_cmpeq_pi32(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000362{
Eli Friedman3a266f22009-07-22 17:08:01 +0000363 return (__m64)((__v2si)__m1 == (__v2si)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000364}
365
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000366static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000367_mm_cmpgt_pi8(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000368{
Eli Friedman3a266f22009-07-22 17:08:01 +0000369 return (__m64)((__v8qi)__m1 > (__v8qi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000370}
371
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000372static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000373_mm_cmpgt_pi16(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000374{
Eli Friedman3a266f22009-07-22 17:08:01 +0000375 return (__m64)((__v4hi)__m1 > (__v4hi)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000376}
377
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000378static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000379_mm_cmpgt_pi32(__m64 __m1, __m64 __m2)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000380{
Eli Friedman3a266f22009-07-22 17:08:01 +0000381 return (__m64)((__v2si)__m1 > (__v2si)__m2);
Anders Carlsson37958ee2008-03-03 19:29:06 +0000382}
383
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000384static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000385_mm_setzero_si64(void)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000386{
387 return (__m64){ 0LL };
388}
389
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000390static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000391_mm_set_pi32(int __i1, int __i0)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000392{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000393 return (__m64)(__v2si){ __i0, __i1 };
Anders Carlsson37958ee2008-03-03 19:29:06 +0000394}
395
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000396static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000397_mm_set_pi16(short __s3, short __s2, short __s1, short __s0)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000398{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000399 return (__m64)(__v4hi){ __s0, __s1, __s2, __s3 };
Anders Carlsson37958ee2008-03-03 19:29:06 +0000400}
401
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000402static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000403_mm_set_pi8(char __b7, char __b6, char __b5, char __b4, char __b3, char __b2,
404 char __b1, char __b0)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000405{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000406 return (__m64)(__v8qi){ __b0, __b1, __b2, __b3, __b4, __b5, __b6, __b7 };
Anders Carlsson37958ee2008-03-03 19:29:06 +0000407}
408
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000409static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000410_mm_set1_pi32(int __i)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000411{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000412 return (__m64)(__v2si){ __i, __i };
Anders Carlsson37958ee2008-03-03 19:29:06 +0000413}
414
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000415static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000416_mm_set1_pi16(short __s)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000417{
Eli Friedman80c80042009-06-06 02:13:04 +0000418 return (__m64)(__v4hi){ __s, __s, __s, __s };
Anders Carlsson37958ee2008-03-03 19:29:06 +0000419}
420
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000421static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000422_mm_set1_pi8(char __b)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000423{
Eli Friedman80c80042009-06-06 02:13:04 +0000424 return (__m64)(__v8qi){ __b, __b, __b, __b, __b, __b, __b, __b };
Anders Carlsson37958ee2008-03-03 19:29:06 +0000425}
426
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000427static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000428_mm_setr_pi32(int __i1, int __i0)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000429{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000430 return (__m64)(__v2si){ __i1, __i0 };
Anders Carlsson37958ee2008-03-03 19:29:06 +0000431}
432
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000433static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000434_mm_setr_pi16(short __s3, short __s2, short __s1, short __s0)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000435{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000436 return (__m64)(__v4hi){ __s3, __s2, __s1, __s0 };
Anders Carlsson37958ee2008-03-03 19:29:06 +0000437}
438
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000439static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpe308c412009-02-14 18:02:21 +0000440_mm_setr_pi8(char __b7, char __b6, char __b5, char __b4, char __b3, char __b2,
441 char __b1, char __b0)
Anders Carlsson37958ee2008-03-03 19:29:06 +0000442{
Eli Friedmanedbd9282008-05-14 20:32:22 +0000443 return (__m64)(__v8qi){ __b7, __b6, __b5, __b4, __b3, __b2, __b1, __b0 };
Anders Carlsson37958ee2008-03-03 19:29:06 +0000444}
445
446#endif /* __MMX__ */
447
448#endif /* __MMINTRIN_H */
449