Skip to content

Commit 1312369

Browse files
committed
[clang][x86] Enable SSE2/AVX/AVX512 setzero intrinsics in constant expressions
Basic setup for future constant expression tests
1 parent 326b381 commit 1312369

File tree

6 files changed

+97
-26
lines changed

6 files changed

+97
-26
lines changed

clang/lib/Headers/avx512fintrin.h

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -175,12 +175,21 @@ typedef enum
175175
__attribute__((__always_inline__, __nodebug__, \
176176
__target__("avx512f,no-evex512")))
177177

178+
#if defined(__cplusplus) && (__cplusplus >= 201103L)
179+
#define __DEFAULT_FN_ATTRS_CONSTEXPR __DEFAULT_FN_ATTRS constexpr
180+
#define __DEFAULT_FN_ATTRS512_CONSTEXPR __DEFAULT_FN_ATTRS512 constexpr
181+
#define __DEFAULT_FN_ATTRS128_CONSTEXPR __DEFAULT_FN_ATTRS128 constexpr
182+
#else
183+
#define __DEFAULT_FN_ATTRS_CONSTEXPR __DEFAULT_FN_ATTRS128
184+
#define __DEFAULT_FN_ATTRS512_CONSTEXPR __DEFAULT_FN_ATTRS512
185+
#define __DEFAULT_FN_ATTRS128_CONSTEXPR __DEFAULT_FN_ATTRS
186+
#endif
187+
178188
/* Create vectors with repeated elements */
179189

180-
static __inline __m512i __DEFAULT_FN_ATTRS512
181-
_mm512_setzero_si512(void)
182-
{
183-
return __extension__ (__m512i)(__v8di){ 0, 0, 0, 0, 0, 0, 0, 0 };
190+
static __inline __m512i __DEFAULT_FN_ATTRS512_CONSTEXPR
191+
_mm512_setzero_si512(void) {
192+
return __extension__(__m512i)(__v8di){0, 0, 0, 0, 0, 0, 0, 0};
184193
}
185194

186195
#define _mm512_setzero_epi32 _mm512_setzero_si512
@@ -256,20 +265,16 @@ _mm512_maskz_broadcastq_epi64 (__mmask8 __M, __m128i __A)
256265
(__v8di) _mm512_setzero_si512());
257266
}
258267

259-
260-
static __inline __m512 __DEFAULT_FN_ATTRS512
261-
_mm512_setzero_ps(void)
262-
{
263-
return __extension__ (__m512){ 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
264-
0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f };
268+
static __inline __m512 __DEFAULT_FN_ATTRS512_CONSTEXPR _mm512_setzero_ps(void) {
269+
return __extension__(__m512){0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
270+
0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f};
265271
}
266272

267273
#define _mm512_setzero _mm512_setzero_ps
268274

269-
static __inline __m512d __DEFAULT_FN_ATTRS512
270-
_mm512_setzero_pd(void)
271-
{
272-
return __extension__ (__m512d){ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
275+
static __inline __m512d __DEFAULT_FN_ATTRS512_CONSTEXPR
276+
_mm512_setzero_pd(void) {
277+
return __extension__(__m512d){0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
273278
}
274279

275280
static __inline __m512 __DEFAULT_FN_ATTRS512
@@ -9775,5 +9780,8 @@ _mm512_cvtsi512_si32(__m512i __A) {
97759780
#undef __DEFAULT_FN_ATTRS512
97769781
#undef __DEFAULT_FN_ATTRS128
97779782
#undef __DEFAULT_FN_ATTRS
9783+
#undef __DEFAULT_FN_ATTRS512_CONSTEXPR
9784+
#undef __DEFAULT_FN_ATTRS128_CONSTEXPR
9785+
#undef __DEFAULT_FN_ATTRS_CONSTEXPR
97789786

97799787
#endif /* __AVX512FINTRIN_H */

clang/lib/Headers/avxintrin.h

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,14 @@ typedef __bf16 __m256bh __attribute__((__vector_size__(32), __aligned__(32)));
6666
__min_vector_width__(128)))
6767
#endif
6868

69+
#if defined(__cplusplus) && (__cplusplus >= 201103L)
70+
#define __DEFAULT_FN_ATTRS_CONSTEXPR __DEFAULT_FN_ATTRS constexpr
71+
#define __DEFAULT_FN_ATTRS128_CONSTEXPR __DEFAULT_FN_ATTRS128 constexpr
72+
#else
73+
#define __DEFAULT_FN_ATTRS_CONSTEXPR __DEFAULT_FN_ATTRS128
74+
#define __DEFAULT_FN_ATTRS128_CONSTEXPR __DEFAULT_FN_ATTRS
75+
#endif
76+
6977
/* Arithmetic */
7078
/// Adds two 256-bit vectors of [4 x double].
7179
///
@@ -4331,10 +4339,8 @@ _mm256_set1_epi64x(long long __q)
43314339
/// This intrinsic corresponds to the <c> VXORPS </c> instruction.
43324340
///
43334341
/// \returns A 256-bit vector of [4 x double] with all elements set to zero.
4334-
static __inline __m256d __DEFAULT_FN_ATTRS
4335-
_mm256_setzero_pd(void)
4336-
{
4337-
return __extension__ (__m256d){ 0.0, 0.0, 0.0, 0.0 };
4342+
static __inline __m256d __DEFAULT_FN_ATTRS_CONSTEXPR _mm256_setzero_pd(void) {
4343+
return __extension__(__m256d){0.0, 0.0, 0.0, 0.0};
43384344
}
43394345

43404346
/// Constructs a 256-bit floating-point vector of [8 x float] with all
@@ -4345,9 +4351,7 @@ _mm256_setzero_pd(void)
43454351
/// This intrinsic corresponds to the <c> VXORPS </c> instruction.
43464352
///
43474353
/// \returns A 256-bit vector of [8 x float] with all elements set to zero.
4348-
static __inline __m256 __DEFAULT_FN_ATTRS
4349-
_mm256_setzero_ps(void)
4350-
{
4354+
static __inline __m256 __DEFAULT_FN_ATTRS_CONSTEXPR _mm256_setzero_ps(void) {
43514355
return __extension__ (__m256){ 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f };
43524356
}
43534357

@@ -4358,9 +4362,8 @@ _mm256_setzero_ps(void)
43584362
/// This intrinsic corresponds to the <c> VXORPS </c> instruction.
43594363
///
43604364
/// \returns A 256-bit integer vector initialized to zero.
4361-
static __inline __m256i __DEFAULT_FN_ATTRS
4362-
_mm256_setzero_si256(void)
4363-
{
4365+
static __inline __m256i __DEFAULT_FN_ATTRS_CONSTEXPR
4366+
_mm256_setzero_si256(void) {
43644367
return __extension__ (__m256i)(__v4di){ 0, 0, 0, 0 };
43654368
}
43664369

@@ -5130,6 +5133,8 @@ _mm256_storeu2_m128i(__m128i_u *__addr_hi, __m128i_u *__addr_lo, __m256i __a)
51305133
}
51315134

51325135
#undef __DEFAULT_FN_ATTRS
5136+
#undef __DEFAULT_FN_ATTRS_CONSTEXPR
51335137
#undef __DEFAULT_FN_ATTRS128
5138+
#undef __DEFAULT_FN_ATTRS128_CONSTEXPR
51345139

51355140
#endif /* __AVXINTRIN_H */

clang/lib/Headers/emmintrin.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,12 @@ typedef __bf16 __m128bh __attribute__((__vector_size__(16), __aligned__(16)));
5959
__min_vector_width__(128)))
6060
#endif
6161

62+
#if defined(__cplusplus) && (__cplusplus >= 201103L)
63+
#define __DEFAULT_FN_ATTRS_CONSTEXPR __DEFAULT_FN_ATTRS constexpr
64+
#else
65+
#define __DEFAULT_FN_ATTRS_CONSTEXPR __DEFAULT_FN_ATTRS
66+
#endif
67+
6268
#define __trunc64(x) \
6369
(__m64) __builtin_shufflevector((__v2di)(x), __extension__(__v2di){}, 0)
6470
#define __anyext128(x) \
@@ -1863,7 +1869,7 @@ static __inline__ __m128d __DEFAULT_FN_ATTRS _mm_setr_pd(double __w,
18631869
///
18641870
/// \returns An initialized 128-bit floating-point vector of [2 x double] with
18651871
/// all elements set to zero.
1866-
static __inline__ __m128d __DEFAULT_FN_ATTRS _mm_setzero_pd(void) {
1872+
static __inline__ __m128d __DEFAULT_FN_ATTRS_CONSTEXPR _mm_setzero_pd(void) {
18671873
return __extension__(__m128d){0.0, 0.0};
18681874
}
18691875

@@ -3862,7 +3868,7 @@ _mm_setr_epi8(char __b0, char __b1, char __b2, char __b3, char __b4, char __b5,
38623868
///
38633869
/// \returns An initialized 128-bit integer vector with all elements set to
38643870
/// zero.
3865-
static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_setzero_si128(void) {
3871+
static __inline__ __m128i __DEFAULT_FN_ATTRS_CONSTEXPR _mm_setzero_si128(void) {
38663872
return __extension__(__m128i)(__v2di){0LL, 0LL};
38673873
}
38683874

@@ -4900,6 +4906,7 @@ void _mm_pause(void);
49004906
#undef __anyext128
49014907
#undef __trunc64
49024908
#undef __DEFAULT_FN_ATTRS
4909+
#undef __DEFAULT_FN_ATTRS_CONSTEXPR
49034910

49044911
#define _MM_SHUFFLE2(x, y) (((x) << 1) | (y))
49054912

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2097,3 +2097,19 @@ float test_mm256_cvtss_f32(__m256 __a)
20972097
// CHECK: extractelement <8 x float> %{{.*}}, i32 0
20982098
return _mm256_cvtss_f32(__a);
20992099
}
2100+
2101+
// Test constexpr handling.
2102+
#if defined(__cplusplus) && (__cplusplus >= 201103L)
2103+
2104+
void test_constexpr() {
2105+
constexpr __m256d v_mm256_setzero_pd = _mm256_setzero_pd();
2106+
static_assert(v_mm256_setzero_pd[0] == +0.0 && v_mm256_setzero_pd[1] == +0.0 && v_mm256_setzero_pd[2] == +0.0 && v_mm256_setzero_pd[3] == +0.0);
2107+
2108+
constexpr __m256 v_mm256_setzero_ps = _mm256_setzero_ps();
2109+
static_assert(v_mm256_setzero_ps[0] == +0.0f && v_mm256_setzero_ps[1] == +0.0f && v_mm256_setzero_ps[2] == +0.0f && v_mm256_setzero_ps[3] == +0.0f && v_mm256_setzero_ps[4] == +0.0f && v_mm256_setzero_ps[5] == +0.0f && v_mm256_setzero_ps[6] == +0.0f && v_mm256_setzero_ps[7] == +0.0f);
2110+
2111+
constexpr __m256i v_mm256_setzero_si256 = _mm256_setzero_si256();
2112+
static_assert(v_mm256_setzero_si256[0] == 0x0000000000000000ULL && v_mm256_setzero_si256[1] == 0x0000000000000000ULL && v_mm256_setzero_si256[2] == 0x0000000000000000ULL && v_mm256_setzero_si256[3] == 0x0000000000000000ULL);
2113+
}
2114+
2115+
#endif

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10880,3 +10880,25 @@ void test_mm512_mask_i32loscatter_epi64(void *__addr, __mmask8 __mask, __m512i _
1088010880
// CHECK: @llvm.x86.avx512.mask.scatter.dpq.512
1088110881
_mm512_mask_i32loscatter_epi64(__addr, __mask, __index, __v1, 2);
1088210882
}
10883+
10884+
// Test constexpr handling.
10885+
#if defined(__cplusplus) && (__cplusplus >= 201103L)
10886+
10887+
void test_constexpr() {
10888+
constexpr __m512 v_mm512_setzero = _mm512_setzero();
10889+
static_assert(v_mm512_setzero[0] == +0.0f && v_mm512_setzero[1] == +0.0f && v_mm512_setzero[2] == +0.0f && v_mm512_setzero[3] == +0.0f && v_mm512_setzero[4] == +0.0f && v_mm512_setzero[5] == +0.0f && v_mm512_setzero[6] == +0.0f && v_mm512_setzero[7] == +0.0f && v_mm512_setzero[8] == +0.0f && v_mm512_setzero[9] == +0.0f && v_mm512_setzero[10] == +0.0f && v_mm512_setzero[11] == +0.0f && v_mm512_setzero[12] == +0.0f && v_mm512_setzero[13] == +0.0f && v_mm512_setzero[14] == +0.0f && v_mm512_setzero[15] == +0.0f);
10890+
10891+
constexpr __m512 v_mm512_setzero_ps = _mm512_setzero_ps();
10892+
static_assert(v_mm512_setzero_ps[0] == +0.0f && v_mm512_setzero_ps[1] == +0.0f && v_mm512_setzero_ps[2] == +0.0f && v_mm512_setzero_ps[3] == +0.0f && v_mm512_setzero_ps[4] == +0.0f && v_mm512_setzero_ps[5] == +0.0f && v_mm512_setzero_ps[6] == +0.0f && v_mm512_setzero_ps[7] == +0.0f && v_mm512_setzero_ps[8] == +0.0f && v_mm512_setzero_ps[9] == +0.0f && v_mm512_setzero_ps[10] == +0.0f && v_mm512_setzero_ps[11] == +0.0f && v_mm512_setzero_ps[12] == +0.0f && v_mm512_setzero_ps[13] == +0.0f && v_mm512_setzero_ps[14] == +0.0f && v_mm512_setzero_ps[15] == +0.0f);
10893+
10894+
constexpr __m512d v_mm512_setzero_pd = _mm512_setzero_pd();
10895+
static_assert(v_mm512_setzero_pd[0] == +0.0 && v_mm512_setzero_pd[1] == +0.0 && v_mm512_setzero_pd[2] == +0.0 && v_mm512_setzero_pd[3] == +0.0 && v_mm512_setzero_pd[4] == +0.0 && v_mm512_setzero_pd[5] == +0.0 && v_mm512_setzero_pd[6] == +0.0 && v_mm512_setzero_pd[7] == +0.0);
10896+
10897+
constexpr __m512i v_mm512_setzero_si512 = _mm512_setzero_si512();
10898+
static_assert(v_mm512_setzero_si512[0] == 0x0000000000000000ULL && v_mm512_setzero_si512[1] == 0x0000000000000000ULL && v_mm512_setzero_si512[2] == 0x0000000000000000ULL && v_mm512_setzero_si512[3] == 0x0000000000000000ULL && v_mm512_setzero_si512[4] == 0x0000000000000000ULL && v_mm512_setzero_si512[5] == 0x0000000000000000ULL && v_mm512_setzero_si512[6] == 0x0000000000000000ULL && v_mm512_setzero_si512[7] == 0x0000000000000000ULL);
10899+
10900+
constexpr __m512i v_mm512_setzero_epi32 = _mm512_setzero_epi32();
10901+
static_assert(v_mm512_setzero_epi32[0] == 0x0000000000000000ULL && v_mm512_setzero_epi32[1] == 0x0000000000000000ULL && v_mm512_setzero_epi32[2] == 0x0000000000000000ULL && v_mm512_setzero_epi32[3] == 0x0000000000000000ULL && v_mm512_setzero_epi32[4] == 0x0000000000000000ULL && v_mm512_setzero_epi32[5] == 0x0000000000000000ULL && v_mm512_setzero_epi32[6] == 0x0000000000000000ULL && v_mm512_setzero_epi32[7] == 0x0000000000000000ULL);
10902+
}
10903+
10904+
#endif

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1778,3 +1778,16 @@ __m128i test_mm_xor_si128(__m128i A, __m128i B) {
17781778
// CHECK: xor <2 x i64> %{{.*}}, %{{.*}}
17791779
return _mm_xor_si128(A, B);
17801780
}
1781+
1782+
// Test constexpr handling.
1783+
#if defined(__cplusplus) && (__cplusplus >= 201103L)
1784+
1785+
void test_constexpr() {
1786+
constexpr __m128d v_mm_setzero_pd = _mm_setzero_pd();
1787+
static_assert(v_mm_setzero_pd[0] == +0.0 && v_mm_setzero_pd[1] == +0.0);
1788+
1789+
constexpr __m128i v_mm_setzero_si128 = _mm_setzero_si128();
1790+
static_assert(v_mm_setzero_si128[0] == 0x0000000000000000ULL && v_mm_setzero_si128[1] == 0x0000000000000000ULL);
1791+
}
1792+
1793+
#endif

0 commit comments

Comments
 (0)