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 39static __inline__ __m256i __DEFAULT_FN_ATTRS 40_mm256_abs_epi8(__m256i __a) 41{ 42 return (__m256i)__builtin_ia32_pabsb256((__v32qi)__a); 43} 44 45static __inline__ __m256i __DEFAULT_FN_ATTRS 46_mm256_abs_epi16(__m256i __a) 47{ 48 return (__m256i)__builtin_ia32_pabsw256((__v16hi)__a); 49} 50 51static __inline__ __m256i __DEFAULT_FN_ATTRS 52_mm256_abs_epi32(__m256i __a) 53{ 54 return (__m256i)__builtin_ia32_pabsd256((__v8si)__a); 55} 56 57static __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 63static __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 69static __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 75static __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 81static __inline__ __m256i __DEFAULT_FN_ATTRS 82_mm256_add_epi8(__m256i __a, __m256i __b) 83{ 84 return (__m256i)((__v32qu)__a + (__v32qu)__b); 85} 86 87static __inline__ __m256i __DEFAULT_FN_ATTRS 88_mm256_add_epi16(__m256i __a, __m256i __b) 89{ 90 return (__m256i)((__v16hu)__a + (__v16hu)__b); 91} 92 93static __inline__ __m256i __DEFAULT_FN_ATTRS 94_mm256_add_epi32(__m256i __a, __m256i __b) 95{ 96 return (__m256i)((__v8su)__a + (__v8su)__b); 97} 98 99static __inline__ __m256i __DEFAULT_FN_ATTRS 100_mm256_add_epi64(__m256i __a, __m256i __b) 101{ 102 return (__m256i)((__v4du)__a + (__v4du)__b); 103} 104 105static __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 111static __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 117static __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 123static __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 133static __inline__ __m256i __DEFAULT_FN_ATTRS 134_mm256_and_si256(__m256i __a, __m256i __b) 135{ 136 return (__m256i)((__v4du)__a & (__v4du)__b); 137} 138 139static __inline__ __m256i __DEFAULT_FN_ATTRS 140_mm256_andnot_si256(__m256i __a, __m256i __b) 141{ 142 return (__m256i)(~(__v4du)__a & (__v4du)__b); 143} 144 145static __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 151static __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 157static __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 184static __inline__ __m256i __DEFAULT_FN_ATTRS 185_mm256_cmpeq_epi8(__m256i __a, __m256i __b) 186{ 187 return (__m256i)((__v32qi)__a == (__v32qi)__b); 188} 189 190static __inline__ __m256i __DEFAULT_FN_ATTRS 191_mm256_cmpeq_epi16(__m256i __a, __m256i __b) 192{ 193 return (__m256i)((__v16hi)__a == (__v16hi)__b); 194} 195 196static __inline__ __m256i __DEFAULT_FN_ATTRS 197_mm256_cmpeq_epi32(__m256i __a, __m256i __b) 198{ 199 return (__m256i)((__v8si)__a == (__v8si)__b); 200} 201 202static __inline__ __m256i __DEFAULT_FN_ATTRS 203_mm256_cmpeq_epi64(__m256i __a, __m256i __b) 204{ 205 return (__m256i)((__v4di)__a == (__v4di)__b); 206} 207 208static __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 216static __inline__ __m256i __DEFAULT_FN_ATTRS 217_mm256_cmpgt_epi16(__m256i __a, __m256i __b) 218{ 219 return (__m256i)((__v16hi)__a > (__v16hi)__b); 220} 221 222static __inline__ __m256i __DEFAULT_FN_ATTRS 223_mm256_cmpgt_epi32(__m256i __a, __m256i __b) 224{ 225 return (__m256i)((__v8si)__a > (__v8si)__b); 226} 227 228static __inline__ __m256i __DEFAULT_FN_ATTRS 229_mm256_cmpgt_epi64(__m256i __a, __m256i __b) 230{ 231 return (__m256i)((__v4di)__a > (__v4di)__b); 232} 233 234static __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 240static __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 246static __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 252static __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 258static __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 264static __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 270static __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 276static __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 282static __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 288static __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 294static __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 300static __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 306static __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 312static __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 318static __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 324static __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 330static __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 336static __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 342static __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 348static __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 354static __inline__ int __DEFAULT_FN_ATTRS 355_mm256_movemask_epi8(__m256i __a) 356{ 357 return __builtin_ia32_pmovmskb256((__v32qi)__a); 358} 359 360static __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 368static __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 376static __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 384static __inline__ __m256i __DEFAULT_FN_ATTRS 385_mm256_cvtepi16_epi32(__m128i __V) 386{ 387 return (__m256i)__builtin_convertvector((__v8hi)__V, __v8si); 388} 389 390static __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 396static __inline__ __m256i __DEFAULT_FN_ATTRS 397_mm256_cvtepi32_epi64(__m128i __V) 398{ 399 return (__m256i)__builtin_convertvector((__v4si)__V, __v4di); 400} 401 402static __inline__ __m256i __DEFAULT_FN_ATTRS 403_mm256_cvtepu8_epi16(__m128i __V) 404{ 405 return (__m256i)__builtin_convertvector((__v16qu)__V, __v16hi); 406} 407 408static __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 414static __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 420static __inline__ __m256i __DEFAULT_FN_ATTRS 421_mm256_cvtepu16_epi32(__m128i __V) 422{ 423 return (__m256i)__builtin_convertvector((__v8hu)__V, __v8si); 424} 425 426static __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 432static __inline__ __m256i __DEFAULT_FN_ATTRS 433_mm256_cvtepu32_epi64(__m128i __V) 434{ 435 return (__m256i)__builtin_convertvector((__v4su)__V, __v4di); 436} 437 438static __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 444static __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 450static __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 456static __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 462static __inline__ __m256i __DEFAULT_FN_ATTRS 463_mm256_mullo_epi16(__m256i __a, __m256i __b) 464{ 465 return (__m256i)((__v16hu)__a * (__v16hu)__b); 466} 467 468static __inline__ __m256i __DEFAULT_FN_ATTRS 469_mm256_mullo_epi32 (__m256i __a, __m256i __b) 470{ 471 return (__m256i)((__v8su)__a * (__v8su)__b); 472} 473 474static __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 480static __inline__ __m256i __DEFAULT_FN_ATTRS 481_mm256_or_si256(__m256i __a, __m256i __b) 482{ 483 return (__m256i)((__v4du)__a | (__v4du)__b); 484} 485 486static __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 492static __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 538static __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 544static __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 550static __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 595static __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 601static __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 607static __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 613static __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 619static __inline__ __m256i __DEFAULT_FN_ATTRS 620_mm256_slli_epi64(__m256i __a, int __count) 621{ 622 return __builtin_ia32_psllqi256((__v4di)__a, __count); 623} 624 625static __inline__ __m256i __DEFAULT_FN_ATTRS 626_mm256_sll_epi64(__m256i __a, __m128i __count) 627{ 628 return __builtin_ia32_psllq256((__v4di)__a, __count); 629} 630 631static __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 637static __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 643static __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 649static __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 694static __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 700static __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 706static __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 712static __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 718static __inline__ __m256i __DEFAULT_FN_ATTRS 719_mm256_srli_epi64(__m256i __a, int __count) 720{ 721 return __builtin_ia32_psrlqi256((__v4di)__a, __count); 722} 723 724static __inline__ __m256i __DEFAULT_FN_ATTRS 725_mm256_srl_epi64(__m256i __a, __m128i __count) 726{ 727 return __builtin_ia32_psrlq256((__v4di)__a, __count); 728} 729 730static __inline__ __m256i __DEFAULT_FN_ATTRS 731_mm256_sub_epi8(__m256i __a, __m256i __b) 732{ 733 return (__m256i)((__v32qu)__a - (__v32qu)__b); 734} 735 736static __inline__ __m256i __DEFAULT_FN_ATTRS 737_mm256_sub_epi16(__m256i __a, __m256i __b) 738{ 739 return (__m256i)((__v16hu)__a - (__v16hu)__b); 740} 741 742static __inline__ __m256i __DEFAULT_FN_ATTRS 743_mm256_sub_epi32(__m256i __a, __m256i __b) 744{ 745 return (__m256i)((__v8su)__a - (__v8su)__b); 746} 747 748static __inline__ __m256i __DEFAULT_FN_ATTRS 749_mm256_sub_epi64(__m256i __a, __m256i __b) 750{ 751 return (__m256i)((__v4du)__a - (__v4du)__b); 752} 753 754static __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 760static __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 766static __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 772static __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 778static __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 784static __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 790static __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 796static __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 802static __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 808static __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 814static __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 820static __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 826static __inline__ __m256i __DEFAULT_FN_ATTRS 827_mm256_xor_si256(__m256i __a, __m256i __b) 828{ 829 return (__m256i)((__v4du)__a ^ (__v4du)__b); 830} 831 832static __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 838static __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 844static __inline__ __m128d __DEFAULT_FN_ATTRS 845_mm_broadcastsd_pd(__m128d __a) 846{ 847 return __builtin_shufflevector((__v2df)__a, (__v2df)__a, 0, 0); 848} 849 850static __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 856static __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 862static __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 888static __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 894static __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 900static __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 906static __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 912static __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 918static __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 925static __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 931static __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 937static __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 951static __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 982static __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 988static __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 994static __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 1000static __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 1006static __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 1012static __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 1018static __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 1024static __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 1030static __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 1036static __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 1042static __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 1048static __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 1054static __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 1060static __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 1066static __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 1072static __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 1078static __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 1084static __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