Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 36 additions & 8 deletions clang/lib/Headers/avx512ifmavlintrin.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@

#endif

#if !(defined(__AVXIFMA__) || defined(__AVX512IFMA__))
#define _mm_madd52hi_epu64(X, Y, Z) \
((__m128i)__builtin_ia32_vpmadd52huq128((__v2di)(X), (__v2di)(Y), \
(__v2di)(Z)))
Expand All @@ -52,56 +53,83 @@
#define _mm256_madd52lo_epu64(X, Y, Z) \
((__m256i)__builtin_ia32_vpmadd52luq256((__v4di)(X), (__v4di)(Y), \
(__v4di)(Z)))
#endif

#if defined(__AVX512IFMA__)
static __inline__ __m128i __DEFAULT_FN_ATTRS128
_mm_madd52hi_epu64(__m128i __X, __m128i __Y, __m128i __Z) {
return (__m128i)__builtin_ia32_vpmadd52huq128((__v2di)__X, (__v2di)__Y,
(__v2di)__Z);
}

static __inline__ __m256i __DEFAULT_FN_ATTRS256
_mm256_madd52hi_epu64(__m256i __X, __m256i __Y, __m256i __Z) {
return (__m256i)__builtin_ia32_vpmadd52huq256((__v4di)__X, (__v4di)__Y,
(__v4di)__Z);
}

static __inline__ __m128i __DEFAULT_FN_ATTRS128
_mm_madd52lo_epu64(__m128i __X, __m128i __Y, __m128i __Z) {
return (__m128i)__builtin_ia32_vpmadd52luq128((__v2di)__X, (__v2di)__Y,
(__v2di)__Z);
}

static __inline__ __m256i __DEFAULT_FN_ATTRS256
_mm256_madd52lo_epu64(__m256i __X, __m256i __Y, __m256i __Z) {
return (__m256i)__builtin_ia32_vpmadd52luq256((__v4di)__X, (__v4di)__Y,
(__v4di)__Z);
}
#endif

static __inline__ __m128i __DEFAULT_FN_ATTRS128
_mm_mask_madd52hi_epu64(__m128i __W, __mmask8 __M, __m128i __X, __m128i __Y) {
return (__m128i)__builtin_ia32_selectq_128(
__M, (__v2di)_mm_madd52hi_epu64(__W, __X, __Y), (__v2di)__W);
__M, (__v2di)__builtin_ia32_vpmadd52huq128(__W, __X, __Y), (__v2di)__W);
}

static __inline__ __m128i __DEFAULT_FN_ATTRS128
_mm_maskz_madd52hi_epu64(__mmask8 __M, __m128i __X, __m128i __Y, __m128i __Z) {
return (__m128i)__builtin_ia32_selectq_128(
__M, (__v2di)_mm_madd52hi_epu64(__X, __Y, __Z),
__M, (__v2di)__builtin_ia32_vpmadd52huq128(__X, __Y, __Z),
(__v2di)_mm_setzero_si128());
}

static __inline__ __m256i __DEFAULT_FN_ATTRS256 _mm256_mask_madd52hi_epu64(
__m256i __W, __mmask8 __M, __m256i __X, __m256i __Y) {
return (__m256i)__builtin_ia32_selectq_256(
__M, (__v4di)_mm256_madd52hi_epu64(__W, __X, __Y), (__v4di)__W);
__M, (__v4di)__builtin_ia32_vpmadd52huq256(__W, __X, __Y), (__v4di)__W);
}

static __inline__ __m256i __DEFAULT_FN_ATTRS256 _mm256_maskz_madd52hi_epu64(
__mmask8 __M, __m256i __X, __m256i __Y, __m256i __Z) {
return (__m256i)__builtin_ia32_selectq_256(
__M, (__v4di)_mm256_madd52hi_epu64(__X, __Y, __Z),
__M, (__v4di)__builtin_ia32_vpmadd52huq256(__X, __Y, __Z),
(__v4di)_mm256_setzero_si256());
}

static __inline__ __m128i __DEFAULT_FN_ATTRS128
_mm_mask_madd52lo_epu64(__m128i __W, __mmask8 __M, __m128i __X, __m128i __Y) {
return (__m128i)__builtin_ia32_selectq_128(
__M, (__v2di)_mm_madd52lo_epu64(__W, __X, __Y), (__v2di)__W);
__M, (__v2di)__builtin_ia32_vpmadd52luq128(__W, __X, __Y), (__v2di)__W);
}

static __inline__ __m128i __DEFAULT_FN_ATTRS128
_mm_maskz_madd52lo_epu64(__mmask8 __M, __m128i __X, __m128i __Y, __m128i __Z) {
return (__m128i)__builtin_ia32_selectq_128(
__M, (__v2di)_mm_madd52lo_epu64(__X, __Y, __Z),
__M, (__v2di)__builtin_ia32_vpmadd52luq128(__X, __Y, __Z),
(__v2di)_mm_setzero_si128());
}

static __inline__ __m256i __DEFAULT_FN_ATTRS256 _mm256_mask_madd52lo_epu64(
__m256i __W, __mmask8 __M, __m256i __X, __m256i __Y) {
return (__m256i)__builtin_ia32_selectq_256(
__M, (__v4di)_mm256_madd52lo_epu64(__W, __X, __Y), (__v4di)__W);
__M, (__v4di)__builtin_ia32_vpmadd52luq256(__W, __X, __Y), (__v4di)__W);
}

static __inline__ __m256i __DEFAULT_FN_ATTRS256 _mm256_maskz_madd52lo_epu64(
__mmask8 __M, __m256i __X, __m256i __Y, __m256i __Z) {
return (__m256i)__builtin_ia32_selectq_256(
__M, (__v4di)_mm256_madd52lo_epu64(__X, __Y, __Z),
__M, (__v4di)__builtin_ia32_vpmadd52luq256(__X, __Y, __Z),
(__v4di)_mm256_setzero_si256());
}

Expand Down
7 changes: 7 additions & 0 deletions clang/lib/Headers/avxifmaintrin.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,13 @@
__min_vector_width__(256)))
#endif

#if !defined(__AVX512IFMA__) && defined(__AVXIFMA__)
#define _mm_madd52hi_epu64(X, Y, Z) _mm_madd52hi_avx_epu64(X, Y, Z)
#define _mm_madd52lo_epu64(X, Y, Z) _mm_madd52lo_avx_epu64(X, Y, Z)
#define _mm256_madd52hi_epu64(X, Y, Z) _mm256_madd52hi_avx_epu64(X, Y, Z)
#define _mm256_madd52lo_epu64(X, Y, Z) _mm256_madd52lo_avx_epu64(X, Y, Z)
#endif

// must vex-encoding

/// Multiply packed unsigned 52-bit integers in each 64-bit element of \a __Y
Expand Down