Skip to content

Commit 267f592

Browse files
authored
[Headers][X86] Allow _mm_cmov_si128/_mm256_cmov_si256 intrinsics to be used in constexpr (#153236)
1 parent 271688b commit 267f592

File tree

2 files changed

+15
-2
lines changed

2 files changed

+15
-2
lines changed

clang/lib/Headers/xopintrin.h

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,14 @@
2020
#define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__, __target__("xop"), __min_vector_width__(128)))
2121
#define __DEFAULT_FN_ATTRS256 __attribute__((__always_inline__, __nodebug__, __target__("xop"), __min_vector_width__(256)))
2222

23+
#if defined(__cplusplus) && (__cplusplus >= 201103L)
24+
#define __DEFAULT_FN_ATTRS_CONSTEXPR __DEFAULT_FN_ATTRS constexpr
25+
#define __DEFAULT_FN_ATTRS256_CONSTEXPR __DEFAULT_FN_ATTRS256 constexpr
26+
#else
27+
#define __DEFAULT_FN_ATTRS_CONSTEXPR __DEFAULT_FN_ATTRS
28+
#define __DEFAULT_FN_ATTRS256_CONSTEXPR __DEFAULT_FN_ATTRS256
29+
#endif
30+
2331
static __inline__ __m128i __DEFAULT_FN_ATTRS
2432
_mm_maccs_epi16(__m128i __A, __m128i __B, __m128i __C)
2533
{
@@ -182,13 +190,13 @@ _mm_hsubq_epi32(__m128i __A)
182190
return (__m128i)__builtin_ia32_vphsubdq((__v4si)__A);
183191
}
184192

185-
static __inline__ __m128i __DEFAULT_FN_ATTRS
193+
static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
186194
_mm_cmov_si128(__m128i __A, __m128i __B, __m128i __C)
187195
{
188196
return (__m128i)(((__v2du)__A & (__v2du)__C) | ((__v2du)__B & ~(__v2du)__C));
189197
}
190198

191-
static __inline__ __m256i __DEFAULT_FN_ATTRS256
199+
static __inline__ __m256i __DEFAULT_FN_ATTRS256_CONSTEXPR
192200
_mm256_cmov_si256(__m256i __A, __m256i __B, __m256i __C)
193201
{
194202
return (__m256i)(((__v4du)__A & (__v4du)__C) | ((__v4du)__B & ~(__v4du)__C));
@@ -766,5 +774,7 @@ _mm256_frcz_pd(__m256d __A)
766774

767775
#undef __DEFAULT_FN_ATTRS
768776
#undef __DEFAULT_FN_ATTRS256
777+
#undef __DEFAULT_FN_ATTRS_CONSTEXPR
778+
#undef __DEFAULT_FN_ATTRS256_CONSTEXPR
769779

770780
#endif /* __XOPINTRIN_H */

clang/test/CodeGen/X86/xop-builtins.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010

1111
#include <x86intrin.h>
12+
#include "builtin_test_helpers.h"
1213

1314
// NOTE: This should match the tests in llvm/test/CodeGen/X86/xop-intrinsics-fast-isel.ll
1415

@@ -182,6 +183,7 @@ __m128i test_mm_cmov_si128(__m128i a, __m128i b, __m128i c) {
182183
// CHECK-NEXT: %{{.*}} = or <2 x i64> [[AND]], [[ANDN]]
183184
return _mm_cmov_si128(a, b, c);
184185
}
186+
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));
185187

186188
__m256i test_mm256_cmov_si256(__m256i a, __m256i b, __m256i c) {
187189
// CHECK-LABEL: test_mm256_cmov_si256
@@ -191,6 +193,7 @@ __m256i test_mm256_cmov_si256(__m256i a, __m256i b, __m256i c) {
191193
// CHECK-NEXT: %{{.*}} = or <4 x i64> [[AND]], [[ANDN]]
192194
return _mm256_cmov_si256(a, b, c);
193195
}
196+
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));
194197

195198
__m128i test_mm_perm_epi8(__m128i a, __m128i b, __m128i c) {
196199
// CHECK-LABEL: test_mm_perm_epi8

0 commit comments

Comments
 (0)