blob: 11b258178103b6514f077dba837863a7b7590476 [file] [log] [blame]
Benjamin Kramer0930b6e2010-08-20 16:47:17 +00001/*===---- emmintrin.h - SSE2 intrinsics ------------------------------------===
Anders Carlsson37f2f002008-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 Kramer0930b6e2010-08-20 16:47:17 +000023
Anders Carlsson37f2f002008-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 Christopherfaf94042010-08-26 02:09:25 +000036/* Type defines. */
37typedef double __v2df __attribute__ ((__vector_size__ (16)));
38typedef long long __v2di __attribute__ ((__vector_size__ (16)));
Anders Carlsson07603aa2008-12-24 02:41:00 +000039typedef short __v8hi __attribute__((__vector_size__(16)));
Anders Carlsson4bf4e302009-09-18 19:18:19 +000040typedef char __v16qi __attribute__((__vector_size__(16)));
Anders Carlsson37f2f002008-12-24 01:45:22 +000041
Chris Lattner1bddbcb2010-03-22 18:14:12 +000042static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +000043_mm_add_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +000044{
Eli Friedman80c80042009-06-06 02:13:04 +000045 a[0] += b[0];
46 return a;
Anders Carlsson37f2f002008-12-24 01:45:22 +000047}
48
Chris Lattner1bddbcb2010-03-22 18:14:12 +000049static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +000050_mm_add_pd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +000051{
52 return a + b;
53}
54
Chris Lattner1bddbcb2010-03-22 18:14:12 +000055static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +000056_mm_sub_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +000057{
Eli Friedman80c80042009-06-06 02:13:04 +000058 a[0] -= b[0];
59 return a;
Anders Carlsson37f2f002008-12-24 01:45:22 +000060}
61
Chris Lattner1bddbcb2010-03-22 18:14:12 +000062static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +000063_mm_sub_pd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +000064{
65 return a - b;
66}
67
Chris Lattner1bddbcb2010-03-22 18:14:12 +000068static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +000069_mm_mul_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +000070{
Eli Friedman80c80042009-06-06 02:13:04 +000071 a[0] *= b[0];
72 return a;
Anders Carlsson37f2f002008-12-24 01:45:22 +000073}
74
Chris Lattner1bddbcb2010-03-22 18:14:12 +000075static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +000076_mm_mul_pd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +000077{
78 return a * b;
79}
80
Chris Lattner1bddbcb2010-03-22 18:14:12 +000081static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +000082_mm_div_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +000083{
Eli Friedman80c80042009-06-06 02:13:04 +000084 a[0] /= b[0];
85 return a;
Anders Carlsson37f2f002008-12-24 01:45:22 +000086}
87
Chris Lattner1bddbcb2010-03-22 18:14:12 +000088static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +000089_mm_div_pd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +000090{
91 return a / b;
92}
93
Chris Lattner1bddbcb2010-03-22 18:14:12 +000094static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +000095_mm_sqrt_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +000096{
97 __m128d c = __builtin_ia32_sqrtsd(b);
98 return (__m128d) { c[0], a[1] };
99}
100
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000101static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000102_mm_sqrt_pd(__m128d a)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000103{
104 return __builtin_ia32_sqrtpd(a);
105}
106
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000107static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000108_mm_min_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000109{
110 return __builtin_ia32_minsd(a, b);
111}
112
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000113static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000114_mm_min_pd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000115{
116 return __builtin_ia32_minpd(a, b);
117}
118
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000119static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000120_mm_max_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000121{
122 return __builtin_ia32_maxsd(a, b);
123}
124
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000125static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000126_mm_max_pd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000127{
128 return __builtin_ia32_maxpd(a, b);
129}
130
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000131static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000132_mm_and_pd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000133{
Eli Friedman17d2e3a2009-06-06 03:45:06 +0000134 return (__m128d)((__v4si)a & (__v4si)b);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000135}
136
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000137static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000138_mm_andnot_pd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000139{
Eli Friedman17d2e3a2009-06-06 03:45:06 +0000140 return (__m128d)(~(__v4si)a & (__v4si)b);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000141}
142
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000143static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000144_mm_or_pd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000145{
Eli Friedman17d2e3a2009-06-06 03:45:06 +0000146 return (__m128d)((__v4si)a | (__v4si)b);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000147}
148
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000149static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000150_mm_xor_pd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000151{
Eli Friedman17d2e3a2009-06-06 03:45:06 +0000152 return (__m128d)((__v4si)a ^ (__v4si)b);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000153}
154
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000155static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000156_mm_cmpeq_pd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000157{
Anders Carlsson79dcf5f2009-05-18 19:16:46 +0000158 return (__m128d)__builtin_ia32_cmppd(a, b, 0);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000159}
160
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000161static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000162_mm_cmplt_pd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000163{
Anders Carlsson79dcf5f2009-05-18 19:16:46 +0000164 return (__m128d)__builtin_ia32_cmppd(a, b, 1);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000165}
166
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000167static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000168_mm_cmple_pd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000169{
Anders Carlsson79dcf5f2009-05-18 19:16:46 +0000170 return (__m128d)__builtin_ia32_cmppd(a, b, 2);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000171}
172
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000173static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000174_mm_cmpgt_pd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000175{
Anders Carlsson79dcf5f2009-05-18 19:16:46 +0000176 return (__m128d)__builtin_ia32_cmppd(b, a, 1);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000177}
178
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000179static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000180_mm_cmpge_pd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000181{
Anders Carlsson79dcf5f2009-05-18 19:16:46 +0000182 return (__m128d)__builtin_ia32_cmppd(b, a, 2);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000183}
184
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000185static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000186_mm_cmpord_pd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000187{
Anders Carlsson79dcf5f2009-05-18 19:16:46 +0000188 return (__m128d)__builtin_ia32_cmppd(a, b, 7);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000189}
190
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000191static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000192_mm_cmpunord_pd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000193{
Anders Carlsson79dcf5f2009-05-18 19:16:46 +0000194 return (__m128d)__builtin_ia32_cmppd(a, b, 3);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000195}
196
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000197static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000198_mm_cmpneq_pd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000199{
Anders Carlsson79dcf5f2009-05-18 19:16:46 +0000200 return (__m128d)__builtin_ia32_cmppd(a, b, 4);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000201}
202
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000203static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000204_mm_cmpnlt_pd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000205{
Anders Carlsson79dcf5f2009-05-18 19:16:46 +0000206 return (__m128d)__builtin_ia32_cmppd(a, b, 5);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000207}
208
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000209static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000210_mm_cmpnle_pd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000211{
Anders Carlsson79dcf5f2009-05-18 19:16:46 +0000212 return (__m128d)__builtin_ia32_cmppd(a, b, 6);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000213}
214
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000215static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000216_mm_cmpngt_pd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000217{
Anders Carlsson79dcf5f2009-05-18 19:16:46 +0000218 return (__m128d)__builtin_ia32_cmppd(b, a, 5);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000219}
220
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000221static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000222_mm_cmpnge_pd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000223{
Anders Carlsson79dcf5f2009-05-18 19:16:46 +0000224 return (__m128d)__builtin_ia32_cmppd(b, a, 6);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000225}
226
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000227static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000228_mm_cmpeq_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000229{
Anders Carlsson79dcf5f2009-05-18 19:16:46 +0000230 return (__m128d)__builtin_ia32_cmpsd(a, b, 0);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000231}
232
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000233static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000234_mm_cmplt_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000235{
Anders Carlsson79dcf5f2009-05-18 19:16:46 +0000236 return (__m128d)__builtin_ia32_cmpsd(a, b, 1);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000237}
238
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000239static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000240_mm_cmple_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000241{
Anders Carlsson79dcf5f2009-05-18 19:16:46 +0000242 return (__m128d)__builtin_ia32_cmpsd(a, b, 2);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000243}
244
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000245static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000246_mm_cmpgt_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000247{
Anders Carlsson79dcf5f2009-05-18 19:16:46 +0000248 return (__m128d)__builtin_ia32_cmpsd(b, a, 1);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000249}
250
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000251static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000252_mm_cmpge_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000253{
Anders Carlsson79dcf5f2009-05-18 19:16:46 +0000254 return (__m128d)__builtin_ia32_cmpsd(b, a, 2);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000255}
256
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000257static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000258_mm_cmpord_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000259{
Anders Carlsson79dcf5f2009-05-18 19:16:46 +0000260 return (__m128d)__builtin_ia32_cmpsd(a, b, 7);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000261}
262
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000263static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000264_mm_cmpunord_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000265{
Anders Carlsson79dcf5f2009-05-18 19:16:46 +0000266 return (__m128d)__builtin_ia32_cmpsd(a, b, 3);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000267}
268
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000269static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000270_mm_cmpneq_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000271{
Anders Carlsson79dcf5f2009-05-18 19:16:46 +0000272 return (__m128d)__builtin_ia32_cmpsd(a, b, 4);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000273}
274
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000275static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000276_mm_cmpnlt_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000277{
Anders Carlsson79dcf5f2009-05-18 19:16:46 +0000278 return (__m128d)__builtin_ia32_cmpsd(a, b, 5);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000279}
280
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000281static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000282_mm_cmpnle_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000283{
Anders Carlsson79dcf5f2009-05-18 19:16:46 +0000284 return (__m128d)__builtin_ia32_cmpsd(a, b, 6);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000285}
286
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000287static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000288_mm_cmpngt_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000289{
Anders Carlsson79dcf5f2009-05-18 19:16:46 +0000290 return (__m128d)__builtin_ia32_cmpsd(b, a, 5);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000291}
292
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000293static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000294_mm_cmpnge_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000295{
Anders Carlsson79dcf5f2009-05-18 19:16:46 +0000296 return (__m128d)__builtin_ia32_cmpsd(b, a, 6);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000297}
298
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000299static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000300_mm_comieq_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000301{
302 return __builtin_ia32_comisdeq(a, b);
303}
304
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000305static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000306_mm_comilt_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000307{
308 return __builtin_ia32_comisdlt(a, b);
309}
310
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000311static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000312_mm_comile_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000313{
314 return __builtin_ia32_comisdle(a, b);
315}
316
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000317static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000318_mm_comigt_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000319{
320 return __builtin_ia32_comisdgt(a, b);
321}
322
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000323static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000324_mm_comineq_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000325{
326 return __builtin_ia32_comisdneq(a, b);
327}
328
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000329static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000330_mm_ucomieq_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000331{
332 return __builtin_ia32_ucomisdeq(a, b);
333}
334
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000335static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000336_mm_ucomilt_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000337{
338 return __builtin_ia32_ucomisdlt(a, b);
339}
340
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000341static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000342_mm_ucomile_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000343{
344 return __builtin_ia32_ucomisdle(a, b);
345}
346
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000347static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000348_mm_ucomigt_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000349{
350 return __builtin_ia32_ucomisdgt(a, b);
351}
352
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000353static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000354_mm_ucomineq_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000355{
356 return __builtin_ia32_ucomisdneq(a, b);
357}
358
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000359static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000360_mm_cvtpd_ps(__m128d a)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000361{
362 return __builtin_ia32_cvtpd2ps(a);
363}
364
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000365static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000366_mm_cvtps_pd(__m128 a)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000367{
368 return __builtin_ia32_cvtps2pd(a);
369}
370
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000371static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000372_mm_cvtepi32_pd(__m128i a)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000373{
374 return __builtin_ia32_cvtdq2pd((__v4si)a);
375}
376
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000377static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000378_mm_cvtpd_epi32(__m128d a)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000379{
380 return __builtin_ia32_cvtpd2dq(a);
381}
382
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000383static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000384_mm_cvtsd_si32(__m128d a)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000385{
386 return __builtin_ia32_cvtsd2si(a);
387}
388
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000389static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000390_mm_cvtsd_ss(__m128 a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000391{
Eli Friedman80c80042009-06-06 02:13:04 +0000392 a[0] = b[0];
393 return a;
Anders Carlsson37f2f002008-12-24 01:45:22 +0000394}
395
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000396static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000397_mm_cvtsi32_sd(__m128d a, int b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000398{
Eli Friedman098136a2009-06-06 08:08:06 +0000399 a[0] = b;
400 return a;
Anders Carlsson37f2f002008-12-24 01:45:22 +0000401}
402
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000403static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000404_mm_cvtss_sd(__m128d a, __m128 b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000405{
Eli Friedman80c80042009-06-06 02:13:04 +0000406 a[0] = b[0];
407 return a;
Anders Carlsson37f2f002008-12-24 01:45:22 +0000408}
409
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000410static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000411_mm_cvttpd_epi32(__m128d a)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000412{
413 return (__m128i)__builtin_ia32_cvttpd2dq(a);
414}
415
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000416static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000417_mm_cvttsd_si32(__m128d a)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000418{
Eli Friedman80c80042009-06-06 02:13:04 +0000419 return a[0];
Anders Carlsson37f2f002008-12-24 01:45:22 +0000420}
421
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000422static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000423_mm_cvtpd_pi32(__m128d a)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000424{
425 return (__m64)__builtin_ia32_cvtpd2pi(a);
426}
427
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000428static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000429_mm_cvttpd_pi32(__m128d a)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000430{
431 return (__m64)__builtin_ia32_cvttpd2pi(a);
432}
433
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000434static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000435_mm_cvtpi32_pd(__m64 a)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000436{
437 return __builtin_ia32_cvtpi2pd((__v2si)a);
438}
439
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000440static __inline__ double __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000441_mm_cvtsd_f64(__m128d a)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000442{
443 return a[0];
444}
445
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000446static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000447_mm_load_pd(double const *dp)
Anders Carlsson445afa02008-12-24 02:11:54 +0000448{
449 return *(__m128d*)dp;
450}
451
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000452static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000453_mm_load1_pd(double const *dp)
Anders Carlsson445afa02008-12-24 02:11:54 +0000454{
455 return (__m128d){ dp[0], dp[0] };
456}
457
Eli Friedmandb7351a2009-06-02 05:55:48 +0000458#define _mm_load_pd1(dp) _mm_load1_pd(dp)
459
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000460static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000461_mm_loadr_pd(double const *dp)
Anders Carlsson445afa02008-12-24 02:11:54 +0000462{
463 return (__m128d){ dp[1], dp[0] };
464}
465
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000466static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000467_mm_loadu_pd(double const *dp)
Anders Carlsson445afa02008-12-24 02:11:54 +0000468{
469 return __builtin_ia32_loadupd(dp);
470}
471
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000472static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000473_mm_load_sd(double const *dp)
Anders Carlsson445afa02008-12-24 02:11:54 +0000474{
475 return (__m128d){ *dp, 0.0 };
476}
477
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000478static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000479_mm_loadh_pd(__m128d a, double const *dp)
Anders Carlsson445afa02008-12-24 02:11:54 +0000480{
481 return __builtin_shufflevector(a, *(__m128d *)dp, 0, 2);
482}
483
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000484static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000485_mm_loadl_pd(__m128d a, double const *dp)
Anders Carlsson445afa02008-12-24 02:11:54 +0000486{
487 return __builtin_shufflevector(a, *(__m128d *)dp, 2, 1);
488}
489
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000490static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000491_mm_set_sd(double w)
Anders Carlsson445afa02008-12-24 02:11:54 +0000492{
493 return (__m128d){ w, 0 };
494}
495
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000496static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000497_mm_set1_pd(double w)
Anders Carlsson445afa02008-12-24 02:11:54 +0000498{
499 return (__m128d){ w, w };
500}
501
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000502static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000503_mm_set_pd(double w, double x)
Anders Carlsson445afa02008-12-24 02:11:54 +0000504{
Anders Carlsson9436ed52009-09-18 17:03:55 +0000505 return (__m128d){ x, w };
Anders Carlsson445afa02008-12-24 02:11:54 +0000506}
507
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000508static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000509_mm_setr_pd(double w, double x)
Anders Carlsson445afa02008-12-24 02:11:54 +0000510{
Anders Carlsson9436ed52009-09-18 17:03:55 +0000511 return (__m128d){ w, x };
Anders Carlsson445afa02008-12-24 02:11:54 +0000512}
513
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000514static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000515_mm_setzero_pd(void)
Anders Carlsson445afa02008-12-24 02:11:54 +0000516{
517 return (__m128d){ 0, 0 };
518}
519
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000520static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000521_mm_move_sd(__m128d a, __m128d b)
Anders Carlsson445afa02008-12-24 02:11:54 +0000522{
523 return (__m128d){ b[0], a[1] };
524}
525
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000526static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000527_mm_store_sd(double *dp, __m128d a)
Anders Carlsson445afa02008-12-24 02:11:54 +0000528{
529 dp[0] = a[0];
530}
531
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000532static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000533_mm_store1_pd(double *dp, __m128d a)
Anders Carlsson445afa02008-12-24 02:11:54 +0000534{
535 dp[0] = a[0];
536 dp[1] = a[0];
537}
538
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000539static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000540_mm_store_pd(double *dp, __m128d a)
Anders Carlsson445afa02008-12-24 02:11:54 +0000541{
542 *(__m128d *)dp = a;
543}
544
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000545static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000546_mm_storeu_pd(double *dp, __m128d a)
Anders Carlsson445afa02008-12-24 02:11:54 +0000547{
548 __builtin_ia32_storeupd(dp, a);
549}
550
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000551static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000552_mm_storer_pd(double *dp, __m128d a)
Anders Carlsson445afa02008-12-24 02:11:54 +0000553{
554 dp[0] = a[1];
555 dp[1] = a[0];
556}
557
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000558static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000559_mm_storeh_pd(double *dp, __m128d a)
Anders Carlsson445afa02008-12-24 02:11:54 +0000560{
561 dp[0] = a[1];
562}
563
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000564static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000565_mm_storel_pd(double *dp, __m128d a)
Anders Carlsson445afa02008-12-24 02:11:54 +0000566{
567 dp[0] = a[0];
568}
569
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000570static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000571_mm_add_epi8(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000572{
573 return (__m128i)((__v16qi)a + (__v16qi)b);
574}
575
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000576static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000577_mm_add_epi16(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000578{
579 return (__m128i)((__v8hi)a + (__v8hi)b);
580}
581
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000582static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000583_mm_add_epi32(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000584{
585 return (__m128i)((__v4si)a + (__v4si)b);
586}
587
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000588static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000589_mm_add_si64(__m64 a, __m64 b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000590{
591 return a + b;
592}
593
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000594static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000595_mm_add_epi64(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000596{
597 return a + b;
598}
599
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000600static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000601_mm_adds_epi8(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000602{
603 return (__m128i)__builtin_ia32_paddsb128((__v16qi)a, (__v16qi)b);
604}
605
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000606static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000607_mm_adds_epi16(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000608{
609 return (__m128i)__builtin_ia32_paddsw128((__v8hi)a, (__v8hi)b);
610}
611
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000612static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000613_mm_adds_epu8(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000614{
615 return (__m128i)__builtin_ia32_paddusb128((__v16qi)a, (__v16qi)b);
616}
617
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000618static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000619_mm_adds_epu16(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000620{
621 return (__m128i)__builtin_ia32_paddusw128((__v8hi)a, (__v8hi)b);
622}
623
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000624static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000625_mm_avg_epu8(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000626{
627 return (__m128i)__builtin_ia32_pavgb128((__v16qi)a, (__v16qi)b);
628}
629
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000630static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000631_mm_avg_epu16(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000632{
633 return (__m128i)__builtin_ia32_pavgw128((__v8hi)a, (__v8hi)b);
634}
635
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000636static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000637_mm_madd_epi16(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000638{
639 return (__m128i)__builtin_ia32_pmaddwd128((__v8hi)a, (__v8hi)b);
640}
641
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000642static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000643_mm_max_epi16(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000644{
645 return (__m128i)__builtin_ia32_pmaxsw128((__v8hi)a, (__v8hi)b);
646}
647
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000648static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000649_mm_max_epu8(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000650{
651 return (__m128i)__builtin_ia32_pmaxub128((__v16qi)a, (__v16qi)b);
652}
653
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000654static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000655_mm_min_epi16(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000656{
657 return (__m128i)__builtin_ia32_pminsw128((__v8hi)a, (__v8hi)b);
658}
659
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000660static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000661_mm_min_epu8(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000662{
663 return (__m128i)__builtin_ia32_pminub128((__v16qi)a, (__v16qi)b);
664}
665
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000666static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000667_mm_mulhi_epi16(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000668{
669 return (__m128i)__builtin_ia32_pmulhw128((__v8hi)a, (__v8hi)b);
670}
671
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000672static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000673_mm_mulhi_epu16(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000674{
675 return (__m128i)__builtin_ia32_pmulhuw128((__v8hi)a, (__v8hi)b);
676}
677
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000678static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000679_mm_mullo_epi16(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000680{
Eli Friedman098136a2009-06-06 08:08:06 +0000681 return (__m128i)((__v8hi)a * (__v8hi)b);
Anders Carlsson07603aa2008-12-24 02:41:00 +0000682}
683
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000684static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000685_mm_mul_su32(__m64 a, __m64 b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000686{
687 return __builtin_ia32_pmuludq((__v2si)a, (__v2si)b);
688}
689
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000690static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000691_mm_mul_epu32(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000692{
693 return __builtin_ia32_pmuludq128((__v4si)a, (__v4si)b);
694}
695
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000696static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Anders Carlssonae8ecdd2009-04-06 21:55:22 +0000697_mm_sad_epu8(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000698{
699 return __builtin_ia32_psadbw128((__v16qi)a, (__v16qi)b);
700}
701
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000702static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000703_mm_sub_epi8(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000704{
705 return (__m128i)((__v16qi)a - (__v16qi)b);
706}
707
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000708static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000709_mm_sub_epi16(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000710{
711 return (__m128i)((__v8hi)a - (__v8hi)b);
712}
713
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000714static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000715_mm_sub_epi32(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000716{
717 return (__m128i)((__v4si)a - (__v4si)b);
718}
719
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000720static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000721_mm_sub_si64(__m64 a, __m64 b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000722{
723 return a - b;
724}
725
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000726static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000727_mm_sub_epi64(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000728{
729 return a - b;
730}
731
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000732static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000733_mm_subs_epi8(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000734{
735 return (__m128i)__builtin_ia32_psubsb128((__v16qi)a, (__v16qi)b);
736}
737
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000738static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000739_mm_subs_epi16(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000740{
741 return (__m128i)__builtin_ia32_psubsw128((__v8hi)a, (__v8hi)b);
742}
743
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000744static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000745_mm_subs_epu8(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000746{
747 return (__m128i)__builtin_ia32_psubusb128((__v16qi)a, (__v16qi)b);
748}
749
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000750static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000751_mm_subs_epu16(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000752{
753 return (__m128i)__builtin_ia32_psubusw128((__v8hi)a, (__v8hi)b);
754}
755
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000756static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000757_mm_and_si128(__m128i a, __m128i b)
Anders Carlsson0727df02008-12-25 23:48:58 +0000758{
Eli Friedman80c80042009-06-06 02:13:04 +0000759 return a & b;
Anders Carlsson0727df02008-12-25 23:48:58 +0000760}
761
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000762static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000763_mm_andnot_si128(__m128i a, __m128i b)
Anders Carlsson0727df02008-12-25 23:48:58 +0000764{
Eli Friedman80c80042009-06-06 02:13:04 +0000765 return ~a & b;
Anders Carlsson0727df02008-12-25 23:48:58 +0000766}
767
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000768static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000769_mm_or_si128(__m128i a, __m128i b)
Anders Carlsson0727df02008-12-25 23:48:58 +0000770{
Eli Friedman80c80042009-06-06 02:13:04 +0000771 return a | b;
Anders Carlsson0727df02008-12-25 23:48:58 +0000772}
773
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000774static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000775_mm_xor_si128(__m128i a, __m128i b)
Anders Carlsson0727df02008-12-25 23:48:58 +0000776{
Eli Friedman80c80042009-06-06 02:13:04 +0000777 return a ^ b;
Anders Carlsson0727df02008-12-25 23:48:58 +0000778}
779
Chris Lattner8a720342010-10-01 06:52:23 +0000780#define _mm_slli_si128(VEC, IMM) \
Chris Lattnerfcb0b252010-10-01 06:58:49 +0000781 ((__m128i)__builtin_ia32_pslldqi128((__m128i)(VEC), (IMM)*8))
Anders Carlsson0727df02008-12-25 23:48:58 +0000782
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000783static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000784_mm_slli_epi16(__m128i a, int count)
Anders Carlsson0727df02008-12-25 23:48:58 +0000785{
786 return (__m128i)__builtin_ia32_psllwi128((__v8hi)a, count);
787}
788
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000789static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000790_mm_sll_epi16(__m128i a, __m128i count)
Anders Carlsson0727df02008-12-25 23:48:58 +0000791{
792 return (__m128i)__builtin_ia32_psllw128((__v8hi)a, (__v8hi)count);
793}
794
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000795static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000796_mm_slli_epi32(__m128i a, int count)
Anders Carlsson0727df02008-12-25 23:48:58 +0000797{
798 return (__m128i)__builtin_ia32_pslldi128((__v4si)a, count);
799}
800
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000801static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000802_mm_sll_epi32(__m128i a, __m128i count)
Anders Carlsson0727df02008-12-25 23:48:58 +0000803{
804 return (__m128i)__builtin_ia32_pslld128((__v4si)a, (__v4si)count);
805}
806
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000807static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000808_mm_slli_epi64(__m128i a, int count)
Anders Carlsson0727df02008-12-25 23:48:58 +0000809{
810 return __builtin_ia32_psllqi128(a, count);
811}
812
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000813static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000814_mm_sll_epi64(__m128i a, __m128i count)
Anders Carlsson0727df02008-12-25 23:48:58 +0000815{
816 return __builtin_ia32_psllq128(a, count);
817}
818
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000819static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000820_mm_srai_epi16(__m128i a, int count)
Anders Carlsson0727df02008-12-25 23:48:58 +0000821{
822 return (__m128i)__builtin_ia32_psrawi128((__v8hi)a, count);
823}
824
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000825static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000826_mm_sra_epi16(__m128i a, __m128i count)
Anders Carlsson0727df02008-12-25 23:48:58 +0000827{
828 return (__m128i)__builtin_ia32_psraw128((__v8hi)a, (__v8hi)count);
829}
830
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000831static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000832_mm_srai_epi32(__m128i a, int count)
Anders Carlsson0727df02008-12-25 23:48:58 +0000833{
834 return (__m128i)__builtin_ia32_psradi128((__v4si)a, count);
835}
836
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000837static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000838_mm_sra_epi32(__m128i a, __m128i count)
Anders Carlsson0727df02008-12-25 23:48:58 +0000839{
840 return (__m128i)__builtin_ia32_psrad128((__v4si)a, (__v4si)count);
841}
842
Chris Lattnerfcb0b252010-10-01 06:58:49 +0000843
844#define _mm_srli_si128(VEC, IMM) \
845 ((__m128i)__builtin_ia32_psrldqi128((__m128i)(VEC), (IMM)*8))
Anders Carlsson0727df02008-12-25 23:48:58 +0000846
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000847static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000848_mm_srli_epi16(__m128i a, int count)
Anders Carlsson0727df02008-12-25 23:48:58 +0000849{
850 return (__m128i)__builtin_ia32_psrlwi128((__v8hi)a, count);
851}
852
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000853static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000854_mm_srl_epi16(__m128i a, __m128i count)
Anders Carlsson0727df02008-12-25 23:48:58 +0000855{
856 return (__m128i)__builtin_ia32_psrlw128((__v8hi)a, (__v8hi)count);
857}
858
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000859static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000860_mm_srli_epi32(__m128i a, int count)
Anders Carlsson0727df02008-12-25 23:48:58 +0000861{
862 return (__m128i)__builtin_ia32_psrldi128((__v4si)a, count);
863}
864
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000865static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000866_mm_srl_epi32(__m128i a, __m128i count)
Anders Carlsson0727df02008-12-25 23:48:58 +0000867{
868 return (__m128i)__builtin_ia32_psrld128((__v4si)a, (__v4si)count);
869}
870
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000871static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000872_mm_srli_epi64(__m128i a, int count)
Anders Carlsson0727df02008-12-25 23:48:58 +0000873{
874 return __builtin_ia32_psrlqi128(a, count);
875}
876
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000877static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000878_mm_srl_epi64(__m128i a, __m128i count)
Anders Carlsson0727df02008-12-25 23:48:58 +0000879{
880 return __builtin_ia32_psrlq128(a, count);
881}
882
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000883static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000884_mm_cmpeq_epi8(__m128i a, __m128i b)
Anders Carlsson0727df02008-12-25 23:48:58 +0000885{
Eli Friedman3a266f22009-07-22 17:08:01 +0000886 return (__m128i)((__v16qi)a == (__v16qi)b);
Anders Carlsson0727df02008-12-25 23:48:58 +0000887}
888
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000889static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000890_mm_cmpeq_epi16(__m128i a, __m128i b)
Anders Carlsson0727df02008-12-25 23:48:58 +0000891{
Eli Friedman3a266f22009-07-22 17:08:01 +0000892 return (__m128i)((__v8hi)a == (__v8hi)b);
Anders Carlsson0727df02008-12-25 23:48:58 +0000893}
894
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000895static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000896_mm_cmpeq_epi32(__m128i a, __m128i b)
Anders Carlsson0727df02008-12-25 23:48:58 +0000897{
Eli Friedman3a266f22009-07-22 17:08:01 +0000898 return (__m128i)((__v4si)a == (__v4si)b);
Anders Carlsson0727df02008-12-25 23:48:58 +0000899}
900
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000901static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000902_mm_cmpgt_epi8(__m128i a, __m128i b)
Anders Carlsson0727df02008-12-25 23:48:58 +0000903{
Eli Friedman3a266f22009-07-22 17:08:01 +0000904 return (__m128i)((__v16qi)a > (__v16qi)b);
Anders Carlsson0727df02008-12-25 23:48:58 +0000905}
906
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000907static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000908_mm_cmpgt_epi16(__m128i a, __m128i b)
Anders Carlsson0727df02008-12-25 23:48:58 +0000909{
Eli Friedman3a266f22009-07-22 17:08:01 +0000910 return (__m128i)((__v8hi)a > (__v8hi)b);
Anders Carlsson0727df02008-12-25 23:48:58 +0000911}
912
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000913static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000914_mm_cmpgt_epi32(__m128i a, __m128i b)
Anders Carlsson0727df02008-12-25 23:48:58 +0000915{
Eli Friedman3a266f22009-07-22 17:08:01 +0000916 return (__m128i)((__v4si)a > (__v4si)b);
Anders Carlsson0727df02008-12-25 23:48:58 +0000917}
918
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000919static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000920_mm_cmplt_epi8(__m128i a, __m128i b)
Anders Carlsson0727df02008-12-25 23:48:58 +0000921{
Eli Friedman3a266f22009-07-22 17:08:01 +0000922 return _mm_cmpgt_epi8(b,a);
Anders Carlsson0727df02008-12-25 23:48:58 +0000923}
924
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000925static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000926_mm_cmplt_epi16(__m128i a, __m128i b)
Anders Carlsson0727df02008-12-25 23:48:58 +0000927{
Eli Friedman3a266f22009-07-22 17:08:01 +0000928 return _mm_cmpgt_epi16(b,a);
Anders Carlsson0727df02008-12-25 23:48:58 +0000929}
930
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000931static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000932_mm_cmplt_epi32(__m128i a, __m128i b)
Anders Carlsson0727df02008-12-25 23:48:58 +0000933{
Eli Friedman3a266f22009-07-22 17:08:01 +0000934 return _mm_cmpgt_epi32(b,a);
Anders Carlsson0727df02008-12-25 23:48:58 +0000935}
936
937#ifdef __x86_64__
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000938static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000939_mm_cvtsi64_sd(__m128d a, long long b)
Anders Carlsson0727df02008-12-25 23:48:58 +0000940{
Eli Friedman80c80042009-06-06 02:13:04 +0000941 a[0] = b;
942 return a;
Anders Carlsson0727df02008-12-25 23:48:58 +0000943}
944
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000945static __inline__ long long __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000946_mm_cvtsd_si64(__m128d a)
Anders Carlsson0727df02008-12-25 23:48:58 +0000947{
948 return __builtin_ia32_cvtsd2si64(a);
949}
950
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000951static __inline__ long long __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000952_mm_cvttsd_si64(__m128d a)
Anders Carlsson0727df02008-12-25 23:48:58 +0000953{
Eli Friedman80c80042009-06-06 02:13:04 +0000954 return a[0];
Anders Carlsson0727df02008-12-25 23:48:58 +0000955}
956#endif
957
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000958static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000959_mm_cvtepi32_ps(__m128i a)
Anders Carlsson0727df02008-12-25 23:48:58 +0000960{
961 return __builtin_ia32_cvtdq2ps((__v4si)a);
962}
963
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000964static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000965_mm_cvtps_epi32(__m128 a)
Anders Carlsson0727df02008-12-25 23:48:58 +0000966{
967 return (__m128i)__builtin_ia32_cvtps2dq(a);
968}
969
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000970static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000971_mm_cvttps_epi32(__m128 a)
Anders Carlsson0727df02008-12-25 23:48:58 +0000972{
973 return (__m128i)__builtin_ia32_cvttps2dq(a);
974}
975
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000976static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000977_mm_cvtsi32_si128(int a)
Anders Carlsson0727df02008-12-25 23:48:58 +0000978{
979 return (__m128i)(__v4si){ a, 0, 0, 0 };
980}
981
982#ifdef __x86_64__
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000983static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000984_mm_cvtsi64_si128(long long a)
Anders Carlsson0727df02008-12-25 23:48:58 +0000985{
986 return (__m128i){ a, 0 };
987}
988#endif
989
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000990static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000991_mm_cvtsi128_si32(__m128i a)
Anders Carlsson0727df02008-12-25 23:48:58 +0000992{
993 __v4si b = (__v4si)a;
994 return b[0];
995}
996
997#ifdef __x86_64__
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000998static __inline__ long long __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000999_mm_cvtsi128_si64(__m128i a)
Anders Carlsson0727df02008-12-25 23:48:58 +00001000{
1001 return a[0];
1002}
1003#endif
1004
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001005static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001006_mm_load_si128(__m128i const *p)
Anders Carlsson0727df02008-12-25 23:48:58 +00001007{
1008 return *p;
1009}
1010
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001011static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001012_mm_loadu_si128(__m128i const *p)
Anders Carlsson0727df02008-12-25 23:48:58 +00001013{
1014 return (__m128i)__builtin_ia32_loaddqu((char const *)p);
1015}
1016
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001017static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001018_mm_loadl_epi64(__m128i const *p)
Anders Carlsson0727df02008-12-25 23:48:58 +00001019{
Eli Friedman8fff2572009-06-07 09:32:56 +00001020 return (__m128i) { *(long long*)p, 0};
Anders Carlsson0727df02008-12-25 23:48:58 +00001021}
1022
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001023static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Anders Carlsson9436ed52009-09-18 17:03:55 +00001024_mm_set_epi64x(long long q1, long long q0)
1025{
1026 return (__m128i){ q0, q1 };
1027}
1028
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001029static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001030_mm_set_epi64(__m64 q1, __m64 q0)
Anders Carlsson0727df02008-12-25 23:48:58 +00001031{
1032 return (__m128i){ (long long)q0, (long long)q1 };
1033}
1034
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001035static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001036_mm_set_epi32(int i3, int i2, int i1, int i0)
Anders Carlsson0727df02008-12-25 23:48:58 +00001037{
1038 return (__m128i)(__v4si){ i0, i1, i2, i3};
1039}
1040
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001041static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001042_mm_set_epi16(short w7, short w6, short w5, short w4, short w3, short w2, short w1, short w0)
Anders Carlsson0727df02008-12-25 23:48:58 +00001043{
1044 return (__m128i)(__v8hi){ w0, w1, w2, w3, w4, w5, w6, w7 };
1045}
1046
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001047static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001048_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 Carlsson0727df02008-12-25 23:48:58 +00001049{
1050 return (__m128i)(__v16qi){ b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15 };
1051}
1052
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001053static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Anders Carlsson9436ed52009-09-18 17:03:55 +00001054_mm_set1_epi64x(long long q)
1055{
1056 return (__m128i){ q, q };
1057}
1058
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001059static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001060_mm_set1_epi64(__m64 q)
Anders Carlsson0727df02008-12-25 23:48:58 +00001061{
1062 return (__m128i){ (long long)q, (long long)q };
1063}
1064
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001065static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001066_mm_set1_epi32(int i)
Anders Carlsson0727df02008-12-25 23:48:58 +00001067{
1068 return (__m128i)(__v4si){ i, i, i, i };
1069}
1070
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001071static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001072_mm_set1_epi16(short w)
Anders Carlsson0727df02008-12-25 23:48:58 +00001073{
1074 return (__m128i)(__v8hi){ w, w, w, w, w, w, w, w };
1075}
1076
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001077static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001078_mm_set1_epi8(char b)
Anders Carlsson0727df02008-12-25 23:48:58 +00001079{
1080 return (__m128i)(__v16qi){ b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b };
1081}
1082
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001083static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001084_mm_setr_epi64(__m64 q0, __m64 q1)
Anders Carlsson0727df02008-12-25 23:48:58 +00001085{
1086 return (__m128i){ (long long)q0, (long long)q1 };
1087}
1088
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001089static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001090_mm_setr_epi32(int i0, int i1, int i2, int i3)
Anders Carlsson0727df02008-12-25 23:48:58 +00001091{
1092 return (__m128i)(__v4si){ i0, i1, i2, i3};
1093}
1094
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001095static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001096_mm_setr_epi16(short w0, short w1, short w2, short w3, short w4, short w5, short w6, short w7)
Anders Carlsson0727df02008-12-25 23:48:58 +00001097{
1098 return (__m128i)(__v8hi){ w0, w1, w2, w3, w4, w5, w6, w7 };
1099}
1100
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001101static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001102_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 Carlsson0727df02008-12-25 23:48:58 +00001103{
1104 return (__m128i)(__v16qi){ b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15 };
1105}
1106
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001107static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001108_mm_setzero_si128(void)
Anders Carlsson0727df02008-12-25 23:48:58 +00001109{
1110 return (__m128i){ 0LL, 0LL };
1111}
1112
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001113static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001114_mm_store_si128(__m128i *p, __m128i b)
Anders Carlsson0727df02008-12-25 23:48:58 +00001115{
1116 *p = b;
1117}
1118
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001119static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001120_mm_storeu_si128(__m128i *p, __m128i b)
Anders Carlsson0727df02008-12-25 23:48:58 +00001121{
1122 __builtin_ia32_storedqu((char *)p, (__v16qi)b);
1123}
1124
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001125static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001126_mm_maskmoveu_si128(__m128i d, __m128i n, char *p)
Anders Carlsson0727df02008-12-25 23:48:58 +00001127{
1128 __builtin_ia32_maskmovdqu((__v16qi)d, (__v16qi)n, p);
1129}
1130
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001131static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001132_mm_storel_epi64(__m128i *p, __m128i a)
Anders Carlsson0727df02008-12-25 23:48:58 +00001133{
1134 __builtin_ia32_storelv4si((__v2si *)p, a);
1135}
1136
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001137static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001138_mm_stream_pd(double *p, __m128d a)
Anders Carlsson0727df02008-12-25 23:48:58 +00001139{
1140 __builtin_ia32_movntpd(p, a);
1141}
1142
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001143static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001144_mm_stream_si128(__m128i *p, __m128i a)
Anders Carlsson0727df02008-12-25 23:48:58 +00001145{
1146 __builtin_ia32_movntdq(p, a);
1147}
1148
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001149static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001150_mm_stream_si32(int *p, int a)
Anders Carlsson0727df02008-12-25 23:48:58 +00001151{
1152 __builtin_ia32_movnti(p, a);
1153}
1154
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001155static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001156_mm_clflush(void const *p)
Anders Carlsson0727df02008-12-25 23:48:58 +00001157{
1158 __builtin_ia32_clflush(p);
1159}
1160
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001161static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001162_mm_lfence(void)
Anders Carlsson0727df02008-12-25 23:48:58 +00001163{
1164 __builtin_ia32_lfence();
1165}
1166
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001167static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001168_mm_mfence(void)
Anders Carlsson0727df02008-12-25 23:48:58 +00001169{
1170 __builtin_ia32_mfence();
1171}
1172
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001173static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001174_mm_packs_epi16(__m128i a, __m128i b)
Anders Carlsson45470752008-12-26 00:45:50 +00001175{
1176 return (__m128i)__builtin_ia32_packsswb128((__v8hi)a, (__v8hi)b);
1177}
1178
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001179static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001180_mm_packs_epi32(__m128i a, __m128i b)
Anders Carlsson45470752008-12-26 00:45:50 +00001181{
1182 return (__m128i)__builtin_ia32_packssdw128((__v4si)a, (__v4si)b);
1183}
1184
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001185static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001186_mm_packus_epi16(__m128i a, __m128i b)
Anders Carlsson45470752008-12-26 00:45:50 +00001187{
1188 return (__m128i)__builtin_ia32_packuswb128((__v8hi)a, (__v8hi)b);
1189}
1190
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001191static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001192_mm_extract_epi16(__m128i a, int imm)
Anders Carlsson45470752008-12-26 00:45:50 +00001193{
1194 __v8hi b = (__v8hi)a;
Chris Lattnerd6b84b92010-08-20 16:08:33 +00001195 return (unsigned short)b[imm];
Anders Carlsson45470752008-12-26 00:45:50 +00001196}
1197
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001198static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001199_mm_insert_epi16(__m128i a, int b, int imm)
Anders Carlsson45470752008-12-26 00:45:50 +00001200{
Eli Friedman80c80042009-06-06 02:13:04 +00001201 __v8hi c = (__v8hi)a;
1202 c[imm & 7] = b;
Eli Friedman17d2e3a2009-06-06 03:45:06 +00001203 return (__m128i)c;
Anders Carlsson45470752008-12-26 00:45:50 +00001204}
1205
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001206static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001207_mm_movemask_epi8(__m128i a)
Anders Carlsson45470752008-12-26 00:45:50 +00001208{
1209 return __builtin_ia32_pmovmskb128((__v16qi)a);
1210}
1211
Eli Friedman098136a2009-06-06 08:08:06 +00001212#define _mm_shuffle_epi32(a, imm) \
1213 ((__m128i)__builtin_shufflevector((__v4si)(a), (__v4si) {0}, \
1214 (imm) & 0x3, ((imm) & 0xc) >> 2, \
1215 ((imm) & 0x30) >> 4, ((imm) & 0xc0) >> 6))
1216#define _mm_shufflelo_epi16(a, imm) \
1217 ((__m128i)__builtin_shufflevector((__v8hi)(a), (__v8hi) {0}, \
1218 (imm) & 0x3, ((imm) & 0xc) >> 2, \
1219 ((imm) & 0x30) >> 4, ((imm) & 0xc0) >> 6, \
1220 4, 5, 6, 7))
1221#define _mm_shufflehi_epi16(a, imm) \
1222 ((__m128i)__builtin_shufflevector((__v8hi)(a), (__v8hi) {0}, 0, 1, 2, 3, \
Eli Friedmanb085f792010-07-08 20:09:45 +00001223 4 + (((imm) & 0x03) >> 0), \
1224 4 + (((imm) & 0x0c) >> 2), \
1225 4 + (((imm) & 0x30) >> 4), \
1226 4 + (((imm) & 0xc0) >> 6)))
Anders Carlsson45470752008-12-26 00:45:50 +00001227
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001228static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001229_mm_unpackhi_epi8(__m128i a, __m128i b)
Anders Carlsson45470752008-12-26 00:45:50 +00001230{
Anders Carlsson92d66862008-12-26 00:50:47 +00001231 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 Carlsson45470752008-12-26 00:45:50 +00001232}
1233
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001234static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001235_mm_unpackhi_epi16(__m128i a, __m128i b)
Anders Carlsson45470752008-12-26 00:45:50 +00001236{
Anders Carlsson92d66862008-12-26 00:50:47 +00001237 return (__m128i)__builtin_shufflevector((__v8hi)a, (__v8hi)b, 4, 8+4, 5, 8+5, 6, 8+6, 7, 8+7);
Anders Carlsson45470752008-12-26 00:45:50 +00001238}
1239
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001240static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001241_mm_unpackhi_epi32(__m128i a, __m128i b)
Anders Carlsson45470752008-12-26 00:45:50 +00001242{
Anders Carlsson92d66862008-12-26 00:50:47 +00001243 return (__m128i)__builtin_shufflevector((__v4si)a, (__v4si)b, 2, 4+2, 3, 4+3);
Anders Carlsson45470752008-12-26 00:45:50 +00001244}
1245
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001246static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001247_mm_unpackhi_epi64(__m128i a, __m128i b)
Anders Carlsson45470752008-12-26 00:45:50 +00001248{
Anders Carlsson92d66862008-12-26 00:50:47 +00001249 return (__m128i)__builtin_shufflevector(a, b, 1, 2+1);
Anders Carlsson45470752008-12-26 00:45:50 +00001250}
1251
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001252static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001253_mm_unpacklo_epi8(__m128i a, __m128i b)
Anders Carlsson45470752008-12-26 00:45:50 +00001254{
Anders Carlsson92d66862008-12-26 00:50:47 +00001255 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 Carlsson45470752008-12-26 00:45:50 +00001256}
1257
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001258static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001259_mm_unpacklo_epi16(__m128i a, __m128i b)
Anders Carlsson45470752008-12-26 00:45:50 +00001260{
Anders Carlsson92d66862008-12-26 00:50:47 +00001261 return (__m128i)__builtin_shufflevector((__v8hi)a, (__v8hi)b, 0, 8+0, 1, 8+1, 2, 8+2, 3, 8+3);
Anders Carlsson45470752008-12-26 00:45:50 +00001262}
1263
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001264static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001265_mm_unpacklo_epi32(__m128i a, __m128i b)
Anders Carlsson45470752008-12-26 00:45:50 +00001266{
Anders Carlsson92d66862008-12-26 00:50:47 +00001267 return (__m128i)__builtin_shufflevector((__v4si)a, (__v4si)b, 0, 4+0, 1, 4+1);
Anders Carlsson45470752008-12-26 00:45:50 +00001268}
1269
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001270static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001271_mm_unpacklo_epi64(__m128i a, __m128i b)
Anders Carlsson45470752008-12-26 00:45:50 +00001272{
Anders Carlsson92d66862008-12-26 00:50:47 +00001273 return (__m128i)__builtin_shufflevector(a, b, 0, 2+0);
Anders Carlsson45470752008-12-26 00:45:50 +00001274}
1275
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001276static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001277_mm_movepi64_pi64(__m128i a)
Anders Carlsson45470752008-12-26 00:45:50 +00001278{
1279 return (__m64)a[0];
1280}
1281
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001282static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001283_mm_movpi64_pi64(__m64 a)
Anders Carlsson45470752008-12-26 00:45:50 +00001284{
1285 return (__m128i){ (long long)a, 0 };
1286}
1287
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001288static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001289_mm_move_epi64(__m128i a)
Anders Carlsson45470752008-12-26 00:45:50 +00001290{
Eli Friedman80c80042009-06-06 02:13:04 +00001291 return __builtin_shufflevector(a, (__m128i){ 0 }, 0, 2);
Anders Carlsson45470752008-12-26 00:45:50 +00001292}
1293
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001294static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001295_mm_unpackhi_pd(__m128d a, __m128d b)
Anders Carlsson45470752008-12-26 00:45:50 +00001296{
Anders Carlsson92d66862008-12-26 00:50:47 +00001297 return __builtin_shufflevector(a, b, 1, 2+1);
Anders Carlsson45470752008-12-26 00:45:50 +00001298}
1299
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001300static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001301_mm_unpacklo_pd(__m128d a, __m128d b)
Anders Carlsson45470752008-12-26 00:45:50 +00001302{
Anders Carlsson92d66862008-12-26 00:50:47 +00001303 return __builtin_shufflevector(a, b, 0, 2+0);
Anders Carlsson45470752008-12-26 00:45:50 +00001304}
1305
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001306static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001307_mm_movemask_pd(__m128d a)
Anders Carlsson45470752008-12-26 00:45:50 +00001308{
1309 return __builtin_ia32_movmskpd(a);
1310}
1311
Chris Lattnereb941552010-05-15 16:54:46 +00001312#define _mm_shuffle_pd(a, b, i) \
1313 (__builtin_shufflevector((__m128d)(a), (__m128d)(b), (i) & 1, \
1314 (((i) & 2) >> 1) + 2))
Anders Carlsson45470752008-12-26 00:45:50 +00001315
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001316static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001317_mm_castpd_ps(__m128d in)
Anders Carlsson45470752008-12-26 00:45:50 +00001318{
1319 return (__m128)in;
1320}
1321
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001322static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001323_mm_castpd_si128(__m128d in)
Anders Carlsson45470752008-12-26 00:45:50 +00001324{
1325 return (__m128i)in;
1326}
1327
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001328static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001329_mm_castps_pd(__m128 in)
Anders Carlsson45470752008-12-26 00:45:50 +00001330{
1331 return (__m128d)in;
1332}
1333
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001334static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001335_mm_castps_si128(__m128 in)
Anders Carlsson45470752008-12-26 00:45:50 +00001336{
1337 return (__m128i)in;
1338}
1339
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001340static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001341_mm_castsi128_ps(__m128i in)
Anders Carlsson45470752008-12-26 00:45:50 +00001342{
1343 return (__m128)in;
1344}
1345
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001346static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001347_mm_castsi128_pd(__m128i in)
Anders Carlsson45470752008-12-26 00:45:50 +00001348{
1349 return (__m128d)in;
1350}
1351
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001352static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001353_mm_pause(void)
Anders Carlssonf1bc6602008-12-26 00:49:43 +00001354{
Anders Carlsson4bcd44d2008-12-26 02:22:10 +00001355 __asm__ volatile ("pause");
Anders Carlssonf1bc6602008-12-26 00:49:43 +00001356}
1357
Anders Carlssonbbd1fa22009-01-21 01:49:39 +00001358#define _MM_SHUFFLE2(x, y) (((x) << 1) | (y))
Anders Carlssonf1bc6602008-12-26 00:49:43 +00001359
Anders Carlsson37f2f002008-12-24 01:45:22 +00001360#endif /* __SSE2__ */
1361
1362#endif /* __EMMINTRIN_H */