tmmintrin.h revision c3420ffb282c6ffc0192013bf8045b6c21eddece
1/*===---- 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 33static inline __m64 __attribute__((__always_inline__, __nodebug__)) 34_mm_abs_pi8(__m64 a) 35{ 36 return (__m64)__builtin_ia32_pabsb((__v8qi)a); 37} 38 39static inline __m128i __attribute__((__always_inline__, __nodebug__)) 40_mm_abs_epi8(__m128i a) 41{ 42 return (__m128i)__builtin_ia32_pabsb128((__v16qi)a); 43} 44 45static inline __m64 __attribute__((__always_inline__, __nodebug__)) 46_mm_abs_pi16(__m64 a) 47{ 48 return (__m64)__builtin_ia32_pabsw((__v4hi)a); 49} 50 51static inline __m128i __attribute__((__always_inline__, __nodebug__)) 52_mm_abs_epi16(__m128i a) 53{ 54 return (__m128i)__builtin_ia32_pabsw128((__v8hi)a); 55} 56 57static inline __m64 __attribute__((__always_inline__, __nodebug__)) 58_mm_abs_pi32(__m64 a) 59{ 60 return (__m64)__builtin_ia32_pabsd((__v2si)a); 61} 62 63static inline __m128i __attribute__((__always_inline__, __nodebug__)) 64_mm_abs_epi32(__m128i a) 65{ 66 return (__m128i)__builtin_ia32_pabsd128((__v4si)a); 67} 68 69#define _mm_alignr_epi8(a, b, n) (__builtin_ia32_palignr128((a), (b), (n))) 70#define _mm_alignr_pi8(a, b, n) (__builtin_ia32_palignr((a), (b), (n*8))) 71 72static inline __m128i __attribute__((__always_inline__, __nodebug__)) 73_mm_hadd_epi16(__m128i a, __m128i b) 74{ 75 return (__m128i)__builtin_ia32_phaddw128((__v8hi)a, (__v8hi)b); 76} 77 78static inline __m128i __attribute__((__always_inline__, __nodebug__)) 79_mm_hadd_epi32(__m128i a, __m128i b) 80{ 81 return (__m128i)__builtin_ia32_phaddd128((__v4si)a, (__v4si)b); 82} 83 84static inline __m64 __attribute__((__always_inline__, __nodebug__)) 85_mm_hadd_pi16(__m64 a, __m64 b) 86{ 87 return (__m64)__builtin_ia32_phaddw((__v4hi)a, (__v4hi)b); 88} 89 90static inline __m64 __attribute__((__always_inline__, __nodebug__)) 91_mm_hadd_pi32(__m64 a, __m64 b) 92{ 93 return (__m64)__builtin_ia32_phaddd((__v2si)a, (__v2si)b); 94} 95 96static inline __m128i __attribute__((__always_inline__, __nodebug__)) 97_mm_hadds_epi16(__m128i a, __m128i b) 98{ 99 return (__m128i)__builtin_ia32_phaddsw128((__v8hi)a, (__v8hi)b); 100} 101 102static inline __m64 __attribute__((__always_inline__, __nodebug__)) 103_mm_hadds_pi16(__m64 a, __m64 b) 104{ 105 return (__m64)__builtin_ia32_phaddsw((__v4hi)a, (__v4hi)b); 106} 107 108static inline __m128i __attribute__((__always_inline__, __nodebug__)) 109_mm_hsub_epi16(__m128i a, __m128i b) 110{ 111 return (__m128i)__builtin_ia32_phsubw128((__v8hi)a, (__v8hi)b); 112} 113 114static inline __m128i __attribute__((__always_inline__, __nodebug__)) 115_mm_hsub_epi32(__m128i a, __m128i b) 116{ 117 return (__m128i)__builtin_ia32_phsubd128((__v4si)a, (__v4si)b); 118} 119 120static inline __m64 __attribute__((__always_inline__, __nodebug__)) 121_mm_hsub_pi16(__m64 a, __m64 b) 122{ 123 return (__m64)__builtin_ia32_phsubw((__v4hi)a, (__v4hi)b); 124} 125 126static inline __m64 __attribute__((__always_inline__, __nodebug__)) 127_mm_hsub_pi32(__m64 a, __m64 b) 128{ 129 return (__m64)__builtin_ia32_phsubd((__v2si)a, (__v2si)b); 130} 131 132static inline __m128i __attribute__((__always_inline__, __nodebug__)) 133_mm_hsubs_epi16(__m128i a, __m128i b) 134{ 135 return (__m128i)__builtin_ia32_phsubsw128((__v8hi)a, (__v8hi)b); 136} 137 138static inline __m64 __attribute__((__always_inline__, __nodebug__)) 139_mm_hsubs_pi16(__m64 a, __m64 b) 140{ 141 return (__m64)__builtin_ia32_phsubsw((__v4hi)a, (__v4hi)b); 142} 143 144static inline __m128i __attribute__((__always_inline__, __nodebug__)) 145_mm_maddubs_epi16(__m128i a, __m128i b) 146{ 147 return (__m128i)__builtin_ia32_pmaddubsw128((__v16qi)a, (__v16qi)b); 148} 149 150static inline __m64 __attribute__((__always_inline__, __nodebug__)) 151_mm_maddubs_pi16(__m64 a, __m64 b) 152{ 153 return (__m64)__builtin_ia32_pmaddubsw((__v8qi)a, (__v8qi)b); 154} 155 156static inline __m128i __attribute__((__always_inline__, __nodebug__)) 157_mm_mulhrs_epi16(__m128i a, __m128i b) 158{ 159 return (__m128i)__builtin_ia32_pmulhrsw128((__v8hi)a, (__v8hi)b); 160} 161 162static inline __m64 __attribute__((__always_inline__, __nodebug__)) 163_mm_mulhrs_pi16(__m64 a, __m64 b) 164{ 165 return (__m64)__builtin_ia32_pmulhrsw((__v4hi)a, (__v4hi)b); 166} 167 168static inline __m128i __attribute__((__always_inline__, __nodebug__)) 169_mm_shuffle_epi8(__m128i a, __m128i b) 170{ 171 return (__m128i)__builtin_ia32_pshufb128((__v16qi)a, (__v16qi)b); 172} 173 174static inline __m64 __attribute__((__always_inline__, __nodebug__)) 175_mm_shuffle_pi8(__m64 a, __m64 b) 176{ 177 return (__m64)__builtin_ia32_pshufb((__v8qi)a, (__v8qi)b); 178} 179 180static inline __m128i __attribute__((__always_inline__, __nodebug__)) 181_mm_sign_epi8(__m128i a, __m128i b) 182{ 183 return (__m128i)__builtin_ia32_psignb128((__v16qi)a, (__v16qi)b); 184} 185 186static inline __m128i __attribute__((__always_inline__, __nodebug__)) 187_mm_sign_epi16(__m128i a, __m128i b) 188{ 189 return (__m128i)__builtin_ia32_psignw128((__v8hi)a, (__v8hi)b); 190} 191 192static inline __m128i __attribute__((__always_inline__, __nodebug__)) 193_mm_sign_epi32(__m128i a, __m128i b) 194{ 195 return (__m128i)__builtin_ia32_psignd128((__v4si)a, (__v4si)b); 196} 197 198static inline __m64 __attribute__((__always_inline__, __nodebug__)) 199_mm_sign_pi8(__m64 a, __m64 b) 200{ 201 return (__m64)__builtin_ia32_psignb((__v8qi)a, (__v8qi)b); 202} 203 204static inline __m64 __attribute__((__always_inline__, __nodebug__)) 205_mm_sign_pi16(__m64 a, __m64 b) 206{ 207 return (__m64)__builtin_ia32_psignw((__v4hi)a, (__v4hi)b); 208} 209 210static inline __m64 __attribute__((__always_inline__, __nodebug__)) 211_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 */ 219