1 /* Copyright (C) 2008, 2009 Free Software Foundation, Inc. 2 3 This file is part of GCC. 4 5 GCC is free software; you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published by 7 the Free Software Foundation; either version 3, or (at your option) 8 any later version. 9 10 GCC is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 GNU General Public License for more details. 14 15 Under Section 7 of GPL version 3, you are granted additional 16 permissions described in the GCC Runtime Library Exception, version 17 3.1, as published by the Free Software Foundation. 18 19 You should have received a copy of the GNU General Public License and 20 a copy of the GCC Runtime Library Exception along with this program; 21 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 22 <http://www.gnu.org/licenses/>. */ 23 24 /* Implemented from the specification included in the Intel C++ Compiler 25 User Guide and Reference, version 11.0. */ 26 27 #ifndef _IMMINTRIN_H_INCLUDED 28 # error "Never use <avxintrin.h> directly; include <immintrin.h> instead." 29 #endif 30 31 /* Internal data types for implementing the intrinsics. */ 32 typedef double __v4df __attribute__ ((__vector_size__ (32))); 33 typedef float __v8sf __attribute__ ((__vector_size__ (32))); 34 typedef long long __v4di __attribute__ ((__vector_size__ (32))); 35 typedef int __v8si __attribute__ ((__vector_size__ (32))); 36 typedef short __v16hi __attribute__ ((__vector_size__ (32))); 37 typedef char __v32qi __attribute__ ((__vector_size__ (32))); 38 39 /* The Intel API is flexible enough that we must allow aliasing with other 40 vector types, and their scalar components. */ 41 typedef float __m256 __attribute__ ((__vector_size__ (32), 42 __may_alias__)); 43 typedef long long __m256i __attribute__ ((__vector_size__ (32), 44 __may_alias__)); 45 typedef double __m256d __attribute__ ((__vector_size__ (32), 46 __may_alias__)); 47 48 /* Compare predicates for scalar and packed compare intrinsics. */ 49 50 /* Equal (ordered, non-signaling) */ 51 #define _CMP_EQ_OQ 0x00 52 /* Less-than (ordered, signaling) */ 53 #define _CMP_LT_OS 0x01 54 /* Less-than-or-equal (ordered, signaling) */ 55 #define _CMP_LE_OS 0x02 56 /* Unordered (non-signaling) */ 57 #define _CMP_UNORD_Q 0x03 58 /* Not-equal (unordered, non-signaling) */ 59 #define _CMP_NEQ_UQ 0x04 60 /* Not-less-than (unordered, signaling) */ 61 #define _CMP_NLT_US 0x05 62 /* Not-less-than-or-equal (unordered, signaling) */ 63 #define _CMP_NLE_US 0x06 64 /* Ordered (nonsignaling) */ 65 #define _CMP_ORD_Q 0x07 66 /* Equal (unordered, non-signaling) */ 67 #define _CMP_EQ_UQ 0x08 68 /* Not-greater-than-or-equal (unordered, signaling) */ 69 #define _CMP_NGE_US 0x09 70 /* Not-greater-than (unordered, signaling) */ 71 #define _CMP_NGT_US 0x0a 72 /* False (ordered, non-signaling) */ 73 #define _CMP_FALSE_OQ 0x0b 74 /* Not-equal (ordered, non-signaling) */ 75 #define _CMP_NEQ_OQ 0x0c 76 /* Greater-than-or-equal (ordered, signaling) */ 77 #define _CMP_GE_OS 0x0d 78 /* Greater-than (ordered, signaling) */ 79 #define _CMP_GT_OS 0x0e 80 /* True (unordered, non-signaling) */ 81 #define _CMP_TRUE_UQ 0x0f 82 /* Equal (ordered, signaling) */ 83 #define _CMP_EQ_OS 0x10 84 /* Less-than (ordered, non-signaling) */ 85 #define _CMP_LT_OQ 0x11 86 /* Less-than-or-equal (ordered, non-signaling) */ 87 #define _CMP_LE_OQ 0x12 88 /* Unordered (signaling) */ 89 #define _CMP_UNORD_S 0x13 90 /* Not-equal (unordered, signaling) */ 91 #define _CMP_NEQ_US 0x14 92 /* Not-less-than (unordered, non-signaling) */ 93 #define _CMP_NLT_UQ 0x15 94 /* Not-less-than-or-equal (unordered, non-signaling) */ 95 #define _CMP_NLE_UQ 0x16 96 /* Ordered (signaling) */ 97 #define _CMP_ORD_S 0x17 98 /* Equal (unordered, signaling) */ 99 #define _CMP_EQ_US 0x18 100 /* Not-greater-than-or-equal (unordered, non-signaling) */ 101 #define _CMP_NGE_UQ 0x19 102 /* Not-greater-than (unordered, non-signaling) */ 103 #define _CMP_NGT_UQ 0x1a 104 /* False (ordered, signaling) */ 105 #define _CMP_FALSE_OS 0x1b 106 /* Not-equal (ordered, signaling) */ 107 #define _CMP_NEQ_OS 0x1c 108 /* Greater-than-or-equal (ordered, non-signaling) */ 109 #define _CMP_GE_OQ 0x1d 110 /* Greater-than (ordered, non-signaling) */ 111 #define _CMP_GT_OQ 0x1e 112 /* True (unordered, signaling) */ 113 #define _CMP_TRUE_US 0x1f 114 115 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 116 _mm256_add_pd (__m256d __A, __m256d __B) 117 { 118 return (__m256d) __builtin_ia32_addpd256 ((__v4df)__A, (__v4df)__B); 119 } 120 121 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 122 _mm256_add_ps (__m256 __A, __m256 __B) 123 { 124 return (__m256) __builtin_ia32_addps256 ((__v8sf)__A, (__v8sf)__B); 125 } 126 127 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 128 _mm256_addsub_pd (__m256d __A, __m256d __B) 129 { 130 return (__m256d) __builtin_ia32_addsubpd256 ((__v4df)__A, (__v4df)__B); 131 } 132 133 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 134 _mm256_addsub_ps (__m256 __A, __m256 __B) 135 { 136 return (__m256) __builtin_ia32_addsubps256 ((__v8sf)__A, (__v8sf)__B); 137 } 138 139 140 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 141 _mm256_and_pd (__m256d __A, __m256d __B) 142 { 143 return (__m256d) __builtin_ia32_andpd256 ((__v4df)__A, (__v4df)__B); 144 } 145 146 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 147 _mm256_and_ps (__m256 __A, __m256 __B) 148 { 149 return (__m256) __builtin_ia32_andps256 ((__v8sf)__A, (__v8sf)__B); 150 } 151 152 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 153 _mm256_andnot_pd (__m256d __A, __m256d __B) 154 { 155 return (__m256d) __builtin_ia32_andnpd256 ((__v4df)__A, (__v4df)__B); 156 } 157 158 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 159 _mm256_andnot_ps (__m256 __A, __m256 __B) 160 { 161 return (__m256) __builtin_ia32_andnps256 ((__v8sf)__A, (__v8sf)__B); 162 } 163 164 /* Double/single precision floating point blend instructions - select 165 data from 2 sources using constant/variable mask. */ 166 167 #ifdef __OPTIMIZE__ 168 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 169 _mm256_blend_pd (__m256d __X, __m256d __Y, const int __M) 170 { 171 return (__m256d) __builtin_ia32_blendpd256 ((__v4df)__X, 172 (__v4df)__Y, 173 __M); 174 } 175 176 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 177 _mm256_blend_ps (__m256 __X, __m256 __Y, const int __M) 178 { 179 return (__m256) __builtin_ia32_blendps256 ((__v8sf)__X, 180 (__v8sf)__Y, 181 __M); 182 } 183 #else 184 #define _mm256_blend_pd(X, Y, M) \ 185 ((__m256d) __builtin_ia32_blendpd256 ((__v4df)(__m256d)(X), \ 186 (__v4df)(__m256d)(Y), (int)(M))) 187 188 #define _mm256_blend_ps(X, Y, M) \ 189 ((__m256) __builtin_ia32_blendps256 ((__v8sf)(__m256)(X), \ 190 (__v8sf)(__m256)(Y), (int)(M))) 191 #endif 192 193 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 194 _mm256_blendv_pd (__m256d __X, __m256d __Y, __m256d __M) 195 { 196 return (__m256d) __builtin_ia32_blendvpd256 ((__v4df)__X, 197 (__v4df)__Y, 198 (__v4df)__M); 199 } 200 201 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 202 _mm256_blendv_ps (__m256 __X, __m256 __Y, __m256 __M) 203 { 204 return (__m256) __builtin_ia32_blendvps256 ((__v8sf)__X, 205 (__v8sf)__Y, 206 (__v8sf)__M); 207 } 208 209 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 210 _mm256_div_pd (__m256d __A, __m256d __B) 211 { 212 return (__m256d) __builtin_ia32_divpd256 ((__v4df)__A, (__v4df)__B); 213 } 214 215 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 216 _mm256_div_ps (__m256 __A, __m256 __B) 217 { 218 return (__m256) __builtin_ia32_divps256 ((__v8sf)__A, (__v8sf)__B); 219 } 220 221 /* Dot product instructions with mask-defined summing and zeroing parts 222 of result. */ 223 224 #ifdef __OPTIMIZE__ 225 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 226 _mm256_dp_ps (__m256 __X, __m256 __Y, const int __M) 227 { 228 return (__m256) __builtin_ia32_dpps256 ((__v8sf)__X, 229 (__v8sf)__Y, 230 __M); 231 } 232 #else 233 #define _mm256_dp_ps(X, Y, M) \ 234 ((__m256) __builtin_ia32_dpps256 ((__v8sf)(__m256)(X), \ 235 (__v8sf)(__m256)(Y), (int)(M))) 236 #endif 237 238 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 239 _mm256_hadd_pd (__m256d __X, __m256d __Y) 240 { 241 return (__m256d) __builtin_ia32_haddpd256 ((__v4df)__X, (__v4df)__Y); 242 } 243 244 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 245 _mm256_hadd_ps (__m256 __X, __m256 __Y) 246 { 247 return (__m256) __builtin_ia32_haddps256 ((__v8sf)__X, (__v8sf)__Y); 248 } 249 250 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 251 _mm256_hsub_pd (__m256d __X, __m256d __Y) 252 { 253 return (__m256d) __builtin_ia32_hsubpd256 ((__v4df)__X, (__v4df)__Y); 254 } 255 256 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 257 _mm256_hsub_ps (__m256 __X, __m256 __Y) 258 { 259 return (__m256) __builtin_ia32_hsubps256 ((__v8sf)__X, (__v8sf)__Y); 260 } 261 262 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 263 _mm256_max_pd (__m256d __A, __m256d __B) 264 { 265 return (__m256d) __builtin_ia32_maxpd256 ((__v4df)__A, (__v4df)__B); 266 } 267 268 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 269 _mm256_max_ps (__m256 __A, __m256 __B) 270 { 271 return (__m256) __builtin_ia32_maxps256 ((__v8sf)__A, (__v8sf)__B); 272 } 273 274 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 275 _mm256_min_pd (__m256d __A, __m256d __B) 276 { 277 return (__m256d) __builtin_ia32_minpd256 ((__v4df)__A, (__v4df)__B); 278 } 279 280 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 281 _mm256_min_ps (__m256 __A, __m256 __B) 282 { 283 return (__m256) __builtin_ia32_minps256 ((__v8sf)__A, (__v8sf)__B); 284 } 285 286 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 287 _mm256_mul_pd (__m256d __A, __m256d __B) 288 { 289 return (__m256d) __builtin_ia32_mulpd256 ((__v4df)__A, (__v4df)__B); 290 } 291 292 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 293 _mm256_mul_ps (__m256 __A, __m256 __B) 294 { 295 return (__m256) __builtin_ia32_mulps256 ((__v8sf)__A, (__v8sf)__B); 296 } 297 298 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 299 _mm256_or_pd (__m256d __A, __m256d __B) 300 { 301 return (__m256d) __builtin_ia32_orpd256 ((__v4df)__A, (__v4df)__B); 302 } 303 304 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 305 _mm256_or_ps (__m256 __A, __m256 __B) 306 { 307 return (__m256) __builtin_ia32_orps256 ((__v8sf)__A, (__v8sf)__B); 308 } 309 310 #ifdef __OPTIMIZE__ 311 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 312 _mm256_shuffle_pd (__m256d __A, __m256d __B, const int __mask) 313 { 314 return (__m256d) __builtin_ia32_shufpd256 ((__v4df)__A, (__v4df)__B, 315 __mask); 316 } 317 318 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 319 _mm256_shuffle_ps (__m256 __A, __m256 __B, const int __mask) 320 { 321 return (__m256) __builtin_ia32_shufps256 ((__v8sf)__A, (__v8sf)__B, 322 __mask); 323 } 324 #else 325 #define _mm256_shuffle_pd(A, B, N) \ 326 ((__m256d)__builtin_ia32_shufpd256 ((__v4df)(__m256d)(A), \ 327 (__v4df)(__m256d)(B), (int)(N))) 328 329 #define _mm256_shuffle_ps(A, B, N) \ 330 ((__m256) __builtin_ia32_shufps256 ((__v8sf)(__m256)(A), \ 331 (__v8sf)(__m256)(B), (int)(N))) 332 #endif 333 334 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 335 _mm256_sub_pd (__m256d __A, __m256d __B) 336 { 337 return (__m256d) __builtin_ia32_subpd256 ((__v4df)__A, (__v4df)__B); 338 } 339 340 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 341 _mm256_sub_ps (__m256 __A, __m256 __B) 342 { 343 return (__m256) __builtin_ia32_subps256 ((__v8sf)__A, (__v8sf)__B); 344 } 345 346 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 347 _mm256_xor_pd (__m256d __A, __m256d __B) 348 { 349 return (__m256d) __builtin_ia32_xorpd256 ((__v4df)__A, (__v4df)__B); 350 } 351 352 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 353 _mm256_xor_ps (__m256 __A, __m256 __B) 354 { 355 return (__m256) __builtin_ia32_xorps256 ((__v8sf)__A, (__v8sf)__B); 356 } 357 358 #ifdef __OPTIMIZE__ 359 extern __inline __m128d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 360 _mm_cmp_pd (__m128d __X, __m128d __Y, const int __P) 361 { 362 return (__m128d) __builtin_ia32_cmppd ((__v2df)__X, (__v2df)__Y, __P); 363 } 364 365 extern __inline __m128 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 366 _mm_cmp_ps (__m128 __X, __m128 __Y, const int __P) 367 { 368 return (__m128) __builtin_ia32_cmpps ((__v4sf)__X, (__v4sf)__Y, __P); 369 } 370 371 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 372 _mm256_cmp_pd (__m256d __X, __m256d __Y, const int __P) 373 { 374 return (__m256d) __builtin_ia32_cmppd256 ((__v4df)__X, (__v4df)__Y, 375 __P); 376 } 377 378 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 379 _mm256_cmp_ps (__m256 __X, __m256 __Y, const int __P) 380 { 381 return (__m256) __builtin_ia32_cmpps256 ((__v8sf)__X, (__v8sf)__Y, 382 __P); 383 } 384 385 extern __inline __m128d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 386 _mm_cmp_sd (__m128d __X, __m128d __Y, const int __P) 387 { 388 return (__m128d) __builtin_ia32_cmpsd ((__v2df)__X, (__v2df)__Y, __P); 389 } 390 391 extern __inline __m128 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 392 _mm_cmp_ss (__m128 __X, __m128 __Y, const int __P) 393 { 394 return (__m128) __builtin_ia32_cmpss ((__v4sf)__X, (__v4sf)__Y, __P); 395 } 396 #else 397 #define _mm_cmp_pd(X, Y, P) \ 398 ((__m128d) __builtin_ia32_cmppd ((__v2df)(__m128d)(X), \ 399 (__v2df)(__m128d)(Y), (int)(P))) 400 401 #define _mm_cmp_ps(X, Y, P) \ 402 ((__m128) __builtin_ia32_cmpps ((__v4sf)(__m128)(X), \ 403 (__v4sf)(__m128)(Y), (int)(P))) 404 405 #define _mm256_cmp_pd(X, Y, P) \ 406 ((__m256d) __builtin_ia32_cmppd256 ((__v4df)(__m256d)(X), \ 407 (__v4df)(__m256d)(Y), (int)(P))) 408 409 #define _mm256_cmp_ps(X, Y, P) \ 410 ((__m256) __builtin_ia32_cmpps256 ((__v8sf)(__m256)(X), \ 411 (__v8sf)(__m256)(Y), (int)(P))) 412 413 #define _mm_cmp_sd(X, Y, P) \ 414 ((__m128d) __builtin_ia32_cmpsd ((__v2df)(__m128d)(X), \ 415 (__v2df)(__m128d)(Y), (int)(P))) 416 417 #define _mm_cmp_ss(X, Y, P) \ 418 ((__m128) __builtin_ia32_cmpss ((__v4sf)(__m128)(X), \ 419 (__v4sf)(__m128)(Y), (int)(P))) 420 #endif 421 422 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 423 _mm256_cvtepi32_pd (__m128i __A) 424 { 425 return (__m256d)__builtin_ia32_cvtdq2pd256 ((__v4si) __A); 426 } 427 428 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 429 _mm256_cvtepi32_ps (__m256i __A) 430 { 431 return (__m256)__builtin_ia32_cvtdq2ps256 ((__v8si) __A); 432 } 433 434 extern __inline __m128 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 435 _mm256_cvtpd_ps (__m256d __A) 436 { 437 return (__m128)__builtin_ia32_cvtpd2ps256 ((__v4df) __A); 438 } 439 440 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 441 _mm256_cvtps_epi32 (__m256 __A) 442 { 443 return (__m256i)__builtin_ia32_cvtps2dq256 ((__v8sf) __A); 444 } 445 446 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 447 _mm256_cvtps_pd (__m128 __A) 448 { 449 return (__m256d)__builtin_ia32_cvtps2pd256 ((__v4sf) __A); 450 } 451 452 extern __inline __m128i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 453 _mm256_cvttpd_epi32 (__m256d __A) 454 { 455 return (__m128i)__builtin_ia32_cvttpd2dq256 ((__v4df) __A); 456 } 457 458 extern __inline __m128i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 459 _mm256_cvtpd_epi32 (__m256d __A) 460 { 461 return (__m128i)__builtin_ia32_cvtpd2dq256 ((__v4df) __A); 462 } 463 464 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 465 _mm256_cvttps_epi32 (__m256 __A) 466 { 467 return (__m256i)__builtin_ia32_cvttps2dq256 ((__v8sf) __A); 468 } 469 470 #ifdef __OPTIMIZE__ 471 extern __inline __m128d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 472 _mm256_extractf128_pd (__m256d __X, const int __N) 473 { 474 return (__m128d) __builtin_ia32_vextractf128_pd256 ((__v4df)__X, __N); 475 } 476 477 extern __inline __m128 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 478 _mm256_extractf128_ps (__m256 __X, const int __N) 479 { 480 return (__m128) __builtin_ia32_vextractf128_ps256 ((__v8sf)__X, __N); 481 } 482 483 extern __inline __m128i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 484 _mm256_extractf128_si256 (__m256i __X, const int __N) 485 { 486 return (__m128i) __builtin_ia32_vextractf128_si256 ((__v8si)__X, __N); 487 } 488 489 extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 490 _mm256_extract_epi32 (__m256i __X, int const __N) 491 { 492 __m128i __Y = _mm256_extractf128_si256 (__X, __N >> 2); 493 return _mm_extract_epi32 (__Y, __N % 4); 494 } 495 496 extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 497 _mm256_extract_epi16 (__m256i __X, int const __N) 498 { 499 __m128i __Y = _mm256_extractf128_si256 (__X, __N >> 3); 500 return _mm_extract_epi16 (__Y, __N % 8); 501 } 502 503 extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 504 _mm256_extract_epi8 (__m256i __X, int const __N) 505 { 506 __m128i __Y = _mm256_extractf128_si256 (__X, __N >> 4); 507 return _mm_extract_epi8 (__Y, __N % 16); 508 } 509 510 #ifdef __x86_64__ 511 extern __inline long long __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 512 _mm256_extract_epi64 (__m256i __X, const int __N) 513 { 514 __m128i __Y = _mm256_extractf128_si256 (__X, __N >> 1); 515 return _mm_extract_epi64 (__Y, __N % 2); 516 } 517 #endif 518 #else 519 #define _mm256_extractf128_pd(X, N) \ 520 ((__m128d) __builtin_ia32_vextractf128_pd256 ((__v4df)(__m256d)(X), \ 521 (int)(N))) 522 523 #define _mm256_extractf128_ps(X, N) \ 524 ((__m128) __builtin_ia32_vextractf128_ps256 ((__v8sf)(__m256)(X), \ 525 (int)(N))) 526 527 #define _mm256_extractf128_si256(X, N) \ 528 ((__m128i) __builtin_ia32_vextractf128_si256 ((__v8si)(__m256i)(X), \ 529 (int)(N))) 530 531 #define _mm256_extract_epi32(X, N) \ 532 (__extension__ \ 533 ({ \ 534 __m128i __Y = _mm256_extractf128_si256 ((X), (N) >> 2); \ 535 _mm_extract_epi32 (__Y, (N) % 4); \ 536 })) 537 538 #define _mm256_extract_epi16(X, N) \ 539 (__extension__ \ 540 ({ \ 541 __m128i __Y = _mm256_extractf128_si256 ((X), (N) >> 3); \ 542 _mm_extract_epi16 (__Y, (N) % 8); \ 543 })) 544 545 #define _mm256_extract_epi8(X, N) \ 546 (__extension__ \ 547 ({ \ 548 __m128i __Y = _mm256_extractf128_si256 ((X), (N) >> 4); \ 549 _mm_extract_epi8 (__Y, (N) % 16); \ 550 })) 551 552 #ifdef __x86_64__ 553 #define _mm256_extract_epi64(X, N) \ 554 (__extension__ \ 555 ({ \ 556 __m128i __Y = _mm256_extractf128_si256 ((X), (N) >> 1); \ 557 _mm_extract_epi64 (__Y, (N) % 2); \ 558 })) 559 #endif 560 #endif 561 562 extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 563 _mm256_zeroall (void) 564 { 565 __builtin_ia32_vzeroall (); 566 } 567 568 extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 569 _mm256_zeroupper (void) 570 { 571 __builtin_ia32_vzeroupper (); 572 } 573 574 extern __inline __m128d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 575 _mm_permutevar_pd (__m128d __A, __m128i __C) 576 { 577 return (__m128d) __builtin_ia32_vpermilvarpd ((__v2df)__A, 578 (__v2di)__C); 579 } 580 581 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 582 _mm256_permutevar_pd (__m256d __A, __m256i __C) 583 { 584 return (__m256d) __builtin_ia32_vpermilvarpd256 ((__v4df)__A, 585 (__v4di)__C); 586 } 587 588 extern __inline __m128 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 589 _mm_permutevar_ps (__m128 __A, __m128i __C) 590 { 591 return (__m128) __builtin_ia32_vpermilvarps ((__v4sf)__A, 592 (__v4si)__C); 593 } 594 595 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 596 _mm256_permutevar_ps (__m256 __A, __m256i __C) 597 { 598 return (__m256) __builtin_ia32_vpermilvarps256 ((__v8sf)__A, 599 (__v8si)__C); 600 } 601 602 #ifdef __OPTIMIZE__ 603 extern __inline __m128d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 604 _mm_permute_pd (__m128d __X, const int __C) 605 { 606 return (__m128d) __builtin_ia32_vpermilpd ((__v2df)__X, __C); 607 } 608 609 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 610 _mm256_permute_pd (__m256d __X, const int __C) 611 { 612 return (__m256d) __builtin_ia32_vpermilpd256 ((__v4df)__X, __C); 613 } 614 615 extern __inline __m128 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 616 _mm_permute_ps (__m128 __X, const int __C) 617 { 618 return (__m128) __builtin_ia32_vpermilps ((__v4sf)__X, __C); 619 } 620 621 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 622 _mm256_permute_ps (__m256 __X, const int __C) 623 { 624 return (__m256) __builtin_ia32_vpermilps256 ((__v8sf)__X, __C); 625 } 626 #else 627 #define _mm_permute_pd(X, C) \ 628 ((__m128d) __builtin_ia32_vpermilpd ((__v2df)(__m128d)(X), (int)(C))) 629 630 #define _mm256_permute_pd(X, C) \ 631 ((__m256d) __builtin_ia32_vpermilpd256 ((__v4df)(__m256d)(X), (int)(C))) 632 633 #define _mm_permute_ps(X, C) \ 634 ((__m128) __builtin_ia32_vpermilps ((__v4sf)(__m128)(X), (int)(C))) 635 636 #define _mm256_permute_ps(X, C) \ 637 ((__m256) __builtin_ia32_vpermilps256 ((__v8sf)(__m256)(X), (int)(C))) 638 #endif 639 640 #ifdef __OPTIMIZE__ 641 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 642 _mm256_permute2f128_pd (__m256d __X, __m256d __Y, const int __C) 643 { 644 return (__m256d) __builtin_ia32_vperm2f128_pd256 ((__v4df)__X, 645 (__v4df)__Y, 646 __C); 647 } 648 649 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 650 _mm256_permute2f128_ps (__m256 __X, __m256 __Y, const int __C) 651 { 652 return (__m256) __builtin_ia32_vperm2f128_ps256 ((__v8sf)__X, 653 (__v8sf)__Y, 654 __C); 655 } 656 657 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 658 _mm256_permute2f128_si256 (__m256i __X, __m256i __Y, const int __C) 659 { 660 return (__m256i) __builtin_ia32_vperm2f128_si256 ((__v8si)__X, 661 (__v8si)__Y, 662 __C); 663 } 664 #else 665 #define _mm256_permute2f128_pd(X, Y, C) \ 666 ((__m256d) __builtin_ia32_vperm2f128_pd256 ((__v4df)(__m256d)(X), \ 667 (__v4df)(__m256d)(Y), \ 668 (int)(C))) 669 670 #define _mm256_permute2f128_ps(X, Y, C) \ 671 ((__m256) __builtin_ia32_vperm2f128_ps256 ((__v8sf)(__m256)(X), \ 672 (__v8sf)(__m256)(Y), \ 673 (int)(C))) 674 675 #define _mm256_permute2f128_si256(X, Y, C) \ 676 ((__m256i) __builtin_ia32_vperm2f128_si256 ((__v8si)(__m256i)(X), \ 677 (__v8si)(__m256i)(Y), \ 678 (int)(C))) 679 #endif 680 681 extern __inline __m128 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 682 _mm_broadcast_ss (float const *__X) 683 { 684 return (__m128) __builtin_ia32_vbroadcastss (__X); 685 } 686 687 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 688 _mm256_broadcast_sd (double const *__X) 689 { 690 return (__m256d) __builtin_ia32_vbroadcastsd256 (__X); 691 } 692 693 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 694 _mm256_broadcast_ss (float const *__X) 695 { 696 return (__m256) __builtin_ia32_vbroadcastss256 (__X); 697 } 698 699 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 700 _mm256_broadcast_pd (__m128d const *__X) 701 { 702 return (__m256d) __builtin_ia32_vbroadcastf128_pd256 (__X); 703 } 704 705 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 706 _mm256_broadcast_ps (__m128 const *__X) 707 { 708 return (__m256) __builtin_ia32_vbroadcastf128_ps256 (__X); 709 } 710 711 #ifdef __OPTIMIZE__ 712 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 713 _mm256_insertf128_pd (__m256d __X, __m128d __Y, const int __O) 714 { 715 return (__m256d) __builtin_ia32_vinsertf128_pd256 ((__v4df)__X, 716 (__v2df)__Y, 717 __O); 718 } 719 720 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 721 _mm256_insertf128_ps (__m256 __X, __m128 __Y, const int __O) 722 { 723 return (__m256) __builtin_ia32_vinsertf128_ps256 ((__v8sf)__X, 724 (__v4sf)__Y, 725 __O); 726 } 727 728 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 729 _mm256_insertf128_si256 (__m256i __X, __m128i __Y, const int __O) 730 { 731 return (__m256i) __builtin_ia32_vinsertf128_si256 ((__v8si)__X, 732 (__v4si)__Y, 733 __O); 734 } 735 736 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 737 _mm256_insert_epi32 (__m256i __X, int __D, int const __N) 738 { 739 __m128i __Y = _mm256_extractf128_si256 (__X, __N >> 2); 740 __Y = _mm_insert_epi16 (__Y, __D, __N % 4); 741 return _mm256_insertf128_si256 (__X, __Y, __N >> 2); 742 } 743 744 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 745 _mm256_insert_epi16 (__m256i __X, int __D, int const __N) 746 { 747 __m128i __Y = _mm256_extractf128_si256 (__X, __N >> 3); 748 __Y = _mm_insert_epi16 (__Y, __D, __N % 8); 749 return _mm256_insertf128_si256 (__X, __Y, __N >> 3); 750 } 751 752 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 753 _mm256_insert_epi8 (__m256i __X, int __D, int const __N) 754 { 755 __m128i __Y = _mm256_extractf128_si256 (__X, __N >> 4); 756 __Y = _mm_insert_epi8 (__Y, __D, __N % 16); 757 return _mm256_insertf128_si256 (__X, __Y, __N >> 4); 758 } 759 760 #ifdef __x86_64__ 761 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 762 _mm256_insert_epi64 (__m256i __X, int __D, int const __N) 763 { 764 __m128i __Y = _mm256_extractf128_si256 (__X, __N >> 1); 765 __Y = _mm_insert_epi16 (__Y, __D, __N % 2); 766 return _mm256_insertf128_si256 (__X, __Y, __N >> 1); 767 } 768 #endif 769 #else 770 #define _mm256_insertf128_pd(X, Y, O) \ 771 ((__m256d) __builtin_ia32_vinsertf128_pd256 ((__v4df)(__m256d)(X), \ 772 (__v2df)(__m128d)(Y), \ 773 (int)(O))) 774 775 #define _mm256_insertf128_ps(X, Y, O) \ 776 ((__m256) __builtin_ia32_vinsertf128_ps256 ((__v8sf)(__m256)(X), \ 777 (__v4sf)(__m128)(Y), \ 778 (int)(O))) 779 780 #define _mm256_insertf128_si256(X, Y, O) \ 781 ((__m256i) __builtin_ia32_vinsertf128_si256 ((__v8si)(__m256i)(X), \ 782 (__v4si)(__m128i)(Y), \ 783 (int)(O))) 784 785 #define _mm256_insert_epi32(X, D, N) \ 786 (__extension__ \ 787 ({ \ 788 __m128i __Y = _mm256_extractf128_si256 ((X), (N) >> 2); \ 789 __Y = _mm_insert_epi32 (__Y, (D), (N) % 4); \ 790 _mm256_insertf128_si256 ((X), __Y, (N) >> 2); \ 791 })) 792 793 #define _mm256_insert_epi16(X, D, N) \ 794 (__extension__ \ 795 ({ \ 796 __m128i __Y = _mm256_extractf128_si256 ((X), (N) >> 3); \ 797 __Y = _mm_insert_epi16 (__Y, (D), (N) % 8); \ 798 _mm256_insertf128_si256 ((X), __Y, (N) >> 3); \ 799 })) 800 801 #define _mm256_insert_epi8(X, D, N) \ 802 (__extension__ \ 803 ({ \ 804 __m128i __Y = _mm256_extractf128_si256 ((X), (N) >> 4); \ 805 __Y = _mm_insert_epi8 (__Y, (D), (N) % 16); \ 806 _mm256_insertf128_si256 ((X), __Y, (N) >> 4); \ 807 })) 808 809 #ifdef __x86_64__ 810 #define _mm256_insert_epi64(X, D, N) \ 811 (__extension__ \ 812 ({ \ 813 __m128i __Y = _mm256_extractf128_si256 ((X), (N) >> 1); \ 814 __Y = _mm_insert_epi64 (__Y, (D), (N) % 2); \ 815 _mm256_insertf128_si256 ((X), __Y, (N) >> 1); \ 816 })) 817 #endif 818 #endif 819 820 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 821 _mm256_load_pd (double const *__P) 822 { 823 return *(__m256d *)__P; 824 } 825 826 extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 827 _mm256_store_pd (double *__P, __m256d __A) 828 { 829 *(__m256d *)__P = __A; 830 } 831 832 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 833 _mm256_load_ps (float const *__P) 834 { 835 return *(__m256 *)__P; 836 } 837 838 extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 839 _mm256_store_ps (float *__P, __m256 __A) 840 { 841 *(__m256 *)__P = __A; 842 } 843 844 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 845 _mm256_loadu_pd (double const *__P) 846 { 847 return (__m256d) __builtin_ia32_loadupd256 (__P); 848 } 849 850 extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 851 _mm256_storeu_pd (double *__P, __m256d __A) 852 { 853 __builtin_ia32_storeupd256 (__P, (__v4df)__A); 854 } 855 856 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 857 _mm256_loadu_ps (float const *__P) 858 { 859 return (__m256) __builtin_ia32_loadups256 (__P); 860 } 861 862 extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 863 _mm256_storeu_ps (float *__P, __m256 __A) 864 { 865 __builtin_ia32_storeups256 (__P, (__v8sf)__A); 866 } 867 868 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 869 _mm256_load_si256 (__m256i const *__P) 870 { 871 return *__P; 872 } 873 874 extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 875 _mm256_store_si256 (__m256i *__P, __m256i __A) 876 { 877 *__P = __A; 878 } 879 880 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 881 _mm256_loadu_si256 (__m256i const *__P) 882 { 883 return (__m256i) __builtin_ia32_loaddqu256 ((char const *)__P); 884 } 885 886 extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 887 _mm256_storeu_si256 (__m256i *__P, __m256i __A) 888 { 889 __builtin_ia32_storedqu256 ((char *)__P, (__v32qi)__A); 890 } 891 892 extern __inline __m128d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 893 _mm_maskload_pd (double const *__P, __m128d __M) 894 { 895 return (__m128d) __builtin_ia32_maskloadpd ((const __v2df *)__P, 896 (__v2df)__M); 897 } 898 899 extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 900 _mm_maskstore_pd (double *__P, __m128d __M, __m128d __A) 901 { 902 __builtin_ia32_maskstorepd ((__v2df *)__P, (__v2df)__M, (__v2df)__A); 903 } 904 905 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 906 _mm256_maskload_pd (double const *__P, __m256d __M) 907 { 908 return (__m256d) __builtin_ia32_maskloadpd256 ((const __v4df *)__P, 909 (__v4df)__M); 910 } 911 912 extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 913 _mm256_maskstore_pd (double *__P, __m256d __M, __m256d __A) 914 { 915 __builtin_ia32_maskstorepd256 ((__v4df *)__P, (__v4df)__M, (__v4df)__A); 916 } 917 918 extern __inline __m128 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 919 _mm_maskload_ps (float const *__P, __m128 __M) 920 { 921 return (__m128) __builtin_ia32_maskloadps ((const __v4sf *)__P, 922 (__v4sf)__M); 923 } 924 925 extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 926 _mm_maskstore_ps (float *__P, __m128 __M, __m128 __A) 927 { 928 __builtin_ia32_maskstoreps ((__v4sf *)__P, (__v4sf)__M, (__v4sf)__A); 929 } 930 931 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 932 _mm256_maskload_ps (float const *__P, __m256 __M) 933 { 934 return (__m256) __builtin_ia32_maskloadps256 ((const __v8sf *)__P, 935 (__v8sf)__M); 936 } 937 938 extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 939 _mm256_maskstore_ps (float *__P, __m256 __M, __m256 __A) 940 { 941 __builtin_ia32_maskstoreps256 ((__v8sf *)__P, (__v8sf)__M, (__v8sf)__A); 942 } 943 944 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 945 _mm256_movehdup_ps (__m256 __X) 946 { 947 return (__m256) __builtin_ia32_movshdup256 ((__v8sf)__X); 948 } 949 950 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 951 _mm256_moveldup_ps (__m256 __X) 952 { 953 return (__m256) __builtin_ia32_movsldup256 ((__v8sf)__X); 954 } 955 956 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 957 _mm256_movedup_pd (__m256d __X) 958 { 959 return (__m256d) __builtin_ia32_movddup256 ((__v4df)__X); 960 } 961 962 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 963 _mm256_lddqu_si256 (__m256i const *__P) 964 { 965 return (__m256i) __builtin_ia32_lddqu256 ((char const *)__P); 966 } 967 968 extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 969 _mm256_stream_si256 (__m256i *__A, __m256i __B) 970 { 971 __builtin_ia32_movntdq256 ((__v4di *)__A, (__v4di)__B); 972 } 973 974 extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 975 _mm256_stream_pd (double *__A, __m256d __B) 976 { 977 __builtin_ia32_movntpd256 (__A, (__v4df)__B); 978 } 979 980 extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 981 _mm256_stream_ps (float *__P, __m256 __A) 982 { 983 __builtin_ia32_movntps256 (__P, (__v8sf)__A); 984 } 985 986 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 987 _mm256_rcp_ps (__m256 __A) 988 { 989 return (__m256) __builtin_ia32_rcpps256 ((__v8sf)__A); 990 } 991 992 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 993 _mm256_rsqrt_ps (__m256 __A) 994 { 995 return (__m256) __builtin_ia32_rsqrtps256 ((__v8sf)__A); 996 } 997 998 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 999 _mm256_sqrt_pd (__m256d __A) 1000 { 1001 return (__m256d) __builtin_ia32_sqrtpd256 ((__v4df)__A); 1002 } 1003 1004 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1005 _mm256_sqrt_ps (__m256 __A) 1006 { 1007 return (__m256) __builtin_ia32_sqrtps256 ((__v8sf)__A); 1008 } 1009 1010 #ifdef __OPTIMIZE__ 1011 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1012 _mm256_round_pd (__m256d __V, const int __M) 1013 { 1014 return (__m256d) __builtin_ia32_roundpd256 ((__v4df)__V, __M); 1015 } 1016 1017 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1018 _mm256_round_ps (__m256 __V, const int __M) 1019 { 1020 return (__m256) __builtin_ia32_roundps256 ((__v8sf)__V, __M); 1021 } 1022 #else 1023 #define _mm256_round_pd(V, M) \ 1024 ((__m256d) __builtin_ia32_roundpd256 ((__v4df)(__m256d)(V), (int)(M))) 1025 1026 #define _mm256_round_ps(V, M) \ 1027 ((__m256) __builtin_ia32_roundps256 ((__v8sf)(__m256)(V), (int)(M))) 1028 #endif 1029 1030 #define _mm256_ceil_pd(V) _mm256_round_pd ((V), _MM_FROUND_CEIL) 1031 #define _mm256_floor_pd(V) _mm256_round_pd ((V), _MM_FROUND_FLOOR) 1032 #define _mm256_ceil_ps(V) _mm256_round_ps ((V), _MM_FROUND_CEIL) 1033 #define _mm256_floor_ps(V) _mm256_round_ps ((V), _MM_FROUND_FLOOR) 1034 1035 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1036 _mm256_unpackhi_pd (__m256d __A, __m256d __B) 1037 { 1038 return (__m256d) __builtin_ia32_unpckhpd256 ((__v4df)__A, (__v4df)__B); 1039 } 1040 1041 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1042 _mm256_unpacklo_pd (__m256d __A, __m256d __B) 1043 { 1044 return (__m256d) __builtin_ia32_unpcklpd256 ((__v4df)__A, (__v4df)__B); 1045 } 1046 1047 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1048 _mm256_unpackhi_ps (__m256 __A, __m256 __B) 1049 { 1050 return (__m256) __builtin_ia32_unpckhps256 ((__v8sf)__A, (__v8sf)__B); 1051 } 1052 1053 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1054 _mm256_unpacklo_ps (__m256 __A, __m256 __B) 1055 { 1056 return (__m256) __builtin_ia32_unpcklps256 ((__v8sf)__A, (__v8sf)__B); 1057 } 1058 1059 extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1060 _mm_testz_pd (__m128d __M, __m128d __V) 1061 { 1062 return __builtin_ia32_vtestzpd ((__v2df)__M, (__v2df)__V); 1063 } 1064 1065 extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1066 _mm_testc_pd (__m128d __M, __m128d __V) 1067 { 1068 return __builtin_ia32_vtestcpd ((__v2df)__M, (__v2df)__V); 1069 } 1070 1071 extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1072 _mm_testnzc_pd (__m128d __M, __m128d __V) 1073 { 1074 return __builtin_ia32_vtestnzcpd ((__v2df)__M, (__v2df)__V); 1075 } 1076 1077 extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1078 _mm_testz_ps (__m128 __M, __m128 __V) 1079 { 1080 return __builtin_ia32_vtestzps ((__v4sf)__M, (__v4sf)__V); 1081 } 1082 1083 extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1084 _mm_testc_ps (__m128 __M, __m128 __V) 1085 { 1086 return __builtin_ia32_vtestcps ((__v4sf)__M, (__v4sf)__V); 1087 } 1088 1089 extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1090 _mm_testnzc_ps (__m128 __M, __m128 __V) 1091 { 1092 return __builtin_ia32_vtestnzcps ((__v4sf)__M, (__v4sf)__V); 1093 } 1094 1095 extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1096 _mm256_testz_pd (__m256d __M, __m256d __V) 1097 { 1098 return __builtin_ia32_vtestzpd256 ((__v4df)__M, (__v4df)__V); 1099 } 1100 1101 extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1102 _mm256_testc_pd (__m256d __M, __m256d __V) 1103 { 1104 return __builtin_ia32_vtestcpd256 ((__v4df)__M, (__v4df)__V); 1105 } 1106 1107 extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1108 _mm256_testnzc_pd (__m256d __M, __m256d __V) 1109 { 1110 return __builtin_ia32_vtestnzcpd256 ((__v4df)__M, (__v4df)__V); 1111 } 1112 1113 extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1114 _mm256_testz_ps (__m256 __M, __m256 __V) 1115 { 1116 return __builtin_ia32_vtestzps256 ((__v8sf)__M, (__v8sf)__V); 1117 } 1118 1119 extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1120 _mm256_testc_ps (__m256 __M, __m256 __V) 1121 { 1122 return __builtin_ia32_vtestcps256 ((__v8sf)__M, (__v8sf)__V); 1123 } 1124 1125 extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1126 _mm256_testnzc_ps (__m256 __M, __m256 __V) 1127 { 1128 return __builtin_ia32_vtestnzcps256 ((__v8sf)__M, (__v8sf)__V); 1129 } 1130 1131 extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1132 _mm256_testz_si256 (__m256i __M, __m256i __V) 1133 { 1134 return __builtin_ia32_ptestz256 ((__v4di)__M, (__v4di)__V); 1135 } 1136 1137 extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1138 _mm256_testc_si256 (__m256i __M, __m256i __V) 1139 { 1140 return __builtin_ia32_ptestc256 ((__v4di)__M, (__v4di)__V); 1141 } 1142 1143 extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1144 _mm256_testnzc_si256 (__m256i __M, __m256i __V) 1145 { 1146 return __builtin_ia32_ptestnzc256 ((__v4di)__M, (__v4di)__V); 1147 } 1148 1149 extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1150 _mm256_movemask_pd (__m256d __A) 1151 { 1152 return __builtin_ia32_movmskpd256 ((__v4df)__A); 1153 } 1154 1155 extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1156 _mm256_movemask_ps (__m256 __A) 1157 { 1158 return __builtin_ia32_movmskps256 ((__v8sf)__A); 1159 } 1160 1161 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1162 _mm256_setzero_pd (void) 1163 { 1164 return __extension__ (__m256d){ 0.0, 0.0, 0.0, 0.0 }; 1165 } 1166 1167 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1168 _mm256_setzero_ps (void) 1169 { 1170 return __extension__ (__m256){ 0.0, 0.0, 0.0, 0.0, 1171 0.0, 0.0, 0.0, 0.0 }; 1172 } 1173 1174 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1175 _mm256_setzero_si256 (void) 1176 { 1177 return __extension__ (__m256i)(__v4di){ 0, 0, 0, 0 }; 1178 } 1179 1180 /* Create the vector [A B C D]. */ 1181 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1182 _mm256_set_pd (double __A, double __B, double __C, double __D) 1183 { 1184 return __extension__ (__m256d){ __D, __C, __B, __A }; 1185 } 1186 1187 /* Create the vector [A B C D E F G H]. */ 1188 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1189 _mm256_set_ps (float __A, float __B, float __C, float __D, 1190 float __E, float __F, float __G, float __H) 1191 { 1192 return __extension__ (__m256){ __H, __G, __F, __E, 1193 __D, __C, __B, __A }; 1194 } 1195 1196 /* Create the vector [A B C D E F G H]. */ 1197 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1198 _mm256_set_epi32 (int __A, int __B, int __C, int __D, 1199 int __E, int __F, int __G, int __H) 1200 { 1201 return __extension__ (__m256i)(__v8si){ __H, __G, __F, __E, 1202 __D, __C, __B, __A }; 1203 } 1204 1205 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1206 _mm256_set_epi16 (short __q15, short __q14, short __q13, short __q12, 1207 short __q11, short __q10, short __q09, short __q08, 1208 short __q07, short __q06, short __q05, short __q04, 1209 short __q03, short __q02, short __q01, short __q00) 1210 { 1211 return __extension__ (__m256i)(__v16hi){ 1212 __q00, __q01, __q02, __q03, __q04, __q05, __q06, __q07, 1213 __q08, __q09, __q10, __q11, __q12, __q13, __q14, __q15 1214 }; 1215 } 1216 1217 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1218 _mm256_set_epi8 (char __q31, char __q30, char __q29, char __q28, 1219 char __q27, char __q26, char __q25, char __q24, 1220 char __q23, char __q22, char __q21, char __q20, 1221 char __q19, char __q18, char __q17, char __q16, 1222 char __q15, char __q14, char __q13, char __q12, 1223 char __q11, char __q10, char __q09, char __q08, 1224 char __q07, char __q06, char __q05, char __q04, 1225 char __q03, char __q02, char __q01, char __q00) 1226 { 1227 return __extension__ (__m256i)(__v32qi){ 1228 __q00, __q01, __q02, __q03, __q04, __q05, __q06, __q07, 1229 __q08, __q09, __q10, __q11, __q12, __q13, __q14, __q15, 1230 __q16, __q17, __q18, __q19, __q20, __q21, __q22, __q23, 1231 __q24, __q25, __q26, __q27, __q28, __q29, __q30, __q31 1232 }; 1233 } 1234 1235 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1236 _mm256_set_epi64x (long long __A, long long __B, long long __C, 1237 long long __D) 1238 { 1239 return __extension__ (__m256i)(__v4di){ __D, __C, __B, __A }; 1240 } 1241 1242 /* Create a vector with all elements equal to A. */ 1243 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1244 _mm256_set1_pd (double __A) 1245 { 1246 return __extension__ (__m256d){ __A, __A, __A, __A }; 1247 } 1248 1249 /* Create a vector with all elements equal to A. */ 1250 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1251 _mm256_set1_ps (float __A) 1252 { 1253 return __extension__ (__m256){ __A, __A, __A, __A, 1254 __A, __A, __A, __A }; 1255 } 1256 1257 /* Create a vector with all elements equal to A. */ 1258 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1259 _mm256_set1_epi32 (int __A) 1260 { 1261 return __extension__ (__m256i)(__v8si){ __A, __A, __A, __A, 1262 __A, __A, __A, __A }; 1263 } 1264 1265 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1266 _mm256_set1_epi16 (short __A) 1267 { 1268 return _mm256_set_epi16 (__A, __A, __A, __A, __A, __A, __A, __A, 1269 __A, __A, __A, __A, __A, __A, __A, __A); 1270 } 1271 1272 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1273 _mm256_set1_epi8 (char __A) 1274 { 1275 return _mm256_set_epi8 (__A, __A, __A, __A, __A, __A, __A, __A, 1276 __A, __A, __A, __A, __A, __A, __A, __A, 1277 __A, __A, __A, __A, __A, __A, __A, __A, 1278 __A, __A, __A, __A, __A, __A, __A, __A); 1279 } 1280 1281 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1282 _mm256_set1_epi64x (long long __A) 1283 { 1284 return __extension__ (__m256i)(__v4di){ __A, __A, __A, __A }; 1285 } 1286 1287 /* Create vectors of elements in the reversed order from the 1288 _mm256_set_XXX functions. */ 1289 1290 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1291 _mm256_setr_pd (double __A, double __B, double __C, double __D) 1292 { 1293 return _mm256_set_pd (__D, __C, __B, __A); 1294 } 1295 1296 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1297 _mm256_setr_ps (float __A, float __B, float __C, float __D, 1298 float __E, float __F, float __G, float __H) 1299 { 1300 return _mm256_set_ps (__H, __G, __F, __E, __D, __C, __B, __A); 1301 } 1302 1303 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1304 _mm256_setr_epi32 (int __A, int __B, int __C, int __D, 1305 int __E, int __F, int __G, int __H) 1306 { 1307 return _mm256_set_epi32 (__H, __G, __F, __E, __D, __C, __B, __A); 1308 } 1309 1310 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1311 _mm256_setr_epi16 (short __q15, short __q14, short __q13, short __q12, 1312 short __q11, short __q10, short __q09, short __q08, 1313 short __q07, short __q06, short __q05, short __q04, 1314 short __q03, short __q02, short __q01, short __q00) 1315 { 1316 return _mm256_set_epi16 (__q00, __q01, __q02, __q03, 1317 __q04, __q05, __q06, __q07, 1318 __q08, __q09, __q10, __q11, 1319 __q12, __q13, __q14, __q15); 1320 } 1321 1322 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1323 _mm256_setr_epi8 (char __q31, char __q30, char __q29, char __q28, 1324 char __q27, char __q26, char __q25, char __q24, 1325 char __q23, char __q22, char __q21, char __q20, 1326 char __q19, char __q18, char __q17, char __q16, 1327 char __q15, char __q14, char __q13, char __q12, 1328 char __q11, char __q10, char __q09, char __q08, 1329 char __q07, char __q06, char __q05, char __q04, 1330 char __q03, char __q02, char __q01, char __q00) 1331 { 1332 return _mm256_set_epi8 (__q00, __q01, __q02, __q03, 1333 __q04, __q05, __q06, __q07, 1334 __q08, __q09, __q10, __q11, 1335 __q12, __q13, __q14, __q15, 1336 __q16, __q17, __q18, __q19, 1337 __q20, __q21, __q22, __q23, 1338 __q24, __q25, __q26, __q27, 1339 __q28, __q29, __q30, __q31); 1340 } 1341 1342 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1343 _mm256_setr_epi64x (long long __A, long long __B, long long __C, 1344 long long __D) 1345 { 1346 return _mm256_set_epi64x (__D, __C, __B, __A); 1347 } 1348 1349 /* Casts between various SP, DP, INT vector types. Note that these do no 1350 conversion of values, they just change the type. */ 1351 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1352 _mm256_castpd_ps (__m256d __A) 1353 { 1354 return (__m256) __A; 1355 } 1356 1357 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1358 _mm256_castpd_si256 (__m256d __A) 1359 { 1360 return (__m256i) __A; 1361 } 1362 1363 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1364 _mm256_castps_pd (__m256 __A) 1365 { 1366 return (__m256d) __A; 1367 } 1368 1369 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1370 _mm256_castps_si256(__m256 __A) 1371 { 1372 return (__m256i) __A; 1373 } 1374 1375 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1376 _mm256_castsi256_ps (__m256i __A) 1377 { 1378 return (__m256) __A; 1379 } 1380 1381 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1382 _mm256_castsi256_pd (__m256i __A) 1383 { 1384 return (__m256d) __A; 1385 } 1386 1387 extern __inline __m128d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1388 _mm256_castpd256_pd128 (__m256d __A) 1389 { 1390 return (__m128d) __builtin_ia32_pd_pd256 ((__v4df)__A); 1391 } 1392 1393 extern __inline __m128 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1394 _mm256_castps256_ps128 (__m256 __A) 1395 { 1396 return (__m128) __builtin_ia32_ps_ps256 ((__v8sf)__A); 1397 } 1398 1399 extern __inline __m128i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1400 _mm256_castsi256_si128 (__m256i __A) 1401 { 1402 return (__m128i) __builtin_ia32_si_si256 ((__v8si)__A); 1403 } 1404 1405 /* When cast is done from a 128 to 256-bit type, the low 128 bits of 1406 the 256-bit result contain source parameter value and the upper 128 1407 bits of the result are undefined. Those intrinsics shouldn't 1408 generate any extra moves. */ 1409 1410 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1411 _mm256_castpd128_pd256 (__m128d __A) 1412 { 1413 return (__m256d) __builtin_ia32_pd256_pd ((__v2df)__A); 1414 } 1415 1416 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1417 _mm256_castps128_ps256 (__m128 __A) 1418 { 1419 return (__m256) __builtin_ia32_ps256_ps ((__v4sf)__A); 1420 } 1421 1422 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 1423 _mm256_castsi128_si256 (__m128i __A) 1424 { 1425 return (__m256i) __builtin_ia32_si256_si ((__v4si)__A); 1426 } 1427