[Headers][X86] Allow _mm_cmov_si128/_mm256_cmov_si256 intrinsics to be used in constexpr (#153236)
This commit is contained in:
parent
271688b87a
commit
267f592ca0
@ -20,6 +20,14 @@
|
||||
#define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__, __target__("xop"), __min_vector_width__(128)))
|
||||
#define __DEFAULT_FN_ATTRS256 __attribute__((__always_inline__, __nodebug__, __target__("xop"), __min_vector_width__(256)))
|
||||
|
||||
#if defined(__cplusplus) && (__cplusplus >= 201103L)
|
||||
#define __DEFAULT_FN_ATTRS_CONSTEXPR __DEFAULT_FN_ATTRS constexpr
|
||||
#define __DEFAULT_FN_ATTRS256_CONSTEXPR __DEFAULT_FN_ATTRS256 constexpr
|
||||
#else
|
||||
#define __DEFAULT_FN_ATTRS_CONSTEXPR __DEFAULT_FN_ATTRS
|
||||
#define __DEFAULT_FN_ATTRS256_CONSTEXPR __DEFAULT_FN_ATTRS256
|
||||
#endif
|
||||
|
||||
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
||||
_mm_maccs_epi16(__m128i __A, __m128i __B, __m128i __C)
|
||||
{
|
||||
@ -182,13 +190,13 @@ _mm_hsubq_epi32(__m128i __A)
|
||||
return (__m128i)__builtin_ia32_vphsubdq((__v4si)__A);
|
||||
}
|
||||
|
||||
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
||||
static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
|
||||
_mm_cmov_si128(__m128i __A, __m128i __B, __m128i __C)
|
||||
{
|
||||
return (__m128i)(((__v2du)__A & (__v2du)__C) | ((__v2du)__B & ~(__v2du)__C));
|
||||
}
|
||||
|
||||
static __inline__ __m256i __DEFAULT_FN_ATTRS256
|
||||
static __inline__ __m256i __DEFAULT_FN_ATTRS256_CONSTEXPR
|
||||
_mm256_cmov_si256(__m256i __A, __m256i __B, __m256i __C)
|
||||
{
|
||||
return (__m256i)(((__v4du)__A & (__v4du)__C) | ((__v4du)__B & ~(__v4du)__C));
|
||||
@ -766,5 +774,7 @@ _mm256_frcz_pd(__m256d __A)
|
||||
|
||||
#undef __DEFAULT_FN_ATTRS
|
||||
#undef __DEFAULT_FN_ATTRS256
|
||||
#undef __DEFAULT_FN_ATTRS_CONSTEXPR
|
||||
#undef __DEFAULT_FN_ATTRS256_CONSTEXPR
|
||||
|
||||
#endif /* __XOPINTRIN_H */
|
||||
|
@ -9,6 +9,7 @@
|
||||
|
||||
|
||||
#include <x86intrin.h>
|
||||
#include "builtin_test_helpers.h"
|
||||
|
||||
// NOTE: This should match the tests in llvm/test/CodeGen/X86/xop-intrinsics-fast-isel.ll
|
||||
|
||||
@ -182,6 +183,7 @@ __m128i test_mm_cmov_si128(__m128i a, __m128i b, __m128i c) {
|
||||
// CHECK-NEXT: %{{.*}} = or <2 x i64> [[AND]], [[ANDN]]
|
||||
return _mm_cmov_si128(a, b, c);
|
||||
}
|
||||
TEST_CONSTEXPR(match_v4si(_mm_cmov_si128((__m128i)(__v4si){+1,+2,+3,+4}, (__m128i)(__v4si){-4,-3,-2,-1}, (__m128i)(__v4si){-1,0,0,-1}), +1, -3, -2, +4));
|
||||
|
||||
__m256i test_mm256_cmov_si256(__m256i a, __m256i b, __m256i c) {
|
||||
// CHECK-LABEL: test_mm256_cmov_si256
|
||||
@ -191,6 +193,7 @@ __m256i test_mm256_cmov_si256(__m256i a, __m256i b, __m256i c) {
|
||||
// CHECK-NEXT: %{{.*}} = or <4 x i64> [[AND]], [[ANDN]]
|
||||
return _mm256_cmov_si256(a, b, c);
|
||||
}
|
||||
TEST_CONSTEXPR(match_v4di(_mm256_cmov_si256((__m256i)(__v4di){+1,+2,+3,+4}, (__m256i)(__v4di){-4,-3,-2,-1}, (__m256i)(__v4di){0,-1,0,-1}), -4, +2, -2, +4));
|
||||
|
||||
__m128i test_mm_perm_epi8(__m128i a, __m128i b, __m128i c) {
|
||||
// CHECK-LABEL: test_mm_perm_epi8
|
||||
|
Loading…
x
Reference in New Issue
Block a user