blob: 87e74f19e56c33e9233ddc151de64068dc06e0e3 [file] [log] [blame]
Anders Carlssonb317efd2009-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
Eric Christopher4d1851682015-06-17 07:09:20 +000033/* Define the default attributes for the functions in this file. */
34#define DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__))
35
36static __inline__ __m64 DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +000037_mm_abs_pi8(__m64 __a)
Anders Carlssonb317efd2009-02-17 03:05:04 +000038{
David Blaikie3302f2b2013-01-16 23:08:36 +000039 return (__m64)__builtin_ia32_pabsb((__v8qi)__a);
Anders Carlssonb317efd2009-02-17 03:05:04 +000040}
41
Eric Christopher4d1851682015-06-17 07:09:20 +000042static __inline__ __m128i DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +000043_mm_abs_epi8(__m128i __a)
Anders Carlssonb317efd2009-02-17 03:05:04 +000044{
David Blaikie3302f2b2013-01-16 23:08:36 +000045 return (__m128i)__builtin_ia32_pabsb128((__v16qi)__a);
Anders Carlssonb317efd2009-02-17 03:05:04 +000046}
47
Eric Christopher4d1851682015-06-17 07:09:20 +000048static __inline__ __m64 DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +000049_mm_abs_pi16(__m64 __a)
Anders Carlssonb317efd2009-02-17 03:05:04 +000050{
David Blaikie3302f2b2013-01-16 23:08:36 +000051 return (__m64)__builtin_ia32_pabsw((__v4hi)__a);
Anders Carlssonb317efd2009-02-17 03:05:04 +000052}
53
Eric Christopher4d1851682015-06-17 07:09:20 +000054static __inline__ __m128i DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +000055_mm_abs_epi16(__m128i __a)
Anders Carlssonb317efd2009-02-17 03:05:04 +000056{
David Blaikie3302f2b2013-01-16 23:08:36 +000057 return (__m128i)__builtin_ia32_pabsw128((__v8hi)__a);
Anders Carlssonb317efd2009-02-17 03:05:04 +000058}
59
Eric Christopher4d1851682015-06-17 07:09:20 +000060static __inline__ __m64 DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +000061_mm_abs_pi32(__m64 __a)
Anders Carlssonb317efd2009-02-17 03:05:04 +000062{
David Blaikie3302f2b2013-01-16 23:08:36 +000063 return (__m64)__builtin_ia32_pabsd((__v2si)__a);
Anders Carlssonb317efd2009-02-17 03:05:04 +000064}
65
Eric Christopher4d1851682015-06-17 07:09:20 +000066static __inline__ __m128i DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +000067_mm_abs_epi32(__m128i __a)
Anders Carlssonb317efd2009-02-17 03:05:04 +000068{
David Blaikie3302f2b2013-01-16 23:08:36 +000069 return (__m128i)__builtin_ia32_pabsd128((__v4si)__a);
Anders Carlssonb317efd2009-02-17 03:05:04 +000070}
71
Bob Wilsonc9b97cc2011-11-05 06:08:06 +000072#define _mm_alignr_epi8(a, b, n) __extension__ ({ \
73 __m128i __a = (a); \
74 __m128i __b = (b); \
75 (__m128i)__builtin_ia32_palignr128((__v16qi)__a, (__v16qi)__b, (n)); })
76
77#define _mm_alignr_pi8(a, b, n) __extension__ ({ \
78 __m64 __a = (a); \
79 __m64 __b = (b); \
80 (__m64)__builtin_ia32_palignr((__v8qi)__a, (__v8qi)__b, (n)); })
Anders Carlssonb317efd2009-02-17 03:05:04 +000081
Eric Christopher4d1851682015-06-17 07:09:20 +000082static __inline__ __m128i DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +000083_mm_hadd_epi16(__m128i __a, __m128i __b)
Anders Carlssonb317efd2009-02-17 03:05:04 +000084{
David Blaikie3302f2b2013-01-16 23:08:36 +000085 return (__m128i)__builtin_ia32_phaddw128((__v8hi)__a, (__v8hi)__b);
Anders Carlssonb317efd2009-02-17 03:05:04 +000086}
87
Eric Christopher4d1851682015-06-17 07:09:20 +000088static __inline__ __m128i DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +000089_mm_hadd_epi32(__m128i __a, __m128i __b)
Anders Carlssonb317efd2009-02-17 03:05:04 +000090{
David Blaikie3302f2b2013-01-16 23:08:36 +000091 return (__m128i)__builtin_ia32_phaddd128((__v4si)__a, (__v4si)__b);
Anders Carlssonb317efd2009-02-17 03:05:04 +000092}
93
Eric Christopher4d1851682015-06-17 07:09:20 +000094static __inline__ __m64 DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +000095_mm_hadd_pi16(__m64 __a, __m64 __b)
Anders Carlssonb317efd2009-02-17 03:05:04 +000096{
David Blaikie3302f2b2013-01-16 23:08:36 +000097 return (__m64)__builtin_ia32_phaddw((__v4hi)__a, (__v4hi)__b);
Anders Carlssonb317efd2009-02-17 03:05:04 +000098}
99
Eric Christopher4d1851682015-06-17 07:09:20 +0000100static __inline__ __m64 DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000101_mm_hadd_pi32(__m64 __a, __m64 __b)
Anders Carlssonb317efd2009-02-17 03:05:04 +0000102{
David Blaikie3302f2b2013-01-16 23:08:36 +0000103 return (__m64)__builtin_ia32_phaddd((__v2si)__a, (__v2si)__b);
Anders Carlssonb317efd2009-02-17 03:05:04 +0000104}
105
Eric Christopher4d1851682015-06-17 07:09:20 +0000106static __inline__ __m128i DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000107_mm_hadds_epi16(__m128i __a, __m128i __b)
Anders Carlssonb317efd2009-02-17 03:05:04 +0000108{
David Blaikie3302f2b2013-01-16 23:08:36 +0000109 return (__m128i)__builtin_ia32_phaddsw128((__v8hi)__a, (__v8hi)__b);
Anders Carlssonb317efd2009-02-17 03:05:04 +0000110}
111
Eric Christopher4d1851682015-06-17 07:09:20 +0000112static __inline__ __m64 DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000113_mm_hadds_pi16(__m64 __a, __m64 __b)
Anders Carlssonb317efd2009-02-17 03:05:04 +0000114{
David Blaikie3302f2b2013-01-16 23:08:36 +0000115 return (__m64)__builtin_ia32_phaddsw((__v4hi)__a, (__v4hi)__b);
Anders Carlssonb317efd2009-02-17 03:05:04 +0000116}
117
Eric Christopher4d1851682015-06-17 07:09:20 +0000118static __inline__ __m128i DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000119_mm_hsub_epi16(__m128i __a, __m128i __b)
Anders Carlssonb317efd2009-02-17 03:05:04 +0000120{
David Blaikie3302f2b2013-01-16 23:08:36 +0000121 return (__m128i)__builtin_ia32_phsubw128((__v8hi)__a, (__v8hi)__b);
Anders Carlssonb317efd2009-02-17 03:05:04 +0000122}
123
Eric Christopher4d1851682015-06-17 07:09:20 +0000124static __inline__ __m128i DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000125_mm_hsub_epi32(__m128i __a, __m128i __b)
Anders Carlssonb317efd2009-02-17 03:05:04 +0000126{
David Blaikie3302f2b2013-01-16 23:08:36 +0000127 return (__m128i)__builtin_ia32_phsubd128((__v4si)__a, (__v4si)__b);
Anders Carlssonb317efd2009-02-17 03:05:04 +0000128}
129
Eric Christopher4d1851682015-06-17 07:09:20 +0000130static __inline__ __m64 DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000131_mm_hsub_pi16(__m64 __a, __m64 __b)
Anders Carlssonb317efd2009-02-17 03:05:04 +0000132{
David Blaikie3302f2b2013-01-16 23:08:36 +0000133 return (__m64)__builtin_ia32_phsubw((__v4hi)__a, (__v4hi)__b);
Anders Carlssonb317efd2009-02-17 03:05:04 +0000134}
135
Eric Christopher4d1851682015-06-17 07:09:20 +0000136static __inline__ __m64 DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000137_mm_hsub_pi32(__m64 __a, __m64 __b)
Anders Carlssonb317efd2009-02-17 03:05:04 +0000138{
David Blaikie3302f2b2013-01-16 23:08:36 +0000139 return (__m64)__builtin_ia32_phsubd((__v2si)__a, (__v2si)__b);
Anders Carlssonb317efd2009-02-17 03:05:04 +0000140}
141
Eric Christopher4d1851682015-06-17 07:09:20 +0000142static __inline__ __m128i DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000143_mm_hsubs_epi16(__m128i __a, __m128i __b)
Anders Carlssonb317efd2009-02-17 03:05:04 +0000144{
David Blaikie3302f2b2013-01-16 23:08:36 +0000145 return (__m128i)__builtin_ia32_phsubsw128((__v8hi)__a, (__v8hi)__b);
Anders Carlssonb317efd2009-02-17 03:05:04 +0000146}
147
Eric Christopher4d1851682015-06-17 07:09:20 +0000148static __inline__ __m64 DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000149_mm_hsubs_pi16(__m64 __a, __m64 __b)
Anders Carlssonb317efd2009-02-17 03:05:04 +0000150{
David Blaikie3302f2b2013-01-16 23:08:36 +0000151 return (__m64)__builtin_ia32_phsubsw((__v4hi)__a, (__v4hi)__b);
Anders Carlssonb317efd2009-02-17 03:05:04 +0000152}
153
Eric Christopher4d1851682015-06-17 07:09:20 +0000154static __inline__ __m128i DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000155_mm_maddubs_epi16(__m128i __a, __m128i __b)
Anders Carlssonb317efd2009-02-17 03:05:04 +0000156{
David Blaikie3302f2b2013-01-16 23:08:36 +0000157 return (__m128i)__builtin_ia32_pmaddubsw128((__v16qi)__a, (__v16qi)__b);
Anders Carlssonb317efd2009-02-17 03:05:04 +0000158}
159
Eric Christopher4d1851682015-06-17 07:09:20 +0000160static __inline__ __m64 DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000161_mm_maddubs_pi16(__m64 __a, __m64 __b)
Anders Carlssonb317efd2009-02-17 03:05:04 +0000162{
David Blaikie3302f2b2013-01-16 23:08:36 +0000163 return (__m64)__builtin_ia32_pmaddubsw((__v8qi)__a, (__v8qi)__b);
Anders Carlssonb317efd2009-02-17 03:05:04 +0000164}
165
Eric Christopher4d1851682015-06-17 07:09:20 +0000166static __inline__ __m128i DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000167_mm_mulhrs_epi16(__m128i __a, __m128i __b)
Anders Carlssonb317efd2009-02-17 03:05:04 +0000168{
David Blaikie3302f2b2013-01-16 23:08:36 +0000169 return (__m128i)__builtin_ia32_pmulhrsw128((__v8hi)__a, (__v8hi)__b);
Anders Carlssonb317efd2009-02-17 03:05:04 +0000170}
171
Eric Christopher4d1851682015-06-17 07:09:20 +0000172static __inline__ __m64 DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000173_mm_mulhrs_pi16(__m64 __a, __m64 __b)
Anders Carlssonb317efd2009-02-17 03:05:04 +0000174{
David Blaikie3302f2b2013-01-16 23:08:36 +0000175 return (__m64)__builtin_ia32_pmulhrsw((__v4hi)__a, (__v4hi)__b);
Anders Carlssonb317efd2009-02-17 03:05:04 +0000176}
177
Eric Christopher4d1851682015-06-17 07:09:20 +0000178static __inline__ __m128i DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000179_mm_shuffle_epi8(__m128i __a, __m128i __b)
Anders Carlssonb317efd2009-02-17 03:05:04 +0000180{
David Blaikie3302f2b2013-01-16 23:08:36 +0000181 return (__m128i)__builtin_ia32_pshufb128((__v16qi)__a, (__v16qi)__b);
Anders Carlssonb317efd2009-02-17 03:05:04 +0000182}
183
Eric Christopher4d1851682015-06-17 07:09:20 +0000184static __inline__ __m64 DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000185_mm_shuffle_pi8(__m64 __a, __m64 __b)
Anders Carlssonb317efd2009-02-17 03:05:04 +0000186{
David Blaikie3302f2b2013-01-16 23:08:36 +0000187 return (__m64)__builtin_ia32_pshufb((__v8qi)__a, (__v8qi)__b);
Anders Carlssonb317efd2009-02-17 03:05:04 +0000188}
189
Eric Christopher4d1851682015-06-17 07:09:20 +0000190static __inline__ __m128i DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000191_mm_sign_epi8(__m128i __a, __m128i __b)
Anders Carlssonb317efd2009-02-17 03:05:04 +0000192{
David Blaikie3302f2b2013-01-16 23:08:36 +0000193 return (__m128i)__builtin_ia32_psignb128((__v16qi)__a, (__v16qi)__b);
Anders Carlssonb317efd2009-02-17 03:05:04 +0000194}
195
Eric Christopher4d1851682015-06-17 07:09:20 +0000196static __inline__ __m128i DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000197_mm_sign_epi16(__m128i __a, __m128i __b)
Anders Carlssonb317efd2009-02-17 03:05:04 +0000198{
David Blaikie3302f2b2013-01-16 23:08:36 +0000199 return (__m128i)__builtin_ia32_psignw128((__v8hi)__a, (__v8hi)__b);
Anders Carlssonb317efd2009-02-17 03:05:04 +0000200}
201
Eric Christopher4d1851682015-06-17 07:09:20 +0000202static __inline__ __m128i DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000203_mm_sign_epi32(__m128i __a, __m128i __b)
Anders Carlssonb317efd2009-02-17 03:05:04 +0000204{
David Blaikie3302f2b2013-01-16 23:08:36 +0000205 return (__m128i)__builtin_ia32_psignd128((__v4si)__a, (__v4si)__b);
Anders Carlssonb317efd2009-02-17 03:05:04 +0000206}
207
Eric Christopher4d1851682015-06-17 07:09:20 +0000208static __inline__ __m64 DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000209_mm_sign_pi8(__m64 __a, __m64 __b)
Anders Carlssonb317efd2009-02-17 03:05:04 +0000210{
David Blaikie3302f2b2013-01-16 23:08:36 +0000211 return (__m64)__builtin_ia32_psignb((__v8qi)__a, (__v8qi)__b);
Anders Carlssonb317efd2009-02-17 03:05:04 +0000212}
213
Eric Christopher4d1851682015-06-17 07:09:20 +0000214static __inline__ __m64 DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000215_mm_sign_pi16(__m64 __a, __m64 __b)
Anders Carlssonb317efd2009-02-17 03:05:04 +0000216{
David Blaikie3302f2b2013-01-16 23:08:36 +0000217 return (__m64)__builtin_ia32_psignw((__v4hi)__a, (__v4hi)__b);
Anders Carlssonb317efd2009-02-17 03:05:04 +0000218}
219
Eric Christopher4d1851682015-06-17 07:09:20 +0000220static __inline__ __m64 DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000221_mm_sign_pi32(__m64 __a, __m64 __b)
Anders Carlssonb317efd2009-02-17 03:05:04 +0000222{
David Blaikie3302f2b2013-01-16 23:08:36 +0000223 return (__m64)__builtin_ia32_psignd((__v2si)__a, (__v2si)__b);
Anders Carlssonb317efd2009-02-17 03:05:04 +0000224}
225
Eric Christopher4d1851682015-06-17 07:09:20 +0000226#undef DEFAULT_FN_ATTRS
227
Anders Carlssonb317efd2009-02-17 03:05:04 +0000228#endif /* __SSSE3__ */
229
230#endif /* __TMMINTRIN_H */