13#if !defined(__i386__) && !defined(__x86_64__)
14#error "This header is only meant to be used on x86 and x64 architecture"
20#if defined(__EVEX512__) && !defined(__AVX10_1_512__)
21#define __DEFAULT_FN_ATTRS \
22 __attribute__((__always_inline__, __nodebug__, \
23 __target__("sse4.1,no-evex512"), __min_vector_width__(128)))
25#define __DEFAULT_FN_ATTRS \
26 __attribute__((__always_inline__, __nodebug__, __target__("sse4.1"), \
27 __min_vector_width__(128)))
30#if defined(__cplusplus) && (__cplusplus >= 201103L)
31#define __DEFAULT_FN_ATTRS_CONSTEXPR __DEFAULT_FN_ATTRS constexpr
33#define __DEFAULT_FN_ATTRS_CONSTEXPR __DEFAULT_FN_ATTRS
37#define _MM_FROUND_TO_NEAREST_INT 0x00
38#define _MM_FROUND_TO_NEG_INF 0x01
39#define _MM_FROUND_TO_POS_INF 0x02
40#define _MM_FROUND_TO_ZERO 0x03
41#define _MM_FROUND_CUR_DIRECTION 0x04
43#define _MM_FROUND_RAISE_EXC 0x00
44#define _MM_FROUND_NO_EXC 0x08
46#define _MM_FROUND_NINT (_MM_FROUND_RAISE_EXC | _MM_FROUND_TO_NEAREST_INT)
47#define _MM_FROUND_FLOOR (_MM_FROUND_RAISE_EXC | _MM_FROUND_TO_NEG_INF)
48#define _MM_FROUND_CEIL (_MM_FROUND_RAISE_EXC | _MM_FROUND_TO_POS_INF)
49#define _MM_FROUND_TRUNC (_MM_FROUND_RAISE_EXC | _MM_FROUND_TO_ZERO)
50#define _MM_FROUND_RINT (_MM_FROUND_RAISE_EXC | _MM_FROUND_CUR_DIRECTION)
51#define _MM_FROUND_NEARBYINT (_MM_FROUND_NO_EXC | _MM_FROUND_CUR_DIRECTION)
68#define _mm_ceil_ps(X) _mm_round_ps((X), _MM_FROUND_CEIL)
85#define _mm_ceil_pd(X) _mm_round_pd((X), _MM_FROUND_CEIL)
110#define _mm_ceil_ss(X, Y) _mm_round_ss((X), (Y), _MM_FROUND_CEIL)
135#define _mm_ceil_sd(X, Y) _mm_round_sd((X), (Y), _MM_FROUND_CEIL)
152#define _mm_floor_ps(X) _mm_round_ps((X), _MM_FROUND_FLOOR)
169#define _mm_floor_pd(X) _mm_round_pd((X), _MM_FROUND_FLOOR)
194#define _mm_floor_ss(X, Y) _mm_round_ss((X), (Y), _MM_FROUND_FLOOR)
219#define _mm_floor_sd(X, Y) _mm_round_sd((X), (Y), _MM_FROUND_FLOOR)
251#define _mm_round_ps(X, M) \
252 ((__m128)__builtin_ia32_roundps((__v4sf)(__m128)(X), (M)))
292#define _mm_round_ss(X, Y, M) \
293 ((__m128)__builtin_ia32_roundss((__v4sf)(__m128)(X), (__v4sf)(__m128)(Y), \
326#define _mm_round_pd(X, M) \
327 ((__m128d)__builtin_ia32_roundpd((__v2df)(__m128d)(X), (M)))
367#define _mm_round_sd(X, Y, M) \
368 ((__m128d)__builtin_ia32_roundsd((__v2df)(__m128d)(X), (__v2df)(__m128d)(Y), \
396#define _mm_blend_pd(V1, V2, M) \
397 ((__m128d)__builtin_ia32_blendpd((__v2df)(__m128d)(V1), \
398 (__v2df)(__m128d)(V2), (int)(M)))
424#define _mm_blend_ps(V1, V2, M) \
425 ((__m128)__builtin_ia32_blendps((__v4sf)(__m128)(V1), (__v4sf)(__m128)(V2), \
451 return (__m128d)__builtin_ia32_blendvpd((__v2df)__V1, (__v2df)__V2,
478 return (__m128)__builtin_ia32_blendvps((__v4sf)__V1, (__v4sf)__V2,
505 return (__m128i)__builtin_ia32_pblendvb128((__v16qi)__V1, (__v16qi)__V2,
533#define _mm_blend_epi16(V1, V2, M) \
534 ((__m128i)__builtin_ia32_pblendw128((__v8hi)(__m128i)(V1), \
535 (__v8hi)(__m128i)(V2), (int)(M)))
553 return (__m128i)((__v4su)__V1 * (__v4su)__V2);
572 return (__m128i)__builtin_ia32_pmuldq128((__v4si)__V1, (__v4si)__V2);
608#define _mm_dp_ps(X, Y, M) \
609 ((__m128)__builtin_ia32_dpps((__v4sf)(__m128)(X), (__v4sf)(__m128)(Y), (M)))
642#define _mm_dp_pd(X, Y, M) \
643 ((__m128d)__builtin_ia32_dppd((__v2df)(__m128d)(X), (__v2df)(__m128d)(Y), \
661 return (__m128i)__builtin_nontemporal_load((
const __v2di *)__V);
680 return (__m128i)__builtin_elementwise_min((__v16qs)__V1, (__v16qs)__V2);
698 return (__m128i)__builtin_elementwise_max((__v16qs)__V1, (__v16qs)__V2);
716 return (__m128i)__builtin_elementwise_min((__v8hu)__V1, (__v8hu)__V2);
734 return (__m128i)__builtin_elementwise_max((__v8hu)__V1, (__v8hu)__V2);
752 return (__m128i)__builtin_elementwise_min((__v4si)__V1, (__v4si)__V2);
770 return (__m128i)__builtin_elementwise_max((__v4si)__V1, (__v4si)__V2);
788 return (__m128i)__builtin_elementwise_min((__v4su)__V1, (__v4su)__V2);
806 return (__m128i)__builtin_elementwise_max((__v4su)__V1, (__v4su)__V2);
850#define _mm_insert_ps(X, Y, N) __builtin_ia32_insertps128((X), (Y), (N))
874#define _mm_extract_ps(X, N) \
875 __builtin_bit_cast( \
876 int, __builtin_ia32_vec_ext_v4sf((__v4sf)(__m128)(X), (int)(N)))
880#define _MM_EXTRACT_FLOAT(D, X, N) \
882 (D) = __builtin_ia32_vec_ext_v4sf((__v4sf)(__m128)(X), (int)(N)); \
887#define _MM_MK_INSERTPS_NDX(X, Y, Z) (((X) << 6) | ((Y) << 4) | (Z))
890#define _MM_PICK_OUT_PS(X, N) \
891 _mm_insert_ps(_mm_setzero_ps(), (X), _MM_MK_INSERTPS_NDX((N), 0, 0x0e))
934#define _mm_insert_epi8(X, I, N) \
935 ((__m128i)__builtin_ia32_vec_set_v16qi((__v16qi)(__m128i)(X), (int)(I), \
966#define _mm_insert_epi32(X, I, N) \
967 ((__m128i)__builtin_ia32_vec_set_v4si((__v4si)(__m128i)(X), (int)(I), \
997#define _mm_insert_epi64(X, I, N) \
998 ((__m128i)__builtin_ia32_vec_set_v2di((__v2di)(__m128i)(X), (long long)(I), \
1040#define _mm_extract_epi8(X, N) \
1041 ((int)(unsigned char)__builtin_ia32_vec_ext_v16qi((__v16qi)(__m128i)(X), \
1066#define _mm_extract_epi32(X, N) \
1067 ((int)__builtin_ia32_vec_ext_v4si((__v4si)(__m128i)(X), (int)(N)))
1089#define _mm_extract_epi64(X, N) \
1090 ((long long)__builtin_ia32_vec_ext_v2di((__v2di)(__m128i)(X), (int)(N)))
1107 return __builtin_ia32_ptestz128((__v2di)__M, (__v2di)__V);
1124 return __builtin_ia32_ptestc128((__v2di)__M, (__v2di)__V);
1142 return __builtin_ia32_ptestnzc128((__v2di)__M, (__v2di)__V);
1160#define _mm_test_all_ones(V) _mm_testc_si128((V), _mm_set1_epi32(-1))
1179#define _mm_test_mix_ones_zeros(M, V) _mm_testnzc_si128((M), (V))
1197#define _mm_test_all_zeros(M, V) _mm_testz_si128((M), (V))
1216 return (__m128i)((__v2di)__V1 == (__v2di)__V2);
1237 return (__m128i) __builtin_convertvector(
1238 __builtin_shufflevector((__v16qs)__V, (__v16qs)__V, 0, 1, 2, 3, 4, 5, 6,
1260 return (__m128i) __builtin_convertvector(
1261 __builtin_shufflevector((__v16qs)__V, (__v16qs)__V, 0, 1, 2, 3), __v4si);
1281 return (__m128i) __builtin_convertvector(
1282 __builtin_shufflevector((__v16qs)__V, (__v16qs)__V, 0, 1), __v2di);
1300 return (__m128i) __builtin_convertvector(
1301 __builtin_shufflevector((__v8hi)__V, (__v8hi)__V, 0, 1, 2, 3), __v4si);
1319 return (__m128i) __builtin_convertvector(
1320 __builtin_shufflevector((__v8hi)__V, (__v8hi)__V, 0, 1), __v2di);
1338 return (__m128i) __builtin_convertvector(
1339 __builtin_shufflevector((__v4si)__V, (__v4si)__V, 0, 1), __v2di);
1358 return (__m128i) __builtin_convertvector(
1359 __builtin_shufflevector((__v16qu)__V, (__v16qu)__V, 0, 1, 2, 3, 4, 5, 6,
1379 return (__m128i) __builtin_convertvector(
1380 __builtin_shufflevector((__v16qu)__V, (__v16qu)__V, 0, 1, 2, 3), __v4si);
1398 return (__m128i) __builtin_convertvector(
1399 __builtin_shufflevector((__v16qu)__V, (__v16qu)__V, 0, 1), __v2di);
1417 return (__m128i) __builtin_convertvector(
1418 __builtin_shufflevector((__v8hu)__V, (__v8hu)__V, 0, 1, 2, 3), __v4si);
1436 return (__m128i) __builtin_convertvector(
1437 __builtin_shufflevector((__v8hu)__V, (__v8hu)__V, 0, 1), __v2di);
1455 return (__m128i) __builtin_convertvector(
1456 __builtin_shufflevector((__v4su)__V, (__v4su)__V, 0, 1), __v2di);
1480 return (__m128i)__builtin_ia32_packusdw128((__v4si)__V1, (__v4si)__V2);
1519#define _mm_mpsadbw_epu8(X, Y, M) \
1520 ((__m128i)__builtin_ia32_mpsadbw128((__v16qi)(__m128i)(X), \
1521 (__v16qi)(__m128i)(Y), (M)))
1537 return (__m128i)__builtin_ia32_phminposuw128((__v8hi)__V);
1545#undef __DEFAULT_FN_ATTRS
1546#define __DEFAULT_FN_ATTRS \
1547 __attribute__((__always_inline__, __nodebug__, __target__("sse4.2")))
1550#define _SIDD_UBYTE_OPS 0x00
1551#define _SIDD_UWORD_OPS 0x01
1552#define _SIDD_SBYTE_OPS 0x02
1553#define _SIDD_SWORD_OPS 0x03
1556#define _SIDD_CMP_EQUAL_ANY 0x00
1557#define _SIDD_CMP_RANGES 0x04
1558#define _SIDD_CMP_EQUAL_EACH 0x08
1559#define _SIDD_CMP_EQUAL_ORDERED 0x0c
1562#define _SIDD_POSITIVE_POLARITY 0x00
1563#define _SIDD_NEGATIVE_POLARITY 0x10
1564#define _SIDD_MASKED_POSITIVE_POLARITY 0x20
1565#define _SIDD_MASKED_NEGATIVE_POLARITY 0x30
1568#define _SIDD_LEAST_SIGNIFICANT 0x00
1569#define _SIDD_MOST_SIGNIFICANT 0x40
1572#define _SIDD_BIT_MASK 0x00
1573#define _SIDD_UNIT_MASK 0x40
1628#define _mm_cmpistrm(A, B, M) \
1629 ((__m128i)__builtin_ia32_pcmpistrm128((__v16qi)(__m128i)(A), \
1630 (__v16qi)(__m128i)(B), (int)(M)))
1682#define _mm_cmpistri(A, B, M) \
1683 ((int)__builtin_ia32_pcmpistri128((__v16qi)(__m128i)(A), \
1684 (__v16qi)(__m128i)(B), (int)(M)))
1742#define _mm_cmpestrm(A, LA, B, LB, M) \
1743 ((__m128i)__builtin_ia32_pcmpestrm128((__v16qi)(__m128i)(A), (int)(LA), \
1744 (__v16qi)(__m128i)(B), (int)(LB), \
1801#define _mm_cmpestri(A, LA, B, LB, M) \
1802 ((int)__builtin_ia32_pcmpestri128((__v16qi)(__m128i)(A), (int)(LA), \
1803 (__v16qi)(__m128i)(B), (int)(LB), \
1853#define _mm_cmpistra(A, B, M) \
1854 ((int)__builtin_ia32_pcmpistria128((__v16qi)(__m128i)(A), \
1855 (__v16qi)(__m128i)(B), (int)(M)))
1902#define _mm_cmpistrc(A, B, M) \
1903 ((int)__builtin_ia32_pcmpistric128((__v16qi)(__m128i)(A), \
1904 (__v16qi)(__m128i)(B), (int)(M)))
1950#define _mm_cmpistro(A, B, M) \
1951 ((int)__builtin_ia32_pcmpistrio128((__v16qi)(__m128i)(A), \
1952 (__v16qi)(__m128i)(B), (int)(M)))
2000#define _mm_cmpistrs(A, B, M) \
2001 ((int)__builtin_ia32_pcmpistris128((__v16qi)(__m128i)(A), \
2002 (__v16qi)(__m128i)(B), (int)(M)))
2050#define _mm_cmpistrz(A, B, M) \
2051 ((int)__builtin_ia32_pcmpistriz128((__v16qi)(__m128i)(A), \
2052 (__v16qi)(__m128i)(B), (int)(M)))
2104#define _mm_cmpestra(A, LA, B, LB, M) \
2105 ((int)__builtin_ia32_pcmpestria128((__v16qi)(__m128i)(A), (int)(LA), \
2106 (__v16qi)(__m128i)(B), (int)(LB), \
2158#define _mm_cmpestrc(A, LA, B, LB, M) \
2159 ((int)__builtin_ia32_pcmpestric128((__v16qi)(__m128i)(A), (int)(LA), \
2160 (__v16qi)(__m128i)(B), (int)(LB), \
2211#define _mm_cmpestro(A, LA, B, LB, M) \
2212 ((int)__builtin_ia32_pcmpestrio128((__v16qi)(__m128i)(A), (int)(LA), \
2213 (__v16qi)(__m128i)(B), (int)(LB), \
2266#define _mm_cmpestrs(A, LA, B, LB, M) \
2267 ((int)__builtin_ia32_pcmpestris128((__v16qi)(__m128i)(A), (int)(LA), \
2268 (__v16qi)(__m128i)(B), (int)(LB), \
2320#define _mm_cmpestrz(A, LA, B, LB, M) \
2321 ((int)__builtin_ia32_pcmpestriz128((__v16qi)(__m128i)(A), (int)(LA), \
2322 (__v16qi)(__m128i)(B), (int)(LB), \
2343 return (__m128i)((__v2di)__V1 > (__v2di)__V2);
2346#undef __DEFAULT_FN_ATTRS
2347#undef __DEFAULT_FN_ATTRS_CONSTEXPR
static __inline__ __m128d __DEFAULT_FN_ATTRS _mm_blendv_pd(__m128d __V1, __m128d __V2, __m128d __M)
Returns a 128-bit vector of [2 x double] where the values are selected from either the first or secon...
static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR _mm_mul_epi32(__m128i __V1, __m128i __V2)
Multiplies corresponding even-indexed elements of two 128-bit vectors of [4 x i32] and returns a 128-...
static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_min_epu16(__m128i __V1, __m128i __V2)
Compares the corresponding elements of two 128-bit vectors of [8 x u16] and returns a 128-bit vector ...
static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_stream_load_si128(const void *__V)
Loads integer values from a 128-bit aligned memory location to a 128-bit integer vector.
static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR _mm_cmpgt_epi64(__m128i __V1, __m128i __V2)
Compares each of the corresponding 64-bit values of the 128-bit integer vectors to determine if the v...
static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_min_epi8(__m128i __V1, __m128i __V2)
Compares the corresponding elements of two 128-bit vectors of [16 x i8] and returns a 128-bit vector ...
static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR _mm_cmpeq_epi64(__m128i __V1, __m128i __V2)
Compares each of the corresponding 64-bit values of the 128-bit integer vectors for equality.
static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_max_epu32(__m128i __V1, __m128i __V2)
Compares the corresponding elements of two 128-bit vectors of [4 x u32] and returns a 128-bit vector ...
#define __DEFAULT_FN_ATTRS
static __inline__ __m128 __DEFAULT_FN_ATTRS _mm_blendv_ps(__m128 __V1, __m128 __V2, __m128 __M)
Returns a 128-bit vector of [4 x float] where the values are selected from either the first or second...
static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR _mm_cvtepu8_epi16(__m128i __V)
Zero-extends each of the lower eight 8-bit integer elements of a 128-bit vector of [16 x i8] to 16-bi...
static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR _mm_cvtepu16_epi64(__m128i __V)
Zero-extends each of the lower two 16-bit integer elements of a 128-bit integer vector of [8 x i16] t...
static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_packus_epi32(__m128i __V1, __m128i __V2)
Converts, with saturation, 32-bit signed integers from both 128-bit integer vector operands into 16-b...
static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_min_epi32(__m128i __V1, __m128i __V2)
Compares the corresponding elements of two 128-bit vectors of [4 x i32] and returns a 128-bit vector ...
static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR _mm_cvtepu32_epi64(__m128i __V)
Zero-extends each of the lower two 32-bit integer elements of a 128-bit integer vector of [4 x i32] t...
static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR _mm_cvtepi8_epi32(__m128i __V)
Sign-extends each of the lower four 8-bit integer elements of a 128-bit vector of [16 x i8] to 32-bit...
static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR _mm_cvtepi16_epi64(__m128i __V)
Sign-extends each of the lower two 16-bit integer elements of a 128-bit integer vector of [8 x i16] t...
#define __DEFAULT_FN_ATTRS_CONSTEXPR
static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR _mm_cvtepu8_epi32(__m128i __V)
Zero-extends each of the lower four 8-bit integer elements of a 128-bit vector of [16 x i8] to 32-bit...
static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR _mm_cvtepi8_epi64(__m128i __V)
Sign-extends each of the lower two 8-bit integer elements of a 128-bit integer vector of [16 x i8] to...
static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_max_epi8(__m128i __V1, __m128i __V2)
Compares the corresponding elements of two 128-bit vectors of [16 x i8] and returns a 128-bit vector ...
static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_max_epu16(__m128i __V1, __m128i __V2)
Compares the corresponding elements of two 128-bit vectors of [8 x u16] and returns a 128-bit vector ...
static __inline__ int __DEFAULT_FN_ATTRS _mm_testnzc_si128(__m128i __M, __m128i __V)
Tests whether the specified bits in a 128-bit integer vector are neither all zeros nor all ones.
static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_max_epi32(__m128i __V1, __m128i __V2)
Compares the corresponding elements of two 128-bit vectors of [4 x i32] and returns a 128-bit vector ...
static __inline__ int __DEFAULT_FN_ATTRS _mm_testc_si128(__m128i __M, __m128i __V)
Tests whether the specified bits in a 128-bit integer vector are all ones.
static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR _mm_mullo_epi32(__m128i __V1, __m128i __V2)
Multiples corresponding elements of two 128-bit vectors of [4 x i32] and returns the lower 32 bits of...
static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR _mm_cvtepi16_epi32(__m128i __V)
Sign-extends each of the lower four 16-bit integer elements of a 128-bit integer vector of [8 x i16] ...
static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR _mm_cvtepi32_epi64(__m128i __V)
Sign-extends each of the lower two 32-bit integer elements of a 128-bit integer vector of [4 x i32] t...
static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR _mm_cvtepu16_epi32(__m128i __V)
Zero-extends each of the lower four 16-bit integer elements of a 128-bit integer vector of [8 x i16] ...
static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_min_epu32(__m128i __V1, __m128i __V2)
Compares the corresponding elements of two 128-bit vectors of [4 x u32] and returns a 128-bit vector ...
static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR _mm_cvtepi8_epi16(__m128i __V)
Sign-extends each of the lower eight 8-bit integer elements of a 128-bit vector of [16 x i8] to 16-bi...
static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR _mm_cvtepu8_epi64(__m128i __V)
Zero-extends each of the lower two 8-bit integer elements of a 128-bit integer vector of [16 x i8] to...
static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_minpos_epu16(__m128i __V)
Finds the minimum unsigned 16-bit element in the input 128-bit vector of [8 x u16] and returns it and...
static __inline__ int __DEFAULT_FN_ATTRS _mm_testz_si128(__m128i __M, __m128i __V)
Tests whether the specified bits in a 128-bit integer vector are all zeros.
static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_blendv_epi8(__m128i __V1, __m128i __V2, __m128i __M)
Returns a 128-bit vector of [16 x i8] where the values are selected from either of the first or secon...