1/*===---- avx512fintrin.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#ifndef __IMMINTRIN_H 24#error "Never use <avx512fintrin.h> directly; include <immintrin.h> instead." 25#endif 26 27#ifndef __AVX512FINTRIN_H 28#define __AVX512FINTRIN_H 29 30typedef double __v8df __attribute__((__vector_size__(64))); 31typedef float __v16sf __attribute__((__vector_size__(64))); 32typedef long long __v8di __attribute__((__vector_size__(64))); 33typedef int __v16si __attribute__((__vector_size__(64))); 34 35typedef float __m512 __attribute__((__vector_size__(64))); 36typedef double __m512d __attribute__((__vector_size__(64))); 37typedef long long __m512i __attribute__((__vector_size__(64))); 38 39typedef unsigned char __mmask8; 40typedef unsigned short __mmask16; 41 42/* Rounding mode macros. */ 43#define _MM_FROUND_TO_NEAREST_INT 0x00 44#define _MM_FROUND_TO_NEG_INF 0x01 45#define _MM_FROUND_TO_POS_INF 0x02 46#define _MM_FROUND_TO_ZERO 0x03 47#define _MM_FROUND_CUR_DIRECTION 0x04 48 49/* Create vectors with repeated elements */ 50 51static __inline __m512i __attribute__ ((__always_inline__, __nodebug__)) 52_mm512_setzero_si512(void) 53{ 54 return (__m512i)(__v8di){ 0, 0, 0, 0, 0, 0, 0, 0 }; 55} 56 57static __inline __m512i __attribute__ ((__always_inline__, __nodebug__)) 58_mm512_maskz_set1_epi32(__mmask16 __M, int __A) 59{ 60 return (__m512i) __builtin_ia32_pbroadcastd512_gpr_mask (__A, 61 (__v16si) 62 _mm512_setzero_si512 (), 63 __M); 64} 65 66static __inline __m512i __attribute__ ((__always_inline__, __nodebug__)) 67_mm512_maskz_set1_epi64(__mmask8 __M, long long __A) 68{ 69#ifdef __x86_64__ 70 return (__m512i) __builtin_ia32_pbroadcastq512_gpr_mask (__A, 71 (__v8di) 72 _mm512_setzero_si512 (), 73 __M); 74#else 75 return (__m512i) __builtin_ia32_pbroadcastq512_mem_mask (__A, 76 (__v8di) 77 _mm512_setzero_si512 (), 78 __M); 79#endif 80} 81 82static __inline __m512 __attribute__ ((__always_inline__, __nodebug__)) 83_mm512_setzero_ps(void) 84{ 85 return (__m512){ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 86 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; 87} 88static __inline __m512d __attribute__ ((__always_inline__, __nodebug__)) 89_mm512_setzero_pd(void) 90{ 91 return (__m512d){ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; 92} 93 94static __inline __m512 __attribute__((__always_inline__, __nodebug__)) 95_mm512_set1_ps(float __w) 96{ 97 return (__m512){ __w, __w, __w, __w, __w, __w, __w, __w, 98 __w, __w, __w, __w, __w, __w, __w, __w }; 99} 100 101static __inline __m512d __attribute__((__always_inline__, __nodebug__)) 102_mm512_set1_pd(double __w) 103{ 104 return (__m512d){ __w, __w, __w, __w, __w, __w, __w, __w }; 105} 106 107static __inline __m512i __attribute__((__always_inline__, __nodebug__)) 108_mm512_set1_epi32(int __s) 109{ 110 return (__m512i)(__v16si){ __s, __s, __s, __s, __s, __s, __s, __s, 111 __s, __s, __s, __s, __s, __s, __s, __s }; 112} 113 114static __inline __m512i __attribute__((__always_inline__, __nodebug__)) 115_mm512_set1_epi64(long long __d) 116{ 117 return (__m512i)(__v8di){ __d, __d, __d, __d, __d, __d, __d, __d }; 118} 119 120static __inline__ __m512 __attribute__((__always_inline__, __nodebug__)) 121_mm512_broadcastss_ps(__m128 __X) 122{ 123 float __f = __X[0]; 124 return (__v16sf){ __f, __f, __f, __f, 125 __f, __f, __f, __f, 126 __f, __f, __f, __f, 127 __f, __f, __f, __f }; 128} 129 130static __inline__ __m512d __attribute__((__always_inline__, __nodebug__)) 131_mm512_broadcastsd_pd(__m128d __X) 132{ 133 double __d = __X[0]; 134 return (__v8df){ __d, __d, __d, __d, 135 __d, __d, __d, __d }; 136} 137 138/* Cast between vector types */ 139 140static __inline __m512d __attribute__((__always_inline__, __nodebug__)) 141_mm512_castpd256_pd512(__m256d __a) 142{ 143 return __builtin_shufflevector(__a, __a, 0, 1, 2, 3, -1, -1, -1, -1); 144} 145 146static __inline __m512 __attribute__((__always_inline__, __nodebug__)) 147_mm512_castps256_ps512(__m256 __a) 148{ 149 return __builtin_shufflevector(__a, __a, 0, 1, 2, 3, 4, 5, 6, 7, 150 -1, -1, -1, -1, -1, -1, -1, -1); 151} 152 153static __inline __m128d __attribute__((__always_inline__, __nodebug__)) 154_mm512_castpd512_pd128(__m512d __a) 155{ 156 return __builtin_shufflevector(__a, __a, 0, 1); 157} 158 159static __inline __m128 __attribute__((__always_inline__, __nodebug__)) 160_mm512_castps512_ps128(__m512 __a) 161{ 162 return __builtin_shufflevector(__a, __a, 0, 1, 2, 3); 163} 164 165/* Bitwise operators */ 166static __inline__ __m512i __attribute__((__always_inline__, __nodebug__)) 167_mm512_and_epi32(__m512i __a, __m512i __b) 168{ 169 return __a & __b; 170} 171 172static __inline__ __m512i __attribute__((__always_inline__, __nodebug__)) 173_mm512_mask_and_epi32(__m512i __src, __mmask16 __k, __m512i __a, __m512i __b) 174{ 175 return (__m512i) __builtin_ia32_pandd512_mask((__v16si) __a, 176 (__v16si) __b, 177 (__v16si) __src, 178 (__mmask16) __k); 179} 180static __inline__ __m512i __attribute__((__always_inline__, __nodebug__)) 181_mm512_maskz_and_epi32(__mmask16 __k, __m512i __a, __m512i __b) 182{ 183 return (__m512i) __builtin_ia32_pandd512_mask((__v16si) __a, 184 (__v16si) __b, 185 (__v16si) 186 _mm512_setzero_si512 (), 187 (__mmask16) __k); 188} 189 190static __inline__ __m512i __attribute__((__always_inline__, __nodebug__)) 191_mm512_and_epi64(__m512i __a, __m512i __b) 192{ 193 return __a & __b; 194} 195 196static __inline__ __m512i __attribute__((__always_inline__, __nodebug__)) 197_mm512_mask_and_epi64(__m512i __src, __mmask8 __k, __m512i __a, __m512i __b) 198{ 199 return (__m512i) __builtin_ia32_pandq512_mask ((__v8di) __a, 200 (__v8di) __b, 201 (__v8di) __src, 202 (__mmask8) __k); 203} 204static __inline__ __m512i __attribute__((__always_inline__, __nodebug__)) 205_mm512_maskz_and_epi64(__mmask8 __k, __m512i __a, __m512i __b) 206{ 207 return (__m512i) __builtin_ia32_pandq512_mask ((__v8di) __a, 208 (__v8di) __b, 209 (__v8di) 210 _mm512_setzero_si512 (), 211 (__mmask8) __k); 212} 213 214static __inline__ __m512i __attribute__((__always_inline__, __nodebug__)) 215_mm512_or_epi32(__m512i __a, __m512i __b) 216{ 217 return __a | __b; 218} 219 220static __inline__ __m512i __attribute__((__always_inline__, __nodebug__)) 221_mm512_mask_or_epi32(__m512i __src, __mmask16 __k, __m512i __a, __m512i __b) 222{ 223 return (__m512i) __builtin_ia32_pord512_mask((__v16si) __a, 224 (__v16si) __b, 225 (__v16si) __src, 226 (__mmask16) __k); 227} 228static __inline__ __m512i __attribute__((__always_inline__, __nodebug__)) 229_mm512_maskz_or_epi32(__mmask16 __k, __m512i __a, __m512i __b) 230{ 231 return (__m512i) __builtin_ia32_pord512_mask((__v16si) __a, 232 (__v16si) __b, 233 (__v16si) 234 _mm512_setzero_si512 (), 235 (__mmask16) __k); 236} 237 238static __inline__ __m512i __attribute__((__always_inline__, __nodebug__)) 239_mm512_or_epi64(__m512i __a, __m512i __b) 240{ 241 return __a | __b; 242} 243 244static __inline__ __m512i __attribute__((__always_inline__, __nodebug__)) 245_mm512_mask_or_epi64(__m512i __src, __mmask8 __k, __m512i __a, __m512i __b) 246{ 247 return (__m512i) __builtin_ia32_porq512_mask ((__v8di) __a, 248 (__v8di) __b, 249 (__v8di) __src, 250 (__mmask8) __k); 251} 252static __inline__ __m512i __attribute__((__always_inline__, __nodebug__)) 253_mm512_maskz_or_epi64(__mmask8 __k, __m512i __a, __m512i __b) 254{ 255 return (__m512i) __builtin_ia32_porq512_mask ((__v8di) __a, 256 (__v8di) __b, 257 (__v8di) 258 _mm512_setzero_si512 (), 259 (__mmask8) __k); 260} 261 262static __inline__ __m512i __attribute__((__always_inline__, __nodebug__)) 263_mm512_xor_epi32(__m512i __a, __m512i __b) 264{ 265 return __a ^ __b; 266} 267 268static __inline__ __m512i __attribute__((__always_inline__, __nodebug__)) 269_mm512_mask_xor_epi32(__m512i __src, __mmask16 __k, __m512i __a, __m512i __b) 270{ 271 return (__m512i) __builtin_ia32_pxord512_mask((__v16si) __a, 272 (__v16si) __b, 273 (__v16si) __src, 274 (__mmask16) __k); 275} 276static __inline__ __m512i __attribute__((__always_inline__, __nodebug__)) 277_mm512_maskz_xor_epi32(__mmask16 __k, __m512i __a, __m512i __b) 278{ 279 return (__m512i) __builtin_ia32_pxord512_mask((__v16si) __a, 280 (__v16si) __b, 281 (__v16si) 282 _mm512_setzero_si512 (), 283 (__mmask16) __k); 284} 285 286static __inline__ __m512i __attribute__((__always_inline__, __nodebug__)) 287_mm512_xor_epi64(__m512i __a, __m512i __b) 288{ 289 return __a ^ __b; 290} 291 292static __inline__ __m512i __attribute__((__always_inline__, __nodebug__)) 293_mm512_mask_xor_epi64(__m512i __src, __mmask8 __k, __m512i __a, __m512i __b) 294{ 295 return (__m512i) __builtin_ia32_pxorq512_mask ((__v8di) __a, 296 (__v8di) __b, 297 (__v8di) __src, 298 (__mmask8) __k); 299} 300static __inline__ __m512i __attribute__((__always_inline__, __nodebug__)) 301_mm512_maskz_xor_epi64(__mmask8 __k, __m512i __a, __m512i __b) 302{ 303 return (__m512i) __builtin_ia32_pxorq512_mask ((__v8di) __a, 304 (__v8di) __b, 305 (__v8di) 306 _mm512_setzero_si512 (), 307 (__mmask8) __k); 308} 309 310static __inline__ __m512i __attribute__((__always_inline__, __nodebug__)) 311_mm512_and_si512(__m512i __a, __m512i __b) 312{ 313 return __a & __b; 314} 315 316static __inline__ __m512i __attribute__((__always_inline__, __nodebug__)) 317_mm512_or_si512(__m512i __a, __m512i __b) 318{ 319 return __a | __b; 320} 321 322static __inline__ __m512i __attribute__((__always_inline__, __nodebug__)) 323_mm512_xor_si512(__m512i __a, __m512i __b) 324{ 325 return __a ^ __b; 326} 327/* Arithmetic */ 328 329static __inline __m512d __attribute__((__always_inline__, __nodebug__)) 330_mm512_add_pd(__m512d __a, __m512d __b) 331{ 332 return __a + __b; 333} 334 335static __inline __m512 __attribute__((__always_inline__, __nodebug__)) 336_mm512_add_ps(__m512 __a, __m512 __b) 337{ 338 return __a + __b; 339} 340 341static __inline __m512d __attribute__((__always_inline__, __nodebug__)) 342_mm512_mul_pd(__m512d __a, __m512d __b) 343{ 344 return __a * __b; 345} 346 347static __inline __m512 __attribute__((__always_inline__, __nodebug__)) 348_mm512_mul_ps(__m512 __a, __m512 __b) 349{ 350 return __a * __b; 351} 352 353static __inline __m512d __attribute__((__always_inline__, __nodebug__)) 354_mm512_sub_pd(__m512d __a, __m512d __b) 355{ 356 return __a - __b; 357} 358 359static __inline __m512 __attribute__((__always_inline__, __nodebug__)) 360_mm512_sub_ps(__m512 __a, __m512 __b) 361{ 362 return __a - __b; 363} 364 365static __inline__ __m512d __attribute__((__always_inline__, __nodebug__)) 366_mm512_max_pd(__m512d __A, __m512d __B) 367{ 368 return (__m512d) __builtin_ia32_maxpd512_mask ((__v8df) __A, 369 (__v8df) __B, 370 (__v8df) 371 _mm512_setzero_pd (), 372 (__mmask8) -1, 373 _MM_FROUND_CUR_DIRECTION); 374} 375 376static __inline__ __m512 __attribute__((__always_inline__, __nodebug__)) 377_mm512_max_ps(__m512 __A, __m512 __B) 378{ 379 return (__m512) __builtin_ia32_maxps512_mask ((__v16sf) __A, 380 (__v16sf) __B, 381 (__v16sf) 382 _mm512_setzero_ps (), 383 (__mmask16) -1, 384 _MM_FROUND_CUR_DIRECTION); 385} 386 387static __inline __m512i 388__attribute__ ((__always_inline__, __nodebug__)) 389_mm512_max_epi32(__m512i __A, __m512i __B) 390{ 391 return (__m512i) __builtin_ia32_pmaxsd512_mask ((__v16si) __A, 392 (__v16si) __B, 393 (__v16si) 394 _mm512_setzero_si512 (), 395 (__mmask16) -1); 396} 397 398static __inline __m512i __attribute__ ((__always_inline__, __nodebug__)) 399_mm512_max_epu32(__m512i __A, __m512i __B) 400{ 401 return (__m512i) __builtin_ia32_pmaxud512_mask ((__v16si) __A, 402 (__v16si) __B, 403 (__v16si) 404 _mm512_setzero_si512 (), 405 (__mmask16) -1); 406} 407 408static __inline __m512i __attribute__ ((__always_inline__, __nodebug__)) 409_mm512_max_epi64(__m512i __A, __m512i __B) 410{ 411 return (__m512i) __builtin_ia32_pmaxsq512_mask ((__v8di) __A, 412 (__v8di) __B, 413 (__v8di) 414 _mm512_setzero_si512 (), 415 (__mmask8) -1); 416} 417 418static __inline __m512i __attribute__ ((__always_inline__, __nodebug__)) 419_mm512_max_epu64(__m512i __A, __m512i __B) 420{ 421 return (__m512i) __builtin_ia32_pmaxuq512_mask ((__v8di) __A, 422 (__v8di) __B, 423 (__v8di) 424 _mm512_setzero_si512 (), 425 (__mmask8) -1); 426} 427 428static __inline__ __m512d __attribute__((__always_inline__, __nodebug__)) 429_mm512_min_pd(__m512d __A, __m512d __B) 430{ 431 return (__m512d) __builtin_ia32_minpd512_mask ((__v8df) __A, 432 (__v8df) __B, 433 (__v8df) 434 _mm512_setzero_pd (), 435 (__mmask8) -1, 436 _MM_FROUND_CUR_DIRECTION); 437} 438 439static __inline__ __m512 __attribute__((__always_inline__, __nodebug__)) 440_mm512_min_ps(__m512 __A, __m512 __B) 441{ 442 return (__m512) __builtin_ia32_minps512_mask ((__v16sf) __A, 443 (__v16sf) __B, 444 (__v16sf) 445 _mm512_setzero_ps (), 446 (__mmask16) -1, 447 _MM_FROUND_CUR_DIRECTION); 448} 449 450static __inline __m512i 451__attribute__ ((__always_inline__, __nodebug__)) 452_mm512_min_epi32(__m512i __A, __m512i __B) 453{ 454 return (__m512i) __builtin_ia32_pminsd512_mask ((__v16si) __A, 455 (__v16si) __B, 456 (__v16si) 457 _mm512_setzero_si512 (), 458 (__mmask16) -1); 459} 460 461static __inline __m512i __attribute__ ((__always_inline__, __nodebug__)) 462_mm512_min_epu32(__m512i __A, __m512i __B) 463{ 464 return (__m512i) __builtin_ia32_pminud512_mask ((__v16si) __A, 465 (__v16si) __B, 466 (__v16si) 467 _mm512_setzero_si512 (), 468 (__mmask16) -1); 469} 470 471static __inline __m512i __attribute__ ((__always_inline__, __nodebug__)) 472_mm512_min_epi64(__m512i __A, __m512i __B) 473{ 474 return (__m512i) __builtin_ia32_pminsq512_mask ((__v8di) __A, 475 (__v8di) __B, 476 (__v8di) 477 _mm512_setzero_si512 (), 478 (__mmask8) -1); 479} 480 481static __inline __m512i __attribute__ ((__always_inline__, __nodebug__)) 482_mm512_min_epu64(__m512i __A, __m512i __B) 483{ 484 return (__m512i) __builtin_ia32_pminuq512_mask ((__v8di) __A, 485 (__v8di) __B, 486 (__v8di) 487 _mm512_setzero_si512 (), 488 (__mmask8) -1); 489} 490 491static __inline __m512i __attribute__ ((__always_inline__, __nodebug__)) 492_mm512_mul_epi32(__m512i __X, __m512i __Y) 493{ 494 return (__m512i) __builtin_ia32_pmuldq512_mask ((__v16si) __X, 495 (__v16si) __Y, 496 (__v8di) 497 _mm512_setzero_si512 (), 498 (__mmask8) -1); 499} 500 501static __inline __m512i __attribute__ ((__always_inline__, __nodebug__)) 502_mm512_mul_epu32(__m512i __X, __m512i __Y) 503{ 504 return (__m512i) __builtin_ia32_pmuludq512_mask ((__v16si) __X, 505 (__v16si) __Y, 506 (__v8di) 507 _mm512_setzero_si512 (), 508 (__mmask8) -1); 509} 510 511static __inline__ __m512d __attribute__((__always_inline__, __nodebug__)) 512_mm512_sqrt_pd(__m512d a) 513{ 514 return (__m512d)__builtin_ia32_sqrtpd512_mask((__v8df)a, 515 (__v8df) _mm512_setzero_pd (), 516 (__mmask8) -1, 517 _MM_FROUND_CUR_DIRECTION); 518} 519 520static __inline__ __m512 __attribute__((__always_inline__, __nodebug__)) 521_mm512_sqrt_ps(__m512 a) 522{ 523 return (__m512)__builtin_ia32_sqrtps512_mask((__v16sf)a, 524 (__v16sf) _mm512_setzero_ps (), 525 (__mmask16) -1, 526 _MM_FROUND_CUR_DIRECTION); 527} 528 529static __inline__ __m512d __attribute__((__always_inline__, __nodebug__)) 530_mm512_rsqrt14_pd(__m512d __A) 531{ 532 return (__m512d) __builtin_ia32_rsqrt14pd512_mask ((__v8df) __A, 533 (__v8df) 534 _mm512_setzero_pd (), 535 (__mmask8) -1);} 536 537static __inline__ __m512 __attribute__((__always_inline__, __nodebug__)) 538_mm512_rsqrt14_ps(__m512 __A) 539{ 540 return (__m512) __builtin_ia32_rsqrt14ps512_mask ((__v16sf) __A, 541 (__v16sf) 542 _mm512_setzero_ps (), 543 (__mmask16) -1); 544} 545 546static __inline__ __m128 __attribute__((__always_inline__, __nodebug__)) 547_mm_rsqrt14_ss(__m128 __A, __m128 __B) 548{ 549 return (__m128) __builtin_ia32_rsqrt14ss_mask ((__v4sf) __A, 550 (__v4sf) __B, 551 (__v4sf) 552 _mm_setzero_ps (), 553 (__mmask8) -1); 554} 555 556static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) 557_mm_rsqrt14_sd(__m128d __A, __m128d __B) 558{ 559 return (__m128d) __builtin_ia32_rsqrt14sd_mask ((__v2df) __A, 560 (__v2df) __B, 561 (__v2df) 562 _mm_setzero_pd (), 563 (__mmask8) -1); 564} 565 566static __inline__ __m512d __attribute__((__always_inline__, __nodebug__)) 567_mm512_rcp14_pd(__m512d __A) 568{ 569 return (__m512d) __builtin_ia32_rcp14pd512_mask ((__v8df) __A, 570 (__v8df) 571 _mm512_setzero_pd (), 572 (__mmask8) -1); 573} 574 575static __inline__ __m512 __attribute__((__always_inline__, __nodebug__)) 576_mm512_rcp14_ps(__m512 __A) 577{ 578 return (__m512) __builtin_ia32_rcp14ps512_mask ((__v16sf) __A, 579 (__v16sf) 580 _mm512_setzero_ps (), 581 (__mmask16) -1); 582} 583static __inline__ __m128 __attribute__((__always_inline__, __nodebug__)) 584_mm_rcp14_ss(__m128 __A, __m128 __B) 585{ 586 return (__m128) __builtin_ia32_rcp14ss_mask ((__v4sf) __A, 587 (__v4sf) __B, 588 (__v4sf) 589 _mm_setzero_ps (), 590 (__mmask8) -1); 591} 592 593static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) 594_mm_rcp14_sd(__m128d __A, __m128d __B) 595{ 596 return (__m128d) __builtin_ia32_rcp14sd_mask ((__v2df) __A, 597 (__v2df) __B, 598 (__v2df) 599 _mm_setzero_pd (), 600 (__mmask8) -1); 601} 602 603static __inline __m512 __attribute__ ((__always_inline__, __nodebug__)) 604_mm512_floor_ps(__m512 __A) 605{ 606 return (__m512) __builtin_ia32_rndscaleps_mask ((__v16sf) __A, 607 _MM_FROUND_FLOOR, 608 (__v16sf) __A, -1, 609 _MM_FROUND_CUR_DIRECTION); 610} 611 612static __inline __m512d __attribute__ ((__always_inline__, __nodebug__)) 613_mm512_floor_pd(__m512d __A) 614{ 615 return (__m512d) __builtin_ia32_rndscalepd_mask ((__v8df) __A, 616 _MM_FROUND_FLOOR, 617 (__v8df) __A, -1, 618 _MM_FROUND_CUR_DIRECTION); 619} 620 621static __inline __m512 __attribute__ ((__always_inline__, __nodebug__)) 622_mm512_ceil_ps(__m512 __A) 623{ 624 return (__m512) __builtin_ia32_rndscaleps_mask ((__v16sf) __A, 625 _MM_FROUND_CEIL, 626 (__v16sf) __A, -1, 627 _MM_FROUND_CUR_DIRECTION); 628} 629 630static __inline __m512d __attribute__ ((__always_inline__, __nodebug__)) 631_mm512_ceil_pd(__m512d __A) 632{ 633 return (__m512d) __builtin_ia32_rndscalepd_mask ((__v8df) __A, 634 _MM_FROUND_CEIL, 635 (__v8df) __A, -1, 636 _MM_FROUND_CUR_DIRECTION); 637} 638 639static __inline __m512i __attribute__ (( __always_inline__, __nodebug__)) 640_mm512_abs_epi64(__m512i __A) 641{ 642 return (__m512i) __builtin_ia32_pabsq512_mask ((__v8di) __A, 643 (__v8di) 644 _mm512_setzero_si512 (), 645 (__mmask8) -1); 646} 647 648static __inline __m512i __attribute__ (( __always_inline__, __nodebug__)) 649_mm512_abs_epi32(__m512i __A) 650{ 651 return (__m512i) __builtin_ia32_pabsd512_mask ((__v16si) __A, 652 (__v16si) 653 _mm512_setzero_si512 (), 654 (__mmask16) -1); 655} 656 657#define _mm512_roundscale_ps(A, B) __extension__ ({ \ 658 (__m512)__builtin_ia32_rndscaleps_mask((__v16sf)(A), (B), (__v16sf)(A), \ 659 -1, _MM_FROUND_CUR_DIRECTION); }) 660 661#define _mm512_roundscale_pd(A, B) __extension__ ({ \ 662 (__m512d)__builtin_ia32_rndscalepd_mask((__v8df)(A), (B), (__v8df)(A), \ 663 -1, _MM_FROUND_CUR_DIRECTION); }) 664 665static __inline__ __m512d __attribute__((__always_inline__, __nodebug__)) 666_mm512_fmadd_pd(__m512d __A, __m512d __B, __m512d __C) 667{ 668 return (__m512d) 669 __builtin_ia32_vfmaddpd512_mask(__A, 670 __B, 671 __C, 672 (__mmask8) -1, 673 _MM_FROUND_CUR_DIRECTION); 674} 675 676static __inline__ __m512d __attribute__((__always_inline__, __nodebug__)) 677_mm512_fmsub_pd(__m512d __A, __m512d __B, __m512d __C) 678{ 679 return (__m512d) 680 __builtin_ia32_vfmsubpd512_mask(__A, 681 __B, 682 __C, 683 (__mmask8) -1, 684 _MM_FROUND_CUR_DIRECTION); 685} 686 687static __inline__ __m512d __attribute__((__always_inline__, __nodebug__)) 688_mm512_fnmadd_pd(__m512d __A, __m512d __B, __m512d __C) 689{ 690 return (__m512d) 691 __builtin_ia32_vfnmaddpd512_mask(__A, 692 __B, 693 __C, 694 (__mmask8) -1, 695 _MM_FROUND_CUR_DIRECTION); 696} 697 698static __inline__ __m512 __attribute__((__always_inline__, __nodebug__)) 699_mm512_fmadd_ps(__m512 __A, __m512 __B, __m512 __C) 700{ 701 return (__m512) 702 __builtin_ia32_vfmaddps512_mask(__A, 703 __B, 704 __C, 705 (__mmask16) -1, 706 _MM_FROUND_CUR_DIRECTION); 707} 708 709static __inline__ __m512 __attribute__((__always_inline__, __nodebug__)) 710_mm512_fmsub_ps(__m512 __A, __m512 __B, __m512 __C) 711{ 712 return (__m512) 713 __builtin_ia32_vfmsubps512_mask(__A, 714 __B, 715 __C, 716 (__mmask16) -1, 717 _MM_FROUND_CUR_DIRECTION); 718} 719 720static __inline__ __m512 __attribute__((__always_inline__, __nodebug__)) 721_mm512_fnmadd_ps(__m512 __A, __m512 __B, __m512 __C) 722{ 723 return (__m512) 724 __builtin_ia32_vfnmaddps512_mask(__A, 725 __B, 726 __C, 727 (__mmask16) -1, 728 _MM_FROUND_CUR_DIRECTION); 729} 730 731/* Vector permutations */ 732 733static __inline __m512i __attribute__ ((__always_inline__, __nodebug__)) 734_mm512_permutex2var_epi32(__m512i __A, __m512i __I, __m512i __B) 735{ 736 return (__m512i) __builtin_ia32_vpermt2vard512_mask ((__v16si) __I 737 /* idx */ , 738 (__v16si) __A, 739 (__v16si) __B, 740 (__mmask16) -1); 741} 742static __inline __m512i __attribute__ ((__always_inline__, __nodebug__)) 743_mm512_permutex2var_epi64(__m512i __A, __m512i __I, __m512i __B) 744{ 745 return (__m512i) __builtin_ia32_vpermt2varq512_mask ((__v8di) __I 746 /* idx */ , 747 (__v8di) __A, 748 (__v8di) __B, 749 (__mmask8) -1); 750} 751 752static __inline __m512d __attribute__ ((__always_inline__, __nodebug__)) 753_mm512_permutex2var_pd(__m512d __A, __m512i __I, __m512d __B) 754{ 755 return (__m512d) __builtin_ia32_vpermt2varpd512_mask ((__v8di) __I 756 /* idx */ , 757 (__v8df) __A, 758 (__v8df) __B, 759 (__mmask8) -1); 760} 761static __inline __m512 __attribute__ ((__always_inline__, __nodebug__)) 762_mm512_permutex2var_ps(__m512 __A, __m512i __I, __m512 __B) 763{ 764 return (__m512) __builtin_ia32_vpermt2varps512_mask ((__v16si) __I 765 /* idx */ , 766 (__v16sf) __A, 767 (__v16sf) __B, 768 (__mmask16) -1); 769} 770 771#define _mm512_alignr_epi64(A, B, I) __extension__ ({ \ 772 (__m512i)__builtin_ia32_alignq512_mask((__v8di)(__m512i)(A), \ 773 (__v8di)(__m512i)(B), \ 774 (I), (__v8di)_mm512_setzero_si512(), \ 775 (__mmask8)-1); }) 776 777#define _mm512_alignr_epi32(A, B, I) __extension__ ({ \ 778 (__m512i)__builtin_ia32_alignd512_mask((__v16si)(__m512i)(A), \ 779 (__v16si)(__m512i)(B), \ 780 (I), (__v16si)_mm512_setzero_si512(), \ 781 (__mmask16)-1); }) 782 783/* Vector Extract */ 784 785#define _mm512_extractf64x4_pd(A, I) __extension__ ({ \ 786 __m512d __A = (A); \ 787 (__m256d) \ 788 __builtin_ia32_extractf64x4_mask((__v8df)__A, \ 789 (I), \ 790 (__v4df)_mm256_setzero_si256(), \ 791 (__mmask8) -1); }) 792 793#define _mm512_extractf32x4_ps(A, I) __extension__ ({ \ 794 __m512 __A = (A); \ 795 (__m128) \ 796 __builtin_ia32_extractf32x4_mask((__v16sf)__A, \ 797 (I), \ 798 (__v4sf)_mm_setzero_ps(), \ 799 (__mmask8) -1); }) 800 801/* Vector Blend */ 802 803static __inline __m512d __attribute__ ((__always_inline__, __nodebug__)) 804_mm512_mask_blend_pd(__mmask8 __U, __m512d __A, __m512d __W) 805{ 806 return (__m512d) __builtin_ia32_blendmpd_512_mask ((__v8df) __A, 807 (__v8df) __W, 808 (__mmask8) __U); 809} 810 811static __inline __m512 __attribute__ ((__always_inline__, __nodebug__)) 812_mm512_mask_blend_ps(__mmask16 __U, __m512 __A, __m512 __W) 813{ 814 return (__m512) __builtin_ia32_blendmps_512_mask ((__v16sf) __A, 815 (__v16sf) __W, 816 (__mmask16) __U); 817} 818 819static __inline __m512i __attribute__ ((__always_inline__, __nodebug__)) 820_mm512_mask_blend_epi64(__mmask8 __U, __m512i __A, __m512i __W) 821{ 822 return (__m512i) __builtin_ia32_blendmq_512_mask ((__v8di) __A, 823 (__v8di) __W, 824 (__mmask8) __U); 825} 826 827static __inline __m512i __attribute__ ((__always_inline__, __nodebug__)) 828_mm512_mask_blend_epi32(__mmask16 __U, __m512i __A, __m512i __W) 829{ 830 return (__m512i) __builtin_ia32_blendmd_512_mask ((__v16si) __A, 831 (__v16si) __W, 832 (__mmask16) __U); 833} 834 835/* Compare */ 836 837#define _mm512_cmp_round_ps_mask(A, B, P, R) __extension__ ({ \ 838 (__mmask16)__builtin_ia32_cmpps512_mask((__v16sf)(__m512)(A), \ 839 (__v16sf)(__m512)(B), \ 840 (P), (__mmask16)-1, (R)); }) 841 842#define _mm512_mask_cmp_round_ps_mask(U, A, B, P, R) __extension__ ({ \ 843 (__mmask16)__builtin_ia32_cmpps512_mask((__v16sf)(__m512)(A), \ 844 (__v16sf)(__m512)(B), \ 845 (P), (__mmask16)(U), (R)); }) 846 847#define _mm512_cmp_ps_mask(A, B, P) \ 848 _mm512_cmp_round_ps_mask((A), (B), (P), _MM_FROUND_CUR_DIRECTION) 849 850#define _mm512_mask_cmp_ps_mask(U, A, B, P) \ 851 _mm512_mask_cmp_round_ps_mask((U), (A), (B), (P), _MM_FROUND_CUR_DIRECTION) 852 853#define _mm512_cmp_round_pd_mask(A, B, P, R) __extension__ ({ \ 854 (__mmask8)__builtin_ia32_cmppd512_mask((__v8df)(__m512d)(A), \ 855 (__v8df)(__m512d)(B), \ 856 (P), (__mmask8)-1, (R)); }) 857 858#define _mm512_mask_cmp_round_pd_mask(U, A, B, P, R) __extension__ ({ \ 859 (__mmask8)__builtin_ia32_cmppd512_mask((__v8df)(__m512d)(A), \ 860 (__v8df)(__m512d)(B), \ 861 (P), (__mmask8)(U), (R)); }) 862 863#define _mm512_cmp_pd_mask(A, B, P) \ 864 _mm512_cmp_round_pd_mask((A), (B), (P), _MM_FROUND_CUR_DIRECTION) 865 866#define _mm512_mask_cmp_pd_mask(U, A, B, P) \ 867 _mm512_mask_cmp_round_pd_mask((U), (A), (B), (P), _MM_FROUND_CUR_DIRECTION) 868 869/* Conversion */ 870 871static __inline __m512i __attribute__ ((__always_inline__, __nodebug__)) 872_mm512_cvttps_epu32(__m512 __A) 873{ 874 return (__m512i) __builtin_ia32_cvttps2udq512_mask ((__v16sf) __A, 875 (__v16si) 876 _mm512_setzero_si512 (), 877 (__mmask16) -1, 878 _MM_FROUND_CUR_DIRECTION); 879} 880 881#define _mm512_cvt_roundepi32_ps(A, R) __extension__ ({ \ 882 (__m512)__builtin_ia32_cvtdq2ps512_mask((__v16si)(A), \ 883 (__v16sf)_mm512_setzero_ps(), \ 884 (__mmask16)-1, (R)); }) 885 886#define _mm512_cvt_roundepu32_ps(A, R) __extension__ ({ \ 887 (__m512)__builtin_ia32_cvtudq2ps512_mask((__v16si)(A), \ 888 (__v16sf)_mm512_setzero_ps(), \ 889 (__mmask16)-1, (R)); }) 890 891static __inline __m512d __attribute__ (( __always_inline__, __nodebug__)) 892_mm512_cvtepi32_pd(__m256i __A) 893{ 894 return (__m512d) __builtin_ia32_cvtdq2pd512_mask ((__v8si) __A, 895 (__v8df) 896 _mm512_setzero_pd (), 897 (__mmask8) -1); 898} 899 900static __inline __m512d __attribute__ (( __always_inline__, __nodebug__)) 901_mm512_cvtepu32_pd(__m256i __A) 902{ 903 return (__m512d) __builtin_ia32_cvtudq2pd512_mask ((__v8si) __A, 904 (__v8df) 905 _mm512_setzero_pd (), 906 (__mmask8) -1); 907} 908 909#define _mm512_cvt_roundpd_ps(A, R) __extension__ ({ \ 910 (__m256)__builtin_ia32_cvtpd2ps512_mask((__v8df)(A), \ 911 (__v8sf)_mm256_setzero_ps(), \ 912 (__mmask8)-1, (R)); }) 913 914#define _mm512_cvtps_ph(A, I) __extension__ ({ \ 915 (__m256i)__builtin_ia32_vcvtps2ph512_mask((__v16sf)(A), (I), \ 916 (__v16hi)_mm256_setzero_si256(), \ 917 -1); }) 918 919static __inline __m512 __attribute__ ((__always_inline__, __nodebug__)) 920_mm512_cvtph_ps(__m256i __A) 921{ 922 return (__m512) __builtin_ia32_vcvtph2ps512_mask ((__v16hi) __A, 923 (__v16sf) 924 _mm512_setzero_ps (), 925 (__mmask16) -1, 926 _MM_FROUND_CUR_DIRECTION); 927} 928 929static __inline __m512i __attribute__((__always_inline__, __nodebug__)) 930_mm512_cvttps_epi32(__m512 a) 931{ 932 return (__m512i) 933 __builtin_ia32_cvttps2dq512_mask((__v16sf) a, 934 (__v16si) _mm512_setzero_si512 (), 935 (__mmask16) -1, _MM_FROUND_CUR_DIRECTION); 936} 937 938static __inline __m256i __attribute__((__always_inline__, __nodebug__)) 939_mm512_cvttpd_epi32(__m512d a) 940{ 941 return (__m256i)__builtin_ia32_cvttpd2dq512_mask((__v8df) a, 942 (__v8si)_mm256_setzero_si256(), 943 (__mmask8) -1, 944 _MM_FROUND_CUR_DIRECTION); 945} 946 947#define _mm512_cvtt_roundpd_epi32(A, R) __extension__ ({ \ 948 (__m256i)__builtin_ia32_cvttpd2dq512_mask((__v8df)(A), \ 949 (__v8si)_mm256_setzero_si256(), \ 950 (__mmask8)-1, (R)); }) 951 952#define _mm512_cvtt_roundps_epi32(A, R) __extension__ ({ \ 953 (__m512i)__builtin_ia32_cvttps2dq512_mask((__v16sf)(A), \ 954 (__v16si)_mm512_setzero_si512(), \ 955 (__mmask16)-1, (R)); }) 956 957#define _mm512_cvt_roundps_epi32(A, R) __extension__ ({ \ 958 (__m512i)__builtin_ia32_cvtps2dq512_mask((__v16sf)(A), \ 959 (__v16si)_mm512_setzero_si512(), \ 960 (__mmask16)-1, (R)); }) 961 962#define _mm512_cvt_roundpd_epi32(A, R) __extension__ ({ \ 963 (__m256i)__builtin_ia32_cvtpd2dq512_mask((__v8df)(A), \ 964 (__v8si)_mm256_setzero_si256(), \ 965 (__mmask8)-1, (R)); }) 966 967#define _mm512_cvt_roundps_epu32(A, R) __extension__ ({ \ 968 (__m512i)__builtin_ia32_cvtps2udq512_mask((__v16sf)(A), \ 969 (__v16si)_mm512_setzero_si512(), \ 970 (__mmask16)-1, (R)); }) 971 972#define _mm512_cvt_roundpd_epu32(A, R) __extension__ ({ \ 973 (__m256i)__builtin_ia32_cvtpd2udq512_mask((__v8df)(A), \ 974 (__v8si)_mm256_setzero_si256(), \ 975 (__mmask8) -1, (R)); }) 976 977/* Unpack and Interleave */ 978static __inline __m512d __attribute__((__always_inline__, __nodebug__)) 979_mm512_unpackhi_pd(__m512d __a, __m512d __b) 980{ 981 return __builtin_shufflevector(__a, __b, 1, 9, 1+2, 9+2, 1+4, 9+4, 1+6, 9+6); 982} 983 984static __inline __m512d __attribute__((__always_inline__, __nodebug__)) 985_mm512_unpacklo_pd(__m512d __a, __m512d __b) 986{ 987 return __builtin_shufflevector(__a, __b, 0, 8, 0+2, 8+2, 0+4, 8+4, 0+6, 8+6); 988} 989 990static __inline __m512 __attribute__((__always_inline__, __nodebug__)) 991_mm512_unpackhi_ps(__m512 __a, __m512 __b) 992{ 993 return __builtin_shufflevector(__a, __b, 994 2, 18, 3, 19, 995 2+4, 18+4, 3+4, 19+4, 996 2+8, 18+8, 3+8, 19+8, 997 2+12, 18+12, 3+12, 19+12); 998} 999 1000static __inline __m512 __attribute__((__always_inline__, __nodebug__)) 1001_mm512_unpacklo_ps(__m512 __a, __m512 __b) 1002{ 1003 return __builtin_shufflevector(__a, __b, 1004 0, 16, 1, 17, 1005 0+4, 16+4, 1+4, 17+4, 1006 0+8, 16+8, 1+8, 17+8, 1007 0+12, 16+12, 1+12, 17+12); 1008} 1009 1010/* Bit Test */ 1011 1012static __inline __mmask16 __attribute__ ((__always_inline__, __nodebug__)) 1013_mm512_test_epi32_mask(__m512i __A, __m512i __B) 1014{ 1015 return (__mmask16) __builtin_ia32_ptestmd512 ((__v16si) __A, 1016 (__v16si) __B, 1017 (__mmask16) -1); 1018} 1019 1020static __inline __mmask8 __attribute__ ((__always_inline__, __nodebug__)) 1021_mm512_test_epi64_mask(__m512i __A, __m512i __B) 1022{ 1023 return (__mmask8) __builtin_ia32_ptestmq512 ((__v8di) __A, 1024 (__v8di) __B, 1025 (__mmask8) -1); 1026} 1027 1028/* SIMD load ops */ 1029 1030static __inline __m512i __attribute__ ((__always_inline__, __nodebug__)) 1031_mm512_maskz_loadu_epi32(__mmask16 __U, void const *__P) 1032{ 1033 return (__m512i) __builtin_ia32_loaddqusi512_mask ((const __v16si *)__P, 1034 (__v16si) 1035 _mm512_setzero_si512 (), 1036 (__mmask16) __U); 1037} 1038 1039static __inline __m512i __attribute__ ((__always_inline__, __nodebug__)) 1040_mm512_maskz_loadu_epi64(__mmask8 __U, void const *__P) 1041{ 1042 return (__m512i) __builtin_ia32_loaddqudi512_mask ((const __v8di *)__P, 1043 (__v8di) 1044 _mm512_setzero_si512 (), 1045 (__mmask8) __U); 1046} 1047 1048static __inline __m512 __attribute__ ((__always_inline__, __nodebug__)) 1049_mm512_maskz_loadu_ps(__mmask16 __U, void const *__P) 1050{ 1051 return (__m512) __builtin_ia32_loadups512_mask ((const __v16sf *)__P, 1052 (__v16sf) 1053 _mm512_setzero_ps (), 1054 (__mmask16) __U); 1055} 1056 1057static __inline __m512d __attribute__ ((__always_inline__, __nodebug__)) 1058_mm512_maskz_loadu_pd(__mmask8 __U, void const *__P) 1059{ 1060 return (__m512d) __builtin_ia32_loadupd512_mask ((const __v8df *)__P, 1061 (__v8df) 1062 _mm512_setzero_pd (), 1063 (__mmask8) __U); 1064} 1065 1066static __inline __m512 __attribute__ ((__always_inline__, __nodebug__)) 1067_mm512_maskz_load_ps(__mmask16 __U, void const *__P) 1068{ 1069 return (__m512) __builtin_ia32_loadaps512_mask ((const __v16sf *)__P, 1070 (__v16sf) 1071 _mm512_setzero_ps (), 1072 (__mmask16) __U); 1073} 1074 1075static __inline __m512d __attribute__ ((__always_inline__, __nodebug__)) 1076_mm512_maskz_load_pd(__mmask8 __U, void const *__P) 1077{ 1078 return (__m512d) __builtin_ia32_loadapd512_mask ((const __v8df *)__P, 1079 (__v8df) 1080 _mm512_setzero_pd (), 1081 (__mmask8) __U); 1082} 1083 1084static __inline __m512d __attribute__((__always_inline__, __nodebug__)) 1085_mm512_loadu_pd(double const *__p) 1086{ 1087 struct __loadu_pd { 1088 __m512d __v; 1089 } __attribute__((__packed__, __may_alias__)); 1090 return ((struct __loadu_pd*)__p)->__v; 1091} 1092 1093static __inline __m512 __attribute__((__always_inline__, __nodebug__)) 1094_mm512_loadu_ps(float const *__p) 1095{ 1096 struct __loadu_ps { 1097 __m512 __v; 1098 } __attribute__((__packed__, __may_alias__)); 1099 return ((struct __loadu_ps*)__p)->__v; 1100} 1101 1102static __inline __m512 __attribute__((__always_inline__, __nodebug__)) 1103_mm512_load_ps(double const *__p) 1104{ 1105 return (__m512) __builtin_ia32_loadaps512_mask ((const __v16sf *)__p, 1106 (__v16sf) 1107 _mm512_setzero_ps (), 1108 (__mmask16) -1); 1109} 1110 1111static __inline __m512d __attribute__((__always_inline__, __nodebug__)) 1112_mm512_load_pd(float const *__p) 1113{ 1114 return (__m512d) __builtin_ia32_loadapd512_mask ((const __v8df *)__p, 1115 (__v8df) 1116 _mm512_setzero_pd (), 1117 (__mmask8) -1); 1118} 1119 1120/* SIMD store ops */ 1121 1122static __inline void __attribute__ ((__always_inline__, __nodebug__)) 1123_mm512_mask_storeu_epi64(void *__P, __mmask8 __U, __m512i __A) 1124{ 1125 __builtin_ia32_storedqudi512_mask ((__v8di *)__P, (__v8di) __A, 1126 (__mmask8) __U); 1127} 1128 1129static __inline void __attribute__ ((__always_inline__, __nodebug__)) 1130_mm512_mask_storeu_epi32(void *__P, __mmask16 __U, __m512i __A) 1131{ 1132 __builtin_ia32_storedqusi512_mask ((__v16si *)__P, (__v16si) __A, 1133 (__mmask16) __U); 1134} 1135 1136static __inline void __attribute__ ((__always_inline__, __nodebug__)) 1137_mm512_mask_storeu_pd(void *__P, __mmask8 __U, __m512d __A) 1138{ 1139 __builtin_ia32_storeupd512_mask ((__v8df *)__P, (__v8df) __A, (__mmask8) __U); 1140} 1141 1142static __inline void __attribute__ ((__always_inline__, __nodebug__)) 1143_mm512_storeu_pd(void *__P, __m512d __A) 1144{ 1145 __builtin_ia32_storeupd512_mask((__v8df *)__P, (__v8df)__A, (__mmask8)-1); 1146} 1147 1148static __inline void __attribute__ ((__always_inline__, __nodebug__)) 1149_mm512_mask_storeu_ps(void *__P, __mmask16 __U, __m512 __A) 1150{ 1151 __builtin_ia32_storeups512_mask ((__v16sf *)__P, (__v16sf) __A, 1152 (__mmask16) __U); 1153} 1154 1155static __inline void __attribute__ ((__always_inline__, __nodebug__)) 1156_mm512_storeu_ps(void *__P, __m512 __A) 1157{ 1158 __builtin_ia32_storeups512_mask((__v16sf *)__P, (__v16sf)__A, (__mmask16)-1); 1159} 1160 1161static __inline void __attribute__ ((__always_inline__, __nodebug__)) 1162_mm512_mask_store_pd(void *__P, __mmask8 __U, __m512d __A) 1163{ 1164 __builtin_ia32_storeapd512_mask ((__v8df *)__P, (__v8df) __A, (__mmask8) __U); 1165} 1166 1167static __inline void __attribute__ ((__always_inline__, __nodebug__)) 1168_mm512_store_pd(void *__P, __m512d __A) 1169{ 1170 *(__m512d*)__P = __A; 1171} 1172 1173static __inline void __attribute__ ((__always_inline__, __nodebug__)) 1174_mm512_mask_store_ps(void *__P, __mmask16 __U, __m512 __A) 1175{ 1176 __builtin_ia32_storeaps512_mask ((__v16sf *)__P, (__v16sf) __A, 1177 (__mmask16) __U); 1178} 1179 1180static __inline void __attribute__ ((__always_inline__, __nodebug__)) 1181_mm512_store_ps(void *__P, __m512 __A) 1182{ 1183 *(__m512*)__P = __A; 1184} 1185 1186/* Mask ops */ 1187 1188static __inline __mmask16 __attribute__ ((__always_inline__, __nodebug__)) 1189_mm512_knot(__mmask16 __M) 1190{ 1191 return __builtin_ia32_knothi(__M); 1192} 1193 1194/* Integer compare */ 1195 1196static __inline__ __mmask16 __attribute__((__always_inline__, __nodebug__)) 1197_mm512_cmpeq_epi32_mask(__m512i __a, __m512i __b) { 1198 return (__mmask16)__builtin_ia32_pcmpeqd512_mask((__v16si)__a, (__v16si)__b, 1199 (__mmask16)-1); 1200} 1201 1202static __inline__ __mmask16 __attribute__((__always_inline__, __nodebug__)) 1203_mm512_mask_cmpeq_epi32_mask(__mmask16 __u, __m512i __a, __m512i __b) { 1204 return (__mmask16)__builtin_ia32_pcmpeqd512_mask((__v16si)__a, (__v16si)__b, 1205 __u); 1206} 1207 1208static __inline__ __mmask16 __attribute__((__always_inline__, __nodebug__)) 1209_mm512_cmpeq_epu32_mask(__m512i __a, __m512i __b) { 1210 return (__mmask16)__builtin_ia32_ucmpd512_mask((__v16si)__a, (__v16si)__b, 0, 1211 (__mmask16)-1); 1212} 1213 1214static __inline__ __mmask16 __attribute__((__always_inline__, __nodebug__)) 1215_mm512_mask_cmpeq_epu32_mask(__mmask16 __u, __m512i __a, __m512i __b) { 1216 return (__mmask16)__builtin_ia32_ucmpd512_mask((__v16si)__a, (__v16si)__b, 0, 1217 __u); 1218} 1219 1220static __inline__ __mmask8 __attribute__((__always_inline__, __nodebug__)) 1221_mm512_mask_cmpeq_epi64_mask(__mmask8 __u, __m512i __a, __m512i __b) { 1222 return (__mmask8)__builtin_ia32_pcmpeqq512_mask((__v8di)__a, (__v8di)__b, 1223 __u); 1224} 1225 1226static __inline__ __mmask8 __attribute__((__always_inline__, __nodebug__)) 1227_mm512_cmpeq_epi64_mask(__m512i __a, __m512i __b) { 1228 return (__mmask8)__builtin_ia32_pcmpeqq512_mask((__v8di)__a, (__v8di)__b, 1229 (__mmask8)-1); 1230} 1231 1232static __inline__ __mmask8 __attribute__((__always_inline__, __nodebug__)) 1233_mm512_cmpeq_epu64_mask(__m512i __a, __m512i __b) { 1234 return (__mmask8)__builtin_ia32_ucmpq512_mask((__v8di)__a, (__v8di)__b, 0, 1235 (__mmask8)-1); 1236} 1237 1238static __inline__ __mmask8 __attribute__((__always_inline__, __nodebug__)) 1239_mm512_mask_cmpeq_epu64_mask(__mmask8 __u, __m512i __a, __m512i __b) { 1240 return (__mmask8)__builtin_ia32_ucmpq512_mask((__v8di)__a, (__v8di)__b, 0, 1241 __u); 1242} 1243 1244static __inline__ __mmask16 __attribute__((__always_inline__, __nodebug__)) 1245_mm512_cmpge_epi32_mask(__m512i __a, __m512i __b) { 1246 return (__mmask16)__builtin_ia32_cmpd512_mask((__v16si)__a, (__v16si)__b, 5, 1247 (__mmask16)-1); 1248} 1249 1250static __inline__ __mmask16 __attribute__((__always_inline__, __nodebug__)) 1251_mm512_mask_cmpge_epi32_mask(__mmask16 __u, __m512i __a, __m512i __b) { 1252 return (__mmask16)__builtin_ia32_cmpd512_mask((__v16si)__a, (__v16si)__b, 5, 1253 __u); 1254} 1255 1256static __inline__ __mmask16 __attribute__((__always_inline__, __nodebug__)) 1257_mm512_cmpge_epu32_mask(__m512i __a, __m512i __b) { 1258 return (__mmask16)__builtin_ia32_ucmpd512_mask((__v16si)__a, (__v16si)__b, 5, 1259 (__mmask16)-1); 1260} 1261 1262static __inline__ __mmask16 __attribute__((__always_inline__, __nodebug__)) 1263_mm512_mask_cmpge_epu32_mask(__mmask16 __u, __m512i __a, __m512i __b) { 1264 return (__mmask16)__builtin_ia32_ucmpd512_mask((__v16si)__a, (__v16si)__b, 5, 1265 __u); 1266} 1267 1268static __inline__ __mmask8 __attribute__((__always_inline__, __nodebug__)) 1269_mm512_cmpge_epi64_mask(__m512i __a, __m512i __b) { 1270 return (__mmask8)__builtin_ia32_cmpq512_mask((__v8di)__a, (__v8di)__b, 5, 1271 (__mmask8)-1); 1272} 1273 1274static __inline__ __mmask8 __attribute__((__always_inline__, __nodebug__)) 1275_mm512_mask_cmpge_epi64_mask(__mmask8 __u, __m512i __a, __m512i __b) { 1276 return (__mmask8)__builtin_ia32_cmpq512_mask((__v8di)__a, (__v8di)__b, 5, 1277 __u); 1278} 1279 1280static __inline__ __mmask8 __attribute__((__always_inline__, __nodebug__)) 1281_mm512_cmpge_epu64_mask(__m512i __a, __m512i __b) { 1282 return (__mmask8)__builtin_ia32_ucmpq512_mask((__v8di)__a, (__v8di)__b, 5, 1283 (__mmask8)-1); 1284} 1285 1286static __inline__ __mmask8 __attribute__((__always_inline__, __nodebug__)) 1287_mm512_mask_cmpge_epu64_mask(__mmask8 __u, __m512i __a, __m512i __b) { 1288 return (__mmask8)__builtin_ia32_ucmpq512_mask((__v8di)__a, (__v8di)__b, 5, 1289 __u); 1290} 1291 1292static __inline__ __mmask16 __attribute__((__always_inline__, __nodebug__)) 1293_mm512_cmpgt_epi32_mask(__m512i __a, __m512i __b) { 1294 return (__mmask16)__builtin_ia32_pcmpgtd512_mask((__v16si)__a, (__v16si)__b, 1295 (__mmask16)-1); 1296} 1297 1298static __inline__ __mmask16 __attribute__((__always_inline__, __nodebug__)) 1299_mm512_mask_cmpgt_epi32_mask(__mmask16 __u, __m512i __a, __m512i __b) { 1300 return (__mmask16)__builtin_ia32_pcmpgtd512_mask((__v16si)__a, (__v16si)__b, 1301 __u); 1302} 1303 1304static __inline__ __mmask16 __attribute__((__always_inline__, __nodebug__)) 1305_mm512_cmpgt_epu32_mask(__m512i __a, __m512i __b) { 1306 return (__mmask16)__builtin_ia32_ucmpd512_mask((__v16si)__a, (__v16si)__b, 6, 1307 (__mmask16)-1); 1308} 1309 1310static __inline__ __mmask16 __attribute__((__always_inline__, __nodebug__)) 1311_mm512_mask_cmpgt_epu32_mask(__mmask16 __u, __m512i __a, __m512i __b) { 1312 return (__mmask16)__builtin_ia32_ucmpd512_mask((__v16si)__a, (__v16si)__b, 6, 1313 __u); 1314} 1315 1316static __inline__ __mmask8 __attribute__((__always_inline__, __nodebug__)) 1317_mm512_mask_cmpgt_epi64_mask(__mmask8 __u, __m512i __a, __m512i __b) { 1318 return (__mmask8)__builtin_ia32_pcmpgtq512_mask((__v8di)__a, (__v8di)__b, 1319 __u); 1320} 1321 1322static __inline__ __mmask8 __attribute__((__always_inline__, __nodebug__)) 1323_mm512_cmpgt_epi64_mask(__m512i __a, __m512i __b) { 1324 return (__mmask8)__builtin_ia32_pcmpgtq512_mask((__v8di)__a, (__v8di)__b, 1325 (__mmask8)-1); 1326} 1327 1328static __inline__ __mmask8 __attribute__((__always_inline__, __nodebug__)) 1329_mm512_cmpgt_epu64_mask(__m512i __a, __m512i __b) { 1330 return (__mmask8)__builtin_ia32_ucmpq512_mask((__v8di)__a, (__v8di)__b, 6, 1331 (__mmask8)-1); 1332} 1333 1334static __inline__ __mmask8 __attribute__((__always_inline__, __nodebug__)) 1335_mm512_mask_cmpgt_epu64_mask(__mmask8 __u, __m512i __a, __m512i __b) { 1336 return (__mmask8)__builtin_ia32_ucmpq512_mask((__v8di)__a, (__v8di)__b, 6, 1337 __u); 1338} 1339 1340static __inline__ __mmask16 __attribute__((__always_inline__, __nodebug__)) 1341_mm512_cmple_epi32_mask(__m512i __a, __m512i __b) { 1342 return (__mmask16)__builtin_ia32_cmpd512_mask((__v16si)__a, (__v16si)__b, 2, 1343 (__mmask16)-1); 1344} 1345 1346static __inline__ __mmask16 __attribute__((__always_inline__, __nodebug__)) 1347_mm512_mask_cmple_epi32_mask(__mmask16 __u, __m512i __a, __m512i __b) { 1348 return (__mmask16)__builtin_ia32_cmpd512_mask((__v16si)__a, (__v16si)__b, 2, 1349 __u); 1350} 1351 1352static __inline__ __mmask16 __attribute__((__always_inline__, __nodebug__)) 1353_mm512_cmple_epu32_mask(__m512i __a, __m512i __b) { 1354 return (__mmask16)__builtin_ia32_ucmpd512_mask((__v16si)__a, (__v16si)__b, 2, 1355 (__mmask16)-1); 1356} 1357 1358static __inline__ __mmask16 __attribute__((__always_inline__, __nodebug__)) 1359_mm512_mask_cmple_epu32_mask(__mmask16 __u, __m512i __a, __m512i __b) { 1360 return (__mmask16)__builtin_ia32_ucmpd512_mask((__v16si)__a, (__v16si)__b, 2, 1361 __u); 1362} 1363 1364static __inline__ __mmask8 __attribute__((__always_inline__, __nodebug__)) 1365_mm512_cmple_epi64_mask(__m512i __a, __m512i __b) { 1366 return (__mmask8)__builtin_ia32_cmpq512_mask((__v8di)__a, (__v8di)__b, 2, 1367 (__mmask8)-1); 1368} 1369 1370static __inline__ __mmask8 __attribute__((__always_inline__, __nodebug__)) 1371_mm512_mask_cmple_epi64_mask(__mmask8 __u, __m512i __a, __m512i __b) { 1372 return (__mmask8)__builtin_ia32_cmpq512_mask((__v8di)__a, (__v8di)__b, 2, 1373 __u); 1374} 1375 1376static __inline__ __mmask8 __attribute__((__always_inline__, __nodebug__)) 1377_mm512_cmple_epu64_mask(__m512i __a, __m512i __b) { 1378 return (__mmask8)__builtin_ia32_ucmpq512_mask((__v8di)__a, (__v8di)__b, 2, 1379 (__mmask8)-1); 1380} 1381 1382static __inline__ __mmask8 __attribute__((__always_inline__, __nodebug__)) 1383_mm512_mask_cmple_epu64_mask(__mmask8 __u, __m512i __a, __m512i __b) { 1384 return (__mmask8)__builtin_ia32_ucmpq512_mask((__v8di)__a, (__v8di)__b, 2, 1385 __u); 1386} 1387 1388static __inline__ __mmask16 __attribute__((__always_inline__, __nodebug__)) 1389_mm512_cmplt_epi32_mask(__m512i __a, __m512i __b) { 1390 return (__mmask16)__builtin_ia32_cmpd512_mask((__v16si)__a, (__v16si)__b, 1, 1391 (__mmask16)-1); 1392} 1393 1394static __inline__ __mmask16 __attribute__((__always_inline__, __nodebug__)) 1395_mm512_mask_cmplt_epi32_mask(__mmask16 __u, __m512i __a, __m512i __b) { 1396 return (__mmask16)__builtin_ia32_cmpd512_mask((__v16si)__a, (__v16si)__b, 1, 1397 __u); 1398} 1399 1400static __inline__ __mmask16 __attribute__((__always_inline__, __nodebug__)) 1401_mm512_cmplt_epu32_mask(__m512i __a, __m512i __b) { 1402 return (__mmask16)__builtin_ia32_ucmpd512_mask((__v16si)__a, (__v16si)__b, 1, 1403 (__mmask16)-1); 1404} 1405 1406static __inline__ __mmask16 __attribute__((__always_inline__, __nodebug__)) 1407_mm512_mask_cmplt_epu32_mask(__mmask16 __u, __m512i __a, __m512i __b) { 1408 return (__mmask16)__builtin_ia32_ucmpd512_mask((__v16si)__a, (__v16si)__b, 1, 1409 __u); 1410} 1411 1412static __inline__ __mmask8 __attribute__((__always_inline__, __nodebug__)) 1413_mm512_cmplt_epi64_mask(__m512i __a, __m512i __b) { 1414 return (__mmask8)__builtin_ia32_cmpq512_mask((__v8di)__a, (__v8di)__b, 1, 1415 (__mmask8)-1); 1416} 1417 1418static __inline__ __mmask8 __attribute__((__always_inline__, __nodebug__)) 1419_mm512_mask_cmplt_epi64_mask(__mmask8 __u, __m512i __a, __m512i __b) { 1420 return (__mmask8)__builtin_ia32_cmpq512_mask((__v8di)__a, (__v8di)__b, 1, 1421 __u); 1422} 1423 1424static __inline__ __mmask8 __attribute__((__always_inline__, __nodebug__)) 1425_mm512_cmplt_epu64_mask(__m512i __a, __m512i __b) { 1426 return (__mmask8)__builtin_ia32_ucmpq512_mask((__v8di)__a, (__v8di)__b, 1, 1427 (__mmask8)-1); 1428} 1429 1430static __inline__ __mmask8 __attribute__((__always_inline__, __nodebug__)) 1431_mm512_mask_cmplt_epu64_mask(__mmask8 __u, __m512i __a, __m512i __b) { 1432 return (__mmask8)__builtin_ia32_ucmpq512_mask((__v8di)__a, (__v8di)__b, 1, 1433 __u); 1434} 1435 1436static __inline__ __mmask16 __attribute__((__always_inline__, __nodebug__)) 1437_mm512_cmpneq_epi32_mask(__m512i __a, __m512i __b) { 1438 return (__mmask16)__builtin_ia32_cmpd512_mask((__v16si)__a, (__v16si)__b, 4, 1439 (__mmask16)-1); 1440} 1441 1442static __inline__ __mmask16 __attribute__((__always_inline__, __nodebug__)) 1443_mm512_mask_cmpneq_epi32_mask(__mmask16 __u, __m512i __a, __m512i __b) { 1444 return (__mmask16)__builtin_ia32_cmpd512_mask((__v16si)__a, (__v16si)__b, 4, 1445 __u); 1446} 1447 1448static __inline__ __mmask16 __attribute__((__always_inline__, __nodebug__)) 1449_mm512_cmpneq_epu32_mask(__m512i __a, __m512i __b) { 1450 return (__mmask16)__builtin_ia32_ucmpd512_mask((__v16si)__a, (__v16si)__b, 4, 1451 (__mmask16)-1); 1452} 1453 1454static __inline__ __mmask16 __attribute__((__always_inline__, __nodebug__)) 1455_mm512_mask_cmpneq_epu32_mask(__mmask16 __u, __m512i __a, __m512i __b) { 1456 return (__mmask16)__builtin_ia32_ucmpd512_mask((__v16si)__a, (__v16si)__b, 4, 1457 __u); 1458} 1459 1460static __inline__ __mmask8 __attribute__((__always_inline__, __nodebug__)) 1461_mm512_cmpneq_epi64_mask(__m512i __a, __m512i __b) { 1462 return (__mmask8)__builtin_ia32_cmpq512_mask((__v8di)__a, (__v8di)__b, 4, 1463 (__mmask8)-1); 1464} 1465 1466static __inline__ __mmask8 __attribute__((__always_inline__, __nodebug__)) 1467_mm512_mask_cmpneq_epi64_mask(__mmask8 __u, __m512i __a, __m512i __b) { 1468 return (__mmask8)__builtin_ia32_cmpq512_mask((__v8di)__a, (__v8di)__b, 4, 1469 __u); 1470} 1471 1472static __inline__ __mmask8 __attribute__((__always_inline__, __nodebug__)) 1473_mm512_cmpneq_epu64_mask(__m512i __a, __m512i __b) { 1474 return (__mmask8)__builtin_ia32_ucmpq512_mask((__v8di)__a, (__v8di)__b, 4, 1475 (__mmask8)-1); 1476} 1477 1478static __inline__ __mmask8 __attribute__((__always_inline__, __nodebug__)) 1479_mm512_mask_cmpneq_epu64_mask(__mmask8 __u, __m512i __a, __m512i __b) { 1480 return (__mmask8)__builtin_ia32_ucmpq512_mask((__v8di)__a, (__v8di)__b, 4, 1481 __u); 1482} 1483 1484#define _mm512_cmp_epi32_mask(a, b, p) __extension__ ({ \ 1485 __m512i __a = (a); \ 1486 __m512i __b = (b); \ 1487 (__mmask16)__builtin_ia32_cmpd512_mask((__v16si)__a, (__v16si)__b, (p), \ 1488 (__mmask16)-1); }) 1489 1490#define _mm512_cmp_epu32_mask(a, b, p) __extension__ ({ \ 1491 __m512i __a = (a); \ 1492 __m512i __b = (b); \ 1493 (__mmask16)__builtin_ia32_ucmpd512_mask((__v16si)__a, (__v16si)__b, (p), \ 1494 (__mmask16)-1); }) 1495 1496#define _mm512_cmp_epi64_mask(a, b, p) __extension__ ({ \ 1497 __m512i __a = (a); \ 1498 __m512i __b = (b); \ 1499 (__mmask8)__builtin_ia32_cmpq512_mask((__v8di)__a, (__v8di)__b, (p), \ 1500 (__mmask8)-1); }) 1501 1502#define _mm512_cmp_epu64_mask(a, b, p) __extension__ ({ \ 1503 __m512i __a = (a); \ 1504 __m512i __b = (b); \ 1505 (__mmask8)__builtin_ia32_ucmpq512_mask((__v8di)__a, (__v8di)__b, (p), \ 1506 (__mmask8)-1); }) 1507 1508#define _mm512_mask_cmp_epi32_mask(m, a, b, p) __extension__ ({ \ 1509 __m512i __a = (a); \ 1510 __m512i __b = (b); \ 1511 (__mmask16)__builtin_ia32_cmpd512_mask((__v16si)__a, (__v16si)__b, (p), \ 1512 (__mmask16)(m)); }) 1513 1514#define _mm512_mask_cmp_epu32_mask(m, a, b, p) __extension__ ({ \ 1515 __m512i __a = (a); \ 1516 __m512i __b = (b); \ 1517 (__mmask16)__builtin_ia32_ucmpd512_mask((__v16si)__a, (__v16si)__b, (p), \ 1518 (__mmask16)(m)); }) 1519 1520#define _mm512_mask_cmp_epi64_mask(m, a, b, p) __extension__ ({ \ 1521 __m512i __a = (a); \ 1522 __m512i __b = (b); \ 1523 (__mmask8)__builtin_ia32_cmpq512_mask((__v8di)__a, (__v8di)__b, (p), \ 1524 (__mmask8)(m)); }) 1525 1526#define _mm512_mask_cmp_epu64_mask(m, a, b, p) __extension__ ({ \ 1527 __m512i __a = (a); \ 1528 __m512i __b = (b); \ 1529 (__mmask8)__builtin_ia32_ucmpq512_mask((__v8di)__a, (__v8di)__b, (p), \ 1530 (__mmask8)(m)); }) 1531#endif // __AVX512FINTRIN_H 1532