Author: Simon Pilgrim Date: 2024-11-08T15:30:02Z New Revision: c9552283c0bf277eba490cde9fd913510f4111c0
URL: https://github.com/llvm/llvm-project/commit/c9552283c0bf277eba490cde9fd913510f4111c0 DIFF: https://github.com/llvm/llvm-project/commit/c9552283c0bf277eba490cde9fd913510f4111c0.diff LOG: [clang][x86] Add constexpr support for MMX _mm_set*_pi* intrinsics Added: Modified: clang/lib/Headers/mmintrin.h clang/test/CodeGen/X86/builtin_test_helpers.h clang/test/CodeGen/X86/mmx-builtins.c Removed: ################################################################################ diff --git a/clang/lib/Headers/mmintrin.h b/clang/lib/Headers/mmintrin.h index 0347c5ccf8254a..dc0fa5c523eeb6 100644 --- a/clang/lib/Headers/mmintrin.h +++ b/clang/lib/Headers/mmintrin.h @@ -49,6 +49,12 @@ typedef char __v16qi __attribute__((__vector_size__(16))); __min_vector_width__(128))) #endif +#if defined(__cplusplus) && (__cplusplus >= 201103L) +#define __DEFAULT_FN_ATTRS_SSE2_CONSTEXPR __DEFAULT_FN_ATTRS_SSE2 constexpr +#else +#define __DEFAULT_FN_ATTRS_SSE2_CONSTEXPR __DEFAULT_FN_ATTRS_SSE2 +#endif + #define __trunc64(x) \ (__m64) __builtin_shufflevector((__v2di)(x), __extension__(__v2di){}, 0) #define __anyext128(x) \ @@ -1332,10 +1338,9 @@ _mm_cmpgt_pi32(__m64 __m1, __m64 __m2) /// This intrinsic corresponds to the <c> PXOR </c> instruction. /// /// \returns An initialized 64-bit integer vector with all elements set to zero. -static __inline__ __m64 __DEFAULT_FN_ATTRS_SSE2 -_mm_setzero_si64(void) -{ - return __extension__ (__m64){ 0LL }; +static __inline__ __m64 __DEFAULT_FN_ATTRS_SSE2_CONSTEXPR +_mm_setzero_si64(void) { + return __extension__(__m64){0LL}; } /// Constructs a 64-bit integer vector initialized with the specified @@ -1353,10 +1358,9 @@ _mm_setzero_si64(void) /// A 32-bit integer value used to initialize the lower 32 bits of the /// result. /// \returns An initialized 64-bit integer vector. -static __inline__ __m64 __DEFAULT_FN_ATTRS_SSE2 -_mm_set_pi32(int __i1, int __i0) -{ - return __extension__ (__m64)(__v2si){__i0, __i1}; +static __inline__ __m64 __DEFAULT_FN_ATTRS_SSE2_CONSTEXPR +_mm_set_pi32(int __i1, int __i0) { + return __extension__(__m64)(__v2si){__i0, __i1}; } /// Constructs a 64-bit integer vector initialized with the specified @@ -1376,10 +1380,9 @@ _mm_set_pi32(int __i1, int __i0) /// \param __s0 /// A 16-bit integer value used to initialize bits [15:0] of the result. /// \returns An initialized 64-bit integer vector. -static __inline__ __m64 __DEFAULT_FN_ATTRS_SSE2 -_mm_set_pi16(short __s3, short __s2, short __s1, short __s0) -{ - return __extension__ (__m64)(__v4hi){__s0, __s1, __s2, __s3}; +static __inline__ __m64 __DEFAULT_FN_ATTRS_SSE2_CONSTEXPR +_mm_set_pi16(short __s3, short __s2, short __s1, short __s0) { + return __extension__(__m64)(__v4hi){__s0, __s1, __s2, __s3}; } /// Constructs a 64-bit integer vector initialized with the specified @@ -1407,12 +1410,11 @@ _mm_set_pi16(short __s3, short __s2, short __s1, short __s0) /// \param __b0 /// An 8-bit integer value used to initialize bits [7:0] of the result. /// \returns An initialized 64-bit integer vector. -static __inline__ __m64 __DEFAULT_FN_ATTRS_SSE2 +static __inline__ __m64 __DEFAULT_FN_ATTRS_SSE2_CONSTEXPR _mm_set_pi8(char __b7, char __b6, char __b5, char __b4, char __b3, char __b2, - char __b1, char __b0) -{ - return __extension__ (__m64)(__v8qi){__b0, __b1, __b2, __b3, - __b4, __b5, __b6, __b7}; + char __b1, char __b0) { + return __extension__(__m64)(__v8qi){__b0, __b1, __b2, __b3, + __b4, __b5, __b6, __b7}; } /// Constructs a 64-bit integer vector of [2 x i32], with each of the @@ -1428,10 +1430,9 @@ _mm_set_pi8(char __b7, char __b6, char __b5, char __b4, char __b3, char __b2, /// A 32-bit integer value used to initialize each vector element of the /// result. /// \returns An initialized 64-bit integer vector of [2 x i32]. -static __inline__ __m64 __DEFAULT_FN_ATTRS_SSE2 -_mm_set1_pi32(int __i) -{ - return _mm_set_pi32(__i, __i); +static __inline__ __m64 __DEFAULT_FN_ATTRS_SSE2_CONSTEXPR +_mm_set1_pi32(int __i) { + return _mm_set_pi32(__i, __i); } /// Constructs a 64-bit integer vector of [4 x i16], with each of the @@ -1447,10 +1448,9 @@ _mm_set1_pi32(int __i) /// A 16-bit integer value used to initialize each vector element of the /// result. /// \returns An initialized 64-bit integer vector of [4 x i16]. -static __inline__ __m64 __DEFAULT_FN_ATTRS_SSE2 -_mm_set1_pi16(short __w) -{ - return _mm_set_pi16(__w, __w, __w, __w); +static __inline__ __m64 __DEFAULT_FN_ATTRS_SSE2_CONSTEXPR +_mm_set1_pi16(short __w) { + return _mm_set_pi16(__w, __w, __w, __w); } /// Constructs a 64-bit integer vector of [8 x i8], with each of the @@ -1465,10 +1465,9 @@ _mm_set1_pi16(short __w) /// An 8-bit integer value used to initialize each vector element of the /// result. /// \returns An initialized 64-bit integer vector of [8 x i8]. -static __inline__ __m64 __DEFAULT_FN_ATTRS_SSE2 -_mm_set1_pi8(char __b) -{ - return _mm_set_pi8(__b, __b, __b, __b, __b, __b, __b, __b); +static __inline__ __m64 __DEFAULT_FN_ATTRS_SSE2_CONSTEXPR +_mm_set1_pi8(char __b) { + return _mm_set_pi8(__b, __b, __b, __b, __b, __b, __b, __b); } /// Constructs a 64-bit integer vector, initialized in reverse order with @@ -1486,10 +1485,9 @@ _mm_set1_pi8(char __b) /// A 32-bit integer value used to initialize the upper 32 bits of the /// result. /// \returns An initialized 64-bit integer vector. -static __inline__ __m64 __DEFAULT_FN_ATTRS_SSE2 -_mm_setr_pi32(int __i0, int __i1) -{ - return _mm_set_pi32(__i1, __i0); +static __inline__ __m64 __DEFAULT_FN_ATTRS_SSE2_CONSTEXPR +_mm_setr_pi32(int __i0, int __i1) { + return _mm_set_pi32(__i1, __i0); } /// Constructs a 64-bit integer vector, initialized in reverse order with @@ -1509,10 +1507,9 @@ _mm_setr_pi32(int __i0, int __i1) /// \param __w3 /// A 16-bit integer value used to initialize bits [63:48] of the result. /// \returns An initialized 64-bit integer vector. -static __inline__ __m64 __DEFAULT_FN_ATTRS_SSE2 -_mm_setr_pi16(short __w0, short __w1, short __w2, short __w3) -{ - return _mm_set_pi16(__w3, __w2, __w1, __w0); +static __inline__ __m64 __DEFAULT_FN_ATTRS_SSE2_CONSTEXPR +_mm_setr_pi16(short __w0, short __w1, short __w2, short __w3) { + return _mm_set_pi16(__w3, __w2, __w1, __w0); } /// Constructs a 64-bit integer vector, initialized in reverse order with @@ -1540,11 +1537,10 @@ _mm_setr_pi16(short __w0, short __w1, short __w2, short __w3) /// \param __b7 /// An 8-bit integer value used to initialize bits [63:56] of the result. /// \returns An initialized 64-bit integer vector. -static __inline__ __m64 __DEFAULT_FN_ATTRS_SSE2 +static __inline__ __m64 __DEFAULT_FN_ATTRS_SSE2_CONSTEXPR _mm_setr_pi8(char __b0, char __b1, char __b2, char __b3, char __b4, char __b5, - char __b6, char __b7) -{ - return _mm_set_pi8(__b7, __b6, __b5, __b4, __b3, __b2, __b1, __b0); + char __b6, char __b7) { + return _mm_set_pi8(__b7, __b6, __b5, __b4, __b3, __b2, __b1, __b0); } #undef __anyext128 diff --git a/clang/test/CodeGen/X86/builtin_test_helpers.h b/clang/test/CodeGen/X86/builtin_test_helpers.h index 0edec1441b33bd..c3307f749942b1 100644 --- a/clang/test/CodeGen/X86/builtin_test_helpers.h +++ b/clang/test/CodeGen/X86/builtin_test_helpers.h @@ -9,6 +9,25 @@ constexpr bool match_m64(__m64 _v, unsigned long long a) { return v[0] == a; } +constexpr bool match_v1di(__m64 v, long long a) { + return v[0] == a; +} + +constexpr bool match_v2si(__m64 _v, int a, int b) { + __v2si v = (__v2si)_v; + return v[0] == a && v[1] == b; +} + +constexpr bool match_v4hi(__m64 _v, short a, short b, short c, short d) { + __v4hi v = (__v4hi)_v; + return v[0] == a && v[1] == b && v[2] == c && v[3] == d; +} + +constexpr bool match_v8qi(__m64 _v, char a, char b, char c, char d, char e, char f, char g, char h) { + __v8qi v = (__v8qi)_v; + return v[0] == a && v[1] == b && v[2] == c && v[3] == d && v[4] == e && v[5] == f && v[6] == g && v[7] == h; +} + 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/mmx-builtins.c b/clang/test/CodeGen/X86/mmx-builtins.c index 50f47e1113e4f8..52cbe45ca238b9 100644 --- a/clang/test/CodeGen/X86/mmx-builtins.c +++ b/clang/test/CodeGen/X86/mmx-builtins.c @@ -9,6 +9,7 @@ #include <immintrin.h> +#include "builtin_test_helpers.h" __m64 test_mm_abs_pi8(__m64 a) { // CHECK-LABEL: test_mm_abs_pi8 @@ -409,6 +410,7 @@ __m64 test_mm_set_pi8(char a, char b, char c, char d, char e, char f, char g, ch // CHECK: insertelement <8 x i8> return _mm_set_pi8(a, b, c, d, e, f, g, h); } +TEST_CONSTEXPR(match_v8qi(_mm_set_pi8(0, -1, 2, -3, 4, -5, 6, -7), -7, 6, -5, 4, -3, 2, -1, 0)); __m64 test_mm_set_pi16(short a, short b, short c, short d) { // CHECK-LABEL: test_mm_set_pi16 @@ -418,6 +420,7 @@ __m64 test_mm_set_pi16(short a, short b, short c, short d) { // CHECK: insertelement <4 x i16> return _mm_set_pi16(a, b, c, d); } +TEST_CONSTEXPR(match_v4hi(_mm_set_pi16(101, 102, -103, -104), -104, -103, 102, 101)); __m64 test_mm_set_pi32(int a, int b) { // CHECK-LABEL: test_mm_set_pi32 @@ -425,6 +428,7 @@ __m64 test_mm_set_pi32(int a, int b) { // CHECK: insertelement <2 x i32> return _mm_set_pi32(a, b); } +TEST_CONSTEXPR(match_v2si(_mm_set_pi32(5000, -1500), -1500, 5000)); __m64 test_mm_setr_pi8(char a, char b, char c, char d, char e, char f, char g, char h) { // CHECK-LABEL: test_mm_setr_pi8 @@ -438,6 +442,7 @@ __m64 test_mm_setr_pi8(char a, char b, char c, char d, char e, char f, char g, c // CHECK: insertelement <8 x i8> return _mm_setr_pi8(a, b, c, d, e, f, g, h); } +TEST_CONSTEXPR(match_v8qi(_mm_setr_pi8(0, -1, 2, -3, 4, -5, 6, -7), 0, -1, 2, -3, 4, -5, 6, -7)); __m64 test_mm_setr_pi16(short a, short b, short c, short d) { // CHECK-LABEL: test_mm_setr_pi16 @@ -447,6 +452,7 @@ __m64 test_mm_setr_pi16(short a, short b, short c, short d) { // CHECK: insertelement <4 x i16> return _mm_setr_pi16(a, b, c, d); } +TEST_CONSTEXPR(match_v4hi(_mm_setr_pi16(101, 102, -103, -104), 101, 102, -103, -104)); __m64 test_mm_setr_pi32(int a, int b) { // CHECK-LABEL: test_mm_setr_pi32 @@ -454,6 +460,14 @@ __m64 test_mm_setr_pi32(int a, int b) { // CHECK: insertelement <2 x i32> return _mm_setr_pi32(a, b); } +TEST_CONSTEXPR(match_v2si(_mm_setr_pi32(5000, -1500), 5000, -1500)); + +__m64 test_mm_setzero_si64() { + // CHECK-LABEL: test_mm_setzero_si64 + // CHECK: zeroinitializer + return _mm_setzero_si64(); +} +TEST_CONSTEXPR(match_m64(_mm_setzero_si64(), 0ULL)); __m64 test_mm_set1_pi8(char a) { // CHECK-LABEL: test_mm_set1_pi8 @@ -467,6 +481,7 @@ __m64 test_mm_set1_pi8(char a) { // CHECK: insertelement <8 x i8> return _mm_set1_pi8(a); } +TEST_CONSTEXPR(match_v8qi(_mm_set1_pi8(99), 99, 99, 99, 99, 99, 99, 99, 99)); __m64 test_mm_set1_pi16(short a) { // CHECK-LABEL: test_mm_set1_pi16 @@ -476,6 +491,7 @@ __m64 test_mm_set1_pi16(short a) { // CHECK: insertelement <4 x i16> return _mm_set1_pi16(a); } +TEST_CONSTEXPR(match_v4hi(_mm_set1_pi16(-128), -128, -128, -128, -128)); __m64 test_mm_set1_pi32(int a) { // CHECK-LABEL: test_mm_set1_pi32 @@ -483,6 +499,7 @@ __m64 test_mm_set1_pi32(int a) { // CHECK: insertelement <2 x i32> return _mm_set1_pi32(a); } +TEST_CONSTEXPR(match_v2si(_mm_set1_pi32(55), 55, 55)); __m64 test_mm_shuffle_pi8(__m64 a, __m64 b) { // CHECK-LABEL: test_mm_shuffle_pi8 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits