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 /* SSE4 Multiple Packed Sums of Absolute Difference. */ 29 #define _mm256_mpsadbw_epu8(X, Y, M) __builtin_ia32_mpsadbw256((X), (Y), (M)) 30 31 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 32 _mm256_abs_epi8(__m256i a) 33 { 34 return (__m256i)__builtin_ia32_pabsb256((__v32qi)a); 35 } 36 37 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 38 _mm256_abs_epi16(__m256i a) 39 { 40 return (__m256i)__builtin_ia32_pabsw256((__v16hi)a); 41 } 42 43 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 44 _mm256_abs_epi32(__m256i a) 45 { 46 return (__m256i)__builtin_ia32_pabsd256((__v8si)a); 47 } 48 49 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 50 _mm256_packs_epi16(__m256i a, __m256i b) 51 { 52 return (__m256i)__builtin_ia32_packsswb256((__v16hi)a, (__v16hi)b); 53 } 54 55 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 56 _mm256_packs_epi32(__m256i a, __m256i b) 57 { 58 return (__m256i)__builtin_ia32_packssdw256((__v8si)a, (__v8si)b); 59 } 60 61 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 62 _mm256_packus_epi16(__m256i a, __m256i b) 63 { 64 return (__m256i)__builtin_ia32_packuswb256((__v16hi)a, (__v16hi)b); 65 } 66 67 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 68 _mm256_packus_epi32(__m256i __V1, __m256i __V2) 69 { 70 return (__m256i) __builtin_ia32_packusdw256((__v8si)__V1, (__v8si)__V2); 71 } 72 73 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 74 _mm256_add_epi8(__m256i a, __m256i b) 75 { 76 return (__m256i)((__v32qi)a + (__v32qi)b); 77 } 78 79 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 80 _mm256_add_epi16(__m256i a, __m256i b) 81 { 82 return (__m256i)((__v16hi)a + (__v16hi)b); 83 } 84 85 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 86 _mm256_add_epi32(__m256i a, __m256i b) 87 { 88 return (__m256i)((__v8si)a + (__v8si)b); 89 } 90 91 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 92 _mm256_add_epi64(__m256i a, __m256i b) 93 { 94 return a + b; 95 } 96 97 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 98 _mm256_adds_epi8(__m256i a, __m256i b) 99 { 100 return (__m256i)__builtin_ia32_paddsb256((__v32qi)a, (__v32qi)b); 101 } 102 103 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 104 _mm256_adds_epi16(__m256i a, __m256i b) 105 { 106 return (__m256i)__builtin_ia32_paddsw256((__v16hi)a, (__v16hi)b); 107 } 108 109 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 110 _mm256_adds_epu8(__m256i a, __m256i b) 111 { 112 return (__m256i)__builtin_ia32_paddusb256((__v32qi)a, (__v32qi)b); 113 } 114 115 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 116 _mm256_adds_epu16(__m256i a, __m256i b) 117 { 118 return (__m256i)__builtin_ia32_paddusw256((__v16hi)a, (__v16hi)b); 119 } 120 121 #define _mm256_alignr_epi8(a, b, n) __extension__ ({ \ 122 __m256i __a = (a); \ 123 __m256i __b = (b); \ 124 (__m256i)__builtin_ia32_palignr256((__v32qi)__a, (__v32qi)__b, (n)); }) 125 126 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 127 _mm256_and_si256(__m256i a, __m256i b) 128 { 129 return a & b; 130 } 131 132 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 133 _mm256_andnot_si256(__m256i a, __m256i b) 134 { 135 return ~a & b; 136 } 137 138 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 139 _mm256_avg_epu8(__m256i a, __m256i b) 140 { 141 return (__m256i)__builtin_ia32_pavgb256((__v32qi)a, (__v32qi)b); 142 } 143 144 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 145 _mm256_avg_epu16(__m256i a, __m256i b) 146 { 147 return (__m256i)__builtin_ia32_pavgw256((__v16hi)a, (__v16hi)b); 148 } 149 150 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 151 _mm256_blendv_epi8(__m256i __V1, __m256i __V2, __m256i __M) 152 { 153 return (__m256i)__builtin_ia32_pblendvb256((__v32qi)__V1, (__v32qi)__V2, 154 (__v32qi)__M); 155 } 156 157 #define _mm256_blend_epi16(V1, V2, M) __extension__ ({ \ 158 __m256i __V1 = (V1); \ 159 __m256i __V2 = (V2); \ 160 (__m256i)__builtin_ia32_pblendw256((__v16hi)__V1, (__v16hi)__V2, (M)); }) 161 162 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 163 _mm256_cmpeq_epi8(__m256i a, __m256i b) 164 { 165 return (__m256i)((__v32qi)a == (__v32qi)b); 166 } 167 168 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 169 _mm256_cmpeq_epi16(__m256i a, __m256i b) 170 { 171 return (__m256i)((__v16hi)a == (__v16hi)b); 172 } 173 174 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 175 _mm256_cmpeq_epi32(__m256i a, __m256i b) 176 { 177 return (__m256i)((__v8si)a == (__v8si)b); 178 } 179 180 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 181 _mm256_cmpeq_epi64(__m256i a, __m256i b) 182 { 183 return (__m256i)(a == b); 184 } 185 186 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 187 _mm256_cmpgt_epi8(__m256i a, __m256i b) 188 { 189 return (__m256i)((__v32qi)a > (__v32qi)b); 190 } 191 192 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 193 _mm256_cmpgt_epi16(__m256i a, __m256i b) 194 { 195 return (__m256i)((__v16hi)a > (__v16hi)b); 196 } 197 198 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 199 _mm256_cmpgt_epi32(__m256i a, __m256i b) 200 { 201 return (__m256i)((__v8si)a > (__v8si)b); 202 } 203 204 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 205 _mm256_cmpgt_epi64(__m256i a, __m256i b) 206 { 207 return (__m256i)(a > b); 208 } 209 210 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 211 _mm256_hadd_epi16(__m256i a, __m256i b) 212 { 213 return (__m256i)__builtin_ia32_phaddw256((__v16hi)a, (__v16hi)b); 214 } 215 216 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 217 _mm256_hadd_epi32(__m256i a, __m256i b) 218 { 219 return (__m256i)__builtin_ia32_phaddd256((__v8si)a, (__v8si)b); 220 } 221 222 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 223 _mm256_hadds_epi16(__m256i a, __m256i b) 224 { 225 return (__m256i)__builtin_ia32_phaddsw256((__v16hi)a, (__v16hi)b); 226 } 227 228 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 229 _mm256_hsub_epi16(__m256i a, __m256i b) 230 { 231 return (__m256i)__builtin_ia32_phsubw256((__v16hi)a, (__v16hi)b); 232 } 233 234 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 235 _mm256_hsub_epi32(__m256i a, __m256i b) 236 { 237 return (__m256i)__builtin_ia32_phsubd256((__v8si)a, (__v8si)b); 238 } 239 240 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 241 _mm256_hsubs_epi16(__m256i a, __m256i b) 242 { 243 return (__m256i)__builtin_ia32_phsubsw256((__v16hi)a, (__v16hi)b); 244 } 245 246 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 247 _mm256_maddubs_epi16(__m256i a, __m256i b) 248 { 249 return (__m256i)__builtin_ia32_pmaddubsw256((__v32qi)a, (__v32qi)b); 250 } 251 252 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 253 _mm256_madd_epi16(__m256i a, __m256i b) 254 { 255 return (__m256i)__builtin_ia32_pmaddwd256((__v16hi)a, (__v16hi)b); 256 } 257 258 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 259 _mm256_max_epi8(__m256i a, __m256i b) 260 { 261 return (__m256i)__builtin_ia32_pmaxsb256((__v32qi)a, (__v32qi)b); 262 } 263 264 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 265 _mm256_max_epi16(__m256i a, __m256i b) 266 { 267 return (__m256i)__builtin_ia32_pmaxsw256((__v16hi)a, (__v16hi)b); 268 } 269 270 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 271 _mm256_max_epi32(__m256i a, __m256i b) 272 { 273 return (__m256i)__builtin_ia32_pmaxsd256((__v8si)a, (__v8si)b); 274 } 275 276 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 277 _mm256_max_epu8(__m256i a, __m256i b) 278 { 279 return (__m256i)__builtin_ia32_pmaxub256((__v32qi)a, (__v32qi)b); 280 } 281 282 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 283 _mm256_max_epu16(__m256i a, __m256i b) 284 { 285 return (__m256i)__builtin_ia32_pmaxuw256((__v16hi)a, (__v16hi)b); 286 } 287 288 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 289 _mm256_max_epu32(__m256i a, __m256i b) 290 { 291 return (__m256i)__builtin_ia32_pmaxud256((__v8si)a, (__v8si)b); 292 } 293 294 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 295 _mm256_min_epi8(__m256i a, __m256i b) 296 { 297 return (__m256i)__builtin_ia32_pminsb256((__v32qi)a, (__v32qi)b); 298 } 299 300 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 301 _mm256_min_epi16(__m256i a, __m256i b) 302 { 303 return (__m256i)__builtin_ia32_pminsw256((__v16hi)a, (__v16hi)b); 304 } 305 306 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 307 _mm256_min_epi32(__m256i a, __m256i b) 308 { 309 return (__m256i)__builtin_ia32_pminsd256((__v8si)a, (__v8si)b); 310 } 311 312 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 313 _mm256_min_epu8(__m256i a, __m256i b) 314 { 315 return (__m256i)__builtin_ia32_pminub256((__v32qi)a, (__v32qi)b); 316 } 317 318 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 319 _mm256_min_epu16(__m256i a, __m256i b) 320 { 321 return (__m256i)__builtin_ia32_pminuw256 ((__v16hi)a, (__v16hi)b); 322 } 323 324 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 325 _mm256_min_epu32(__m256i a, __m256i b) 326 { 327 return (__m256i)__builtin_ia32_pminud256((__v8si)a, (__v8si)b); 328 } 329 330 static __inline__ int __attribute__((__always_inline__, __nodebug__)) 331 _mm256_movemask_epi8(__m256i a) 332 { 333 return __builtin_ia32_pmovmskb256((__v32qi)a); 334 } 335 336 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 337 _mm256_cvtepi8_epi16(__m128i __V) 338 { 339 return (__m256i)__builtin_ia32_pmovsxbw256((__v16qi)__V); 340 } 341 342 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 343 _mm256_cvtepi8_epi32(__m128i __V) 344 { 345 return (__m256i)__builtin_ia32_pmovsxbd256((__v16qi)__V); 346 } 347 348 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 349 _mm256_cvtepi8_epi64(__m128i __V) 350 { 351 return (__m256i)__builtin_ia32_pmovsxbq256((__v16qi)__V); 352 } 353 354 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 355 _mm256_cvtepi16_epi32(__m128i __V) 356 { 357 return (__m256i)__builtin_ia32_pmovsxwd256((__v8hi)__V); 358 } 359 360 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 361 _mm256_cvtepi16_epi64(__m128i __V) 362 { 363 return (__m256i)__builtin_ia32_pmovsxwq256((__v8hi)__V); 364 } 365 366 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 367 _mm256_cvtepi32_epi64(__m128i __V) 368 { 369 return (__m256i)__builtin_ia32_pmovsxdq256((__v4si)__V); 370 } 371 372 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 373 _mm256_cvtepu8_epi16(__m128i __V) 374 { 375 return (__m256i)__builtin_ia32_pmovzxbw256((__v16qi)__V); 376 } 377 378 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 379 _mm256_cvtepu8_epi32(__m128i __V) 380 { 381 return (__m256i)__builtin_ia32_pmovzxbd256((__v16qi)__V); 382 } 383 384 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 385 _mm256_cvtepu8_epi64(__m128i __V) 386 { 387 return (__m256i)__builtin_ia32_pmovzxbq256((__v16qi)__V); 388 } 389 390 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 391 _mm256_cvtepu16_epi32(__m128i __V) 392 { 393 return (__m256i)__builtin_ia32_pmovzxwd256((__v8hi)__V); 394 } 395 396 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 397 _mm256_cvtepu16_epi64(__m128i __V) 398 { 399 return (__m256i)__builtin_ia32_pmovzxwq256((__v8hi)__V); 400 } 401 402 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 403 _mm256_cvtepu32_epi64(__m128i __V) 404 { 405 return (__m256i)__builtin_ia32_pmovzxdq256((__v4si)__V); 406 } 407 408 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 409 _mm256_mul_epi32(__m256i a, __m256i b) 410 { 411 return (__m256i)__builtin_ia32_pmuldq256((__v8si)a, (__v8si)b); 412 } 413 414 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 415 _mm256_mulhrs_epi16(__m256i a, __m256i b) 416 { 417 return (__m256i)__builtin_ia32_pmulhrsw256((__v16hi)a, (__v16hi)b); 418 } 419 420 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 421 _mm256_mulhi_epu16(__m256i a, __m256i b) 422 { 423 return (__m256i)__builtin_ia32_pmulhuw256((__v16hi)a, (__v16hi)b); 424 } 425 426 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 427 _mm256_mulhi_epi16(__m256i a, __m256i b) 428 { 429 return (__m256i)__builtin_ia32_pmulhw256((__v16hi)a, (__v16hi)b); 430 } 431 432 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 433 _mm256_mullo_epi16(__m256i a, __m256i b) 434 { 435 return (__m256i)((__v16hi)a * (__v16hi)b); 436 } 437 438 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 439 _mm256_mullo_epi32 (__m256i a, __m256i b) 440 { 441 return (__m256i)((__v8si)a * (__v8si)b); 442 } 443 444 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 445 _mm256_mul_epu32(__m256i a, __m256i b) 446 { 447 return __builtin_ia32_pmuludq256((__v8si)a, (__v8si)b); 448 } 449 450 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 451 _mm256_or_si256(__m256i a, __m256i b) 452 { 453 return a | b; 454 } 455 456 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 457 _mm256_sad_epu8(__m256i a, __m256i b) 458 { 459 return __builtin_ia32_psadbw256((__v32qi)a, (__v32qi)b); 460 } 461 462 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 463 _mm256_shuffle_epi8(__m256i a, __m256i b) 464 { 465 return (__m256i)__builtin_ia32_pshufb256((__v32qi)a, (__v32qi)b); 466 } 467 468 #define _mm256_shuffle_epi32(a, imm) __extension__ ({ \ 469 __m256i __a = (a); \ 470 (__m256i)__builtin_shufflevector((__v8si)__a, (__v8si)_mm256_set1_epi32(0), \ 471 (imm) & 0x3, ((imm) & 0xc) >> 2, \ 472 ((imm) & 0x30) >> 4, ((imm) & 0xc0) >> 6, \ 473 4 + (((imm) & 0x03) >> 0), \ 474 4 + (((imm) & 0x0c) >> 2), \ 475 4 + (((imm) & 0x30) >> 4), \ 476 4 + (((imm) & 0xc0) >> 6)); }) 477 478 #define _mm256_shufflehi_epi16(a, imm) __extension__ ({ \ 479 __m256i __a = (a); \ 480 (__m256i)__builtin_shufflevector((__v16hi)__a, (__v16hi)_mm256_set1_epi16(0), \ 481 0, 1, 2, 3, \ 482 4 + (((imm) & 0x03) >> 0), \ 483 4 + (((imm) & 0x0c) >> 2), \ 484 4 + (((imm) & 0x30) >> 4), \ 485 4 + (((imm) & 0xc0) >> 6), \ 486 8, 9, 10, 11, \ 487 12 + (((imm) & 0x03) >> 0), \ 488 12 + (((imm) & 0x0c) >> 2), \ 489 12 + (((imm) & 0x30) >> 4), \ 490 12 + (((imm) & 0xc0) >> 6)); }) 491 492 #define _mm256_shufflelo_epi16(a, imm) __extension__ ({ \ 493 __m256i __a = (a); \ 494 (__m256i)__builtin_shufflevector((__v16hi)__a, (__v16hi)_mm256_set1_epi16(0), \ 495 (imm) & 0x3,((imm) & 0xc) >> 2, \ 496 ((imm) & 0x30) >> 4, ((imm) & 0xc0) >> 6, \ 497 4, 5, 6, 7, \ 498 8 + (((imm) & 0x03) >> 0), \ 499 8 + (((imm) & 0x0c) >> 2), \ 500 8 + (((imm) & 0x30) >> 4), \ 501 8 + (((imm) & 0xc0) >> 6), \ 502 12, 13, 14, 15); }) 503 504 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 505 _mm256_sign_epi8(__m256i a, __m256i b) 506 { 507 return (__m256i)__builtin_ia32_psignb256((__v32qi)a, (__v32qi)b); 508 } 509 510 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 511 _mm256_sign_epi16(__m256i a, __m256i b) 512 { 513 return (__m256i)__builtin_ia32_psignw256((__v16hi)a, (__v16hi)b); 514 } 515 516 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 517 _mm256_sign_epi32(__m256i a, __m256i b) 518 { 519 return (__m256i)__builtin_ia32_psignd256((__v8si)a, (__v8si)b); 520 } 521 522 #define _mm256_slli_si256(a, count) __extension__ ({ \ 523 __m256i __a = (a); \ 524 (__m256i)__builtin_ia32_pslldqi256(__a, (count)*8); }) 525 526 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 527 _mm256_slli_epi16(__m256i a, int count) 528 { 529 return (__m256i)__builtin_ia32_psllwi256((__v16hi)a, count); 530 } 531 532 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 533 _mm256_sll_epi16(__m256i a, __m128i count) 534 { 535 return (__m256i)__builtin_ia32_psllw256((__v16hi)a, (__v8hi)count); 536 } 537 538 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 539 _mm256_slli_epi32(__m256i a, int count) 540 { 541 return (__m256i)__builtin_ia32_pslldi256((__v8si)a, count); 542 } 543 544 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 545 _mm256_sll_epi32(__m256i a, __m128i count) 546 { 547 return (__m256i)__builtin_ia32_pslld256((__v8si)a, (__v4si)count); 548 } 549 550 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 551 _mm256_slli_epi64(__m256i a, int count) 552 { 553 return __builtin_ia32_psllqi256(a, count); 554 } 555 556 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 557 _mm256_sll_epi64(__m256i a, __m128i count) 558 { 559 return __builtin_ia32_psllq256(a, count); 560 } 561 562 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 563 _mm256_srai_epi16(__m256i a, int count) 564 { 565 return (__m256i)__builtin_ia32_psrawi256((__v16hi)a, count); 566 } 567 568 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 569 _mm256_sra_epi16(__m256i a, __m128i count) 570 { 571 return (__m256i)__builtin_ia32_psraw256((__v16hi)a, (__v8hi)count); 572 } 573 574 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 575 _mm256_srai_epi32(__m256i a, int count) 576 { 577 return (__m256i)__builtin_ia32_psradi256((__v8si)a, count); 578 } 579 580 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 581 _mm256_sra_epi32(__m256i a, __m128i count) 582 { 583 return (__m256i)__builtin_ia32_psrad256((__v8si)a, (__v4si)count); 584 } 585 586 #define _mm256_srli_si256(a, count) __extension__ ({ \ 587 __m256i __a = (a); \ 588 (__m256i)__builtin_ia32_psrldqi256(__a, (count)*8); }) 589 590 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 591 _mm256_srli_epi16(__m256i a, int count) 592 { 593 return (__m256i)__builtin_ia32_psrlwi256((__v16hi)a, count); 594 } 595 596 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 597 _mm256_srl_epi16(__m256i a, __m128i count) 598 { 599 return (__m256i)__builtin_ia32_psrlw256((__v16hi)a, (__v8hi)count); 600 } 601 602 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 603 _mm256_srli_epi32(__m256i a, int count) 604 { 605 return (__m256i)__builtin_ia32_psrldi256((__v8si)a, count); 606 } 607 608 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 609 _mm256_srl_epi32(__m256i a, __m128i count) 610 { 611 return (__m256i)__builtin_ia32_psrld256((__v8si)a, (__v4si)count); 612 } 613 614 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 615 _mm256_srli_epi64(__m256i a, int count) 616 { 617 return __builtin_ia32_psrlqi256(a, count); 618 } 619 620 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 621 _mm256_srl_epi64(__m256i a, __m128i count) 622 { 623 return __builtin_ia32_psrlq256(a, count); 624 } 625 626 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 627 _mm256_sub_epi8(__m256i a, __m256i b) 628 { 629 return (__m256i)((__v32qi)a - (__v32qi)b); 630 } 631 632 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 633 _mm256_sub_epi16(__m256i a, __m256i b) 634 { 635 return (__m256i)((__v16hi)a - (__v16hi)b); 636 } 637 638 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 639 _mm256_sub_epi32(__m256i a, __m256i b) 640 { 641 return (__m256i)((__v8si)a - (__v8si)b); 642 } 643 644 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 645 _mm256_sub_epi64(__m256i a, __m256i b) 646 { 647 return a - b; 648 } 649 650 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 651 _mm256_subs_epi8(__m256i a, __m256i b) 652 { 653 return (__m256i)__builtin_ia32_psubsb256((__v32qi)a, (__v32qi)b); 654 } 655 656 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 657 _mm256_subs_epi16(__m256i a, __m256i b) 658 { 659 return (__m256i)__builtin_ia32_psubsw256((__v16hi)a, (__v16hi)b); 660 } 661 662 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 663 _mm256_subs_epu8(__m256i a, __m256i b) 664 { 665 return (__m256i)__builtin_ia32_psubusb256((__v32qi)a, (__v32qi)b); 666 } 667 668 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 669 _mm256_subs_epu16(__m256i a, __m256i b) 670 { 671 return (__m256i)__builtin_ia32_psubusw256((__v16hi)a, (__v16hi)b); 672 } 673 674 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 675 _mm256_unpackhi_epi8(__m256i a, __m256i b) 676 { 677 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); 678 } 679 680 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 681 _mm256_unpackhi_epi16(__m256i a, __m256i b) 682 { 683 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); 684 } 685 686 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 687 _mm256_unpackhi_epi32(__m256i a, __m256i b) 688 { 689 return (__m256i)__builtin_shufflevector((__v8si)a, (__v8si)b, 2, 8+2, 3, 8+3, 6, 8+6, 7, 8+7); 690 } 691 692 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 693 _mm256_unpackhi_epi64(__m256i a, __m256i b) 694 { 695 return (__m256i)__builtin_shufflevector(a, b, 1, 4+1, 3, 4+3); 696 } 697 698 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 699 _mm256_unpacklo_epi8(__m256i a, __m256i b) 700 { 701 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); 702 } 703 704 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 705 _mm256_unpacklo_epi16(__m256i a, __m256i b) 706 { 707 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); 708 } 709 710 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 711 _mm256_unpacklo_epi32(__m256i a, __m256i b) 712 { 713 return (__m256i)__builtin_shufflevector((__v8si)a, (__v8si)b, 0, 8+0, 1, 8+1, 4, 8+4, 5, 8+5); 714 } 715 716 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 717 _mm256_unpacklo_epi64(__m256i a, __m256i b) 718 { 719 return (__m256i)__builtin_shufflevector(a, b, 0, 4+0, 2, 4+2); 720 } 721 722 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 723 _mm256_xor_si256(__m256i a, __m256i b) 724 { 725 return a ^ b; 726 } 727 728 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 729 _mm256_stream_load_si256(__m256i *__V) 730 { 731 return (__m256i)__builtin_ia32_movntdqa256((__v4di *)__V); 732 } 733 734 static __inline__ __m128 __attribute__((__always_inline__, __nodebug__)) 735 _mm_broadcastss_ps(__m128 __X) 736 { 737 return (__m128)__builtin_ia32_vbroadcastss_ps((__v4sf)__X); 738 } 739 740 static __inline__ __m256 __attribute__((__always_inline__, __nodebug__)) 741 _mm256_broadcastss_ps(__m128 __X) 742 { 743 return (__m256)__builtin_ia32_vbroadcastss_ps256((__v4sf)__X); 744 } 745 746 static __inline__ __m256d __attribute__((__always_inline__, __nodebug__)) 747 _mm256_broadcastsd_pd(__m128d __X) 748 { 749 return (__m256d)__builtin_ia32_vbroadcastsd_pd256((__v2df)__X); 750 } 751 752 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 753 _mm_broadcastsi128_si256(__m128i const *a) 754 { 755 return (__m256i)__builtin_ia32_vbroadcastsi256(a); 756 } 757 758 #define _mm_blend_epi32(V1, V2, M) __extension__ ({ \ 759 __m128i __V1 = (V1); \ 760 __m128i __V2 = (V2); \ 761 (__m128i)__builtin_ia32_pblendd128((__v4si)__V1, (__v4si)__V2, (M)); }) 762 763 #define _mm256_blend_epi32(V1, V2, M) __extension__ ({ \ 764 __m256i __V1 = (V1); \ 765 __m256i __V2 = (V2); \ 766 (__m256i)__builtin_ia32_pblendd256((__v8si)__V1, (__v8si)__V2, (M)); }) 767 768 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 769 _mm256_broadcastb_epi8(__m128i __X) 770 { 771 return (__m256i)__builtin_ia32_pbroadcastb256((__v16qi)__X); 772 } 773 774 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 775 _mm256_broadcastw_epi16(__m128i __X) 776 { 777 return (__m256i)__builtin_ia32_pbroadcastw256((__v8hi)__X); 778 } 779 780 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 781 _mm256_broadcastd_epi32(__m128i __X) 782 { 783 return (__m256i)__builtin_ia32_pbroadcastd256((__v4si)__X); 784 } 785 786 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 787 _mm256_broadcastq_epi64(__m128i __X) 788 { 789 return (__m256i)__builtin_ia32_pbroadcastq256(__X); 790 } 791 792 static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) 793 _mm_broadcastb_epi8(__m128i __X) 794 { 795 return (__m128i)__builtin_ia32_pbroadcastb128((__v16qi)__X); 796 } 797 798 static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) 799 _mm_broadcastw_epi16(__m128i __X) 800 { 801 return (__m128i)__builtin_ia32_pbroadcastw128((__v8hi)__X); 802 } 803 804 805 static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) 806 _mm_broadcastd_epi32(__m128i __X) 807 { 808 return (__m128i)__builtin_ia32_pbroadcastd128((__v4si)__X); 809 } 810 811 static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) 812 _mm_broadcastq_epi64(__m128i __X) 813 { 814 return (__m128i)__builtin_ia32_pbroadcastq128(__X); 815 } 816 817 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 818 _mm256_permutevar8x32_epi32(__m256i a, __m256i b) 819 { 820 return (__m256i)__builtin_ia32_permvarsi256((__v8si)a, (__v8si)b); 821 } 822 823 #define _mm256_permute4x64_pd(V, M) __extension__ ({ \ 824 __m256d __V = (V); \ 825 (__m256d)__builtin_shufflevector((__v4df)__V, (__v4df) _mm256_setzero_pd(), \ 826 (M) & 0x3, ((M) & 0xc) >> 2, \ 827 ((M) & 0x30) >> 4, ((M) & 0xc0) >> 6); }) 828 829 static __inline__ __m256 __attribute__((__always_inline__, __nodebug__)) 830 _mm256_permutevar8x32_ps(__m256 a, __m256 b) 831 { 832 return (__m256)__builtin_ia32_permvarsf256((__v8sf)a, (__v8sf)b); 833 } 834 835 #define _mm256_permute4x64_epi64(V, M) __extension__ ({ \ 836 __m256i __V = (V); \ 837 (__m256i)__builtin_shufflevector((__v4di)__V, (__v4di) _mm256_setzero_si256(), \ 838 (M) & 0x3, ((M) & 0xc) >> 2, \ 839 ((M) & 0x30) >> 4, ((M) & 0xc0) >> 6); }) 840 841 #define _mm256_permute2x128_si256(V1, V2, M) __extension__ ({ \ 842 __m256i __V1 = (V1); \ 843 __m256i __V2 = (V2); \ 844 (__m256i)__builtin_ia32_permti256(__V1, __V2, (M)); }) 845 846 #define _mm256_extracti128_si256(A, O) __extension__ ({ \ 847 __m256i __A = (A); \ 848 (__m128i)__builtin_ia32_extract128i256(__A, (O)); }) 849 850 #define _mm256_inserti128_si256(V1, V2, O) __extension__ ({ \ 851 __m256i __V1 = (V1); \ 852 __m128i __V2 = (V2); \ 853 (__m256i)__builtin_ia32_insert128i256(__V1, __V2, (O)); }) 854 855 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 856 _mm256_maskload_epi32(int const *__X, __m256i __M) 857 { 858 return (__m256i)__builtin_ia32_maskloadd256((const __v8si *)__X, (__v8si)__M); 859 } 860 861 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 862 _mm256_maskload_epi64(long long const *__X, __m256i __M) 863 { 864 return (__m256i)__builtin_ia32_maskloadq256((const __v4di *)__X, __M); 865 } 866 867 static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) 868 _mm_maskload_epi32(int const *__X, __m128i __M) 869 { 870 return (__m128i)__builtin_ia32_maskloadd((const __v4si *)__X, (__v4si)__M); 871 } 872 873 static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) 874 _mm_maskload_epi64(long long const *__X, __m128i __M) 875 { 876 return (__m128i)__builtin_ia32_maskloadq((const __v2di *)__X, (__v2di)__M); 877 } 878 879 static __inline__ void __attribute__((__always_inline__, __nodebug__)) 880 _mm256_maskstore_epi32(int *__X, __m256i __M, __m256i __Y) 881 { 882 __builtin_ia32_maskstored256((__v8si *)__X, (__v8si)__M, (__v8si)__Y); 883 } 884 885 static __inline__ void __attribute__((__always_inline__, __nodebug__)) 886 _mm256_maskstore_epi64(long long *__X, __m256i __M, __m256i __Y) 887 { 888 __builtin_ia32_maskstoreq256((__v4di *)__X, __M, __Y); 889 } 890 891 static __inline__ void __attribute__((__always_inline__, __nodebug__)) 892 _mm_maskstore_epi32(int *__X, __m128i __M, __m128i __Y) 893 { 894 __builtin_ia32_maskstored((__v4si *)__X, (__v4si)__M, (__v4si)__Y); 895 } 896 897 static __inline__ void __attribute__((__always_inline__, __nodebug__)) 898 _mm_maskstore_epi64(long long *__X, __m128i __M, __m128i __Y) 899 { 900 __builtin_ia32_maskstoreq(( __v2di *)__X, __M, __Y); 901 } 902 903 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 904 _mm256_sllv_epi32(__m256i __X, __m256i __Y) 905 { 906 return (__m256i)__builtin_ia32_psllv8si((__v8si)__X, (__v8si)__Y); 907 } 908 909 static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) 910 _mm_sllv_epi32(__m128i __X, __m128i __Y) 911 { 912 return (__m128i)__builtin_ia32_psllv4si((__v4si)__X, (__v4si)__Y); 913 } 914 915 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 916 _mm256_sllv_epi64(__m256i __X, __m256i __Y) 917 { 918 return (__m256i)__builtin_ia32_psllv4di(__X, __Y); 919 } 920 921 static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) 922 _mm_sllv_epi64(__m128i __X, __m128i __Y) 923 { 924 return (__m128i)__builtin_ia32_psllv2di(__X, __Y); 925 } 926 927 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 928 _mm256_srav_epi32(__m256i __X, __m256i __Y) 929 { 930 return (__m256i)__builtin_ia32_psrav8si((__v8si)__X, (__v8si)__Y); 931 } 932 933 static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) 934 _mm_srav_epi32(__m128i __X, __m128i __Y) 935 { 936 return (__m128i)__builtin_ia32_psrav4si((__v4si)__X, (__v4si)__Y); 937 } 938 939 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 940 _mm256_srlv_epi32(__m256i __X, __m256i __Y) 941 { 942 return (__m256i)__builtin_ia32_psrlv8si((__v8si)__X, (__v8si)__Y); 943 } 944 945 static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) 946 _mm_srlv_epi32(__m128i __X, __m128i __Y) 947 { 948 return (__m128i)__builtin_ia32_psrlv4si((__v4si)__X, (__v4si)__Y); 949 } 950 951 static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) 952 _mm256_srlv_epi64(__m256i __X, __m256i __Y) 953 { 954 return (__m256i)__builtin_ia32_psrlv4di(__X, __Y); 955 } 956 957 static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) 958 _mm_srlv_epi64(__m128i __X, __m128i __Y) 959 { 960 return (__m128i)__builtin_ia32_psrlv2di(__X, __Y); 961 } 962