clang API Documentation

avx2intrin.h
Go to the documentation of this file.
00001 /*===---- avx2intrin.h - AVX2 intrinsics -----------------------------------===
00002  *
00003  * Permission is hereby granted, free of charge, to any person obtaining a copy
00004  * of this software and associated documentation files (the "Software"), to deal
00005  * in the Software without restriction, including without limitation the rights
00006  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
00007  * copies of the Software, and to permit persons to whom the Software is
00008  * furnished to do so, subject to the following conditions:
00009  *
00010  * The above copyright notice and this permission notice shall be included in
00011  * all copies or substantial portions of the Software.
00012  *
00013  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
00014  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
00015  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
00016  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
00017  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
00018  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
00019  * THE SOFTWARE.
00020  *
00021  *===-----------------------------------------------------------------------===
00022  */
00023 
00024 #ifndef __IMMINTRIN_H
00025 #error "Never use <avx2intrin.h> directly; include <immintrin.h> instead."
00026 #endif
00027 
00028 #ifndef __AVX2INTRIN_H
00029 #define __AVX2INTRIN_H
00030 
00031 /* SSE4 Multiple Packed Sums of Absolute Difference.  */
00032 #define _mm256_mpsadbw_epu8(X, Y, M) __builtin_ia32_mpsadbw256((X), (Y), (M))
00033 
00034 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00035 _mm256_abs_epi8(__m256i __a)
00036 {
00037     return (__m256i)__builtin_ia32_pabsb256((__v32qi)__a);
00038 }
00039 
00040 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00041 _mm256_abs_epi16(__m256i __a)
00042 {
00043     return (__m256i)__builtin_ia32_pabsw256((__v16hi)__a);
00044 }
00045 
00046 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00047 _mm256_abs_epi32(__m256i __a)
00048 {
00049     return (__m256i)__builtin_ia32_pabsd256((__v8si)__a);
00050 }
00051 
00052 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00053 _mm256_packs_epi16(__m256i __a, __m256i __b)
00054 {
00055   return (__m256i)__builtin_ia32_packsswb256((__v16hi)__a, (__v16hi)__b);
00056 }
00057 
00058 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00059 _mm256_packs_epi32(__m256i __a, __m256i __b)
00060 {
00061   return (__m256i)__builtin_ia32_packssdw256((__v8si)__a, (__v8si)__b);
00062 }
00063 
00064 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00065 _mm256_packus_epi16(__m256i __a, __m256i __b)
00066 {
00067   return (__m256i)__builtin_ia32_packuswb256((__v16hi)__a, (__v16hi)__b);
00068 }
00069 
00070 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00071 _mm256_packus_epi32(__m256i __V1, __m256i __V2)
00072 {
00073   return (__m256i) __builtin_ia32_packusdw256((__v8si)__V1, (__v8si)__V2);
00074 }
00075 
00076 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00077 _mm256_add_epi8(__m256i __a, __m256i __b)
00078 {
00079   return (__m256i)((__v32qi)__a + (__v32qi)__b);
00080 }
00081 
00082 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00083 _mm256_add_epi16(__m256i __a, __m256i __b)
00084 {
00085   return (__m256i)((__v16hi)__a + (__v16hi)__b);
00086 }
00087 
00088 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00089 _mm256_add_epi32(__m256i __a, __m256i __b)
00090 {
00091   return (__m256i)((__v8si)__a + (__v8si)__b);
00092 }
00093 
00094 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00095 _mm256_add_epi64(__m256i __a, __m256i __b)
00096 {
00097   return __a + __b;
00098 }
00099 
00100 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00101 _mm256_adds_epi8(__m256i __a, __m256i __b)
00102 {
00103   return (__m256i)__builtin_ia32_paddsb256((__v32qi)__a, (__v32qi)__b);
00104 }
00105 
00106 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00107 _mm256_adds_epi16(__m256i __a, __m256i __b)
00108 {
00109   return (__m256i)__builtin_ia32_paddsw256((__v16hi)__a, (__v16hi)__b);
00110 }
00111 
00112 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00113 _mm256_adds_epu8(__m256i __a, __m256i __b)
00114 {
00115   return (__m256i)__builtin_ia32_paddusb256((__v32qi)__a, (__v32qi)__b);
00116 }
00117 
00118 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00119 _mm256_adds_epu16(__m256i __a, __m256i __b)
00120 {
00121   return (__m256i)__builtin_ia32_paddusw256((__v16hi)__a, (__v16hi)__b);
00122 }
00123 
00124 #define _mm256_alignr_epi8(a, b, n) __extension__ ({ \
00125   __m256i __a = (a); \
00126   __m256i __b = (b); \
00127   (__m256i)__builtin_ia32_palignr256((__v32qi)__a, (__v32qi)__b, (n)); })
00128 
00129 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00130 _mm256_and_si256(__m256i __a, __m256i __b)
00131 {
00132   return __a & __b;
00133 }
00134 
00135 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00136 _mm256_andnot_si256(__m256i __a, __m256i __b)
00137 {
00138   return ~__a & __b;
00139 }
00140 
00141 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00142 _mm256_avg_epu8(__m256i __a, __m256i __b)
00143 {
00144   return (__m256i)__builtin_ia32_pavgb256((__v32qi)__a, (__v32qi)__b);
00145 }
00146 
00147 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00148 _mm256_avg_epu16(__m256i __a, __m256i __b)
00149 {
00150   return (__m256i)__builtin_ia32_pavgw256((__v16hi)__a, (__v16hi)__b);
00151 }
00152 
00153 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00154 _mm256_blendv_epi8(__m256i __V1, __m256i __V2, __m256i __M)
00155 {
00156   return (__m256i)__builtin_ia32_pblendvb256((__v32qi)__V1, (__v32qi)__V2,
00157                                               (__v32qi)__M);
00158 }
00159 
00160 #define _mm256_blend_epi16(V1, V2, M) __extension__ ({ \
00161   __m256i __V1 = (V1); \
00162   __m256i __V2 = (V2); \
00163   (__m256d)__builtin_shufflevector((__v16hi)__V1, (__v16hi)__V2, \
00164                                    (((M) & 0x01) ? 16 : 0), \
00165                                    (((M) & 0x02) ? 17 : 1), \
00166                                    (((M) & 0x04) ? 18 : 2), \
00167                                    (((M) & 0x08) ? 19 : 3), \
00168                                    (((M) & 0x10) ? 20 : 4), \
00169                                    (((M) & 0x20) ? 21 : 5), \
00170                                    (((M) & 0x40) ? 22 : 6), \
00171                                    (((M) & 0x80) ? 23 : 7), \
00172                                    (((M) & 0x01) ? 24 : 8), \
00173                                    (((M) & 0x02) ? 25 : 9), \
00174                                    (((M) & 0x04) ? 26 : 10), \
00175                                    (((M) & 0x08) ? 27 : 11), \
00176                                    (((M) & 0x10) ? 28 : 12), \
00177                                    (((M) & 0x20) ? 29 : 13), \
00178                                    (((M) & 0x40) ? 30 : 14), \
00179                                    (((M) & 0x80) ? 31 : 15)); })
00180 
00181 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00182 _mm256_cmpeq_epi8(__m256i __a, __m256i __b)
00183 {
00184   return (__m256i)((__v32qi)__a == (__v32qi)__b);
00185 }
00186 
00187 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00188 _mm256_cmpeq_epi16(__m256i __a, __m256i __b)
00189 {
00190   return (__m256i)((__v16hi)__a == (__v16hi)__b);
00191 }
00192 
00193 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00194 _mm256_cmpeq_epi32(__m256i __a, __m256i __b)
00195 {
00196   return (__m256i)((__v8si)__a == (__v8si)__b);
00197 }
00198 
00199 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00200 _mm256_cmpeq_epi64(__m256i __a, __m256i __b)
00201 {
00202   return (__m256i)(__a == __b);
00203 }
00204 
00205 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00206 _mm256_cmpgt_epi8(__m256i __a, __m256i __b)
00207 {
00208   return (__m256i)((__v32qi)__a > (__v32qi)__b);
00209 }
00210 
00211 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00212 _mm256_cmpgt_epi16(__m256i __a, __m256i __b)
00213 {
00214   return (__m256i)((__v16hi)__a > (__v16hi)__b);
00215 }
00216 
00217 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00218 _mm256_cmpgt_epi32(__m256i __a, __m256i __b)
00219 {
00220   return (__m256i)((__v8si)__a > (__v8si)__b);
00221 }
00222 
00223 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00224 _mm256_cmpgt_epi64(__m256i __a, __m256i __b)
00225 {
00226   return (__m256i)(__a > __b);
00227 }
00228 
00229 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00230 _mm256_hadd_epi16(__m256i __a, __m256i __b)
00231 {
00232     return (__m256i)__builtin_ia32_phaddw256((__v16hi)__a, (__v16hi)__b);
00233 }
00234 
00235 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00236 _mm256_hadd_epi32(__m256i __a, __m256i __b)
00237 {
00238     return (__m256i)__builtin_ia32_phaddd256((__v8si)__a, (__v8si)__b);
00239 }
00240 
00241 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00242 _mm256_hadds_epi16(__m256i __a, __m256i __b)
00243 {
00244     return (__m256i)__builtin_ia32_phaddsw256((__v16hi)__a, (__v16hi)__b);
00245 }
00246 
00247 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00248 _mm256_hsub_epi16(__m256i __a, __m256i __b)
00249 {
00250     return (__m256i)__builtin_ia32_phsubw256((__v16hi)__a, (__v16hi)__b);
00251 }
00252 
00253 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00254 _mm256_hsub_epi32(__m256i __a, __m256i __b)
00255 {
00256     return (__m256i)__builtin_ia32_phsubd256((__v8si)__a, (__v8si)__b);
00257 }
00258 
00259 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00260 _mm256_hsubs_epi16(__m256i __a, __m256i __b)
00261 {
00262     return (__m256i)__builtin_ia32_phsubsw256((__v16hi)__a, (__v16hi)__b);
00263 }
00264 
00265 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00266 _mm256_maddubs_epi16(__m256i __a, __m256i __b)
00267 {
00268     return (__m256i)__builtin_ia32_pmaddubsw256((__v32qi)__a, (__v32qi)__b);
00269 }
00270 
00271 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00272 _mm256_madd_epi16(__m256i __a, __m256i __b)
00273 {
00274   return (__m256i)__builtin_ia32_pmaddwd256((__v16hi)__a, (__v16hi)__b);
00275 }
00276 
00277 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00278 _mm256_max_epi8(__m256i __a, __m256i __b)
00279 {
00280   return (__m256i)__builtin_ia32_pmaxsb256((__v32qi)__a, (__v32qi)__b);
00281 }
00282 
00283 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00284 _mm256_max_epi16(__m256i __a, __m256i __b)
00285 {
00286   return (__m256i)__builtin_ia32_pmaxsw256((__v16hi)__a, (__v16hi)__b);
00287 }
00288 
00289 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00290 _mm256_max_epi32(__m256i __a, __m256i __b)
00291 {
00292   return (__m256i)__builtin_ia32_pmaxsd256((__v8si)__a, (__v8si)__b);
00293 }
00294 
00295 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00296 _mm256_max_epu8(__m256i __a, __m256i __b)
00297 {
00298   return (__m256i)__builtin_ia32_pmaxub256((__v32qi)__a, (__v32qi)__b);
00299 }
00300 
00301 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00302 _mm256_max_epu16(__m256i __a, __m256i __b)
00303 {
00304   return (__m256i)__builtin_ia32_pmaxuw256((__v16hi)__a, (__v16hi)__b);
00305 }
00306 
00307 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00308 _mm256_max_epu32(__m256i __a, __m256i __b)
00309 {
00310   return (__m256i)__builtin_ia32_pmaxud256((__v8si)__a, (__v8si)__b);
00311 }
00312 
00313 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00314 _mm256_min_epi8(__m256i __a, __m256i __b)
00315 {
00316   return (__m256i)__builtin_ia32_pminsb256((__v32qi)__a, (__v32qi)__b);
00317 }
00318 
00319 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00320 _mm256_min_epi16(__m256i __a, __m256i __b)
00321 {
00322   return (__m256i)__builtin_ia32_pminsw256((__v16hi)__a, (__v16hi)__b);
00323 }
00324 
00325 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00326 _mm256_min_epi32(__m256i __a, __m256i __b)
00327 {
00328   return (__m256i)__builtin_ia32_pminsd256((__v8si)__a, (__v8si)__b);
00329 }
00330 
00331 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00332 _mm256_min_epu8(__m256i __a, __m256i __b)
00333 {
00334   return (__m256i)__builtin_ia32_pminub256((__v32qi)__a, (__v32qi)__b);
00335 }
00336 
00337 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00338 _mm256_min_epu16(__m256i __a, __m256i __b)
00339 {
00340   return (__m256i)__builtin_ia32_pminuw256 ((__v16hi)__a, (__v16hi)__b);
00341 }
00342 
00343 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00344 _mm256_min_epu32(__m256i __a, __m256i __b)
00345 {
00346   return (__m256i)__builtin_ia32_pminud256((__v8si)__a, (__v8si)__b);
00347 }
00348 
00349 static __inline__ int __attribute__((__always_inline__, __nodebug__))
00350 _mm256_movemask_epi8(__m256i __a)
00351 {
00352   return __builtin_ia32_pmovmskb256((__v32qi)__a);
00353 }
00354 
00355 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00356 _mm256_cvtepi8_epi16(__m128i __V)
00357 {
00358   return (__m256i)__builtin_ia32_pmovsxbw256((__v16qi)__V);
00359 }
00360 
00361 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00362 _mm256_cvtepi8_epi32(__m128i __V)
00363 {
00364   return (__m256i)__builtin_ia32_pmovsxbd256((__v16qi)__V);
00365 }
00366 
00367 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00368 _mm256_cvtepi8_epi64(__m128i __V)
00369 {
00370   return (__m256i)__builtin_ia32_pmovsxbq256((__v16qi)__V);
00371 }
00372 
00373 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00374 _mm256_cvtepi16_epi32(__m128i __V)
00375 {
00376   return (__m256i)__builtin_ia32_pmovsxwd256((__v8hi)__V);
00377 }
00378 
00379 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00380 _mm256_cvtepi16_epi64(__m128i __V)
00381 {
00382   return (__m256i)__builtin_ia32_pmovsxwq256((__v8hi)__V);
00383 }
00384 
00385 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00386 _mm256_cvtepi32_epi64(__m128i __V)
00387 {
00388   return (__m256i)__builtin_ia32_pmovsxdq256((__v4si)__V);
00389 }
00390 
00391 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00392 _mm256_cvtepu8_epi16(__m128i __V)
00393 {
00394   return (__m256i)__builtin_ia32_pmovzxbw256((__v16qi)__V);
00395 }
00396 
00397 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00398 _mm256_cvtepu8_epi32(__m128i __V)
00399 {
00400   return (__m256i)__builtin_ia32_pmovzxbd256((__v16qi)__V);
00401 }
00402 
00403 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00404 _mm256_cvtepu8_epi64(__m128i __V)
00405 {
00406   return (__m256i)__builtin_ia32_pmovzxbq256((__v16qi)__V);
00407 }
00408 
00409 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00410 _mm256_cvtepu16_epi32(__m128i __V)
00411 {
00412   return (__m256i)__builtin_ia32_pmovzxwd256((__v8hi)__V);
00413 }
00414 
00415 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00416 _mm256_cvtepu16_epi64(__m128i __V)
00417 {
00418   return (__m256i)__builtin_ia32_pmovzxwq256((__v8hi)__V);
00419 }
00420 
00421 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00422 _mm256_cvtepu32_epi64(__m128i __V)
00423 {
00424   return (__m256i)__builtin_ia32_pmovzxdq256((__v4si)__V);
00425 }
00426 
00427 static __inline__  __m256i __attribute__((__always_inline__, __nodebug__))
00428 _mm256_mul_epi32(__m256i __a, __m256i __b)
00429 {
00430   return (__m256i)__builtin_ia32_pmuldq256((__v8si)__a, (__v8si)__b);
00431 }
00432 
00433 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00434 _mm256_mulhrs_epi16(__m256i __a, __m256i __b)
00435 {
00436   return (__m256i)__builtin_ia32_pmulhrsw256((__v16hi)__a, (__v16hi)__b);
00437 }
00438 
00439 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00440 _mm256_mulhi_epu16(__m256i __a, __m256i __b)
00441 {
00442   return (__m256i)__builtin_ia32_pmulhuw256((__v16hi)__a, (__v16hi)__b);
00443 }
00444 
00445 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00446 _mm256_mulhi_epi16(__m256i __a, __m256i __b)
00447 {
00448   return (__m256i)__builtin_ia32_pmulhw256((__v16hi)__a, (__v16hi)__b);
00449 }
00450 
00451 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00452 _mm256_mullo_epi16(__m256i __a, __m256i __b)
00453 {
00454   return (__m256i)((__v16hi)__a * (__v16hi)__b);
00455 }
00456 
00457 static __inline__  __m256i __attribute__((__always_inline__, __nodebug__))
00458 _mm256_mullo_epi32 (__m256i __a, __m256i __b)
00459 {
00460   return (__m256i)((__v8si)__a * (__v8si)__b);
00461 }
00462 
00463 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00464 _mm256_mul_epu32(__m256i __a, __m256i __b)
00465 {
00466   return __builtin_ia32_pmuludq256((__v8si)__a, (__v8si)__b);
00467 }
00468 
00469 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00470 _mm256_or_si256(__m256i __a, __m256i __b)
00471 {
00472   return __a | __b;
00473 }
00474 
00475 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00476 _mm256_sad_epu8(__m256i __a, __m256i __b)
00477 {
00478   return __builtin_ia32_psadbw256((__v32qi)__a, (__v32qi)__b);
00479 }
00480 
00481 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00482 _mm256_shuffle_epi8(__m256i __a, __m256i __b)
00483 {
00484   return (__m256i)__builtin_ia32_pshufb256((__v32qi)__a, (__v32qi)__b);
00485 }
00486 
00487 #define _mm256_shuffle_epi32(a, imm) __extension__ ({ \
00488   __m256i __a = (a); \
00489   (__m256i)__builtin_shufflevector((__v8si)__a, (__v8si)_mm256_set1_epi32(0), \
00490                                    (imm) & 0x3, ((imm) & 0xc) >> 2, \
00491                                    ((imm) & 0x30) >> 4, ((imm) & 0xc0) >> 6, \
00492                                    4 + (((imm) & 0x03) >> 0), \
00493                                    4 + (((imm) & 0x0c) >> 2), \
00494                                    4 + (((imm) & 0x30) >> 4), \
00495                                    4 + (((imm) & 0xc0) >> 6)); })
00496 
00497 #define _mm256_shufflehi_epi16(a, imm) __extension__ ({ \
00498   __m256i __a = (a); \
00499   (__m256i)__builtin_shufflevector((__v16hi)__a, (__v16hi)_mm256_set1_epi16(0), \
00500                                    0, 1, 2, 3, \
00501                                    4 + (((imm) & 0x03) >> 0), \
00502                                    4 + (((imm) & 0x0c) >> 2), \
00503                                    4 + (((imm) & 0x30) >> 4), \
00504                                    4 + (((imm) & 0xc0) >> 6), \
00505                                    8, 9, 10, 11, \
00506                                    12 + (((imm) & 0x03) >> 0), \
00507                                    12 + (((imm) & 0x0c) >> 2), \
00508                                    12 + (((imm) & 0x30) >> 4), \
00509                                    12 + (((imm) & 0xc0) >> 6)); })
00510 
00511 #define _mm256_shufflelo_epi16(a, imm) __extension__ ({ \
00512   __m256i __a = (a); \
00513   (__m256i)__builtin_shufflevector((__v16hi)__a, (__v16hi)_mm256_set1_epi16(0), \
00514                                    (imm) & 0x3,((imm) & 0xc) >> 2, \
00515                                    ((imm) & 0x30) >> 4, ((imm) & 0xc0) >> 6, \
00516                                    4, 5, 6, 7, \
00517                                    8 + (((imm) & 0x03) >> 0), \
00518                                    8 + (((imm) & 0x0c) >> 2), \
00519                                    8 + (((imm) & 0x30) >> 4), \
00520                                    8 + (((imm) & 0xc0) >> 6), \
00521                                    12, 13, 14, 15); })
00522 
00523 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00524 _mm256_sign_epi8(__m256i __a, __m256i __b)
00525 {
00526     return (__m256i)__builtin_ia32_psignb256((__v32qi)__a, (__v32qi)__b);
00527 }
00528 
00529 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00530 _mm256_sign_epi16(__m256i __a, __m256i __b)
00531 {
00532     return (__m256i)__builtin_ia32_psignw256((__v16hi)__a, (__v16hi)__b);
00533 }
00534 
00535 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00536 _mm256_sign_epi32(__m256i __a, __m256i __b)
00537 {
00538     return (__m256i)__builtin_ia32_psignd256((__v8si)__a, (__v8si)__b);
00539 }
00540 
00541 #define _mm256_slli_si256(a, count) __extension__ ({ \
00542   __m256i __a = (a); \
00543   (__m256i)__builtin_ia32_pslldqi256(__a, (count)*8); })
00544 
00545 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00546 _mm256_slli_epi16(__m256i __a, int __count)
00547 {
00548   return (__m256i)__builtin_ia32_psllwi256((__v16hi)__a, __count);
00549 }
00550 
00551 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00552 _mm256_sll_epi16(__m256i __a, __m128i __count)
00553 {
00554   return (__m256i)__builtin_ia32_psllw256((__v16hi)__a, (__v8hi)__count);
00555 }
00556 
00557 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00558 _mm256_slli_epi32(__m256i __a, int __count)
00559 {
00560   return (__m256i)__builtin_ia32_pslldi256((__v8si)__a, __count);
00561 }
00562 
00563 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00564 _mm256_sll_epi32(__m256i __a, __m128i __count)
00565 {
00566   return (__m256i)__builtin_ia32_pslld256((__v8si)__a, (__v4si)__count);
00567 }
00568 
00569 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00570 _mm256_slli_epi64(__m256i __a, int __count)
00571 {
00572   return __builtin_ia32_psllqi256(__a, __count);
00573 }
00574 
00575 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00576 _mm256_sll_epi64(__m256i __a, __m128i __count)
00577 {
00578   return __builtin_ia32_psllq256(__a, __count);
00579 }
00580 
00581 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00582 _mm256_srai_epi16(__m256i __a, int __count)
00583 {
00584   return (__m256i)__builtin_ia32_psrawi256((__v16hi)__a, __count);
00585 }
00586 
00587 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00588 _mm256_sra_epi16(__m256i __a, __m128i __count)
00589 {
00590   return (__m256i)__builtin_ia32_psraw256((__v16hi)__a, (__v8hi)__count);
00591 }
00592 
00593 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00594 _mm256_srai_epi32(__m256i __a, int __count)
00595 {
00596   return (__m256i)__builtin_ia32_psradi256((__v8si)__a, __count);
00597 }
00598 
00599 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00600 _mm256_sra_epi32(__m256i __a, __m128i __count)
00601 {
00602   return (__m256i)__builtin_ia32_psrad256((__v8si)__a, (__v4si)__count);
00603 }
00604 
00605 #define _mm256_srli_si256(a, count) __extension__ ({ \
00606   __m256i __a = (a); \
00607   (__m256i)__builtin_ia32_psrldqi256(__a, (count)*8); })
00608 
00609 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00610 _mm256_srli_epi16(__m256i __a, int __count)
00611 {
00612   return (__m256i)__builtin_ia32_psrlwi256((__v16hi)__a, __count);
00613 }
00614 
00615 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00616 _mm256_srl_epi16(__m256i __a, __m128i __count)
00617 {
00618   return (__m256i)__builtin_ia32_psrlw256((__v16hi)__a, (__v8hi)__count);
00619 }
00620 
00621 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00622 _mm256_srli_epi32(__m256i __a, int __count)
00623 {
00624   return (__m256i)__builtin_ia32_psrldi256((__v8si)__a, __count);
00625 }
00626 
00627 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00628 _mm256_srl_epi32(__m256i __a, __m128i __count)
00629 {
00630   return (__m256i)__builtin_ia32_psrld256((__v8si)__a, (__v4si)__count);
00631 }
00632 
00633 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00634 _mm256_srli_epi64(__m256i __a, int __count)
00635 {
00636   return __builtin_ia32_psrlqi256(__a, __count);
00637 }
00638 
00639 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00640 _mm256_srl_epi64(__m256i __a, __m128i __count)
00641 {
00642   return __builtin_ia32_psrlq256(__a, __count);
00643 }
00644 
00645 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00646 _mm256_sub_epi8(__m256i __a, __m256i __b)
00647 {
00648   return (__m256i)((__v32qi)__a - (__v32qi)__b);
00649 }
00650 
00651 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00652 _mm256_sub_epi16(__m256i __a, __m256i __b)
00653 {
00654   return (__m256i)((__v16hi)__a - (__v16hi)__b);
00655 }
00656 
00657 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00658 _mm256_sub_epi32(__m256i __a, __m256i __b)
00659 {
00660   return (__m256i)((__v8si)__a - (__v8si)__b);
00661 }
00662 
00663 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00664 _mm256_sub_epi64(__m256i __a, __m256i __b)
00665 {
00666   return __a - __b;
00667 }
00668 
00669 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00670 _mm256_subs_epi8(__m256i __a, __m256i __b)
00671 {
00672   return (__m256i)__builtin_ia32_psubsb256((__v32qi)__a, (__v32qi)__b);
00673 }
00674 
00675 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00676 _mm256_subs_epi16(__m256i __a, __m256i __b)
00677 {
00678   return (__m256i)__builtin_ia32_psubsw256((__v16hi)__a, (__v16hi)__b);
00679 }
00680 
00681 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00682 _mm256_subs_epu8(__m256i __a, __m256i __b)
00683 {
00684   return (__m256i)__builtin_ia32_psubusb256((__v32qi)__a, (__v32qi)__b);
00685 }
00686 
00687 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00688 _mm256_subs_epu16(__m256i __a, __m256i __b)
00689 {
00690   return (__m256i)__builtin_ia32_psubusw256((__v16hi)__a, (__v16hi)__b);
00691 }
00692 
00693 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00694 _mm256_unpackhi_epi8(__m256i __a, __m256i __b)
00695 {
00696   return (__m256i)__builtin_shufflevector((__v32qi)__a, (__v32qi)__b, 8, 32+8, 9, 32+9, 10, 32+10, 11, 32+11, 12, 32+12, 13, 32+13, 14, 32+14, 15, 32+15, 24, 32+24, 25, 32+25, 26, 32+26, 27, 32+27, 28, 32+28, 29, 32+29, 30, 32+30, 31, 32+31);
00697 }
00698 
00699 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00700 _mm256_unpackhi_epi16(__m256i __a, __m256i __b)
00701 {
00702   return (__m256i)__builtin_shufflevector((__v16hi)__a, (__v16hi)__b, 4, 16+4, 5, 16+5, 6, 16+6, 7, 16+7, 12, 16+12, 13, 16+13, 14, 16+14, 15, 16+15);
00703 }
00704 
00705 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00706 _mm256_unpackhi_epi32(__m256i __a, __m256i __b)
00707 {
00708   return (__m256i)__builtin_shufflevector((__v8si)__a, (__v8si)__b, 2, 8+2, 3, 8+3, 6, 8+6, 7, 8+7);
00709 }
00710 
00711 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00712 _mm256_unpackhi_epi64(__m256i __a, __m256i __b)
00713 {
00714   return (__m256i)__builtin_shufflevector(__a, __b, 1, 4+1, 3, 4+3);
00715 }
00716 
00717 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00718 _mm256_unpacklo_epi8(__m256i __a, __m256i __b)
00719 {
00720   return (__m256i)__builtin_shufflevector((__v32qi)__a, (__v32qi)__b, 0, 32+0, 1, 32+1, 2, 32+2, 3, 32+3, 4, 32+4, 5, 32+5, 6, 32+6, 7, 32+7, 16, 32+16, 17, 32+17, 18, 32+18, 19, 32+19, 20, 32+20, 21, 32+21, 22, 32+22, 23, 32+23);
00721 }
00722 
00723 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00724 _mm256_unpacklo_epi16(__m256i __a, __m256i __b)
00725 {
00726   return (__m256i)__builtin_shufflevector((__v16hi)__a, (__v16hi)__b, 0, 16+0, 1, 16+1, 2, 16+2, 3, 16+3, 8, 16+8, 9, 16+9, 10, 16+10, 11, 16+11);
00727 }
00728 
00729 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00730 _mm256_unpacklo_epi32(__m256i __a, __m256i __b)
00731 {
00732   return (__m256i)__builtin_shufflevector((__v8si)__a, (__v8si)__b, 0, 8+0, 1, 8+1, 4, 8+4, 5, 8+5);
00733 }
00734 
00735 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00736 _mm256_unpacklo_epi64(__m256i __a, __m256i __b)
00737 {
00738   return (__m256i)__builtin_shufflevector(__a, __b, 0, 4+0, 2, 4+2);
00739 }
00740 
00741 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00742 _mm256_xor_si256(__m256i __a, __m256i __b)
00743 {
00744   return __a ^ __b;
00745 }
00746 
00747 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00748 _mm256_stream_load_si256(__m256i *__V)
00749 {
00750   return (__m256i)__builtin_ia32_movntdqa256((__v4di *)__V);
00751 }
00752 
00753 static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
00754 _mm_broadcastss_ps(__m128 __X)
00755 {
00756   return (__m128)__builtin_ia32_vbroadcastss_ps((__v4sf)__X);
00757 }
00758 
00759 static __inline__ __m256 __attribute__((__always_inline__, __nodebug__))
00760 _mm256_broadcastss_ps(__m128 __X)
00761 {
00762   return (__m256)__builtin_ia32_vbroadcastss_ps256((__v4sf)__X);
00763 }
00764 
00765 static __inline__ __m256d __attribute__((__always_inline__, __nodebug__))
00766 _mm256_broadcastsd_pd(__m128d __X)
00767 {
00768   return (__m256d)__builtin_ia32_vbroadcastsd_pd256((__v2df)__X);
00769 }
00770 
00771 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00772 _mm256_broadcastsi128_si256(__m128i __X)
00773 {
00774   return (__m256i)__builtin_ia32_vbroadcastsi256(__X);
00775 }
00776 
00777 #define _mm_blend_epi32(V1, V2, M) __extension__ ({ \
00778   __m128i __V1 = (V1); \
00779   __m128i __V2 = (V2); \
00780   (__m128i)__builtin_shufflevector((__v4si)__V1, (__v4si)__V2, \
00781                                    (((M) & 0x01) ? 4 : 0), \
00782                                    (((M) & 0x02) ? 5 : 1), \
00783                                    (((M) & 0x04) ? 6 : 2), \
00784                                    (((M) & 0x08) ? 7 : 3)); })
00785 
00786 #define _mm256_blend_epi32(V1, V2, M) __extension__ ({ \
00787   __m256i __V1 = (V1); \
00788   __m256i __V2 = (V2); \
00789   (__m256i)__builtin_shufflevector((__v8si)__V1, (__v8si)__V2, \
00790                                    (((M) & 0x01) ?  8 : 0), \
00791                                    (((M) & 0x02) ?  9 : 1), \
00792                                    (((M) & 0x04) ? 10 : 2), \
00793                                    (((M) & 0x08) ? 11 : 3), \
00794                                    (((M) & 0x10) ? 12 : 4), \
00795                                    (((M) & 0x20) ? 13 : 5), \
00796                                    (((M) & 0x40) ? 14 : 6), \
00797                                    (((M) & 0x80) ? 15 : 7)); })
00798 
00799 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00800 _mm256_broadcastb_epi8(__m128i __X)
00801 {
00802   return (__m256i)__builtin_ia32_pbroadcastb256((__v16qi)__X);
00803 }
00804 
00805 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00806 _mm256_broadcastw_epi16(__m128i __X)
00807 {
00808   return (__m256i)__builtin_ia32_pbroadcastw256((__v8hi)__X);
00809 }
00810 
00811 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00812 _mm256_broadcastd_epi32(__m128i __X)
00813 {
00814   return (__m256i)__builtin_ia32_pbroadcastd256((__v4si)__X);
00815 }
00816 
00817 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00818 _mm256_broadcastq_epi64(__m128i __X)
00819 {
00820   return (__m256i)__builtin_ia32_pbroadcastq256(__X);
00821 }
00822 
00823 static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
00824 _mm_broadcastb_epi8(__m128i __X)
00825 {
00826   return (__m128i)__builtin_ia32_pbroadcastb128((__v16qi)__X);
00827 }
00828 
00829 static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
00830 _mm_broadcastw_epi16(__m128i __X)
00831 {
00832   return (__m128i)__builtin_ia32_pbroadcastw128((__v8hi)__X);
00833 }
00834 
00835 
00836 static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
00837 _mm_broadcastd_epi32(__m128i __X)
00838 {
00839   return (__m128i)__builtin_ia32_pbroadcastd128((__v4si)__X);
00840 }
00841 
00842 static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
00843 _mm_broadcastq_epi64(__m128i __X)
00844 {
00845   return (__m128i)__builtin_ia32_pbroadcastq128(__X);
00846 }
00847 
00848 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00849 _mm256_permutevar8x32_epi32(__m256i __a, __m256i __b)
00850 {
00851   return (__m256i)__builtin_ia32_permvarsi256((__v8si)__a, (__v8si)__b);
00852 }
00853 
00854 #define _mm256_permute4x64_pd(V, M) __extension__ ({ \
00855   __m256d __V = (V); \
00856   (__m256d)__builtin_shufflevector((__v4df)__V, (__v4df) _mm256_setzero_pd(), \
00857                                    (M) & 0x3, ((M) & 0xc) >> 2, \
00858                                    ((M) & 0x30) >> 4, ((M) & 0xc0) >> 6); })
00859 
00860 static __inline__ __m256 __attribute__((__always_inline__, __nodebug__))
00861 _mm256_permutevar8x32_ps(__m256 __a, __m256 __b)
00862 {
00863   return (__m256)__builtin_ia32_permvarsf256((__v8sf)__a, (__v8sf)__b);
00864 }
00865 
00866 #define _mm256_permute4x64_epi64(V, M) __extension__ ({ \
00867   __m256i __V = (V); \
00868   (__m256i)__builtin_shufflevector((__v4di)__V, (__v4di) _mm256_setzero_si256(), \
00869                                    (M) & 0x3, ((M) & 0xc) >> 2, \
00870                                    ((M) & 0x30) >> 4, ((M) & 0xc0) >> 6); })
00871 
00872 #define _mm256_permute2x128_si256(V1, V2, M) __extension__ ({ \
00873   __m256i __V1 = (V1); \
00874   __m256i __V2 = (V2); \
00875   (__m256i)__builtin_ia32_permti256(__V1, __V2, (M)); })
00876 
00877 #define _mm256_extracti128_si256(A, O) __extension__ ({ \
00878   __m256i __A = (A); \
00879   (__m128i)__builtin_ia32_extract128i256(__A, (O)); })
00880 
00881 #define _mm256_inserti128_si256(V1, V2, O) __extension__ ({ \
00882   __m256i __V1 = (V1); \
00883   __m128i __V2 = (V2); \
00884   (__m256i)__builtin_ia32_insert128i256(__V1, __V2, (O)); })
00885 
00886 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00887 _mm256_maskload_epi32(int const *__X, __m256i __M)
00888 {
00889   return (__m256i)__builtin_ia32_maskloadd256((const __v8si *)__X, (__v8si)__M);
00890 }
00891 
00892 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00893 _mm256_maskload_epi64(long long const *__X, __m256i __M)
00894 {
00895   return (__m256i)__builtin_ia32_maskloadq256((const __v4di *)__X, __M);
00896 }
00897 
00898 static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
00899 _mm_maskload_epi32(int const *__X, __m128i __M)
00900 {
00901   return (__m128i)__builtin_ia32_maskloadd((const __v4si *)__X, (__v4si)__M);
00902 }
00903 
00904 static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
00905 _mm_maskload_epi64(long long const *__X, __m128i __M)
00906 {
00907   return (__m128i)__builtin_ia32_maskloadq((const __v2di *)__X, (__v2di)__M);
00908 }
00909 
00910 static __inline__ void __attribute__((__always_inline__, __nodebug__))
00911 _mm256_maskstore_epi32(int *__X, __m256i __M, __m256i __Y)
00912 {
00913   __builtin_ia32_maskstored256((__v8si *)__X, (__v8si)__M, (__v8si)__Y);
00914 }
00915 
00916 static __inline__ void __attribute__((__always_inline__, __nodebug__))
00917 _mm256_maskstore_epi64(long long *__X, __m256i __M, __m256i __Y)
00918 {
00919   __builtin_ia32_maskstoreq256((__v4di *)__X, __M, __Y);
00920 }
00921 
00922 static __inline__ void __attribute__((__always_inline__, __nodebug__))
00923 _mm_maskstore_epi32(int *__X, __m128i __M, __m128i __Y)
00924 {
00925   __builtin_ia32_maskstored((__v4si *)__X, (__v4si)__M, (__v4si)__Y);
00926 }
00927 
00928 static __inline__ void __attribute__((__always_inline__, __nodebug__))
00929 _mm_maskstore_epi64(long long *__X, __m128i __M, __m128i __Y)
00930 {
00931   __builtin_ia32_maskstoreq(( __v2di *)__X, __M, __Y);
00932 }
00933 
00934 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00935 _mm256_sllv_epi32(__m256i __X, __m256i __Y)
00936 {
00937   return (__m256i)__builtin_ia32_psllv8si((__v8si)__X, (__v8si)__Y);
00938 }
00939 
00940 static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
00941 _mm_sllv_epi32(__m128i __X, __m128i __Y)
00942 {
00943   return (__m128i)__builtin_ia32_psllv4si((__v4si)__X, (__v4si)__Y);
00944 }
00945 
00946 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00947 _mm256_sllv_epi64(__m256i __X, __m256i __Y)
00948 {
00949   return (__m256i)__builtin_ia32_psllv4di(__X, __Y);
00950 }
00951 
00952 static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
00953 _mm_sllv_epi64(__m128i __X, __m128i __Y)
00954 {
00955   return (__m128i)__builtin_ia32_psllv2di(__X, __Y);
00956 }
00957 
00958 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00959 _mm256_srav_epi32(__m256i __X, __m256i __Y)
00960 {
00961   return (__m256i)__builtin_ia32_psrav8si((__v8si)__X, (__v8si)__Y);
00962 }
00963 
00964 static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
00965 _mm_srav_epi32(__m128i __X, __m128i __Y)
00966 {
00967   return (__m128i)__builtin_ia32_psrav4si((__v4si)__X, (__v4si)__Y);
00968 }
00969 
00970 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00971 _mm256_srlv_epi32(__m256i __X, __m256i __Y)
00972 {
00973   return (__m256i)__builtin_ia32_psrlv8si((__v8si)__X, (__v8si)__Y);
00974 }
00975 
00976 static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
00977 _mm_srlv_epi32(__m128i __X, __m128i __Y)
00978 {
00979   return (__m128i)__builtin_ia32_psrlv4si((__v4si)__X, (__v4si)__Y);
00980 }
00981 
00982 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
00983 _mm256_srlv_epi64(__m256i __X, __m256i __Y)
00984 {
00985   return (__m256i)__builtin_ia32_psrlv4di(__X, __Y);
00986 }
00987 
00988 static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
00989 _mm_srlv_epi64(__m128i __X, __m128i __Y)
00990 {
00991   return (__m128i)__builtin_ia32_psrlv2di(__X, __Y);
00992 }
00993 
00994 #define _mm_mask_i32gather_pd(a, m, i, mask, s) __extension__ ({ \
00995   __m128d __a = (a); \
00996   double const *__m = (m); \
00997   __m128i __i = (i); \
00998   __m128d __mask = (mask); \
00999   (__m128d)__builtin_ia32_gatherd_pd((__v2df)__a, (const __v2df *)__m, \
01000              (__v4si)__i, (__v2df)__mask, (s)); })
01001 
01002 #define _mm256_mask_i32gather_pd(a, m, i, mask, s) __extension__ ({ \
01003   __m256d __a = (a); \
01004   double const *__m = (m); \
01005   __m128i __i = (i); \
01006   __m256d __mask = (mask); \
01007   (__m256d)__builtin_ia32_gatherd_pd256((__v4df)__a, (const __v4df *)__m, \
01008              (__v4si)__i, (__v4df)__mask, (s)); })
01009 
01010 #define _mm_mask_i64gather_pd(a, m, i, mask, s) __extension__ ({ \
01011   __m128d __a = (a); \
01012   double const *__m = (m); \
01013   __m128i __i = (i); \
01014   __m128d __mask = (mask); \
01015   (__m128d)__builtin_ia32_gatherq_pd((__v2df)__a, (const __v2df *)__m, \
01016              (__v2di)__i, (__v2df)__mask, (s)); })
01017 
01018 #define _mm256_mask_i64gather_pd(a, m, i, mask, s) __extension__ ({ \
01019   __m256d __a = (a); \
01020   double const *__m = (m); \
01021   __m256i __i = (i); \
01022   __m256d __mask = (mask); \
01023   (__m256d)__builtin_ia32_gatherq_pd256((__v4df)__a, (const __v4df *)__m, \
01024              (__v4di)__i, (__v4df)__mask, (s)); })
01025 
01026 #define _mm_mask_i32gather_ps(a, m, i, mask, s) __extension__ ({ \
01027   __m128 __a = (a); \
01028   float const *__m = (m); \
01029   __m128i __i = (i); \
01030   __m128 __mask = (mask); \
01031   (__m128)__builtin_ia32_gatherd_ps((__v4sf)__a, (const __v4sf *)__m, \
01032             (__v4si)__i, (__v4sf)__mask, (s)); })
01033 
01034 #define _mm256_mask_i32gather_ps(a, m, i, mask, s) __extension__ ({ \
01035   __m256 __a = (a); \
01036   float const *__m = (m); \
01037   __m256i __i = (i); \
01038   __m256 __mask = (mask); \
01039   (__m256)__builtin_ia32_gatherd_ps256((__v8sf)__a, (const __v8sf *)__m, \
01040             (__v8si)__i, (__v8sf)__mask, (s)); })
01041 
01042 #define _mm_mask_i64gather_ps(a, m, i, mask, s) __extension__ ({ \
01043   __m128 __a = (a); \
01044   float const *__m = (m); \
01045   __m128i __i = (i); \
01046   __m128 __mask = (mask); \
01047   (__m128)__builtin_ia32_gatherq_ps((__v4sf)__a, (const __v4sf *)__m, \
01048             (__v2di)__i, (__v4sf)__mask, (s)); })
01049 
01050 #define _mm256_mask_i64gather_ps(a, m, i, mask, s) __extension__ ({ \
01051   __m128 __a = (a); \
01052   float const *__m = (m); \
01053   __m256i __i = (i); \
01054   __m128 __mask = (mask); \
01055   (__m128)__builtin_ia32_gatherq_ps256((__v4sf)__a, (const __v4sf *)__m, \
01056             (__v4di)__i, (__v4sf)__mask, (s)); })
01057 
01058 #define _mm_mask_i32gather_epi32(a, m, i, mask, s) __extension__ ({ \
01059   __m128i __a = (a); \
01060   int const *__m = (m); \
01061   __m128i __i = (i); \
01062   __m128i __mask = (mask); \
01063   (__m128i)__builtin_ia32_gatherd_d((__v4si)__a, (const __v4si *)__m, \
01064             (__v4si)__i, (__v4si)__mask, (s)); })
01065 
01066 #define _mm256_mask_i32gather_epi32(a, m, i, mask, s) __extension__ ({ \
01067   __m256i __a = (a); \
01068   int const *__m = (m); \
01069   __m256i __i = (i); \
01070   __m256i __mask = (mask); \
01071   (__m256i)__builtin_ia32_gatherd_d256((__v8si)__a, (const __v8si *)__m, \
01072             (__v8si)__i, (__v8si)__mask, (s)); })
01073 
01074 #define _mm_mask_i64gather_epi32(a, m, i, mask, s) __extension__ ({ \
01075   __m128i __a = (a); \
01076   int const *__m = (m); \
01077   __m128i __i = (i); \
01078   __m128i __mask = (mask); \
01079   (__m128i)__builtin_ia32_gatherq_d((__v4si)__a, (const __v4si *)__m, \
01080             (__v2di)__i, (__v4si)__mask, (s)); })
01081 
01082 #define _mm256_mask_i64gather_epi32(a, m, i, mask, s) __extension__ ({ \
01083   __m128i __a = (a); \
01084   int const *__m = (m); \
01085   __m256i __i = (i); \
01086   __m128i __mask = (mask); \
01087   (__m128i)__builtin_ia32_gatherq_d256((__v4si)__a, (const __v4si *)__m, \
01088             (__v4di)__i, (__v4si)__mask, (s)); })
01089 
01090 #define _mm_mask_i32gather_epi64(a, m, i, mask, s) __extension__ ({ \
01091   __m128i __a = (a); \
01092   long long const *__m = (m); \
01093   __m128i __i = (i); \
01094   __m128i __mask = (mask); \
01095   (__m128i)__builtin_ia32_gatherd_q((__v2di)__a, (const __v2di *)__m, \
01096              (__v4si)__i, (__v2di)__mask, (s)); })
01097 
01098 #define _mm256_mask_i32gather_epi64(a, m, i, mask, s) __extension__ ({ \
01099   __m256i __a = (a); \
01100   long long const *__m = (m); \
01101   __m128i __i = (i); \
01102   __m256i __mask = (mask); \
01103   (__m256i)__builtin_ia32_gatherd_q256((__v4di)__a, (const __v4di *)__m, \
01104              (__v4si)__i, (__v4di)__mask, (s)); })
01105 
01106 #define _mm_mask_i64gather_epi64(a, m, i, mask, s) __extension__ ({ \
01107   __m128i __a = (a); \
01108   long long const *__m = (m); \
01109   __m128i __i = (i); \
01110   __m128i __mask = (mask); \
01111   (__m128i)__builtin_ia32_gatherq_q((__v2di)__a, (const __v2di *)__m, \
01112              (__v2di)__i, (__v2di)__mask, (s)); })
01113 
01114 #define _mm256_mask_i64gather_epi64(a, m, i, mask, s) __extension__ ({ \
01115   __m256i __a = (a); \
01116   long long const *__m = (m); \
01117   __m256i __i = (i); \
01118   __m256i __mask = (mask); \
01119   (__m256i)__builtin_ia32_gatherq_q256((__v4di)__a, (const __v4di *)__m, \
01120              (__v4di)__i, (__v4di)__mask, (s)); })
01121 
01122 #define _mm_i32gather_pd(m, i, s) __extension__ ({ \
01123   double const *__m = (m); \
01124   __m128i __i = (i); \
01125   (__m128d)__builtin_ia32_gatherd_pd((__v2df)_mm_setzero_pd(), \
01126              (const __v2df *)__m, (__v4si)__i, \
01127              (__v2df)_mm_set1_pd((double)(long long int)-1), (s)); })
01128 
01129 #define _mm256_i32gather_pd(m, i, s) __extension__ ({ \
01130   double const *__m = (m); \
01131   __m128i __i = (i); \
01132   (__m256d)__builtin_ia32_gatherd_pd256((__v4df)_mm256_setzero_pd(), \
01133              (const __v4df *)__m, (__v4si)__i, \
01134              (__v4df)_mm256_set1_pd((double)(long long int)-1), (s)); })
01135 
01136 #define _mm_i64gather_pd(m, i, s) __extension__ ({ \
01137   double const *__m = (m); \
01138   __m128i __i = (i); \
01139   (__m128d)__builtin_ia32_gatherq_pd((__v2df)_mm_setzero_pd(), \
01140              (const __v2df *)__m, (__v2di)__i, \
01141              (__v2df)_mm_set1_pd((double)(long long int)-1), (s)); })
01142 
01143 #define _mm256_i64gather_pd(m, i, s) __extension__ ({ \
01144   double const *__m = (m); \
01145   __m256i __i = (i); \
01146   (__m256d)__builtin_ia32_gatherq_pd256((__v4df)_mm256_setzero_pd(), \
01147              (const __v4df *)__m, (__v4di)__i, \
01148              (__v4df)_mm256_set1_pd((double)(long long int)-1), (s)); })
01149 
01150 #define _mm_i32gather_ps(m, i, s) __extension__ ({ \
01151   float const *__m = (m); \
01152   __m128i __i = (i); \
01153   (__m128)__builtin_ia32_gatherd_ps((__v4sf)_mm_setzero_ps(), \
01154              (const __v4sf *)__m, (__v4si)__i, \
01155              (__v4sf)_mm_set1_ps((float)(int)-1), (s)); })
01156 
01157 #define _mm256_i32gather_ps(m, i, s) __extension__ ({ \
01158   float const *__m = (m); \
01159   __m256i __i = (i); \
01160   (__m256)__builtin_ia32_gatherd_ps256((__v8sf)_mm256_setzero_ps(), \
01161              (const __v8sf *)__m, (__v8si)__i, \
01162              (__v8sf)_mm256_set1_ps((float)(int)-1), (s)); })
01163 
01164 #define _mm_i64gather_ps(m, i, s) __extension__ ({ \
01165   float const *__m = (m); \
01166   __m128i __i = (i); \
01167   (__m128)__builtin_ia32_gatherq_ps((__v4sf)_mm_setzero_ps(), \
01168              (const __v4sf *)__m, (__v2di)__i, \
01169              (__v4sf)_mm_set1_ps((float)(int)-1), (s)); })
01170 
01171 #define _mm256_i64gather_ps(m, i, s) __extension__ ({ \
01172   float const *__m = (m); \
01173   __m256i __i = (i); \
01174   (__m128)__builtin_ia32_gatherq_ps256((__v4sf)_mm_setzero_ps(), \
01175              (const __v4sf *)__m, (__v4di)__i, \
01176              (__v4sf)_mm_set1_ps((float)(int)-1), (s)); })
01177 
01178 #define _mm_i32gather_epi32(m, i, s) __extension__ ({ \
01179   int const *__m = (m); \
01180   __m128i __i = (i); \
01181   (__m128i)__builtin_ia32_gatherd_d((__v4si)_mm_setzero_si128(), \
01182             (const __v4si *)__m, (__v4si)__i, \
01183             (__v4si)_mm_set1_epi32(-1), (s)); })
01184 
01185 #define _mm256_i32gather_epi32(m, i, s) __extension__ ({ \
01186   int const *__m = (m); \
01187   __m256i __i = (i); \
01188   (__m256i)__builtin_ia32_gatherd_d256((__v8si)_mm256_setzero_si256(), \
01189             (const __v8si *)__m, (__v8si)__i, \
01190             (__v8si)_mm256_set1_epi32(-1), (s)); })
01191 
01192 #define _mm_i64gather_epi32(m, i, s) __extension__ ({ \
01193   int const *__m = (m); \
01194   __m128i __i = (i); \
01195   (__m128i)__builtin_ia32_gatherq_d((__v4si)_mm_setzero_si128(), \
01196             (const __v4si *)__m, (__v2di)__i, \
01197             (__v4si)_mm_set1_epi32(-1), (s)); })
01198 
01199 #define _mm256_i64gather_epi32(m, i, s) __extension__ ({ \
01200   int const *__m = (m); \
01201   __m256i __i = (i); \
01202   (__m128i)__builtin_ia32_gatherq_d256((__v4si)_mm_setzero_si128(), \
01203             (const __v4si *)__m, (__v4di)__i, \
01204             (__v4si)_mm_set1_epi32(-1), (s)); })
01205 
01206 #define _mm_i32gather_epi64(m, i, s) __extension__ ({ \
01207   long long const *__m = (m); \
01208   __m128i __i = (i); \
01209   (__m128i)__builtin_ia32_gatherd_q((__v2di)_mm_setzero_si128(), \
01210              (const __v2di *)__m, (__v4si)__i, \
01211              (__v2di)_mm_set1_epi64x(-1), (s)); })
01212 
01213 #define _mm256_i32gather_epi64(m, i, s) __extension__ ({ \
01214   long long const *__m = (m); \
01215   __m128i __i = (i); \
01216   (__m256i)__builtin_ia32_gatherd_q256((__v4di)_mm256_setzero_si256(), \
01217              (const __v4di *)__m, (__v4si)__i, \
01218              (__v4di)_mm256_set1_epi64x(-1), (s)); })
01219 
01220 #define _mm_i64gather_epi64(m, i, s) __extension__ ({ \
01221   long long const *__m = (m); \
01222   __m128i __i = (i); \
01223   (__m128i)__builtin_ia32_gatherq_q((__v2di)_mm_setzero_si128(), \
01224              (const __v2di *)__m, (__v2di)__i, \
01225              (__v2di)_mm_set1_epi64x(-1), (s)); })
01226 
01227 #define _mm256_i64gather_epi64(m, i, s) __extension__ ({ \
01228   long long const *__m = (m); \
01229   __m256i __i = (i); \
01230   (__m256i)__builtin_ia32_gatherq_q256((__v4di)_mm256_setzero_si256(), \
01231              (const __v4di *)__m, (__v4di)__i, \
01232              (__v4di)_mm256_set1_epi64x(-1), (s)); })
01233 
01234 #endif /* __AVX2INTRIN_H */