Skip to content

Commit bd3aa88

Browse files
authored
[Headers][X86] Allow SSE MOVD/Q scalar<->vector cvt intrinsics to be used in constexpr (llvm#153192)
1 parent 4e6d510 commit bd3aa88

File tree

2 files changed

+12
-4
lines changed

2 files changed

+12
-4
lines changed

clang/lib/Headers/emmintrin.h

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3381,7 +3381,8 @@ static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_cvttps_epi32(__m128 __a) {
33813381
/// \param __a
33823382
/// A 32-bit signed integer operand.
33833383
/// \returns A 128-bit vector of [4 x i32].
3384-
static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_cvtsi32_si128(int __a) {
3384+
static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
3385+
_mm_cvtsi32_si128(int __a) {
33853386
return __extension__(__m128i)(__v4si){__a, 0, 0, 0};
33863387
}
33873388

@@ -3396,7 +3397,8 @@ static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_cvtsi32_si128(int __a) {
33963397
/// \param __a
33973398
/// A 64-bit signed integer operand containing the value to be converted.
33983399
/// \returns A 128-bit vector of [2 x i64] containing the converted value.
3399-
static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_cvtsi64_si128(long long __a) {
3400+
static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
3401+
_mm_cvtsi64_si128(long long __a) {
34003402
return __extension__(__m128i)(__v2di){__a, 0};
34013403
}
34023404

@@ -3411,7 +3413,8 @@ static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_cvtsi64_si128(long long __a) {
34113413
/// A vector of [4 x i32]. The least significant 32 bits are moved to the
34123414
/// destination.
34133415
/// \returns A 32-bit signed integer containing the moved value.
3414-
static __inline__ int __DEFAULT_FN_ATTRS _mm_cvtsi128_si32(__m128i __a) {
3416+
static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR
3417+
_mm_cvtsi128_si32(__m128i __a) {
34153418
__v4si __b = (__v4si)__a;
34163419
return __b[0];
34173420
}
@@ -3427,7 +3430,8 @@ static __inline__ int __DEFAULT_FN_ATTRS _mm_cvtsi128_si32(__m128i __a) {
34273430
/// A vector of [2 x i64]. The least significant 64 bits are moved to the
34283431
/// destination.
34293432
/// \returns A 64-bit signed integer containing the moved value.
3430-
static __inline__ long long __DEFAULT_FN_ATTRS _mm_cvtsi128_si64(__m128i __a) {
3433+
static __inline__ long long __DEFAULT_FN_ATTRS_CONSTEXPR
3434+
_mm_cvtsi128_si64(__m128i __a) {
34313435
return __a[0];
34323436
}
34333437

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -581,12 +581,14 @@ int test_mm_cvtsi128_si32(__m128i A) {
581581
// CHECK: extractelement <4 x i32> %{{.*}}, i32 0
582582
return _mm_cvtsi128_si32(A);
583583
}
584+
TEST_CONSTEXPR(_mm_cvtsi128_si32((__m128i)(__v4si){+1, -2, -3, +4}) == +1);
584585

585586
long long test_mm_cvtsi128_si64(__m128i A) {
586587
// CHECK-LABEL: test_mm_cvtsi128_si64
587588
// CHECK: extractelement <2 x i64> %{{.*}}, i32 0
588589
return _mm_cvtsi128_si64(A);
589590
}
591+
TEST_CONSTEXPR(_mm_cvtsi128_si64((__m128i)(__v2di){42LL, -42LL}) == 42LL);
590592

591593
__m128d test_mm_cvtsi32_sd(__m128d A, int B) {
592594
// CHECK-LABEL: test_mm_cvtsi32_sd
@@ -604,6 +606,7 @@ __m128i test_mm_cvtsi32_si128(int A) {
604606
// CHECK: insertelement <4 x i32> %{{.*}}, i32 0, i32 3
605607
return _mm_cvtsi32_si128(A);
606608
}
609+
TEST_CONSTEXPR(match_v4si(_mm_cvtsi32_si128(55), 55, 0, 0, 0));
607610

608611
#ifdef __x86_64__
609612
__m128d test_mm_cvtsi64_sd(__m128d A, long long B) {
@@ -621,6 +624,7 @@ __m128i test_mm_cvtsi64_si128(long long A) {
621624
// CHECK: insertelement <2 x i64> %{{.*}}, i64 0, i32 1
622625
return _mm_cvtsi64_si128(A);
623626
}
627+
TEST_CONSTEXPR(match_v2di(_mm_cvtsi64_si128(-99LL), -99LL, 0LL));
624628

625629
__m128d test_mm_cvtss_sd(__m128d A, __m128 B) {
626630
// CHECK-LABEL: test_mm_cvtss_sd

0 commit comments

Comments
 (0)