blob: 09ebc23780166b0a2c1fc1756465d8084b433720 [file] [log] [blame]
Anders Carlsson85b2a472009-02-17 03:05:04 +00001/*===---- tmmintrin.h - SSSE3 intrinsics -----------------------------------===
2 *
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 */
23
24#ifndef __TMMINTRIN_H
25#define __TMMINTRIN_H
26
27#ifndef __SSSE3__
28#error "SSSE3 instruction set not enabled"
29#else
30
31#include <pmmintrin.h>
32
Chris Lattner1bddbcb2010-03-22 18:14:12 +000033static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Anders Carlsson85b2a472009-02-17 03:05:04 +000034_mm_abs_pi8(__m64 a)
35{
36 return (__m64)__builtin_ia32_pabsb((__v8qi)a);
37}
38
Chris Lattner1bddbcb2010-03-22 18:14:12 +000039static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Anders Carlsson85b2a472009-02-17 03:05:04 +000040_mm_abs_epi8(__m128i a)
41{
42 return (__m128i)__builtin_ia32_pabsb128((__v16qi)a);
43}
44
Chris Lattner1bddbcb2010-03-22 18:14:12 +000045static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Anders Carlsson85b2a472009-02-17 03:05:04 +000046_mm_abs_pi16(__m64 a)
47{
48 return (__m64)__builtin_ia32_pabsw((__v4hi)a);
49}
50
Chris Lattner1bddbcb2010-03-22 18:14:12 +000051static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Anders Carlsson85b2a472009-02-17 03:05:04 +000052_mm_abs_epi16(__m128i a)
53{
54 return (__m128i)__builtin_ia32_pabsw128((__v8hi)a);
55}
56
Chris Lattner1bddbcb2010-03-22 18:14:12 +000057static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Anders Carlsson85b2a472009-02-17 03:05:04 +000058_mm_abs_pi32(__m64 a)
59{
60 return (__m64)__builtin_ia32_pabsd((__v2si)a);
61}
62
Chris Lattner1bddbcb2010-03-22 18:14:12 +000063static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Anders Carlsson85b2a472009-02-17 03:05:04 +000064_mm_abs_epi32(__m128i a)
65{
66 return (__m128i)__builtin_ia32_pabsd128((__v4si)a);
67}
68
Nate Begemance5818a2009-12-14 04:57:03 +000069#define _mm_alignr_epi8(a, b, n) (__builtin_ia32_palignr128((a), (b), (n)))
Nate Begemanc3420ff2009-12-14 05:15:02 +000070#define _mm_alignr_pi8(a, b, n) (__builtin_ia32_palignr((a), (b), (n*8)))
Anders Carlsson85b2a472009-02-17 03:05:04 +000071
Chris Lattner1bddbcb2010-03-22 18:14:12 +000072static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Anders Carlsson85b2a472009-02-17 03:05:04 +000073_mm_hadd_epi16(__m128i a, __m128i b)
74{
75 return (__m128i)__builtin_ia32_phaddw128((__v8hi)a, (__v8hi)b);
76}
77
Chris Lattner1bddbcb2010-03-22 18:14:12 +000078static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Anders Carlsson85b2a472009-02-17 03:05:04 +000079_mm_hadd_epi32(__m128i a, __m128i b)
80{
81 return (__m128i)__builtin_ia32_phaddd128((__v4si)a, (__v4si)b);
82}
83
Chris Lattner1bddbcb2010-03-22 18:14:12 +000084static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Anders Carlsson85b2a472009-02-17 03:05:04 +000085_mm_hadd_pi16(__m64 a, __m64 b)
86{
87 return (__m64)__builtin_ia32_phaddw((__v4hi)a, (__v4hi)b);
88}
89
Chris Lattner1bddbcb2010-03-22 18:14:12 +000090static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Anders Carlsson85b2a472009-02-17 03:05:04 +000091_mm_hadd_pi32(__m64 a, __m64 b)
92{
93 return (__m64)__builtin_ia32_phaddd((__v2si)a, (__v2si)b);
94}
95
Chris Lattner1bddbcb2010-03-22 18:14:12 +000096static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Anders Carlsson85b2a472009-02-17 03:05:04 +000097_mm_hadds_epi16(__m128i a, __m128i b)
98{
99 return (__m128i)__builtin_ia32_phaddsw128((__v8hi)a, (__v8hi)b);
100}
101
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000102static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Anders Carlsson85b2a472009-02-17 03:05:04 +0000103_mm_hadds_pi16(__m64 a, __m64 b)
104{
105 return (__m64)__builtin_ia32_phaddsw((__v4hi)a, (__v4hi)b);
106}
107
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000108static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Anders Carlsson85b2a472009-02-17 03:05:04 +0000109_mm_hsub_epi16(__m128i a, __m128i b)
110{
111 return (__m128i)__builtin_ia32_phsubw128((__v8hi)a, (__v8hi)b);
112}
113
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000114static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Anders Carlsson85b2a472009-02-17 03:05:04 +0000115_mm_hsub_epi32(__m128i a, __m128i b)
116{
Eli Friedman2e8d8da2009-06-06 07:42:17 +0000117 return (__m128i)__builtin_ia32_phsubd128((__v4si)a, (__v4si)b);
Anders Carlsson85b2a472009-02-17 03:05:04 +0000118}
119
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000120static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Anders Carlsson85b2a472009-02-17 03:05:04 +0000121_mm_hsub_pi16(__m64 a, __m64 b)
122{
Eli Friedman2e8d8da2009-06-06 07:42:17 +0000123 return (__m64)__builtin_ia32_phsubw((__v4hi)a, (__v4hi)b);
Anders Carlsson85b2a472009-02-17 03:05:04 +0000124}
125
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000126static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Anders Carlsson85b2a472009-02-17 03:05:04 +0000127_mm_hsub_pi32(__m64 a, __m64 b)
128{
Eli Friedman2e8d8da2009-06-06 07:42:17 +0000129 return (__m64)__builtin_ia32_phsubd((__v2si)a, (__v2si)b);
Anders Carlsson85b2a472009-02-17 03:05:04 +0000130}
131
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000132static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Anders Carlsson85b2a472009-02-17 03:05:04 +0000133_mm_hsubs_epi16(__m128i a, __m128i b)
134{
135 return (__m128i)__builtin_ia32_phsubsw128((__v8hi)a, (__v8hi)b);
136}
137
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000138static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Anders Carlsson85b2a472009-02-17 03:05:04 +0000139_mm_hsubs_pi16(__m64 a, __m64 b)
140{
141 return (__m64)__builtin_ia32_phsubsw((__v4hi)a, (__v4hi)b);
142}
143
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000144static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Anders Carlsson85b2a472009-02-17 03:05:04 +0000145_mm_maddubs_epi16(__m128i a, __m128i b)
146{
147 return (__m128i)__builtin_ia32_pmaddubsw128((__v16qi)a, (__v16qi)b);
148}
149
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000150static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Anders Carlsson85b2a472009-02-17 03:05:04 +0000151_mm_maddubs_pi16(__m64 a, __m64 b)
152{
153 return (__m64)__builtin_ia32_pmaddubsw((__v8qi)a, (__v8qi)b);
154}
155
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000156static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Anders Carlsson2e828f02009-04-20 20:31:10 +0000157_mm_mulhrs_epi16(__m128i a, __m128i b)
Anders Carlsson85b2a472009-02-17 03:05:04 +0000158{
159 return (__m128i)__builtin_ia32_pmulhrsw128((__v8hi)a, (__v8hi)b);
160}
161
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000162static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Anders Carlsson2e828f02009-04-20 20:31:10 +0000163_mm_mulhrs_pi16(__m64 a, __m64 b)
Anders Carlsson85b2a472009-02-17 03:05:04 +0000164{
165 return (__m64)__builtin_ia32_pmulhrsw((__v4hi)a, (__v4hi)b);
166}
167
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000168static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Anders Carlsson85b2a472009-02-17 03:05:04 +0000169_mm_shuffle_epi8(__m128i a, __m128i b)
170{
171 return (__m128i)__builtin_ia32_pshufb128((__v16qi)a, (__v16qi)b);
172}
173
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000174static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Anders Carlsson85b2a472009-02-17 03:05:04 +0000175_mm_shuffle_pi8(__m64 a, __m64 b)
176{
177 return (__m64)__builtin_ia32_pshufb((__v8qi)a, (__v8qi)b);
178}
179
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000180static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Anders Carlsson85b2a472009-02-17 03:05:04 +0000181_mm_sign_epi8(__m128i a, __m128i b)
182{
183 return (__m128i)__builtin_ia32_psignb128((__v16qi)a, (__v16qi)b);
184}
185
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000186static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Anders Carlsson85b2a472009-02-17 03:05:04 +0000187_mm_sign_epi16(__m128i a, __m128i b)
188{
189 return (__m128i)__builtin_ia32_psignw128((__v8hi)a, (__v8hi)b);
190}
191
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000192static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Anders Carlsson85b2a472009-02-17 03:05:04 +0000193_mm_sign_epi32(__m128i a, __m128i b)
194{
195 return (__m128i)__builtin_ia32_psignd128((__v4si)a, (__v4si)b);
196}
197
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000198static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Anders Carlsson85b2a472009-02-17 03:05:04 +0000199_mm_sign_pi8(__m64 a, __m64 b)
200{
201 return (__m64)__builtin_ia32_psignb((__v8qi)a, (__v8qi)b);
202}
203
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000204static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Anders Carlsson85b2a472009-02-17 03:05:04 +0000205_mm_sign_pi16(__m64 a, __m64 b)
206{
207 return (__m64)__builtin_ia32_psignw((__v4hi)a, (__v4hi)b);
208}
209
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000210static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Anders Carlsson85b2a472009-02-17 03:05:04 +0000211_mm_sign_pi32(__m64 a, __m64 b)
212{
213 return (__m64)__builtin_ia32_psignd((__v2si)a, (__v2si)b);
214}
215
216#endif /* __SSSE3__ */
217
218#endif /* __TMMINTRIN_H */