avx2intrin.h revision 322320
134495Sjdp/*===---- avx2intrin.h - AVX2 intrinsics -----------------------------------=== 234495Sjdp * 334495Sjdp * Permission is hereby granted, free of charge, to any person obtaining a copy 434495Sjdp * of this software and associated documentation files (the "Software"), to deal 534495Sjdp * in the Software without restriction, including without limitation the rights 634495Sjdp * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 734495Sjdp * copies of the Software, and to permit persons to whom the Software is 834495Sjdp * furnished to do so, subject to the following conditions: 934495Sjdp * 1034495Sjdp * The above copyright notice and this permission notice shall be included in 1134495Sjdp * all copies or substantial portions of the Software. 1234495Sjdp * 1334495Sjdp * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1434495Sjdp * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1534495Sjdp * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 1634495Sjdp * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 1734495Sjdp * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 1834495Sjdp * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 1934495Sjdp * THE SOFTWARE. 2034495Sjdp * 2134495Sjdp *===-----------------------------------------------------------------------=== 2234495Sjdp */ 2334495Sjdp 2434495Sjdp#ifndef __IMMINTRIN_H 2534495Sjdp#error "Never use <avx2intrin.h> directly; include <immintrin.h> instead." 2634495Sjdp#endif 2734495Sjdp 2834495Sjdp#ifndef __AVX2INTRIN_H 2934495Sjdp#define __AVX2INTRIN_H 3034495Sjdp 3134495Sjdp/* Define the default attributes for the functions in this file. */ 3234495Sjdp#define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__, __target__("avx2"))) 3334495Sjdp 3434495Sjdp/* SSE4 Multiple Packed Sums of Absolute Difference. */ 3534495Sjdp#define _mm256_mpsadbw_epu8(X, Y, M) \ 3634495Sjdp (__m256i)__builtin_ia32_mpsadbw256((__v32qi)(__m256i)(X), \ 3734495Sjdp (__v32qi)(__m256i)(Y), (int)(M)) 3834495Sjdp 3934495Sjdpstatic __inline__ __m256i __DEFAULT_FN_ATTRS 4034495Sjdp_mm256_abs_epi8(__m256i __a) 4134495Sjdp{ 4234495Sjdp return (__m256i)__builtin_ia32_pabsb256((__v32qi)__a); 4334495Sjdp} 4434495Sjdp 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 typedef __v4di __v4di_aligned __attribute__((aligned(32))); 836 return (__m256i)__builtin_nontemporal_load((const __v4di_aligned *)__V); 837} 838 839static __inline__ __m128 __DEFAULT_FN_ATTRS 840_mm_broadcastss_ps(__m128 __X) 841{ 842 return (__m128)__builtin_shufflevector((__v4sf)__X, (__v4sf)__X, 0, 0, 0, 0); 843} 844 845static __inline__ __m128d __DEFAULT_FN_ATTRS 846_mm_broadcastsd_pd(__m128d __a) 847{ 848 return __builtin_shufflevector((__v2df)__a, (__v2df)__a, 0, 0); 849} 850 851static __inline__ __m256 __DEFAULT_FN_ATTRS 852_mm256_broadcastss_ps(__m128 __X) 853{ 854 return (__m256)__builtin_shufflevector((__v4sf)__X, (__v4sf)__X, 0, 0, 0, 0, 0, 0, 0, 0); 855} 856 857static __inline__ __m256d __DEFAULT_FN_ATTRS 858_mm256_broadcastsd_pd(__m128d __X) 859{ 860 return (__m256d)__builtin_shufflevector((__v2df)__X, (__v2df)__X, 0, 0, 0, 0); 861} 862 863static __inline__ __m256i __DEFAULT_FN_ATTRS 864_mm256_broadcastsi128_si256(__m128i __X) 865{ 866 return (__m256i)__builtin_shufflevector((__v2di)__X, (__v2di)__X, 0, 1, 0, 1); 867} 868 869#define _mm_blend_epi32(V1, V2, M) __extension__ ({ \ 870 (__m128i)__builtin_shufflevector((__v4si)(__m128i)(V1), \ 871 (__v4si)(__m128i)(V2), \ 872 (((M) & 0x01) ? 4 : 0), \ 873 (((M) & 0x02) ? 5 : 1), \ 874 (((M) & 0x04) ? 6 : 2), \ 875 (((M) & 0x08) ? 7 : 3)); }) 876 877#define _mm256_blend_epi32(V1, V2, M) __extension__ ({ \ 878 (__m256i)__builtin_shufflevector((__v8si)(__m256i)(V1), \ 879 (__v8si)(__m256i)(V2), \ 880 (((M) & 0x01) ? 8 : 0), \ 881 (((M) & 0x02) ? 9 : 1), \ 882 (((M) & 0x04) ? 10 : 2), \ 883 (((M) & 0x08) ? 11 : 3), \ 884 (((M) & 0x10) ? 12 : 4), \ 885 (((M) & 0x20) ? 13 : 5), \ 886 (((M) & 0x40) ? 14 : 6), \ 887 (((M) & 0x80) ? 15 : 7)); }) 888 889static __inline__ __m256i __DEFAULT_FN_ATTRS 890_mm256_broadcastb_epi8(__m128i __X) 891{ 892 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); 893} 894 895static __inline__ __m256i __DEFAULT_FN_ATTRS 896_mm256_broadcastw_epi16(__m128i __X) 897{ 898 return (__m256i)__builtin_shufflevector((__v8hi)__X, (__v8hi)__X, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); 899} 900 901static __inline__ __m256i __DEFAULT_FN_ATTRS 902_mm256_broadcastd_epi32(__m128i __X) 903{ 904 return (__m256i)__builtin_shufflevector((__v4si)__X, (__v4si)__X, 0, 0, 0, 0, 0, 0, 0, 0); 905} 906 907static __inline__ __m256i __DEFAULT_FN_ATTRS 908_mm256_broadcastq_epi64(__m128i __X) 909{ 910 return (__m256i)__builtin_shufflevector((__v2di)__X, (__v2di)__X, 0, 0, 0, 0); 911} 912 913static __inline__ __m128i __DEFAULT_FN_ATTRS 914_mm_broadcastb_epi8(__m128i __X) 915{ 916 return (__m128i)__builtin_shufflevector((__v16qi)__X, (__v16qi)__X, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); 917} 918 919static __inline__ __m128i __DEFAULT_FN_ATTRS 920_mm_broadcastw_epi16(__m128i __X) 921{ 922 return (__m128i)__builtin_shufflevector((__v8hi)__X, (__v8hi)__X, 0, 0, 0, 0, 0, 0, 0, 0); 923} 924 925 926static __inline__ __m128i __DEFAULT_FN_ATTRS 927_mm_broadcastd_epi32(__m128i __X) 928{ 929 return (__m128i)__builtin_shufflevector((__v4si)__X, (__v4si)__X, 0, 0, 0, 0); 930} 931 932static __inline__ __m128i __DEFAULT_FN_ATTRS 933_mm_broadcastq_epi64(__m128i __X) 934{ 935 return (__m128i)__builtin_shufflevector((__v2di)__X, (__v2di)__X, 0, 0); 936} 937 938static __inline__ __m256i __DEFAULT_FN_ATTRS 939_mm256_permutevar8x32_epi32(__m256i __a, __m256i __b) 940{ 941 return (__m256i)__builtin_ia32_permvarsi256((__v8si)__a, (__v8si)__b); 942} 943 944#define _mm256_permute4x64_pd(V, M) __extension__ ({ \ 945 (__m256d)__builtin_shufflevector((__v4df)(__m256d)(V), \ 946 (__v4df)_mm256_undefined_pd(), \ 947 ((M) >> 0) & 0x3, \ 948 ((M) >> 2) & 0x3, \ 949 ((M) >> 4) & 0x3, \ 950 ((M) >> 6) & 0x3); }) 951 952static __inline__ __m256 __DEFAULT_FN_ATTRS 953_mm256_permutevar8x32_ps(__m256 __a, __m256i __b) 954{ 955 return (__m256)__builtin_ia32_permvarsf256((__v8sf)__a, (__v8si)__b); 956} 957 958#define _mm256_permute4x64_epi64(V, M) __extension__ ({ \ 959 (__m256i)__builtin_shufflevector((__v4di)(__m256i)(V), \ 960 (__v4di)_mm256_undefined_si256(), \ 961 ((M) >> 0) & 0x3, \ 962 ((M) >> 2) & 0x3, \ 963 ((M) >> 4) & 0x3, \ 964 ((M) >> 6) & 0x3); }) 965 966#define _mm256_permute2x128_si256(V1, V2, M) __extension__ ({ \ 967 (__m256i)__builtin_ia32_permti256((__m256i)(V1), (__m256i)(V2), (M)); }) 968 969#define _mm256_extracti128_si256(V, M) __extension__ ({ \ 970 (__m128i)__builtin_shufflevector((__v4di)(__m256i)(V), \ 971 (__v4di)_mm256_undefined_si256(), \ 972 (((M) & 1) ? 2 : 0), \ 973 (((M) & 1) ? 3 : 1) ); }) 974 975#define _mm256_inserti128_si256(V1, V2, M) __extension__ ({ \ 976 (__m256i)__builtin_shufflevector((__v4di)(__m256i)(V1), \ 977 (__v4di)_mm256_castsi128_si256((__m128i)(V2)), \ 978 (((M) & 1) ? 0 : 4), \ 979 (((M) & 1) ? 1 : 5), \ 980 (((M) & 1) ? 4 : 2), \ 981 (((M) & 1) ? 5 : 3) ); }) 982 983static __inline__ __m256i __DEFAULT_FN_ATTRS 984_mm256_maskload_epi32(int const *__X, __m256i __M) 985{ 986 return (__m256i)__builtin_ia32_maskloadd256((const __v8si *)__X, (__v8si)__M); 987} 988 989static __inline__ __m256i __DEFAULT_FN_ATTRS 990_mm256_maskload_epi64(long long const *__X, __m256i __M) 991{ 992 return (__m256i)__builtin_ia32_maskloadq256((const __v4di *)__X, (__v4di)__M); 993} 994 995static __inline__ __m128i __DEFAULT_FN_ATTRS 996_mm_maskload_epi32(int const *__X, __m128i __M) 997{ 998 return (__m128i)__builtin_ia32_maskloadd((const __v4si *)__X, (__v4si)__M); 999} 1000 1001static __inline__ __m128i __DEFAULT_FN_ATTRS 1002_mm_maskload_epi64(long long const *__X, __m128i __M) 1003{ 1004 return (__m128i)__builtin_ia32_maskloadq((const __v2di *)__X, (__v2di)__M); 1005} 1006 1007static __inline__ void __DEFAULT_FN_ATTRS 1008_mm256_maskstore_epi32(int *__X, __m256i __M, __m256i __Y) 1009{ 1010 __builtin_ia32_maskstored256((__v8si *)__X, (__v8si)__M, (__v8si)__Y); 1011} 1012 1013static __inline__ void __DEFAULT_FN_ATTRS 1014_mm256_maskstore_epi64(long long *__X, __m256i __M, __m256i __Y) 1015{ 1016 __builtin_ia32_maskstoreq256((__v4di *)__X, (__v4di)__M, (__v4di)__Y); 1017} 1018 1019static __inline__ void __DEFAULT_FN_ATTRS 1020_mm_maskstore_epi32(int *__X, __m128i __M, __m128i __Y) 1021{ 1022 __builtin_ia32_maskstored((__v4si *)__X, (__v4si)__M, (__v4si)__Y); 1023} 1024 1025static __inline__ void __DEFAULT_FN_ATTRS 1026_mm_maskstore_epi64(long long *__X, __m128i __M, __m128i __Y) 1027{ 1028 __builtin_ia32_maskstoreq(( __v2di *)__X, (__v2di)__M, (__v2di)__Y); 1029} 1030 1031static __inline__ __m256i __DEFAULT_FN_ATTRS 1032_mm256_sllv_epi32(__m256i __X, __m256i __Y) 1033{ 1034 return (__m256i)__builtin_ia32_psllv8si((__v8si)__X, (__v8si)__Y); 1035} 1036 1037static __inline__ __m128i __DEFAULT_FN_ATTRS 1038_mm_sllv_epi32(__m128i __X, __m128i __Y) 1039{ 1040 return (__m128i)__builtin_ia32_psllv4si((__v4si)__X, (__v4si)__Y); 1041} 1042 1043static __inline__ __m256i __DEFAULT_FN_ATTRS 1044_mm256_sllv_epi64(__m256i __X, __m256i __Y) 1045{ 1046 return (__m256i)__builtin_ia32_psllv4di((__v4di)__X, (__v4di)__Y); 1047} 1048 1049static __inline__ __m128i __DEFAULT_FN_ATTRS 1050_mm_sllv_epi64(__m128i __X, __m128i __Y) 1051{ 1052 return (__m128i)__builtin_ia32_psllv2di((__v2di)__X, (__v2di)__Y); 1053} 1054 1055static __inline__ __m256i __DEFAULT_FN_ATTRS 1056_mm256_srav_epi32(__m256i __X, __m256i __Y) 1057{ 1058 return (__m256i)__builtin_ia32_psrav8si((__v8si)__X, (__v8si)__Y); 1059} 1060 1061static __inline__ __m128i __DEFAULT_FN_ATTRS 1062_mm_srav_epi32(__m128i __X, __m128i __Y) 1063{ 1064 return (__m128i)__builtin_ia32_psrav4si((__v4si)__X, (__v4si)__Y); 1065} 1066 1067static __inline__ __m256i __DEFAULT_FN_ATTRS 1068_mm256_srlv_epi32(__m256i __X, __m256i __Y) 1069{ 1070 return (__m256i)__builtin_ia32_psrlv8si((__v8si)__X, (__v8si)__Y); 1071} 1072 1073static __inline__ __m128i __DEFAULT_FN_ATTRS 1074_mm_srlv_epi32(__m128i __X, __m128i __Y) 1075{ 1076 return (__m128i)__builtin_ia32_psrlv4si((__v4si)__X, (__v4si)__Y); 1077} 1078 1079static __inline__ __m256i __DEFAULT_FN_ATTRS 1080_mm256_srlv_epi64(__m256i __X, __m256i __Y) 1081{ 1082 return (__m256i)__builtin_ia32_psrlv4di((__v4di)__X, (__v4di)__Y); 1083} 1084 1085static __inline__ __m128i __DEFAULT_FN_ATTRS 1086_mm_srlv_epi64(__m128i __X, __m128i __Y) 1087{ 1088 return (__m128i)__builtin_ia32_psrlv2di((__v2di)__X, (__v2di)__Y); 1089} 1090 1091#define _mm_mask_i32gather_pd(a, m, i, mask, s) __extension__ ({ \ 1092 (__m128d)__builtin_ia32_gatherd_pd((__v2df)(__m128i)(a), \ 1093 (double const *)(m), \ 1094 (__v4si)(__m128i)(i), \ 1095 (__v2df)(__m128d)(mask), (s)); }) 1096 1097#define _mm256_mask_i32gather_pd(a, m, i, mask, s) __extension__ ({ \ 1098 (__m256d)__builtin_ia32_gatherd_pd256((__v4df)(__m256d)(a), \ 1099 (double const *)(m), \ 1100 (__v4si)(__m128i)(i), \ 1101 (__v4df)(__m256d)(mask), (s)); }) 1102 1103#define _mm_mask_i64gather_pd(a, m, i, mask, s) __extension__ ({ \ 1104 (__m128d)__builtin_ia32_gatherq_pd((__v2df)(__m128d)(a), \ 1105 (double const *)(m), \ 1106 (__v2di)(__m128i)(i), \ 1107 (__v2df)(__m128d)(mask), (s)); }) 1108 1109#define _mm256_mask_i64gather_pd(a, m, i, mask, s) __extension__ ({ \ 1110 (__m256d)__builtin_ia32_gatherq_pd256((__v4df)(__m256d)(a), \ 1111 (double const *)(m), \ 1112 (__v4di)(__m256i)(i), \ 1113 (__v4df)(__m256d)(mask), (s)); }) 1114 1115#define _mm_mask_i32gather_ps(a, m, i, mask, s) __extension__ ({ \ 1116 (__m128)__builtin_ia32_gatherd_ps((__v4sf)(__m128)(a), \ 1117 (float const *)(m), \ 1118 (__v4si)(__m128i)(i), \ 1119 (__v4sf)(__m128)(mask), (s)); }) 1120 1121#define _mm256_mask_i32gather_ps(a, m, i, mask, s) __extension__ ({ \ 1122 (__m256)__builtin_ia32_gatherd_ps256((__v8sf)(__m256)(a), \ 1123 (float const *)(m), \ 1124 (__v8si)(__m256i)(i), \ 1125 (__v8sf)(__m256)(mask), (s)); }) 1126 1127#define _mm_mask_i64gather_ps(a, m, i, mask, s) __extension__ ({ \ 1128 (__m128)__builtin_ia32_gatherq_ps((__v4sf)(__m128)(a), \ 1129 (float const *)(m), \ 1130 (__v2di)(__m128i)(i), \ 1131 (__v4sf)(__m128)(mask), (s)); }) 1132 1133#define _mm256_mask_i64gather_ps(a, m, i, mask, s) __extension__ ({ \ 1134 (__m128)__builtin_ia32_gatherq_ps256((__v4sf)(__m128)(a), \ 1135 (float const *)(m), \ 1136 (__v4di)(__m256i)(i), \ 1137 (__v4sf)(__m128)(mask), (s)); }) 1138 1139#define _mm_mask_i32gather_epi32(a, m, i, mask, s) __extension__ ({ \ 1140 (__m128i)__builtin_ia32_gatherd_d((__v4si)(__m128i)(a), \ 1141 (int const *)(m), \ 1142 (__v4si)(__m128i)(i), \ 1143 (__v4si)(__m128i)(mask), (s)); }) 1144 1145#define _mm256_mask_i32gather_epi32(a, m, i, mask, s) __extension__ ({ \ 1146 (__m256i)__builtin_ia32_gatherd_d256((__v8si)(__m256i)(a), \ 1147 (int const *)(m), \ 1148 (__v8si)(__m256i)(i), \ 1149 (__v8si)(__m256i)(mask), (s)); }) 1150 1151#define _mm_mask_i64gather_epi32(a, m, i, mask, s) __extension__ ({ \ 1152 (__m128i)__builtin_ia32_gatherq_d((__v4si)(__m128i)(a), \ 1153 (int const *)(m), \ 1154 (__v2di)(__m128i)(i), \ 1155 (__v4si)(__m128i)(mask), (s)); }) 1156 1157#define _mm256_mask_i64gather_epi32(a, m, i, mask, s) __extension__ ({ \ 1158 (__m128i)__builtin_ia32_gatherq_d256((__v4si)(__m128i)(a), \ 1159 (int const *)(m), \ 1160 (__v4di)(__m256i)(i), \ 1161 (__v4si)(__m128i)(mask), (s)); }) 1162 1163#define _mm_mask_i32gather_epi64(a, m, i, mask, s) __extension__ ({ \ 1164 (__m128i)__builtin_ia32_gatherd_q((__v2di)(__m128i)(a), \ 1165 (long long const *)(m), \ 1166 (__v4si)(__m128i)(i), \ 1167 (__v2di)(__m128i)(mask), (s)); }) 1168 1169#define _mm256_mask_i32gather_epi64(a, m, i, mask, s) __extension__ ({ \ 1170 (__m256i)__builtin_ia32_gatherd_q256((__v4di)(__m256i)(a), \ 1171 (long long const *)(m), \ 1172 (__v4si)(__m128i)(i), \ 1173 (__v4di)(__m256i)(mask), (s)); }) 1174 1175#define _mm_mask_i64gather_epi64(a, m, i, mask, s) __extension__ ({ \ 1176 (__m128i)__builtin_ia32_gatherq_q((__v2di)(__m128i)(a), \ 1177 (long long const *)(m), \ 1178 (__v2di)(__m128i)(i), \ 1179 (__v2di)(__m128i)(mask), (s)); }) 1180 1181#define _mm256_mask_i64gather_epi64(a, m, i, mask, s) __extension__ ({ \ 1182 (__m256i)__builtin_ia32_gatherq_q256((__v4di)(__m256i)(a), \ 1183 (long long const *)(m), \ 1184 (__v4di)(__m256i)(i), \ 1185 (__v4di)(__m256i)(mask), (s)); }) 1186 1187#define _mm_i32gather_pd(m, i, s) __extension__ ({ \ 1188 (__m128d)__builtin_ia32_gatherd_pd((__v2df)_mm_undefined_pd(), \ 1189 (double const *)(m), \ 1190 (__v4si)(__m128i)(i), \ 1191 (__v2df)_mm_cmpeq_pd(_mm_setzero_pd(), \ 1192 _mm_setzero_pd()), \ 1193 (s)); }) 1194 1195#define _mm256_i32gather_pd(m, i, s) __extension__ ({ \ 1196 (__m256d)__builtin_ia32_gatherd_pd256((__v4df)_mm256_undefined_pd(), \ 1197 (double const *)(m), \ 1198 (__v4si)(__m128i)(i), \ 1199 (__v4df)_mm256_cmp_pd(_mm256_setzero_pd(), \ 1200 _mm256_setzero_pd(), \ 1201 _CMP_EQ_OQ), \ 1202 (s)); }) 1203 1204#define _mm_i64gather_pd(m, i, s) __extension__ ({ \ 1205 (__m128d)__builtin_ia32_gatherq_pd((__v2df)_mm_undefined_pd(), \ 1206 (double const *)(m), \ 1207 (__v2di)(__m128i)(i), \ 1208 (__v2df)_mm_cmpeq_pd(_mm_setzero_pd(), \ 1209 _mm_setzero_pd()), \ 1210 (s)); }) 1211 1212#define _mm256_i64gather_pd(m, i, s) __extension__ ({ \ 1213 (__m256d)__builtin_ia32_gatherq_pd256((__v4df)_mm256_undefined_pd(), \ 1214 (double const *)(m), \ 1215 (__v4di)(__m256i)(i), \ 1216 (__v4df)_mm256_cmp_pd(_mm256_setzero_pd(), \ 1217 _mm256_setzero_pd(), \ 1218 _CMP_EQ_OQ), \ 1219 (s)); }) 1220 1221#define _mm_i32gather_ps(m, i, s) __extension__ ({ \ 1222 (__m128)__builtin_ia32_gatherd_ps((__v4sf)_mm_undefined_ps(), \ 1223 (float const *)(m), \ 1224 (__v4si)(__m128i)(i), \ 1225 (__v4sf)_mm_cmpeq_ps(_mm_setzero_ps(), \ 1226 _mm_setzero_ps()), \ 1227 (s)); }) 1228 1229#define _mm256_i32gather_ps(m, i, s) __extension__ ({ \ 1230 (__m256)__builtin_ia32_gatherd_ps256((__v8sf)_mm256_undefined_ps(), \ 1231 (float const *)(m), \ 1232 (__v8si)(__m256i)(i), \ 1233 (__v8sf)_mm256_cmp_ps(_mm256_setzero_ps(), \ 1234 _mm256_setzero_ps(), \ 1235 _CMP_EQ_OQ), \ 1236 (s)); }) 1237 1238#define _mm_i64gather_ps(m, i, s) __extension__ ({ \ 1239 (__m128)__builtin_ia32_gatherq_ps((__v4sf)_mm_undefined_ps(), \ 1240 (float const *)(m), \ 1241 (__v2di)(__m128i)(i), \ 1242 (__v4sf)_mm_cmpeq_ps(_mm_setzero_ps(), \ 1243 _mm_setzero_ps()), \ 1244 (s)); }) 1245 1246#define _mm256_i64gather_ps(m, i, s) __extension__ ({ \ 1247 (__m128)__builtin_ia32_gatherq_ps256((__v4sf)_mm_undefined_ps(), \ 1248 (float const *)(m), \ 1249 (__v4di)(__m256i)(i), \ 1250 (__v4sf)_mm_cmpeq_ps(_mm_setzero_ps(), \ 1251 _mm_setzero_ps()), \ 1252 (s)); }) 1253 1254#define _mm_i32gather_epi32(m, i, s) __extension__ ({ \ 1255 (__m128i)__builtin_ia32_gatherd_d((__v4si)_mm_undefined_si128(), \ 1256 (int const *)(m), (__v4si)(__m128i)(i), \ 1257 (__v4si)_mm_set1_epi32(-1), (s)); }) 1258 1259#define _mm256_i32gather_epi32(m, i, s) __extension__ ({ \ 1260 (__m256i)__builtin_ia32_gatherd_d256((__v8si)_mm256_undefined_si256(), \ 1261 (int const *)(m), (__v8si)(__m256i)(i), \ 1262 (__v8si)_mm256_set1_epi32(-1), (s)); }) 1263 1264#define _mm_i64gather_epi32(m, i, s) __extension__ ({ \ 1265 (__m128i)__builtin_ia32_gatherq_d((__v4si)_mm_undefined_si128(), \ 1266 (int const *)(m), (__v2di)(__m128i)(i), \ 1267 (__v4si)_mm_set1_epi32(-1), (s)); }) 1268 1269#define _mm256_i64gather_epi32(m, i, s) __extension__ ({ \ 1270 (__m128i)__builtin_ia32_gatherq_d256((__v4si)_mm_undefined_si128(), \ 1271 (int const *)(m), (__v4di)(__m256i)(i), \ 1272 (__v4si)_mm_set1_epi32(-1), (s)); }) 1273 1274#define _mm_i32gather_epi64(m, i, s) __extension__ ({ \ 1275 (__m128i)__builtin_ia32_gatherd_q((__v2di)_mm_undefined_si128(), \ 1276 (long long const *)(m), \ 1277 (__v4si)(__m128i)(i), \ 1278 (__v2di)_mm_set1_epi64x(-1), (s)); }) 1279 1280#define _mm256_i32gather_epi64(m, i, s) __extension__ ({ \ 1281 (__m256i)__builtin_ia32_gatherd_q256((__v4di)_mm256_undefined_si256(), \ 1282 (long long const *)(m), \ 1283 (__v4si)(__m128i)(i), \ 1284 (__v4di)_mm256_set1_epi64x(-1), (s)); }) 1285 1286#define _mm_i64gather_epi64(m, i, s) __extension__ ({ \ 1287 (__m128i)__builtin_ia32_gatherq_q((__v2di)_mm_undefined_si128(), \ 1288 (long long const *)(m), \ 1289 (__v2di)(__m128i)(i), \ 1290 (__v2di)_mm_set1_epi64x(-1), (s)); }) 1291 1292#define _mm256_i64gather_epi64(m, i, s) __extension__ ({ \ 1293 (__m256i)__builtin_ia32_gatherq_q256((__v4di)_mm256_undefined_si256(), \ 1294 (long long const *)(m), \ 1295 (__v4di)(__m256i)(i), \ 1296 (__v4di)_mm256_set1_epi64x(-1), (s)); }) 1297 1298#undef __DEFAULT_FN_ATTRS 1299 1300#endif /* __AVX2INTRIN_H */ 1301