blob: 903cfde8722449a75b3d951a8098527571c77494 [file] [log] [blame]
Benjamin Kramerae8ea1f2010-08-20 16:47:17 +00001/*===---- emmintrin.h - SSE2 intrinsics ------------------------------------===
Anders Carlssonf15e71d2008-12-24 01:45:22 +00002 *
3 * 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 */
Benjamin Kramerae8ea1f2010-08-20 16:47:17 +000023
Anders Carlssonf15e71d2008-12-24 01:45:22 +000024#ifndef __EMMINTRIN_H
25#define __EMMINTRIN_H
26
27#ifndef __SSE2__
28#error "SSE2 instruction set not enabled"
29#else
30
31#include <xmmintrin.h>
32
33typedef double __m128d __attribute__((__vector_size__(16)));
34typedef long long __m128i __attribute__((__vector_size__(16)));
35
Eric Christopher2a9898f2010-08-26 02:09:25 +000036/* Type defines. */
37typedef double __v2df __attribute__ ((__vector_size__ (16)));
38typedef long long __v2di __attribute__ ((__vector_size__ (16)));
Anders Carlssona283f912008-12-24 02:41:00 +000039typedef short __v8hi __attribute__((__vector_size__(16)));
Anders Carlsson327c8df2009-09-18 19:18:19 +000040typedef char __v16qi __attribute__((__vector_size__(16)));
Anders Carlssonf15e71d2008-12-24 01:45:22 +000041
Chris Lattner7eac8052010-03-22 18:14:12 +000042static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +000043_mm_add_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +000044{
Eli Friedmanebd93142009-06-06 02:13:04 +000045 a[0] += b[0];
46 return a;
Anders Carlssonf15e71d2008-12-24 01:45:22 +000047}
48
Chris Lattner7eac8052010-03-22 18:14:12 +000049static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +000050_mm_add_pd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +000051{
52 return a + b;
53}
54
Chris Lattner7eac8052010-03-22 18:14:12 +000055static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +000056_mm_sub_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +000057{
Eli Friedmanebd93142009-06-06 02:13:04 +000058 a[0] -= b[0];
59 return a;
Anders Carlssonf15e71d2008-12-24 01:45:22 +000060}
61
Chris Lattner7eac8052010-03-22 18:14:12 +000062static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +000063_mm_sub_pd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +000064{
65 return a - b;
66}
67
Chris Lattner7eac8052010-03-22 18:14:12 +000068static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +000069_mm_mul_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +000070{
Eli Friedmanebd93142009-06-06 02:13:04 +000071 a[0] *= b[0];
72 return a;
Anders Carlssonf15e71d2008-12-24 01:45:22 +000073}
74
Chris Lattner7eac8052010-03-22 18:14:12 +000075static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +000076_mm_mul_pd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +000077{
78 return a * b;
79}
80
Chris Lattner7eac8052010-03-22 18:14:12 +000081static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +000082_mm_div_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +000083{
Eli Friedmanebd93142009-06-06 02:13:04 +000084 a[0] /= b[0];
85 return a;
Anders Carlssonf15e71d2008-12-24 01:45:22 +000086}
87
Chris Lattner7eac8052010-03-22 18:14:12 +000088static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +000089_mm_div_pd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +000090{
91 return a / b;
92}
93
Chris Lattner7eac8052010-03-22 18:14:12 +000094static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +000095_mm_sqrt_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +000096{
97 __m128d c = __builtin_ia32_sqrtsd(b);
98 return (__m128d) { c[0], a[1] };
99}
100
Chris Lattner7eac8052010-03-22 18:14:12 +0000101static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000102_mm_sqrt_pd(__m128d a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000103{
104 return __builtin_ia32_sqrtpd(a);
105}
106
Chris Lattner7eac8052010-03-22 18:14:12 +0000107static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000108_mm_min_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000109{
110 return __builtin_ia32_minsd(a, b);
111}
112
Chris Lattner7eac8052010-03-22 18:14:12 +0000113static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000114_mm_min_pd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000115{
116 return __builtin_ia32_minpd(a, b);
117}
118
Chris Lattner7eac8052010-03-22 18:14:12 +0000119static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000120_mm_max_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000121{
122 return __builtin_ia32_maxsd(a, b);
123}
124
Chris Lattner7eac8052010-03-22 18:14:12 +0000125static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000126_mm_max_pd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000127{
128 return __builtin_ia32_maxpd(a, b);
129}
130
Chris Lattner7eac8052010-03-22 18:14:12 +0000131static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000132_mm_and_pd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000133{
Eli Friedmand00fd282009-06-06 03:45:06 +0000134 return (__m128d)((__v4si)a & (__v4si)b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000135}
136
Chris Lattner7eac8052010-03-22 18:14:12 +0000137static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000138_mm_andnot_pd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000139{
Eli Friedmand00fd282009-06-06 03:45:06 +0000140 return (__m128d)(~(__v4si)a & (__v4si)b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000141}
142
Chris Lattner7eac8052010-03-22 18:14:12 +0000143static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000144_mm_or_pd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000145{
Eli Friedmand00fd282009-06-06 03:45:06 +0000146 return (__m128d)((__v4si)a | (__v4si)b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000147}
148
Chris Lattner7eac8052010-03-22 18:14:12 +0000149static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000150_mm_xor_pd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000151{
Eli Friedmand00fd282009-06-06 03:45:06 +0000152 return (__m128d)((__v4si)a ^ (__v4si)b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000153}
154
Chris Lattner7eac8052010-03-22 18:14:12 +0000155static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000156_mm_cmpeq_pd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000157{
Anders Carlsson20812002009-05-18 19:16:46 +0000158 return (__m128d)__builtin_ia32_cmppd(a, b, 0);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000159}
160
Chris Lattner7eac8052010-03-22 18:14:12 +0000161static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000162_mm_cmplt_pd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000163{
Anders Carlsson20812002009-05-18 19:16:46 +0000164 return (__m128d)__builtin_ia32_cmppd(a, b, 1);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000165}
166
Chris Lattner7eac8052010-03-22 18:14:12 +0000167static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000168_mm_cmple_pd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000169{
Anders Carlsson20812002009-05-18 19:16:46 +0000170 return (__m128d)__builtin_ia32_cmppd(a, b, 2);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000171}
172
Chris Lattner7eac8052010-03-22 18:14:12 +0000173static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000174_mm_cmpgt_pd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000175{
Anders Carlsson20812002009-05-18 19:16:46 +0000176 return (__m128d)__builtin_ia32_cmppd(b, a, 1);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000177}
178
Chris Lattner7eac8052010-03-22 18:14:12 +0000179static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000180_mm_cmpge_pd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000181{
Anders Carlsson20812002009-05-18 19:16:46 +0000182 return (__m128d)__builtin_ia32_cmppd(b, a, 2);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000183}
184
Chris Lattner7eac8052010-03-22 18:14:12 +0000185static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000186_mm_cmpord_pd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000187{
Anders Carlsson20812002009-05-18 19:16:46 +0000188 return (__m128d)__builtin_ia32_cmppd(a, b, 7);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000189}
190
Chris Lattner7eac8052010-03-22 18:14:12 +0000191static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000192_mm_cmpunord_pd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000193{
Anders Carlsson20812002009-05-18 19:16:46 +0000194 return (__m128d)__builtin_ia32_cmppd(a, b, 3);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000195}
196
Chris Lattner7eac8052010-03-22 18:14:12 +0000197static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000198_mm_cmpneq_pd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000199{
Anders Carlsson20812002009-05-18 19:16:46 +0000200 return (__m128d)__builtin_ia32_cmppd(a, b, 4);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000201}
202
Chris Lattner7eac8052010-03-22 18:14:12 +0000203static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000204_mm_cmpnlt_pd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000205{
Anders Carlsson20812002009-05-18 19:16:46 +0000206 return (__m128d)__builtin_ia32_cmppd(a, b, 5);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000207}
208
Chris Lattner7eac8052010-03-22 18:14:12 +0000209static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000210_mm_cmpnle_pd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000211{
Anders Carlsson20812002009-05-18 19:16:46 +0000212 return (__m128d)__builtin_ia32_cmppd(a, b, 6);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000213}
214
Chris Lattner7eac8052010-03-22 18:14:12 +0000215static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000216_mm_cmpngt_pd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000217{
Anders Carlsson20812002009-05-18 19:16:46 +0000218 return (__m128d)__builtin_ia32_cmppd(b, a, 5);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000219}
220
Chris Lattner7eac8052010-03-22 18:14:12 +0000221static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000222_mm_cmpnge_pd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000223{
Anders Carlsson20812002009-05-18 19:16:46 +0000224 return (__m128d)__builtin_ia32_cmppd(b, a, 6);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000225}
226
Chris Lattner7eac8052010-03-22 18:14:12 +0000227static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000228_mm_cmpeq_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000229{
Anders Carlsson20812002009-05-18 19:16:46 +0000230 return (__m128d)__builtin_ia32_cmpsd(a, b, 0);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000231}
232
Chris Lattner7eac8052010-03-22 18:14:12 +0000233static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000234_mm_cmplt_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000235{
Anders Carlsson20812002009-05-18 19:16:46 +0000236 return (__m128d)__builtin_ia32_cmpsd(a, b, 1);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000237}
238
Chris Lattner7eac8052010-03-22 18:14:12 +0000239static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000240_mm_cmple_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000241{
Anders Carlsson20812002009-05-18 19:16:46 +0000242 return (__m128d)__builtin_ia32_cmpsd(a, b, 2);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000243}
244
Chris Lattner7eac8052010-03-22 18:14:12 +0000245static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000246_mm_cmpgt_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000247{
Anders Carlsson20812002009-05-18 19:16:46 +0000248 return (__m128d)__builtin_ia32_cmpsd(b, a, 1);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000249}
250
Chris Lattner7eac8052010-03-22 18:14:12 +0000251static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000252_mm_cmpge_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000253{
Anders Carlsson20812002009-05-18 19:16:46 +0000254 return (__m128d)__builtin_ia32_cmpsd(b, a, 2);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000255}
256
Chris Lattner7eac8052010-03-22 18:14:12 +0000257static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000258_mm_cmpord_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000259{
Anders Carlsson20812002009-05-18 19:16:46 +0000260 return (__m128d)__builtin_ia32_cmpsd(a, b, 7);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000261}
262
Chris Lattner7eac8052010-03-22 18:14:12 +0000263static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000264_mm_cmpunord_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000265{
Anders Carlsson20812002009-05-18 19:16:46 +0000266 return (__m128d)__builtin_ia32_cmpsd(a, b, 3);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000267}
268
Chris Lattner7eac8052010-03-22 18:14:12 +0000269static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000270_mm_cmpneq_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000271{
Anders Carlsson20812002009-05-18 19:16:46 +0000272 return (__m128d)__builtin_ia32_cmpsd(a, b, 4);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000273}
274
Chris Lattner7eac8052010-03-22 18:14:12 +0000275static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000276_mm_cmpnlt_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000277{
Anders Carlsson20812002009-05-18 19:16:46 +0000278 return (__m128d)__builtin_ia32_cmpsd(a, b, 5);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000279}
280
Chris Lattner7eac8052010-03-22 18:14:12 +0000281static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000282_mm_cmpnle_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000283{
Anders Carlsson20812002009-05-18 19:16:46 +0000284 return (__m128d)__builtin_ia32_cmpsd(a, b, 6);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000285}
286
Chris Lattner7eac8052010-03-22 18:14:12 +0000287static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000288_mm_cmpngt_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000289{
Anders Carlsson20812002009-05-18 19:16:46 +0000290 return (__m128d)__builtin_ia32_cmpsd(b, a, 5);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000291}
292
Chris Lattner7eac8052010-03-22 18:14:12 +0000293static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000294_mm_cmpnge_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000295{
Anders Carlsson20812002009-05-18 19:16:46 +0000296 return (__m128d)__builtin_ia32_cmpsd(b, a, 6);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000297}
298
Chris Lattner7eac8052010-03-22 18:14:12 +0000299static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000300_mm_comieq_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000301{
302 return __builtin_ia32_comisdeq(a, b);
303}
304
Chris Lattner7eac8052010-03-22 18:14:12 +0000305static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000306_mm_comilt_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000307{
308 return __builtin_ia32_comisdlt(a, b);
309}
310
Chris Lattner7eac8052010-03-22 18:14:12 +0000311static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000312_mm_comile_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000313{
314 return __builtin_ia32_comisdle(a, b);
315}
316
Chris Lattner7eac8052010-03-22 18:14:12 +0000317static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000318_mm_comigt_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000319{
320 return __builtin_ia32_comisdgt(a, b);
321}
322
Chris Lattner7eac8052010-03-22 18:14:12 +0000323static __inline__ int __attribute__((__always_inline__, __nodebug__))
Eli Friedman89c11332011-10-06 20:31:50 +0000324_mm_comige_sd(__m128d a, __m128d b)
325{
326 return __builtin_ia32_comisdge(a, b);
327}
328
329static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000330_mm_comineq_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000331{
332 return __builtin_ia32_comisdneq(a, b);
333}
334
Chris Lattner7eac8052010-03-22 18:14:12 +0000335static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000336_mm_ucomieq_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000337{
338 return __builtin_ia32_ucomisdeq(a, b);
339}
340
Chris Lattner7eac8052010-03-22 18:14:12 +0000341static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000342_mm_ucomilt_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000343{
344 return __builtin_ia32_ucomisdlt(a, b);
345}
346
Chris Lattner7eac8052010-03-22 18:14:12 +0000347static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000348_mm_ucomile_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000349{
350 return __builtin_ia32_ucomisdle(a, b);
351}
352
Chris Lattner7eac8052010-03-22 18:14:12 +0000353static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000354_mm_ucomigt_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000355{
356 return __builtin_ia32_ucomisdgt(a, b);
357}
358
Chris Lattner7eac8052010-03-22 18:14:12 +0000359static __inline__ int __attribute__((__always_inline__, __nodebug__))
Eli Friedmanf8cb4802011-08-29 21:26:24 +0000360_mm_ucomige_sd(__m128d a, __m128d b)
361{
362 return __builtin_ia32_ucomisdge(a, b);
363}
364
365static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000366_mm_ucomineq_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000367{
368 return __builtin_ia32_ucomisdneq(a, b);
369}
370
Chris Lattner7eac8052010-03-22 18:14:12 +0000371static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000372_mm_cvtpd_ps(__m128d a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000373{
374 return __builtin_ia32_cvtpd2ps(a);
375}
376
Chris Lattner7eac8052010-03-22 18:14:12 +0000377static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000378_mm_cvtps_pd(__m128 a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000379{
380 return __builtin_ia32_cvtps2pd(a);
381}
382
Chris Lattner7eac8052010-03-22 18:14:12 +0000383static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000384_mm_cvtepi32_pd(__m128i a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000385{
386 return __builtin_ia32_cvtdq2pd((__v4si)a);
387}
388
Chris Lattner7eac8052010-03-22 18:14:12 +0000389static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000390_mm_cvtpd_epi32(__m128d a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000391{
392 return __builtin_ia32_cvtpd2dq(a);
393}
394
Chris Lattner7eac8052010-03-22 18:14:12 +0000395static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000396_mm_cvtsd_si32(__m128d a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000397{
398 return __builtin_ia32_cvtsd2si(a);
399}
400
Chris Lattner7eac8052010-03-22 18:14:12 +0000401static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000402_mm_cvtsd_ss(__m128 a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000403{
Eli Friedmanebd93142009-06-06 02:13:04 +0000404 a[0] = b[0];
405 return a;
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000406}
407
Chris Lattner7eac8052010-03-22 18:14:12 +0000408static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000409_mm_cvtsi32_sd(__m128d a, int b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000410{
Eli Friedman4d8d7d32009-06-06 08:08:06 +0000411 a[0] = b;
412 return a;
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000413}
414
Chris Lattner7eac8052010-03-22 18:14:12 +0000415static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000416_mm_cvtss_sd(__m128d a, __m128 b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000417{
Eli Friedmanebd93142009-06-06 02:13:04 +0000418 a[0] = b[0];
419 return a;
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000420}
421
Chris Lattner7eac8052010-03-22 18:14:12 +0000422static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000423_mm_cvttpd_epi32(__m128d a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000424{
425 return (__m128i)__builtin_ia32_cvttpd2dq(a);
426}
427
Chris Lattner7eac8052010-03-22 18:14:12 +0000428static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000429_mm_cvttsd_si32(__m128d a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000430{
Eli Friedmanebd93142009-06-06 02:13:04 +0000431 return a[0];
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000432}
433
Chris Lattner7eac8052010-03-22 18:14:12 +0000434static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000435_mm_cvtpd_pi32(__m128d a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000436{
437 return (__m64)__builtin_ia32_cvtpd2pi(a);
438}
439
Chris Lattner7eac8052010-03-22 18:14:12 +0000440static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000441_mm_cvttpd_pi32(__m128d a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000442{
443 return (__m64)__builtin_ia32_cvttpd2pi(a);
444}
445
Chris Lattner7eac8052010-03-22 18:14:12 +0000446static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000447_mm_cvtpi32_pd(__m64 a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000448{
449 return __builtin_ia32_cvtpi2pd((__v2si)a);
450}
451
Chris Lattner7eac8052010-03-22 18:14:12 +0000452static __inline__ double __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000453_mm_cvtsd_f64(__m128d a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000454{
455 return a[0];
456}
457
Chris Lattner7eac8052010-03-22 18:14:12 +0000458static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000459_mm_load_pd(double const *dp)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000460{
461 return *(__m128d*)dp;
462}
463
Chris Lattner7eac8052010-03-22 18:14:12 +0000464static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000465_mm_load1_pd(double const *dp)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000466{
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000467 struct __mm_load1_pd_struct {
468 double u;
469 } __attribute__((__packed__, __may_alias__));
470 double u = ((struct __mm_load1_pd_struct*)dp)->u;
471 return (__m128d){ u, u };
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000472}
473
Eli Friedmanf83c2582009-06-02 05:55:48 +0000474#define _mm_load_pd1(dp) _mm_load1_pd(dp)
475
Chris Lattner7eac8052010-03-22 18:14:12 +0000476static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000477_mm_loadr_pd(double const *dp)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000478{
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000479 __m128d u = *(__m128d*)dp;
480 return __builtin_shufflevector(u, u, 1, 0);
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000481}
482
Chris Lattner7eac8052010-03-22 18:14:12 +0000483static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000484_mm_loadu_pd(double const *dp)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000485{
Bill Wendling502931f2011-05-13 00:11:39 +0000486 struct __loadu_pd {
487 __m128d v;
Bill Wendling03e7e432011-05-13 01:24:00 +0000488 } __attribute__((packed, may_alias));
Bill Wendling502931f2011-05-13 00:11:39 +0000489 return ((struct __loadu_pd*)dp)->v;
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000490}
491
Chris Lattner7eac8052010-03-22 18:14:12 +0000492static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000493_mm_load_sd(double const *dp)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000494{
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000495 struct __mm_load_sd_struct {
496 double u;
497 } __attribute__((__packed__, __may_alias__));
498 double u = ((struct __mm_load_sd_struct*)dp)->u;
499 return (__m128d){ u, 0 };
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000500}
501
Chris Lattner7eac8052010-03-22 18:14:12 +0000502static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000503_mm_loadh_pd(__m128d a, double const *dp)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000504{
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000505 struct __mm_loadh_pd_struct {
506 double u;
507 } __attribute__((__packed__, __may_alias__));
508 double u = ((struct __mm_loadh_pd_struct*)dp)->u;
509 return (__m128d){ a[0], u };
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000510}
511
Chris Lattner7eac8052010-03-22 18:14:12 +0000512static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000513_mm_loadl_pd(__m128d a, double const *dp)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000514{
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000515 struct __mm_loadl_pd_struct {
516 double u;
517 } __attribute__((__packed__, __may_alias__));
518 double u = ((struct __mm_loadl_pd_struct*)dp)->u;
519 return (__m128d){ u, a[1] };
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000520}
521
Chris Lattner7eac8052010-03-22 18:14:12 +0000522static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000523_mm_set_sd(double w)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000524{
525 return (__m128d){ w, 0 };
526}
527
Chris Lattner7eac8052010-03-22 18:14:12 +0000528static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000529_mm_set1_pd(double w)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000530{
531 return (__m128d){ w, w };
532}
533
Chris Lattner7eac8052010-03-22 18:14:12 +0000534static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000535_mm_set_pd(double w, double x)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000536{
Anders Carlssondfa31172009-09-18 17:03:55 +0000537 return (__m128d){ x, w };
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000538}
539
Chris Lattner7eac8052010-03-22 18:14:12 +0000540static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000541_mm_setr_pd(double w, double x)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000542{
Anders Carlssondfa31172009-09-18 17:03:55 +0000543 return (__m128d){ w, x };
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000544}
545
Chris Lattner7eac8052010-03-22 18:14:12 +0000546static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000547_mm_setzero_pd(void)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000548{
549 return (__m128d){ 0, 0 };
550}
551
Chris Lattner7eac8052010-03-22 18:14:12 +0000552static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000553_mm_move_sd(__m128d a, __m128d b)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000554{
555 return (__m128d){ b[0], a[1] };
556}
557
Chris Lattner7eac8052010-03-22 18:14:12 +0000558static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000559_mm_store_sd(double *dp, __m128d a)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000560{
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000561 struct __mm_store_sd_struct {
562 double u;
563 } __attribute__((__packed__, __may_alias__));
564 ((struct __mm_store_sd_struct*)dp)->u = a[0];
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000565}
566
Chris Lattner7eac8052010-03-22 18:14:12 +0000567static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000568_mm_store1_pd(double *dp, __m128d a)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000569{
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000570 struct __mm_store1_pd_struct {
571 double u[2];
572 } __attribute__((__packed__, __may_alias__));
573 ((struct __mm_store1_pd_struct*)dp)->u[0] = a[0];
574 ((struct __mm_store1_pd_struct*)dp)->u[1] = a[0];
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000575}
576
Chris Lattner7eac8052010-03-22 18:14:12 +0000577static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000578_mm_store_pd(double *dp, __m128d a)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000579{
580 *(__m128d *)dp = a;
581}
582
Chris Lattner7eac8052010-03-22 18:14:12 +0000583static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000584_mm_storeu_pd(double *dp, __m128d a)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000585{
586 __builtin_ia32_storeupd(dp, a);
587}
588
Chris Lattner7eac8052010-03-22 18:14:12 +0000589static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000590_mm_storer_pd(double *dp, __m128d a)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000591{
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000592 a = __builtin_shufflevector(a, a, 1, 0);
593 *(__m128d *)dp = a;
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000594}
595
Chris Lattner7eac8052010-03-22 18:14:12 +0000596static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000597_mm_storeh_pd(double *dp, __m128d a)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000598{
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000599 struct __mm_storeh_pd_struct {
600 double u;
601 } __attribute__((__packed__, __may_alias__));
602 ((struct __mm_storeh_pd_struct*)dp)->u = a[1];
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000603}
604
Chris Lattner7eac8052010-03-22 18:14:12 +0000605static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000606_mm_storel_pd(double *dp, __m128d a)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000607{
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000608 struct __mm_storeh_pd_struct {
609 double u;
610 } __attribute__((__packed__, __may_alias__));
611 ((struct __mm_storeh_pd_struct*)dp)->u = a[0];
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000612}
613
Chris Lattner7eac8052010-03-22 18:14:12 +0000614static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000615_mm_add_epi8(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000616{
617 return (__m128i)((__v16qi)a + (__v16qi)b);
618}
619
Chris Lattner7eac8052010-03-22 18:14:12 +0000620static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000621_mm_add_epi16(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000622{
623 return (__m128i)((__v8hi)a + (__v8hi)b);
624}
625
Chris Lattner7eac8052010-03-22 18:14:12 +0000626static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000627_mm_add_epi32(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000628{
629 return (__m128i)((__v4si)a + (__v4si)b);
630}
631
Chris Lattner7eac8052010-03-22 18:14:12 +0000632static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000633_mm_add_si64(__m64 a, __m64 b)
Anders Carlssona283f912008-12-24 02:41:00 +0000634{
635 return a + b;
636}
637
Chris Lattner7eac8052010-03-22 18:14:12 +0000638static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000639_mm_add_epi64(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000640{
641 return a + b;
642}
643
Chris Lattner7eac8052010-03-22 18:14:12 +0000644static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000645_mm_adds_epi8(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000646{
647 return (__m128i)__builtin_ia32_paddsb128((__v16qi)a, (__v16qi)b);
648}
649
Chris Lattner7eac8052010-03-22 18:14:12 +0000650static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000651_mm_adds_epi16(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000652{
653 return (__m128i)__builtin_ia32_paddsw128((__v8hi)a, (__v8hi)b);
654}
655
Chris Lattner7eac8052010-03-22 18:14:12 +0000656static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000657_mm_adds_epu8(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000658{
659 return (__m128i)__builtin_ia32_paddusb128((__v16qi)a, (__v16qi)b);
660}
661
Chris Lattner7eac8052010-03-22 18:14:12 +0000662static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000663_mm_adds_epu16(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000664{
665 return (__m128i)__builtin_ia32_paddusw128((__v8hi)a, (__v8hi)b);
666}
667
Chris Lattner7eac8052010-03-22 18:14:12 +0000668static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000669_mm_avg_epu8(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000670{
671 return (__m128i)__builtin_ia32_pavgb128((__v16qi)a, (__v16qi)b);
672}
673
Chris Lattner7eac8052010-03-22 18:14:12 +0000674static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000675_mm_avg_epu16(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000676{
677 return (__m128i)__builtin_ia32_pavgw128((__v8hi)a, (__v8hi)b);
678}
679
Chris Lattner7eac8052010-03-22 18:14:12 +0000680static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000681_mm_madd_epi16(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000682{
683 return (__m128i)__builtin_ia32_pmaddwd128((__v8hi)a, (__v8hi)b);
684}
685
Chris Lattner7eac8052010-03-22 18:14:12 +0000686static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000687_mm_max_epi16(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000688{
689 return (__m128i)__builtin_ia32_pmaxsw128((__v8hi)a, (__v8hi)b);
690}
691
Chris Lattner7eac8052010-03-22 18:14:12 +0000692static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000693_mm_max_epu8(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000694{
695 return (__m128i)__builtin_ia32_pmaxub128((__v16qi)a, (__v16qi)b);
696}
697
Chris Lattner7eac8052010-03-22 18:14:12 +0000698static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000699_mm_min_epi16(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000700{
701 return (__m128i)__builtin_ia32_pminsw128((__v8hi)a, (__v8hi)b);
702}
703
Chris Lattner7eac8052010-03-22 18:14:12 +0000704static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000705_mm_min_epu8(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000706{
707 return (__m128i)__builtin_ia32_pminub128((__v16qi)a, (__v16qi)b);
708}
709
Chris Lattner7eac8052010-03-22 18:14:12 +0000710static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000711_mm_mulhi_epi16(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000712{
713 return (__m128i)__builtin_ia32_pmulhw128((__v8hi)a, (__v8hi)b);
714}
715
Chris Lattner7eac8052010-03-22 18:14:12 +0000716static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000717_mm_mulhi_epu16(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000718{
719 return (__m128i)__builtin_ia32_pmulhuw128((__v8hi)a, (__v8hi)b);
720}
721
Chris Lattner7eac8052010-03-22 18:14:12 +0000722static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000723_mm_mullo_epi16(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000724{
Eli Friedman4d8d7d32009-06-06 08:08:06 +0000725 return (__m128i)((__v8hi)a * (__v8hi)b);
Anders Carlssona283f912008-12-24 02:41:00 +0000726}
727
Chris Lattner7eac8052010-03-22 18:14:12 +0000728static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000729_mm_mul_su32(__m64 a, __m64 b)
Anders Carlssona283f912008-12-24 02:41:00 +0000730{
731 return __builtin_ia32_pmuludq((__v2si)a, (__v2si)b);
732}
733
Chris Lattner7eac8052010-03-22 18:14:12 +0000734static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000735_mm_mul_epu32(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000736{
737 return __builtin_ia32_pmuludq128((__v4si)a, (__v4si)b);
738}
739
Chris Lattner7eac8052010-03-22 18:14:12 +0000740static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Anders Carlsson57640932009-04-06 21:55:22 +0000741_mm_sad_epu8(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000742{
743 return __builtin_ia32_psadbw128((__v16qi)a, (__v16qi)b);
744}
745
Chris Lattner7eac8052010-03-22 18:14:12 +0000746static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000747_mm_sub_epi8(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000748{
749 return (__m128i)((__v16qi)a - (__v16qi)b);
750}
751
Chris Lattner7eac8052010-03-22 18:14:12 +0000752static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000753_mm_sub_epi16(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000754{
755 return (__m128i)((__v8hi)a - (__v8hi)b);
756}
757
Chris Lattner7eac8052010-03-22 18:14:12 +0000758static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000759_mm_sub_epi32(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000760{
761 return (__m128i)((__v4si)a - (__v4si)b);
762}
763
Chris Lattner7eac8052010-03-22 18:14:12 +0000764static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000765_mm_sub_si64(__m64 a, __m64 b)
Anders Carlssona283f912008-12-24 02:41:00 +0000766{
767 return a - b;
768}
769
Chris Lattner7eac8052010-03-22 18:14:12 +0000770static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000771_mm_sub_epi64(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000772{
773 return a - b;
774}
775
Chris Lattner7eac8052010-03-22 18:14:12 +0000776static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000777_mm_subs_epi8(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000778{
779 return (__m128i)__builtin_ia32_psubsb128((__v16qi)a, (__v16qi)b);
780}
781
Chris Lattner7eac8052010-03-22 18:14:12 +0000782static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000783_mm_subs_epi16(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000784{
785 return (__m128i)__builtin_ia32_psubsw128((__v8hi)a, (__v8hi)b);
786}
787
Chris Lattner7eac8052010-03-22 18:14:12 +0000788static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000789_mm_subs_epu8(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000790{
791 return (__m128i)__builtin_ia32_psubusb128((__v16qi)a, (__v16qi)b);
792}
793
Chris Lattner7eac8052010-03-22 18:14:12 +0000794static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000795_mm_subs_epu16(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000796{
797 return (__m128i)__builtin_ia32_psubusw128((__v8hi)a, (__v8hi)b);
798}
799
Chris Lattner7eac8052010-03-22 18:14:12 +0000800static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000801_mm_and_si128(__m128i a, __m128i b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000802{
Eli Friedmanebd93142009-06-06 02:13:04 +0000803 return a & b;
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000804}
805
Chris Lattner7eac8052010-03-22 18:14:12 +0000806static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000807_mm_andnot_si128(__m128i a, __m128i b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000808{
Eli Friedmanebd93142009-06-06 02:13:04 +0000809 return ~a & b;
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000810}
811
Chris Lattner7eac8052010-03-22 18:14:12 +0000812static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000813_mm_or_si128(__m128i a, __m128i b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000814{
Eli Friedmanebd93142009-06-06 02:13:04 +0000815 return a | b;
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000816}
817
Chris Lattner7eac8052010-03-22 18:14:12 +0000818static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000819_mm_xor_si128(__m128i a, __m128i b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000820{
Eli Friedmanebd93142009-06-06 02:13:04 +0000821 return a ^ b;
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000822}
823
Chris Lattner81f347f2010-10-01 06:52:23 +0000824#define _mm_slli_si128(VEC, IMM) \
Chris Lattner1750cb02010-10-01 06:58:49 +0000825 ((__m128i)__builtin_ia32_pslldqi128((__m128i)(VEC), (IMM)*8))
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000826
Chris Lattner7eac8052010-03-22 18:14:12 +0000827static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000828_mm_slli_epi16(__m128i a, int count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000829{
830 return (__m128i)__builtin_ia32_psllwi128((__v8hi)a, count);
831}
832
Chris Lattner7eac8052010-03-22 18:14:12 +0000833static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000834_mm_sll_epi16(__m128i a, __m128i count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000835{
836 return (__m128i)__builtin_ia32_psllw128((__v8hi)a, (__v8hi)count);
837}
838
Chris Lattner7eac8052010-03-22 18:14:12 +0000839static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000840_mm_slli_epi32(__m128i a, int count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000841{
842 return (__m128i)__builtin_ia32_pslldi128((__v4si)a, count);
843}
844
Chris Lattner7eac8052010-03-22 18:14:12 +0000845static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000846_mm_sll_epi32(__m128i a, __m128i count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000847{
848 return (__m128i)__builtin_ia32_pslld128((__v4si)a, (__v4si)count);
849}
850
Chris Lattner7eac8052010-03-22 18:14:12 +0000851static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000852_mm_slli_epi64(__m128i a, int count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000853{
854 return __builtin_ia32_psllqi128(a, count);
855}
856
Chris Lattner7eac8052010-03-22 18:14:12 +0000857static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000858_mm_sll_epi64(__m128i a, __m128i count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000859{
860 return __builtin_ia32_psllq128(a, count);
861}
862
Chris Lattner7eac8052010-03-22 18:14:12 +0000863static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000864_mm_srai_epi16(__m128i a, int count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000865{
866 return (__m128i)__builtin_ia32_psrawi128((__v8hi)a, count);
867}
868
Chris Lattner7eac8052010-03-22 18:14:12 +0000869static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000870_mm_sra_epi16(__m128i a, __m128i count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000871{
872 return (__m128i)__builtin_ia32_psraw128((__v8hi)a, (__v8hi)count);
873}
874
Chris Lattner7eac8052010-03-22 18:14:12 +0000875static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000876_mm_srai_epi32(__m128i a, int count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000877{
878 return (__m128i)__builtin_ia32_psradi128((__v4si)a, count);
879}
880
Chris Lattner7eac8052010-03-22 18:14:12 +0000881static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000882_mm_sra_epi32(__m128i a, __m128i count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000883{
884 return (__m128i)__builtin_ia32_psrad128((__v4si)a, (__v4si)count);
885}
886
Chris Lattner1750cb02010-10-01 06:58:49 +0000887
888#define _mm_srli_si128(VEC, IMM) \
889 ((__m128i)__builtin_ia32_psrldqi128((__m128i)(VEC), (IMM)*8))
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000890
Chris Lattner7eac8052010-03-22 18:14:12 +0000891static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000892_mm_srli_epi16(__m128i a, int count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000893{
894 return (__m128i)__builtin_ia32_psrlwi128((__v8hi)a, count);
895}
896
Chris Lattner7eac8052010-03-22 18:14:12 +0000897static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000898_mm_srl_epi16(__m128i a, __m128i count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000899{
900 return (__m128i)__builtin_ia32_psrlw128((__v8hi)a, (__v8hi)count);
901}
902
Chris Lattner7eac8052010-03-22 18:14:12 +0000903static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000904_mm_srli_epi32(__m128i a, int count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000905{
906 return (__m128i)__builtin_ia32_psrldi128((__v4si)a, count);
907}
908
Chris Lattner7eac8052010-03-22 18:14:12 +0000909static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000910_mm_srl_epi32(__m128i a, __m128i count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000911{
912 return (__m128i)__builtin_ia32_psrld128((__v4si)a, (__v4si)count);
913}
914
Chris Lattner7eac8052010-03-22 18:14:12 +0000915static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000916_mm_srli_epi64(__m128i a, int count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000917{
918 return __builtin_ia32_psrlqi128(a, count);
919}
920
Chris Lattner7eac8052010-03-22 18:14:12 +0000921static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000922_mm_srl_epi64(__m128i a, __m128i count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000923{
924 return __builtin_ia32_psrlq128(a, count);
925}
926
Chris Lattner7eac8052010-03-22 18:14:12 +0000927static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000928_mm_cmpeq_epi8(__m128i a, __m128i b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000929{
Eli Friedman51733492009-07-22 17:08:01 +0000930 return (__m128i)((__v16qi)a == (__v16qi)b);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000931}
932
Chris Lattner7eac8052010-03-22 18:14:12 +0000933static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000934_mm_cmpeq_epi16(__m128i a, __m128i b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000935{
Eli Friedman51733492009-07-22 17:08:01 +0000936 return (__m128i)((__v8hi)a == (__v8hi)b);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000937}
938
Chris Lattner7eac8052010-03-22 18:14:12 +0000939static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000940_mm_cmpeq_epi32(__m128i a, __m128i b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000941{
Eli Friedman51733492009-07-22 17:08:01 +0000942 return (__m128i)((__v4si)a == (__v4si)b);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000943}
944
Chris Lattner7eac8052010-03-22 18:14:12 +0000945static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000946_mm_cmpgt_epi8(__m128i a, __m128i b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000947{
Eli Friedman51733492009-07-22 17:08:01 +0000948 return (__m128i)((__v16qi)a > (__v16qi)b);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000949}
950
Chris Lattner7eac8052010-03-22 18:14:12 +0000951static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000952_mm_cmpgt_epi16(__m128i a, __m128i b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000953{
Eli Friedman51733492009-07-22 17:08:01 +0000954 return (__m128i)((__v8hi)a > (__v8hi)b);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000955}
956
Chris Lattner7eac8052010-03-22 18:14:12 +0000957static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000958_mm_cmpgt_epi32(__m128i a, __m128i b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000959{
Eli Friedman51733492009-07-22 17:08:01 +0000960 return (__m128i)((__v4si)a > (__v4si)b);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000961}
962
Chris Lattner7eac8052010-03-22 18:14:12 +0000963static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000964_mm_cmplt_epi8(__m128i a, __m128i b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000965{
Eli Friedman51733492009-07-22 17:08:01 +0000966 return _mm_cmpgt_epi8(b,a);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000967}
968
Chris Lattner7eac8052010-03-22 18:14:12 +0000969static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000970_mm_cmplt_epi16(__m128i a, __m128i b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000971{
Eli Friedman51733492009-07-22 17:08:01 +0000972 return _mm_cmpgt_epi16(b,a);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000973}
974
Chris Lattner7eac8052010-03-22 18:14:12 +0000975static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000976_mm_cmplt_epi32(__m128i a, __m128i b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000977{
Eli Friedman51733492009-07-22 17:08:01 +0000978 return _mm_cmpgt_epi32(b,a);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000979}
980
981#ifdef __x86_64__
Chris Lattner7eac8052010-03-22 18:14:12 +0000982static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000983_mm_cvtsi64_sd(__m128d a, long long b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000984{
Eli Friedmanebd93142009-06-06 02:13:04 +0000985 a[0] = b;
986 return a;
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000987}
988
Chris Lattner7eac8052010-03-22 18:14:12 +0000989static __inline__ long long __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000990_mm_cvtsd_si64(__m128d a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000991{
992 return __builtin_ia32_cvtsd2si64(a);
993}
994
Chris Lattner7eac8052010-03-22 18:14:12 +0000995static __inline__ long long __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000996_mm_cvttsd_si64(__m128d a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000997{
Eli Friedmanebd93142009-06-06 02:13:04 +0000998 return a[0];
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000999}
1000#endif
1001
Chris Lattner7eac8052010-03-22 18:14:12 +00001002static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001003_mm_cvtepi32_ps(__m128i a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001004{
1005 return __builtin_ia32_cvtdq2ps((__v4si)a);
1006}
1007
Chris Lattner7eac8052010-03-22 18:14:12 +00001008static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001009_mm_cvtps_epi32(__m128 a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001010{
1011 return (__m128i)__builtin_ia32_cvtps2dq(a);
1012}
1013
Chris Lattner7eac8052010-03-22 18:14:12 +00001014static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001015_mm_cvttps_epi32(__m128 a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001016{
1017 return (__m128i)__builtin_ia32_cvttps2dq(a);
1018}
1019
Chris Lattner7eac8052010-03-22 18:14:12 +00001020static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001021_mm_cvtsi32_si128(int a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001022{
1023 return (__m128i)(__v4si){ a, 0, 0, 0 };
1024}
1025
1026#ifdef __x86_64__
Chris Lattner7eac8052010-03-22 18:14:12 +00001027static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001028_mm_cvtsi64_si128(long long a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001029{
1030 return (__m128i){ a, 0 };
1031}
1032#endif
1033
Chris Lattner7eac8052010-03-22 18:14:12 +00001034static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001035_mm_cvtsi128_si32(__m128i a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001036{
1037 __v4si b = (__v4si)a;
1038 return b[0];
1039}
1040
1041#ifdef __x86_64__
Chris Lattner7eac8052010-03-22 18:14:12 +00001042static __inline__ long long __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001043_mm_cvtsi128_si64(__m128i a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001044{
1045 return a[0];
1046}
1047#endif
1048
Chris Lattner7eac8052010-03-22 18:14:12 +00001049static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001050_mm_load_si128(__m128i const *p)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001051{
1052 return *p;
1053}
1054
Chris Lattner7eac8052010-03-22 18:14:12 +00001055static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001056_mm_loadu_si128(__m128i const *p)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001057{
Bill Wendling502931f2011-05-13 00:11:39 +00001058 struct __loadu_si128 {
1059 __m128i v;
Bill Wendling03e7e432011-05-13 01:24:00 +00001060 } __attribute__((packed, may_alias));
Bill Wendling502931f2011-05-13 00:11:39 +00001061 return ((struct __loadu_si128*)p)->v;
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001062}
1063
Chris Lattner7eac8052010-03-22 18:14:12 +00001064static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001065_mm_loadl_epi64(__m128i const *p)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001066{
Eli Friedman9bb51ad2011-09-15 23:15:27 +00001067 struct __mm_loadl_epi64_struct {
1068 long long u;
1069 } __attribute__((__packed__, __may_alias__));
1070 return (__m128i) { ((struct __mm_loadl_epi64_struct*)p)->u, 0};
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001071}
1072
Chris Lattner7eac8052010-03-22 18:14:12 +00001073static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Anders Carlssondfa31172009-09-18 17:03:55 +00001074_mm_set_epi64x(long long q1, long long q0)
1075{
1076 return (__m128i){ q0, q1 };
1077}
1078
Chris Lattner7eac8052010-03-22 18:14:12 +00001079static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001080_mm_set_epi64(__m64 q1, __m64 q0)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001081{
1082 return (__m128i){ (long long)q0, (long long)q1 };
1083}
1084
Chris Lattner7eac8052010-03-22 18:14:12 +00001085static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001086_mm_set_epi32(int i3, int i2, int i1, int i0)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001087{
1088 return (__m128i)(__v4si){ i0, i1, i2, i3};
1089}
1090
Chris Lattner7eac8052010-03-22 18:14:12 +00001091static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001092_mm_set_epi16(short w7, short w6, short w5, short w4, short w3, short w2, short w1, short w0)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001093{
1094 return (__m128i)(__v8hi){ w0, w1, w2, w3, w4, w5, w6, w7 };
1095}
1096
Chris Lattner7eac8052010-03-22 18:14:12 +00001097static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001098_mm_set_epi8(char b15, char b14, char b13, char b12, char b11, char b10, char b9, char b8, char b7, char b6, char b5, char b4, char b3, char b2, char b1, char b0)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001099{
1100 return (__m128i)(__v16qi){ b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15 };
1101}
1102
Chris Lattner7eac8052010-03-22 18:14:12 +00001103static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Anders Carlssondfa31172009-09-18 17:03:55 +00001104_mm_set1_epi64x(long long q)
1105{
1106 return (__m128i){ q, q };
1107}
1108
Chris Lattner7eac8052010-03-22 18:14:12 +00001109static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001110_mm_set1_epi64(__m64 q)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001111{
1112 return (__m128i){ (long long)q, (long long)q };
1113}
1114
Chris Lattner7eac8052010-03-22 18:14:12 +00001115static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001116_mm_set1_epi32(int i)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001117{
1118 return (__m128i)(__v4si){ i, i, i, i };
1119}
1120
Chris Lattner7eac8052010-03-22 18:14:12 +00001121static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001122_mm_set1_epi16(short w)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001123{
1124 return (__m128i)(__v8hi){ w, w, w, w, w, w, w, w };
1125}
1126
Chris Lattner7eac8052010-03-22 18:14:12 +00001127static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001128_mm_set1_epi8(char b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001129{
1130 return (__m128i)(__v16qi){ b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b };
1131}
1132
Chris Lattner7eac8052010-03-22 18:14:12 +00001133static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001134_mm_setr_epi64(__m64 q0, __m64 q1)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001135{
1136 return (__m128i){ (long long)q0, (long long)q1 };
1137}
1138
Chris Lattner7eac8052010-03-22 18:14:12 +00001139static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001140_mm_setr_epi32(int i0, int i1, int i2, int i3)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001141{
1142 return (__m128i)(__v4si){ i0, i1, i2, i3};
1143}
1144
Chris Lattner7eac8052010-03-22 18:14:12 +00001145static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001146_mm_setr_epi16(short w0, short w1, short w2, short w3, short w4, short w5, short w6, short w7)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001147{
1148 return (__m128i)(__v8hi){ w0, w1, w2, w3, w4, w5, w6, w7 };
1149}
1150
Chris Lattner7eac8052010-03-22 18:14:12 +00001151static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001152_mm_setr_epi8(char b0, char b1, char b2, char b3, char b4, char b5, char b6, char b7, char b8, char b9, char b10, char b11, char b12, char b13, char b14, char b15)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001153{
1154 return (__m128i)(__v16qi){ b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15 };
1155}
1156
Chris Lattner7eac8052010-03-22 18:14:12 +00001157static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001158_mm_setzero_si128(void)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001159{
1160 return (__m128i){ 0LL, 0LL };
1161}
1162
Chris Lattner7eac8052010-03-22 18:14:12 +00001163static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001164_mm_store_si128(__m128i *p, __m128i b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001165{
1166 *p = b;
1167}
1168
Chris Lattner7eac8052010-03-22 18:14:12 +00001169static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001170_mm_storeu_si128(__m128i *p, __m128i b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001171{
1172 __builtin_ia32_storedqu((char *)p, (__v16qi)b);
1173}
1174
Chris Lattner7eac8052010-03-22 18:14:12 +00001175static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001176_mm_maskmoveu_si128(__m128i d, __m128i n, char *p)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001177{
1178 __builtin_ia32_maskmovdqu((__v16qi)d, (__v16qi)n, p);
1179}
1180
Chris Lattner7eac8052010-03-22 18:14:12 +00001181static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001182_mm_storel_epi64(__m128i *p, __m128i a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001183{
1184 __builtin_ia32_storelv4si((__v2si *)p, a);
1185}
1186
Chris Lattner7eac8052010-03-22 18:14:12 +00001187static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001188_mm_stream_pd(double *p, __m128d a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001189{
1190 __builtin_ia32_movntpd(p, a);
1191}
1192
Chris Lattner7eac8052010-03-22 18:14:12 +00001193static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001194_mm_stream_si128(__m128i *p, __m128i a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001195{
1196 __builtin_ia32_movntdq(p, a);
1197}
1198
Chris Lattner7eac8052010-03-22 18:14:12 +00001199static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001200_mm_stream_si32(int *p, int a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001201{
1202 __builtin_ia32_movnti(p, a);
1203}
1204
Chris Lattner7eac8052010-03-22 18:14:12 +00001205static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001206_mm_clflush(void const *p)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001207{
1208 __builtin_ia32_clflush(p);
1209}
1210
Chris Lattner7eac8052010-03-22 18:14:12 +00001211static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001212_mm_lfence(void)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001213{
1214 __builtin_ia32_lfence();
1215}
1216
Chris Lattner7eac8052010-03-22 18:14:12 +00001217static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001218_mm_mfence(void)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001219{
1220 __builtin_ia32_mfence();
1221}
1222
Chris Lattner7eac8052010-03-22 18:14:12 +00001223static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001224_mm_packs_epi16(__m128i a, __m128i b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001225{
1226 return (__m128i)__builtin_ia32_packsswb128((__v8hi)a, (__v8hi)b);
1227}
1228
Chris Lattner7eac8052010-03-22 18:14:12 +00001229static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001230_mm_packs_epi32(__m128i a, __m128i b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001231{
1232 return (__m128i)__builtin_ia32_packssdw128((__v4si)a, (__v4si)b);
1233}
1234
Chris Lattner7eac8052010-03-22 18:14:12 +00001235static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001236_mm_packus_epi16(__m128i a, __m128i b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001237{
1238 return (__m128i)__builtin_ia32_packuswb128((__v8hi)a, (__v8hi)b);
1239}
1240
Chris Lattner7eac8052010-03-22 18:14:12 +00001241static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001242_mm_extract_epi16(__m128i a, int imm)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001243{
1244 __v8hi b = (__v8hi)a;
Chris Lattner9052c352010-08-20 16:08:33 +00001245 return (unsigned short)b[imm];
Anders Carlsson85eb1242008-12-26 00:45:50 +00001246}
1247
Chris Lattner7eac8052010-03-22 18:14:12 +00001248static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001249_mm_insert_epi16(__m128i a, int b, int imm)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001250{
Eli Friedmanebd93142009-06-06 02:13:04 +00001251 __v8hi c = (__v8hi)a;
1252 c[imm & 7] = b;
Eli Friedmand00fd282009-06-06 03:45:06 +00001253 return (__m128i)c;
Anders Carlsson85eb1242008-12-26 00:45:50 +00001254}
1255
Chris Lattner7eac8052010-03-22 18:14:12 +00001256static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001257_mm_movemask_epi8(__m128i a)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001258{
1259 return __builtin_ia32_pmovmskb128((__v16qi)a);
1260}
1261
Eli Friedman4d8d7d32009-06-06 08:08:06 +00001262#define _mm_shuffle_epi32(a, imm) \
Chris Lattnerf03406f2011-04-25 20:42:40 +00001263 ((__m128i)__builtin_shufflevector((__v4si)(a), (__v4si) _mm_set1_epi32(0), \
Eli Friedman4d8d7d32009-06-06 08:08:06 +00001264 (imm) & 0x3, ((imm) & 0xc) >> 2, \
1265 ((imm) & 0x30) >> 4, ((imm) & 0xc0) >> 6))
Chris Lattnerf03406f2011-04-25 20:42:40 +00001266
1267
Eli Friedman4d8d7d32009-06-06 08:08:06 +00001268#define _mm_shufflelo_epi16(a, imm) \
Chris Lattnerf03406f2011-04-25 20:42:40 +00001269 ((__m128i)__builtin_shufflevector((__v8hi)(a), (__v8hi) _mm_set1_epi16(0), \
Eli Friedman4d8d7d32009-06-06 08:08:06 +00001270 (imm) & 0x3, ((imm) & 0xc) >> 2, \
1271 ((imm) & 0x30) >> 4, ((imm) & 0xc0) >> 6, \
1272 4, 5, 6, 7))
1273#define _mm_shufflehi_epi16(a, imm) \
Chris Lattnerf03406f2011-04-25 20:42:40 +00001274 ((__m128i)__builtin_shufflevector((__v8hi)(a), (__v8hi) _mm_set1_epi16(0), 0, 1, 2, 3, \
Eli Friedman07c89c62010-07-08 20:09:45 +00001275 4 + (((imm) & 0x03) >> 0), \
1276 4 + (((imm) & 0x0c) >> 2), \
1277 4 + (((imm) & 0x30) >> 4), \
1278 4 + (((imm) & 0xc0) >> 6)))
Anders Carlsson85eb1242008-12-26 00:45:50 +00001279
Chris Lattner7eac8052010-03-22 18:14:12 +00001280static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001281_mm_unpackhi_epi8(__m128i a, __m128i b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001282{
Anders Carlsson37ba1a52008-12-26 00:50:47 +00001283 return (__m128i)__builtin_shufflevector((__v16qi)a, (__v16qi)b, 8, 16+8, 9, 16+9, 10, 16+10, 11, 16+11, 12, 16+12, 13, 16+13, 14, 16+14, 15, 16+15);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001284}
1285
Chris Lattner7eac8052010-03-22 18:14:12 +00001286static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001287_mm_unpackhi_epi16(__m128i a, __m128i b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001288{
Anders Carlsson37ba1a52008-12-26 00:50:47 +00001289 return (__m128i)__builtin_shufflevector((__v8hi)a, (__v8hi)b, 4, 8+4, 5, 8+5, 6, 8+6, 7, 8+7);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001290}
1291
Chris Lattner7eac8052010-03-22 18:14:12 +00001292static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001293_mm_unpackhi_epi32(__m128i a, __m128i b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001294{
Anders Carlsson37ba1a52008-12-26 00:50:47 +00001295 return (__m128i)__builtin_shufflevector((__v4si)a, (__v4si)b, 2, 4+2, 3, 4+3);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001296}
1297
Chris Lattner7eac8052010-03-22 18:14:12 +00001298static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001299_mm_unpackhi_epi64(__m128i a, __m128i b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001300{
Anders Carlsson37ba1a52008-12-26 00:50:47 +00001301 return (__m128i)__builtin_shufflevector(a, b, 1, 2+1);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001302}
1303
Chris Lattner7eac8052010-03-22 18:14:12 +00001304static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001305_mm_unpacklo_epi8(__m128i a, __m128i b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001306{
Anders Carlsson37ba1a52008-12-26 00:50:47 +00001307 return (__m128i)__builtin_shufflevector((__v16qi)a, (__v16qi)b, 0, 16+0, 1, 16+1, 2, 16+2, 3, 16+3, 4, 16+4, 5, 16+5, 6, 16+6, 7, 16+7);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001308}
1309
Chris Lattner7eac8052010-03-22 18:14:12 +00001310static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001311_mm_unpacklo_epi16(__m128i a, __m128i b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001312{
Anders Carlsson37ba1a52008-12-26 00:50:47 +00001313 return (__m128i)__builtin_shufflevector((__v8hi)a, (__v8hi)b, 0, 8+0, 1, 8+1, 2, 8+2, 3, 8+3);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001314}
1315
Chris Lattner7eac8052010-03-22 18:14:12 +00001316static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001317_mm_unpacklo_epi32(__m128i a, __m128i b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001318{
Anders Carlsson37ba1a52008-12-26 00:50:47 +00001319 return (__m128i)__builtin_shufflevector((__v4si)a, (__v4si)b, 0, 4+0, 1, 4+1);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001320}
1321
Chris Lattner7eac8052010-03-22 18:14:12 +00001322static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001323_mm_unpacklo_epi64(__m128i a, __m128i b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001324{
Anders Carlsson37ba1a52008-12-26 00:50:47 +00001325 return (__m128i)__builtin_shufflevector(a, b, 0, 2+0);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001326}
1327
Chris Lattner7eac8052010-03-22 18:14:12 +00001328static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001329_mm_movepi64_pi64(__m128i a)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001330{
1331 return (__m64)a[0];
1332}
1333
Chris Lattner7eac8052010-03-22 18:14:12 +00001334static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001335_mm_movpi64_pi64(__m64 a)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001336{
1337 return (__m128i){ (long long)a, 0 };
1338}
1339
Chris Lattner7eac8052010-03-22 18:14:12 +00001340static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001341_mm_move_epi64(__m128i a)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001342{
Eli Friedmanebd93142009-06-06 02:13:04 +00001343 return __builtin_shufflevector(a, (__m128i){ 0 }, 0, 2);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001344}
1345
Chris Lattner7eac8052010-03-22 18:14:12 +00001346static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001347_mm_unpackhi_pd(__m128d a, __m128d b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001348{
Anders Carlsson37ba1a52008-12-26 00:50:47 +00001349 return __builtin_shufflevector(a, b, 1, 2+1);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001350}
1351
Chris Lattner7eac8052010-03-22 18:14:12 +00001352static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001353_mm_unpacklo_pd(__m128d a, __m128d b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001354{
Anders Carlsson37ba1a52008-12-26 00:50:47 +00001355 return __builtin_shufflevector(a, b, 0, 2+0);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001356}
1357
Chris Lattner7eac8052010-03-22 18:14:12 +00001358static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001359_mm_movemask_pd(__m128d a)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001360{
1361 return __builtin_ia32_movmskpd(a);
1362}
1363
Chris Lattner8b3b1452010-05-15 16:54:46 +00001364#define _mm_shuffle_pd(a, b, i) \
1365 (__builtin_shufflevector((__m128d)(a), (__m128d)(b), (i) & 1, \
1366 (((i) & 2) >> 1) + 2))
Anders Carlsson85eb1242008-12-26 00:45:50 +00001367
Chris Lattner7eac8052010-03-22 18:14:12 +00001368static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001369_mm_castpd_ps(__m128d in)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001370{
1371 return (__m128)in;
1372}
1373
Chris Lattner7eac8052010-03-22 18:14:12 +00001374static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001375_mm_castpd_si128(__m128d in)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001376{
1377 return (__m128i)in;
1378}
1379
Chris Lattner7eac8052010-03-22 18:14:12 +00001380static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001381_mm_castps_pd(__m128 in)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001382{
1383 return (__m128d)in;
1384}
1385
Chris Lattner7eac8052010-03-22 18:14:12 +00001386static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001387_mm_castps_si128(__m128 in)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001388{
1389 return (__m128i)in;
1390}
1391
Chris Lattner7eac8052010-03-22 18:14:12 +00001392static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001393_mm_castsi128_ps(__m128i in)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001394{
1395 return (__m128)in;
1396}
1397
Chris Lattner7eac8052010-03-22 18:14:12 +00001398static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001399_mm_castsi128_pd(__m128i in)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001400{
1401 return (__m128d)in;
1402}
1403
Chris Lattner7eac8052010-03-22 18:14:12 +00001404static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001405_mm_pause(void)
Anders Carlsson37c23712008-12-26 00:49:43 +00001406{
Anders Carlsson88b53662008-12-26 02:22:10 +00001407 __asm__ volatile ("pause");
Anders Carlsson37c23712008-12-26 00:49:43 +00001408}
1409
Anders Carlsson43c2bab2009-01-21 01:49:39 +00001410#define _MM_SHUFFLE2(x, y) (((x) << 1) | (y))
Anders Carlsson37c23712008-12-26 00:49:43 +00001411
Anders Carlssonf15e71d2008-12-24 01:45:22 +00001412#endif /* __SSE2__ */
1413
1414#endif /* __EMMINTRIN_H */