clang API Documentation
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 */