blob: e5dfe26b49a6adc445efd6f8d489488699943769 [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__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000324_mm_comineq_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000325{
326 return __builtin_ia32_comisdneq(a, b);
327}
328
Chris Lattner7eac8052010-03-22 18:14:12 +0000329static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000330_mm_ucomieq_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000331{
332 return __builtin_ia32_ucomisdeq(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_ucomilt_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000337{
338 return __builtin_ia32_ucomisdlt(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_ucomile_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000343{
344 return __builtin_ia32_ucomisdle(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_ucomigt_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000349{
350 return __builtin_ia32_ucomisdgt(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_ucomineq_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000355{
356 return __builtin_ia32_ucomisdneq(a, b);
357}
358
Chris Lattner7eac8052010-03-22 18:14:12 +0000359static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000360_mm_cvtpd_ps(__m128d a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000361{
362 return __builtin_ia32_cvtpd2ps(a);
363}
364
Chris Lattner7eac8052010-03-22 18:14:12 +0000365static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000366_mm_cvtps_pd(__m128 a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000367{
368 return __builtin_ia32_cvtps2pd(a);
369}
370
Chris Lattner7eac8052010-03-22 18:14:12 +0000371static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000372_mm_cvtepi32_pd(__m128i a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000373{
374 return __builtin_ia32_cvtdq2pd((__v4si)a);
375}
376
Chris Lattner7eac8052010-03-22 18:14:12 +0000377static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000378_mm_cvtpd_epi32(__m128d a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000379{
380 return __builtin_ia32_cvtpd2dq(a);
381}
382
Chris Lattner7eac8052010-03-22 18:14:12 +0000383static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000384_mm_cvtsd_si32(__m128d a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000385{
386 return __builtin_ia32_cvtsd2si(a);
387}
388
Chris Lattner7eac8052010-03-22 18:14:12 +0000389static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000390_mm_cvtsd_ss(__m128 a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000391{
Eli Friedmanebd93142009-06-06 02:13:04 +0000392 a[0] = b[0];
393 return a;
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000394}
395
Chris Lattner7eac8052010-03-22 18:14:12 +0000396static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000397_mm_cvtsi32_sd(__m128d a, int b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000398{
Eli Friedman4d8d7d32009-06-06 08:08:06 +0000399 a[0] = b;
400 return a;
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000401}
402
Chris Lattner7eac8052010-03-22 18:14:12 +0000403static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000404_mm_cvtss_sd(__m128d a, __m128 b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000405{
Eli Friedmanebd93142009-06-06 02:13:04 +0000406 a[0] = b[0];
407 return a;
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000408}
409
Chris Lattner7eac8052010-03-22 18:14:12 +0000410static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000411_mm_cvttpd_epi32(__m128d a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000412{
413 return (__m128i)__builtin_ia32_cvttpd2dq(a);
414}
415
Chris Lattner7eac8052010-03-22 18:14:12 +0000416static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000417_mm_cvttsd_si32(__m128d a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000418{
Eli Friedmanebd93142009-06-06 02:13:04 +0000419 return a[0];
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000420}
421
Chris Lattner7eac8052010-03-22 18:14:12 +0000422static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000423_mm_cvtpd_pi32(__m128d a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000424{
425 return (__m64)__builtin_ia32_cvtpd2pi(a);
426}
427
Chris Lattner7eac8052010-03-22 18:14:12 +0000428static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000429_mm_cvttpd_pi32(__m128d a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000430{
431 return (__m64)__builtin_ia32_cvttpd2pi(a);
432}
433
Chris Lattner7eac8052010-03-22 18:14:12 +0000434static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000435_mm_cvtpi32_pd(__m64 a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000436{
437 return __builtin_ia32_cvtpi2pd((__v2si)a);
438}
439
Chris Lattner7eac8052010-03-22 18:14:12 +0000440static __inline__ double __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000441_mm_cvtsd_f64(__m128d a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000442{
443 return a[0];
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_load_pd(double const *dp)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000448{
449 return *(__m128d*)dp;
450}
451
Chris Lattner7eac8052010-03-22 18:14:12 +0000452static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000453_mm_load1_pd(double const *dp)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000454{
455 return (__m128d){ dp[0], dp[0] };
456}
457
Eli Friedmanf83c2582009-06-02 05:55:48 +0000458#define _mm_load_pd1(dp) _mm_load1_pd(dp)
459
Chris Lattner7eac8052010-03-22 18:14:12 +0000460static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000461_mm_loadr_pd(double const *dp)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000462{
463 return (__m128d){ dp[1], dp[0] };
464}
465
Chris Lattner7eac8052010-03-22 18:14:12 +0000466static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000467_mm_loadu_pd(double const *dp)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000468{
469 return __builtin_ia32_loadupd(dp);
470}
471
Chris Lattner7eac8052010-03-22 18:14:12 +0000472static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000473_mm_load_sd(double const *dp)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000474{
475 return (__m128d){ *dp, 0.0 };
476}
477
Chris Lattner7eac8052010-03-22 18:14:12 +0000478static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000479_mm_loadh_pd(__m128d a, double const *dp)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000480{
481 return __builtin_shufflevector(a, *(__m128d *)dp, 0, 2);
482}
483
Chris Lattner7eac8052010-03-22 18:14:12 +0000484static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000485_mm_loadl_pd(__m128d a, double const *dp)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000486{
487 return __builtin_shufflevector(a, *(__m128d *)dp, 2, 1);
488}
489
Chris Lattner7eac8052010-03-22 18:14:12 +0000490static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000491_mm_set_sd(double w)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000492{
493 return (__m128d){ w, 0 };
494}
495
Chris Lattner7eac8052010-03-22 18:14:12 +0000496static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000497_mm_set1_pd(double w)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000498{
499 return (__m128d){ w, w };
500}
501
Chris Lattner7eac8052010-03-22 18:14:12 +0000502static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000503_mm_set_pd(double w, double x)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000504{
Anders Carlssondfa31172009-09-18 17:03:55 +0000505 return (__m128d){ x, w };
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000506}
507
Chris Lattner7eac8052010-03-22 18:14:12 +0000508static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000509_mm_setr_pd(double w, double x)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000510{
Anders Carlssondfa31172009-09-18 17:03:55 +0000511 return (__m128d){ w, x };
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000512}
513
Chris Lattner7eac8052010-03-22 18:14:12 +0000514static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000515_mm_setzero_pd(void)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000516{
517 return (__m128d){ 0, 0 };
518}
519
Chris Lattner7eac8052010-03-22 18:14:12 +0000520static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000521_mm_move_sd(__m128d a, __m128d b)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000522{
523 return (__m128d){ b[0], a[1] };
524}
525
Chris Lattner7eac8052010-03-22 18:14:12 +0000526static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000527_mm_store_sd(double *dp, __m128d a)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000528{
529 dp[0] = a[0];
530}
531
Chris Lattner7eac8052010-03-22 18:14:12 +0000532static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000533_mm_store1_pd(double *dp, __m128d a)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000534{
535 dp[0] = a[0];
536 dp[1] = a[0];
537}
538
Chris Lattner7eac8052010-03-22 18:14:12 +0000539static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000540_mm_store_pd(double *dp, __m128d a)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000541{
542 *(__m128d *)dp = a;
543}
544
Chris Lattner7eac8052010-03-22 18:14:12 +0000545static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000546_mm_storeu_pd(double *dp, __m128d a)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000547{
548 __builtin_ia32_storeupd(dp, a);
549}
550
Chris Lattner7eac8052010-03-22 18:14:12 +0000551static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000552_mm_storer_pd(double *dp, __m128d a)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000553{
554 dp[0] = a[1];
555 dp[1] = a[0];
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_storeh_pd(double *dp, __m128d a)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000560{
561 dp[0] = a[1];
562}
563
Chris Lattner7eac8052010-03-22 18:14:12 +0000564static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000565_mm_storel_pd(double *dp, __m128d a)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000566{
567 dp[0] = a[0];
568}
569
Chris Lattner7eac8052010-03-22 18:14:12 +0000570static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000571_mm_add_epi8(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000572{
573 return (__m128i)((__v16qi)a + (__v16qi)b);
574}
575
Chris Lattner7eac8052010-03-22 18:14:12 +0000576static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000577_mm_add_epi16(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000578{
579 return (__m128i)((__v8hi)a + (__v8hi)b);
580}
581
Chris Lattner7eac8052010-03-22 18:14:12 +0000582static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000583_mm_add_epi32(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000584{
585 return (__m128i)((__v4si)a + (__v4si)b);
586}
587
Chris Lattner7eac8052010-03-22 18:14:12 +0000588static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000589_mm_add_si64(__m64 a, __m64 b)
Anders Carlssona283f912008-12-24 02:41:00 +0000590{
591 return a + b;
592}
593
Chris Lattner7eac8052010-03-22 18:14:12 +0000594static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000595_mm_add_epi64(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000596{
597 return a + b;
598}
599
Chris Lattner7eac8052010-03-22 18:14:12 +0000600static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000601_mm_adds_epi8(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000602{
603 return (__m128i)__builtin_ia32_paddsb128((__v16qi)a, (__v16qi)b);
604}
605
Chris Lattner7eac8052010-03-22 18:14:12 +0000606static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000607_mm_adds_epi16(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000608{
609 return (__m128i)__builtin_ia32_paddsw128((__v8hi)a, (__v8hi)b);
610}
611
Chris Lattner7eac8052010-03-22 18:14:12 +0000612static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000613_mm_adds_epu8(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000614{
615 return (__m128i)__builtin_ia32_paddusb128((__v16qi)a, (__v16qi)b);
616}
617
Chris Lattner7eac8052010-03-22 18:14:12 +0000618static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000619_mm_adds_epu16(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000620{
621 return (__m128i)__builtin_ia32_paddusw128((__v8hi)a, (__v8hi)b);
622}
623
Chris Lattner7eac8052010-03-22 18:14:12 +0000624static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000625_mm_avg_epu8(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000626{
627 return (__m128i)__builtin_ia32_pavgb128((__v16qi)a, (__v16qi)b);
628}
629
Chris Lattner7eac8052010-03-22 18:14:12 +0000630static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000631_mm_avg_epu16(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000632{
633 return (__m128i)__builtin_ia32_pavgw128((__v8hi)a, (__v8hi)b);
634}
635
Chris Lattner7eac8052010-03-22 18:14:12 +0000636static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000637_mm_madd_epi16(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000638{
639 return (__m128i)__builtin_ia32_pmaddwd128((__v8hi)a, (__v8hi)b);
640}
641
Chris Lattner7eac8052010-03-22 18:14:12 +0000642static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000643_mm_max_epi16(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000644{
645 return (__m128i)__builtin_ia32_pmaxsw128((__v8hi)a, (__v8hi)b);
646}
647
Chris Lattner7eac8052010-03-22 18:14:12 +0000648static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000649_mm_max_epu8(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000650{
651 return (__m128i)__builtin_ia32_pmaxub128((__v16qi)a, (__v16qi)b);
652}
653
Chris Lattner7eac8052010-03-22 18:14:12 +0000654static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000655_mm_min_epi16(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000656{
657 return (__m128i)__builtin_ia32_pminsw128((__v8hi)a, (__v8hi)b);
658}
659
Chris Lattner7eac8052010-03-22 18:14:12 +0000660static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000661_mm_min_epu8(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000662{
663 return (__m128i)__builtin_ia32_pminub128((__v16qi)a, (__v16qi)b);
664}
665
Chris Lattner7eac8052010-03-22 18:14:12 +0000666static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000667_mm_mulhi_epi16(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000668{
669 return (__m128i)__builtin_ia32_pmulhw128((__v8hi)a, (__v8hi)b);
670}
671
Chris Lattner7eac8052010-03-22 18:14:12 +0000672static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000673_mm_mulhi_epu16(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000674{
675 return (__m128i)__builtin_ia32_pmulhuw128((__v8hi)a, (__v8hi)b);
676}
677
Chris Lattner7eac8052010-03-22 18:14:12 +0000678static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000679_mm_mullo_epi16(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000680{
Eli Friedman4d8d7d32009-06-06 08:08:06 +0000681 return (__m128i)((__v8hi)a * (__v8hi)b);
Anders Carlssona283f912008-12-24 02:41:00 +0000682}
683
Chris Lattner7eac8052010-03-22 18:14:12 +0000684static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000685_mm_mul_su32(__m64 a, __m64 b)
Anders Carlssona283f912008-12-24 02:41:00 +0000686{
687 return __builtin_ia32_pmuludq((__v2si)a, (__v2si)b);
688}
689
Chris Lattner7eac8052010-03-22 18:14:12 +0000690static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000691_mm_mul_epu32(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000692{
693 return __builtin_ia32_pmuludq128((__v4si)a, (__v4si)b);
694}
695
Chris Lattner7eac8052010-03-22 18:14:12 +0000696static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Anders Carlsson57640932009-04-06 21:55:22 +0000697_mm_sad_epu8(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000698{
699 return __builtin_ia32_psadbw128((__v16qi)a, (__v16qi)b);
700}
701
Chris Lattner7eac8052010-03-22 18:14:12 +0000702static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000703_mm_sub_epi8(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000704{
705 return (__m128i)((__v16qi)a - (__v16qi)b);
706}
707
Chris Lattner7eac8052010-03-22 18:14:12 +0000708static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000709_mm_sub_epi16(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000710{
711 return (__m128i)((__v8hi)a - (__v8hi)b);
712}
713
Chris Lattner7eac8052010-03-22 18:14:12 +0000714static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000715_mm_sub_epi32(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000716{
717 return (__m128i)((__v4si)a - (__v4si)b);
718}
719
Chris Lattner7eac8052010-03-22 18:14:12 +0000720static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000721_mm_sub_si64(__m64 a, __m64 b)
Anders Carlssona283f912008-12-24 02:41:00 +0000722{
723 return a - b;
724}
725
Chris Lattner7eac8052010-03-22 18:14:12 +0000726static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000727_mm_sub_epi64(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000728{
729 return a - b;
730}
731
Chris Lattner7eac8052010-03-22 18:14:12 +0000732static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000733_mm_subs_epi8(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000734{
735 return (__m128i)__builtin_ia32_psubsb128((__v16qi)a, (__v16qi)b);
736}
737
Chris Lattner7eac8052010-03-22 18:14:12 +0000738static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000739_mm_subs_epi16(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000740{
741 return (__m128i)__builtin_ia32_psubsw128((__v8hi)a, (__v8hi)b);
742}
743
Chris Lattner7eac8052010-03-22 18:14:12 +0000744static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000745_mm_subs_epu8(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000746{
747 return (__m128i)__builtin_ia32_psubusb128((__v16qi)a, (__v16qi)b);
748}
749
Chris Lattner7eac8052010-03-22 18:14:12 +0000750static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000751_mm_subs_epu16(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000752{
753 return (__m128i)__builtin_ia32_psubusw128((__v8hi)a, (__v8hi)b);
754}
755
Chris Lattner7eac8052010-03-22 18:14:12 +0000756static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000757_mm_and_si128(__m128i a, __m128i b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000758{
Eli Friedmanebd93142009-06-06 02:13:04 +0000759 return a & b;
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000760}
761
Chris Lattner7eac8052010-03-22 18:14:12 +0000762static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000763_mm_andnot_si128(__m128i a, __m128i b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000764{
Eli Friedmanebd93142009-06-06 02:13:04 +0000765 return ~a & b;
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000766}
767
Chris Lattner7eac8052010-03-22 18:14:12 +0000768static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000769_mm_or_si128(__m128i a, __m128i b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000770{
Eli Friedmanebd93142009-06-06 02:13:04 +0000771 return a | b;
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000772}
773
Chris Lattner7eac8052010-03-22 18:14:12 +0000774static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000775_mm_xor_si128(__m128i a, __m128i b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000776{
Eli Friedmanebd93142009-06-06 02:13:04 +0000777 return a ^ b;
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000778}
779
Chris Lattner7eac8052010-03-22 18:14:12 +0000780static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000781_mm_slli_si128(__m128i a, int imm)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000782{
783 return __builtin_ia32_pslldqi128(a, imm * 8);
784}
785
Chris Lattner7eac8052010-03-22 18:14:12 +0000786static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000787_mm_slli_epi16(__m128i a, int count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000788{
789 return (__m128i)__builtin_ia32_psllwi128((__v8hi)a, count);
790}
791
Chris Lattner7eac8052010-03-22 18:14:12 +0000792static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000793_mm_sll_epi16(__m128i a, __m128i count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000794{
795 return (__m128i)__builtin_ia32_psllw128((__v8hi)a, (__v8hi)count);
796}
797
Chris Lattner7eac8052010-03-22 18:14:12 +0000798static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000799_mm_slli_epi32(__m128i a, int count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000800{
801 return (__m128i)__builtin_ia32_pslldi128((__v4si)a, count);
802}
803
Chris Lattner7eac8052010-03-22 18:14:12 +0000804static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000805_mm_sll_epi32(__m128i a, __m128i count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000806{
807 return (__m128i)__builtin_ia32_pslld128((__v4si)a, (__v4si)count);
808}
809
Chris Lattner7eac8052010-03-22 18:14:12 +0000810static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000811_mm_slli_epi64(__m128i a, int count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000812{
813 return __builtin_ia32_psllqi128(a, count);
814}
815
Chris Lattner7eac8052010-03-22 18:14:12 +0000816static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000817_mm_sll_epi64(__m128i a, __m128i count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000818{
819 return __builtin_ia32_psllq128(a, count);
820}
821
Chris Lattner7eac8052010-03-22 18:14:12 +0000822static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000823_mm_srai_epi16(__m128i a, int count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000824{
825 return (__m128i)__builtin_ia32_psrawi128((__v8hi)a, count);
826}
827
Chris Lattner7eac8052010-03-22 18:14:12 +0000828static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000829_mm_sra_epi16(__m128i a, __m128i count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000830{
831 return (__m128i)__builtin_ia32_psraw128((__v8hi)a, (__v8hi)count);
832}
833
Chris Lattner7eac8052010-03-22 18:14:12 +0000834static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000835_mm_srai_epi32(__m128i a, int count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000836{
837 return (__m128i)__builtin_ia32_psradi128((__v4si)a, count);
838}
839
Chris Lattner7eac8052010-03-22 18:14:12 +0000840static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000841_mm_sra_epi32(__m128i a, __m128i count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000842{
843 return (__m128i)__builtin_ia32_psrad128((__v4si)a, (__v4si)count);
844}
845
Chris Lattner7eac8052010-03-22 18:14:12 +0000846static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000847_mm_srli_si128(__m128i a, int imm)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000848{
849 return __builtin_ia32_psrldqi128(a, imm * 8);
850}
851
Chris Lattner7eac8052010-03-22 18:14:12 +0000852static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000853_mm_srli_epi16(__m128i a, int count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000854{
855 return (__m128i)__builtin_ia32_psrlwi128((__v8hi)a, count);
856}
857
Chris Lattner7eac8052010-03-22 18:14:12 +0000858static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000859_mm_srl_epi16(__m128i a, __m128i count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000860{
861 return (__m128i)__builtin_ia32_psrlw128((__v8hi)a, (__v8hi)count);
862}
863
Chris Lattner7eac8052010-03-22 18:14:12 +0000864static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000865_mm_srli_epi32(__m128i a, int count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000866{
867 return (__m128i)__builtin_ia32_psrldi128((__v4si)a, count);
868}
869
Chris Lattner7eac8052010-03-22 18:14:12 +0000870static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000871_mm_srl_epi32(__m128i a, __m128i count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000872{
873 return (__m128i)__builtin_ia32_psrld128((__v4si)a, (__v4si)count);
874}
875
Chris Lattner7eac8052010-03-22 18:14:12 +0000876static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000877_mm_srli_epi64(__m128i a, int count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000878{
879 return __builtin_ia32_psrlqi128(a, count);
880}
881
Chris Lattner7eac8052010-03-22 18:14:12 +0000882static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000883_mm_srl_epi64(__m128i a, __m128i count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000884{
885 return __builtin_ia32_psrlq128(a, count);
886}
887
Chris Lattner7eac8052010-03-22 18:14:12 +0000888static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000889_mm_cmpeq_epi8(__m128i a, __m128i b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000890{
Eli Friedman51733492009-07-22 17:08:01 +0000891 return (__m128i)((__v16qi)a == (__v16qi)b);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000892}
893
Chris Lattner7eac8052010-03-22 18:14:12 +0000894static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000895_mm_cmpeq_epi16(__m128i a, __m128i b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000896{
Eli Friedman51733492009-07-22 17:08:01 +0000897 return (__m128i)((__v8hi)a == (__v8hi)b);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000898}
899
Chris Lattner7eac8052010-03-22 18:14:12 +0000900static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000901_mm_cmpeq_epi32(__m128i a, __m128i b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000902{
Eli Friedman51733492009-07-22 17:08:01 +0000903 return (__m128i)((__v4si)a == (__v4si)b);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000904}
905
Chris Lattner7eac8052010-03-22 18:14:12 +0000906static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000907_mm_cmpgt_epi8(__m128i a, __m128i b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000908{
Eli Friedman51733492009-07-22 17:08:01 +0000909 return (__m128i)((__v16qi)a > (__v16qi)b);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000910}
911
Chris Lattner7eac8052010-03-22 18:14:12 +0000912static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000913_mm_cmpgt_epi16(__m128i a, __m128i b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000914{
Eli Friedman51733492009-07-22 17:08:01 +0000915 return (__m128i)((__v8hi)a > (__v8hi)b);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000916}
917
Chris Lattner7eac8052010-03-22 18:14:12 +0000918static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000919_mm_cmpgt_epi32(__m128i a, __m128i b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000920{
Eli Friedman51733492009-07-22 17:08:01 +0000921 return (__m128i)((__v4si)a > (__v4si)b);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000922}
923
Chris Lattner7eac8052010-03-22 18:14:12 +0000924static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000925_mm_cmplt_epi8(__m128i a, __m128i b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000926{
Eli Friedman51733492009-07-22 17:08:01 +0000927 return _mm_cmpgt_epi8(b,a);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000928}
929
Chris Lattner7eac8052010-03-22 18:14:12 +0000930static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000931_mm_cmplt_epi16(__m128i a, __m128i b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000932{
Eli Friedman51733492009-07-22 17:08:01 +0000933 return _mm_cmpgt_epi16(b,a);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000934}
935
Chris Lattner7eac8052010-03-22 18:14:12 +0000936static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000937_mm_cmplt_epi32(__m128i a, __m128i b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000938{
Eli Friedman51733492009-07-22 17:08:01 +0000939 return _mm_cmpgt_epi32(b,a);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000940}
941
942#ifdef __x86_64__
Chris Lattner7eac8052010-03-22 18:14:12 +0000943static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000944_mm_cvtsi64_sd(__m128d a, long long b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000945{
Eli Friedmanebd93142009-06-06 02:13:04 +0000946 a[0] = b;
947 return a;
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000948}
949
Chris Lattner7eac8052010-03-22 18:14:12 +0000950static __inline__ long long __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000951_mm_cvtsd_si64(__m128d a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000952{
953 return __builtin_ia32_cvtsd2si64(a);
954}
955
Chris Lattner7eac8052010-03-22 18:14:12 +0000956static __inline__ long long __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000957_mm_cvttsd_si64(__m128d a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000958{
Eli Friedmanebd93142009-06-06 02:13:04 +0000959 return a[0];
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000960}
961#endif
962
Chris Lattner7eac8052010-03-22 18:14:12 +0000963static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000964_mm_cvtepi32_ps(__m128i a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000965{
966 return __builtin_ia32_cvtdq2ps((__v4si)a);
967}
968
Chris Lattner7eac8052010-03-22 18:14:12 +0000969static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000970_mm_cvtps_epi32(__m128 a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000971{
972 return (__m128i)__builtin_ia32_cvtps2dq(a);
973}
974
Chris Lattner7eac8052010-03-22 18:14:12 +0000975static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000976_mm_cvttps_epi32(__m128 a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000977{
978 return (__m128i)__builtin_ia32_cvttps2dq(a);
979}
980
Chris Lattner7eac8052010-03-22 18:14:12 +0000981static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000982_mm_cvtsi32_si128(int a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000983{
984 return (__m128i)(__v4si){ a, 0, 0, 0 };
985}
986
987#ifdef __x86_64__
Chris Lattner7eac8052010-03-22 18:14:12 +0000988static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000989_mm_cvtsi64_si128(long long a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000990{
991 return (__m128i){ a, 0 };
992}
993#endif
994
Chris Lattner7eac8052010-03-22 18:14:12 +0000995static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000996_mm_cvtsi128_si32(__m128i a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000997{
998 __v4si b = (__v4si)a;
999 return b[0];
1000}
1001
1002#ifdef __x86_64__
Chris Lattner7eac8052010-03-22 18:14:12 +00001003static __inline__ long long __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001004_mm_cvtsi128_si64(__m128i a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001005{
1006 return a[0];
1007}
1008#endif
1009
Chris Lattner7eac8052010-03-22 18:14:12 +00001010static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001011_mm_load_si128(__m128i const *p)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001012{
1013 return *p;
1014}
1015
Chris Lattner7eac8052010-03-22 18:14:12 +00001016static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001017_mm_loadu_si128(__m128i const *p)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001018{
1019 return (__m128i)__builtin_ia32_loaddqu((char const *)p);
1020}
1021
Chris Lattner7eac8052010-03-22 18:14:12 +00001022static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001023_mm_loadl_epi64(__m128i const *p)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001024{
Eli Friedmane9ff1912009-06-07 09:32:56 +00001025 return (__m128i) { *(long long*)p, 0};
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001026}
1027
Chris Lattner7eac8052010-03-22 18:14:12 +00001028static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Anders Carlssondfa31172009-09-18 17:03:55 +00001029_mm_set_epi64x(long long q1, long long q0)
1030{
1031 return (__m128i){ q0, q1 };
1032}
1033
Chris Lattner7eac8052010-03-22 18:14:12 +00001034static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001035_mm_set_epi64(__m64 q1, __m64 q0)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001036{
1037 return (__m128i){ (long long)q0, (long long)q1 };
1038}
1039
Chris Lattner7eac8052010-03-22 18:14:12 +00001040static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001041_mm_set_epi32(int i3, int i2, int i1, int i0)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001042{
1043 return (__m128i)(__v4si){ i0, i1, i2, i3};
1044}
1045
Chris Lattner7eac8052010-03-22 18:14:12 +00001046static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001047_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 +00001048{
1049 return (__m128i)(__v8hi){ w0, w1, w2, w3, w4, w5, w6, w7 };
1050}
1051
Chris Lattner7eac8052010-03-22 18:14:12 +00001052static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001053_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 +00001054{
1055 return (__m128i)(__v16qi){ b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15 };
1056}
1057
Chris Lattner7eac8052010-03-22 18:14:12 +00001058static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Anders Carlssondfa31172009-09-18 17:03:55 +00001059_mm_set1_epi64x(long long q)
1060{
1061 return (__m128i){ q, q };
1062}
1063
Chris Lattner7eac8052010-03-22 18:14:12 +00001064static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001065_mm_set1_epi64(__m64 q)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001066{
1067 return (__m128i){ (long long)q, (long long)q };
1068}
1069
Chris Lattner7eac8052010-03-22 18:14:12 +00001070static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001071_mm_set1_epi32(int i)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001072{
1073 return (__m128i)(__v4si){ i, i, i, i };
1074}
1075
Chris Lattner7eac8052010-03-22 18:14:12 +00001076static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001077_mm_set1_epi16(short w)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001078{
1079 return (__m128i)(__v8hi){ w, w, w, w, w, w, w, w };
1080}
1081
Chris Lattner7eac8052010-03-22 18:14:12 +00001082static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001083_mm_set1_epi8(char b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001084{
1085 return (__m128i)(__v16qi){ b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b };
1086}
1087
Chris Lattner7eac8052010-03-22 18:14:12 +00001088static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001089_mm_setr_epi64(__m64 q0, __m64 q1)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001090{
1091 return (__m128i){ (long long)q0, (long long)q1 };
1092}
1093
Chris Lattner7eac8052010-03-22 18:14:12 +00001094static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001095_mm_setr_epi32(int i0, int i1, int i2, int i3)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001096{
1097 return (__m128i)(__v4si){ i0, i1, i2, i3};
1098}
1099
Chris Lattner7eac8052010-03-22 18:14:12 +00001100static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001101_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 +00001102{
1103 return (__m128i)(__v8hi){ w0, w1, w2, w3, w4, w5, w6, w7 };
1104}
1105
Chris Lattner7eac8052010-03-22 18:14:12 +00001106static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001107_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 +00001108{
1109 return (__m128i)(__v16qi){ b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15 };
1110}
1111
Chris Lattner7eac8052010-03-22 18:14:12 +00001112static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001113_mm_setzero_si128(void)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001114{
1115 return (__m128i){ 0LL, 0LL };
1116}
1117
Chris Lattner7eac8052010-03-22 18:14:12 +00001118static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001119_mm_store_si128(__m128i *p, __m128i b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001120{
1121 *p = b;
1122}
1123
Chris Lattner7eac8052010-03-22 18:14:12 +00001124static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001125_mm_storeu_si128(__m128i *p, __m128i b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001126{
1127 __builtin_ia32_storedqu((char *)p, (__v16qi)b);
1128}
1129
Chris Lattner7eac8052010-03-22 18:14:12 +00001130static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001131_mm_maskmoveu_si128(__m128i d, __m128i n, char *p)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001132{
1133 __builtin_ia32_maskmovdqu((__v16qi)d, (__v16qi)n, p);
1134}
1135
Chris Lattner7eac8052010-03-22 18:14:12 +00001136static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001137_mm_storel_epi64(__m128i *p, __m128i a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001138{
1139 __builtin_ia32_storelv4si((__v2si *)p, a);
1140}
1141
Chris Lattner7eac8052010-03-22 18:14:12 +00001142static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001143_mm_stream_pd(double *p, __m128d a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001144{
1145 __builtin_ia32_movntpd(p, a);
1146}
1147
Chris Lattner7eac8052010-03-22 18:14:12 +00001148static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001149_mm_stream_si128(__m128i *p, __m128i a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001150{
1151 __builtin_ia32_movntdq(p, a);
1152}
1153
Chris Lattner7eac8052010-03-22 18:14:12 +00001154static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001155_mm_stream_si32(int *p, int a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001156{
1157 __builtin_ia32_movnti(p, a);
1158}
1159
Chris Lattner7eac8052010-03-22 18:14:12 +00001160static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001161_mm_clflush(void const *p)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001162{
1163 __builtin_ia32_clflush(p);
1164}
1165
Chris Lattner7eac8052010-03-22 18:14:12 +00001166static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001167_mm_lfence(void)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001168{
1169 __builtin_ia32_lfence();
1170}
1171
Chris Lattner7eac8052010-03-22 18:14:12 +00001172static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001173_mm_mfence(void)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001174{
1175 __builtin_ia32_mfence();
1176}
1177
Chris Lattner7eac8052010-03-22 18:14:12 +00001178static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001179_mm_packs_epi16(__m128i a, __m128i b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001180{
1181 return (__m128i)__builtin_ia32_packsswb128((__v8hi)a, (__v8hi)b);
1182}
1183
Chris Lattner7eac8052010-03-22 18:14:12 +00001184static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001185_mm_packs_epi32(__m128i a, __m128i b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001186{
1187 return (__m128i)__builtin_ia32_packssdw128((__v4si)a, (__v4si)b);
1188}
1189
Chris Lattner7eac8052010-03-22 18:14:12 +00001190static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001191_mm_packus_epi16(__m128i a, __m128i b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001192{
1193 return (__m128i)__builtin_ia32_packuswb128((__v8hi)a, (__v8hi)b);
1194}
1195
Chris Lattner7eac8052010-03-22 18:14:12 +00001196static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001197_mm_extract_epi16(__m128i a, int imm)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001198{
1199 __v8hi b = (__v8hi)a;
Chris Lattner9052c352010-08-20 16:08:33 +00001200 return (unsigned short)b[imm];
Anders Carlsson85eb1242008-12-26 00:45:50 +00001201}
1202
Chris Lattner7eac8052010-03-22 18:14:12 +00001203static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001204_mm_insert_epi16(__m128i a, int b, int imm)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001205{
Eli Friedmanebd93142009-06-06 02:13:04 +00001206 __v8hi c = (__v8hi)a;
1207 c[imm & 7] = b;
Eli Friedmand00fd282009-06-06 03:45:06 +00001208 return (__m128i)c;
Anders Carlsson85eb1242008-12-26 00:45:50 +00001209}
1210
Chris Lattner7eac8052010-03-22 18:14:12 +00001211static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001212_mm_movemask_epi8(__m128i a)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001213{
1214 return __builtin_ia32_pmovmskb128((__v16qi)a);
1215}
1216
Eli Friedman4d8d7d32009-06-06 08:08:06 +00001217#define _mm_shuffle_epi32(a, imm) \
1218 ((__m128i)__builtin_shufflevector((__v4si)(a), (__v4si) {0}, \
1219 (imm) & 0x3, ((imm) & 0xc) >> 2, \
1220 ((imm) & 0x30) >> 4, ((imm) & 0xc0) >> 6))
1221#define _mm_shufflelo_epi16(a, imm) \
1222 ((__m128i)__builtin_shufflevector((__v8hi)(a), (__v8hi) {0}, \
1223 (imm) & 0x3, ((imm) & 0xc) >> 2, \
1224 ((imm) & 0x30) >> 4, ((imm) & 0xc0) >> 6, \
1225 4, 5, 6, 7))
1226#define _mm_shufflehi_epi16(a, imm) \
1227 ((__m128i)__builtin_shufflevector((__v8hi)(a), (__v8hi) {0}, 0, 1, 2, 3, \
Eli Friedman07c89c62010-07-08 20:09:45 +00001228 4 + (((imm) & 0x03) >> 0), \
1229 4 + (((imm) & 0x0c) >> 2), \
1230 4 + (((imm) & 0x30) >> 4), \
1231 4 + (((imm) & 0xc0) >> 6)))
Anders Carlsson85eb1242008-12-26 00:45:50 +00001232
Chris Lattner7eac8052010-03-22 18:14:12 +00001233static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001234_mm_unpackhi_epi8(__m128i a, __m128i b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001235{
Anders Carlsson37ba1a52008-12-26 00:50:47 +00001236 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 +00001237}
1238
Chris Lattner7eac8052010-03-22 18:14:12 +00001239static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001240_mm_unpackhi_epi16(__m128i a, __m128i b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001241{
Anders Carlsson37ba1a52008-12-26 00:50:47 +00001242 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 +00001243}
1244
Chris Lattner7eac8052010-03-22 18:14:12 +00001245static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001246_mm_unpackhi_epi32(__m128i a, __m128i b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001247{
Anders Carlsson37ba1a52008-12-26 00:50:47 +00001248 return (__m128i)__builtin_shufflevector((__v4si)a, (__v4si)b, 2, 4+2, 3, 4+3);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001249}
1250
Chris Lattner7eac8052010-03-22 18:14:12 +00001251static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001252_mm_unpackhi_epi64(__m128i a, __m128i b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001253{
Anders Carlsson37ba1a52008-12-26 00:50:47 +00001254 return (__m128i)__builtin_shufflevector(a, b, 1, 2+1);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001255}
1256
Chris Lattner7eac8052010-03-22 18:14:12 +00001257static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001258_mm_unpacklo_epi8(__m128i a, __m128i b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001259{
Anders Carlsson37ba1a52008-12-26 00:50:47 +00001260 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 +00001261}
1262
Chris Lattner7eac8052010-03-22 18:14:12 +00001263static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001264_mm_unpacklo_epi16(__m128i a, __m128i b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001265{
Anders Carlsson37ba1a52008-12-26 00:50:47 +00001266 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 +00001267}
1268
Chris Lattner7eac8052010-03-22 18:14:12 +00001269static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001270_mm_unpacklo_epi32(__m128i a, __m128i b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001271{
Anders Carlsson37ba1a52008-12-26 00:50:47 +00001272 return (__m128i)__builtin_shufflevector((__v4si)a, (__v4si)b, 0, 4+0, 1, 4+1);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001273}
1274
Chris Lattner7eac8052010-03-22 18:14:12 +00001275static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001276_mm_unpacklo_epi64(__m128i a, __m128i b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001277{
Anders Carlsson37ba1a52008-12-26 00:50:47 +00001278 return (__m128i)__builtin_shufflevector(a, b, 0, 2+0);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001279}
1280
Chris Lattner7eac8052010-03-22 18:14:12 +00001281static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001282_mm_movepi64_pi64(__m128i a)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001283{
1284 return (__m64)a[0];
1285}
1286
Chris Lattner7eac8052010-03-22 18:14:12 +00001287static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001288_mm_movpi64_pi64(__m64 a)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001289{
1290 return (__m128i){ (long long)a, 0 };
1291}
1292
Chris Lattner7eac8052010-03-22 18:14:12 +00001293static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001294_mm_move_epi64(__m128i a)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001295{
Eli Friedmanebd93142009-06-06 02:13:04 +00001296 return __builtin_shufflevector(a, (__m128i){ 0 }, 0, 2);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001297}
1298
Chris Lattner7eac8052010-03-22 18:14:12 +00001299static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001300_mm_unpackhi_pd(__m128d a, __m128d b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001301{
Anders Carlsson37ba1a52008-12-26 00:50:47 +00001302 return __builtin_shufflevector(a, b, 1, 2+1);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001303}
1304
Chris Lattner7eac8052010-03-22 18:14:12 +00001305static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001306_mm_unpacklo_pd(__m128d a, __m128d b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001307{
Anders Carlsson37ba1a52008-12-26 00:50:47 +00001308 return __builtin_shufflevector(a, b, 0, 2+0);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001309}
1310
Chris Lattner7eac8052010-03-22 18:14:12 +00001311static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001312_mm_movemask_pd(__m128d a)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001313{
1314 return __builtin_ia32_movmskpd(a);
1315}
1316
Chris Lattner8b3b1452010-05-15 16:54:46 +00001317#define _mm_shuffle_pd(a, b, i) \
1318 (__builtin_shufflevector((__m128d)(a), (__m128d)(b), (i) & 1, \
1319 (((i) & 2) >> 1) + 2))
Anders Carlsson85eb1242008-12-26 00:45:50 +00001320
Chris Lattner7eac8052010-03-22 18:14:12 +00001321static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001322_mm_castpd_ps(__m128d in)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001323{
1324 return (__m128)in;
1325}
1326
Chris Lattner7eac8052010-03-22 18:14:12 +00001327static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001328_mm_castpd_si128(__m128d in)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001329{
1330 return (__m128i)in;
1331}
1332
Chris Lattner7eac8052010-03-22 18:14:12 +00001333static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001334_mm_castps_pd(__m128 in)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001335{
1336 return (__m128d)in;
1337}
1338
Chris Lattner7eac8052010-03-22 18:14:12 +00001339static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001340_mm_castps_si128(__m128 in)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001341{
1342 return (__m128i)in;
1343}
1344
Chris Lattner7eac8052010-03-22 18:14:12 +00001345static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001346_mm_castsi128_ps(__m128i in)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001347{
1348 return (__m128)in;
1349}
1350
Chris Lattner7eac8052010-03-22 18:14:12 +00001351static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001352_mm_castsi128_pd(__m128i in)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001353{
1354 return (__m128d)in;
1355}
1356
Chris Lattner7eac8052010-03-22 18:14:12 +00001357static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001358_mm_pause(void)
Anders Carlsson37c23712008-12-26 00:49:43 +00001359{
Anders Carlsson88b53662008-12-26 02:22:10 +00001360 __asm__ volatile ("pause");
Anders Carlsson37c23712008-12-26 00:49:43 +00001361}
1362
Anders Carlsson43c2bab2009-01-21 01:49:39 +00001363#define _MM_SHUFFLE2(x, y) (((x) << 1) | (y))
Anders Carlsson37c23712008-12-26 00:49:43 +00001364
Anders Carlssonf15e71d2008-12-24 01:45:22 +00001365#endif /* __SSE2__ */
1366
1367#endif /* __EMMINTRIN_H */