zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

emmintrin.h (201616B) - Raw


      1 /*===---- emmintrin.h - SSE2 intrinsics ------------------------------------===
      2  *
      3  * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
      4  * See https://llvm.org/LICENSE.txt for license information.
      5  * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
      6  *
      7  *===-----------------------------------------------------------------------===
      8  */
      9 
     10 #ifndef __EMMINTRIN_H
     11 #define __EMMINTRIN_H
     12 
     13 #if !defined(__i386__) && !defined(__x86_64__)
     14 #error "This header is only meant to be used on x86 and x64 architecture"
     15 #endif
     16 
     17 #include <xmmintrin.h>
     18 
     19 typedef double __m128d __attribute__((__vector_size__(16), __aligned__(16)));
     20 typedef long long __m128i __attribute__((__vector_size__(16), __aligned__(16)));
     21 
     22 typedef double __m128d_u __attribute__((__vector_size__(16), __aligned__(1)));
     23 typedef long long __m128i_u
     24     __attribute__((__vector_size__(16), __aligned__(1)));
     25 
     26 /* Type defines.  */
     27 typedef double __v2df __attribute__((__vector_size__(16)));
     28 typedef long long __v2di __attribute__((__vector_size__(16)));
     29 typedef short __v8hi __attribute__((__vector_size__(16)));
     30 typedef char __v16qi __attribute__((__vector_size__(16)));
     31 
     32 /* Unsigned types */
     33 typedef unsigned long long __v2du __attribute__((__vector_size__(16)));
     34 typedef unsigned short __v8hu __attribute__((__vector_size__(16)));
     35 typedef unsigned char __v16qu __attribute__((__vector_size__(16)));
     36 
     37 /* We need an explicitly signed variant for char. Note that this shouldn't
     38  * appear in the interface though. */
     39 typedef signed char __v16qs __attribute__((__vector_size__(16)));
     40 
     41 #ifdef __SSE2__
     42 /* Both _Float16 and __bf16 require SSE2 being enabled. */
     43 typedef _Float16 __v8hf __attribute__((__vector_size__(16), __aligned__(16)));
     44 typedef _Float16 __m128h __attribute__((__vector_size__(16), __aligned__(16)));
     45 typedef _Float16 __m128h_u __attribute__((__vector_size__(16), __aligned__(1)));
     46 
     47 typedef __bf16 __v8bf __attribute__((__vector_size__(16), __aligned__(16)));
     48 typedef __bf16 __m128bh __attribute__((__vector_size__(16), __aligned__(16)));
     49 #endif
     50 
     51 /* Define the default attributes for the functions in this file. */
     52 #if defined(__EVEX512__) && !defined(__AVX10_1_512__)
     53 #define __DEFAULT_FN_ATTRS                                                     \
     54   __attribute__((__always_inline__, __nodebug__,                               \
     55                  __target__("sse2,no-evex512"), __min_vector_width__(128)))
     56 #else
     57 #define __DEFAULT_FN_ATTRS                                                     \
     58   __attribute__((__always_inline__, __nodebug__, __target__("sse2"),           \
     59                  __min_vector_width__(128)))
     60 #endif
     61 
     62 #if defined(__cplusplus) && (__cplusplus >= 201103L)
     63 #define __DEFAULT_FN_ATTRS_CONSTEXPR __DEFAULT_FN_ATTRS constexpr
     64 #else
     65 #define __DEFAULT_FN_ATTRS_CONSTEXPR __DEFAULT_FN_ATTRS
     66 #endif
     67 
     68 #define __trunc64(x)                                                           \
     69   (__m64) __builtin_shufflevector((__v2di)(x), __extension__(__v2di){}, 0)
     70 #define __anyext128(x)                                                         \
     71   (__m128i) __builtin_shufflevector((__v2si)(x), __extension__(__v2si){}, 0,   \
     72                                     1, -1, -1)
     73 
     74 /// Adds lower double-precision values in both operands and returns the
     75 ///    sum in the lower 64 bits of the result. The upper 64 bits of the result
     76 ///    are copied from the upper double-precision value of the first operand.
     77 ///
     78 /// \headerfile <x86intrin.h>
     79 ///
     80 /// This intrinsic corresponds to the <c> VADDSD / ADDSD </c> instruction.
     81 ///
     82 /// \param __a
     83 ///    A 128-bit vector of [2 x double] containing one of the source operands.
     84 /// \param __b
     85 ///    A 128-bit vector of [2 x double] containing one of the source operands.
     86 /// \returns A 128-bit vector of [2 x double] whose lower 64 bits contain the
     87 ///    sum of the lower 64 bits of both operands. The upper 64 bits are copied
     88 ///    from the upper 64 bits of the first source operand.
     89 static __inline__ __m128d __DEFAULT_FN_ATTRS_CONSTEXPR _mm_add_sd(__m128d __a,
     90                                                                   __m128d __b) {
     91   __a[0] += __b[0];
     92   return __a;
     93 }
     94 
     95 /// Adds two 128-bit vectors of [2 x double].
     96 ///
     97 /// \headerfile <x86intrin.h>
     98 ///
     99 /// This intrinsic corresponds to the <c> VADDPD / ADDPD </c> instruction.
    100 ///
    101 /// \param __a
    102 ///    A 128-bit vector of [2 x double] containing one of the source operands.
    103 /// \param __b
    104 ///    A 128-bit vector of [2 x double] containing one of the source operands.
    105 /// \returns A 128-bit vector of [2 x double] containing the sums of both
    106 ///    operands.
    107 static __inline__ __m128d __DEFAULT_FN_ATTRS_CONSTEXPR _mm_add_pd(__m128d __a,
    108                                                                   __m128d __b) {
    109   return (__m128d)((__v2df)__a + (__v2df)__b);
    110 }
    111 
    112 /// Subtracts the lower double-precision value of the second operand
    113 ///    from the lower double-precision value of the first operand and returns
    114 ///    the difference in the lower 64 bits of the result. The upper 64 bits of
    115 ///    the result are copied from the upper double-precision value of the first
    116 ///    operand.
    117 ///
    118 /// \headerfile <x86intrin.h>
    119 ///
    120 /// This intrinsic corresponds to the <c> VSUBSD / SUBSD </c> instruction.
    121 ///
    122 /// \param __a
    123 ///    A 128-bit vector of [2 x double] containing the minuend.
    124 /// \param __b
    125 ///    A 128-bit vector of [2 x double] containing the subtrahend.
    126 /// \returns A 128-bit vector of [2 x double] whose lower 64 bits contain the
    127 ///    difference of the lower 64 bits of both operands. The upper 64 bits are
    128 ///    copied from the upper 64 bits of the first source operand.
    129 static __inline__ __m128d __DEFAULT_FN_ATTRS_CONSTEXPR _mm_sub_sd(__m128d __a,
    130                                                                   __m128d __b) {
    131   __a[0] -= __b[0];
    132   return __a;
    133 }
    134 
    135 /// Subtracts two 128-bit vectors of [2 x double].
    136 ///
    137 /// \headerfile <x86intrin.h>
    138 ///
    139 /// This intrinsic corresponds to the <c> VSUBPD / SUBPD </c> instruction.
    140 ///
    141 /// \param __a
    142 ///    A 128-bit vector of [2 x double] containing the minuend.
    143 /// \param __b
    144 ///    A 128-bit vector of [2 x double] containing the subtrahend.
    145 /// \returns A 128-bit vector of [2 x double] containing the differences between
    146 ///    both operands.
    147 static __inline__ __m128d __DEFAULT_FN_ATTRS_CONSTEXPR _mm_sub_pd(__m128d __a,
    148                                                                   __m128d __b) {
    149   return (__m128d)((__v2df)__a - (__v2df)__b);
    150 }
    151 
    152 /// Multiplies lower double-precision values in both operands and returns
    153 ///    the product in the lower 64 bits of the result. The upper 64 bits of the
    154 ///    result are copied from the upper double-precision value of the first
    155 ///    operand.
    156 ///
    157 /// \headerfile <x86intrin.h>
    158 ///
    159 /// This intrinsic corresponds to the <c> VMULSD / MULSD </c> instruction.
    160 ///
    161 /// \param __a
    162 ///    A 128-bit vector of [2 x double] containing one of the source operands.
    163 /// \param __b
    164 ///    A 128-bit vector of [2 x double] containing one of the source operands.
    165 /// \returns A 128-bit vector of [2 x double] whose lower 64 bits contain the
    166 ///    product of the lower 64 bits of both operands. The upper 64 bits are
    167 ///    copied from the upper 64 bits of the first source operand.
    168 static __inline__ __m128d __DEFAULT_FN_ATTRS_CONSTEXPR _mm_mul_sd(__m128d __a,
    169                                                                   __m128d __b) {
    170   __a[0] *= __b[0];
    171   return __a;
    172 }
    173 
    174 /// Multiplies two 128-bit vectors of [2 x double].
    175 ///
    176 /// \headerfile <x86intrin.h>
    177 ///
    178 /// This intrinsic corresponds to the <c> VMULPD / MULPD </c> instruction.
    179 ///
    180 /// \param __a
    181 ///    A 128-bit vector of [2 x double] containing one of the operands.
    182 /// \param __b
    183 ///    A 128-bit vector of [2 x double] containing one of the operands.
    184 /// \returns A 128-bit vector of [2 x double] containing the products of both
    185 ///    operands.
    186 static __inline__ __m128d __DEFAULT_FN_ATTRS_CONSTEXPR _mm_mul_pd(__m128d __a,
    187                                                                   __m128d __b) {
    188   return (__m128d)((__v2df)__a * (__v2df)__b);
    189 }
    190 
    191 /// Divides the lower double-precision value of the first operand by the
    192 ///    lower double-precision value of the second operand and returns the
    193 ///    quotient in the lower 64 bits of the result. The upper 64 bits of the
    194 ///    result are copied from the upper double-precision value of the first
    195 ///    operand.
    196 ///
    197 /// \headerfile <x86intrin.h>
    198 ///
    199 /// This intrinsic corresponds to the <c> VDIVSD / DIVSD </c> instruction.
    200 ///
    201 /// \param __a
    202 ///    A 128-bit vector of [2 x double] containing the dividend.
    203 /// \param __b
    204 ///    A 128-bit vector of [2 x double] containing divisor.
    205 /// \returns A 128-bit vector of [2 x double] whose lower 64 bits contain the
    206 ///    quotient of the lower 64 bits of both operands. The upper 64 bits are
    207 ///    copied from the upper 64 bits of the first source operand.
    208 static __inline__ __m128d __DEFAULT_FN_ATTRS_CONSTEXPR _mm_div_sd(__m128d __a,
    209                                                                   __m128d __b) {
    210   __a[0] /= __b[0];
    211   return __a;
    212 }
    213 
    214 /// Performs an element-by-element division of two 128-bit vectors of
    215 ///    [2 x double].
    216 ///
    217 /// \headerfile <x86intrin.h>
    218 ///
    219 /// This intrinsic corresponds to the <c> VDIVPD / DIVPD </c> instruction.
    220 ///
    221 /// \param __a
    222 ///    A 128-bit vector of [2 x double] containing the dividend.
    223 /// \param __b
    224 ///    A 128-bit vector of [2 x double] containing the divisor.
    225 /// \returns A 128-bit vector of [2 x double] containing the quotients of both
    226 ///    operands.
    227 static __inline__ __m128d __DEFAULT_FN_ATTRS_CONSTEXPR _mm_div_pd(__m128d __a,
    228                                                                   __m128d __b) {
    229   return (__m128d)((__v2df)__a / (__v2df)__b);
    230 }
    231 
    232 /// Calculates the square root of the lower double-precision value of
    233 ///    the second operand and returns it in the lower 64 bits of the result.
    234 ///    The upper 64 bits of the result are copied from the upper
    235 ///    double-precision value of the first operand.
    236 ///
    237 /// \headerfile <x86intrin.h>
    238 ///
    239 /// This intrinsic corresponds to the <c> VSQRTSD / SQRTSD </c> instruction.
    240 ///
    241 /// \param __a
    242 ///    A 128-bit vector of [2 x double] containing one of the operands. The
    243 ///    upper 64 bits of this operand are copied to the upper 64 bits of the
    244 ///    result.
    245 /// \param __b
    246 ///    A 128-bit vector of [2 x double] containing one of the operands. The
    247 ///    square root is calculated using the lower 64 bits of this operand.
    248 /// \returns A 128-bit vector of [2 x double] whose lower 64 bits contain the
    249 ///    square root of the lower 64 bits of operand \a __b, and whose upper 64
    250 ///    bits are copied from the upper 64 bits of operand \a __a.
    251 static __inline__ __m128d __DEFAULT_FN_ATTRS _mm_sqrt_sd(__m128d __a,
    252                                                          __m128d __b) {
    253   __m128d __c = __builtin_ia32_sqrtsd((__v2df)__b);
    254   return __extension__(__m128d){__c[0], __a[1]};
    255 }
    256 
    257 /// Calculates the square root of the each of two values stored in a
    258 ///    128-bit vector of [2 x double].
    259 ///
    260 /// \headerfile <x86intrin.h>
    261 ///
    262 /// This intrinsic corresponds to the <c> VSQRTPD / SQRTPD </c> instruction.
    263 ///
    264 /// \param __a
    265 ///    A 128-bit vector of [2 x double].
    266 /// \returns A 128-bit vector of [2 x double] containing the square roots of the
    267 ///    values in the operand.
    268 static __inline__ __m128d __DEFAULT_FN_ATTRS _mm_sqrt_pd(__m128d __a) {
    269   return __builtin_ia32_sqrtpd((__v2df)__a);
    270 }
    271 
    272 /// Compares lower 64-bit double-precision values of both operands, and
    273 ///    returns the lesser of the pair of values in the lower 64-bits of the
    274 ///    result. The upper 64 bits of the result are copied from the upper
    275 ///    double-precision value of the first operand.
    276 ///
    277 ///    If either value in a comparison is NaN, returns the value from \a __b.
    278 ///
    279 /// \headerfile <x86intrin.h>
    280 ///
    281 /// This intrinsic corresponds to the <c> VMINSD / MINSD </c> instruction.
    282 ///
    283 /// \param __a
    284 ///    A 128-bit vector of [2 x double] containing one of the operands. The
    285 ///    lower 64 bits of this operand are used in the comparison.
    286 /// \param __b
    287 ///    A 128-bit vector of [2 x double] containing one of the operands. The
    288 ///    lower 64 bits of this operand are used in the comparison.
    289 /// \returns A 128-bit vector of [2 x double] whose lower 64 bits contain the
    290 ///    minimum value between both operands. The upper 64 bits are copied from
    291 ///    the upper 64 bits of the first source operand.
    292 static __inline__ __m128d __DEFAULT_FN_ATTRS _mm_min_sd(__m128d __a,
    293                                                         __m128d __b) {
    294   return __builtin_ia32_minsd((__v2df)__a, (__v2df)__b);
    295 }
    296 
    297 /// Performs element-by-element comparison of the two 128-bit vectors of
    298 ///    [2 x double] and returns a vector containing the lesser of each pair of
    299 ///    values.
    300 ///
    301 ///    If either value in a comparison is NaN, returns the value from \a __b.
    302 ///
    303 /// \headerfile <x86intrin.h>
    304 ///
    305 /// This intrinsic corresponds to the <c> VMINPD / MINPD </c> instruction.
    306 ///
    307 /// \param __a
    308 ///    A 128-bit vector of [2 x double] containing one of the operands.
    309 /// \param __b
    310 ///    A 128-bit vector of [2 x double] containing one of the operands.
    311 /// \returns A 128-bit vector of [2 x double] containing the minimum values
    312 ///    between both operands.
    313 static __inline__ __m128d __DEFAULT_FN_ATTRS _mm_min_pd(__m128d __a,
    314                                                         __m128d __b) {
    315   return __builtin_ia32_minpd((__v2df)__a, (__v2df)__b);
    316 }
    317 
    318 /// Compares lower 64-bit double-precision values of both operands, and
    319 ///    returns the greater of the pair of values in the lower 64-bits of the
    320 ///    result. The upper 64 bits of the result are copied from the upper
    321 ///    double-precision value of the first operand.
    322 ///
    323 ///    If either value in a comparison is NaN, returns the value from \a __b.
    324 ///
    325 /// \headerfile <x86intrin.h>
    326 ///
    327 /// This intrinsic corresponds to the <c> VMAXSD / MAXSD </c> instruction.
    328 ///
    329 /// \param __a
    330 ///    A 128-bit vector of [2 x double] containing one of the operands. The
    331 ///    lower 64 bits of this operand are used in the comparison.
    332 /// \param __b
    333 ///    A 128-bit vector of [2 x double] containing one of the operands. The
    334 ///    lower 64 bits of this operand are used in the comparison.
    335 /// \returns A 128-bit vector of [2 x double] whose lower 64 bits contain the
    336 ///    maximum value between both operands. The upper 64 bits are copied from
    337 ///    the upper 64 bits of the first source operand.
    338 static __inline__ __m128d __DEFAULT_FN_ATTRS _mm_max_sd(__m128d __a,
    339                                                         __m128d __b) {
    340   return __builtin_ia32_maxsd((__v2df)__a, (__v2df)__b);
    341 }
    342 
    343 /// Performs element-by-element comparison of the two 128-bit vectors of
    344 ///    [2 x double] and returns a vector containing the greater of each pair
    345 ///    of values.
    346 ///
    347 ///    If either value in a comparison is NaN, returns the value from \a __b.
    348 ///
    349 /// \headerfile <x86intrin.h>
    350 ///
    351 /// This intrinsic corresponds to the <c> VMAXPD / MAXPD </c> instruction.
    352 ///
    353 /// \param __a
    354 ///    A 128-bit vector of [2 x double] containing one of the operands.
    355 /// \param __b
    356 ///    A 128-bit vector of [2 x double] containing one of the operands.
    357 /// \returns A 128-bit vector of [2 x double] containing the maximum values
    358 ///    between both operands.
    359 static __inline__ __m128d __DEFAULT_FN_ATTRS _mm_max_pd(__m128d __a,
    360                                                         __m128d __b) {
    361   return __builtin_ia32_maxpd((__v2df)__a, (__v2df)__b);
    362 }
    363 
    364 /// Performs a bitwise AND of two 128-bit vectors of [2 x double].
    365 ///
    366 /// \headerfile <x86intrin.h>
    367 ///
    368 /// This intrinsic corresponds to the <c> VPAND / PAND </c> instruction.
    369 ///
    370 /// \param __a
    371 ///    A 128-bit vector of [2 x double] containing one of the source operands.
    372 /// \param __b
    373 ///    A 128-bit vector of [2 x double] containing one of the source operands.
    374 /// \returns A 128-bit vector of [2 x double] containing the bitwise AND of the
    375 ///    values between both operands.
    376 static __inline__ __m128d __DEFAULT_FN_ATTRS_CONSTEXPR _mm_and_pd(__m128d __a,
    377                                                                   __m128d __b) {
    378   return (__m128d)((__v2du)__a & (__v2du)__b);
    379 }
    380 
    381 /// Performs a bitwise AND of two 128-bit vectors of [2 x double], using
    382 ///    the one's complement of the values contained in the first source operand.
    383 ///
    384 /// \headerfile <x86intrin.h>
    385 ///
    386 /// This intrinsic corresponds to the <c> VPANDN / PANDN </c> instruction.
    387 ///
    388 /// \param __a
    389 ///    A 128-bit vector of [2 x double] containing the left source operand. The
    390 ///    one's complement of this value is used in the bitwise AND.
    391 /// \param __b
    392 ///    A 128-bit vector of [2 x double] containing the right source operand.
    393 /// \returns A 128-bit vector of [2 x double] containing the bitwise AND of the
    394 ///    values in the second operand and the one's complement of the first
    395 ///    operand.
    396 static __inline__ __m128d __DEFAULT_FN_ATTRS_CONSTEXPR
    397 _mm_andnot_pd(__m128d __a, __m128d __b) {
    398   return (__m128d)(~(__v2du)__a & (__v2du)__b);
    399 }
    400 
    401 /// Performs a bitwise OR of two 128-bit vectors of [2 x double].
    402 ///
    403 /// \headerfile <x86intrin.h>
    404 ///
    405 /// This intrinsic corresponds to the <c> VPOR / POR </c> instruction.
    406 ///
    407 /// \param __a
    408 ///    A 128-bit vector of [2 x double] containing one of the source operands.
    409 /// \param __b
    410 ///    A 128-bit vector of [2 x double] containing one of the source operands.
    411 /// \returns A 128-bit vector of [2 x double] containing the bitwise OR of the
    412 ///    values between both operands.
    413 static __inline__ __m128d __DEFAULT_FN_ATTRS_CONSTEXPR _mm_or_pd(__m128d __a,
    414                                                                  __m128d __b) {
    415   return (__m128d)((__v2du)__a | (__v2du)__b);
    416 }
    417 
    418 /// Performs a bitwise XOR of two 128-bit vectors of [2 x double].
    419 ///
    420 /// \headerfile <x86intrin.h>
    421 ///
    422 /// This intrinsic corresponds to the <c> VPXOR / PXOR </c> instruction.
    423 ///
    424 /// \param __a
    425 ///    A 128-bit vector of [2 x double] containing one of the source operands.
    426 /// \param __b
    427 ///    A 128-bit vector of [2 x double] containing one of the source operands.
    428 /// \returns A 128-bit vector of [2 x double] containing the bitwise XOR of the
    429 ///    values between both operands.
    430 static __inline__ __m128d __DEFAULT_FN_ATTRS_CONSTEXPR _mm_xor_pd(__m128d __a,
    431                                                                   __m128d __b) {
    432   return (__m128d)((__v2du)__a ^ (__v2du)__b);
    433 }
    434 
    435 /// Compares each of the corresponding double-precision values of the
    436 ///    128-bit vectors of [2 x double] for equality.
    437 ///
    438 ///    Each comparison returns 0x0 for false, 0xFFFFFFFFFFFFFFFF for true.
    439 ///    If either value in a comparison is NaN, returns false.
    440 ///
    441 /// \headerfile <x86intrin.h>
    442 ///
    443 /// This intrinsic corresponds to the <c> VCMPEQPD / CMPEQPD </c> instruction.
    444 ///
    445 /// \param __a
    446 ///    A 128-bit vector of [2 x double].
    447 /// \param __b
    448 ///    A 128-bit vector of [2 x double].
    449 /// \returns A 128-bit vector containing the comparison results.
    450 static __inline__ __m128d __DEFAULT_FN_ATTRS _mm_cmpeq_pd(__m128d __a,
    451                                                           __m128d __b) {
    452   return (__m128d)__builtin_ia32_cmpeqpd((__v2df)__a, (__v2df)__b);
    453 }
    454 
    455 /// Compares each of the corresponding double-precision values of the
    456 ///    128-bit vectors of [2 x double] to determine if the values in the first
    457 ///    operand are less than those in the second operand.
    458 ///
    459 ///    Each comparison returns 0x0 for false, 0xFFFFFFFFFFFFFFFF for true.
    460 ///    If either value in a comparison is NaN, returns false.
    461 ///
    462 /// \headerfile <x86intrin.h>
    463 ///
    464 /// This intrinsic corresponds to the <c> VCMPLTPD / CMPLTPD </c> instruction.
    465 ///
    466 /// \param __a
    467 ///    A 128-bit vector of [2 x double].
    468 /// \param __b
    469 ///    A 128-bit vector of [2 x double].
    470 /// \returns A 128-bit vector containing the comparison results.
    471 static __inline__ __m128d __DEFAULT_FN_ATTRS _mm_cmplt_pd(__m128d __a,
    472                                                           __m128d __b) {
    473   return (__m128d)__builtin_ia32_cmpltpd((__v2df)__a, (__v2df)__b);
    474 }
    475 
    476 /// Compares each of the corresponding double-precision values of the
    477 ///    128-bit vectors of [2 x double] to determine if the values in the first
    478 ///    operand are less than or equal to those in the second operand.
    479 ///
    480 ///    Each comparison returns 0x0 for false, 0xFFFFFFFFFFFFFFFF for true.
    481 ///    If either value in a comparison is NaN, returns false.
    482 ///
    483 /// \headerfile <x86intrin.h>
    484 ///
    485 /// This intrinsic corresponds to the <c> VCMPLEPD / CMPLEPD </c> instruction.
    486 ///
    487 /// \param __a
    488 ///    A 128-bit vector of [2 x double].
    489 /// \param __b
    490 ///    A 128-bit vector of [2 x double].
    491 /// \returns A 128-bit vector containing the comparison results.
    492 static __inline__ __m128d __DEFAULT_FN_ATTRS _mm_cmple_pd(__m128d __a,
    493                                                           __m128d __b) {
    494   return (__m128d)__builtin_ia32_cmplepd((__v2df)__a, (__v2df)__b);
    495 }
    496 
    497 /// Compares each of the corresponding double-precision values of the
    498 ///    128-bit vectors of [2 x double] to determine if the values in the first
    499 ///    operand are greater than those in the second operand.
    500 ///
    501 ///    Each comparison returns 0x0 for false, 0xFFFFFFFFFFFFFFFF for true.
    502 ///    If either value in a comparison is NaN, returns false.
    503 ///
    504 /// \headerfile <x86intrin.h>
    505 ///
    506 /// This intrinsic corresponds to the <c> VCMPLTPD / CMPLTPD </c> instruction.
    507 ///
    508 /// \param __a
    509 ///    A 128-bit vector of [2 x double].
    510 /// \param __b
    511 ///    A 128-bit vector of [2 x double].
    512 /// \returns A 128-bit vector containing the comparison results.
    513 static __inline__ __m128d __DEFAULT_FN_ATTRS _mm_cmpgt_pd(__m128d __a,
    514                                                           __m128d __b) {
    515   return (__m128d)__builtin_ia32_cmpltpd((__v2df)__b, (__v2df)__a);
    516 }
    517 
    518 /// Compares each of the corresponding double-precision values of the
    519 ///    128-bit vectors of [2 x double] to determine if the values in the first
    520 ///    operand are greater than or equal to those in the second operand.
    521 ///
    522 ///    Each comparison returns 0x0 for false, 0xFFFFFFFFFFFFFFFF for true.
    523 ///    If either value in a comparison is NaN, returns false.
    524 ///
    525 /// \headerfile <x86intrin.h>
    526 ///
    527 /// This intrinsic corresponds to the <c> VCMPLEPD / CMPLEPD </c> instruction.
    528 ///
    529 /// \param __a
    530 ///    A 128-bit vector of [2 x double].
    531 /// \param __b
    532 ///    A 128-bit vector of [2 x double].
    533 /// \returns A 128-bit vector containing the comparison results.
    534 static __inline__ __m128d __DEFAULT_FN_ATTRS _mm_cmpge_pd(__m128d __a,
    535                                                           __m128d __b) {
    536   return (__m128d)__builtin_ia32_cmplepd((__v2df)__b, (__v2df)__a);
    537 }
    538 
    539 /// Compares each of the corresponding double-precision values of the
    540 ///    128-bit vectors of [2 x double] to determine if the values in the first
    541 ///    operand are ordered with respect to those in the second operand.
    542 ///
    543 ///    A pair of double-precision values are ordered with respect to each
    544 ///    other if neither value is a NaN. Each comparison returns 0x0 for false,
    545 ///    0xFFFFFFFFFFFFFFFF for true.
    546 ///
    547 /// \headerfile <x86intrin.h>
    548 ///
    549 /// This intrinsic corresponds to the <c> VCMPORDPD / CMPORDPD </c> instruction.
    550 ///
    551 /// \param __a
    552 ///    A 128-bit vector of [2 x double].
    553 /// \param __b
    554 ///    A 128-bit vector of [2 x double].
    555 /// \returns A 128-bit vector containing the comparison results.
    556 static __inline__ __m128d __DEFAULT_FN_ATTRS _mm_cmpord_pd(__m128d __a,
    557                                                            __m128d __b) {
    558   return (__m128d)__builtin_ia32_cmpordpd((__v2df)__a, (__v2df)__b);
    559 }
    560 
    561 /// Compares each of the corresponding double-precision values of the
    562 ///    128-bit vectors of [2 x double] to determine if the values in the first
    563 ///    operand are unordered with respect to those in the second operand.
    564 ///
    565 ///    A pair of double-precision values are unordered with respect to each
    566 ///    other if one or both values are NaN. Each comparison returns 0x0 for
    567 ///    false, 0xFFFFFFFFFFFFFFFF for true.
    568 ///
    569 /// \headerfile <x86intrin.h>
    570 ///
    571 /// This intrinsic corresponds to the <c> VCMPUNORDPD / CMPUNORDPD </c>
    572 ///   instruction.
    573 ///
    574 /// \param __a
    575 ///    A 128-bit vector of [2 x double].
    576 /// \param __b
    577 ///    A 128-bit vector of [2 x double].
    578 /// \returns A 128-bit vector containing the comparison results.
    579 static __inline__ __m128d __DEFAULT_FN_ATTRS _mm_cmpunord_pd(__m128d __a,
    580                                                              __m128d __b) {
    581   return (__m128d)__builtin_ia32_cmpunordpd((__v2df)__a, (__v2df)__b);
    582 }
    583 
    584 /// Compares each of the corresponding double-precision values of the
    585 ///    128-bit vectors of [2 x double] to determine if the values in the first
    586 ///    operand are unequal to those in the second operand.
    587 ///
    588 ///    Each comparison returns 0x0 for false, 0xFFFFFFFFFFFFFFFF for true.
    589 ///    If either value in a comparison is NaN, returns true.
    590 ///
    591 /// \headerfile <x86intrin.h>
    592 ///
    593 /// This intrinsic corresponds to the <c> VCMPNEQPD / CMPNEQPD </c> instruction.
    594 ///
    595 /// \param __a
    596 ///    A 128-bit vector of [2 x double].
    597 /// \param __b
    598 ///    A 128-bit vector of [2 x double].
    599 /// \returns A 128-bit vector containing the comparison results.
    600 static __inline__ __m128d __DEFAULT_FN_ATTRS _mm_cmpneq_pd(__m128d __a,
    601                                                            __m128d __b) {
    602   return (__m128d)__builtin_ia32_cmpneqpd((__v2df)__a, (__v2df)__b);
    603 }
    604 
    605 /// Compares each of the corresponding double-precision values of the
    606 ///    128-bit vectors of [2 x double] to determine if the values in the first
    607 ///    operand are not less than those in the second operand.
    608 ///
    609 ///    Each comparison returns 0x0 for false, 0xFFFFFFFFFFFFFFFF for true.
    610 ///    If either value in a comparison is NaN, returns true.
    611 ///
    612 /// \headerfile <x86intrin.h>
    613 ///
    614 /// This intrinsic corresponds to the <c> VCMPNLTPD / CMPNLTPD </c> instruction.
    615 ///
    616 /// \param __a
    617 ///    A 128-bit vector of [2 x double].
    618 /// \param __b
    619 ///    A 128-bit vector of [2 x double].
    620 /// \returns A 128-bit vector containing the comparison results.
    621 static __inline__ __m128d __DEFAULT_FN_ATTRS _mm_cmpnlt_pd(__m128d __a,
    622                                                            __m128d __b) {
    623   return (__m128d)__builtin_ia32_cmpnltpd((__v2df)__a, (__v2df)__b);
    624 }
    625 
    626 /// Compares each of the corresponding double-precision values of the
    627 ///    128-bit vectors of [2 x double] to determine if the values in the first
    628 ///    operand are not less than or equal to those in the second operand.
    629 ///
    630 ///    Each comparison returns 0x0 for false, 0xFFFFFFFFFFFFFFFF for true.
    631 ///    If either value in a comparison is NaN, returns true.
    632 ///
    633 /// \headerfile <x86intrin.h>
    634 ///
    635 /// This intrinsic corresponds to the <c> VCMPNLEPD / CMPNLEPD </c> instruction.
    636 ///
    637 /// \param __a
    638 ///    A 128-bit vector of [2 x double].
    639 /// \param __b
    640 ///    A 128-bit vector of [2 x double].
    641 /// \returns A 128-bit vector containing the comparison results.
    642 static __inline__ __m128d __DEFAULT_FN_ATTRS _mm_cmpnle_pd(__m128d __a,
    643                                                            __m128d __b) {
    644   return (__m128d)__builtin_ia32_cmpnlepd((__v2df)__a, (__v2df)__b);
    645 }
    646 
    647 /// Compares each of the corresponding double-precision values of the
    648 ///    128-bit vectors of [2 x double] to determine if the values in the first
    649 ///    operand are not greater than those in the second operand.
    650 ///
    651 ///    Each comparison returns 0x0 for false, 0xFFFFFFFFFFFFFFFF for true.
    652 ///    If either value in a comparison is NaN, returns true.
    653 ///
    654 /// \headerfile <x86intrin.h>
    655 ///
    656 /// This intrinsic corresponds to the <c> VCMPNLTPD / CMPNLTPD </c> instruction.
    657 ///
    658 /// \param __a
    659 ///    A 128-bit vector of [2 x double].
    660 /// \param __b
    661 ///    A 128-bit vector of [2 x double].
    662 /// \returns A 128-bit vector containing the comparison results.
    663 static __inline__ __m128d __DEFAULT_FN_ATTRS _mm_cmpngt_pd(__m128d __a,
    664                                                            __m128d __b) {
    665   return (__m128d)__builtin_ia32_cmpnltpd((__v2df)__b, (__v2df)__a);
    666 }
    667 
    668 /// Compares each of the corresponding double-precision values of the
    669 ///    128-bit vectors of [2 x double] to determine if the values in the first
    670 ///    operand are not greater than or equal to those in the second operand.
    671 ///
    672 ///    Each comparison returns 0x0 for false, 0xFFFFFFFFFFFFFFFF for true.
    673 ///    If either value in a comparison is NaN, returns true.
    674 ///
    675 /// \headerfile <x86intrin.h>
    676 ///
    677 /// This intrinsic corresponds to the <c> VCMPNLEPD / CMPNLEPD </c> instruction.
    678 ///
    679 /// \param __a
    680 ///    A 128-bit vector of [2 x double].
    681 /// \param __b
    682 ///    A 128-bit vector of [2 x double].
    683 /// \returns A 128-bit vector containing the comparison results.
    684 static __inline__ __m128d __DEFAULT_FN_ATTRS _mm_cmpnge_pd(__m128d __a,
    685                                                            __m128d __b) {
    686   return (__m128d)__builtin_ia32_cmpnlepd((__v2df)__b, (__v2df)__a);
    687 }
    688 
    689 /// Compares the lower double-precision floating-point values in each of
    690 ///    the two 128-bit floating-point vectors of [2 x double] for equality.
    691 ///
    692 ///    The comparison returns 0x0 for false, 0xFFFFFFFFFFFFFFFF for true.
    693 ///    If either value in a comparison is NaN, returns false.
    694 ///
    695 /// \headerfile <x86intrin.h>
    696 ///
    697 /// This intrinsic corresponds to the <c> VCMPEQSD / CMPEQSD </c> instruction.
    698 ///
    699 /// \param __a
    700 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
    701 ///    compared to the lower double-precision value of \a __b.
    702 /// \param __b
    703 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
    704 ///    compared to the lower double-precision value of \a __a.
    705 /// \returns A 128-bit vector. The lower 64 bits contains the comparison
    706 ///    results. The upper 64 bits are copied from the upper 64 bits of \a __a.
    707 static __inline__ __m128d __DEFAULT_FN_ATTRS _mm_cmpeq_sd(__m128d __a,
    708                                                           __m128d __b) {
    709   return (__m128d)__builtin_ia32_cmpeqsd((__v2df)__a, (__v2df)__b);
    710 }
    711 
    712 /// Compares the lower double-precision floating-point values in each of
    713 ///    the two 128-bit floating-point vectors of [2 x double] to determine if
    714 ///    the value in the first parameter is less than the corresponding value in
    715 ///    the second parameter.
    716 ///
    717 ///    The comparison returns 0x0 for false, 0xFFFFFFFFFFFFFFFF for true.
    718 ///    If either value in a comparison is NaN, returns false.
    719 ///
    720 /// \headerfile <x86intrin.h>
    721 ///
    722 /// This intrinsic corresponds to the <c> VCMPLTSD / CMPLTSD </c> instruction.
    723 ///
    724 /// \param __a
    725 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
    726 ///    compared to the lower double-precision value of \a __b.
    727 /// \param __b
    728 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
    729 ///    compared to the lower double-precision value of \a __a.
    730 /// \returns A 128-bit vector. The lower 64 bits contains the comparison
    731 ///    results. The upper 64 bits are copied from the upper 64 bits of \a __a.
    732 static __inline__ __m128d __DEFAULT_FN_ATTRS _mm_cmplt_sd(__m128d __a,
    733                                                           __m128d __b) {
    734   return (__m128d)__builtin_ia32_cmpltsd((__v2df)__a, (__v2df)__b);
    735 }
    736 
    737 /// Compares the lower double-precision floating-point values in each of
    738 ///    the two 128-bit floating-point vectors of [2 x double] to determine if
    739 ///    the value in the first parameter is less than or equal to the
    740 ///    corresponding value in the second parameter.
    741 ///
    742 ///    The comparison returns 0x0 for false, 0xFFFFFFFFFFFFFFFF for true.
    743 ///    If either value in a comparison is NaN, returns false.
    744 ///
    745 /// \headerfile <x86intrin.h>
    746 ///
    747 /// This intrinsic corresponds to the <c> VCMPLESD / CMPLESD </c> instruction.
    748 ///
    749 /// \param __a
    750 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
    751 ///    compared to the lower double-precision value of \a __b.
    752 /// \param __b
    753 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
    754 ///    compared to the lower double-precision value of \a __a.
    755 /// \returns A 128-bit vector. The lower 64 bits contains the comparison
    756 ///    results. The upper 64 bits are copied from the upper 64 bits of \a __a.
    757 static __inline__ __m128d __DEFAULT_FN_ATTRS _mm_cmple_sd(__m128d __a,
    758                                                           __m128d __b) {
    759   return (__m128d)__builtin_ia32_cmplesd((__v2df)__a, (__v2df)__b);
    760 }
    761 
    762 /// Compares the lower double-precision floating-point values in each of
    763 ///    the two 128-bit floating-point vectors of [2 x double] to determine if
    764 ///    the value in the first parameter is greater than the corresponding value
    765 ///    in the second parameter.
    766 ///
    767 ///    The comparison returns 0x0 for false, 0xFFFFFFFFFFFFFFFF for true.
    768 ///    If either value in a comparison is NaN, returns false.
    769 ///
    770 /// \headerfile <x86intrin.h>
    771 ///
    772 /// This intrinsic corresponds to the <c> VCMPLTSD / CMPLTSD </c> instruction.
    773 ///
    774 /// \param __a
    775 ///     A 128-bit vector of [2 x double]. The lower double-precision value is
    776 ///     compared to the lower double-precision value of \a __b.
    777 /// \param __b
    778 ///     A 128-bit vector of [2 x double]. The lower double-precision value is
    779 ///     compared to the lower double-precision value of \a __a.
    780 /// \returns A 128-bit vector. The lower 64 bits contains the comparison
    781 ///     results. The upper 64 bits are copied from the upper 64 bits of \a __a.
    782 static __inline__ __m128d __DEFAULT_FN_ATTRS _mm_cmpgt_sd(__m128d __a,
    783                                                           __m128d __b) {
    784   __m128d __c = __builtin_ia32_cmpltsd((__v2df)__b, (__v2df)__a);
    785   return __extension__(__m128d){__c[0], __a[1]};
    786 }
    787 
    788 /// Compares the lower double-precision floating-point values in each of
    789 ///    the two 128-bit floating-point vectors of [2 x double] to determine if
    790 ///    the value in the first parameter is greater than or equal to the
    791 ///    corresponding value in the second parameter.
    792 ///
    793 ///    The comparison returns 0x0 for false, 0xFFFFFFFFFFFFFFFF for true.
    794 ///    If either value in a comparison is NaN, returns false.
    795 ///
    796 /// \headerfile <x86intrin.h>
    797 ///
    798 /// This intrinsic corresponds to the <c> VCMPLESD / CMPLESD </c> instruction.
    799 ///
    800 /// \param __a
    801 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
    802 ///    compared to the lower double-precision value of \a __b.
    803 /// \param __b
    804 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
    805 ///    compared to the lower double-precision value of \a __a.
    806 /// \returns A 128-bit vector. The lower 64 bits contains the comparison
    807 ///    results. The upper 64 bits are copied from the upper 64 bits of \a __a.
    808 static __inline__ __m128d __DEFAULT_FN_ATTRS _mm_cmpge_sd(__m128d __a,
    809                                                           __m128d __b) {
    810   __m128d __c = __builtin_ia32_cmplesd((__v2df)__b, (__v2df)__a);
    811   return __extension__(__m128d){__c[0], __a[1]};
    812 }
    813 
    814 /// Compares the lower double-precision floating-point values in each of
    815 ///    the two 128-bit floating-point vectors of [2 x double] to determine if
    816 ///    the value in the first parameter is ordered with respect to the
    817 ///    corresponding value in the second parameter.
    818 ///
    819 ///    The comparison returns 0x0 for false, 0xFFFFFFFFFFFFFFFF for true. A pair
    820 ///    of double-precision values are ordered with respect to each other if
    821 ///    neither value is a NaN.
    822 ///
    823 /// \headerfile <x86intrin.h>
    824 ///
    825 /// This intrinsic corresponds to the <c> VCMPORDSD / CMPORDSD </c> instruction.
    826 ///
    827 /// \param __a
    828 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
    829 ///    compared to the lower double-precision value of \a __b.
    830 /// \param __b
    831 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
    832 ///    compared to the lower double-precision value of \a __a.
    833 /// \returns A 128-bit vector. The lower 64 bits contains the comparison
    834 ///    results. The upper 64 bits are copied from the upper 64 bits of \a __a.
    835 static __inline__ __m128d __DEFAULT_FN_ATTRS _mm_cmpord_sd(__m128d __a,
    836                                                            __m128d __b) {
    837   return (__m128d)__builtin_ia32_cmpordsd((__v2df)__a, (__v2df)__b);
    838 }
    839 
    840 /// Compares the lower double-precision floating-point values in each of
    841 ///    the two 128-bit floating-point vectors of [2 x double] to determine if
    842 ///    the value in the first parameter is unordered with respect to the
    843 ///    corresponding value in the second parameter.
    844 ///
    845 ///    The comparison returns 0x0 for false, 0xFFFFFFFFFFFFFFFF for true. A pair
    846 ///    of double-precision values are unordered with respect to each other if
    847 ///    one or both values are NaN.
    848 ///
    849 /// \headerfile <x86intrin.h>
    850 ///
    851 /// This intrinsic corresponds to the <c> VCMPUNORDSD / CMPUNORDSD </c>
    852 ///   instruction.
    853 ///
    854 /// \param __a
    855 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
    856 ///    compared to the lower double-precision value of \a __b.
    857 /// \param __b
    858 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
    859 ///    compared to the lower double-precision value of \a __a.
    860 /// \returns A 128-bit vector. The lower 64 bits contains the comparison
    861 ///    results. The upper 64 bits are copied from the upper 64 bits of \a __a.
    862 static __inline__ __m128d __DEFAULT_FN_ATTRS _mm_cmpunord_sd(__m128d __a,
    863                                                              __m128d __b) {
    864   return (__m128d)__builtin_ia32_cmpunordsd((__v2df)__a, (__v2df)__b);
    865 }
    866 
    867 /// Compares the lower double-precision floating-point values in each of
    868 ///    the two 128-bit floating-point vectors of [2 x double] to determine if
    869 ///    the value in the first parameter is unequal to the corresponding value in
    870 ///    the second parameter.
    871 ///
    872 ///    The comparison returns 0x0 for false, 0xFFFFFFFFFFFFFFFF for true.
    873 ///    If either value in a comparison is NaN, returns true.
    874 ///
    875 /// \headerfile <x86intrin.h>
    876 ///
    877 /// This intrinsic corresponds to the <c> VCMPNEQSD / CMPNEQSD </c> instruction.
    878 ///
    879 /// \param __a
    880 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
    881 ///    compared to the lower double-precision value of \a __b.
    882 /// \param __b
    883 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
    884 ///    compared to the lower double-precision value of \a __a.
    885 /// \returns A 128-bit vector. The lower 64 bits contains the comparison
    886 ///    results. The upper 64 bits are copied from the upper 64 bits of \a __a.
    887 static __inline__ __m128d __DEFAULT_FN_ATTRS _mm_cmpneq_sd(__m128d __a,
    888                                                            __m128d __b) {
    889   return (__m128d)__builtin_ia32_cmpneqsd((__v2df)__a, (__v2df)__b);
    890 }
    891 
    892 /// Compares the lower double-precision floating-point values in each of
    893 ///    the two 128-bit floating-point vectors of [2 x double] to determine if
    894 ///    the value in the first parameter is not less than the corresponding
    895 ///    value in the second parameter.
    896 ///
    897 ///    The comparison returns 0x0 for false, 0xFFFFFFFFFFFFFFFF for true.
    898 ///    If either value in a comparison is NaN, returns true.
    899 ///
    900 /// \headerfile <x86intrin.h>
    901 ///
    902 /// This intrinsic corresponds to the <c> VCMPNLTSD / CMPNLTSD </c> instruction.
    903 ///
    904 /// \param __a
    905 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
    906 ///    compared to the lower double-precision value of \a __b.
    907 /// \param __b
    908 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
    909 ///    compared to the lower double-precision value of \a __a.
    910 /// \returns A 128-bit vector. The lower 64 bits contains the comparison
    911 ///    results. The upper 64 bits are copied from the upper 64 bits of \a __a.
    912 static __inline__ __m128d __DEFAULT_FN_ATTRS _mm_cmpnlt_sd(__m128d __a,
    913                                                            __m128d __b) {
    914   return (__m128d)__builtin_ia32_cmpnltsd((__v2df)__a, (__v2df)__b);
    915 }
    916 
    917 /// Compares the lower double-precision floating-point values in each of
    918 ///    the two 128-bit floating-point vectors of [2 x double] to determine if
    919 ///    the value in the first parameter is not less than or equal to the
    920 ///    corresponding value in the second parameter.
    921 ///
    922 ///    The comparison returns 0x0 for false, 0xFFFFFFFFFFFFFFFF for true.
    923 ///    If either value in a comparison is NaN, returns true.
    924 ///
    925 /// \headerfile <x86intrin.h>
    926 ///
    927 /// This intrinsic corresponds to the <c> VCMPNLESD / CMPNLESD </c> instruction.
    928 ///
    929 /// \param __a
    930 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
    931 ///    compared to the lower double-precision value of \a __b.
    932 /// \param __b
    933 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
    934 ///    compared to the lower double-precision value of \a __a.
    935 /// \returns  A 128-bit vector. The lower 64 bits contains the comparison
    936 ///    results. The upper 64 bits are copied from the upper 64 bits of \a __a.
    937 static __inline__ __m128d __DEFAULT_FN_ATTRS _mm_cmpnle_sd(__m128d __a,
    938                                                            __m128d __b) {
    939   return (__m128d)__builtin_ia32_cmpnlesd((__v2df)__a, (__v2df)__b);
    940 }
    941 
    942 /// Compares the lower double-precision floating-point values in each of
    943 ///    the two 128-bit floating-point vectors of [2 x double] to determine if
    944 ///    the value in the first parameter is not greater than the corresponding
    945 ///    value in the second parameter.
    946 ///
    947 ///    The comparison returns 0x0 for false, 0xFFFFFFFFFFFFFFFF for true.
    948 ///    If either value in a comparison is NaN, returns true.
    949 ///
    950 /// \headerfile <x86intrin.h>
    951 ///
    952 /// This intrinsic corresponds to the <c> VCMPNLTSD / CMPNLTSD </c> instruction.
    953 ///
    954 /// \param __a
    955 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
    956 ///    compared to the lower double-precision value of \a __b.
    957 /// \param __b
    958 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
    959 ///    compared to the lower double-precision value of \a __a.
    960 /// \returns A 128-bit vector. The lower 64 bits contains the comparison
    961 ///    results. The upper 64 bits are copied from the upper 64 bits of \a __a.
    962 static __inline__ __m128d __DEFAULT_FN_ATTRS _mm_cmpngt_sd(__m128d __a,
    963                                                            __m128d __b) {
    964   __m128d __c = __builtin_ia32_cmpnltsd((__v2df)__b, (__v2df)__a);
    965   return __extension__(__m128d){__c[0], __a[1]};
    966 }
    967 
    968 /// Compares the lower double-precision floating-point values in each of
    969 ///    the two 128-bit floating-point vectors of [2 x double] to determine if
    970 ///    the value in the first parameter is not greater than or equal to the
    971 ///    corresponding value in the second parameter.
    972 ///
    973 ///    The comparison returns 0x0 for false, 0xFFFFFFFFFFFFFFFF for true.
    974 ///    If either value in a comparison is NaN, returns true.
    975 ///
    976 /// \headerfile <x86intrin.h>
    977 ///
    978 /// This intrinsic corresponds to the <c> VCMPNLESD / CMPNLESD </c> instruction.
    979 ///
    980 /// \param __a
    981 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
    982 ///    compared to the lower double-precision value of \a __b.
    983 /// \param __b
    984 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
    985 ///    compared to the lower double-precision value of \a __a.
    986 /// \returns A 128-bit vector. The lower 64 bits contains the comparison
    987 ///    results. The upper 64 bits are copied from the upper 64 bits of \a __a.
    988 static __inline__ __m128d __DEFAULT_FN_ATTRS _mm_cmpnge_sd(__m128d __a,
    989                                                            __m128d __b) {
    990   __m128d __c = __builtin_ia32_cmpnlesd((__v2df)__b, (__v2df)__a);
    991   return __extension__(__m128d){__c[0], __a[1]};
    992 }
    993 
    994 /// Compares the lower double-precision floating-point values in each of
    995 ///    the two 128-bit floating-point vectors of [2 x double] for equality.
    996 ///
    997 ///    The comparison returns 0 for false, 1 for true. If either value in a
    998 ///    comparison is NaN, returns 0.
    999 ///
   1000 /// \headerfile <x86intrin.h>
   1001 ///
   1002 /// This intrinsic corresponds to the <c> VCOMISD / COMISD </c> instruction.
   1003 ///
   1004 /// \param __a
   1005 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
   1006 ///    compared to the lower double-precision value of \a __b.
   1007 /// \param __b
   1008 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
   1009 ///    compared to the lower double-precision value of \a __a.
   1010 /// \returns An integer containing the comparison results.
   1011 static __inline__ int __DEFAULT_FN_ATTRS _mm_comieq_sd(__m128d __a,
   1012                                                        __m128d __b) {
   1013   return __builtin_ia32_comisdeq((__v2df)__a, (__v2df)__b);
   1014 }
   1015 
   1016 /// Compares the lower double-precision floating-point values in each of
   1017 ///    the two 128-bit floating-point vectors of [2 x double] to determine if
   1018 ///    the value in the first parameter is less than the corresponding value in
   1019 ///    the second parameter.
   1020 ///
   1021 ///    The comparison returns 0 for false, 1 for true. If either value in a
   1022 ///    comparison is NaN, returns 0.
   1023 ///
   1024 /// \headerfile <x86intrin.h>
   1025 ///
   1026 /// This intrinsic corresponds to the <c> VCOMISD / COMISD </c> instruction.
   1027 ///
   1028 /// \param __a
   1029 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
   1030 ///    compared to the lower double-precision value of \a __b.
   1031 /// \param __b
   1032 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
   1033 ///    compared to the lower double-precision value of \a __a.
   1034 /// \returns An integer containing the comparison results.
   1035 static __inline__ int __DEFAULT_FN_ATTRS _mm_comilt_sd(__m128d __a,
   1036                                                        __m128d __b) {
   1037   return __builtin_ia32_comisdlt((__v2df)__a, (__v2df)__b);
   1038 }
   1039 
   1040 /// Compares the lower double-precision floating-point values in each of
   1041 ///    the two 128-bit floating-point vectors of [2 x double] to determine if
   1042 ///    the value in the first parameter is less than or equal to the
   1043 ///    corresponding value in the second parameter.
   1044 ///
   1045 ///    The comparison returns 0 for false, 1 for true. If either value in a
   1046 ///    comparison is NaN, returns 0.
   1047 ///
   1048 /// \headerfile <x86intrin.h>
   1049 ///
   1050 /// This intrinsic corresponds to the <c> VCOMISD / COMISD </c> instruction.
   1051 ///
   1052 /// \param __a
   1053 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
   1054 ///    compared to the lower double-precision value of \a __b.
   1055 /// \param __b
   1056 ///     A 128-bit vector of [2 x double]. The lower double-precision value is
   1057 ///     compared to the lower double-precision value of \a __a.
   1058 /// \returns An integer containing the comparison results.
   1059 static __inline__ int __DEFAULT_FN_ATTRS _mm_comile_sd(__m128d __a,
   1060                                                        __m128d __b) {
   1061   return __builtin_ia32_comisdle((__v2df)__a, (__v2df)__b);
   1062 }
   1063 
   1064 /// Compares the lower double-precision floating-point values in each of
   1065 ///    the two 128-bit floating-point vectors of [2 x double] to determine if
   1066 ///    the value in the first parameter is greater than the corresponding value
   1067 ///    in the second parameter.
   1068 ///
   1069 ///    The comparison returns 0 for false, 1 for true. If either value in a
   1070 ///    comparison is NaN, returns 0.
   1071 ///
   1072 /// \headerfile <x86intrin.h>
   1073 ///
   1074 /// This intrinsic corresponds to the <c> VCOMISD / COMISD </c> instruction.
   1075 ///
   1076 /// \param __a
   1077 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
   1078 ///    compared to the lower double-precision value of \a __b.
   1079 /// \param __b
   1080 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
   1081 ///    compared to the lower double-precision value of \a __a.
   1082 /// \returns An integer containing the comparison results.
   1083 static __inline__ int __DEFAULT_FN_ATTRS _mm_comigt_sd(__m128d __a,
   1084                                                        __m128d __b) {
   1085   return __builtin_ia32_comisdgt((__v2df)__a, (__v2df)__b);
   1086 }
   1087 
   1088 /// Compares the lower double-precision floating-point values in each of
   1089 ///    the two 128-bit floating-point vectors of [2 x double] to determine if
   1090 ///    the value in the first parameter is greater than or equal to the
   1091 ///    corresponding value in the second parameter.
   1092 ///
   1093 ///    The comparison returns 0 for false, 1 for true. If either value in a
   1094 ///    comparison is NaN, returns 0.
   1095 ///
   1096 /// \headerfile <x86intrin.h>
   1097 ///
   1098 /// This intrinsic corresponds to the <c> VCOMISD / COMISD </c> instruction.
   1099 ///
   1100 /// \param __a
   1101 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
   1102 ///    compared to the lower double-precision value of \a __b.
   1103 /// \param __b
   1104 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
   1105 ///    compared to the lower double-precision value of \a __a.
   1106 /// \returns An integer containing the comparison results.
   1107 static __inline__ int __DEFAULT_FN_ATTRS _mm_comige_sd(__m128d __a,
   1108                                                        __m128d __b) {
   1109   return __builtin_ia32_comisdge((__v2df)__a, (__v2df)__b);
   1110 }
   1111 
   1112 /// Compares the lower double-precision floating-point values in each of
   1113 ///    the two 128-bit floating-point vectors of [2 x double] to determine if
   1114 ///    the value in the first parameter is unequal to the corresponding value in
   1115 ///    the second parameter.
   1116 ///
   1117 ///    The comparison returns 0 for false, 1 for true. If either value in a
   1118 ///    comparison is NaN, returns 1.
   1119 ///
   1120 /// \headerfile <x86intrin.h>
   1121 ///
   1122 /// This intrinsic corresponds to the <c> VCOMISD / COMISD </c> instruction.
   1123 ///
   1124 /// \param __a
   1125 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
   1126 ///    compared to the lower double-precision value of \a __b.
   1127 /// \param __b
   1128 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
   1129 ///    compared to the lower double-precision value of \a __a.
   1130 /// \returns An integer containing the comparison results.
   1131 static __inline__ int __DEFAULT_FN_ATTRS _mm_comineq_sd(__m128d __a,
   1132                                                         __m128d __b) {
   1133   return __builtin_ia32_comisdneq((__v2df)__a, (__v2df)__b);
   1134 }
   1135 
   1136 /// Compares the lower double-precision floating-point values in each of
   1137 ///    the two 128-bit floating-point vectors of [2 x double] for equality.
   1138 ///
   1139 ///    The comparison returns 0 for false, 1 for true. If either value in a
   1140 ///    comparison is NaN, returns 0.
   1141 ///
   1142 /// \headerfile <x86intrin.h>
   1143 ///
   1144 /// This intrinsic corresponds to the <c> VUCOMISD / UCOMISD </c> instruction.
   1145 ///
   1146 /// \param __a
   1147 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
   1148 ///    compared to the lower double-precision value of \a __b.
   1149 /// \param __b
   1150 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
   1151 ///    compared to the lower double-precision value of \a __a.
   1152 /// \returns An integer containing the comparison results.
   1153 static __inline__ int __DEFAULT_FN_ATTRS _mm_ucomieq_sd(__m128d __a,
   1154                                                         __m128d __b) {
   1155   return __builtin_ia32_ucomisdeq((__v2df)__a, (__v2df)__b);
   1156 }
   1157 
   1158 /// Compares the lower double-precision floating-point values in each of
   1159 ///    the two 128-bit floating-point vectors of [2 x double] to determine if
   1160 ///    the value in the first parameter is less than the corresponding value in
   1161 ///    the second parameter.
   1162 ///
   1163 ///    The comparison returns 0 for false, 1 for true. If either value in a
   1164 ///    comparison is NaN, returns 0.
   1165 ///
   1166 /// \headerfile <x86intrin.h>
   1167 ///
   1168 /// This intrinsic corresponds to the <c> VUCOMISD / UCOMISD </c> instruction.
   1169 ///
   1170 /// \param __a
   1171 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
   1172 ///    compared to the lower double-precision value of \a __b.
   1173 /// \param __b
   1174 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
   1175 ///    compared to the lower double-precision value of \a __a.
   1176 /// \returns An integer containing the comparison results.
   1177 static __inline__ int __DEFAULT_FN_ATTRS _mm_ucomilt_sd(__m128d __a,
   1178                                                         __m128d __b) {
   1179   return __builtin_ia32_ucomisdlt((__v2df)__a, (__v2df)__b);
   1180 }
   1181 
   1182 /// Compares the lower double-precision floating-point values in each of
   1183 ///    the two 128-bit floating-point vectors of [2 x double] to determine if
   1184 ///    the value in the first parameter is less than or equal to the
   1185 ///    corresponding value in the second parameter.
   1186 ///
   1187 ///    The comparison returns 0 for false, 1 for true. If either value in a
   1188 ///    comparison is NaN, returns 0.
   1189 ///
   1190 /// \headerfile <x86intrin.h>
   1191 ///
   1192 /// This intrinsic corresponds to the <c> VUCOMISD / UCOMISD </c> instruction.
   1193 ///
   1194 /// \param __a
   1195 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
   1196 ///    compared to the lower double-precision value of \a __b.
   1197 /// \param __b
   1198 ///     A 128-bit vector of [2 x double]. The lower double-precision value is
   1199 ///     compared to the lower double-precision value of \a __a.
   1200 /// \returns An integer containing the comparison results.
   1201 static __inline__ int __DEFAULT_FN_ATTRS _mm_ucomile_sd(__m128d __a,
   1202                                                         __m128d __b) {
   1203   return __builtin_ia32_ucomisdle((__v2df)__a, (__v2df)__b);
   1204 }
   1205 
   1206 /// Compares the lower double-precision floating-point values in each of
   1207 ///    the two 128-bit floating-point vectors of [2 x double] to determine if
   1208 ///    the value in the first parameter is greater than the corresponding value
   1209 ///    in the second parameter.
   1210 ///
   1211 ///    The comparison returns 0 for false, 1 for true. If either value in a
   1212 ///    comparison is NaN, returns 0.
   1213 ///
   1214 /// \headerfile <x86intrin.h>
   1215 ///
   1216 /// This intrinsic corresponds to the <c> VUCOMISD / UCOMISD </c> instruction.
   1217 ///
   1218 /// \param __a
   1219 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
   1220 ///    compared to the lower double-precision value of \a __b.
   1221 /// \param __b
   1222 ///     A 128-bit vector of [2 x double]. The lower double-precision value is
   1223 ///     compared to the lower double-precision value of \a __a.
   1224 /// \returns An integer containing the comparison results.
   1225 static __inline__ int __DEFAULT_FN_ATTRS _mm_ucomigt_sd(__m128d __a,
   1226                                                         __m128d __b) {
   1227   return __builtin_ia32_ucomisdgt((__v2df)__a, (__v2df)__b);
   1228 }
   1229 
   1230 /// Compares the lower double-precision floating-point values in each of
   1231 ///    the two 128-bit floating-point vectors of [2 x double] to determine if
   1232 ///    the value in the first parameter is greater than or equal to the
   1233 ///    corresponding value in the second parameter.
   1234 ///
   1235 ///    The comparison returns 0 for false, 1 for true. If either value in a
   1236 ///    comparison is NaN, returns 0.
   1237 ///
   1238 /// \headerfile <x86intrin.h>
   1239 ///
   1240 /// This intrinsic corresponds to the <c> VUCOMISD / UCOMISD </c> instruction.
   1241 ///
   1242 /// \param __a
   1243 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
   1244 ///    compared to the lower double-precision value of \a __b.
   1245 /// \param __b
   1246 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
   1247 ///    compared to the lower double-precision value of \a __a.
   1248 /// \returns An integer containing the comparison results.
   1249 static __inline__ int __DEFAULT_FN_ATTRS _mm_ucomige_sd(__m128d __a,
   1250                                                         __m128d __b) {
   1251   return __builtin_ia32_ucomisdge((__v2df)__a, (__v2df)__b);
   1252 }
   1253 
   1254 /// Compares the lower double-precision floating-point values in each of
   1255 ///    the two 128-bit floating-point vectors of [2 x double] to determine if
   1256 ///    the value in the first parameter is unequal to the corresponding value in
   1257 ///    the second parameter.
   1258 ///
   1259 ///    The comparison returns 0 for false, 1 for true. If either value in a
   1260 ///    comparison is NaN, returns 1.
   1261 ///
   1262 /// \headerfile <x86intrin.h>
   1263 ///
   1264 /// This intrinsic corresponds to the <c> VUCOMISD / UCOMISD </c> instruction.
   1265 ///
   1266 /// \param __a
   1267 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
   1268 ///    compared to the lower double-precision value of \a __b.
   1269 /// \param __b
   1270 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
   1271 ///    compared to the lower double-precision value of \a __a.
   1272 /// \returns An integer containing the comparison result.
   1273 static __inline__ int __DEFAULT_FN_ATTRS _mm_ucomineq_sd(__m128d __a,
   1274                                                          __m128d __b) {
   1275   return __builtin_ia32_ucomisdneq((__v2df)__a, (__v2df)__b);
   1276 }
   1277 
   1278 /// Converts the two double-precision floating-point elements of a
   1279 ///    128-bit vector of [2 x double] into two single-precision floating-point
   1280 ///    values, returned in the lower 64 bits of a 128-bit vector of [4 x float].
   1281 ///    The upper 64 bits of the result vector are set to zero.
   1282 ///
   1283 /// \headerfile <x86intrin.h>
   1284 ///
   1285 /// This intrinsic corresponds to the <c> VCVTPD2PS / CVTPD2PS </c> instruction.
   1286 ///
   1287 /// \param __a
   1288 ///    A 128-bit vector of [2 x double].
   1289 /// \returns A 128-bit vector of [4 x float] whose lower 64 bits contain the
   1290 ///    converted values. The upper 64 bits are set to zero.
   1291 static __inline__ __m128 __DEFAULT_FN_ATTRS _mm_cvtpd_ps(__m128d __a) {
   1292   return __builtin_ia32_cvtpd2ps((__v2df)__a);
   1293 }
   1294 
   1295 /// Converts the lower two single-precision floating-point elements of a
   1296 ///    128-bit vector of [4 x float] into two double-precision floating-point
   1297 ///    values, returned in a 128-bit vector of [2 x double]. The upper two
   1298 ///    elements of the input vector are unused.
   1299 ///
   1300 /// \headerfile <x86intrin.h>
   1301 ///
   1302 /// This intrinsic corresponds to the <c> VCVTPS2PD / CVTPS2PD </c> instruction.
   1303 ///
   1304 /// \param __a
   1305 ///    A 128-bit vector of [4 x float]. The lower two single-precision
   1306 ///    floating-point elements are converted to double-precision values. The
   1307 ///    upper two elements are unused.
   1308 /// \returns A 128-bit vector of [2 x double] containing the converted values.
   1309 static __inline__ __m128d __DEFAULT_FN_ATTRS_CONSTEXPR
   1310 _mm_cvtps_pd(__m128 __a) {
   1311   return (__m128d) __builtin_convertvector(
   1312       __builtin_shufflevector((__v4sf)__a, (__v4sf)__a, 0, 1), __v2df);
   1313 }
   1314 
   1315 /// Converts the lower two integer elements of a 128-bit vector of
   1316 ///    [4 x i32] into two double-precision floating-point values, returned in a
   1317 ///    128-bit vector of [2 x double].
   1318 ///
   1319 ///    The upper two elements of the input vector are unused.
   1320 ///
   1321 /// \headerfile <x86intrin.h>
   1322 ///
   1323 /// This intrinsic corresponds to the <c> VCVTDQ2PD / CVTDQ2PD </c> instruction.
   1324 ///
   1325 /// \param __a
   1326 ///    A 128-bit integer vector of [4 x i32]. The lower two integer elements are
   1327 ///    converted to double-precision values.
   1328 ///
   1329 ///    The upper two elements are unused.
   1330 /// \returns A 128-bit vector of [2 x double] containing the converted values.
   1331 static __inline__ __m128d __DEFAULT_FN_ATTRS_CONSTEXPR
   1332 _mm_cvtepi32_pd(__m128i __a) {
   1333   return (__m128d) __builtin_convertvector(
   1334       __builtin_shufflevector((__v4si)__a, (__v4si)__a, 0, 1), __v2df);
   1335 }
   1336 
   1337 /// Converts the two double-precision floating-point elements of a
   1338 ///    128-bit vector of [2 x double] into two signed 32-bit integer values,
   1339 ///    returned in the lower 64 bits of a 128-bit vector of [4 x i32]. The upper
   1340 ///    64 bits of the result vector are set to zero.
   1341 ///
   1342 ///    If a converted value does not fit in a 32-bit integer, raises a
   1343 ///    floating-point invalid exception. If the exception is masked, returns
   1344 ///    the most negative integer.
   1345 ///
   1346 /// \headerfile <x86intrin.h>
   1347 ///
   1348 /// This intrinsic corresponds to the <c> VCVTPD2DQ / CVTPD2DQ </c> instruction.
   1349 ///
   1350 /// \param __a
   1351 ///    A 128-bit vector of [2 x double].
   1352 /// \returns A 128-bit vector of [4 x i32] whose lower 64 bits contain the
   1353 ///    converted values. The upper 64 bits are set to zero.
   1354 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_cvtpd_epi32(__m128d __a) {
   1355   return __builtin_ia32_cvtpd2dq((__v2df)__a);
   1356 }
   1357 
   1358 /// Converts the low-order element of a 128-bit vector of [2 x double]
   1359 ///    into a 32-bit signed integer value.
   1360 ///
   1361 ///    If the converted value does not fit in a 32-bit integer, raises a
   1362 ///    floating-point invalid exception. If the exception is masked, returns
   1363 ///    the most negative integer.
   1364 ///
   1365 /// \headerfile <x86intrin.h>
   1366 ///
   1367 /// This intrinsic corresponds to the <c> VCVTSD2SI / CVTSD2SI </c> instruction.
   1368 ///
   1369 /// \param __a
   1370 ///    A 128-bit vector of [2 x double]. The lower 64 bits are used in the
   1371 ///    conversion.
   1372 /// \returns A 32-bit signed integer containing the converted value.
   1373 static __inline__ int __DEFAULT_FN_ATTRS _mm_cvtsd_si32(__m128d __a) {
   1374   return __builtin_ia32_cvtsd2si((__v2df)__a);
   1375 }
   1376 
   1377 /// Converts the lower double-precision floating-point element of a
   1378 ///    128-bit vector of [2 x double], in the second parameter, into a
   1379 ///    single-precision floating-point value, returned in the lower 32 bits of a
   1380 ///    128-bit vector of [4 x float]. The upper 96 bits of the result vector are
   1381 ///    copied from the upper 96 bits of the first parameter.
   1382 ///
   1383 /// \headerfile <x86intrin.h>
   1384 ///
   1385 /// This intrinsic corresponds to the <c> VCVTSD2SS / CVTSD2SS </c> instruction.
   1386 ///
   1387 /// \param __a
   1388 ///    A 128-bit vector of [4 x float]. The upper 96 bits of this parameter are
   1389 ///    copied to the upper 96 bits of the result.
   1390 /// \param __b
   1391 ///    A 128-bit vector of [2 x double]. The lower double-precision
   1392 ///    floating-point element is used in the conversion.
   1393 /// \returns A 128-bit vector of [4 x float]. The lower 32 bits contain the
   1394 ///    converted value from the second parameter. The upper 96 bits are copied
   1395 ///    from the upper 96 bits of the first parameter.
   1396 static __inline__ __m128 __DEFAULT_FN_ATTRS _mm_cvtsd_ss(__m128 __a,
   1397                                                          __m128d __b) {
   1398   return (__m128)__builtin_ia32_cvtsd2ss((__v4sf)__a, (__v2df)__b);
   1399 }
   1400 
   1401 /// Converts a 32-bit signed integer value, in the second parameter, into
   1402 ///    a double-precision floating-point value, returned in the lower 64 bits of
   1403 ///    a 128-bit vector of [2 x double]. The upper 64 bits of the result vector
   1404 ///    are copied from the upper 64 bits of the first parameter.
   1405 ///
   1406 /// \headerfile <x86intrin.h>
   1407 ///
   1408 /// This intrinsic corresponds to the <c> VCVTSI2SD / CVTSI2SD </c> instruction.
   1409 ///
   1410 /// \param __a
   1411 ///    A 128-bit vector of [2 x double]. The upper 64 bits of this parameter are
   1412 ///    copied to the upper 64 bits of the result.
   1413 /// \param __b
   1414 ///    A 32-bit signed integer containing the value to be converted.
   1415 /// \returns A 128-bit vector of [2 x double]. The lower 64 bits contain the
   1416 ///    converted value from the second parameter. The upper 64 bits are copied
   1417 ///    from the upper 64 bits of the first parameter.
   1418 static __inline__ __m128d __DEFAULT_FN_ATTRS_CONSTEXPR
   1419 _mm_cvtsi32_sd(__m128d __a, int __b) {
   1420   __a[0] = __b;
   1421   return __a;
   1422 }
   1423 
   1424 /// Converts the lower single-precision floating-point element of a
   1425 ///    128-bit vector of [4 x float], in the second parameter, into a
   1426 ///    double-precision floating-point value, returned in the lower 64 bits of
   1427 ///    a 128-bit vector of [2 x double]. The upper 64 bits of the result vector
   1428 ///    are copied from the upper 64 bits of the first parameter.
   1429 ///
   1430 /// \headerfile <x86intrin.h>
   1431 ///
   1432 /// This intrinsic corresponds to the <c> VCVTSS2SD / CVTSS2SD </c> instruction.
   1433 ///
   1434 /// \param __a
   1435 ///    A 128-bit vector of [2 x double]. The upper 64 bits of this parameter are
   1436 ///    copied to the upper 64 bits of the result.
   1437 /// \param __b
   1438 ///    A 128-bit vector of [4 x float]. The lower single-precision
   1439 ///    floating-point element is used in the conversion.
   1440 /// \returns A 128-bit vector of [2 x double]. The lower 64 bits contain the
   1441 ///    converted value from the second parameter. The upper 64 bits are copied
   1442 ///    from the upper 64 bits of the first parameter.
   1443 static __inline__ __m128d __DEFAULT_FN_ATTRS_CONSTEXPR
   1444 _mm_cvtss_sd(__m128d __a, __m128 __b) {
   1445   __a[0] = __b[0];
   1446   return __a;
   1447 }
   1448 
   1449 /// Converts the two double-precision floating-point elements of a
   1450 ///    128-bit vector of [2 x double] into two signed truncated (rounded
   1451 ///    toward zero) 32-bit integer values, returned in the lower 64 bits
   1452 ///    of a 128-bit vector of [4 x i32].
   1453 ///
   1454 ///    If a converted value does not fit in a 32-bit integer, raises a
   1455 ///    floating-point invalid exception. If the exception is masked, returns
   1456 ///    the most negative integer.
   1457 ///
   1458 /// \headerfile <x86intrin.h>
   1459 ///
   1460 /// This intrinsic corresponds to the <c> VCVTTPD2DQ / CVTTPD2DQ </c>
   1461 ///   instruction.
   1462 ///
   1463 /// \param __a
   1464 ///    A 128-bit vector of [2 x double].
   1465 /// \returns A 128-bit vector of [4 x i32] whose lower 64 bits contain the
   1466 ///    converted values. The upper 64 bits are set to zero.
   1467 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_cvttpd_epi32(__m128d __a) {
   1468   return (__m128i)__builtin_ia32_cvttpd2dq((__v2df)__a);
   1469 }
   1470 
   1471 /// Converts the low-order element of a [2 x double] vector into a 32-bit
   1472 ///    signed truncated (rounded toward zero) integer value.
   1473 ///
   1474 ///    If the converted value does not fit in a 32-bit integer, raises a
   1475 ///    floating-point invalid exception. If the exception is masked, returns
   1476 ///    the most negative integer.
   1477 ///
   1478 /// \headerfile <x86intrin.h>
   1479 ///
   1480 /// This intrinsic corresponds to the <c> VCVTTSD2SI / CVTTSD2SI </c>
   1481 ///   instruction.
   1482 ///
   1483 /// \param __a
   1484 ///    A 128-bit vector of [2 x double]. The lower 64 bits are used in the
   1485 ///    conversion.
   1486 /// \returns A 32-bit signed integer containing the converted value.
   1487 static __inline__ int __DEFAULT_FN_ATTRS _mm_cvttsd_si32(__m128d __a) {
   1488   return __builtin_ia32_cvttsd2si((__v2df)__a);
   1489 }
   1490 
   1491 /// Converts the two double-precision floating-point elements of a
   1492 ///    128-bit vector of [2 x double] into two signed 32-bit integer values,
   1493 ///    returned in a 64-bit vector of [2 x i32].
   1494 ///
   1495 ///    If a converted value does not fit in a 32-bit integer, raises a
   1496 ///    floating-point invalid exception. If the exception is masked, returns
   1497 ///    the most negative integer.
   1498 ///
   1499 /// \headerfile <x86intrin.h>
   1500 ///
   1501 /// This intrinsic corresponds to the <c> CVTPD2PI </c> instruction.
   1502 ///
   1503 /// \param __a
   1504 ///    A 128-bit vector of [2 x double].
   1505 /// \returns A 64-bit vector of [2 x i32] containing the converted values.
   1506 static __inline__ __m64 __DEFAULT_FN_ATTRS _mm_cvtpd_pi32(__m128d __a) {
   1507   return __trunc64(__builtin_ia32_cvtpd2dq((__v2df)__a));
   1508 }
   1509 
   1510 /// Converts the two double-precision floating-point elements of a
   1511 ///    128-bit vector of [2 x double] into two signed truncated (rounded toward
   1512 ///    zero) 32-bit integer values, returned in a 64-bit vector of [2 x i32].
   1513 ///
   1514 ///    If a converted value does not fit in a 32-bit integer, raises a
   1515 ///    floating-point invalid exception. If the exception is masked, returns
   1516 ///    the most negative integer.
   1517 ///
   1518 /// \headerfile <x86intrin.h>
   1519 ///
   1520 /// This intrinsic corresponds to the <c> CVTTPD2PI </c> instruction.
   1521 ///
   1522 /// \param __a
   1523 ///    A 128-bit vector of [2 x double].
   1524 /// \returns A 64-bit vector of [2 x i32] containing the converted values.
   1525 static __inline__ __m64 __DEFAULT_FN_ATTRS _mm_cvttpd_pi32(__m128d __a) {
   1526   return __trunc64(__builtin_ia32_cvttpd2dq((__v2df)__a));
   1527 }
   1528 
   1529 /// Converts the two signed 32-bit integer elements of a 64-bit vector of
   1530 ///    [2 x i32] into two double-precision floating-point values, returned in a
   1531 ///    128-bit vector of [2 x double].
   1532 ///
   1533 /// \headerfile <x86intrin.h>
   1534 ///
   1535 /// This intrinsic corresponds to the <c> CVTPI2PD </c> instruction.
   1536 ///
   1537 /// \param __a
   1538 ///    A 64-bit vector of [2 x i32].
   1539 /// \returns A 128-bit vector of [2 x double] containing the converted values.
   1540 static __inline__ __m128d __DEFAULT_FN_ATTRS_CONSTEXPR
   1541 _mm_cvtpi32_pd(__m64 __a) {
   1542   return (__m128d) __builtin_convertvector((__v2si)__a, __v2df);
   1543 }
   1544 
   1545 /// Returns the low-order element of a 128-bit vector of [2 x double] as
   1546 ///    a double-precision floating-point value.
   1547 ///
   1548 /// \headerfile <x86intrin.h>
   1549 ///
   1550 /// This intrinsic has no corresponding instruction.
   1551 ///
   1552 /// \param __a
   1553 ///    A 128-bit vector of [2 x double]. The lower 64 bits are returned.
   1554 /// \returns A double-precision floating-point value copied from the lower 64
   1555 ///    bits of \a __a.
   1556 static __inline__ double __DEFAULT_FN_ATTRS_CONSTEXPR
   1557 _mm_cvtsd_f64(__m128d __a) {
   1558   return __a[0];
   1559 }
   1560 
   1561 /// Loads a 128-bit floating-point vector of [2 x double] from an aligned
   1562 ///    memory location.
   1563 ///
   1564 /// \headerfile <x86intrin.h>
   1565 ///
   1566 /// This intrinsic corresponds to the <c> VMOVAPD / MOVAPD </c> instruction.
   1567 ///
   1568 /// \param __dp
   1569 ///    A pointer to a 128-bit memory location. The address of the memory
   1570 ///    location has to be 16-byte aligned.
   1571 /// \returns A 128-bit vector of [2 x double] containing the loaded values.
   1572 static __inline__ __m128d __DEFAULT_FN_ATTRS _mm_load_pd(double const *__dp) {
   1573   return *(const __m128d *)__dp;
   1574 }
   1575 
   1576 /// Loads a double-precision floating-point value from a specified memory
   1577 ///    location and duplicates it to both vector elements of a 128-bit vector of
   1578 ///    [2 x double].
   1579 ///
   1580 /// \headerfile <x86intrin.h>
   1581 ///
   1582 /// This intrinsic corresponds to the <c> VMOVDDUP / MOVDDUP </c> instruction.
   1583 ///
   1584 /// \param __dp
   1585 ///    A pointer to a memory location containing a double-precision value.
   1586 /// \returns A 128-bit vector of [2 x double] containing the loaded and
   1587 ///    duplicated values.
   1588 static __inline__ __m128d __DEFAULT_FN_ATTRS _mm_load1_pd(double const *__dp) {
   1589   struct __mm_load1_pd_struct {
   1590     double __u;
   1591   } __attribute__((__packed__, __may_alias__));
   1592   double __u = ((const struct __mm_load1_pd_struct *)__dp)->__u;
   1593   return __extension__(__m128d){__u, __u};
   1594 }
   1595 
   1596 #define _mm_load_pd1(dp) _mm_load1_pd(dp)
   1597 
   1598 /// Loads two double-precision values, in reverse order, from an aligned
   1599 ///    memory location into a 128-bit vector of [2 x double].
   1600 ///
   1601 /// \headerfile <x86intrin.h>
   1602 ///
   1603 /// This intrinsic corresponds to the <c> VMOVAPD / MOVAPD </c> instruction +
   1604 /// needed shuffling instructions. In AVX mode, the shuffling may be combined
   1605 /// with the \c VMOVAPD, resulting in only a \c VPERMILPD instruction.
   1606 ///
   1607 /// \param __dp
   1608 ///    A 16-byte aligned pointer to an array of double-precision values to be
   1609 ///    loaded in reverse order.
   1610 /// \returns A 128-bit vector of [2 x double] containing the reversed loaded
   1611 ///    values.
   1612 static __inline__ __m128d __DEFAULT_FN_ATTRS _mm_loadr_pd(double const *__dp) {
   1613   __m128d __u = *(const __m128d *)__dp;
   1614   return __builtin_shufflevector((__v2df)__u, (__v2df)__u, 1, 0);
   1615 }
   1616 
   1617 /// Loads a 128-bit floating-point vector of [2 x double] from an
   1618 ///    unaligned memory location.
   1619 ///
   1620 /// \headerfile <x86intrin.h>
   1621 ///
   1622 /// This intrinsic corresponds to the <c> VMOVUPD / MOVUPD </c> instruction.
   1623 ///
   1624 /// \param __dp
   1625 ///    A pointer to a 128-bit memory location. The address of the memory
   1626 ///    location does not have to be aligned.
   1627 /// \returns A 128-bit vector of [2 x double] containing the loaded values.
   1628 static __inline__ __m128d __DEFAULT_FN_ATTRS _mm_loadu_pd(double const *__dp) {
   1629   struct __loadu_pd {
   1630     __m128d_u __v;
   1631   } __attribute__((__packed__, __may_alias__));
   1632   return ((const struct __loadu_pd *)__dp)->__v;
   1633 }
   1634 
   1635 /// Loads a 64-bit integer value to the low element of a 128-bit integer
   1636 ///    vector and clears the upper element.
   1637 ///
   1638 /// \headerfile <x86intrin.h>
   1639 ///
   1640 /// This intrinsic corresponds to the <c> VMOVQ / MOVQ </c> instruction.
   1641 ///
   1642 /// \param __a
   1643 ///    A pointer to a 64-bit memory location. The address of the memory
   1644 ///    location does not have to be aligned.
   1645 /// \returns A 128-bit vector of [2 x i64] containing the loaded value.
   1646 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_loadu_si64(void const *__a) {
   1647   struct __loadu_si64 {
   1648     long long __v;
   1649   } __attribute__((__packed__, __may_alias__));
   1650   long long __u = ((const struct __loadu_si64 *)__a)->__v;
   1651   return __extension__(__m128i)(__v2di){__u, 0LL};
   1652 }
   1653 
   1654 /// Loads a 32-bit integer value to the low element of a 128-bit integer
   1655 ///    vector and clears the upper element.
   1656 ///
   1657 /// \headerfile <x86intrin.h>
   1658 ///
   1659 /// This intrinsic corresponds to the <c> VMOVD / MOVD </c> instruction.
   1660 ///
   1661 /// \param __a
   1662 ///    A pointer to a 32-bit memory location. The address of the memory
   1663 ///    location does not have to be aligned.
   1664 /// \returns A 128-bit vector of [4 x i32] containing the loaded value.
   1665 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_loadu_si32(void const *__a) {
   1666   struct __loadu_si32 {
   1667     int __v;
   1668   } __attribute__((__packed__, __may_alias__));
   1669   int __u = ((const struct __loadu_si32 *)__a)->__v;
   1670   return __extension__(__m128i)(__v4si){__u, 0, 0, 0};
   1671 }
   1672 
   1673 /// Loads a 16-bit integer value to the low element of a 128-bit integer
   1674 ///    vector and clears the upper element.
   1675 ///
   1676 /// \headerfile <x86intrin.h>
   1677 ///
   1678 /// This intrinsic does not correspond to a specific instruction.
   1679 ///
   1680 /// \param __a
   1681 ///    A pointer to a 16-bit memory location. The address of the memory
   1682 ///    location does not have to be aligned.
   1683 /// \returns A 128-bit vector of [8 x i16] containing the loaded value.
   1684 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_loadu_si16(void const *__a) {
   1685   struct __loadu_si16 {
   1686     short __v;
   1687   } __attribute__((__packed__, __may_alias__));
   1688   short __u = ((const struct __loadu_si16 *)__a)->__v;
   1689   return __extension__(__m128i)(__v8hi){__u, 0, 0, 0, 0, 0, 0, 0};
   1690 }
   1691 
   1692 /// Loads a 64-bit double-precision value to the low element of a
   1693 ///    128-bit integer vector and clears the upper element.
   1694 ///
   1695 /// \headerfile <x86intrin.h>
   1696 ///
   1697 /// This intrinsic corresponds to the <c> VMOVSD / MOVSD </c> instruction.
   1698 ///
   1699 /// \param __dp
   1700 ///    A pointer to a memory location containing a double-precision value.
   1701 ///    The address of the memory location does not have to be aligned.
   1702 /// \returns A 128-bit vector of [2 x double] containing the loaded value.
   1703 static __inline__ __m128d __DEFAULT_FN_ATTRS _mm_load_sd(double const *__dp) {
   1704   struct __mm_load_sd_struct {
   1705     double __u;
   1706   } __attribute__((__packed__, __may_alias__));
   1707   double __u = ((const struct __mm_load_sd_struct *)__dp)->__u;
   1708   return __extension__(__m128d){__u, 0};
   1709 }
   1710 
   1711 /// Loads a double-precision value into the high-order bits of a 128-bit
   1712 ///    vector of [2 x double]. The low-order bits are copied from the low-order
   1713 ///    bits of the first operand.
   1714 ///
   1715 /// \headerfile <x86intrin.h>
   1716 ///
   1717 /// This intrinsic corresponds to the <c> VMOVHPD / MOVHPD </c> instruction.
   1718 ///
   1719 /// \param __a
   1720 ///    A 128-bit vector of [2 x double]. \n
   1721 ///    Bits [63:0] are written to bits [63:0] of the result.
   1722 /// \param __dp
   1723 ///    A pointer to a 64-bit memory location containing a double-precision
   1724 ///    floating-point value that is loaded. The loaded value is written to bits
   1725 ///    [127:64] of the result. The address of the memory location does not have
   1726 ///    to be aligned.
   1727 /// \returns A 128-bit vector of [2 x double] containing the moved values.
   1728 static __inline__ __m128d __DEFAULT_FN_ATTRS _mm_loadh_pd(__m128d __a,
   1729                                                           double const *__dp) {
   1730   struct __mm_loadh_pd_struct {
   1731     double __u;
   1732   } __attribute__((__packed__, __may_alias__));
   1733   double __u = ((const struct __mm_loadh_pd_struct *)__dp)->__u;
   1734   return __extension__(__m128d){__a[0], __u};
   1735 }
   1736 
   1737 /// Loads a double-precision value into the low-order bits of a 128-bit
   1738 ///    vector of [2 x double]. The high-order bits are copied from the
   1739 ///    high-order bits of the first operand.
   1740 ///
   1741 /// \headerfile <x86intrin.h>
   1742 ///
   1743 /// This intrinsic corresponds to the <c> VMOVLPD / MOVLPD </c> instruction.
   1744 ///
   1745 /// \param __a
   1746 ///    A 128-bit vector of [2 x double]. \n
   1747 ///    Bits [127:64] are written to bits [127:64] of the result.
   1748 /// \param __dp
   1749 ///    A pointer to a 64-bit memory location containing a double-precision
   1750 ///    floating-point value that is loaded. The loaded value is written to bits
   1751 ///    [63:0] of the result. The address of the memory location does not have to
   1752 ///    be aligned.
   1753 /// \returns A 128-bit vector of [2 x double] containing the moved values.
   1754 static __inline__ __m128d __DEFAULT_FN_ATTRS _mm_loadl_pd(__m128d __a,
   1755                                                           double const *__dp) {
   1756   struct __mm_loadl_pd_struct {
   1757     double __u;
   1758   } __attribute__((__packed__, __may_alias__));
   1759   double __u = ((const struct __mm_loadl_pd_struct *)__dp)->__u;
   1760   return __extension__(__m128d){__u, __a[1]};
   1761 }
   1762 
   1763 /// Constructs a 128-bit floating-point vector of [2 x double] with
   1764 ///    unspecified content. This could be used as an argument to another
   1765 ///    intrinsic function where the argument is required but the value is not
   1766 ///    actually used.
   1767 ///
   1768 /// \headerfile <x86intrin.h>
   1769 ///
   1770 /// This intrinsic has no corresponding instruction.
   1771 ///
   1772 /// \returns A 128-bit floating-point vector of [2 x double] with unspecified
   1773 ///    content.
   1774 static __inline__ __m128d __DEFAULT_FN_ATTRS _mm_undefined_pd(void) {
   1775   return (__m128d)__builtin_ia32_undef128();
   1776 }
   1777 
   1778 /// Constructs a 128-bit floating-point vector of [2 x double]. The lower
   1779 ///    64 bits of the vector are initialized with the specified double-precision
   1780 ///    floating-point value. The upper 64 bits are set to zero.
   1781 ///
   1782 /// \headerfile <x86intrin.h>
   1783 ///
   1784 /// This intrinsic corresponds to the <c> VMOVQ / MOVQ </c> instruction.
   1785 ///
   1786 /// \param __w
   1787 ///    A double-precision floating-point value used to initialize the lower 64
   1788 ///    bits of the result.
   1789 /// \returns An initialized 128-bit floating-point vector of [2 x double]. The
   1790 ///    lower 64 bits contain the value of the parameter. The upper 64 bits are
   1791 ///    set to zero.
   1792 static __inline__ __m128d __DEFAULT_FN_ATTRS_CONSTEXPR _mm_set_sd(double __w) {
   1793   return __extension__(__m128d){__w, 0.0};
   1794 }
   1795 
   1796 /// Constructs a 128-bit floating-point vector of [2 x double], with each
   1797 ///    of the two double-precision floating-point vector elements set to the
   1798 ///    specified double-precision floating-point value.
   1799 ///
   1800 /// \headerfile <x86intrin.h>
   1801 ///
   1802 /// This intrinsic corresponds to the <c> VMOVDDUP / MOVLHPS </c> instruction.
   1803 ///
   1804 /// \param __w
   1805 ///    A double-precision floating-point value used to initialize each vector
   1806 ///    element of the result.
   1807 /// \returns An initialized 128-bit floating-point vector of [2 x double].
   1808 static __inline__ __m128d __DEFAULT_FN_ATTRS_CONSTEXPR _mm_set1_pd(double __w) {
   1809   return __extension__(__m128d){__w, __w};
   1810 }
   1811 
   1812 /// Constructs a 128-bit floating-point vector of [2 x double], with each
   1813 ///    of the two double-precision floating-point vector elements set to the
   1814 ///    specified double-precision floating-point value.
   1815 ///
   1816 /// \headerfile <x86intrin.h>
   1817 ///
   1818 /// This intrinsic corresponds to the <c> VMOVDDUP / MOVLHPS </c> instruction.
   1819 ///
   1820 /// \param __w
   1821 ///    A double-precision floating-point value used to initialize each vector
   1822 ///    element of the result.
   1823 /// \returns An initialized 128-bit floating-point vector of [2 x double].
   1824 static __inline__ __m128d __DEFAULT_FN_ATTRS_CONSTEXPR _mm_set_pd1(double __w) {
   1825   return _mm_set1_pd(__w);
   1826 }
   1827 
   1828 /// Constructs a 128-bit floating-point vector of [2 x double]
   1829 ///    initialized with the specified double-precision floating-point values.
   1830 ///
   1831 /// \headerfile <x86intrin.h>
   1832 ///
   1833 /// This intrinsic corresponds to the <c> VUNPCKLPD / UNPCKLPD </c> instruction.
   1834 ///
   1835 /// \param __w
   1836 ///    A double-precision floating-point value used to initialize the upper 64
   1837 ///    bits of the result.
   1838 /// \param __x
   1839 ///    A double-precision floating-point value used to initialize the lower 64
   1840 ///    bits of the result.
   1841 /// \returns An initialized 128-bit floating-point vector of [2 x double].
   1842 static __inline__ __m128d __DEFAULT_FN_ATTRS_CONSTEXPR _mm_set_pd(double __w,
   1843                                                                   double __x) {
   1844   return __extension__(__m128d){__x, __w};
   1845 }
   1846 
   1847 /// Constructs a 128-bit floating-point vector of [2 x double],
   1848 ///    initialized in reverse order with the specified double-precision
   1849 ///    floating-point values.
   1850 ///
   1851 /// \headerfile <x86intrin.h>
   1852 ///
   1853 /// This intrinsic corresponds to the <c> VUNPCKLPD / UNPCKLPD </c> instruction.
   1854 ///
   1855 /// \param __w
   1856 ///    A double-precision floating-point value used to initialize the lower 64
   1857 ///    bits of the result.
   1858 /// \param __x
   1859 ///    A double-precision floating-point value used to initialize the upper 64
   1860 ///    bits of the result.
   1861 /// \returns An initialized 128-bit floating-point vector of [2 x double].
   1862 static __inline__ __m128d __DEFAULT_FN_ATTRS_CONSTEXPR _mm_setr_pd(double __w,
   1863                                                                    double __x) {
   1864   return __extension__(__m128d){__w, __x};
   1865 }
   1866 
   1867 /// Constructs a 128-bit floating-point vector of [2 x double]
   1868 ///    initialized to zero.
   1869 ///
   1870 /// \headerfile <x86intrin.h>
   1871 ///
   1872 /// This intrinsic corresponds to the <c> VXORPS / XORPS </c> instruction.
   1873 ///
   1874 /// \returns An initialized 128-bit floating-point vector of [2 x double] with
   1875 ///    all elements set to zero.
   1876 static __inline__ __m128d __DEFAULT_FN_ATTRS_CONSTEXPR _mm_setzero_pd(void) {
   1877   return __extension__(__m128d){0.0, 0.0};
   1878 }
   1879 
   1880 /// Constructs a 128-bit floating-point vector of [2 x double]. The lower
   1881 ///    64 bits are set to the lower 64 bits of the second parameter. The upper
   1882 ///    64 bits are set to the upper 64 bits of the first parameter.
   1883 ///
   1884 /// \headerfile <x86intrin.h>
   1885 ///
   1886 /// This intrinsic corresponds to the <c> VBLENDPD / BLENDPD </c> instruction.
   1887 ///
   1888 /// \param __a
   1889 ///    A 128-bit vector of [2 x double]. The upper 64 bits are written to the
   1890 ///    upper 64 bits of the result.
   1891 /// \param __b
   1892 ///    A 128-bit vector of [2 x double]. The lower 64 bits are written to the
   1893 ///    lower 64 bits of the result.
   1894 /// \returns A 128-bit vector of [2 x double] containing the moved values.
   1895 static __inline__ __m128d __DEFAULT_FN_ATTRS_CONSTEXPR
   1896 _mm_move_sd(__m128d __a, __m128d __b) {
   1897   __a[0] = __b[0];
   1898   return __a;
   1899 }
   1900 
   1901 /// Stores the lower 64 bits of a 128-bit vector of [2 x double] to a
   1902 ///    memory location.
   1903 ///
   1904 /// \headerfile <x86intrin.h>
   1905 ///
   1906 /// This intrinsic corresponds to the <c> VMOVSD / MOVSD </c> instruction.
   1907 ///
   1908 /// \param __dp
   1909 ///    A pointer to a 64-bit memory location.
   1910 /// \param __a
   1911 ///    A 128-bit vector of [2 x double] containing the value to be stored.
   1912 static __inline__ void __DEFAULT_FN_ATTRS _mm_store_sd(double *__dp,
   1913                                                        __m128d __a) {
   1914   struct __mm_store_sd_struct {
   1915     double __u;
   1916   } __attribute__((__packed__, __may_alias__));
   1917   ((struct __mm_store_sd_struct *)__dp)->__u = __a[0];
   1918 }
   1919 
   1920 /// Moves packed double-precision values from a 128-bit vector of
   1921 ///    [2 x double] to a memory location.
   1922 ///
   1923 /// \headerfile <x86intrin.h>
   1924 ///
   1925 /// This intrinsic corresponds to the <c>VMOVAPD / MOVAPS</c> instruction.
   1926 ///
   1927 /// \param __dp
   1928 ///    A pointer to an aligned memory location that can store two
   1929 ///    double-precision values.
   1930 /// \param __a
   1931 ///    A packed 128-bit vector of [2 x double] containing the values to be
   1932 ///    moved.
   1933 static __inline__ void __DEFAULT_FN_ATTRS _mm_store_pd(double *__dp,
   1934                                                        __m128d __a) {
   1935   *(__m128d *)__dp = __a;
   1936 }
   1937 
   1938 /// Moves the lower 64 bits of a 128-bit vector of [2 x double] twice to
   1939 ///    the upper and lower 64 bits of a memory location.
   1940 ///
   1941 /// \headerfile <x86intrin.h>
   1942 ///
   1943 /// This intrinsic corresponds to the
   1944 ///   <c> VMOVDDUP + VMOVAPD / MOVLHPS + MOVAPS </c> instruction.
   1945 ///
   1946 /// \param __dp
   1947 ///    A pointer to a memory location that can store two double-precision
   1948 ///    values.
   1949 /// \param __a
   1950 ///    A 128-bit vector of [2 x double] whose lower 64 bits are copied to each
   1951 ///    of the values in \a __dp.
   1952 static __inline__ void __DEFAULT_FN_ATTRS _mm_store1_pd(double *__dp,
   1953                                                         __m128d __a) {
   1954   __a = __builtin_shufflevector((__v2df)__a, (__v2df)__a, 0, 0);
   1955   _mm_store_pd(__dp, __a);
   1956 }
   1957 
   1958 /// Moves the lower 64 bits of a 128-bit vector of [2 x double] twice to
   1959 ///    the upper and lower 64 bits of a memory location.
   1960 ///
   1961 /// \headerfile <x86intrin.h>
   1962 ///
   1963 /// This intrinsic corresponds to the
   1964 ///   <c> VMOVDDUP + VMOVAPD / MOVLHPS + MOVAPS </c> instruction.
   1965 ///
   1966 /// \param __dp
   1967 ///    A pointer to a memory location that can store two double-precision
   1968 ///    values.
   1969 /// \param __a
   1970 ///    A 128-bit vector of [2 x double] whose lower 64 bits are copied to each
   1971 ///    of the values in \a __dp.
   1972 static __inline__ void __DEFAULT_FN_ATTRS _mm_store_pd1(double *__dp,
   1973                                                         __m128d __a) {
   1974   _mm_store1_pd(__dp, __a);
   1975 }
   1976 
   1977 /// Stores a 128-bit vector of [2 x double] into an unaligned memory
   1978 ///    location.
   1979 ///
   1980 /// \headerfile <x86intrin.h>
   1981 ///
   1982 /// This intrinsic corresponds to the <c> VMOVUPD / MOVUPD </c> instruction.
   1983 ///
   1984 /// \param __dp
   1985 ///    A pointer to a 128-bit memory location. The address of the memory
   1986 ///    location does not have to be aligned.
   1987 /// \param __a
   1988 ///    A 128-bit vector of [2 x double] containing the values to be stored.
   1989 static __inline__ void __DEFAULT_FN_ATTRS _mm_storeu_pd(double *__dp,
   1990                                                         __m128d __a) {
   1991   struct __storeu_pd {
   1992     __m128d_u __v;
   1993   } __attribute__((__packed__, __may_alias__));
   1994   ((struct __storeu_pd *)__dp)->__v = __a;
   1995 }
   1996 
   1997 /// Stores two double-precision values, in reverse order, from a 128-bit
   1998 ///    vector of [2 x double] to a 16-byte aligned memory location.
   1999 ///
   2000 /// \headerfile <x86intrin.h>
   2001 ///
   2002 /// This intrinsic corresponds to a shuffling instruction followed by a
   2003 /// <c> VMOVAPD / MOVAPD </c> instruction.
   2004 ///
   2005 /// \param __dp
   2006 ///    A pointer to a 16-byte aligned memory location that can store two
   2007 ///    double-precision values.
   2008 /// \param __a
   2009 ///    A 128-bit vector of [2 x double] containing the values to be reversed and
   2010 ///    stored.
   2011 static __inline__ void __DEFAULT_FN_ATTRS _mm_storer_pd(double *__dp,
   2012                                                         __m128d __a) {
   2013   __a = __builtin_shufflevector((__v2df)__a, (__v2df)__a, 1, 0);
   2014   *(__m128d *)__dp = __a;
   2015 }
   2016 
   2017 /// Stores the upper 64 bits of a 128-bit vector of [2 x double] to a
   2018 ///    memory location.
   2019 ///
   2020 /// \headerfile <x86intrin.h>
   2021 ///
   2022 /// This intrinsic corresponds to the <c> VMOVHPD / MOVHPD </c> instruction.
   2023 ///
   2024 /// \param __dp
   2025 ///    A pointer to a 64-bit memory location.
   2026 /// \param __a
   2027 ///    A 128-bit vector of [2 x double] containing the value to be stored.
   2028 static __inline__ void __DEFAULT_FN_ATTRS _mm_storeh_pd(double *__dp,
   2029                                                         __m128d __a) {
   2030   struct __mm_storeh_pd_struct {
   2031     double __u;
   2032   } __attribute__((__packed__, __may_alias__));
   2033   ((struct __mm_storeh_pd_struct *)__dp)->__u = __a[1];
   2034 }
   2035 
   2036 /// Stores the lower 64 bits of a 128-bit vector of [2 x double] to a
   2037 ///    memory location.
   2038 ///
   2039 /// \headerfile <x86intrin.h>
   2040 ///
   2041 /// This intrinsic corresponds to the <c> VMOVLPD / MOVLPD </c> instruction.
   2042 ///
   2043 /// \param __dp
   2044 ///    A pointer to a 64-bit memory location.
   2045 /// \param __a
   2046 ///    A 128-bit vector of [2 x double] containing the value to be stored.
   2047 static __inline__ void __DEFAULT_FN_ATTRS _mm_storel_pd(double *__dp,
   2048                                                         __m128d __a) {
   2049   struct __mm_storeh_pd_struct {
   2050     double __u;
   2051   } __attribute__((__packed__, __may_alias__));
   2052   ((struct __mm_storeh_pd_struct *)__dp)->__u = __a[0];
   2053 }
   2054 
   2055 /// Adds the corresponding elements of two 128-bit vectors of [16 x i8],
   2056 ///    saving the lower 8 bits of each sum in the corresponding element of a
   2057 ///    128-bit result vector of [16 x i8].
   2058 ///
   2059 ///    The integer elements of both parameters can be either signed or unsigned.
   2060 ///
   2061 /// \headerfile <x86intrin.h>
   2062 ///
   2063 /// This intrinsic corresponds to the <c> VPADDB / PADDB </c> instruction.
   2064 ///
   2065 /// \param __a
   2066 ///    A 128-bit vector of [16 x i8].
   2067 /// \param __b
   2068 ///    A 128-bit vector of [16 x i8].
   2069 /// \returns A 128-bit vector of [16 x i8] containing the sums of both
   2070 ///    parameters.
   2071 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_add_epi8(__m128i __a,
   2072                                                           __m128i __b) {
   2073   return (__m128i)((__v16qu)__a + (__v16qu)__b);
   2074 }
   2075 
   2076 /// Adds the corresponding elements of two 128-bit vectors of [8 x i16],
   2077 ///    saving the lower 16 bits of each sum in the corresponding element of a
   2078 ///    128-bit result vector of [8 x i16].
   2079 ///
   2080 ///    The integer elements of both parameters can be either signed or unsigned.
   2081 ///
   2082 /// \headerfile <x86intrin.h>
   2083 ///
   2084 /// This intrinsic corresponds to the <c> VPADDW / PADDW </c> instruction.
   2085 ///
   2086 /// \param __a
   2087 ///    A 128-bit vector of [8 x i16].
   2088 /// \param __b
   2089 ///    A 128-bit vector of [8 x i16].
   2090 /// \returns A 128-bit vector of [8 x i16] containing the sums of both
   2091 ///    parameters.
   2092 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_add_epi16(__m128i __a,
   2093                                                            __m128i __b) {
   2094   return (__m128i)((__v8hu)__a + (__v8hu)__b);
   2095 }
   2096 
   2097 /// Adds the corresponding elements of two 128-bit vectors of [4 x i32],
   2098 ///    saving the lower 32 bits of each sum in the corresponding element of a
   2099 ///    128-bit result vector of [4 x i32].
   2100 ///
   2101 ///    The integer elements of both parameters can be either signed or unsigned.
   2102 ///
   2103 /// \headerfile <x86intrin.h>
   2104 ///
   2105 /// This intrinsic corresponds to the <c> VPADDD / PADDD </c> instruction.
   2106 ///
   2107 /// \param __a
   2108 ///    A 128-bit vector of [4 x i32].
   2109 /// \param __b
   2110 ///    A 128-bit vector of [4 x i32].
   2111 /// \returns A 128-bit vector of [4 x i32] containing the sums of both
   2112 ///    parameters.
   2113 static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
   2114 _mm_add_epi32(__m128i __a, __m128i __b) {
   2115   return (__m128i)((__v4su)__a + (__v4su)__b);
   2116 }
   2117 
   2118 /// Adds two signed or unsigned 64-bit integer values, returning the
   2119 ///    lower 64 bits of the sum.
   2120 ///
   2121 /// \headerfile <x86intrin.h>
   2122 ///
   2123 /// This intrinsic corresponds to the <c> PADDQ </c> instruction.
   2124 ///
   2125 /// \param __a
   2126 ///    A 64-bit integer.
   2127 /// \param __b
   2128 ///    A 64-bit integer.
   2129 /// \returns A 64-bit integer containing the sum of both parameters.
   2130 static __inline__ __m64 __DEFAULT_FN_ATTRS _mm_add_si64(__m64 __a, __m64 __b) {
   2131   return (__m64)(((unsigned long long)__a) + ((unsigned long long)__b));
   2132 }
   2133 
   2134 /// Adds the corresponding elements of two 128-bit vectors of [2 x i64],
   2135 ///    saving the lower 64 bits of each sum in the corresponding element of a
   2136 ///    128-bit result vector of [2 x i64].
   2137 ///
   2138 ///    The integer elements of both parameters can be either signed or unsigned.
   2139 ///
   2140 /// \headerfile <x86intrin.h>
   2141 ///
   2142 /// This intrinsic corresponds to the <c> VPADDQ / PADDQ </c> instruction.
   2143 ///
   2144 /// \param __a
   2145 ///    A 128-bit vector of [2 x i64].
   2146 /// \param __b
   2147 ///    A 128-bit vector of [2 x i64].
   2148 /// \returns A 128-bit vector of [2 x i64] containing the sums of both
   2149 ///    parameters.
   2150 static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
   2151 _mm_add_epi64(__m128i __a, __m128i __b) {
   2152   return (__m128i)((__v2du)__a + (__v2du)__b);
   2153 }
   2154 
   2155 /// Adds, with saturation, the corresponding elements of two 128-bit
   2156 ///    signed [16 x i8] vectors, saving each sum in the corresponding element
   2157 ///    of a 128-bit result vector of [16 x i8].
   2158 ///
   2159 ///    Positive sums greater than 0x7F are saturated to 0x7F. Negative sums
   2160 ///    less than 0x80 are saturated to 0x80.
   2161 ///
   2162 /// \headerfile <x86intrin.h>
   2163 ///
   2164 /// This intrinsic corresponds to the <c> VPADDSB / PADDSB </c> instruction.
   2165 ///
   2166 /// \param __a
   2167 ///    A 128-bit signed [16 x i8] vector.
   2168 /// \param __b
   2169 ///    A 128-bit signed [16 x i8] vector.
   2170 /// \returns A 128-bit signed [16 x i8] vector containing the saturated sums of
   2171 ///    both parameters.
   2172 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_adds_epi8(__m128i __a,
   2173                                                            __m128i __b) {
   2174   return (__m128i)__builtin_elementwise_add_sat((__v16qs)__a, (__v16qs)__b);
   2175 }
   2176 
   2177 /// Adds, with saturation, the corresponding elements of two 128-bit
   2178 ///    signed [8 x i16] vectors, saving each sum in the corresponding element
   2179 ///    of a 128-bit result vector of [8 x i16].
   2180 ///
   2181 ///    Positive sums greater than 0x7FFF are saturated to 0x7FFF. Negative sums
   2182 ///    less than 0x8000 are saturated to 0x8000.
   2183 ///
   2184 /// \headerfile <x86intrin.h>
   2185 ///
   2186 /// This intrinsic corresponds to the <c> VPADDSW / PADDSW </c> instruction.
   2187 ///
   2188 /// \param __a
   2189 ///    A 128-bit signed [8 x i16] vector.
   2190 /// \param __b
   2191 ///    A 128-bit signed [8 x i16] vector.
   2192 /// \returns A 128-bit signed [8 x i16] vector containing the saturated sums of
   2193 ///    both parameters.
   2194 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_adds_epi16(__m128i __a,
   2195                                                             __m128i __b) {
   2196   return (__m128i)__builtin_elementwise_add_sat((__v8hi)__a, (__v8hi)__b);
   2197 }
   2198 
   2199 /// Adds, with saturation, the corresponding elements of two 128-bit
   2200 ///    unsigned [16 x i8] vectors, saving each sum in the corresponding element
   2201 ///    of a 128-bit result vector of [16 x i8].
   2202 ///
   2203 ///    Positive sums greater than 0xFF are saturated to 0xFF. Negative sums are
   2204 ///    saturated to 0x00.
   2205 ///
   2206 /// \headerfile <x86intrin.h>
   2207 ///
   2208 /// This intrinsic corresponds to the <c> VPADDUSB / PADDUSB </c> instruction.
   2209 ///
   2210 /// \param __a
   2211 ///    A 128-bit unsigned [16 x i8] vector.
   2212 /// \param __b
   2213 ///    A 128-bit unsigned [16 x i8] vector.
   2214 /// \returns A 128-bit unsigned [16 x i8] vector containing the saturated sums
   2215 ///    of both parameters.
   2216 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_adds_epu8(__m128i __a,
   2217                                                            __m128i __b) {
   2218   return (__m128i)__builtin_elementwise_add_sat((__v16qu)__a, (__v16qu)__b);
   2219 }
   2220 
   2221 /// Adds, with saturation, the corresponding elements of two 128-bit
   2222 ///    unsigned [8 x i16] vectors, saving each sum in the corresponding element
   2223 ///    of a 128-bit result vector of [8 x i16].
   2224 ///
   2225 ///    Positive sums greater than 0xFFFF are saturated to 0xFFFF. Negative sums
   2226 ///    are saturated to 0x0000.
   2227 ///
   2228 /// \headerfile <x86intrin.h>
   2229 ///
   2230 /// This intrinsic corresponds to the <c> VPADDUSB / PADDUSB </c> instruction.
   2231 ///
   2232 /// \param __a
   2233 ///    A 128-bit unsigned [8 x i16] vector.
   2234 /// \param __b
   2235 ///    A 128-bit unsigned [8 x i16] vector.
   2236 /// \returns A 128-bit unsigned [8 x i16] vector containing the saturated sums
   2237 ///    of both parameters.
   2238 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_adds_epu16(__m128i __a,
   2239                                                             __m128i __b) {
   2240   return (__m128i)__builtin_elementwise_add_sat((__v8hu)__a, (__v8hu)__b);
   2241 }
   2242 
   2243 /// Computes the rounded averages of corresponding elements of two
   2244 ///    128-bit unsigned [16 x i8] vectors, saving each result in the
   2245 ///    corresponding element of a 128-bit result vector of [16 x i8].
   2246 ///
   2247 /// \headerfile <x86intrin.h>
   2248 ///
   2249 /// This intrinsic corresponds to the <c> VPAVGB / PAVGB </c> instruction.
   2250 ///
   2251 /// \param __a
   2252 ///    A 128-bit unsigned [16 x i8] vector.
   2253 /// \param __b
   2254 ///    A 128-bit unsigned [16 x i8] vector.
   2255 /// \returns A 128-bit unsigned [16 x i8] vector containing the rounded
   2256 ///    averages of both parameters.
   2257 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_avg_epu8(__m128i __a,
   2258                                                           __m128i __b) {
   2259   return (__m128i)__builtin_ia32_pavgb128((__v16qi)__a, (__v16qi)__b);
   2260 }
   2261 
   2262 /// Computes the rounded averages of corresponding elements of two
   2263 ///    128-bit unsigned [8 x i16] vectors, saving each result in the
   2264 ///    corresponding element of a 128-bit result vector of [8 x i16].
   2265 ///
   2266 /// \headerfile <x86intrin.h>
   2267 ///
   2268 /// This intrinsic corresponds to the <c> VPAVGW / PAVGW </c> instruction.
   2269 ///
   2270 /// \param __a
   2271 ///    A 128-bit unsigned [8 x i16] vector.
   2272 /// \param __b
   2273 ///    A 128-bit unsigned [8 x i16] vector.
   2274 /// \returns A 128-bit unsigned [8 x i16] vector containing the rounded
   2275 ///    averages of both parameters.
   2276 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_avg_epu16(__m128i __a,
   2277                                                            __m128i __b) {
   2278   return (__m128i)__builtin_ia32_pavgw128((__v8hi)__a, (__v8hi)__b);
   2279 }
   2280 
   2281 /// Multiplies the corresponding elements of two 128-bit signed [8 x i16]
   2282 ///    vectors, producing eight intermediate 32-bit signed integer products, and
   2283 ///    adds the consecutive pairs of 32-bit products to form a 128-bit signed
   2284 ///    [4 x i32] vector.
   2285 ///
   2286 ///    For example, bits [15:0] of both parameters are multiplied producing a
   2287 ///    32-bit product, bits [31:16] of both parameters are multiplied producing
   2288 ///    a 32-bit product, and the sum of those two products becomes bits [31:0]
   2289 ///    of the result.
   2290 ///
   2291 /// \headerfile <x86intrin.h>
   2292 ///
   2293 /// This intrinsic corresponds to the <c> VPMADDWD / PMADDWD </c> instruction.
   2294 ///
   2295 /// \param __a
   2296 ///    A 128-bit signed [8 x i16] vector.
   2297 /// \param __b
   2298 ///    A 128-bit signed [8 x i16] vector.
   2299 /// \returns A 128-bit signed [4 x i32] vector containing the sums of products
   2300 ///    of both parameters.
   2301 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_madd_epi16(__m128i __a,
   2302                                                             __m128i __b) {
   2303   return (__m128i)__builtin_ia32_pmaddwd128((__v8hi)__a, (__v8hi)__b);
   2304 }
   2305 
   2306 /// Compares corresponding elements of two 128-bit signed [8 x i16]
   2307 ///    vectors, saving the greater value from each comparison in the
   2308 ///    corresponding element of a 128-bit result vector of [8 x i16].
   2309 ///
   2310 /// \headerfile <x86intrin.h>
   2311 ///
   2312 /// This intrinsic corresponds to the <c> VPMAXSW / PMAXSW </c> instruction.
   2313 ///
   2314 /// \param __a
   2315 ///    A 128-bit signed [8 x i16] vector.
   2316 /// \param __b
   2317 ///    A 128-bit signed [8 x i16] vector.
   2318 /// \returns A 128-bit signed [8 x i16] vector containing the greater value of
   2319 ///    each comparison.
   2320 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_max_epi16(__m128i __a,
   2321                                                            __m128i __b) {
   2322   return (__m128i)__builtin_elementwise_max((__v8hi)__a, (__v8hi)__b);
   2323 }
   2324 
   2325 /// Compares corresponding elements of two 128-bit unsigned [16 x i8]
   2326 ///    vectors, saving the greater value from each comparison in the
   2327 ///    corresponding element of a 128-bit result vector of [16 x i8].
   2328 ///
   2329 /// \headerfile <x86intrin.h>
   2330 ///
   2331 /// This intrinsic corresponds to the <c> VPMAXUB / PMAXUB </c> instruction.
   2332 ///
   2333 /// \param __a
   2334 ///    A 128-bit unsigned [16 x i8] vector.
   2335 /// \param __b
   2336 ///    A 128-bit unsigned [16 x i8] vector.
   2337 /// \returns A 128-bit unsigned [16 x i8] vector containing the greater value of
   2338 ///    each comparison.
   2339 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_max_epu8(__m128i __a,
   2340                                                           __m128i __b) {
   2341   return (__m128i)__builtin_elementwise_max((__v16qu)__a, (__v16qu)__b);
   2342 }
   2343 
   2344 /// Compares corresponding elements of two 128-bit signed [8 x i16]
   2345 ///    vectors, saving the smaller value from each comparison in the
   2346 ///    corresponding element of a 128-bit result vector of [8 x i16].
   2347 ///
   2348 /// \headerfile <x86intrin.h>
   2349 ///
   2350 /// This intrinsic corresponds to the <c> VPMINSW / PMINSW </c> instruction.
   2351 ///
   2352 /// \param __a
   2353 ///    A 128-bit signed [8 x i16] vector.
   2354 /// \param __b
   2355 ///    A 128-bit signed [8 x i16] vector.
   2356 /// \returns A 128-bit signed [8 x i16] vector containing the smaller value of
   2357 ///    each comparison.
   2358 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_min_epi16(__m128i __a,
   2359                                                            __m128i __b) {
   2360   return (__m128i)__builtin_elementwise_min((__v8hi)__a, (__v8hi)__b);
   2361 }
   2362 
   2363 /// Compares corresponding elements of two 128-bit unsigned [16 x i8]
   2364 ///    vectors, saving the smaller value from each comparison in the
   2365 ///    corresponding element of a 128-bit result vector of [16 x i8].
   2366 ///
   2367 /// \headerfile <x86intrin.h>
   2368 ///
   2369 /// This intrinsic corresponds to the <c> VPMINUB / PMINUB </c> instruction.
   2370 ///
   2371 /// \param __a
   2372 ///    A 128-bit unsigned [16 x i8] vector.
   2373 /// \param __b
   2374 ///    A 128-bit unsigned [16 x i8] vector.
   2375 /// \returns A 128-bit unsigned [16 x i8] vector containing the smaller value of
   2376 ///    each comparison.
   2377 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_min_epu8(__m128i __a,
   2378                                                           __m128i __b) {
   2379   return (__m128i)__builtin_elementwise_min((__v16qu)__a, (__v16qu)__b);
   2380 }
   2381 
   2382 /// Multiplies the corresponding elements of two signed [8 x i16]
   2383 ///    vectors, saving the upper 16 bits of each 32-bit product in the
   2384 ///    corresponding element of a 128-bit signed [8 x i16] result vector.
   2385 ///
   2386 /// \headerfile <x86intrin.h>
   2387 ///
   2388 /// This intrinsic corresponds to the <c> VPMULHW / PMULHW </c> instruction.
   2389 ///
   2390 /// \param __a
   2391 ///    A 128-bit signed [8 x i16] vector.
   2392 /// \param __b
   2393 ///    A 128-bit signed [8 x i16] vector.
   2394 /// \returns A 128-bit signed [8 x i16] vector containing the upper 16 bits of
   2395 ///    each of the eight 32-bit products.
   2396 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_mulhi_epi16(__m128i __a,
   2397                                                              __m128i __b) {
   2398   return (__m128i)__builtin_ia32_pmulhw128((__v8hi)__a, (__v8hi)__b);
   2399 }
   2400 
   2401 /// Multiplies the corresponding elements of two unsigned [8 x i16]
   2402 ///    vectors, saving the upper 16 bits of each 32-bit product in the
   2403 ///    corresponding element of a 128-bit unsigned [8 x i16] result vector.
   2404 ///
   2405 /// \headerfile <x86intrin.h>
   2406 ///
   2407 /// This intrinsic corresponds to the <c> VPMULHUW / PMULHUW </c> instruction.
   2408 ///
   2409 /// \param __a
   2410 ///    A 128-bit unsigned [8 x i16] vector.
   2411 /// \param __b
   2412 ///    A 128-bit unsigned [8 x i16] vector.
   2413 /// \returns A 128-bit unsigned [8 x i16] vector containing the upper 16 bits
   2414 ///    of each of the eight 32-bit products.
   2415 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_mulhi_epu16(__m128i __a,
   2416                                                              __m128i __b) {
   2417   return (__m128i)__builtin_ia32_pmulhuw128((__v8hi)__a, (__v8hi)__b);
   2418 }
   2419 
   2420 /// Multiplies the corresponding elements of two signed [8 x i16]
   2421 ///    vectors, saving the lower 16 bits of each 32-bit product in the
   2422 ///    corresponding element of a 128-bit signed [8 x i16] result vector.
   2423 ///
   2424 /// \headerfile <x86intrin.h>
   2425 ///
   2426 /// This intrinsic corresponds to the <c> VPMULLW / PMULLW </c> instruction.
   2427 ///
   2428 /// \param __a
   2429 ///    A 128-bit signed [8 x i16] vector.
   2430 /// \param __b
   2431 ///    A 128-bit signed [8 x i16] vector.
   2432 /// \returns A 128-bit signed [8 x i16] vector containing the lower 16 bits of
   2433 ///    each of the eight 32-bit products.
   2434 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_mullo_epi16(__m128i __a,
   2435                                                              __m128i __b) {
   2436   return (__m128i)((__v8hu)__a * (__v8hu)__b);
   2437 }
   2438 
   2439 /// Multiplies 32-bit unsigned integer values contained in the lower bits
   2440 ///    of the two 64-bit integer vectors and returns the 64-bit unsigned
   2441 ///    product.
   2442 ///
   2443 /// \headerfile <x86intrin.h>
   2444 ///
   2445 /// This intrinsic corresponds to the <c> PMULUDQ </c> instruction.
   2446 ///
   2447 /// \param __a
   2448 ///    A 64-bit integer containing one of the source operands.
   2449 /// \param __b
   2450 ///    A 64-bit integer containing one of the source operands.
   2451 /// \returns A 64-bit integer vector containing the product of both operands.
   2452 static __inline__ __m64 __DEFAULT_FN_ATTRS _mm_mul_su32(__m64 __a, __m64 __b) {
   2453   return __trunc64(__builtin_ia32_pmuludq128((__v4si)__anyext128(__a),
   2454                                              (__v4si)__anyext128(__b)));
   2455 }
   2456 
   2457 /// Multiplies 32-bit unsigned integer values contained in the lower
   2458 ///    bits of the corresponding elements of two [2 x i64] vectors, and returns
   2459 ///    the 64-bit products in the corresponding elements of a [2 x i64] vector.
   2460 ///
   2461 /// \headerfile <x86intrin.h>
   2462 ///
   2463 /// This intrinsic corresponds to the <c> VPMULUDQ / PMULUDQ </c> instruction.
   2464 ///
   2465 /// \param __a
   2466 ///    A [2 x i64] vector containing one of the source operands.
   2467 /// \param __b
   2468 ///    A [2 x i64] vector containing one of the source operands.
   2469 /// \returns A [2 x i64] vector containing the product of both operands.
   2470 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_mul_epu32(__m128i __a,
   2471                                                            __m128i __b) {
   2472   return __builtin_ia32_pmuludq128((__v4si)__a, (__v4si)__b);
   2473 }
   2474 
   2475 /// Computes the absolute differences of corresponding 8-bit integer
   2476 ///    values in two 128-bit vectors. Sums the first 8 absolute differences, and
   2477 ///    separately sums the second 8 absolute differences. Packs these two
   2478 ///    unsigned 16-bit integer sums into the upper and lower elements of a
   2479 ///    [2 x i64] vector.
   2480 ///
   2481 /// \headerfile <x86intrin.h>
   2482 ///
   2483 /// This intrinsic corresponds to the <c> VPSADBW / PSADBW </c> instruction.
   2484 ///
   2485 /// \param __a
   2486 ///    A 128-bit integer vector containing one of the source operands.
   2487 /// \param __b
   2488 ///    A 128-bit integer vector containing one of the source operands.
   2489 /// \returns A [2 x i64] vector containing the sums of the sets of absolute
   2490 ///    differences between both operands.
   2491 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_sad_epu8(__m128i __a,
   2492                                                           __m128i __b) {
   2493   return __builtin_ia32_psadbw128((__v16qi)__a, (__v16qi)__b);
   2494 }
   2495 
   2496 /// Subtracts the corresponding 8-bit integer values in the operands.
   2497 ///
   2498 /// \headerfile <x86intrin.h>
   2499 ///
   2500 /// This intrinsic corresponds to the <c> VPSUBB / PSUBB </c> instruction.
   2501 ///
   2502 /// \param __a
   2503 ///    A 128-bit integer vector containing the minuends.
   2504 /// \param __b
   2505 ///    A 128-bit integer vector containing the subtrahends.
   2506 /// \returns A 128-bit integer vector containing the differences of the values
   2507 ///    in the operands.
   2508 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_sub_epi8(__m128i __a,
   2509                                                           __m128i __b) {
   2510   return (__m128i)((__v16qu)__a - (__v16qu)__b);
   2511 }
   2512 
   2513 /// Subtracts the corresponding 16-bit integer values in the operands.
   2514 ///
   2515 /// \headerfile <x86intrin.h>
   2516 ///
   2517 /// This intrinsic corresponds to the <c> VPSUBW / PSUBW </c> instruction.
   2518 ///
   2519 /// \param __a
   2520 ///    A 128-bit integer vector containing the minuends.
   2521 /// \param __b
   2522 ///    A 128-bit integer vector containing the subtrahends.
   2523 /// \returns A 128-bit integer vector containing the differences of the values
   2524 ///    in the operands.
   2525 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_sub_epi16(__m128i __a,
   2526                                                            __m128i __b) {
   2527   return (__m128i)((__v8hu)__a - (__v8hu)__b);
   2528 }
   2529 
   2530 /// Subtracts the corresponding 32-bit integer values in the operands.
   2531 ///
   2532 /// \headerfile <x86intrin.h>
   2533 ///
   2534 /// This intrinsic corresponds to the <c> VPSUBD / PSUBD </c> instruction.
   2535 ///
   2536 /// \param __a
   2537 ///    A 128-bit integer vector containing the minuends.
   2538 /// \param __b
   2539 ///    A 128-bit integer vector containing the subtrahends.
   2540 /// \returns A 128-bit integer vector containing the differences of the values
   2541 ///    in the operands.
   2542 static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
   2543 _mm_sub_epi32(__m128i __a, __m128i __b) {
   2544   return (__m128i)((__v4su)__a - (__v4su)__b);
   2545 }
   2546 
   2547 /// Subtracts signed or unsigned 64-bit integer values and writes the
   2548 ///    difference to the corresponding bits in the destination.
   2549 ///
   2550 /// \headerfile <x86intrin.h>
   2551 ///
   2552 /// This intrinsic corresponds to the <c> PSUBQ </c> instruction.
   2553 ///
   2554 /// \param __a
   2555 ///    A 64-bit integer vector containing the minuend.
   2556 /// \param __b
   2557 ///    A 64-bit integer vector containing the subtrahend.
   2558 /// \returns A 64-bit integer vector containing the difference of the values in
   2559 ///    the operands.
   2560 static __inline__ __m64 __DEFAULT_FN_ATTRS _mm_sub_si64(__m64 __a, __m64 __b) {
   2561   return (__m64)((unsigned long long)__a - (unsigned long long)__b);
   2562 }
   2563 
   2564 /// Subtracts the corresponding elements of two [2 x i64] vectors.
   2565 ///
   2566 /// \headerfile <x86intrin.h>
   2567 ///
   2568 /// This intrinsic corresponds to the <c> VPSUBQ / PSUBQ </c> instruction.
   2569 ///
   2570 /// \param __a
   2571 ///    A 128-bit integer vector containing the minuends.
   2572 /// \param __b
   2573 ///    A 128-bit integer vector containing the subtrahends.
   2574 /// \returns A 128-bit integer vector containing the differences of the values
   2575 ///    in the operands.
   2576 static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
   2577 _mm_sub_epi64(__m128i __a, __m128i __b) {
   2578   return (__m128i)((__v2du)__a - (__v2du)__b);
   2579 }
   2580 
   2581 /// Subtracts, with saturation, corresponding 8-bit signed integer values in
   2582 ///    the input and returns the differences in the corresponding bytes in the
   2583 ///    destination.
   2584 ///
   2585 ///    Differences greater than 0x7F are saturated to 0x7F, and differences
   2586 ///    less than 0x80 are saturated to 0x80.
   2587 ///
   2588 /// \headerfile <x86intrin.h>
   2589 ///
   2590 /// This intrinsic corresponds to the <c> VPSUBSB / PSUBSB </c> instruction.
   2591 ///
   2592 /// \param __a
   2593 ///    A 128-bit integer vector containing the minuends.
   2594 /// \param __b
   2595 ///    A 128-bit integer vector containing the subtrahends.
   2596 /// \returns A 128-bit integer vector containing the differences of the values
   2597 ///    in the operands.
   2598 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_subs_epi8(__m128i __a,
   2599                                                            __m128i __b) {
   2600   return (__m128i)__builtin_elementwise_sub_sat((__v16qs)__a, (__v16qs)__b);
   2601 }
   2602 
   2603 /// Subtracts, with saturation, corresponding 16-bit signed integer values in
   2604 ///    the input and returns the differences in the corresponding bytes in the
   2605 ///    destination.
   2606 ///
   2607 ///    Differences greater than 0x7FFF are saturated to 0x7FFF, and values less
   2608 ///    than 0x8000 are saturated to 0x8000.
   2609 ///
   2610 /// \headerfile <x86intrin.h>
   2611 ///
   2612 /// This intrinsic corresponds to the <c> VPSUBSW / PSUBSW </c> instruction.
   2613 ///
   2614 /// \param __a
   2615 ///    A 128-bit integer vector containing the minuends.
   2616 /// \param __b
   2617 ///    A 128-bit integer vector containing the subtrahends.
   2618 /// \returns A 128-bit integer vector containing the differences of the values
   2619 ///    in the operands.
   2620 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_subs_epi16(__m128i __a,
   2621                                                             __m128i __b) {
   2622   return (__m128i)__builtin_elementwise_sub_sat((__v8hi)__a, (__v8hi)__b);
   2623 }
   2624 
   2625 /// Subtracts, with saturation, corresponding 8-bit unsigned integer values in
   2626 ///    the input and returns the differences in the corresponding bytes in the
   2627 ///    destination.
   2628 ///
   2629 ///    Differences less than 0x00 are saturated to 0x00.
   2630 ///
   2631 /// \headerfile <x86intrin.h>
   2632 ///
   2633 /// This intrinsic corresponds to the <c> VPSUBUSB / PSUBUSB </c> instruction.
   2634 ///
   2635 /// \param __a
   2636 ///    A 128-bit integer vector containing the minuends.
   2637 /// \param __b
   2638 ///    A 128-bit integer vector containing the subtrahends.
   2639 /// \returns A 128-bit integer vector containing the unsigned integer
   2640 ///    differences of the values in the operands.
   2641 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_subs_epu8(__m128i __a,
   2642                                                            __m128i __b) {
   2643   return (__m128i)__builtin_elementwise_sub_sat((__v16qu)__a, (__v16qu)__b);
   2644 }
   2645 
   2646 /// Subtracts, with saturation, corresponding 16-bit unsigned integer values in
   2647 ///    the input and returns the differences in the corresponding bytes in the
   2648 ///    destination.
   2649 ///
   2650 ///    Differences less than 0x0000 are saturated to 0x0000.
   2651 ///
   2652 /// \headerfile <x86intrin.h>
   2653 ///
   2654 /// This intrinsic corresponds to the <c> VPSUBUSW / PSUBUSW </c> instruction.
   2655 ///
   2656 /// \param __a
   2657 ///    A 128-bit integer vector containing the minuends.
   2658 /// \param __b
   2659 ///    A 128-bit integer vector containing the subtrahends.
   2660 /// \returns A 128-bit integer vector containing the unsigned integer
   2661 ///    differences of the values in the operands.
   2662 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_subs_epu16(__m128i __a,
   2663                                                             __m128i __b) {
   2664   return (__m128i)__builtin_elementwise_sub_sat((__v8hu)__a, (__v8hu)__b);
   2665 }
   2666 
   2667 /// Performs a bitwise AND of two 128-bit integer vectors.
   2668 ///
   2669 /// \headerfile <x86intrin.h>
   2670 ///
   2671 /// This intrinsic corresponds to the <c> VPAND / PAND </c> instruction.
   2672 ///
   2673 /// \param __a
   2674 ///    A 128-bit integer vector containing one of the source operands.
   2675 /// \param __b
   2676 ///    A 128-bit integer vector containing one of the source operands.
   2677 /// \returns A 128-bit integer vector containing the bitwise AND of the values
   2678 ///    in both operands.
   2679 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_and_si128(__m128i __a,
   2680                                                            __m128i __b) {
   2681   return (__m128i)((__v2du)__a & (__v2du)__b);
   2682 }
   2683 
   2684 /// Performs a bitwise AND of two 128-bit integer vectors, using the
   2685 ///    one's complement of the values contained in the first source operand.
   2686 ///
   2687 /// \headerfile <x86intrin.h>
   2688 ///
   2689 /// This intrinsic corresponds to the <c> VPANDN / PANDN </c> instruction.
   2690 ///
   2691 /// \param __a
   2692 ///    A 128-bit vector containing the left source operand. The one's complement
   2693 ///    of this value is used in the bitwise AND.
   2694 /// \param __b
   2695 ///    A 128-bit vector containing the right source operand.
   2696 /// \returns A 128-bit integer vector containing the bitwise AND of the one's
   2697 ///    complement of the first operand and the values in the second operand.
   2698 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_andnot_si128(__m128i __a,
   2699                                                               __m128i __b) {
   2700   return (__m128i)(~(__v2du)__a & (__v2du)__b);
   2701 }
   2702 /// Performs a bitwise OR of two 128-bit integer vectors.
   2703 ///
   2704 /// \headerfile <x86intrin.h>
   2705 ///
   2706 /// This intrinsic corresponds to the <c> VPOR / POR </c> instruction.
   2707 ///
   2708 /// \param __a
   2709 ///    A 128-bit integer vector containing one of the source operands.
   2710 /// \param __b
   2711 ///    A 128-bit integer vector containing one of the source operands.
   2712 /// \returns A 128-bit integer vector containing the bitwise OR of the values
   2713 ///    in both operands.
   2714 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_or_si128(__m128i __a,
   2715                                                           __m128i __b) {
   2716   return (__m128i)((__v2du)__a | (__v2du)__b);
   2717 }
   2718 
   2719 /// Performs a bitwise exclusive OR of two 128-bit integer vectors.
   2720 ///
   2721 /// \headerfile <x86intrin.h>
   2722 ///
   2723 /// This intrinsic corresponds to the <c> VPXOR / PXOR </c> instruction.
   2724 ///
   2725 /// \param __a
   2726 ///    A 128-bit integer vector containing one of the source operands.
   2727 /// \param __b
   2728 ///    A 128-bit integer vector containing one of the source operands.
   2729 /// \returns A 128-bit integer vector containing the bitwise exclusive OR of the
   2730 ///    values in both operands.
   2731 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_xor_si128(__m128i __a,
   2732                                                            __m128i __b) {
   2733   return (__m128i)((__v2du)__a ^ (__v2du)__b);
   2734 }
   2735 
   2736 /// Left-shifts the 128-bit integer vector operand by the specified
   2737 ///    number of bytes. Low-order bits are cleared.
   2738 ///
   2739 /// \headerfile <x86intrin.h>
   2740 ///
   2741 /// \code
   2742 /// __m128i _mm_slli_si128(__m128i a, const int imm);
   2743 /// \endcode
   2744 ///
   2745 /// This intrinsic corresponds to the <c> VPSLLDQ / PSLLDQ </c> instruction.
   2746 ///
   2747 /// \param a
   2748 ///    A 128-bit integer vector containing the source operand.
   2749 /// \param imm
   2750 ///    An immediate value specifying the number of bytes to left-shift operand
   2751 ///    \a a.
   2752 /// \returns A 128-bit integer vector containing the left-shifted value.
   2753 #define _mm_slli_si128(a, imm)                                                 \
   2754   ((__m128i)__builtin_ia32_pslldqi128_byteshift((__v2di)(__m128i)(a),          \
   2755                                                 (int)(imm)))
   2756 
   2757 #define _mm_bslli_si128(a, imm)                                                \
   2758   ((__m128i)__builtin_ia32_pslldqi128_byteshift((__v2di)(__m128i)(a),          \
   2759                                                 (int)(imm)))
   2760 
   2761 /// Left-shifts each 16-bit value in the 128-bit integer vector operand
   2762 ///    by the specified number of bits. Low-order bits are cleared.
   2763 ///
   2764 /// \headerfile <x86intrin.h>
   2765 ///
   2766 /// This intrinsic corresponds to the <c> VPSLLW / PSLLW </c> instruction.
   2767 ///
   2768 /// \param __a
   2769 ///    A 128-bit integer vector containing the source operand.
   2770 /// \param __count
   2771 ///    An integer value specifying the number of bits to left-shift each value
   2772 ///    in operand \a __a.
   2773 /// \returns A 128-bit integer vector containing the left-shifted values.
   2774 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_slli_epi16(__m128i __a,
   2775                                                             int __count) {
   2776   return (__m128i)__builtin_ia32_psllwi128((__v8hi)__a, __count);
   2777 }
   2778 
   2779 /// Left-shifts each 16-bit value in the 128-bit integer vector operand
   2780 ///    by the specified number of bits. Low-order bits are cleared.
   2781 ///
   2782 /// \headerfile <x86intrin.h>
   2783 ///
   2784 /// This intrinsic corresponds to the <c> VPSLLW / PSLLW </c> instruction.
   2785 ///
   2786 /// \param __a
   2787 ///    A 128-bit integer vector containing the source operand.
   2788 /// \param __count
   2789 ///    A 128-bit integer vector in which bits [63:0] specify the number of bits
   2790 ///    to left-shift each value in operand \a __a.
   2791 /// \returns A 128-bit integer vector containing the left-shifted values.
   2792 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_sll_epi16(__m128i __a,
   2793                                                            __m128i __count) {
   2794   return (__m128i)__builtin_ia32_psllw128((__v8hi)__a, (__v8hi)__count);
   2795 }
   2796 
   2797 /// Left-shifts each 32-bit value in the 128-bit integer vector operand
   2798 ///    by the specified number of bits. Low-order bits are cleared.
   2799 ///
   2800 /// \headerfile <x86intrin.h>
   2801 ///
   2802 /// This intrinsic corresponds to the <c> VPSLLD / PSLLD </c> instruction.
   2803 ///
   2804 /// \param __a
   2805 ///    A 128-bit integer vector containing the source operand.
   2806 /// \param __count
   2807 ///    An integer value specifying the number of bits to left-shift each value
   2808 ///    in operand \a __a.
   2809 /// \returns A 128-bit integer vector containing the left-shifted values.
   2810 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_slli_epi32(__m128i __a,
   2811                                                             int __count) {
   2812   return (__m128i)__builtin_ia32_pslldi128((__v4si)__a, __count);
   2813 }
   2814 
   2815 /// Left-shifts each 32-bit value in the 128-bit integer vector operand
   2816 ///    by the specified number of bits. Low-order bits are cleared.
   2817 ///
   2818 /// \headerfile <x86intrin.h>
   2819 ///
   2820 /// This intrinsic corresponds to the <c> VPSLLD / PSLLD </c> instruction.
   2821 ///
   2822 /// \param __a
   2823 ///    A 128-bit integer vector containing the source operand.
   2824 /// \param __count
   2825 ///    A 128-bit integer vector in which bits [63:0] specify the number of bits
   2826 ///    to left-shift each value in operand \a __a.
   2827 /// \returns A 128-bit integer vector containing the left-shifted values.
   2828 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_sll_epi32(__m128i __a,
   2829                                                            __m128i __count) {
   2830   return (__m128i)__builtin_ia32_pslld128((__v4si)__a, (__v4si)__count);
   2831 }
   2832 
   2833 /// Left-shifts each 64-bit value in the 128-bit integer vector operand
   2834 ///    by the specified number of bits. Low-order bits are cleared.
   2835 ///
   2836 /// \headerfile <x86intrin.h>
   2837 ///
   2838 /// This intrinsic corresponds to the <c> VPSLLQ / PSLLQ </c> instruction.
   2839 ///
   2840 /// \param __a
   2841 ///    A 128-bit integer vector containing the source operand.
   2842 /// \param __count
   2843 ///    An integer value specifying the number of bits to left-shift each value
   2844 ///    in operand \a __a.
   2845 /// \returns A 128-bit integer vector containing the left-shifted values.
   2846 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_slli_epi64(__m128i __a,
   2847                                                             int __count) {
   2848   return __builtin_ia32_psllqi128((__v2di)__a, __count);
   2849 }
   2850 
   2851 /// Left-shifts each 64-bit value in the 128-bit integer vector operand
   2852 ///    by the specified number of bits. Low-order bits are cleared.
   2853 ///
   2854 /// \headerfile <x86intrin.h>
   2855 ///
   2856 /// This intrinsic corresponds to the <c> VPSLLQ / PSLLQ </c> instruction.
   2857 ///
   2858 /// \param __a
   2859 ///    A 128-bit integer vector containing the source operand.
   2860 /// \param __count
   2861 ///    A 128-bit integer vector in which bits [63:0] specify the number of bits
   2862 ///    to left-shift each value in operand \a __a.
   2863 /// \returns A 128-bit integer vector containing the left-shifted values.
   2864 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_sll_epi64(__m128i __a,
   2865                                                            __m128i __count) {
   2866   return __builtin_ia32_psllq128((__v2di)__a, (__v2di)__count);
   2867 }
   2868 
   2869 /// Right-shifts each 16-bit value in the 128-bit integer vector operand
   2870 ///    by the specified number of bits. High-order bits are filled with the sign
   2871 ///    bit of the initial value.
   2872 ///
   2873 /// \headerfile <x86intrin.h>
   2874 ///
   2875 /// This intrinsic corresponds to the <c> VPSRAW / PSRAW </c> instruction.
   2876 ///
   2877 /// \param __a
   2878 ///    A 128-bit integer vector containing the source operand.
   2879 /// \param __count
   2880 ///    An integer value specifying the number of bits to right-shift each value
   2881 ///    in operand \a __a.
   2882 /// \returns A 128-bit integer vector containing the right-shifted values.
   2883 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_srai_epi16(__m128i __a,
   2884                                                             int __count) {
   2885   return (__m128i)__builtin_ia32_psrawi128((__v8hi)__a, __count);
   2886 }
   2887 
   2888 /// Right-shifts each 16-bit value in the 128-bit integer vector operand
   2889 ///    by the specified number of bits. High-order bits are filled with the sign
   2890 ///    bit of the initial value.
   2891 ///
   2892 /// \headerfile <x86intrin.h>
   2893 ///
   2894 /// This intrinsic corresponds to the <c> VPSRAW / PSRAW </c> instruction.
   2895 ///
   2896 /// \param __a
   2897 ///    A 128-bit integer vector containing the source operand.
   2898 /// \param __count
   2899 ///    A 128-bit integer vector in which bits [63:0] specify the number of bits
   2900 ///    to right-shift each value in operand \a __a.
   2901 /// \returns A 128-bit integer vector containing the right-shifted values.
   2902 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_sra_epi16(__m128i __a,
   2903                                                            __m128i __count) {
   2904   return (__m128i)__builtin_ia32_psraw128((__v8hi)__a, (__v8hi)__count);
   2905 }
   2906 
   2907 /// Right-shifts each 32-bit value in the 128-bit integer vector operand
   2908 ///    by the specified number of bits. High-order bits are filled with the sign
   2909 ///    bit of the initial value.
   2910 ///
   2911 /// \headerfile <x86intrin.h>
   2912 ///
   2913 /// This intrinsic corresponds to the <c> VPSRAD / PSRAD </c> instruction.
   2914 ///
   2915 /// \param __a
   2916 ///    A 128-bit integer vector containing the source operand.
   2917 /// \param __count
   2918 ///    An integer value specifying the number of bits to right-shift each value
   2919 ///    in operand \a __a.
   2920 /// \returns A 128-bit integer vector containing the right-shifted values.
   2921 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_srai_epi32(__m128i __a,
   2922                                                             int __count) {
   2923   return (__m128i)__builtin_ia32_psradi128((__v4si)__a, __count);
   2924 }
   2925 
   2926 /// Right-shifts each 32-bit value in the 128-bit integer vector operand
   2927 ///    by the specified number of bits. High-order bits are filled with the sign
   2928 ///    bit of the initial value.
   2929 ///
   2930 /// \headerfile <x86intrin.h>
   2931 ///
   2932 /// This intrinsic corresponds to the <c> VPSRAD / PSRAD </c> instruction.
   2933 ///
   2934 /// \param __a
   2935 ///    A 128-bit integer vector containing the source operand.
   2936 /// \param __count
   2937 ///    A 128-bit integer vector in which bits [63:0] specify the number of bits
   2938 ///    to right-shift each value in operand \a __a.
   2939 /// \returns A 128-bit integer vector containing the right-shifted values.
   2940 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_sra_epi32(__m128i __a,
   2941                                                            __m128i __count) {
   2942   return (__m128i)__builtin_ia32_psrad128((__v4si)__a, (__v4si)__count);
   2943 }
   2944 
   2945 /// Right-shifts the 128-bit integer vector operand by the specified
   2946 ///    number of bytes. High-order bits are cleared.
   2947 ///
   2948 /// \headerfile <x86intrin.h>
   2949 ///
   2950 /// \code
   2951 /// __m128i _mm_srli_si128(__m128i a, const int imm);
   2952 /// \endcode
   2953 ///
   2954 /// This intrinsic corresponds to the <c> VPSRLDQ / PSRLDQ </c> instruction.
   2955 ///
   2956 /// \param a
   2957 ///    A 128-bit integer vector containing the source operand.
   2958 /// \param imm
   2959 ///    An immediate value specifying the number of bytes to right-shift operand
   2960 ///    \a a.
   2961 /// \returns A 128-bit integer vector containing the right-shifted value.
   2962 #define _mm_srli_si128(a, imm)                                                 \
   2963   ((__m128i)__builtin_ia32_psrldqi128_byteshift((__v2di)(__m128i)(a),          \
   2964                                                 (int)(imm)))
   2965 
   2966 #define _mm_bsrli_si128(a, imm)                                                \
   2967   ((__m128i)__builtin_ia32_psrldqi128_byteshift((__v2di)(__m128i)(a),          \
   2968                                                 (int)(imm)))
   2969 
   2970 /// Right-shifts each of 16-bit values in the 128-bit integer vector
   2971 ///    operand by the specified number of bits. High-order bits are cleared.
   2972 ///
   2973 /// \headerfile <x86intrin.h>
   2974 ///
   2975 /// This intrinsic corresponds to the <c> VPSRLW / PSRLW </c> instruction.
   2976 ///
   2977 /// \param __a
   2978 ///    A 128-bit integer vector containing the source operand.
   2979 /// \param __count
   2980 ///    An integer value specifying the number of bits to right-shift each value
   2981 ///    in operand \a __a.
   2982 /// \returns A 128-bit integer vector containing the right-shifted values.
   2983 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_srli_epi16(__m128i __a,
   2984                                                             int __count) {
   2985   return (__m128i)__builtin_ia32_psrlwi128((__v8hi)__a, __count);
   2986 }
   2987 
   2988 /// Right-shifts each of 16-bit values in the 128-bit integer vector
   2989 ///    operand by the specified number of bits. High-order bits are cleared.
   2990 ///
   2991 /// \headerfile <x86intrin.h>
   2992 ///
   2993 /// This intrinsic corresponds to the <c> VPSRLW / PSRLW </c> instruction.
   2994 ///
   2995 /// \param __a
   2996 ///    A 128-bit integer vector containing the source operand.
   2997 /// \param __count
   2998 ///    A 128-bit integer vector in which bits [63:0] specify the number of bits
   2999 ///    to right-shift each value in operand \a __a.
   3000 /// \returns A 128-bit integer vector containing the right-shifted values.
   3001 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_srl_epi16(__m128i __a,
   3002                                                            __m128i __count) {
   3003   return (__m128i)__builtin_ia32_psrlw128((__v8hi)__a, (__v8hi)__count);
   3004 }
   3005 
   3006 /// Right-shifts each of 32-bit values in the 128-bit integer vector
   3007 ///    operand by the specified number of bits. High-order bits are cleared.
   3008 ///
   3009 /// \headerfile <x86intrin.h>
   3010 ///
   3011 /// This intrinsic corresponds to the <c> VPSRLD / PSRLD </c> instruction.
   3012 ///
   3013 /// \param __a
   3014 ///    A 128-bit integer vector containing the source operand.
   3015 /// \param __count
   3016 ///    An integer value specifying the number of bits to right-shift each value
   3017 ///    in operand \a __a.
   3018 /// \returns A 128-bit integer vector containing the right-shifted values.
   3019 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_srli_epi32(__m128i __a,
   3020                                                             int __count) {
   3021   return (__m128i)__builtin_ia32_psrldi128((__v4si)__a, __count);
   3022 }
   3023 
   3024 /// Right-shifts each of 32-bit values in the 128-bit integer vector
   3025 ///    operand by the specified number of bits. High-order bits are cleared.
   3026 ///
   3027 /// \headerfile <x86intrin.h>
   3028 ///
   3029 /// This intrinsic corresponds to the <c> VPSRLD / PSRLD </c> instruction.
   3030 ///
   3031 /// \param __a
   3032 ///    A 128-bit integer vector containing the source operand.
   3033 /// \param __count
   3034 ///    A 128-bit integer vector in which bits [63:0] specify the number of bits
   3035 ///    to right-shift each value in operand \a __a.
   3036 /// \returns A 128-bit integer vector containing the right-shifted values.
   3037 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_srl_epi32(__m128i __a,
   3038                                                            __m128i __count) {
   3039   return (__m128i)__builtin_ia32_psrld128((__v4si)__a, (__v4si)__count);
   3040 }
   3041 
   3042 /// Right-shifts each of 64-bit values in the 128-bit integer vector
   3043 ///    operand by the specified number of bits. High-order bits are cleared.
   3044 ///
   3045 /// \headerfile <x86intrin.h>
   3046 ///
   3047 /// This intrinsic corresponds to the <c> VPSRLQ / PSRLQ </c> instruction.
   3048 ///
   3049 /// \param __a
   3050 ///    A 128-bit integer vector containing the source operand.
   3051 /// \param __count
   3052 ///    An integer value specifying the number of bits to right-shift each value
   3053 ///    in operand \a __a.
   3054 /// \returns A 128-bit integer vector containing the right-shifted values.
   3055 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_srli_epi64(__m128i __a,
   3056                                                             int __count) {
   3057   return __builtin_ia32_psrlqi128((__v2di)__a, __count);
   3058 }
   3059 
   3060 /// Right-shifts each of 64-bit values in the 128-bit integer vector
   3061 ///    operand by the specified number of bits. High-order bits are cleared.
   3062 ///
   3063 /// \headerfile <x86intrin.h>
   3064 ///
   3065 /// This intrinsic corresponds to the <c> VPSRLQ / PSRLQ </c> instruction.
   3066 ///
   3067 /// \param __a
   3068 ///    A 128-bit integer vector containing the source operand.
   3069 /// \param __count
   3070 ///    A 128-bit integer vector in which bits [63:0] specify the number of bits
   3071 ///    to right-shift each value in operand \a __a.
   3072 /// \returns A 128-bit integer vector containing the right-shifted values.
   3073 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_srl_epi64(__m128i __a,
   3074                                                            __m128i __count) {
   3075   return __builtin_ia32_psrlq128((__v2di)__a, (__v2di)__count);
   3076 }
   3077 
   3078 /// Compares each of the corresponding 8-bit values of the 128-bit
   3079 ///    integer vectors for equality.
   3080 ///
   3081 ///    Each comparison returns 0x0 for false, 0xFF for true.
   3082 ///
   3083 /// \headerfile <x86intrin.h>
   3084 ///
   3085 /// This intrinsic corresponds to the <c> VPCMPEQB / PCMPEQB </c> instruction.
   3086 ///
   3087 /// \param __a
   3088 ///    A 128-bit integer vector.
   3089 /// \param __b
   3090 ///    A 128-bit integer vector.
   3091 /// \returns A 128-bit integer vector containing the comparison results.
   3092 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_cmpeq_epi8(__m128i __a,
   3093                                                             __m128i __b) {
   3094   return (__m128i)((__v16qi)__a == (__v16qi)__b);
   3095 }
   3096 
   3097 /// Compares each of the corresponding 16-bit values of the 128-bit
   3098 ///    integer vectors for equality.
   3099 ///
   3100 ///    Each comparison returns 0x0 for false, 0xFFFF for true.
   3101 ///
   3102 /// \headerfile <x86intrin.h>
   3103 ///
   3104 /// This intrinsic corresponds to the <c> VPCMPEQW / PCMPEQW </c> instruction.
   3105 ///
   3106 /// \param __a
   3107 ///    A 128-bit integer vector.
   3108 /// \param __b
   3109 ///    A 128-bit integer vector.
   3110 /// \returns A 128-bit integer vector containing the comparison results.
   3111 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_cmpeq_epi16(__m128i __a,
   3112                                                              __m128i __b) {
   3113   return (__m128i)((__v8hi)__a == (__v8hi)__b);
   3114 }
   3115 
   3116 /// Compares each of the corresponding 32-bit values of the 128-bit
   3117 ///    integer vectors for equality.
   3118 ///
   3119 ///    Each comparison returns 0x0 for false, 0xFFFFFFFF for true.
   3120 ///
   3121 /// \headerfile <x86intrin.h>
   3122 ///
   3123 /// This intrinsic corresponds to the <c> VPCMPEQD / PCMPEQD </c> instruction.
   3124 ///
   3125 /// \param __a
   3126 ///    A 128-bit integer vector.
   3127 /// \param __b
   3128 ///    A 128-bit integer vector.
   3129 /// \returns A 128-bit integer vector containing the comparison results.
   3130 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_cmpeq_epi32(__m128i __a,
   3131                                                              __m128i __b) {
   3132   return (__m128i)((__v4si)__a == (__v4si)__b);
   3133 }
   3134 
   3135 /// Compares each of the corresponding signed 8-bit values of the 128-bit
   3136 ///    integer vectors to determine if the values in the first operand are
   3137 ///    greater than those in the second operand.
   3138 ///
   3139 ///    Each comparison returns 0x0 for false, 0xFF for true.
   3140 ///
   3141 /// \headerfile <x86intrin.h>
   3142 ///
   3143 /// This intrinsic corresponds to the <c> VPCMPGTB / PCMPGTB </c> instruction.
   3144 ///
   3145 /// \param __a
   3146 ///    A 128-bit integer vector.
   3147 /// \param __b
   3148 ///    A 128-bit integer vector.
   3149 /// \returns A 128-bit integer vector containing the comparison results.
   3150 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_cmpgt_epi8(__m128i __a,
   3151                                                             __m128i __b) {
   3152   /* This function always performs a signed comparison, but __v16qi is a char
   3153      which may be signed or unsigned, so use __v16qs. */
   3154   return (__m128i)((__v16qs)__a > (__v16qs)__b);
   3155 }
   3156 
   3157 /// Compares each of the corresponding signed 16-bit values of the
   3158 ///    128-bit integer vectors to determine if the values in the first operand
   3159 ///    are greater than those in the second operand.
   3160 ///
   3161 ///    Each comparison returns 0x0 for false, 0xFFFF for true.
   3162 ///
   3163 /// \headerfile <x86intrin.h>
   3164 ///
   3165 /// This intrinsic corresponds to the <c> VPCMPGTW / PCMPGTW </c> instruction.
   3166 ///
   3167 /// \param __a
   3168 ///    A 128-bit integer vector.
   3169 /// \param __b
   3170 ///    A 128-bit integer vector.
   3171 /// \returns A 128-bit integer vector containing the comparison results.
   3172 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_cmpgt_epi16(__m128i __a,
   3173                                                              __m128i __b) {
   3174   return (__m128i)((__v8hi)__a > (__v8hi)__b);
   3175 }
   3176 
   3177 /// Compares each of the corresponding signed 32-bit values of the
   3178 ///    128-bit integer vectors to determine if the values in the first operand
   3179 ///    are greater than those in the second operand.
   3180 ///
   3181 ///    Each comparison returns 0x0 for false, 0xFFFFFFFF for true.
   3182 ///
   3183 /// \headerfile <x86intrin.h>
   3184 ///
   3185 /// This intrinsic corresponds to the <c> VPCMPGTD / PCMPGTD </c> instruction.
   3186 ///
   3187 /// \param __a
   3188 ///    A 128-bit integer vector.
   3189 /// \param __b
   3190 ///    A 128-bit integer vector.
   3191 /// \returns A 128-bit integer vector containing the comparison results.
   3192 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_cmpgt_epi32(__m128i __a,
   3193                                                              __m128i __b) {
   3194   return (__m128i)((__v4si)__a > (__v4si)__b);
   3195 }
   3196 
   3197 /// Compares each of the corresponding signed 8-bit values of the 128-bit
   3198 ///    integer vectors to determine if the values in the first operand are less
   3199 ///    than those in the second operand.
   3200 ///
   3201 ///    Each comparison returns 0x0 for false, 0xFF for true.
   3202 ///
   3203 /// \headerfile <x86intrin.h>
   3204 ///
   3205 /// This intrinsic corresponds to the <c> VPCMPGTB / PCMPGTB </c> instruction.
   3206 ///
   3207 /// \param __a
   3208 ///    A 128-bit integer vector.
   3209 /// \param __b
   3210 ///    A 128-bit integer vector.
   3211 /// \returns A 128-bit integer vector containing the comparison results.
   3212 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_cmplt_epi8(__m128i __a,
   3213                                                             __m128i __b) {
   3214   return _mm_cmpgt_epi8(__b, __a);
   3215 }
   3216 
   3217 /// Compares each of the corresponding signed 16-bit values of the
   3218 ///    128-bit integer vectors to determine if the values in the first operand
   3219 ///    are less than those in the second operand.
   3220 ///
   3221 ///    Each comparison returns 0x0 for false, 0xFFFF for true.
   3222 ///
   3223 /// \headerfile <x86intrin.h>
   3224 ///
   3225 /// This intrinsic corresponds to the <c> VPCMPGTW / PCMPGTW </c> instruction.
   3226 ///
   3227 /// \param __a
   3228 ///    A 128-bit integer vector.
   3229 /// \param __b
   3230 ///    A 128-bit integer vector.
   3231 /// \returns A 128-bit integer vector containing the comparison results.
   3232 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_cmplt_epi16(__m128i __a,
   3233                                                              __m128i __b) {
   3234   return _mm_cmpgt_epi16(__b, __a);
   3235 }
   3236 
   3237 /// Compares each of the corresponding signed 32-bit values of the
   3238 ///    128-bit integer vectors to determine if the values in the first operand
   3239 ///    are less than those in the second operand.
   3240 ///
   3241 ///    Each comparison returns 0x0 for false, 0xFFFFFFFF for true.
   3242 ///
   3243 /// \headerfile <x86intrin.h>
   3244 ///
   3245 /// This intrinsic corresponds to the <c> VPCMPGTD / PCMPGTD </c> instruction.
   3246 ///
   3247 /// \param __a
   3248 ///    A 128-bit integer vector.
   3249 /// \param __b
   3250 ///    A 128-bit integer vector.
   3251 /// \returns A 128-bit integer vector containing the comparison results.
   3252 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_cmplt_epi32(__m128i __a,
   3253                                                              __m128i __b) {
   3254   return _mm_cmpgt_epi32(__b, __a);
   3255 }
   3256 
   3257 #ifdef __x86_64__
   3258 /// Converts a 64-bit signed integer value from the second operand into a
   3259 ///    double-precision value and returns it in the lower element of a [2 x
   3260 ///    double] vector; the upper element of the returned vector is copied from
   3261 ///    the upper element of the first operand.
   3262 ///
   3263 /// \headerfile <x86intrin.h>
   3264 ///
   3265 /// This intrinsic corresponds to the <c> VCVTSI2SD / CVTSI2SD </c> instruction.
   3266 ///
   3267 /// \param __a
   3268 ///    A 128-bit vector of [2 x double]. The upper 64 bits of this operand are
   3269 ///    copied to the upper 64 bits of the destination.
   3270 /// \param __b
   3271 ///    A 64-bit signed integer operand containing the value to be converted.
   3272 /// \returns A 128-bit vector of [2 x double] whose lower 64 bits contain the
   3273 ///    converted value of the second operand. The upper 64 bits are copied from
   3274 ///    the upper 64 bits of the first operand.
   3275 static __inline__ __m128d __DEFAULT_FN_ATTRS_CONSTEXPR
   3276 _mm_cvtsi64_sd(__m128d __a, long long __b) {
   3277   __a[0] = __b;
   3278   return __a;
   3279 }
   3280 
   3281 /// Converts the first (lower) element of a vector of [2 x double] into a
   3282 ///    64-bit signed integer value.
   3283 ///
   3284 ///    If the converted value does not fit in a 64-bit integer, raises a
   3285 ///    floating-point invalid exception. If the exception is masked, returns
   3286 ///    the most negative integer.
   3287 ///
   3288 /// \headerfile <x86intrin.h>
   3289 ///
   3290 /// This intrinsic corresponds to the <c> VCVTSD2SI / CVTSD2SI </c> instruction.
   3291 ///
   3292 /// \param __a
   3293 ///    A 128-bit vector of [2 x double]. The lower 64 bits are used in the
   3294 ///    conversion.
   3295 /// \returns A 64-bit signed integer containing the converted value.
   3296 static __inline__ long long __DEFAULT_FN_ATTRS _mm_cvtsd_si64(__m128d __a) {
   3297   return __builtin_ia32_cvtsd2si64((__v2df)__a);
   3298 }
   3299 
   3300 /// Converts the first (lower) element of a vector of [2 x double] into a
   3301 ///    64-bit signed truncated (rounded toward zero) integer value.
   3302 ///
   3303 ///    If a converted value does not fit in a 64-bit integer, raises a
   3304 ///    floating-point invalid exception. If the exception is masked, returns
   3305 ///    the most negative integer.
   3306 ///
   3307 /// \headerfile <x86intrin.h>
   3308 ///
   3309 /// This intrinsic corresponds to the <c> VCVTTSD2SI / CVTTSD2SI </c>
   3310 ///   instruction.
   3311 ///
   3312 /// \param __a
   3313 ///    A 128-bit vector of [2 x double]. The lower 64 bits are used in the
   3314 ///    conversion.
   3315 /// \returns A 64-bit signed integer containing the converted value.
   3316 static __inline__ long long __DEFAULT_FN_ATTRS _mm_cvttsd_si64(__m128d __a) {
   3317   return __builtin_ia32_cvttsd2si64((__v2df)__a);
   3318 }
   3319 #endif
   3320 
   3321 /// Converts a vector of [4 x i32] into a vector of [4 x float].
   3322 ///
   3323 /// \headerfile <x86intrin.h>
   3324 ///
   3325 /// This intrinsic corresponds to the <c> VCVTDQ2PS / CVTDQ2PS </c> instruction.
   3326 ///
   3327 /// \param __a
   3328 ///    A 128-bit integer vector.
   3329 /// \returns A 128-bit vector of [4 x float] containing the converted values.
   3330 static __inline__ __m128 __DEFAULT_FN_ATTRS_CONSTEXPR
   3331 _mm_cvtepi32_ps(__m128i __a) {
   3332   return (__m128) __builtin_convertvector((__v4si)__a, __v4sf);
   3333 }
   3334 
   3335 /// Converts a vector of [4 x float] into a vector of [4 x i32].
   3336 ///
   3337 ///    If a converted value does not fit in a 32-bit integer, raises a
   3338 ///    floating-point invalid exception. If the exception is masked, returns
   3339 ///    the most negative integer.
   3340 ///
   3341 /// \headerfile <x86intrin.h>
   3342 ///
   3343 /// This intrinsic corresponds to the <c> VCVTPS2DQ / CVTPS2DQ </c> instruction.
   3344 ///
   3345 /// \param __a
   3346 ///    A 128-bit vector of [4 x float].
   3347 /// \returns A 128-bit integer vector of [4 x i32] containing the converted
   3348 ///    values.
   3349 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_cvtps_epi32(__m128 __a) {
   3350   return (__m128i)__builtin_ia32_cvtps2dq((__v4sf)__a);
   3351 }
   3352 
   3353 /// Converts a vector of [4 x float] into four signed truncated (rounded toward
   3354 ///    zero) 32-bit integers, returned in a vector of [4 x i32].
   3355 ///
   3356 ///    If a converted value does not fit in a 32-bit integer, raises a
   3357 ///    floating-point invalid exception. If the exception is masked, returns
   3358 ///    the most negative integer.
   3359 ///
   3360 /// \headerfile <x86intrin.h>
   3361 ///
   3362 /// This intrinsic corresponds to the <c> VCVTTPS2DQ / CVTTPS2DQ </c>
   3363 ///   instruction.
   3364 ///
   3365 /// \param __a
   3366 ///    A 128-bit vector of [4 x float].
   3367 /// \returns A 128-bit vector of [4 x i32] containing the converted values.
   3368 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_cvttps_epi32(__m128 __a) {
   3369   return (__m128i)__builtin_ia32_cvttps2dq((__v4sf)__a);
   3370 }
   3371 
   3372 /// Returns a vector of [4 x i32] where the lowest element is the input
   3373 ///    operand and the remaining elements are zero.
   3374 ///
   3375 /// \headerfile <x86intrin.h>
   3376 ///
   3377 /// This intrinsic corresponds to the <c> VMOVD / MOVD </c> instruction.
   3378 ///
   3379 /// \param __a
   3380 ///    A 32-bit signed integer operand.
   3381 /// \returns A 128-bit vector of [4 x i32].
   3382 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_cvtsi32_si128(int __a) {
   3383   return __extension__(__m128i)(__v4si){__a, 0, 0, 0};
   3384 }
   3385 
   3386 /// Returns a vector of [2 x i64] where the lower element is the input
   3387 ///    operand and the upper element is zero.
   3388 ///
   3389 /// \headerfile <x86intrin.h>
   3390 ///
   3391 /// This intrinsic corresponds to the <c> VMOVQ / MOVQ </c> instruction
   3392 /// in 64-bit mode.
   3393 ///
   3394 /// \param __a
   3395 ///    A 64-bit signed integer operand containing the value to be converted.
   3396 /// \returns A 128-bit vector of [2 x i64] containing the converted value.
   3397 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_cvtsi64_si128(long long __a) {
   3398   return __extension__(__m128i)(__v2di){__a, 0};
   3399 }
   3400 
   3401 /// Moves the least significant 32 bits of a vector of [4 x i32] to a
   3402 ///    32-bit signed integer value.
   3403 ///
   3404 /// \headerfile <x86intrin.h>
   3405 ///
   3406 /// This intrinsic corresponds to the <c> VMOVD / MOVD </c> instruction.
   3407 ///
   3408 /// \param __a
   3409 ///    A vector of [4 x i32]. The least significant 32 bits are moved to the
   3410 ///    destination.
   3411 /// \returns A 32-bit signed integer containing the moved value.
   3412 static __inline__ int __DEFAULT_FN_ATTRS _mm_cvtsi128_si32(__m128i __a) {
   3413   __v4si __b = (__v4si)__a;
   3414   return __b[0];
   3415 }
   3416 
   3417 /// Moves the least significant 64 bits of a vector of [2 x i64] to a
   3418 ///    64-bit signed integer value.
   3419 ///
   3420 /// \headerfile <x86intrin.h>
   3421 ///
   3422 /// This intrinsic corresponds to the <c> VMOVQ / MOVQ </c> instruction.
   3423 ///
   3424 /// \param __a
   3425 ///    A vector of [2 x i64]. The least significant 64 bits are moved to the
   3426 ///    destination.
   3427 /// \returns A 64-bit signed integer containing the moved value.
   3428 static __inline__ long long __DEFAULT_FN_ATTRS _mm_cvtsi128_si64(__m128i __a) {
   3429   return __a[0];
   3430 }
   3431 
   3432 /// Moves packed integer values from an aligned 128-bit memory location
   3433 ///    to elements in a 128-bit integer vector.
   3434 ///
   3435 /// \headerfile <x86intrin.h>
   3436 ///
   3437 /// This intrinsic corresponds to the <c> VMOVDQA / MOVDQA </c> instruction.
   3438 ///
   3439 /// \param __p
   3440 ///    An aligned pointer to a memory location containing integer values.
   3441 /// \returns A 128-bit integer vector containing the moved values.
   3442 static __inline__ __m128i __DEFAULT_FN_ATTRS
   3443 _mm_load_si128(__m128i const *__p) {
   3444   return *__p;
   3445 }
   3446 
   3447 /// Moves packed integer values from an unaligned 128-bit memory location
   3448 ///    to elements in a 128-bit integer vector.
   3449 ///
   3450 /// \headerfile <x86intrin.h>
   3451 ///
   3452 /// This intrinsic corresponds to the <c> VMOVDQU / MOVDQU </c> instruction.
   3453 ///
   3454 /// \param __p
   3455 ///    A pointer to a memory location containing integer values.
   3456 /// \returns A 128-bit integer vector containing the moved values.
   3457 static __inline__ __m128i __DEFAULT_FN_ATTRS
   3458 _mm_loadu_si128(__m128i_u const *__p) {
   3459   struct __loadu_si128 {
   3460     __m128i_u __v;
   3461   } __attribute__((__packed__, __may_alias__));
   3462   return ((const struct __loadu_si128 *)__p)->__v;
   3463 }
   3464 
   3465 /// Returns a vector of [2 x i64] where the lower element is taken from
   3466 ///    the lower element of the operand, and the upper element is zero.
   3467 ///
   3468 /// \headerfile <x86intrin.h>
   3469 ///
   3470 /// This intrinsic corresponds to the <c> VMOVQ / MOVQ </c> instruction.
   3471 ///
   3472 /// \param __p
   3473 ///    A 128-bit vector of [2 x i64]. Bits [63:0] are written to bits [63:0] of
   3474 ///    the destination.
   3475 /// \returns A 128-bit vector of [2 x i64]. The lower order bits contain the
   3476 ///    moved value. The higher order bits are cleared.
   3477 static __inline__ __m128i __DEFAULT_FN_ATTRS
   3478 _mm_loadl_epi64(__m128i_u const *__p) {
   3479   struct __mm_loadl_epi64_struct {
   3480     long long __u;
   3481   } __attribute__((__packed__, __may_alias__));
   3482   return __extension__(__m128i){
   3483       ((const struct __mm_loadl_epi64_struct *)__p)->__u, 0};
   3484 }
   3485 
   3486 /// Generates a 128-bit vector of [4 x i32] with unspecified content.
   3487 ///    This could be used as an argument to another intrinsic function where the
   3488 ///    argument is required but the value is not actually used.
   3489 ///
   3490 /// \headerfile <x86intrin.h>
   3491 ///
   3492 /// This intrinsic has no corresponding instruction.
   3493 ///
   3494 /// \returns A 128-bit vector of [4 x i32] with unspecified content.
   3495 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_undefined_si128(void) {
   3496   return (__m128i)__builtin_ia32_undef128();
   3497 }
   3498 
   3499 /// Initializes both 64-bit values in a 128-bit vector of [2 x i64] with
   3500 ///    the specified 64-bit integer values.
   3501 ///
   3502 /// \headerfile <x86intrin.h>
   3503 ///
   3504 /// This intrinsic is a utility function and does not correspond to a specific
   3505 ///    instruction.
   3506 ///
   3507 /// \param __q1
   3508 ///    A 64-bit integer value used to initialize the upper 64 bits of the
   3509 ///    destination vector of [2 x i64].
   3510 /// \param __q0
   3511 ///    A 64-bit integer value used to initialize the lower 64 bits of the
   3512 ///    destination vector of [2 x i64].
   3513 /// \returns An initialized 128-bit vector of [2 x i64] containing the values
   3514 ///    provided in the operands.
   3515 static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
   3516 _mm_set_epi64x(long long __q1, long long __q0) {
   3517   return __extension__(__m128i)(__v2di){__q0, __q1};
   3518 }
   3519 
   3520 /// Initializes both 64-bit values in a 128-bit vector of [2 x i64] with
   3521 ///    the specified 64-bit integer values.
   3522 ///
   3523 /// \headerfile <x86intrin.h>
   3524 ///
   3525 /// This intrinsic is a utility function and does not correspond to a specific
   3526 ///    instruction.
   3527 ///
   3528 /// \param __q1
   3529 ///    A 64-bit integer value used to initialize the upper 64 bits of the
   3530 ///    destination vector of [2 x i64].
   3531 /// \param __q0
   3532 ///    A 64-bit integer value used to initialize the lower 64 bits of the
   3533 ///    destination vector of [2 x i64].
   3534 /// \returns An initialized 128-bit vector of [2 x i64] containing the values
   3535 ///    provided in the operands.
   3536 static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
   3537 _mm_set_epi64(__m64 __q1, __m64 __q0) {
   3538   return _mm_set_epi64x((long long)__q1[0], (long long)__q0[0]);
   3539 }
   3540 
   3541 /// Initializes the 32-bit values in a 128-bit vector of [4 x i32] with
   3542 ///    the specified 32-bit integer values.
   3543 ///
   3544 /// \headerfile <x86intrin.h>
   3545 ///
   3546 /// This intrinsic is a utility function and does not correspond to a specific
   3547 ///    instruction.
   3548 ///
   3549 /// \param __i3
   3550 ///    A 32-bit integer value used to initialize bits [127:96] of the
   3551 ///    destination vector.
   3552 /// \param __i2
   3553 ///    A 32-bit integer value used to initialize bits [95:64] of the destination
   3554 ///    vector.
   3555 /// \param __i1
   3556 ///    A 32-bit integer value used to initialize bits [63:32] of the destination
   3557 ///    vector.
   3558 /// \param __i0
   3559 ///    A 32-bit integer value used to initialize bits [31:0] of the destination
   3560 ///    vector.
   3561 /// \returns An initialized 128-bit vector of [4 x i32] containing the values
   3562 ///    provided in the operands.
   3563 static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR _mm_set_epi32(int __i3,
   3564                                                                      int __i2,
   3565                                                                      int __i1,
   3566                                                                      int __i0) {
   3567   return __extension__(__m128i)(__v4si){__i0, __i1, __i2, __i3};
   3568 }
   3569 
   3570 /// Initializes the 16-bit values in a 128-bit vector of [8 x i16] with
   3571 ///    the specified 16-bit integer values.
   3572 ///
   3573 /// \headerfile <x86intrin.h>
   3574 ///
   3575 /// This intrinsic is a utility function and does not correspond to a specific
   3576 ///    instruction.
   3577 ///
   3578 /// \param __w7
   3579 ///    A 16-bit integer value used to initialize bits [127:112] of the
   3580 ///    destination vector.
   3581 /// \param __w6
   3582 ///    A 16-bit integer value used to initialize bits [111:96] of the
   3583 ///    destination vector.
   3584 /// \param __w5
   3585 ///    A 16-bit integer value used to initialize bits [95:80] of the destination
   3586 ///    vector.
   3587 /// \param __w4
   3588 ///    A 16-bit integer value used to initialize bits [79:64] of the destination
   3589 ///    vector.
   3590 /// \param __w3
   3591 ///    A 16-bit integer value used to initialize bits [63:48] of the destination
   3592 ///    vector.
   3593 /// \param __w2
   3594 ///    A 16-bit integer value used to initialize bits [47:32] of the destination
   3595 ///    vector.
   3596 /// \param __w1
   3597 ///    A 16-bit integer value used to initialize bits [31:16] of the destination
   3598 ///    vector.
   3599 /// \param __w0
   3600 ///    A 16-bit integer value used to initialize bits [15:0] of the destination
   3601 ///    vector.
   3602 /// \returns An initialized 128-bit vector of [8 x i16] containing the values
   3603 ///    provided in the operands.
   3604 static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
   3605 _mm_set_epi16(short __w7, short __w6, short __w5, short __w4, short __w3,
   3606               short __w2, short __w1, short __w0) {
   3607   return __extension__(__m128i)(__v8hi){__w0, __w1, __w2, __w3,
   3608                                         __w4, __w5, __w6, __w7};
   3609 }
   3610 
   3611 /// Initializes the 8-bit values in a 128-bit vector of [16 x i8] with
   3612 ///    the specified 8-bit integer values.
   3613 ///
   3614 /// \headerfile <x86intrin.h>
   3615 ///
   3616 /// This intrinsic is a utility function and does not correspond to a specific
   3617 ///    instruction.
   3618 ///
   3619 /// \param __b15
   3620 ///    Initializes bits [127:120] of the destination vector.
   3621 /// \param __b14
   3622 ///    Initializes bits [119:112] of the destination vector.
   3623 /// \param __b13
   3624 ///    Initializes bits [111:104] of the destination vector.
   3625 /// \param __b12
   3626 ///    Initializes bits [103:96] of the destination vector.
   3627 /// \param __b11
   3628 ///    Initializes bits [95:88] of the destination vector.
   3629 /// \param __b10
   3630 ///    Initializes bits [87:80] of the destination vector.
   3631 /// \param __b9
   3632 ///    Initializes bits [79:72] of the destination vector.
   3633 /// \param __b8
   3634 ///    Initializes bits [71:64] of the destination vector.
   3635 /// \param __b7
   3636 ///    Initializes bits [63:56] of the destination vector.
   3637 /// \param __b6
   3638 ///    Initializes bits [55:48] of the destination vector.
   3639 /// \param __b5
   3640 ///    Initializes bits [47:40] of the destination vector.
   3641 /// \param __b4
   3642 ///    Initializes bits [39:32] of the destination vector.
   3643 /// \param __b3
   3644 ///    Initializes bits [31:24] of the destination vector.
   3645 /// \param __b2
   3646 ///    Initializes bits [23:16] of the destination vector.
   3647 /// \param __b1
   3648 ///    Initializes bits [15:8] of the destination vector.
   3649 /// \param __b0
   3650 ///    Initializes bits [7:0] of the destination vector.
   3651 /// \returns An initialized 128-bit vector of [16 x i8] containing the values
   3652 ///    provided in the operands.
   3653 static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
   3654 _mm_set_epi8(char __b15, char __b14, char __b13, char __b12, char __b11,
   3655              char __b10, char __b9, char __b8, char __b7, char __b6, char __b5,
   3656              char __b4, char __b3, char __b2, char __b1, char __b0) {
   3657   return __extension__(__m128i)(__v16qi){
   3658       __b0, __b1, __b2,  __b3,  __b4,  __b5,  __b6,  __b7,
   3659       __b8, __b9, __b10, __b11, __b12, __b13, __b14, __b15};
   3660 }
   3661 
   3662 /// Initializes both values in a 128-bit integer vector with the
   3663 ///    specified 64-bit integer value.
   3664 ///
   3665 /// \headerfile <x86intrin.h>
   3666 ///
   3667 /// This intrinsic is a utility function and does not correspond to a specific
   3668 ///    instruction.
   3669 ///
   3670 /// \param __q
   3671 ///    Integer value used to initialize the elements of the destination integer
   3672 ///    vector.
   3673 /// \returns An initialized 128-bit integer vector of [2 x i64] with both
   3674 ///    elements containing the value provided in the operand.
   3675 static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
   3676 _mm_set1_epi64x(long long __q) {
   3677   return _mm_set_epi64x(__q, __q);
   3678 }
   3679 
   3680 /// Initializes both values in a 128-bit vector of [2 x i64] with the
   3681 ///    specified 64-bit value.
   3682 ///
   3683 /// \headerfile <x86intrin.h>
   3684 ///
   3685 /// This intrinsic is a utility function and does not correspond to a specific
   3686 ///    instruction.
   3687 ///
   3688 /// \param __q
   3689 ///    A 64-bit value used to initialize the elements of the destination integer
   3690 ///    vector.
   3691 /// \returns An initialized 128-bit vector of [2 x i64] with all elements
   3692 ///    containing the value provided in the operand.
   3693 static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
   3694 _mm_set1_epi64(__m64 __q) {
   3695   return _mm_set_epi64(__q, __q);
   3696 }
   3697 
   3698 /// Initializes all values in a 128-bit vector of [4 x i32] with the
   3699 ///    specified 32-bit value.
   3700 ///
   3701 /// \headerfile <x86intrin.h>
   3702 ///
   3703 /// This intrinsic is a utility function and does not correspond to a specific
   3704 ///    instruction.
   3705 ///
   3706 /// \param __i
   3707 ///    A 32-bit value used to initialize the elements of the destination integer
   3708 ///    vector.
   3709 /// \returns An initialized 128-bit vector of [4 x i32] with all elements
   3710 ///    containing the value provided in the operand.
   3711 static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR _mm_set1_epi32(int __i) {
   3712   return _mm_set_epi32(__i, __i, __i, __i);
   3713 }
   3714 
   3715 /// Initializes all values in a 128-bit vector of [8 x i16] with the
   3716 ///    specified 16-bit value.
   3717 ///
   3718 /// \headerfile <x86intrin.h>
   3719 ///
   3720 /// This intrinsic is a utility function and does not correspond to a specific
   3721 ///    instruction.
   3722 ///
   3723 /// \param __w
   3724 ///    A 16-bit value used to initialize the elements of the destination integer
   3725 ///    vector.
   3726 /// \returns An initialized 128-bit vector of [8 x i16] with all elements
   3727 ///    containing the value provided in the operand.
   3728 static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
   3729 _mm_set1_epi16(short __w) {
   3730   return _mm_set_epi16(__w, __w, __w, __w, __w, __w, __w, __w);
   3731 }
   3732 
   3733 /// Initializes all values in a 128-bit vector of [16 x i8] with the
   3734 ///    specified 8-bit value.
   3735 ///
   3736 /// \headerfile <x86intrin.h>
   3737 ///
   3738 /// This intrinsic is a utility function and does not correspond to a specific
   3739 ///    instruction.
   3740 ///
   3741 /// \param __b
   3742 ///    An 8-bit value used to initialize the elements of the destination integer
   3743 ///    vector.
   3744 /// \returns An initialized 128-bit vector of [16 x i8] with all elements
   3745 ///    containing the value provided in the operand.
   3746 static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR _mm_set1_epi8(char __b) {
   3747   return _mm_set_epi8(__b, __b, __b, __b, __b, __b, __b, __b, __b, __b, __b,
   3748                       __b, __b, __b, __b, __b);
   3749 }
   3750 
   3751 /// Constructs a 128-bit integer vector, initialized in reverse order
   3752 ///     with the specified 64-bit integral values.
   3753 ///
   3754 /// \headerfile <x86intrin.h>
   3755 ///
   3756 /// This intrinsic does not correspond to a specific instruction.
   3757 ///
   3758 /// \param __q0
   3759 ///    A 64-bit integral value used to initialize the lower 64 bits of the
   3760 ///    result.
   3761 /// \param __q1
   3762 ///    A 64-bit integral value used to initialize the upper 64 bits of the
   3763 ///    result.
   3764 /// \returns An initialized 128-bit integer vector.
   3765 static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
   3766 _mm_setr_epi64(__m64 __q0, __m64 __q1) {
   3767   return _mm_set_epi64(__q1, __q0);
   3768 }
   3769 
   3770 /// Constructs a 128-bit integer vector, initialized in reverse order
   3771 ///     with the specified 32-bit integral values.
   3772 ///
   3773 /// \headerfile <x86intrin.h>
   3774 ///
   3775 /// This intrinsic is a utility function and does not correspond to a specific
   3776 ///    instruction.
   3777 ///
   3778 /// \param __i0
   3779 ///    A 32-bit integral value used to initialize bits [31:0] of the result.
   3780 /// \param __i1
   3781 ///    A 32-bit integral value used to initialize bits [63:32] of the result.
   3782 /// \param __i2
   3783 ///    A 32-bit integral value used to initialize bits [95:64] of the result.
   3784 /// \param __i3
   3785 ///    A 32-bit integral value used to initialize bits [127:96] of the result.
   3786 /// \returns An initialized 128-bit integer vector.
   3787 static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
   3788 _mm_setr_epi32(int __i0, int __i1, int __i2, int __i3) {
   3789   return _mm_set_epi32(__i3, __i2, __i1, __i0);
   3790 }
   3791 
   3792 /// Constructs a 128-bit integer vector, initialized in reverse order
   3793 ///     with the specified 16-bit integral values.
   3794 ///
   3795 /// \headerfile <x86intrin.h>
   3796 ///
   3797 /// This intrinsic is a utility function and does not correspond to a specific
   3798 ///    instruction.
   3799 ///
   3800 /// \param __w0
   3801 ///    A 16-bit integral value used to initialize bits [15:0] of the result.
   3802 /// \param __w1
   3803 ///    A 16-bit integral value used to initialize bits [31:16] of the result.
   3804 /// \param __w2
   3805 ///    A 16-bit integral value used to initialize bits [47:32] of the result.
   3806 /// \param __w3
   3807 ///    A 16-bit integral value used to initialize bits [63:48] of the result.
   3808 /// \param __w4
   3809 ///    A 16-bit integral value used to initialize bits [79:64] of the result.
   3810 /// \param __w5
   3811 ///    A 16-bit integral value used to initialize bits [95:80] of the result.
   3812 /// \param __w6
   3813 ///    A 16-bit integral value used to initialize bits [111:96] of the result.
   3814 /// \param __w7
   3815 ///    A 16-bit integral value used to initialize bits [127:112] of the result.
   3816 /// \returns An initialized 128-bit integer vector.
   3817 static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
   3818 _mm_setr_epi16(short __w0, short __w1, short __w2, short __w3, short __w4,
   3819                short __w5, short __w6, short __w7) {
   3820   return _mm_set_epi16(__w7, __w6, __w5, __w4, __w3, __w2, __w1, __w0);
   3821 }
   3822 
   3823 /// Constructs a 128-bit integer vector, initialized in reverse order
   3824 ///     with the specified 8-bit integral values.
   3825 ///
   3826 /// \headerfile <x86intrin.h>
   3827 ///
   3828 /// This intrinsic is a utility function and does not correspond to a specific
   3829 ///    instruction.
   3830 ///
   3831 /// \param __b0
   3832 ///    An 8-bit integral value used to initialize bits [7:0] of the result.
   3833 /// \param __b1
   3834 ///    An 8-bit integral value used to initialize bits [15:8] of the result.
   3835 /// \param __b2
   3836 ///    An 8-bit integral value used to initialize bits [23:16] of the result.
   3837 /// \param __b3
   3838 ///    An 8-bit integral value used to initialize bits [31:24] of the result.
   3839 /// \param __b4
   3840 ///    An 8-bit integral value used to initialize bits [39:32] of the result.
   3841 /// \param __b5
   3842 ///    An 8-bit integral value used to initialize bits [47:40] of the result.
   3843 /// \param __b6
   3844 ///    An 8-bit integral value used to initialize bits [55:48] of the result.
   3845 /// \param __b7
   3846 ///    An 8-bit integral value used to initialize bits [63:56] of the result.
   3847 /// \param __b8
   3848 ///    An 8-bit integral value used to initialize bits [71:64] of the result.
   3849 /// \param __b9
   3850 ///    An 8-bit integral value used to initialize bits [79:72] of the result.
   3851 /// \param __b10
   3852 ///    An 8-bit integral value used to initialize bits [87:80] of the result.
   3853 /// \param __b11
   3854 ///    An 8-bit integral value used to initialize bits [95:88] of the result.
   3855 /// \param __b12
   3856 ///    An 8-bit integral value used to initialize bits [103:96] of the result.
   3857 /// \param __b13
   3858 ///    An 8-bit integral value used to initialize bits [111:104] of the result.
   3859 /// \param __b14
   3860 ///    An 8-bit integral value used to initialize bits [119:112] of the result.
   3861 /// \param __b15
   3862 ///    An 8-bit integral value used to initialize bits [127:120] of the result.
   3863 /// \returns An initialized 128-bit integer vector.
   3864 static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
   3865 _mm_setr_epi8(char __b0, char __b1, char __b2, char __b3, char __b4, char __b5,
   3866               char __b6, char __b7, char __b8, char __b9, char __b10,
   3867               char __b11, char __b12, char __b13, char __b14, char __b15) {
   3868   return _mm_set_epi8(__b15, __b14, __b13, __b12, __b11, __b10, __b9, __b8,
   3869                       __b7, __b6, __b5, __b4, __b3, __b2, __b1, __b0);
   3870 }
   3871 
   3872 /// Creates a 128-bit integer vector initialized to zero.
   3873 ///
   3874 /// \headerfile <x86intrin.h>
   3875 ///
   3876 /// This intrinsic corresponds to the <c> VXORPS / XORPS </c> instruction.
   3877 ///
   3878 /// \returns An initialized 128-bit integer vector with all elements set to
   3879 ///    zero.
   3880 static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR _mm_setzero_si128(void) {
   3881   return __extension__(__m128i)(__v2di){0LL, 0LL};
   3882 }
   3883 
   3884 /// Stores a 128-bit integer vector to a memory location aligned on a
   3885 ///    128-bit boundary.
   3886 ///
   3887 /// \headerfile <x86intrin.h>
   3888 ///
   3889 /// This intrinsic corresponds to the <c> VMOVAPS / MOVAPS </c> instruction.
   3890 ///
   3891 /// \param __p
   3892 ///    A pointer to an aligned memory location that will receive the integer
   3893 ///    values.
   3894 /// \param __b
   3895 ///    A 128-bit integer vector containing the values to be moved.
   3896 static __inline__ void __DEFAULT_FN_ATTRS _mm_store_si128(__m128i *__p,
   3897                                                           __m128i __b) {
   3898   *__p = __b;
   3899 }
   3900 
   3901 /// Stores a 128-bit integer vector to an unaligned memory location.
   3902 ///
   3903 /// \headerfile <x86intrin.h>
   3904 ///
   3905 /// This intrinsic corresponds to the <c> VMOVUPS / MOVUPS </c> instruction.
   3906 ///
   3907 /// \param __p
   3908 ///    A pointer to a memory location that will receive the integer values.
   3909 /// \param __b
   3910 ///    A 128-bit integer vector containing the values to be moved.
   3911 static __inline__ void __DEFAULT_FN_ATTRS _mm_storeu_si128(__m128i_u *__p,
   3912                                                            __m128i __b) {
   3913   struct __storeu_si128 {
   3914     __m128i_u __v;
   3915   } __attribute__((__packed__, __may_alias__));
   3916   ((struct __storeu_si128 *)__p)->__v = __b;
   3917 }
   3918 
   3919 /// Stores a 64-bit integer value from the low element of a 128-bit integer
   3920 ///    vector.
   3921 ///
   3922 /// \headerfile <x86intrin.h>
   3923 ///
   3924 /// This intrinsic corresponds to the <c> VMOVQ / MOVQ </c> instruction.
   3925 ///
   3926 /// \param __p
   3927 ///    A pointer to a 64-bit memory location. The address of the memory
   3928 ///    location does not have to be aligned.
   3929 /// \param __b
   3930 ///    A 128-bit integer vector containing the value to be stored.
   3931 static __inline__ void __DEFAULT_FN_ATTRS _mm_storeu_si64(void *__p,
   3932                                                           __m128i __b) {
   3933   struct __storeu_si64 {
   3934     long long __v;
   3935   } __attribute__((__packed__, __may_alias__));
   3936   ((struct __storeu_si64 *)__p)->__v = ((__v2di)__b)[0];
   3937 }
   3938 
   3939 /// Stores a 32-bit integer value from the low element of a 128-bit integer
   3940 ///    vector.
   3941 ///
   3942 /// \headerfile <x86intrin.h>
   3943 ///
   3944 /// This intrinsic corresponds to the <c> VMOVD / MOVD </c> instruction.
   3945 ///
   3946 /// \param __p
   3947 ///    A pointer to a 32-bit memory location. The address of the memory
   3948 ///    location does not have to be aligned.
   3949 /// \param __b
   3950 ///    A 128-bit integer vector containing the value to be stored.
   3951 static __inline__ void __DEFAULT_FN_ATTRS _mm_storeu_si32(void *__p,
   3952                                                           __m128i __b) {
   3953   struct __storeu_si32 {
   3954     int __v;
   3955   } __attribute__((__packed__, __may_alias__));
   3956   ((struct __storeu_si32 *)__p)->__v = ((__v4si)__b)[0];
   3957 }
   3958 
   3959 /// Stores a 16-bit integer value from the low element of a 128-bit integer
   3960 ///    vector.
   3961 ///
   3962 /// \headerfile <x86intrin.h>
   3963 ///
   3964 /// This intrinsic does not correspond to a specific instruction.
   3965 ///
   3966 /// \param __p
   3967 ///    A pointer to a 16-bit memory location. The address of the memory
   3968 ///    location does not have to be aligned.
   3969 /// \param __b
   3970 ///    A 128-bit integer vector containing the value to be stored.
   3971 static __inline__ void __DEFAULT_FN_ATTRS _mm_storeu_si16(void *__p,
   3972                                                           __m128i __b) {
   3973   struct __storeu_si16 {
   3974     short __v;
   3975   } __attribute__((__packed__, __may_alias__));
   3976   ((struct __storeu_si16 *)__p)->__v = ((__v8hi)__b)[0];
   3977 }
   3978 
   3979 /// Moves bytes selected by the mask from the first operand to the
   3980 ///    specified unaligned memory location. When a mask bit is 1, the
   3981 ///    corresponding byte is written, otherwise it is not written.
   3982 ///
   3983 ///    To minimize caching, the data is flagged as non-temporal (unlikely to be
   3984 ///    used again soon). Exception and trap behavior for elements not selected
   3985 ///    for storage to memory are implementation dependent.
   3986 ///
   3987 /// \headerfile <x86intrin.h>
   3988 ///
   3989 /// This intrinsic corresponds to the <c> VMASKMOVDQU / MASKMOVDQU </c>
   3990 ///   instruction.
   3991 ///
   3992 /// \param __d
   3993 ///    A 128-bit integer vector containing the values to be moved.
   3994 /// \param __n
   3995 ///    A 128-bit integer vector containing the mask. The most significant bit of
   3996 ///    each byte represents the mask bits.
   3997 /// \param __p
   3998 ///    A pointer to an unaligned 128-bit memory location where the specified
   3999 ///    values are moved.
   4000 static __inline__ void __DEFAULT_FN_ATTRS _mm_maskmoveu_si128(__m128i __d,
   4001                                                               __m128i __n,
   4002                                                               char *__p) {
   4003   __builtin_ia32_maskmovdqu((__v16qi)__d, (__v16qi)__n, __p);
   4004 }
   4005 
   4006 /// Stores the lower 64 bits of a 128-bit integer vector of [2 x i64] to
   4007 ///    a memory location.
   4008 ///
   4009 /// \headerfile <x86intrin.h>
   4010 ///
   4011 /// This intrinsic corresponds to the <c> VMOVLPS / MOVLPS </c> instruction.
   4012 ///
   4013 /// \param __p
   4014 ///    A pointer to a 64-bit memory location that will receive the lower 64 bits
   4015 ///    of the integer vector parameter.
   4016 /// \param __a
   4017 ///    A 128-bit integer vector of [2 x i64]. The lower 64 bits contain the
   4018 ///    value to be stored.
   4019 static __inline__ void __DEFAULT_FN_ATTRS _mm_storel_epi64(__m128i_u *__p,
   4020                                                            __m128i __a) {
   4021   struct __mm_storel_epi64_struct {
   4022     long long __u;
   4023   } __attribute__((__packed__, __may_alias__));
   4024   ((struct __mm_storel_epi64_struct *)__p)->__u = __a[0];
   4025 }
   4026 
   4027 /// Stores a 128-bit floating point vector of [2 x double] to a 128-bit
   4028 ///    aligned memory location.
   4029 ///
   4030 ///    To minimize caching, the data is flagged as non-temporal (unlikely to be
   4031 ///    used again soon).
   4032 ///
   4033 /// \headerfile <x86intrin.h>
   4034 ///
   4035 /// This intrinsic corresponds to the <c> VMOVNTPS / MOVNTPS </c> instruction.
   4036 ///
   4037 /// \param __p
   4038 ///    A pointer to the 128-bit aligned memory location used to store the value.
   4039 /// \param __a
   4040 ///    A vector of [2 x double] containing the 64-bit values to be stored.
   4041 static __inline__ void __DEFAULT_FN_ATTRS _mm_stream_pd(void *__p,
   4042                                                         __m128d __a) {
   4043   __builtin_nontemporal_store((__v2df)__a, (__v2df *)__p);
   4044 }
   4045 
   4046 /// Stores a 128-bit integer vector to a 128-bit aligned memory location.
   4047 ///
   4048 ///    To minimize caching, the data is flagged as non-temporal (unlikely to be
   4049 ///    used again soon).
   4050 ///
   4051 /// \headerfile <x86intrin.h>
   4052 ///
   4053 /// This intrinsic corresponds to the <c> VMOVNTPS / MOVNTPS </c> instruction.
   4054 ///
   4055 /// \param __p
   4056 ///    A pointer to the 128-bit aligned memory location used to store the value.
   4057 /// \param __a
   4058 ///    A 128-bit integer vector containing the values to be stored.
   4059 static __inline__ void __DEFAULT_FN_ATTRS _mm_stream_si128(void *__p,
   4060                                                            __m128i __a) {
   4061   __builtin_nontemporal_store((__v2di)__a, (__v2di *)__p);
   4062 }
   4063 
   4064 /// Stores a 32-bit integer value in the specified memory location.
   4065 ///
   4066 ///    To minimize caching, the data is flagged as non-temporal (unlikely to be
   4067 ///    used again soon).
   4068 ///
   4069 /// \headerfile <x86intrin.h>
   4070 ///
   4071 /// This intrinsic corresponds to the <c> MOVNTI </c> instruction.
   4072 ///
   4073 /// \param __p
   4074 ///    A pointer to the 32-bit memory location used to store the value.
   4075 /// \param __a
   4076 ///    A 32-bit integer containing the value to be stored.
   4077 static __inline__ void
   4078     __attribute__((__always_inline__, __nodebug__, __target__("sse2")))
   4079     _mm_stream_si32(void *__p, int __a) {
   4080   __builtin_ia32_movnti((int *)__p, __a);
   4081 }
   4082 
   4083 #ifdef __x86_64__
   4084 /// Stores a 64-bit integer value in the specified memory location.
   4085 ///
   4086 ///    To minimize caching, the data is flagged as non-temporal (unlikely to be
   4087 ///    used again soon).
   4088 ///
   4089 /// \headerfile <x86intrin.h>
   4090 ///
   4091 /// This intrinsic corresponds to the <c> MOVNTIQ </c> instruction.
   4092 ///
   4093 /// \param __p
   4094 ///    A pointer to the 64-bit memory location used to store the value.
   4095 /// \param __a
   4096 ///    A 64-bit integer containing the value to be stored.
   4097 static __inline__ void
   4098     __attribute__((__always_inline__, __nodebug__, __target__("sse2")))
   4099     _mm_stream_si64(void *__p, long long __a) {
   4100   __builtin_ia32_movnti64((long long *)__p, __a);
   4101 }
   4102 #endif
   4103 
   4104 #if defined(__cplusplus)
   4105 extern "C" {
   4106 #endif
   4107 
   4108 /// The cache line containing \a __p is flushed and invalidated from all
   4109 ///    caches in the coherency domain.
   4110 ///
   4111 /// \headerfile <x86intrin.h>
   4112 ///
   4113 /// This intrinsic corresponds to the <c> CLFLUSH </c> instruction.
   4114 ///
   4115 /// \param __p
   4116 ///    A pointer to the memory location used to identify the cache line to be
   4117 ///    flushed.
   4118 void _mm_clflush(void const *__p);
   4119 
   4120 /// Forces strong memory ordering (serialization) between load
   4121 ///    instructions preceding this instruction and load instructions following
   4122 ///    this instruction, ensuring the system completes all previous loads before
   4123 ///    executing subsequent loads.
   4124 ///
   4125 /// \headerfile <x86intrin.h>
   4126 ///
   4127 /// This intrinsic corresponds to the <c> LFENCE </c> instruction.
   4128 ///
   4129 void _mm_lfence(void);
   4130 
   4131 /// Forces strong memory ordering (serialization) between load and store
   4132 ///    instructions preceding this instruction and load and store instructions
   4133 ///    following this instruction, ensuring that the system completes all
   4134 ///    previous memory accesses before executing subsequent memory accesses.
   4135 ///
   4136 /// \headerfile <x86intrin.h>
   4137 ///
   4138 /// This intrinsic corresponds to the <c> MFENCE </c> instruction.
   4139 ///
   4140 void _mm_mfence(void);
   4141 
   4142 #if defined(__cplusplus)
   4143 } // extern "C"
   4144 #endif
   4145 
   4146 /// Converts, with saturation, 16-bit signed integers from both 128-bit integer
   4147 ///    vector operands into 8-bit signed integers, and packs the results into
   4148 ///    the destination.
   4149 ///
   4150 ///    Positive values greater than 0x7F are saturated to 0x7F. Negative values
   4151 ///    less than 0x80 are saturated to 0x80.
   4152 ///
   4153 /// \headerfile <x86intrin.h>
   4154 ///
   4155 /// This intrinsic corresponds to the <c> VPACKSSWB / PACKSSWB </c> instruction.
   4156 ///
   4157 /// \param __a
   4158 ///   A 128-bit integer vector of [8 x i16]. The converted [8 x i8] values are
   4159 ///   written to the lower 64 bits of the result.
   4160 /// \param __b
   4161 ///   A 128-bit integer vector of [8 x i16]. The converted [8 x i8] values are
   4162 ///   written to the higher 64 bits of the result.
   4163 /// \returns A 128-bit vector of [16 x i8] containing the converted values.
   4164 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_packs_epi16(__m128i __a,
   4165                                                              __m128i __b) {
   4166   return (__m128i)__builtin_ia32_packsswb128((__v8hi)__a, (__v8hi)__b);
   4167 }
   4168 
   4169 /// Converts, with saturation, 32-bit signed integers from both 128-bit integer
   4170 ///    vector operands into 16-bit signed integers, and packs the results into
   4171 ///    the destination.
   4172 ///
   4173 ///    Positive values greater than 0x7FFF are saturated to 0x7FFF. Negative
   4174 ///    values less than 0x8000 are saturated to 0x8000.
   4175 ///
   4176 /// \headerfile <x86intrin.h>
   4177 ///
   4178 /// This intrinsic corresponds to the <c> VPACKSSDW / PACKSSDW </c> instruction.
   4179 ///
   4180 /// \param __a
   4181 ///    A 128-bit integer vector of [4 x i32]. The converted [4 x i16] values
   4182 ///    are written to the lower 64 bits of the result.
   4183 /// \param __b
   4184 ///    A 128-bit integer vector of [4 x i32]. The converted [4 x i16] values
   4185 ///    are written to the higher 64 bits of the result.
   4186 /// \returns A 128-bit vector of [8 x i16] containing the converted values.
   4187 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_packs_epi32(__m128i __a,
   4188                                                              __m128i __b) {
   4189   return (__m128i)__builtin_ia32_packssdw128((__v4si)__a, (__v4si)__b);
   4190 }
   4191 
   4192 /// Converts, with saturation, 16-bit signed integers from both 128-bit integer
   4193 ///    vector operands into 8-bit unsigned integers, and packs the results into
   4194 ///    the destination.
   4195 ///
   4196 ///    Values greater than 0xFF are saturated to 0xFF. Values less than 0x00
   4197 ///    are saturated to 0x00.
   4198 ///
   4199 /// \headerfile <x86intrin.h>
   4200 ///
   4201 /// This intrinsic corresponds to the <c> VPACKUSWB / PACKUSWB </c> instruction.
   4202 ///
   4203 /// \param __a
   4204 ///    A 128-bit integer vector of [8 x i16]. The converted [8 x i8] values are
   4205 ///    written to the lower 64 bits of the result.
   4206 /// \param __b
   4207 ///    A 128-bit integer vector of [8 x i16]. The converted [8 x i8] values are
   4208 ///    written to the higher 64 bits of the result.
   4209 /// \returns A 128-bit vector of [16 x i8] containing the converted values.
   4210 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_packus_epi16(__m128i __a,
   4211                                                               __m128i __b) {
   4212   return (__m128i)__builtin_ia32_packuswb128((__v8hi)__a, (__v8hi)__b);
   4213 }
   4214 
   4215 /// Extracts 16 bits from a 128-bit integer vector of [8 x i16], using
   4216 ///    the immediate-value parameter as a selector.
   4217 ///
   4218 /// \headerfile <x86intrin.h>
   4219 ///
   4220 /// \code
   4221 /// __m128i _mm_extract_epi16(__m128i a, const int imm);
   4222 /// \endcode
   4223 ///
   4224 /// This intrinsic corresponds to the <c> VPEXTRW / PEXTRW </c> instruction.
   4225 ///
   4226 /// \param a
   4227 ///    A 128-bit integer vector.
   4228 /// \param imm
   4229 ///    An immediate value. Bits [2:0] selects values from \a a to be assigned
   4230 ///    to bits[15:0] of the result. \n
   4231 ///    000: assign values from bits [15:0] of \a a. \n
   4232 ///    001: assign values from bits [31:16] of \a a. \n
   4233 ///    010: assign values from bits [47:32] of \a a. \n
   4234 ///    011: assign values from bits [63:48] of \a a. \n
   4235 ///    100: assign values from bits [79:64] of \a a. \n
   4236 ///    101: assign values from bits [95:80] of \a a. \n
   4237 ///    110: assign values from bits [111:96] of \a a. \n
   4238 ///    111: assign values from bits [127:112] of \a a.
   4239 /// \returns An integer, whose lower 16 bits are selected from the 128-bit
   4240 ///    integer vector parameter and the remaining bits are assigned zeros.
   4241 #define _mm_extract_epi16(a, imm)                                              \
   4242   ((int)(unsigned short)__builtin_ia32_vec_ext_v8hi((__v8hi)(__m128i)(a),      \
   4243                                                     (int)(imm)))
   4244 
   4245 /// Constructs a 128-bit integer vector by first making a copy of the
   4246 ///    128-bit integer vector parameter, and then inserting the lower 16 bits
   4247 ///    of an integer parameter into an offset specified by the immediate-value
   4248 ///    parameter.
   4249 ///
   4250 /// \headerfile <x86intrin.h>
   4251 ///
   4252 /// \code
   4253 /// __m128i _mm_insert_epi16(__m128i a, int b, const int imm);
   4254 /// \endcode
   4255 ///
   4256 /// This intrinsic corresponds to the <c> VPINSRW / PINSRW </c> instruction.
   4257 ///
   4258 /// \param a
   4259 ///    A 128-bit integer vector of [8 x i16]. This vector is copied to the
   4260 ///    result and then one of the eight elements in the result is replaced by
   4261 ///    the lower 16 bits of \a b.
   4262 /// \param b
   4263 ///    An integer. The lower 16 bits of this parameter are written to the
   4264 ///    result beginning at an offset specified by \a imm.
   4265 /// \param imm
   4266 ///    An immediate value specifying the bit offset in the result at which the
   4267 ///    lower 16 bits of \a b are written.
   4268 /// \returns A 128-bit integer vector containing the constructed values.
   4269 #define _mm_insert_epi16(a, b, imm)                                            \
   4270   ((__m128i)__builtin_ia32_vec_set_v8hi((__v8hi)(__m128i)(a), (int)(b),        \
   4271                                         (int)(imm)))
   4272 
   4273 /// Copies the values of the most significant bits from each 8-bit
   4274 ///    element in a 128-bit integer vector of [16 x i8] to create a 16-bit mask
   4275 ///    value, zero-extends the value, and writes it to the destination.
   4276 ///
   4277 /// \headerfile <x86intrin.h>
   4278 ///
   4279 /// This intrinsic corresponds to the <c> VPMOVMSKB / PMOVMSKB </c> instruction.
   4280 ///
   4281 /// \param __a
   4282 ///    A 128-bit integer vector containing the values with bits to be extracted.
   4283 /// \returns The most significant bits from each 8-bit element in \a __a,
   4284 ///    written to bits [15:0]. The other bits are assigned zeros.
   4285 static __inline__ int __DEFAULT_FN_ATTRS _mm_movemask_epi8(__m128i __a) {
   4286   return __builtin_ia32_pmovmskb128((__v16qi)__a);
   4287 }
   4288 
   4289 /// Constructs a 128-bit integer vector by shuffling four 32-bit
   4290 ///    elements of a 128-bit integer vector parameter, using the immediate-value
   4291 ///    parameter as a specifier.
   4292 ///
   4293 /// \headerfile <x86intrin.h>
   4294 ///
   4295 /// \code
   4296 /// __m128i _mm_shuffle_epi32(__m128i a, const int imm);
   4297 /// \endcode
   4298 ///
   4299 /// This intrinsic corresponds to the <c> VPSHUFD / PSHUFD </c> instruction.
   4300 ///
   4301 /// \param a
   4302 ///    A 128-bit integer vector containing the values to be copied.
   4303 /// \param imm
   4304 ///    An immediate value containing an 8-bit value specifying which elements to
   4305 ///    copy from a. The destinations within the 128-bit destination are assigned
   4306 ///    values as follows: \n
   4307 ///    Bits [1:0] are used to assign values to bits [31:0] of the result. \n
   4308 ///    Bits [3:2] are used to assign values to bits [63:32] of the result. \n
   4309 ///    Bits [5:4] are used to assign values to bits [95:64] of the result. \n
   4310 ///    Bits [7:6] are used to assign values to bits [127:96] of the result. \n
   4311 ///    Bit value assignments: \n
   4312 ///    00: assign values from bits [31:0] of \a a. \n
   4313 ///    01: assign values from bits [63:32] of \a a. \n
   4314 ///    10: assign values from bits [95:64] of \a a. \n
   4315 ///    11: assign values from bits [127:96] of \a a. \n
   4316 ///    Note: To generate a mask, you can use the \c _MM_SHUFFLE macro.
   4317 ///    <c>_MM_SHUFFLE(b6, b4, b2, b0)</c> can create an 8-bit mask of the form
   4318 ///    <c>[b6, b4, b2, b0]</c>.
   4319 /// \returns A 128-bit integer vector containing the shuffled values.
   4320 #define _mm_shuffle_epi32(a, imm)                                              \
   4321   ((__m128i)__builtin_ia32_pshufd((__v4si)(__m128i)(a), (int)(imm)))
   4322 
   4323 /// Constructs a 128-bit integer vector by shuffling four lower 16-bit
   4324 ///    elements of a 128-bit integer vector of [8 x i16], using the immediate
   4325 ///    value parameter as a specifier.
   4326 ///
   4327 /// \headerfile <x86intrin.h>
   4328 ///
   4329 /// \code
   4330 /// __m128i _mm_shufflelo_epi16(__m128i a, const int imm);
   4331 /// \endcode
   4332 ///
   4333 /// This intrinsic corresponds to the <c> VPSHUFLW / PSHUFLW </c> instruction.
   4334 ///
   4335 /// \param a
   4336 ///    A 128-bit integer vector of [8 x i16]. Bits [127:64] are copied to bits
   4337 ///    [127:64] of the result.
   4338 /// \param imm
   4339 ///    An 8-bit immediate value specifying which elements to copy from \a a. \n
   4340 ///    Bits[1:0] are used to assign values to bits [15:0] of the result. \n
   4341 ///    Bits[3:2] are used to assign values to bits [31:16] of the result. \n
   4342 ///    Bits[5:4] are used to assign values to bits [47:32] of the result. \n
   4343 ///    Bits[7:6] are used to assign values to bits [63:48] of the result. \n
   4344 ///    Bit value assignments: \n
   4345 ///    00: assign values from bits [15:0] of \a a. \n
   4346 ///    01: assign values from bits [31:16] of \a a. \n
   4347 ///    10: assign values from bits [47:32] of \a a. \n
   4348 ///    11: assign values from bits [63:48] of \a a. \n
   4349 ///    Note: To generate a mask, you can use the \c _MM_SHUFFLE macro.
   4350 ///    <c>_MM_SHUFFLE(b6, b4, b2, b0)</c> can create an 8-bit mask of the form
   4351 ///    <c>[b6, b4, b2, b0]</c>.
   4352 /// \returns A 128-bit integer vector containing the shuffled values.
   4353 #define _mm_shufflelo_epi16(a, imm)                                            \
   4354   ((__m128i)__builtin_ia32_pshuflw((__v8hi)(__m128i)(a), (int)(imm)))
   4355 
   4356 /// Constructs a 128-bit integer vector by shuffling four upper 16-bit
   4357 ///    elements of a 128-bit integer vector of [8 x i16], using the immediate
   4358 ///    value parameter as a specifier.
   4359 ///
   4360 /// \headerfile <x86intrin.h>
   4361 ///
   4362 /// \code
   4363 /// __m128i _mm_shufflehi_epi16(__m128i a, const int imm);
   4364 /// \endcode
   4365 ///
   4366 /// This intrinsic corresponds to the <c> VPSHUFHW / PSHUFHW </c> instruction.
   4367 ///
   4368 /// \param a
   4369 ///    A 128-bit integer vector of [8 x i16]. Bits [63:0] are copied to bits
   4370 ///    [63:0] of the result.
   4371 /// \param imm
   4372 ///    An 8-bit immediate value specifying which elements to copy from \a a. \n
   4373 ///    Bits[1:0] are used to assign values to bits [79:64] of the result. \n
   4374 ///    Bits[3:2] are used to assign values to bits [95:80] of the result. \n
   4375 ///    Bits[5:4] are used to assign values to bits [111:96] of the result. \n
   4376 ///    Bits[7:6] are used to assign values to bits [127:112] of the result. \n
   4377 ///    Bit value assignments: \n
   4378 ///    00: assign values from bits [79:64] of \a a. \n
   4379 ///    01: assign values from bits [95:80] of \a a. \n
   4380 ///    10: assign values from bits [111:96] of \a a. \n
   4381 ///    11: assign values from bits [127:112] of \a a. \n
   4382 ///    Note: To generate a mask, you can use the \c _MM_SHUFFLE macro.
   4383 ///    <c>_MM_SHUFFLE(b6, b4, b2, b0)</c> can create an 8-bit mask of the form
   4384 ///    <c>[b6, b4, b2, b0]</c>.
   4385 /// \returns A 128-bit integer vector containing the shuffled values.
   4386 #define _mm_shufflehi_epi16(a, imm)                                            \
   4387   ((__m128i)__builtin_ia32_pshufhw((__v8hi)(__m128i)(a), (int)(imm)))
   4388 
   4389 /// Unpacks the high-order (index 8-15) values from two 128-bit vectors
   4390 ///    of [16 x i8] and interleaves them into a 128-bit vector of [16 x i8].
   4391 ///
   4392 /// \headerfile <x86intrin.h>
   4393 ///
   4394 /// This intrinsic corresponds to the <c> VPUNPCKHBW / PUNPCKHBW </c>
   4395 ///   instruction.
   4396 ///
   4397 /// \param __a
   4398 ///    A 128-bit vector of [16 x i8].
   4399 ///    Bits [71:64] are written to bits [7:0] of the result. \n
   4400 ///    Bits [79:72] are written to bits [23:16] of the result. \n
   4401 ///    Bits [87:80] are written to bits [39:32] of the result. \n
   4402 ///    Bits [95:88] are written to bits [55:48] of the result. \n
   4403 ///    Bits [103:96] are written to bits [71:64] of the result. \n
   4404 ///    Bits [111:104] are written to bits [87:80] of the result. \n
   4405 ///    Bits [119:112] are written to bits [103:96] of the result. \n
   4406 ///    Bits [127:120] are written to bits [119:112] of the result.
   4407 /// \param __b
   4408 ///    A 128-bit vector of [16 x i8]. \n
   4409 ///    Bits [71:64] are written to bits [15:8] of the result. \n
   4410 ///    Bits [79:72] are written to bits [31:24] of the result. \n
   4411 ///    Bits [87:80] are written to bits [47:40] of the result. \n
   4412 ///    Bits [95:88] are written to bits [63:56] of the result. \n
   4413 ///    Bits [103:96] are written to bits [79:72] of the result. \n
   4414 ///    Bits [111:104] are written to bits [95:88] of the result. \n
   4415 ///    Bits [119:112] are written to bits [111:104] of the result. \n
   4416 ///    Bits [127:120] are written to bits [127:120] of the result.
   4417 /// \returns A 128-bit vector of [16 x i8] containing the interleaved values.
   4418 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_unpackhi_epi8(__m128i __a,
   4419                                                                __m128i __b) {
   4420   return (__m128i)__builtin_shufflevector(
   4421       (__v16qi)__a, (__v16qi)__b, 8, 16 + 8, 9, 16 + 9, 10, 16 + 10, 11,
   4422       16 + 11, 12, 16 + 12, 13, 16 + 13, 14, 16 + 14, 15, 16 + 15);
   4423 }
   4424 
   4425 /// Unpacks the high-order (index 4-7) values from two 128-bit vectors of
   4426 ///    [8 x i16] and interleaves them into a 128-bit vector of [8 x i16].
   4427 ///
   4428 /// \headerfile <x86intrin.h>
   4429 ///
   4430 /// This intrinsic corresponds to the <c> VPUNPCKHWD / PUNPCKHWD </c>
   4431 ///   instruction.
   4432 ///
   4433 /// \param __a
   4434 ///    A 128-bit vector of [8 x i16].
   4435 ///    Bits [79:64] are written to bits [15:0] of the result. \n
   4436 ///    Bits [95:80] are written to bits [47:32] of the result. \n
   4437 ///    Bits [111:96] are written to bits [79:64] of the result. \n
   4438 ///    Bits [127:112] are written to bits [111:96] of the result.
   4439 /// \param __b
   4440 ///    A 128-bit vector of [8 x i16].
   4441 ///    Bits [79:64] are written to bits [31:16] of the result. \n
   4442 ///    Bits [95:80] are written to bits [63:48] of the result. \n
   4443 ///    Bits [111:96] are written to bits [95:80] of the result. \n
   4444 ///    Bits [127:112] are written to bits [127:112] of the result.
   4445 /// \returns A 128-bit vector of [8 x i16] containing the interleaved values.
   4446 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_unpackhi_epi16(__m128i __a,
   4447                                                                 __m128i __b) {
   4448   return (__m128i)__builtin_shufflevector((__v8hi)__a, (__v8hi)__b, 4, 8 + 4, 5,
   4449                                           8 + 5, 6, 8 + 6, 7, 8 + 7);
   4450 }
   4451 
   4452 /// Unpacks the high-order (index 2,3) values from two 128-bit vectors of
   4453 ///    [4 x i32] and interleaves them into a 128-bit vector of [4 x i32].
   4454 ///
   4455 /// \headerfile <x86intrin.h>
   4456 ///
   4457 /// This intrinsic corresponds to the <c> VPUNPCKHDQ / PUNPCKHDQ </c>
   4458 ///   instruction.
   4459 ///
   4460 /// \param __a
   4461 ///    A 128-bit vector of [4 x i32]. \n
   4462 ///    Bits [95:64] are written to bits [31:0] of the destination. \n
   4463 ///    Bits [127:96] are written to bits [95:64] of the destination.
   4464 /// \param __b
   4465 ///    A 128-bit vector of [4 x i32]. \n
   4466 ///    Bits [95:64] are written to bits [64:32] of the destination. \n
   4467 ///    Bits [127:96] are written to bits [127:96] of the destination.
   4468 /// \returns A 128-bit vector of [4 x i32] containing the interleaved values.
   4469 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_unpackhi_epi32(__m128i __a,
   4470                                                                 __m128i __b) {
   4471   return (__m128i)__builtin_shufflevector((__v4si)__a, (__v4si)__b, 2, 4 + 2, 3,
   4472                                           4 + 3);
   4473 }
   4474 
   4475 /// Unpacks the high-order 64-bit elements from two 128-bit vectors of
   4476 ///    [2 x i64] and interleaves them into a 128-bit vector of [2 x i64].
   4477 ///
   4478 /// \headerfile <x86intrin.h>
   4479 ///
   4480 /// This intrinsic corresponds to the <c> VPUNPCKHQDQ / PUNPCKHQDQ </c>
   4481 ///   instruction.
   4482 ///
   4483 /// \param __a
   4484 ///    A 128-bit vector of [2 x i64]. \n
   4485 ///    Bits [127:64] are written to bits [63:0] of the destination.
   4486 /// \param __b
   4487 ///    A 128-bit vector of [2 x i64]. \n
   4488 ///    Bits [127:64] are written to bits [127:64] of the destination.
   4489 /// \returns A 128-bit vector of [2 x i64] containing the interleaved values.
   4490 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_unpackhi_epi64(__m128i __a,
   4491                                                                 __m128i __b) {
   4492   return (__m128i)__builtin_shufflevector((__v2di)__a, (__v2di)__b, 1, 2 + 1);
   4493 }
   4494 
   4495 /// Unpacks the low-order (index 0-7) values from two 128-bit vectors of
   4496 ///    [16 x i8] and interleaves them into a 128-bit vector of [16 x i8].
   4497 ///
   4498 /// \headerfile <x86intrin.h>
   4499 ///
   4500 /// This intrinsic corresponds to the <c> VPUNPCKLBW / PUNPCKLBW </c>
   4501 ///   instruction.
   4502 ///
   4503 /// \param __a
   4504 ///    A 128-bit vector of [16 x i8]. \n
   4505 ///    Bits [7:0] are written to bits [7:0] of the result. \n
   4506 ///    Bits [15:8] are written to bits [23:16] of the result. \n
   4507 ///    Bits [23:16] are written to bits [39:32] of the result. \n
   4508 ///    Bits [31:24] are written to bits [55:48] of the result. \n
   4509 ///    Bits [39:32] are written to bits [71:64] of the result. \n
   4510 ///    Bits [47:40] are written to bits [87:80] of the result. \n
   4511 ///    Bits [55:48] are written to bits [103:96] of the result. \n
   4512 ///    Bits [63:56] are written to bits [119:112] of the result.
   4513 /// \param __b
   4514 ///    A 128-bit vector of [16 x i8].
   4515 ///    Bits [7:0] are written to bits [15:8] of the result. \n
   4516 ///    Bits [15:8] are written to bits [31:24] of the result. \n
   4517 ///    Bits [23:16] are written to bits [47:40] of the result. \n
   4518 ///    Bits [31:24] are written to bits [63:56] of the result. \n
   4519 ///    Bits [39:32] are written to bits [79:72] of the result. \n
   4520 ///    Bits [47:40] are written to bits [95:88] of the result. \n
   4521 ///    Bits [55:48] are written to bits [111:104] of the result. \n
   4522 ///    Bits [63:56] are written to bits [127:120] of the result.
   4523 /// \returns A 128-bit vector of [16 x i8] containing the interleaved values.
   4524 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_unpacklo_epi8(__m128i __a,
   4525                                                                __m128i __b) {
   4526   return (__m128i)__builtin_shufflevector(
   4527       (__v16qi)__a, (__v16qi)__b, 0, 16 + 0, 1, 16 + 1, 2, 16 + 2, 3, 16 + 3, 4,
   4528       16 + 4, 5, 16 + 5, 6, 16 + 6, 7, 16 + 7);
   4529 }
   4530 
   4531 /// Unpacks the low-order (index 0-3) values from each of the two 128-bit
   4532 ///    vectors of [8 x i16] and interleaves them into a 128-bit vector of
   4533 ///    [8 x i16].
   4534 ///
   4535 /// \headerfile <x86intrin.h>
   4536 ///
   4537 /// This intrinsic corresponds to the <c> VPUNPCKLWD / PUNPCKLWD </c>
   4538 ///   instruction.
   4539 ///
   4540 /// \param __a
   4541 ///    A 128-bit vector of [8 x i16].
   4542 ///    Bits [15:0] are written to bits [15:0] of the result. \n
   4543 ///    Bits [31:16] are written to bits [47:32] of the result. \n
   4544 ///    Bits [47:32] are written to bits [79:64] of the result. \n
   4545 ///    Bits [63:48] are written to bits [111:96] of the result.
   4546 /// \param __b
   4547 ///    A 128-bit vector of [8 x i16].
   4548 ///    Bits [15:0] are written to bits [31:16] of the result. \n
   4549 ///    Bits [31:16] are written to bits [63:48] of the result. \n
   4550 ///    Bits [47:32] are written to bits [95:80] of the result. \n
   4551 ///    Bits [63:48] are written to bits [127:112] of the result.
   4552 /// \returns A 128-bit vector of [8 x i16] containing the interleaved values.
   4553 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_unpacklo_epi16(__m128i __a,
   4554                                                                 __m128i __b) {
   4555   return (__m128i)__builtin_shufflevector((__v8hi)__a, (__v8hi)__b, 0, 8 + 0, 1,
   4556                                           8 + 1, 2, 8 + 2, 3, 8 + 3);
   4557 }
   4558 
   4559 /// Unpacks the low-order (index 0,1) values from two 128-bit vectors of
   4560 ///    [4 x i32] and interleaves them into a 128-bit vector of [4 x i32].
   4561 ///
   4562 /// \headerfile <x86intrin.h>
   4563 ///
   4564 /// This intrinsic corresponds to the <c> VPUNPCKLDQ / PUNPCKLDQ </c>
   4565 ///   instruction.
   4566 ///
   4567 /// \param __a
   4568 ///    A 128-bit vector of [4 x i32]. \n
   4569 ///    Bits [31:0] are written to bits [31:0] of the destination. \n
   4570 ///    Bits [63:32] are written to bits [95:64] of the destination.
   4571 /// \param __b
   4572 ///    A 128-bit vector of [4 x i32]. \n
   4573 ///    Bits [31:0] are written to bits [64:32] of the destination. \n
   4574 ///    Bits [63:32] are written to bits [127:96] of the destination.
   4575 /// \returns A 128-bit vector of [4 x i32] containing the interleaved values.
   4576 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_unpacklo_epi32(__m128i __a,
   4577                                                                 __m128i __b) {
   4578   return (__m128i)__builtin_shufflevector((__v4si)__a, (__v4si)__b, 0, 4 + 0, 1,
   4579                                           4 + 1);
   4580 }
   4581 
   4582 /// Unpacks the low-order 64-bit elements from two 128-bit vectors of
   4583 ///    [2 x i64] and interleaves them into a 128-bit vector of [2 x i64].
   4584 ///
   4585 /// \headerfile <x86intrin.h>
   4586 ///
   4587 /// This intrinsic corresponds to the <c> VPUNPCKLQDQ / PUNPCKLQDQ </c>
   4588 ///   instruction.
   4589 ///
   4590 /// \param __a
   4591 ///    A 128-bit vector of [2 x i64]. \n
   4592 ///    Bits [63:0] are written to bits [63:0] of the destination. \n
   4593 /// \param __b
   4594 ///    A 128-bit vector of [2 x i64]. \n
   4595 ///    Bits [63:0] are written to bits [127:64] of the destination. \n
   4596 /// \returns A 128-bit vector of [2 x i64] containing the interleaved values.
   4597 static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_unpacklo_epi64(__m128i __a,
   4598                                                                 __m128i __b) {
   4599   return (__m128i)__builtin_shufflevector((__v2di)__a, (__v2di)__b, 0, 2 + 0);
   4600 }
   4601 
   4602 /// Returns the lower 64 bits of a 128-bit integer vector as a 64-bit
   4603 ///    integer.
   4604 ///
   4605 /// \headerfile <x86intrin.h>
   4606 ///
   4607 /// This intrinsic corresponds to the <c> MOVDQ2Q </c> instruction.
   4608 ///
   4609 /// \param __a
   4610 ///    A 128-bit integer vector operand. The lower 64 bits are moved to the
   4611 ///    destination.
   4612 /// \returns A 64-bit integer containing the lower 64 bits of the parameter.
   4613 static __inline__ __m64 __DEFAULT_FN_ATTRS_CONSTEXPR
   4614 _mm_movepi64_pi64(__m128i __a) {
   4615   return (__m64)__a[0];
   4616 }
   4617 
   4618 /// Moves the 64-bit operand to a 128-bit integer vector, zeroing the
   4619 ///    upper bits.
   4620 ///
   4621 /// \headerfile <x86intrin.h>
   4622 ///
   4623 /// This intrinsic corresponds to the <c> MOVD+VMOVQ </c> instruction.
   4624 ///
   4625 /// \param __a
   4626 ///    A 64-bit value.
   4627 /// \returns A 128-bit integer vector. The lower 64 bits contain the value from
   4628 ///    the operand. The upper 64 bits are assigned zeros.
   4629 static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
   4630 _mm_movpi64_epi64(__m64 __a) {
   4631   return __builtin_shufflevector((__v1di)__a, _mm_setzero_si64(), 0, 1);
   4632 }
   4633 
   4634 /// Moves the lower 64 bits of a 128-bit integer vector to a 128-bit
   4635 ///    integer vector, zeroing the upper bits.
   4636 ///
   4637 /// \headerfile <x86intrin.h>
   4638 ///
   4639 /// This intrinsic corresponds to the <c> VMOVQ / MOVQ </c> instruction.
   4640 ///
   4641 /// \param __a
   4642 ///    A 128-bit integer vector operand. The lower 64 bits are moved to the
   4643 ///    destination.
   4644 /// \returns A 128-bit integer vector. The lower 64 bits contain the value from
   4645 ///    the operand. The upper 64 bits are assigned zeros.
   4646 static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
   4647 _mm_move_epi64(__m128i __a) {
   4648   return __builtin_shufflevector((__v2di)__a, _mm_setzero_si128(), 0, 2);
   4649 }
   4650 
   4651 /// Unpacks the high-order 64-bit elements from two 128-bit vectors of
   4652 ///    [2 x double] and interleaves them into a 128-bit vector of [2 x
   4653 ///    double].
   4654 ///
   4655 /// \headerfile <x86intrin.h>
   4656 ///
   4657 /// This intrinsic corresponds to the <c> VUNPCKHPD / UNPCKHPD </c> instruction.
   4658 ///
   4659 /// \param __a
   4660 ///    A 128-bit vector of [2 x double]. \n
   4661 ///    Bits [127:64] are written to bits [63:0] of the destination.
   4662 /// \param __b
   4663 ///    A 128-bit vector of [2 x double]. \n
   4664 ///    Bits [127:64] are written to bits [127:64] of the destination.
   4665 /// \returns A 128-bit vector of [2 x double] containing the interleaved values.
   4666 static __inline__ __m128d __DEFAULT_FN_ATTRS_CONSTEXPR
   4667 _mm_unpackhi_pd(__m128d __a, __m128d __b) {
   4668   return __builtin_shufflevector((__v2df)__a, (__v2df)__b, 1, 2 + 1);
   4669 }
   4670 
   4671 /// Unpacks the low-order 64-bit elements from two 128-bit vectors
   4672 ///    of [2 x double] and interleaves them into a 128-bit vector of [2 x
   4673 ///    double].
   4674 ///
   4675 /// \headerfile <x86intrin.h>
   4676 ///
   4677 /// This intrinsic corresponds to the <c> VUNPCKLPD / UNPCKLPD </c> instruction.
   4678 ///
   4679 /// \param __a
   4680 ///    A 128-bit vector of [2 x double]. \n
   4681 ///    Bits [63:0] are written to bits [63:0] of the destination.
   4682 /// \param __b
   4683 ///    A 128-bit vector of [2 x double]. \n
   4684 ///    Bits [63:0] are written to bits [127:64] of the destination.
   4685 /// \returns A 128-bit vector of [2 x double] containing the interleaved values.
   4686 static __inline__ __m128d __DEFAULT_FN_ATTRS_CONSTEXPR
   4687 _mm_unpacklo_pd(__m128d __a, __m128d __b) {
   4688   return __builtin_shufflevector((__v2df)__a, (__v2df)__b, 0, 2 + 0);
   4689 }
   4690 
   4691 /// Extracts the sign bits of the double-precision values in the 128-bit
   4692 ///    vector of [2 x double], zero-extends the value, and writes it to the
   4693 ///    low-order bits of the destination.
   4694 ///
   4695 /// \headerfile <x86intrin.h>
   4696 ///
   4697 /// This intrinsic corresponds to the <c> VMOVMSKPD / MOVMSKPD </c> instruction.
   4698 ///
   4699 /// \param __a
   4700 ///    A 128-bit vector of [2 x double] containing the values with sign bits to
   4701 ///    be extracted.
   4702 /// \returns The sign bits from each of the double-precision elements in \a __a,
   4703 ///    written to bits [1:0]. The remaining bits are assigned values of zero.
   4704 static __inline__ int __DEFAULT_FN_ATTRS _mm_movemask_pd(__m128d __a) {
   4705   return __builtin_ia32_movmskpd((__v2df)__a);
   4706 }
   4707 
   4708 /// Constructs a 128-bit floating-point vector of [2 x double] from two
   4709 ///    128-bit vector parameters of [2 x double], using the immediate-value
   4710 ///     parameter as a specifier.
   4711 ///
   4712 /// \headerfile <x86intrin.h>
   4713 ///
   4714 /// \code
   4715 /// __m128d _mm_shuffle_pd(__m128d a, __m128d b, const int i);
   4716 /// \endcode
   4717 ///
   4718 /// This intrinsic corresponds to the <c> VSHUFPD / SHUFPD </c> instruction.
   4719 ///
   4720 /// \param a
   4721 ///    A 128-bit vector of [2 x double].
   4722 /// \param b
   4723 ///    A 128-bit vector of [2 x double].
   4724 /// \param i
   4725 ///    An 8-bit immediate value. The least significant two bits specify which
   4726 ///    elements to copy from \a a and \a b: \n
   4727 ///    Bit[0] = 0: lower element of \a a copied to lower element of result. \n
   4728 ///    Bit[0] = 1: upper element of \a a copied to lower element of result. \n
   4729 ///    Bit[1] = 0: lower element of \a b copied to upper element of result. \n
   4730 ///    Bit[1] = 1: upper element of \a b copied to upper element of result. \n
   4731 ///    Note: To generate a mask, you can use the \c _MM_SHUFFLE2 macro.
   4732 ///    <c>_MM_SHUFFLE2(b1, b0)</c> can create a 2-bit mask of the form
   4733 ///    <c>[b1, b0]</c>.
   4734 /// \returns A 128-bit vector of [2 x double] containing the shuffled values.
   4735 #define _mm_shuffle_pd(a, b, i)                                                \
   4736   ((__m128d)__builtin_ia32_shufpd((__v2df)(__m128d)(a), (__v2df)(__m128d)(b),  \
   4737                                   (int)(i)))
   4738 
   4739 /// Casts a 128-bit floating-point vector of [2 x double] into a 128-bit
   4740 ///    floating-point vector of [4 x float].
   4741 ///
   4742 /// \headerfile <x86intrin.h>
   4743 ///
   4744 /// This intrinsic has no corresponding instruction.
   4745 ///
   4746 /// \param __a
   4747 ///    A 128-bit floating-point vector of [2 x double].
   4748 /// \returns A 128-bit floating-point vector of [4 x float] containing the same
   4749 ///    bitwise pattern as the parameter.
   4750 static __inline__ __m128 __DEFAULT_FN_ATTRS_CONSTEXPR
   4751 _mm_castpd_ps(__m128d __a) {
   4752   return (__m128)__a;
   4753 }
   4754 
   4755 /// Casts a 128-bit floating-point vector of [2 x double] into a 128-bit
   4756 ///    integer vector.
   4757 ///
   4758 /// \headerfile <x86intrin.h>
   4759 ///
   4760 /// This intrinsic has no corresponding instruction.
   4761 ///
   4762 /// \param __a
   4763 ///    A 128-bit floating-point vector of [2 x double].
   4764 /// \returns A 128-bit integer vector containing the same bitwise pattern as the
   4765 ///    parameter.
   4766 static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
   4767 _mm_castpd_si128(__m128d __a) {
   4768   return (__m128i)__a;
   4769 }
   4770 
   4771 /// Casts a 128-bit floating-point vector of [4 x float] into a 128-bit
   4772 ///    floating-point vector of [2 x double].
   4773 ///
   4774 /// \headerfile <x86intrin.h>
   4775 ///
   4776 /// This intrinsic has no corresponding instruction.
   4777 ///
   4778 /// \param __a
   4779 ///    A 128-bit floating-point vector of [4 x float].
   4780 /// \returns A 128-bit floating-point vector of [2 x double] containing the same
   4781 ///    bitwise pattern as the parameter.
   4782 static __inline__ __m128d __DEFAULT_FN_ATTRS_CONSTEXPR
   4783 _mm_castps_pd(__m128 __a) {
   4784   return (__m128d)__a;
   4785 }
   4786 
   4787 /// Casts a 128-bit floating-point vector of [4 x float] into a 128-bit
   4788 ///    integer vector.
   4789 ///
   4790 /// \headerfile <x86intrin.h>
   4791 ///
   4792 /// This intrinsic has no corresponding instruction.
   4793 ///
   4794 /// \param __a
   4795 ///    A 128-bit floating-point vector of [4 x float].
   4796 /// \returns A 128-bit integer vector containing the same bitwise pattern as the
   4797 ///    parameter.
   4798 static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
   4799 _mm_castps_si128(__m128 __a) {
   4800   return (__m128i)__a;
   4801 }
   4802 
   4803 /// Casts a 128-bit integer vector into a 128-bit floating-point vector
   4804 ///    of [4 x float].
   4805 ///
   4806 /// \headerfile <x86intrin.h>
   4807 ///
   4808 /// This intrinsic has no corresponding instruction.
   4809 ///
   4810 /// \param __a
   4811 ///    A 128-bit integer vector.
   4812 /// \returns A 128-bit floating-point vector of [4 x float] containing the same
   4813 ///    bitwise pattern as the parameter.
   4814 static __inline__ __m128 __DEFAULT_FN_ATTRS_CONSTEXPR
   4815 _mm_castsi128_ps(__m128i __a) {
   4816   return (__m128)__a;
   4817 }
   4818 
   4819 /// Casts a 128-bit integer vector into a 128-bit floating-point vector
   4820 ///    of [2 x double].
   4821 ///
   4822 /// \headerfile <x86intrin.h>
   4823 ///
   4824 /// This intrinsic has no corresponding instruction.
   4825 ///
   4826 /// \param __a
   4827 ///    A 128-bit integer vector.
   4828 /// \returns A 128-bit floating-point vector of [2 x double] containing the same
   4829 ///    bitwise pattern as the parameter.
   4830 static __inline__ __m128d __DEFAULT_FN_ATTRS_CONSTEXPR
   4831 _mm_castsi128_pd(__m128i __a) {
   4832   return (__m128d)__a;
   4833 }
   4834 
   4835 /// Compares each of the corresponding double-precision values of two
   4836 ///    128-bit vectors of [2 x double], using the operation specified by the
   4837 ///    immediate integer operand.
   4838 ///
   4839 ///    Each comparison returns 0x0 for false, 0xFFFFFFFFFFFFFFFF for true.
   4840 ///    If either value in a comparison is NaN, comparisons that are ordered
   4841 ///    return false, and comparisons that are unordered return true.
   4842 ///
   4843 /// \headerfile <x86intrin.h>
   4844 ///
   4845 /// \code
   4846 /// __m128d _mm_cmp_pd(__m128d a, __m128d b, const int c);
   4847 /// \endcode
   4848 ///
   4849 /// This intrinsic corresponds to the <c> (V)CMPPD </c> instruction.
   4850 ///
   4851 /// \param a
   4852 ///    A 128-bit vector of [2 x double].
   4853 /// \param b
   4854 ///    A 128-bit vector of [2 x double].
   4855 /// \param c
   4856 ///    An immediate integer operand, with bits [4:0] specifying which comparison
   4857 ///    operation to use: \n
   4858 ///    0x00: Equal (ordered, non-signaling) \n
   4859 ///    0x01: Less-than (ordered, signaling) \n
   4860 ///    0x02: Less-than-or-equal (ordered, signaling) \n
   4861 ///    0x03: Unordered (non-signaling) \n
   4862 ///    0x04: Not-equal (unordered, non-signaling) \n
   4863 ///    0x05: Not-less-than (unordered, signaling) \n
   4864 ///    0x06: Not-less-than-or-equal (unordered, signaling) \n
   4865 ///    0x07: Ordered (non-signaling) \n
   4866 /// \returns A 128-bit vector of [2 x double] containing the comparison results.
   4867 #define _mm_cmp_pd(a, b, c)                                                    \
   4868   ((__m128d)__builtin_ia32_cmppd((__v2df)(__m128d)(a), (__v2df)(__m128d)(b),   \
   4869                                  (c)))
   4870 
   4871 /// Compares each of the corresponding scalar double-precision values of
   4872 ///    two 128-bit vectors of [2 x double], using the operation specified by the
   4873 ///    immediate integer operand.
   4874 ///
   4875 ///    Each comparison returns 0x0 for false, 0xFFFFFFFFFFFFFFFF for true.
   4876 ///    If either value in a comparison is NaN, comparisons that are ordered
   4877 ///    return false, and comparisons that are unordered return true.
   4878 ///
   4879 /// \headerfile <x86intrin.h>
   4880 ///
   4881 /// \code
   4882 /// __m128d _mm_cmp_sd(__m128d a, __m128d b, const int c);
   4883 /// \endcode
   4884 ///
   4885 /// This intrinsic corresponds to the <c> (V)CMPSD </c> instruction.
   4886 ///
   4887 /// \param a
   4888 ///    A 128-bit vector of [2 x double].
   4889 /// \param b
   4890 ///    A 128-bit vector of [2 x double].
   4891 /// \param c
   4892 ///    An immediate integer operand, with bits [4:0] specifying which comparison
   4893 ///    operation to use: \n
   4894 ///    0x00: Equal (ordered, non-signaling) \n
   4895 ///    0x01: Less-than (ordered, signaling) \n
   4896 ///    0x02: Less-than-or-equal (ordered, signaling) \n
   4897 ///    0x03: Unordered (non-signaling) \n
   4898 ///    0x04: Not-equal (unordered, non-signaling) \n
   4899 ///    0x05: Not-less-than (unordered, signaling) \n
   4900 ///    0x06: Not-less-than-or-equal (unordered, signaling) \n
   4901 ///    0x07: Ordered (non-signaling) \n
   4902 /// \returns A 128-bit vector of [2 x double] containing the comparison results.
   4903 #define _mm_cmp_sd(a, b, c)                                                    \
   4904   ((__m128d)__builtin_ia32_cmpsd((__v2df)(__m128d)(a), (__v2df)(__m128d)(b),   \
   4905                                  (c)))
   4906 
   4907 #if defined(__cplusplus)
   4908 extern "C" {
   4909 #endif
   4910 
   4911 /// Indicates that a spin loop is being executed for the purposes of
   4912 ///    optimizing power consumption during the loop.
   4913 ///
   4914 /// \headerfile <x86intrin.h>
   4915 ///
   4916 /// This intrinsic corresponds to the <c> PAUSE </c> instruction.
   4917 ///
   4918 void _mm_pause(void);
   4919 
   4920 #if defined(__cplusplus)
   4921 } // extern "C"
   4922 #endif
   4923 
   4924 #undef __anyext128
   4925 #undef __trunc64
   4926 #undef __DEFAULT_FN_ATTRS
   4927 #undef __DEFAULT_FN_ATTRS_CONSTEXPR
   4928 
   4929 #define _MM_SHUFFLE2(x, y) (((x) << 1) | (y))
   4930 
   4931 #define _MM_DENORMALS_ZERO_ON (0x0040U)
   4932 #define _MM_DENORMALS_ZERO_OFF (0x0000U)
   4933 
   4934 #define _MM_DENORMALS_ZERO_MASK (0x0040U)
   4935 
   4936 #define _MM_GET_DENORMALS_ZERO_MODE() (_mm_getcsr() & _MM_DENORMALS_ZERO_MASK)
   4937 #define _MM_SET_DENORMALS_ZERO_MODE(x)                                         \
   4938   (_mm_setcsr((_mm_getcsr() & ~_MM_DENORMALS_ZERO_MASK) | (x)))
   4939 
   4940 #endif /* __EMMINTRIN_H */