Author: Simon Pilgrim Date: 2024-11-06T15:19:00Z New Revision: 7585e2fd3caee30d5332c93995b7a6f51ab06660
URL: https://github.com/llvm/llvm-project/commit/7585e2fd3caee30d5332c93995b7a6f51ab06660 DIFF: https://github.com/llvm/llvm-project/commit/7585e2fd3caee30d5332c93995b7a6f51ab06660.diff LOG: [clang][x86] Add constexpr support for _mm_movepi64_pi64 and _mm_move_epi64 Added: Modified: clang/lib/Headers/emmintrin.h clang/test/CodeGen/X86/builtin_test_helpers.h clang/test/CodeGen/X86/sse2-builtins.c Removed: ################################################################################ diff --git a/clang/lib/Headers/emmintrin.h b/clang/lib/Headers/emmintrin.h index 4f00b7f1a8d9d4..69c3a2f229efc9 100644 --- a/clang/lib/Headers/emmintrin.h +++ b/clang/lib/Headers/emmintrin.h @@ -4610,7 +4610,8 @@ static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_unpacklo_epi64(__m128i __a, /// A 128-bit integer vector operand. The lower 64 bits are moved to the /// destination. /// \returns A 64-bit integer containing the lower 64 bits of the parameter. -static __inline__ __m64 __DEFAULT_FN_ATTRS _mm_movepi64_pi64(__m128i __a) { +static __inline__ __m64 __DEFAULT_FN_ATTRS_CONSTEXPR +_mm_movepi64_pi64(__m128i __a) { return (__m64)__a[0]; } @@ -4641,7 +4642,8 @@ static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_movpi64_epi64(__m64 __a) { /// destination. /// \returns A 128-bit integer vector. The lower 64 bits contain the value from /// the operand. The upper 64 bits are assigned zeros. -static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_move_epi64(__m128i __a) { +static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR +_mm_move_epi64(__m128i __a) { return __builtin_shufflevector((__v2di)__a, _mm_setzero_si128(), 0, 2); } diff --git a/clang/test/CodeGen/X86/builtin_test_helpers.h b/clang/test/CodeGen/X86/builtin_test_helpers.h index 0a57dabde1a652..0edec1441b33bd 100644 --- a/clang/test/CodeGen/X86/builtin_test_helpers.h +++ b/clang/test/CodeGen/X86/builtin_test_helpers.h @@ -4,6 +4,11 @@ #if defined(__cplusplus) && (__cplusplus >= 201103L) +constexpr bool match_m64(__m64 _v, unsigned long long a) { + __v1du v = (__v1du)_v; + return v[0] == a; +} + constexpr bool match_m128(__m128 v, float a, float b, float c, float d) { return v[0] == a && v[1] == b && v[2] == c && v[3] == d; } diff --git a/clang/test/CodeGen/X86/sse2-builtins.c b/clang/test/CodeGen/X86/sse2-builtins.c index adcb6876f7f55d..dec8d7599b8ddc 100644 --- a/clang/test/CodeGen/X86/sse2-builtins.c +++ b/clang/test/CodeGen/X86/sse2-builtins.c @@ -868,6 +868,7 @@ __m64 test_mm_movepi64_pi64(__m128i A) // CHECK: [[EXT:%.*]] = extractelement <2 x i64> %1, i32 0 return _mm_movepi64_pi64(A); } +TEST_CONSTEXPR(match_m64(_mm_movepi64_pi64((__m128i){8, -8}), 8ULL)); __m128i test_mm_movpi64_epi64(__m64 A) { @@ -883,6 +884,7 @@ __m128i test_mm_move_epi64(__m128i A) { // CHECK: shufflevector <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i32> <i32 0, i32 2> return _mm_move_epi64(A); } +TEST_CONSTEXPR(match_m128i(_mm_move_epi64((__m128i){16LL, 15LL}), 16ULL, 0ULL)); __m128d test_mm_move_sd(__m128d A, __m128d B) { // CHECK-LABEL: test_mm_move_sd _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits