Home | History | Annotate | Download | only in include
      1 /*===---- avx2intrin.h - AVX2 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 __IMMINTRIN_H
     25 #error "Never use <avx2intrin.h> directly; include <immintrin.h> instead."
     26 #endif
     27 
     28 #ifndef __AVX2INTRIN_H
     29 #define __AVX2INTRIN_H
     30 
     31 /* Define the default attributes for the functions in this file. */
     32 #define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__, __target__("avx2")))
     33 
     34 /* SSE4 Multiple Packed Sums of Absolute Difference.  */
     35 #define _mm256_mpsadbw_epu8(X, Y, M) __builtin_ia32_mpsadbw256((X), (Y), (M))
     36 
     37 static __inline__ __m256i __DEFAULT_FN_ATTRS
     38 _mm256_abs_epi8(__m256i __a)
     39 {
     40     return (__m256i)__builtin_ia32_pabsb256((__v32qi)__a);
     41 }
     42 
     43 static __inline__ __m256i __DEFAULT_FN_ATTRS
     44 _mm256_abs_epi16(__m256i __a)
     45 {
     46     return (__m256i)__builtin_ia32_pabsw256((__v16hi)__a);
     47 }
     48 
     49 static __inline__ __m256i __DEFAULT_FN_ATTRS
     50 _mm256_abs_epi32(__m256i __a)
     51 {
     52     return (__m256i)__builtin_ia32_pabsd256((__v8si)__a);
     53 }
     54 
     55 static __inline__ __m256i __DEFAULT_FN_ATTRS
     56 _mm256_packs_epi16(__m256i __a, __m256i __b)
     57 {
     58   return (__m256i)__builtin_ia32_packsswb256((__v16hi)__a, (__v16hi)__b);
     59 }
     60 
     61 static __inline__ __m256i __DEFAULT_FN_ATTRS
     62 _mm256_packs_epi32(__m256i __a, __m256i __b)
     63 {
     64   return (__m256i)__builtin_ia32_packssdw256((__v8si)__a, (__v8si)__b);
     65 }
     66 
     67 static __inline__ __m256i __DEFAULT_FN_ATTRS
     68 _mm256_packus_epi16(__m256i __a, __m256i __b)
     69 {
     70   return (__m256i)__builtin_ia32_packuswb256((__v16hi)__a, (__v16hi)__b);
     71 }
     72 
     73 static __inline__ __m256i __DEFAULT_FN_ATTRS
     74 _mm256_packus_epi32(__m256i __V1, __m256i __V2)
     75 {
     76   return (__m256i) __builtin_ia32_packusdw256((__v8si)__V1, (__v8si)__V2);
     77 }
     78 
     79 static __inline__ __m256i __DEFAULT_FN_ATTRS
     80 _mm256_add_epi8(__m256i __a, __m256i __b)
     81 {
     82   return (__m256i)((__v32qi)__a + (__v32qi)__b);
     83 }
     84 
     85 static __inline__ __m256i __DEFAULT_FN_ATTRS
     86 _mm256_add_epi16(__m256i __a, __m256i __b)
     87 {
     88   return (__m256i)((__v16hi)__a + (__v16hi)__b);
     89 }
     90 
     91 static __inline__ __m256i __DEFAULT_FN_ATTRS
     92 _mm256_add_epi32(__m256i __a, __m256i __b)
     93 {
     94   return (__m256i)((__v8si)__a + (__v8si)__b);
     95 }
     96 
     97 static __inline__ __m256i __DEFAULT_FN_ATTRS
     98 _mm256_add_epi64(__m256i __a, __m256i __b)
     99 {
    100   return __a + __b;
    101 }
    102 
    103 static __inline__ __m256i __DEFAULT_FN_ATTRS
    104 _mm256_adds_epi8(__m256i __a, __m256i __b)
    105 {
    106   return (__m256i)__builtin_ia32_paddsb256((__v32qi)__a, (__v32qi)__b);
    107 }
    108 
    109 static __inline__ __m256i __DEFAULT_FN_ATTRS
    110 _mm256_adds_epi16(__m256i __a, __m256i __b)
    111 {
    112   return (__m256i)__builtin_ia32_paddsw256((__v16hi)__a, (__v16hi)__b);
    113 }
    114 
    115 static __inline__ __m256i __DEFAULT_FN_ATTRS
    116 _mm256_adds_epu8(__m256i __a, __m256i __b)
    117 {
    118   return (__m256i)__builtin_ia32_paddusb256((__v32qi)__a, (__v32qi)__b);
    119 }
    120 
    121 static __inline__ __m256i __DEFAULT_FN_ATTRS
    122 _mm256_adds_epu16(__m256i __a, __m256i __b)
    123 {
    124   return (__m256i)__builtin_ia32_paddusw256((__v16hi)__a, (__v16hi)__b);
    125 }
    126 
    127 #define _mm256_alignr_epi8(a, b, n) __extension__ ({        \
    128   (__m256i)__builtin_ia32_palignr256((__v32qi)(__m256i)(a), \
    129                                      (__v32qi)(__m256i)(b), (n)); })
    130 
    131 static __inline__ __m256i __DEFAULT_FN_ATTRS
    132 _mm256_and_si256(__m256i __a, __m256i __b)
    133 {
    134   return __a & __b;
    135 }
    136 
    137 static __inline__ __m256i __DEFAULT_FN_ATTRS
    138 _mm256_andnot_si256(__m256i __a, __m256i __b)
    139 {
    140   return ~__a & __b;
    141 }
    142 
    143 static __inline__ __m256i __DEFAULT_FN_ATTRS
    144 _mm256_avg_epu8(__m256i __a, __m256i __b)
    145 {
    146   return (__m256i)__builtin_ia32_pavgb256((__v32qi)__a, (__v32qi)__b);
    147 }
    148 
    149 static __inline__ __m256i __DEFAULT_FN_ATTRS
    150 _mm256_avg_epu16(__m256i __a, __m256i __b)
    151 {
    152   return (__m256i)__builtin_ia32_pavgw256((__v16hi)__a, (__v16hi)__b);
    153 }
    154 
    155 static __inline__ __m256i __DEFAULT_FN_ATTRS
    156 _mm256_blendv_epi8(__m256i __V1, __m256i __V2, __m256i __M)
    157 {
    158   return (__m256i)__builtin_ia32_pblendvb256((__v32qi)__V1, (__v32qi)__V2,
    159                                               (__v32qi)__M);
    160 }
    161 
    162 #define _mm256_blend_epi16(V1, V2, M) __extension__ ({       \
    163   (__m256i)__builtin_shufflevector((__v16hi)(__m256i)(V1),   \
    164                                    (__v16hi)(__m256i)(V2),   \
    165                                    (((M) & 0x01) ? 16 : 0),  \
    166                                    (((M) & 0x02) ? 17 : 1),  \
    167                                    (((M) & 0x04) ? 18 : 2),  \
    168                                    (((M) & 0x08) ? 19 : 3),  \
    169                                    (((M) & 0x10) ? 20 : 4),  \
    170                                    (((M) & 0x20) ? 21 : 5),  \
    171                                    (((M) & 0x40) ? 22 : 6),  \
    172                                    (((M) & 0x80) ? 23 : 7),  \
    173                                    (((M) & 0x01) ? 24 : 8),  \
    174                                    (((M) & 0x02) ? 25 : 9),  \
    175                                    (((M) & 0x04) ? 26 : 10), \
    176                                    (((M) & 0x08) ? 27 : 11), \
    177                                    (((M) & 0x10) ? 28 : 12), \
    178                                    (((M) & 0x20) ? 29 : 13), \
    179                                    (((M) & 0x40) ? 30 : 14), \
    180                                    (((M) & 0x80) ? 31 : 15)); })
    181 
    182 static __inline__ __m256i __DEFAULT_FN_ATTRS
    183 _mm256_cmpeq_epi8(__m256i __a, __m256i __b)
    184 {
    185   return (__m256i)((__v32qi)__a == (__v32qi)__b);
    186 }
    187 
    188 static __inline__ __m256i __DEFAULT_FN_ATTRS
    189 _mm256_cmpeq_epi16(__m256i __a, __m256i __b)
    190 {
    191   return (__m256i)((__v16hi)__a == (__v16hi)__b);
    192 }
    193 
    194 static __inline__ __m256i __DEFAULT_FN_ATTRS
    195 _mm256_cmpeq_epi32(__m256i __a, __m256i __b)
    196 {
    197   return (__m256i)((__v8si)__a == (__v8si)__b);
    198 }
    199 
    200 static __inline__ __m256i __DEFAULT_FN_ATTRS
    201 _mm256_cmpeq_epi64(__m256i __a, __m256i __b)
    202 {
    203   return (__m256i)(__a == __b);
    204 }
    205 
    206 static __inline__ __m256i __DEFAULT_FN_ATTRS
    207 _mm256_cmpgt_epi8(__m256i __a, __m256i __b)
    208 {
    209   /* This function always performs a signed comparison, but __v32qi is a char
    210      which may be signed or unsigned, so use __v32qs. */
    211   return (__m256i)((__v32qs)__a > (__v32qs)__b);
    212 }
    213 
    214 static __inline__ __m256i __DEFAULT_FN_ATTRS
    215 _mm256_cmpgt_epi16(__m256i __a, __m256i __b)
    216 {
    217   return (__m256i)((__v16hi)__a > (__v16hi)__b);
    218 }
    219 
    220 static __inline__ __m256i __DEFAULT_FN_ATTRS
    221 _mm256_cmpgt_epi32(__m256i __a, __m256i __b)
    222 {
    223   return (__m256i)((__v8si)__a > (__v8si)__b);
    224 }
    225 
    226 static __inline__ __m256i __DEFAULT_FN_ATTRS
    227 _mm256_cmpgt_epi64(__m256i __a, __m256i __b)
    228 {
    229   return (__m256i)(__a > __b);
    230 }
    231 
    232 static __inline__ __m256i __DEFAULT_FN_ATTRS
    233 _mm256_hadd_epi16(__m256i __a, __m256i __b)
    234 {
    235     return (__m256i)__builtin_ia32_phaddw256((__v16hi)__a, (__v16hi)__b);
    236 }
    237 
    238 static __inline__ __m256i __DEFAULT_FN_ATTRS
    239 _mm256_hadd_epi32(__m256i __a, __m256i __b)
    240 {
    241     return (__m256i)__builtin_ia32_phaddd256((__v8si)__a, (__v8si)__b);
    242 }
    243 
    244 static __inline__ __m256i __DEFAULT_FN_ATTRS
    245 _mm256_hadds_epi16(__m256i __a, __m256i __b)
    246 {
    247     return (__m256i)__builtin_ia32_phaddsw256((__v16hi)__a, (__v16hi)__b);
    248 }
    249 
    250 static __inline__ __m256i __DEFAULT_FN_ATTRS
    251 _mm256_hsub_epi16(__m256i __a, __m256i __b)
    252 {
    253     return (__m256i)__builtin_ia32_phsubw256((__v16hi)__a, (__v16hi)__b);
    254 }
    255 
    256 static __inline__ __m256i __DEFAULT_FN_ATTRS
    257 _mm256_hsub_epi32(__m256i __a, __m256i __b)
    258 {
    259     return (__m256i)__builtin_ia32_phsubd256((__v8si)__a, (__v8si)__b);
    260 }
    261 
    262 static __inline__ __m256i __DEFAULT_FN_ATTRS
    263 _mm256_hsubs_epi16(__m256i __a, __m256i __b)
    264 {
    265     return (__m256i)__builtin_ia32_phsubsw256((__v16hi)__a, (__v16hi)__b);
    266 }
    267 
    268 static __inline__ __m256i __DEFAULT_FN_ATTRS
    269 _mm256_maddubs_epi16(__m256i __a, __m256i __b)
    270 {
    271     return (__m256i)__builtin_ia32_pmaddubsw256((__v32qi)__a, (__v32qi)__b);
    272 }
    273 
    274 static __inline__ __m256i __DEFAULT_FN_ATTRS
    275 _mm256_madd_epi16(__m256i __a, __m256i __b)
    276 {
    277   return (__m256i)__builtin_ia32_pmaddwd256((__v16hi)__a, (__v16hi)__b);
    278 }
    279 
    280 static __inline__ __m256i __DEFAULT_FN_ATTRS
    281 _mm256_max_epi8(__m256i __a, __m256i __b)
    282 {
    283   return (__m256i)__builtin_ia32_pmaxsb256((__v32qi)__a, (__v32qi)__b);
    284 }
    285 
    286 static __inline__ __m256i __DEFAULT_FN_ATTRS
    287 _mm256_max_epi16(__m256i __a, __m256i __b)
    288 {
    289   return (__m256i)__builtin_ia32_pmaxsw256((__v16hi)__a, (__v16hi)__b);
    290 }
    291 
    292 static __inline__ __m256i __DEFAULT_FN_ATTRS
    293 _mm256_max_epi32(__m256i __a, __m256i __b)
    294 {
    295   return (__m256i)__builtin_ia32_pmaxsd256((__v8si)__a, (__v8si)__b);
    296 }
    297 
    298 static __inline__ __m256i __DEFAULT_FN_ATTRS
    299 _mm256_max_epu8(__m256i __a, __m256i __b)
    300 {
    301   return (__m256i)__builtin_ia32_pmaxub256((__v32qi)__a, (__v32qi)__b);
    302 }
    303 
    304 static __inline__ __m256i __DEFAULT_FN_ATTRS
    305 _mm256_max_epu16(__m256i __a, __m256i __b)
    306 {
    307   return (__m256i)__builtin_ia32_pmaxuw256((__v16hi)__a, (__v16hi)__b);
    308 }
    309 
    310 static __inline__ __m256i __DEFAULT_FN_ATTRS
    311 _mm256_max_epu32(__m256i __a, __m256i __b)
    312 {
    313   return (__m256i)__builtin_ia32_pmaxud256((__v8si)__a, (__v8si)__b);
    314 }
    315 
    316 static __inline__ __m256i __DEFAULT_FN_ATTRS
    317 _mm256_min_epi8(__m256i __a, __m256i __b)
    318 {
    319   return (__m256i)__builtin_ia32_pminsb256((__v32qi)__a, (__v32qi)__b);
    320 }
    321 
    322 static __inline__ __m256i __DEFAULT_FN_ATTRS
    323 _mm256_min_epi16(__m256i __a, __m256i __b)
    324 {
    325   return (__m256i)__builtin_ia32_pminsw256((__v16hi)__a, (__v16hi)__b);
    326 }
    327 
    328 static __inline__ __m256i __DEFAULT_FN_ATTRS
    329 _mm256_min_epi32(__m256i __a, __m256i __b)
    330 {
    331   return (__m256i)__builtin_ia32_pminsd256((__v8si)__a, (__v8si)__b);
    332 }
    333 
    334 static __inline__ __m256i __DEFAULT_FN_ATTRS
    335 _mm256_min_epu8(__m256i __a, __m256i __b)
    336 {
    337   return (__m256i)__builtin_ia32_pminub256((__v32qi)__a, (__v32qi)__b);
    338 }
    339 
    340 static __inline__ __m256i __DEFAULT_FN_ATTRS
    341 _mm256_min_epu16(__m256i __a, __m256i __b)
    342 {
    343   return (__m256i)__builtin_ia32_pminuw256 ((__v16hi)__a, (__v16hi)__b);
    344 }
    345 
    346 static __inline__ __m256i __DEFAULT_FN_ATTRS
    347 _mm256_min_epu32(__m256i __a, __m256i __b)
    348 {
    349   return (__m256i)__builtin_ia32_pminud256((__v8si)__a, (__v8si)__b);
    350 }
    351 
    352 static __inline__ int __DEFAULT_FN_ATTRS
    353 _mm256_movemask_epi8(__m256i __a)
    354 {
    355   return __builtin_ia32_pmovmskb256((__v32qi)__a);
    356 }
    357 
    358 static __inline__ __m256i __DEFAULT_FN_ATTRS
    359 _mm256_cvtepi8_epi16(__m128i __V)
    360 {
    361   return (__m256i)__builtin_ia32_pmovsxbw256((__v16qi)__V);
    362 }
    363 
    364 static __inline__ __m256i __DEFAULT_FN_ATTRS
    365 _mm256_cvtepi8_epi32(__m128i __V)
    366 {
    367   return (__m256i)__builtin_ia32_pmovsxbd256((__v16qi)__V);
    368 }
    369 
    370 static __inline__ __m256i __DEFAULT_FN_ATTRS
    371 _mm256_cvtepi8_epi64(__m128i __V)
    372 {
    373   return (__m256i)__builtin_ia32_pmovsxbq256((__v16qi)__V);
    374 }
    375 
    376 static __inline__ __m256i __DEFAULT_FN_ATTRS
    377 _mm256_cvtepi16_epi32(__m128i __V)
    378 {
    379   return (__m256i)__builtin_ia32_pmovsxwd256((__v8hi)__V);
    380 }
    381 
    382 static __inline__ __m256i __DEFAULT_FN_ATTRS
    383 _mm256_cvtepi16_epi64(__m128i __V)
    384 {
    385   return (__m256i)__builtin_ia32_pmovsxwq256((__v8hi)__V);
    386 }
    387 
    388 static __inline__ __m256i __DEFAULT_FN_ATTRS
    389 _mm256_cvtepi32_epi64(__m128i __V)
    390 {
    391   return (__m256i)__builtin_ia32_pmovsxdq256((__v4si)__V);
    392 }
    393 
    394 static __inline__ __m256i __DEFAULT_FN_ATTRS
    395 _mm256_cvtepu8_epi16(__m128i __V)
    396 {
    397   return (__m256i)__builtin_ia32_pmovzxbw256((__v16qi)__V);
    398 }
    399 
    400 static __inline__ __m256i __DEFAULT_FN_ATTRS
    401 _mm256_cvtepu8_epi32(__m128i __V)
    402 {
    403   return (__m256i)__builtin_ia32_pmovzxbd256((__v16qi)__V);
    404 }
    405 
    406 static __inline__ __m256i __DEFAULT_FN_ATTRS
    407 _mm256_cvtepu8_epi64(__m128i __V)
    408 {
    409   return (__m256i)__builtin_ia32_pmovzxbq256((__v16qi)__V);
    410 }
    411 
    412 static __inline__ __m256i __DEFAULT_FN_ATTRS
    413 _mm256_cvtepu16_epi32(__m128i __V)
    414 {
    415   return (__m256i)__builtin_ia32_pmovzxwd256((__v8hi)__V);
    416 }
    417 
    418 static __inline__ __m256i __DEFAULT_FN_ATTRS
    419 _mm256_cvtepu16_epi64(__m128i __V)
    420 {
    421   return (__m256i)__builtin_ia32_pmovzxwq256((__v8hi)__V);
    422 }
    423 
    424 static __inline__ __m256i __DEFAULT_FN_ATTRS
    425 _mm256_cvtepu32_epi64(__m128i __V)
    426 {
    427   return (__m256i)__builtin_ia32_pmovzxdq256((__v4si)__V);
    428 }
    429 
    430 static __inline__  __m256i __DEFAULT_FN_ATTRS
    431 _mm256_mul_epi32(__m256i __a, __m256i __b)
    432 {
    433   return (__m256i)__builtin_ia32_pmuldq256((__v8si)__a, (__v8si)__b);
    434 }
    435 
    436 static __inline__ __m256i __DEFAULT_FN_ATTRS
    437 _mm256_mulhrs_epi16(__m256i __a, __m256i __b)
    438 {
    439   return (__m256i)__builtin_ia32_pmulhrsw256((__v16hi)__a, (__v16hi)__b);
    440 }
    441 
    442 static __inline__ __m256i __DEFAULT_FN_ATTRS
    443 _mm256_mulhi_epu16(__m256i __a, __m256i __b)
    444 {
    445   return (__m256i)__builtin_ia32_pmulhuw256((__v16hi)__a, (__v16hi)__b);
    446 }
    447 
    448 static __inline__ __m256i __DEFAULT_FN_ATTRS
    449 _mm256_mulhi_epi16(__m256i __a, __m256i __b)
    450 {
    451   return (__m256i)__builtin_ia32_pmulhw256((__v16hi)__a, (__v16hi)__b);
    452 }
    453 
    454 static __inline__ __m256i __DEFAULT_FN_ATTRS
    455 _mm256_mullo_epi16(__m256i __a, __m256i __b)
    456 {
    457   return (__m256i)((__v16hi)__a * (__v16hi)__b);
    458 }
    459 
    460 static __inline__  __m256i __DEFAULT_FN_ATTRS
    461 _mm256_mullo_epi32 (__m256i __a, __m256i __b)
    462 {
    463   return (__m256i)((__v8si)__a * (__v8si)__b);
    464 }
    465 
    466 static __inline__ __m256i __DEFAULT_FN_ATTRS
    467 _mm256_mul_epu32(__m256i __a, __m256i __b)
    468 {
    469   return __builtin_ia32_pmuludq256((__v8si)__a, (__v8si)__b);
    470 }
    471 
    472 static __inline__ __m256i __DEFAULT_FN_ATTRS
    473 _mm256_or_si256(__m256i __a, __m256i __b)
    474 {
    475   return __a | __b;
    476 }
    477 
    478 static __inline__ __m256i __DEFAULT_FN_ATTRS
    479 _mm256_sad_epu8(__m256i __a, __m256i __b)
    480 {
    481   return __builtin_ia32_psadbw256((__v32qi)__a, (__v32qi)__b);
    482 }
    483 
    484 static __inline__ __m256i __DEFAULT_FN_ATTRS
    485 _mm256_shuffle_epi8(__m256i __a, __m256i __b)
    486 {
    487   return (__m256i)__builtin_ia32_pshufb256((__v32qi)__a, (__v32qi)__b);
    488 }
    489 
    490 #define _mm256_shuffle_epi32(a, imm) __extension__ ({ \
    491   (__m256i)__builtin_shufflevector((__v8si)(__m256i)(a), \
    492                                    (__v8si)_mm256_setzero_si256(), \
    493                                    (imm) & 0x3, ((imm) & 0xc) >> 2, \
    494                                    ((imm) & 0x30) >> 4, ((imm) & 0xc0) >> 6, \
    495                                    4 + (((imm) & 0x03) >> 0), \
    496                                    4 + (((imm) & 0x0c) >> 2), \
    497                                    4 + (((imm) & 0x30) >> 4), \
    498                                    4 + (((imm) & 0xc0) >> 6)); })
    499 
    500 #define _mm256_shufflehi_epi16(a, imm) __extension__ ({ \
    501   (__m256i)__builtin_shufflevector((__v16hi)(__m256i)(a), \
    502                                    (__v16hi)_mm256_setzero_si256(), \
    503                                    0, 1, 2, 3, \
    504                                    4 + (((imm) & 0x03) >> 0), \
    505                                    4 + (((imm) & 0x0c) >> 2), \
    506                                    4 + (((imm) & 0x30) >> 4), \
    507                                    4 + (((imm) & 0xc0) >> 6), \
    508                                    8, 9, 10, 11, \
    509                                    12 + (((imm) & 0x03) >> 0), \
    510                                    12 + (((imm) & 0x0c) >> 2), \
    511                                    12 + (((imm) & 0x30) >> 4), \
    512                                    12 + (((imm) & 0xc0) >> 6)); })
    513 
    514 #define _mm256_shufflelo_epi16(a, imm) __extension__ ({ \
    515   (__m256i)__builtin_shufflevector((__v16hi)(__m256i)(a), \
    516                                    (__v16hi)_mm256_setzero_si256(), \
    517                                    (imm) & 0x3,((imm) & 0xc) >> 2, \
    518                                    ((imm) & 0x30) >> 4, ((imm) & 0xc0) >> 6, \
    519                                    4, 5, 6, 7, \
    520                                    8 + (((imm) & 0x03) >> 0), \
    521                                    8 + (((imm) & 0x0c) >> 2), \
    522                                    8 + (((imm) & 0x30) >> 4), \
    523                                    8 + (((imm) & 0xc0) >> 6), \
    524                                    12, 13, 14, 15); })
    525 
    526 static __inline__ __m256i __DEFAULT_FN_ATTRS
    527 _mm256_sign_epi8(__m256i __a, __m256i __b)
    528 {
    529     return (__m256i)__builtin_ia32_psignb256((__v32qi)__a, (__v32qi)__b);
    530 }
    531 
    532 static __inline__ __m256i __DEFAULT_FN_ATTRS
    533 _mm256_sign_epi16(__m256i __a, __m256i __b)
    534 {
    535     return (__m256i)__builtin_ia32_psignw256((__v16hi)__a, (__v16hi)__b);
    536 }
    537 
    538 static __inline__ __m256i __DEFAULT_FN_ATTRS
    539 _mm256_sign_epi32(__m256i __a, __m256i __b)
    540 {
    541     return (__m256i)__builtin_ia32_psignd256((__v8si)__a, (__v8si)__b);
    542 }
    543 
    544 #define _mm256_slli_si256(a, count) __extension__ ({ \
    545   (__m256i)__builtin_ia32_pslldqi256((__m256i)(a), (count)*8); })
    546 
    547 #define _mm256_bslli_epi128(a, count) _mm256_slli_si256((a), (count))
    548 
    549 static __inline__ __m256i __DEFAULT_FN_ATTRS
    550 _mm256_slli_epi16(__m256i __a, int __count)
    551 {
    552   return (__m256i)__builtin_ia32_psllwi256((__v16hi)__a, __count);
    553 }
    554 
    555 static __inline__ __m256i __DEFAULT_FN_ATTRS
    556 _mm256_sll_epi16(__m256i __a, __m128i __count)
    557 {
    558   return (__m256i)__builtin_ia32_psllw256((__v16hi)__a, (__v8hi)__count);
    559 }
    560 
    561 static __inline__ __m256i __DEFAULT_FN_ATTRS
    562 _mm256_slli_epi32(__m256i __a, int __count)
    563 {
    564   return (__m256i)__builtin_ia32_pslldi256((__v8si)__a, __count);
    565 }
    566 
    567 static __inline__ __m256i __DEFAULT_FN_ATTRS
    568 _mm256_sll_epi32(__m256i __a, __m128i __count)
    569 {
    570   return (__m256i)__builtin_ia32_pslld256((__v8si)__a, (__v4si)__count);
    571 }
    572 
    573 static __inline__ __m256i __DEFAULT_FN_ATTRS
    574 _mm256_slli_epi64(__m256i __a, int __count)
    575 {
    576   return __builtin_ia32_psllqi256(__a, __count);
    577 }
    578 
    579 static __inline__ __m256i __DEFAULT_FN_ATTRS
    580 _mm256_sll_epi64(__m256i __a, __m128i __count)
    581 {
    582   return __builtin_ia32_psllq256(__a, __count);
    583 }
    584 
    585 static __inline__ __m256i __DEFAULT_FN_ATTRS
    586 _mm256_srai_epi16(__m256i __a, int __count)
    587 {
    588   return (__m256i)__builtin_ia32_psrawi256((__v16hi)__a, __count);
    589 }
    590 
    591 static __inline__ __m256i __DEFAULT_FN_ATTRS
    592 _mm256_sra_epi16(__m256i __a, __m128i __count)
    593 {
    594   return (__m256i)__builtin_ia32_psraw256((__v16hi)__a, (__v8hi)__count);
    595 }
    596 
    597 static __inline__ __m256i __DEFAULT_FN_ATTRS
    598 _mm256_srai_epi32(__m256i __a, int __count)
    599 {
    600   return (__m256i)__builtin_ia32_psradi256((__v8si)__a, __count);
    601 }
    602 
    603 static __inline__ __m256i __DEFAULT_FN_ATTRS
    604 _mm256_sra_epi32(__m256i __a, __m128i __count)
    605 {
    606   return (__m256i)__builtin_ia32_psrad256((__v8si)__a, (__v4si)__count);
    607 }
    608 
    609 #define _mm256_srli_si256(a, count) __extension__ ({ \
    610   (__m256i)__builtin_ia32_psrldqi256((__m256i)(a), (count)*8); })
    611 
    612 #define _mm256_bsrli_epi128(a, count) _mm256_srli_si256((a), (count))
    613 
    614 static __inline__ __m256i __DEFAULT_FN_ATTRS
    615 _mm256_srli_epi16(__m256i __a, int __count)
    616 {
    617   return (__m256i)__builtin_ia32_psrlwi256((__v16hi)__a, __count);
    618 }
    619 
    620 static __inline__ __m256i __DEFAULT_FN_ATTRS
    621 _mm256_srl_epi16(__m256i __a, __m128i __count)
    622 {
    623   return (__m256i)__builtin_ia32_psrlw256((__v16hi)__a, (__v8hi)__count);
    624 }
    625 
    626 static __inline__ __m256i __DEFAULT_FN_ATTRS
    627 _mm256_srli_epi32(__m256i __a, int __count)
    628 {
    629   return (__m256i)__builtin_ia32_psrldi256((__v8si)__a, __count);
    630 }
    631 
    632 static __inline__ __m256i __DEFAULT_FN_ATTRS
    633 _mm256_srl_epi32(__m256i __a, __m128i __count)
    634 {
    635   return (__m256i)__builtin_ia32_psrld256((__v8si)__a, (__v4si)__count);
    636 }
    637 
    638 static __inline__ __m256i __DEFAULT_FN_ATTRS
    639 _mm256_srli_epi64(__m256i __a, int __count)
    640 {
    641   return __builtin_ia32_psrlqi256(__a, __count);
    642 }
    643 
    644 static __inline__ __m256i __DEFAULT_FN_ATTRS
    645 _mm256_srl_epi64(__m256i __a, __m128i __count)
    646 {
    647   return __builtin_ia32_psrlq256(__a, __count);
    648 }
    649 
    650 static __inline__ __m256i __DEFAULT_FN_ATTRS
    651 _mm256_sub_epi8(__m256i __a, __m256i __b)
    652 {
    653   return (__m256i)((__v32qi)__a - (__v32qi)__b);
    654 }
    655 
    656 static __inline__ __m256i __DEFAULT_FN_ATTRS
    657 _mm256_sub_epi16(__m256i __a, __m256i __b)
    658 {
    659   return (__m256i)((__v16hi)__a - (__v16hi)__b);
    660 }
    661 
    662 static __inline__ __m256i __DEFAULT_FN_ATTRS
    663 _mm256_sub_epi32(__m256i __a, __m256i __b)
    664 {
    665   return (__m256i)((__v8si)__a - (__v8si)__b);
    666 }
    667 
    668 static __inline__ __m256i __DEFAULT_FN_ATTRS
    669 _mm256_sub_epi64(__m256i __a, __m256i __b)
    670 {
    671   return __a - __b;
    672 }
    673 
    674 static __inline__ __m256i __DEFAULT_FN_ATTRS
    675 _mm256_subs_epi8(__m256i __a, __m256i __b)
    676 {
    677   return (__m256i)__builtin_ia32_psubsb256((__v32qi)__a, (__v32qi)__b);
    678 }
    679 
    680 static __inline__ __m256i __DEFAULT_FN_ATTRS
    681 _mm256_subs_epi16(__m256i __a, __m256i __b)
    682 {
    683   return (__m256i)__builtin_ia32_psubsw256((__v16hi)__a, (__v16hi)__b);
    684 }
    685 
    686 static __inline__ __m256i __DEFAULT_FN_ATTRS
    687 _mm256_subs_epu8(__m256i __a, __m256i __b)
    688 {
    689   return (__m256i)__builtin_ia32_psubusb256((__v32qi)__a, (__v32qi)__b);
    690 }
    691 
    692 static __inline__ __m256i __DEFAULT_FN_ATTRS
    693 _mm256_subs_epu16(__m256i __a, __m256i __b)
    694 {
    695   return (__m256i)__builtin_ia32_psubusw256((__v16hi)__a, (__v16hi)__b);
    696 }
    697 
    698 static __inline__ __m256i __DEFAULT_FN_ATTRS
    699 _mm256_unpackhi_epi8(__m256i __a, __m256i __b)
    700 {
    701   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);
    702 }
    703 
    704 static __inline__ __m256i __DEFAULT_FN_ATTRS
    705 _mm256_unpackhi_epi16(__m256i __a, __m256i __b)
    706 {
    707   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);
    708 }
    709 
    710 static __inline__ __m256i __DEFAULT_FN_ATTRS
    711 _mm256_unpackhi_epi32(__m256i __a, __m256i __b)
    712 {
    713   return (__m256i)__builtin_shufflevector((__v8si)__a, (__v8si)__b, 2, 8+2, 3, 8+3, 6, 8+6, 7, 8+7);
    714 }
    715 
    716 static __inline__ __m256i __DEFAULT_FN_ATTRS
    717 _mm256_unpackhi_epi64(__m256i __a, __m256i __b)
    718 {
    719   return (__m256i)__builtin_shufflevector(__a, __b, 1, 4+1, 3, 4+3);
    720 }
    721 
    722 static __inline__ __m256i __DEFAULT_FN_ATTRS
    723 _mm256_unpacklo_epi8(__m256i __a, __m256i __b)
    724 {
    725   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);
    726 }
    727 
    728 static __inline__ __m256i __DEFAULT_FN_ATTRS
    729 _mm256_unpacklo_epi16(__m256i __a, __m256i __b)
    730 {
    731   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);
    732 }
    733 
    734 static __inline__ __m256i __DEFAULT_FN_ATTRS
    735 _mm256_unpacklo_epi32(__m256i __a, __m256i __b)
    736 {
    737   return (__m256i)__builtin_shufflevector((__v8si)__a, (__v8si)__b, 0, 8+0, 1, 8+1, 4, 8+4, 5, 8+5);
    738 }
    739 
    740 static __inline__ __m256i __DEFAULT_FN_ATTRS
    741 _mm256_unpacklo_epi64(__m256i __a, __m256i __b)
    742 {
    743   return (__m256i)__builtin_shufflevector(__a, __b, 0, 4+0, 2, 4+2);
    744 }
    745 
    746 static __inline__ __m256i __DEFAULT_FN_ATTRS
    747 _mm256_xor_si256(__m256i __a, __m256i __b)
    748 {
    749   return __a ^ __b;
    750 }
    751 
    752 static __inline__ __m256i __DEFAULT_FN_ATTRS
    753 _mm256_stream_load_si256(__m256i const *__V)
    754 {
    755   return (__m256i)__builtin_ia32_movntdqa256((const __v4di *)__V);
    756 }
    757 
    758 static __inline__ __m128 __DEFAULT_FN_ATTRS
    759 _mm_broadcastss_ps(__m128 __X)
    760 {
    761   return (__m128)__builtin_shufflevector((__v4sf)__X, (__v4sf)__X, 0, 0, 0, 0);
    762 }
    763 
    764 static __inline__ __m128d __DEFAULT_FN_ATTRS
    765 _mm_broadcastsd_pd(__m128d __a)
    766 {
    767   return __builtin_shufflevector(__a, __a, 0, 0);
    768 }
    769 
    770 static __inline__ __m256 __DEFAULT_FN_ATTRS
    771 _mm256_broadcastss_ps(__m128 __X)
    772 {
    773   return (__m256)__builtin_shufflevector((__v4sf)__X, (__v4sf)__X, 0, 0, 0, 0, 0, 0, 0, 0);
    774 }
    775 
    776 static __inline__ __m256d __DEFAULT_FN_ATTRS
    777 _mm256_broadcastsd_pd(__m128d __X)
    778 {
    779   return (__m256d)__builtin_shufflevector((__v2df)__X, (__v2df)__X, 0, 0, 0, 0);
    780 }
    781 
    782 static __inline__ __m256i __DEFAULT_FN_ATTRS
    783 _mm256_broadcastsi128_si256(__m128i __X)
    784 {
    785   return (__m256i)__builtin_shufflevector(__X, __X, 0, 1, 0, 1);
    786 }
    787 
    788 #define _mm_blend_epi32(V1, V2, M) __extension__ ({ \
    789   (__m128i)__builtin_shufflevector((__v4si)(__m128i)(V1),  \
    790                                    (__v4si)(__m128i)(V2),  \
    791                                    (((M) & 0x01) ? 4 : 0), \
    792                                    (((M) & 0x02) ? 5 : 1), \
    793                                    (((M) & 0x04) ? 6 : 2), \
    794                                    (((M) & 0x08) ? 7 : 3)); })
    795 
    796 #define _mm256_blend_epi32(V1, V2, M) __extension__ ({ \
    797   (__m256i)__builtin_shufflevector((__v8si)(__m256i)(V1),   \
    798                                    (__v8si)(__m256i)(V2),   \
    799                                    (((M) & 0x01) ?  8 : 0), \
    800                                    (((M) & 0x02) ?  9 : 1), \
    801                                    (((M) & 0x04) ? 10 : 2), \
    802                                    (((M) & 0x08) ? 11 : 3), \
    803                                    (((M) & 0x10) ? 12 : 4), \
    804                                    (((M) & 0x20) ? 13 : 5), \
    805                                    (((M) & 0x40) ? 14 : 6), \
    806                                    (((M) & 0x80) ? 15 : 7)); })
    807 
    808 static __inline__ __m256i __DEFAULT_FN_ATTRS
    809 _mm256_broadcastb_epi8(__m128i __X)
    810 {
    811   return (__m256i)__builtin_shufflevector((__v16qi)__X, (__v16qi)__X, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
    812 }
    813 
    814 static __inline__ __m256i __DEFAULT_FN_ATTRS
    815 _mm256_broadcastw_epi16(__m128i __X)
    816 {
    817   return (__m256i)__builtin_shufflevector((__v8hi)__X, (__v8hi)__X, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
    818 }
    819 
    820 static __inline__ __m256i __DEFAULT_FN_ATTRS
    821 _mm256_broadcastd_epi32(__m128i __X)
    822 {
    823   return (__m256i)__builtin_shufflevector((__v4si)__X, (__v4si)__X, 0, 0, 0, 0, 0, 0, 0, 0);
    824 }
    825 
    826 static __inline__ __m256i __DEFAULT_FN_ATTRS
    827 _mm256_broadcastq_epi64(__m128i __X)
    828 {
    829   return (__m256i)__builtin_shufflevector(__X, __X, 0, 0, 0, 0);
    830 }
    831 
    832 static __inline__ __m128i __DEFAULT_FN_ATTRS
    833 _mm_broadcastb_epi8(__m128i __X)
    834 {
    835   return (__m128i)__builtin_shufflevector((__v16qi)__X, (__v16qi)__X, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
    836 }
    837 
    838 static __inline__ __m128i __DEFAULT_FN_ATTRS
    839 _mm_broadcastw_epi16(__m128i __X)
    840 {
    841   return (__m128i)__builtin_shufflevector((__v8hi)__X, (__v8hi)__X, 0, 0, 0, 0, 0, 0, 0, 0);
    842 }
    843 
    844 
    845 static __inline__ __m128i __DEFAULT_FN_ATTRS
    846 _mm_broadcastd_epi32(__m128i __X)
    847 {
    848   return (__m128i)__builtin_shufflevector((__v4si)__X, (__v4si)__X, 0, 0, 0, 0);
    849 }
    850 
    851 static __inline__ __m128i __DEFAULT_FN_ATTRS
    852 _mm_broadcastq_epi64(__m128i __X)
    853 {
    854   return (__m128i)__builtin_shufflevector(__X, __X, 0, 0);
    855 }
    856 
    857 static __inline__ __m256i __DEFAULT_FN_ATTRS
    858 _mm256_permutevar8x32_epi32(__m256i __a, __m256i __b)
    859 {
    860   return (__m256i)__builtin_ia32_permvarsi256((__v8si)__a, (__v8si)__b);
    861 }
    862 
    863 #define _mm256_permute4x64_pd(V, M) __extension__ ({ \
    864   (__m256d)__builtin_shufflevector((__v4df)(__m256d)(V), \
    865                                    (__v4df)_mm256_setzero_pd(), \
    866                                    (M) & 0x3, ((M) & 0xc) >> 2, \
    867                                    ((M) & 0x30) >> 4, ((M) & 0xc0) >> 6); })
    868 
    869 static __inline__ __m256 __DEFAULT_FN_ATTRS
    870 _mm256_permutevar8x32_ps(__m256 __a, __m256i __b)
    871 {
    872   return (__m256)__builtin_ia32_permvarsf256((__v8sf)__a, (__v8si)__b);
    873 }
    874 
    875 #define _mm256_permute4x64_epi64(V, M) __extension__ ({ \
    876   (__m256i)__builtin_shufflevector((__v4di)(__m256i)(V), \
    877                                    (__v4di)_mm256_setzero_si256(), \
    878                                    (M) & 0x3, ((M) & 0xc) >> 2, \
    879                                    ((M) & 0x30) >> 4, ((M) & 0xc0) >> 6); })
    880 
    881 #define _mm256_permute2x128_si256(V1, V2, M) __extension__ ({ \
    882   (__m256i)__builtin_ia32_permti256((__m256i)(V1), (__m256i)(V2), (M)); })
    883 
    884 #define _mm256_extracti128_si256(V, M) __extension__ ({ \
    885   (__m128i)__builtin_shufflevector((__v4di)(__m256i)(V), \
    886                                    (__v4di)_mm256_setzero_si256(), \
    887                                    (((M) & 1) ? 2 : 0), \
    888                                    (((M) & 1) ? 3 : 1) ); })
    889 
    890 #define _mm256_inserti128_si256(V1, V2, M) __extension__ ({ \
    891   (__m256i)__builtin_shufflevector((__v4di)(__m256i)(V1), \
    892                                    (__v4di)_mm256_castsi128_si256((__m128i)(V2)), \
    893                                    (((M) & 1) ? 0 : 4), \
    894                                    (((M) & 1) ? 1 : 5), \
    895                                    (((M) & 1) ? 4 : 2), \
    896                                    (((M) & 1) ? 5 : 3) ); })
    897 
    898 static __inline__ __m256i __DEFAULT_FN_ATTRS
    899 _mm256_maskload_epi32(int const *__X, __m256i __M)
    900 {
    901   return (__m256i)__builtin_ia32_maskloadd256((const __v8si *)__X, (__v8si)__M);
    902 }
    903 
    904 static __inline__ __m256i __DEFAULT_FN_ATTRS
    905 _mm256_maskload_epi64(long long const *__X, __m256i __M)
    906 {
    907   return (__m256i)__builtin_ia32_maskloadq256((const __v4di *)__X, __M);
    908 }
    909 
    910 static __inline__ __m128i __DEFAULT_FN_ATTRS
    911 _mm_maskload_epi32(int const *__X, __m128i __M)
    912 {
    913   return (__m128i)__builtin_ia32_maskloadd((const __v4si *)__X, (__v4si)__M);
    914 }
    915 
    916 static __inline__ __m128i __DEFAULT_FN_ATTRS
    917 _mm_maskload_epi64(long long const *__X, __m128i __M)
    918 {
    919   return (__m128i)__builtin_ia32_maskloadq((const __v2di *)__X, (__v2di)__M);
    920 }
    921 
    922 static __inline__ void __DEFAULT_FN_ATTRS
    923 _mm256_maskstore_epi32(int *__X, __m256i __M, __m256i __Y)
    924 {
    925   __builtin_ia32_maskstored256((__v8si *)__X, (__v8si)__M, (__v8si)__Y);
    926 }
    927 
    928 static __inline__ void __DEFAULT_FN_ATTRS
    929 _mm256_maskstore_epi64(long long *__X, __m256i __M, __m256i __Y)
    930 {
    931   __builtin_ia32_maskstoreq256((__v4di *)__X, __M, __Y);
    932 }
    933 
    934 static __inline__ void __DEFAULT_FN_ATTRS
    935 _mm_maskstore_epi32(int *__X, __m128i __M, __m128i __Y)
    936 {
    937   __builtin_ia32_maskstored((__v4si *)__X, (__v4si)__M, (__v4si)__Y);
    938 }
    939 
    940 static __inline__ void __DEFAULT_FN_ATTRS
    941 _mm_maskstore_epi64(long long *__X, __m128i __M, __m128i __Y)
    942 {
    943   __builtin_ia32_maskstoreq(( __v2di *)__X, __M, __Y);
    944 }
    945 
    946 static __inline__ __m256i __DEFAULT_FN_ATTRS
    947 _mm256_sllv_epi32(__m256i __X, __m256i __Y)
    948 {
    949   return (__m256i)__builtin_ia32_psllv8si((__v8si)__X, (__v8si)__Y);
    950 }
    951 
    952 static __inline__ __m128i __DEFAULT_FN_ATTRS
    953 _mm_sllv_epi32(__m128i __X, __m128i __Y)
    954 {
    955   return (__m128i)__builtin_ia32_psllv4si((__v4si)__X, (__v4si)__Y);
    956 }
    957 
    958 static __inline__ __m256i __DEFAULT_FN_ATTRS
    959 _mm256_sllv_epi64(__m256i __X, __m256i __Y)
    960 {
    961   return (__m256i)__builtin_ia32_psllv4di(__X, __Y);
    962 }
    963 
    964 static __inline__ __m128i __DEFAULT_FN_ATTRS
    965 _mm_sllv_epi64(__m128i __X, __m128i __Y)
    966 {
    967   return (__m128i)__builtin_ia32_psllv2di(__X, __Y);
    968 }
    969 
    970 static __inline__ __m256i __DEFAULT_FN_ATTRS
    971 _mm256_srav_epi32(__m256i __X, __m256i __Y)
    972 {
    973   return (__m256i)__builtin_ia32_psrav8si((__v8si)__X, (__v8si)__Y);
    974 }
    975 
    976 static __inline__ __m128i __DEFAULT_FN_ATTRS
    977 _mm_srav_epi32(__m128i __X, __m128i __Y)
    978 {
    979   return (__m128i)__builtin_ia32_psrav4si((__v4si)__X, (__v4si)__Y);
    980 }
    981 
    982 static __inline__ __m256i __DEFAULT_FN_ATTRS
    983 _mm256_srlv_epi32(__m256i __X, __m256i __Y)
    984 {
    985   return (__m256i)__builtin_ia32_psrlv8si((__v8si)__X, (__v8si)__Y);
    986 }
    987 
    988 static __inline__ __m128i __DEFAULT_FN_ATTRS
    989 _mm_srlv_epi32(__m128i __X, __m128i __Y)
    990 {
    991   return (__m128i)__builtin_ia32_psrlv4si((__v4si)__X, (__v4si)__Y);
    992 }
    993 
    994 static __inline__ __m256i __DEFAULT_FN_ATTRS
    995 _mm256_srlv_epi64(__m256i __X, __m256i __Y)
    996 {
    997   return (__m256i)__builtin_ia32_psrlv4di(__X, __Y);
    998 }
    999 
   1000 static __inline__ __m128i __DEFAULT_FN_ATTRS
   1001 _mm_srlv_epi64(__m128i __X, __m128i __Y)
   1002 {
   1003   return (__m128i)__builtin_ia32_psrlv2di(__X, __Y);
   1004 }
   1005 
   1006 #define _mm_mask_i32gather_pd(a, m, i, mask, s) __extension__ ({ \
   1007   (__m128d)__builtin_ia32_gatherd_pd((__v2df)(__m128i)(a), \
   1008                                      (double const *)(m), \
   1009                                      (__v4si)(__m128i)(i), \
   1010                                      (__v2df)(__m128d)(mask), (s)); })
   1011 
   1012 #define _mm256_mask_i32gather_pd(a, m, i, mask, s) __extension__ ({ \
   1013   (__m256d)__builtin_ia32_gatherd_pd256((__v4df)(__m256d)(a), \
   1014                                         (double const *)(m), \
   1015                                         (__v4si)(__m128i)(i), \
   1016                                         (__v4df)(__m256d)(mask), (s)); })
   1017 
   1018 #define _mm_mask_i64gather_pd(a, m, i, mask, s) __extension__ ({ \
   1019   (__m128d)__builtin_ia32_gatherq_pd((__v2df)(__m128d)(a), \
   1020                                      (double const *)(m), \
   1021                                      (__v2di)(__m128i)(i), \
   1022                                      (__v2df)(__m128d)(mask), (s)); })
   1023 
   1024 #define _mm256_mask_i64gather_pd(a, m, i, mask, s) __extension__ ({ \
   1025   (__m256d)__builtin_ia32_gatherq_pd256((__v4df)(__m256d)(a), \
   1026                                         (double const *)(m), \
   1027                                         (__v4di)(__m256i)(i), \
   1028                                         (__v4df)(__m256d)(mask), (s)); })
   1029 
   1030 #define _mm_mask_i32gather_ps(a, m, i, mask, s) __extension__ ({ \
   1031   (__m128)__builtin_ia32_gatherd_ps((__v4sf)(__m128)(a), \
   1032                                     (float const *)(m), \
   1033                                     (__v4si)(__m128i)(i), \
   1034                                     (__v4sf)(__m128)(mask), (s)); })
   1035 
   1036 #define _mm256_mask_i32gather_ps(a, m, i, mask, s) __extension__ ({ \
   1037   (__m256)__builtin_ia32_gatherd_ps256((__v8sf)(__m256)(a), \
   1038                                        (float const *)(m), \
   1039                                        (__v8si)(__m256i)(i), \
   1040                                        (__v8sf)(__m256)(mask), (s)); })
   1041 
   1042 #define _mm_mask_i64gather_ps(a, m, i, mask, s) __extension__ ({ \
   1043   (__m128)__builtin_ia32_gatherq_ps((__v4sf)(__m128)(a), \
   1044                                     (float const *)(m), \
   1045                                     (__v2di)(__m128i)(i), \
   1046                                     (__v4sf)(__m128)(mask), (s)); })
   1047 
   1048 #define _mm256_mask_i64gather_ps(a, m, i, mask, s) __extension__ ({ \
   1049   (__m128)__builtin_ia32_gatherq_ps256((__v4sf)(__m128)(a), \
   1050                                        (float const *)(m), \
   1051                                        (__v4di)(__m256i)(i), \
   1052                                        (__v4sf)(__m128)(mask), (s)); })
   1053 
   1054 #define _mm_mask_i32gather_epi32(a, m, i, mask, s) __extension__ ({ \
   1055   (__m128i)__builtin_ia32_gatherd_d((__v4si)(__m128i)(a), \
   1056                                     (int const *)(m), \
   1057                                     (__v4si)(__m128i)(i), \
   1058                                     (__v4si)(__m128i)(mask), (s)); })
   1059 
   1060 #define _mm256_mask_i32gather_epi32(a, m, i, mask, s) __extension__ ({ \
   1061   (__m256i)__builtin_ia32_gatherd_d256((__v8si)(__m256i)(a), \
   1062                                        (int const *)(m), \
   1063                                        (__v8si)(__m256i)(i), \
   1064                                        (__v8si)(__m256i)(mask), (s)); })
   1065 
   1066 #define _mm_mask_i64gather_epi32(a, m, i, mask, s) __extension__ ({ \
   1067   (__m128i)__builtin_ia32_gatherq_d((__v4si)(__m128i)(a), \
   1068                                     (int const *)(m), \
   1069                                     (__v2di)(__m128i)(i), \
   1070                                     (__v4si)(__m128i)(mask), (s)); })
   1071 
   1072 #define _mm256_mask_i64gather_epi32(a, m, i, mask, s) __extension__ ({ \
   1073   (__m128i)__builtin_ia32_gatherq_d256((__v4si)(__m128i)(a), \
   1074                                        (int const *)(m), \
   1075                                        (__v4di)(__m256i)(i), \
   1076                                        (__v4si)(__m128i)(mask), (s)); })
   1077 
   1078 #define _mm_mask_i32gather_epi64(a, m, i, mask, s) __extension__ ({ \
   1079   (__m128i)__builtin_ia32_gatherd_q((__v2di)(__m128i)(a), \
   1080                                     (long long const *)(m), \
   1081                                     (__v4si)(__m128i)(i), \
   1082                                     (__v2di)(__m128i)(mask), (s)); })
   1083 
   1084 #define _mm256_mask_i32gather_epi64(a, m, i, mask, s) __extension__ ({ \
   1085   (__m256i)__builtin_ia32_gatherd_q256((__v4di)(__m256i)(a), \
   1086                                        (long long const *)(m), \
   1087                                        (__v4si)(__m128i)(i), \
   1088                                        (__v4di)(__m256i)(mask), (s)); })
   1089 
   1090 #define _mm_mask_i64gather_epi64(a, m, i, mask, s) __extension__ ({ \
   1091   (__m128i)__builtin_ia32_gatherq_q((__v2di)(__m128i)(a), \
   1092                                     (long long const *)(m), \
   1093                                     (__v2di)(__m128i)(i), \
   1094                                     (__v2di)(__m128i)(mask), (s)); })
   1095 
   1096 #define _mm256_mask_i64gather_epi64(a, m, i, mask, s) __extension__ ({ \
   1097   (__m256i)__builtin_ia32_gatherq_q256((__v4di)(__m256i)(a), \
   1098                                        (long long const *)(m), \
   1099                                        (__v4di)(__m256i)(i), \
   1100                                        (__v4di)(__m256i)(mask), (s)); })
   1101 
   1102 #define _mm_i32gather_pd(m, i, s) __extension__ ({ \
   1103   (__m128d)__builtin_ia32_gatherd_pd((__v2df)_mm_undefined_pd(), \
   1104                                      (double const *)(m), \
   1105                                      (__v4si)(__m128i)(i), \
   1106                                      (__v2df)_mm_cmpeq_pd(_mm_setzero_pd(), \
   1107                                                           _mm_setzero_pd()), \
   1108                                      (s)); })
   1109 
   1110 #define _mm256_i32gather_pd(m, i, s) __extension__ ({ \
   1111   (__m256d)__builtin_ia32_gatherd_pd256((__v4df)_mm256_undefined_pd(), \
   1112                                         (double const *)(m), \
   1113                                         (__v4si)(__m128i)(i), \
   1114                                         (__v4df)_mm256_cmp_pd(_mm256_setzero_pd(), \
   1115                                                               _mm256_setzero_pd(), \
   1116                                                               _CMP_EQ_OQ), \
   1117                                         (s)); })
   1118 
   1119 #define _mm_i64gather_pd(m, i, s) __extension__ ({ \
   1120   (__m128d)__builtin_ia32_gatherq_pd((__v2df)_mm_undefined_pd(), \
   1121                                      (double const *)(m), \
   1122                                      (__v2di)(__m128i)(i), \
   1123                                      (__v2df)_mm_cmpeq_pd(_mm_setzero_pd(), \
   1124                                                           _mm_setzero_pd()), \
   1125                                      (s)); })
   1126 
   1127 #define _mm256_i64gather_pd(m, i, s) __extension__ ({ \
   1128   (__m256d)__builtin_ia32_gatherq_pd256((__v4df)_mm256_undefined_pd(), \
   1129                                         (double const *)(m), \
   1130                                         (__v4di)(__m256i)(i), \
   1131                                         (__v4df)_mm256_cmp_pd(_mm256_setzero_pd(), \
   1132                                                               _mm256_setzero_pd(), \
   1133                                                               _CMP_EQ_OQ), \
   1134                                         (s)); })
   1135 
   1136 #define _mm_i32gather_ps(m, i, s) __extension__ ({ \
   1137   (__m128)__builtin_ia32_gatherd_ps((__v4sf)_mm_undefined_ps(), \
   1138                                     (float const *)(m), \
   1139                                     (__v4si)(__m128i)(i), \
   1140                                     (__v4sf)_mm_cmpeq_ps(_mm_setzero_ps(), \
   1141                                                          _mm_setzero_ps()), \
   1142                                     (s)); })
   1143 
   1144 #define _mm256_i32gather_ps(m, i, s) __extension__ ({ \
   1145   (__m256)__builtin_ia32_gatherd_ps256((__v8sf)_mm256_undefined_ps(), \
   1146                                        (float const *)(m), \
   1147                                        (__v8si)(__m256i)(i), \
   1148                                        (__v8sf)_mm256_cmp_ps(_mm256_setzero_ps(), \
   1149                                                              _mm256_setzero_ps(), \
   1150                                                              _CMP_EQ_OQ), \
   1151                                        (s)); })
   1152 
   1153 #define _mm_i64gather_ps(m, i, s) __extension__ ({ \
   1154   (__m128)__builtin_ia32_gatherq_ps((__v4sf)_mm_undefined_ps(), \
   1155                                     (float const *)(m), \
   1156                                     (__v2di)(__m128i)(i), \
   1157                                     (__v4sf)_mm_cmpeq_ps(_mm_setzero_ps(), \
   1158                                                          _mm_setzero_ps()), \
   1159                                     (s)); })
   1160 
   1161 #define _mm256_i64gather_ps(m, i, s) __extension__ ({ \
   1162   (__m128)__builtin_ia32_gatherq_ps256((__v4sf)_mm_undefined_ps(), \
   1163                                        (float const *)(m), \
   1164                                        (__v4di)(__m256i)(i), \
   1165                                        (__v4sf)_mm_cmpeq_ps(_mm_setzero_ps(), \
   1166                                                             _mm_setzero_ps()), \
   1167                                        (s)); })
   1168 
   1169 #define _mm_i32gather_epi32(m, i, s) __extension__ ({ \
   1170   (__m128i)__builtin_ia32_gatherd_d((__v4si)_mm_undefined_si128(), \
   1171                                     (int const *)(m), (__v4si)(__m128i)(i), \
   1172                                     (__v4si)_mm_set1_epi32(-1), (s)); })
   1173 
   1174 #define _mm256_i32gather_epi32(m, i, s) __extension__ ({ \
   1175   (__m256i)__builtin_ia32_gatherd_d256((__v8si)_mm256_undefined_si256(), \
   1176                                        (int const *)(m), (__v8si)(__m256i)(i), \
   1177                                        (__v8si)_mm256_set1_epi32(-1), (s)); })
   1178 
   1179 #define _mm_i64gather_epi32(m, i, s) __extension__ ({ \
   1180   (__m128i)__builtin_ia32_gatherq_d((__v4si)_mm_undefined_si128(), \
   1181                                     (int const *)(m), (__v2di)(__m128i)(i), \
   1182                                     (__v4si)_mm_set1_epi32(-1), (s)); })
   1183 
   1184 #define _mm256_i64gather_epi32(m, i, s) __extension__ ({ \
   1185   (__m128i)__builtin_ia32_gatherq_d256((__v4si)_mm_undefined_si128(), \
   1186                                        (int const *)(m), (__v4di)(__m256i)(i), \
   1187                                        (__v4si)_mm_set1_epi32(-1), (s)); })
   1188 
   1189 #define _mm_i32gather_epi64(m, i, s) __extension__ ({ \
   1190   (__m128i)__builtin_ia32_gatherd_q((__v2di)_mm_undefined_si128(), \
   1191                                     (long long const *)(m), \
   1192                                     (__v4si)(__m128i)(i), \
   1193                                     (__v2di)_mm_set1_epi64x(-1), (s)); })
   1194 
   1195 #define _mm256_i32gather_epi64(m, i, s) __extension__ ({ \
   1196   (__m256i)__builtin_ia32_gatherd_q256((__v4di)_mm256_undefined_si256(), \
   1197                                        (long long const *)(m), \
   1198                                        (__v4si)(__m128i)(i), \
   1199                                        (__v4di)_mm256_set1_epi64x(-1), (s)); })
   1200 
   1201 #define _mm_i64gather_epi64(m, i, s) __extension__ ({ \
   1202   (__m128i)__builtin_ia32_gatherq_q((__v2di)_mm_undefined_si128(), \
   1203                                     (long long const *)(m), \
   1204                                     (__v2di)(__m128i)(i), \
   1205                                     (__v2di)_mm_set1_epi64x(-1), (s)); })
   1206 
   1207 #define _mm256_i64gather_epi64(m, i, s) __extension__ ({ \
   1208   (__m256i)__builtin_ia32_gatherq_q256((__v4di)_mm256_undefined_si256(), \
   1209                                        (long long const *)(m), \
   1210                                        (__v4di)(__m256i)(i), \
   1211                                        (__v4di)_mm256_set1_epi64x(-1), (s)); })
   1212 
   1213 #undef __DEFAULT_FN_ATTRS
   1214 
   1215 #endif /* __AVX2INTRIN_H */
   1216