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