Skip to content

Commit e932e41

Browse files
authored
[Headers][X86] Add constexpr support for some AVX[512] intrinsics. (llvm#156187)
The following AVX[512] intrinsics are now constexpr: - `_mm256_cvtepi32_pd` - `_mm256_cvtepi32_ps` - `_mm256_cvtps_pd` - `_mm512_cvtepi32_ps` - `_mm512_mask_cvtepi32_ps` - `_mm512_maskz_cvtepi32_ps` - `_mm512_cvtepu32_ps` - `_mm512_mask_cvtepu32_ps` - `_mm512_maskz_cvtepu32_ps` - `_mm512_cvtepi32_pd` - `_mm512_mask_cvtepi32_pd` - `_mm512_maskz_cvtepi32_pd` - `_mm512_cvtepi32lo_pd` - `_mm512_mask_cvtepi32lo_pd` - `_mm512_cvtepu32_pd` - `_mm512_mask_cvtepu32_pd` - `_mm512_maskz_cvtepu32_pd` - `_mm512_cvtepu32lo_pd` - `_mm512_mask_cvtepu32lo_pd` - `_mm512_cvtps_pd` - `_mm512_mask_cvtps_pd` - `_mm512_maskz_cvtps_pd` - `_mm512_cvtpslo_pd` - `_mm512_mask_cvtpslo_pd` - `_mm512_castsi512_si256` - `_mm512_castps512_ps256` This PR is part 1 of a series of PRs fixing llvm#155798
1 parent 3fd6828 commit e932e41

File tree

4 files changed

+106
-78
lines changed

4 files changed

+106
-78
lines changed

clang/lib/Headers/avx512fintrin.h

Lines changed: 46 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -426,9 +426,8 @@ _mm512_castps512_ps128(__m512 __a)
426426
return __builtin_shufflevector(__a, __a, 0, 1, 2, 3);
427427
}
428428

429-
static __inline __m256 __DEFAULT_FN_ATTRS512
430-
_mm512_castps512_ps256 (__m512 __A)
431-
{
429+
static __inline __m256 __DEFAULT_FN_ATTRS512_CONSTEXPR
430+
_mm512_castps512_ps256(__m512 __A) {
432431
return __builtin_shufflevector(__A, __A, 0, 1, 2, 3, 4, 5, 6, 7);
433432
}
434433

@@ -507,9 +506,8 @@ _mm512_castsi512_si128 (__m512i __A)
507506
return (__m128i)__builtin_shufflevector(__A, __A , 0, 1);
508507
}
509508

510-
static __inline __m256i __DEFAULT_FN_ATTRS512
511-
_mm512_castsi512_si256 (__m512i __A)
512-
{
509+
static __inline __m256i __DEFAULT_FN_ATTRS512_CONSTEXPR
510+
_mm512_castsi512_si256(__m512i __A) {
513511
return (__m256i)__builtin_shufflevector(__A, __A , 0, 1, 2, 3);
514512
}
515513

@@ -3586,115 +3584,99 @@ _mm512_maskz_cvttps_epu32 (__mmask16 __U, __m512 __A)
35863584
(__v16sf)_mm512_setzero_ps(), \
35873585
(__mmask16)(U), (int)(R)))
35883586

3589-
static __inline__ __m512 __DEFAULT_FN_ATTRS512
3590-
_mm512_cvtepu32_ps (__m512i __A)
3591-
{
3587+
static __inline__ __m512
3588+
__DEFAULT_FN_ATTRS512_CONSTEXPR _mm512_cvtepu32_ps(__m512i __A) {
35923589
return (__m512)__builtin_convertvector((__v16su)__A, __v16sf);
35933590
}
35943591

3595-
static __inline__ __m512 __DEFAULT_FN_ATTRS512
3596-
_mm512_mask_cvtepu32_ps (__m512 __W, __mmask16 __U, __m512i __A)
3597-
{
3592+
static __inline__ __m512 __DEFAULT_FN_ATTRS512_CONSTEXPR
3593+
_mm512_mask_cvtepu32_ps(__m512 __W, __mmask16 __U, __m512i __A) {
35983594
return (__m512)__builtin_ia32_selectps_512((__mmask16)__U,
35993595
(__v16sf)_mm512_cvtepu32_ps(__A),
36003596
(__v16sf)__W);
36013597
}
36023598

3603-
static __inline__ __m512 __DEFAULT_FN_ATTRS512
3604-
_mm512_maskz_cvtepu32_ps (__mmask16 __U, __m512i __A)
3605-
{
3599+
static __inline__ __m512 __DEFAULT_FN_ATTRS512_CONSTEXPR
3600+
_mm512_maskz_cvtepu32_ps(__mmask16 __U, __m512i __A) {
36063601
return (__m512)__builtin_ia32_selectps_512((__mmask16)__U,
36073602
(__v16sf)_mm512_cvtepu32_ps(__A),
36083603
(__v16sf)_mm512_setzero_ps());
36093604
}
36103605

3611-
static __inline __m512d __DEFAULT_FN_ATTRS512
3612-
_mm512_cvtepi32_pd(__m256i __A)
3613-
{
3606+
static __inline __m512d __DEFAULT_FN_ATTRS512_CONSTEXPR
3607+
_mm512_cvtepi32_pd(__m256i __A) {
36143608
return (__m512d)__builtin_convertvector((__v8si)__A, __v8df);
36153609
}
36163610

3617-
static __inline__ __m512d __DEFAULT_FN_ATTRS512
3618-
_mm512_mask_cvtepi32_pd (__m512d __W, __mmask8 __U, __m256i __A)
3619-
{
3611+
static __inline__ __m512d __DEFAULT_FN_ATTRS512_CONSTEXPR
3612+
_mm512_mask_cvtepi32_pd(__m512d __W, __mmask8 __U, __m256i __A) {
36203613
return (__m512d)__builtin_ia32_selectpd_512((__mmask8) __U,
36213614
(__v8df)_mm512_cvtepi32_pd(__A),
36223615
(__v8df)__W);
36233616
}
36243617

3625-
static __inline__ __m512d __DEFAULT_FN_ATTRS512
3626-
_mm512_maskz_cvtepi32_pd (__mmask8 __U, __m256i __A)
3627-
{
3618+
static __inline__ __m512d __DEFAULT_FN_ATTRS512_CONSTEXPR
3619+
_mm512_maskz_cvtepi32_pd(__mmask8 __U, __m256i __A) {
36283620
return (__m512d)__builtin_ia32_selectpd_512((__mmask8) __U,
36293621
(__v8df)_mm512_cvtepi32_pd(__A),
36303622
(__v8df)_mm512_setzero_pd());
36313623
}
36323624

3633-
static __inline__ __m512d __DEFAULT_FN_ATTRS512
3634-
_mm512_cvtepi32lo_pd(__m512i __A)
3635-
{
3625+
static __inline__ __m512d __DEFAULT_FN_ATTRS512_CONSTEXPR
3626+
_mm512_cvtepi32lo_pd(__m512i __A) {
36363627
return (__m512d) _mm512_cvtepi32_pd(_mm512_castsi512_si256(__A));
36373628
}
36383629

3639-
static __inline__ __m512d __DEFAULT_FN_ATTRS512
3640-
_mm512_mask_cvtepi32lo_pd(__m512d __W, __mmask8 __U,__m512i __A)
3641-
{
3630+
static __inline__ __m512d __DEFAULT_FN_ATTRS512_CONSTEXPR
3631+
_mm512_mask_cvtepi32lo_pd(__m512d __W, __mmask8 __U, __m512i __A) {
36423632
return (__m512d) _mm512_mask_cvtepi32_pd(__W, __U, _mm512_castsi512_si256(__A));
36433633
}
36443634

3645-
static __inline__ __m512 __DEFAULT_FN_ATTRS512
3646-
_mm512_cvtepi32_ps (__m512i __A)
3647-
{
3635+
static __inline__ __m512 __DEFAULT_FN_ATTRS512_CONSTEXPR
3636+
_mm512_cvtepi32_ps(__m512i __A) {
36483637
return (__m512)__builtin_convertvector((__v16si)__A, __v16sf);
36493638
}
36503639

3651-
static __inline__ __m512 __DEFAULT_FN_ATTRS512
3652-
_mm512_mask_cvtepi32_ps (__m512 __W, __mmask16 __U, __m512i __A)
3653-
{
3640+
static __inline__ __m512 __DEFAULT_FN_ATTRS512_CONSTEXPR
3641+
_mm512_mask_cvtepi32_ps(__m512 __W, __mmask16 __U, __m512i __A) {
36543642
return (__m512)__builtin_ia32_selectps_512((__mmask16)__U,
36553643
(__v16sf)_mm512_cvtepi32_ps(__A),
36563644
(__v16sf)__W);
36573645
}
36583646

3659-
static __inline__ __m512 __DEFAULT_FN_ATTRS512
3660-
_mm512_maskz_cvtepi32_ps (__mmask16 __U, __m512i __A)
3661-
{
3647+
static __inline__ __m512 __DEFAULT_FN_ATTRS512_CONSTEXPR
3648+
_mm512_maskz_cvtepi32_ps(__mmask16 __U, __m512i __A) {
36623649
return (__m512)__builtin_ia32_selectps_512((__mmask16)__U,
36633650
(__v16sf)_mm512_cvtepi32_ps(__A),
36643651
(__v16sf)_mm512_setzero_ps());
36653652
}
36663653

3667-
static __inline __m512d __DEFAULT_FN_ATTRS512
3668-
_mm512_cvtepu32_pd(__m256i __A)
3669-
{
3654+
static __inline __m512d __DEFAULT_FN_ATTRS512_CONSTEXPR
3655+
_mm512_cvtepu32_pd(__m256i __A) {
36703656
return (__m512d)__builtin_convertvector((__v8su)__A, __v8df);
36713657
}
36723658

3673-
static __inline__ __m512d __DEFAULT_FN_ATTRS512
3674-
_mm512_mask_cvtepu32_pd (__m512d __W, __mmask8 __U, __m256i __A)
3675-
{
3659+
static __inline__ __m512d __DEFAULT_FN_ATTRS512_CONSTEXPR
3660+
_mm512_mask_cvtepu32_pd(__m512d __W, __mmask8 __U, __m256i __A) {
36763661
return (__m512d)__builtin_ia32_selectpd_512((__mmask8) __U,
36773662
(__v8df)_mm512_cvtepu32_pd(__A),
36783663
(__v8df)__W);
36793664
}
36803665

3681-
static __inline__ __m512d __DEFAULT_FN_ATTRS512
3682-
_mm512_maskz_cvtepu32_pd (__mmask8 __U, __m256i __A)
3683-
{
3666+
static __inline__ __m512d __DEFAULT_FN_ATTRS512_CONSTEXPR
3667+
_mm512_maskz_cvtepu32_pd(__mmask8 __U, __m256i __A) {
36843668
return (__m512d)__builtin_ia32_selectpd_512((__mmask8) __U,
36853669
(__v8df)_mm512_cvtepu32_pd(__A),
36863670
(__v8df)_mm512_setzero_pd());
36873671
}
36883672

3689-
static __inline__ __m512d __DEFAULT_FN_ATTRS512
3690-
_mm512_cvtepu32lo_pd(__m512i __A)
3691-
{
3673+
static __inline__ __m512d __DEFAULT_FN_ATTRS512_CONSTEXPR
3674+
_mm512_cvtepu32lo_pd(__m512i __A) {
36923675
return (__m512d) _mm512_cvtepu32_pd(_mm512_castsi512_si256(__A));
36933676
}
36943677

3695-
static __inline__ __m512d __DEFAULT_FN_ATTRS512
3696-
_mm512_mask_cvtepu32lo_pd(__m512d __W, __mmask8 __U,__m512i __A)
3697-
{
3678+
static __inline__ __m512d __DEFAULT_FN_ATTRS512_CONSTEXPR
3679+
_mm512_mask_cvtepu32lo_pd(__m512d __W, __mmask8 __U, __m512i __A) {
36983680
return (__m512d) _mm512_mask_cvtepu32_pd(__W, __U, _mm512_castsi512_si256(__A));
36993681
}
37003682

@@ -8875,37 +8857,32 @@ _mm512_maskz_expand_epi32 (__mmask16 __U, __m512i __A)
88758857
(__v8df)_mm512_setzero_pd(), \
88768858
(__mmask8)(U), (int)(R)))
88778859

8878-
static __inline__ __m512d __DEFAULT_FN_ATTRS512
8879-
_mm512_cvtps_pd (__m256 __A)
8880-
{
8860+
static __inline__ __m512d
8861+
__DEFAULT_FN_ATTRS512_CONSTEXPR _mm512_cvtps_pd(__m256 __A) {
88818862
return (__m512d) __builtin_convertvector((__v8sf)__A, __v8df);
88828863
}
88838864

8884-
static __inline__ __m512d __DEFAULT_FN_ATTRS512
8885-
_mm512_mask_cvtps_pd (__m512d __W, __mmask8 __U, __m256 __A)
8886-
{
8865+
static __inline__ __m512d __DEFAULT_FN_ATTRS512_CONSTEXPR
8866+
_mm512_mask_cvtps_pd(__m512d __W, __mmask8 __U, __m256 __A) {
88878867
return (__m512d)__builtin_ia32_selectpd_512((__mmask8)__U,
88888868
(__v8df)_mm512_cvtps_pd(__A),
88898869
(__v8df)__W);
88908870
}
88918871

8892-
static __inline__ __m512d __DEFAULT_FN_ATTRS512
8893-
_mm512_maskz_cvtps_pd (__mmask8 __U, __m256 __A)
8894-
{
8872+
static __inline__ __m512d __DEFAULT_FN_ATTRS512_CONSTEXPR
8873+
_mm512_maskz_cvtps_pd(__mmask8 __U, __m256 __A) {
88958874
return (__m512d)__builtin_ia32_selectpd_512((__mmask8)__U,
88968875
(__v8df)_mm512_cvtps_pd(__A),
88978876
(__v8df)_mm512_setzero_pd());
88988877
}
88998878

8900-
static __inline__ __m512d __DEFAULT_FN_ATTRS512
8901-
_mm512_cvtpslo_pd (__m512 __A)
8902-
{
8879+
static __inline__ __m512d __DEFAULT_FN_ATTRS512_CONSTEXPR
8880+
_mm512_cvtpslo_pd(__m512 __A) {
89038881
return (__m512d) _mm512_cvtps_pd(_mm512_castps512_ps256(__A));
89048882
}
89058883

8906-
static __inline__ __m512d __DEFAULT_FN_ATTRS512
8907-
_mm512_mask_cvtpslo_pd (__m512d __W, __mmask8 __U, __m512 __A)
8908-
{
8884+
static __inline__ __m512d __DEFAULT_FN_ATTRS512_CONSTEXPR
8885+
_mm512_mask_cvtpslo_pd(__m512d __W, __mmask8 __U, __m512 __A) {
89098886
return (__m512d) _mm512_mask_cvtps_pd(__W, __U, _mm512_castps512_ps256(__A));
89108887
}
89118888

clang/lib/Headers/avxintrin.h

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2182,9 +2182,8 @@ _mm256_blendv_ps(__m256 __a, __m256 __b, __m256 __c)
21822182
/// \param __a
21832183
/// A 128-bit integer vector of [4 x i32].
21842184
/// \returns A 256-bit vector of [4 x double] containing the converted values.
2185-
static __inline __m256d __DEFAULT_FN_ATTRS
2186-
_mm256_cvtepi32_pd(__m128i __a)
2187-
{
2185+
static __inline __m256d __DEFAULT_FN_ATTRS_CONSTEXPR
2186+
_mm256_cvtepi32_pd(__m128i __a) {
21882187
return (__m256d)__builtin_convertvector((__v4si)__a, __v4df);
21892188
}
21902189

@@ -2197,9 +2196,8 @@ _mm256_cvtepi32_pd(__m128i __a)
21972196
/// \param __a
21982197
/// A 256-bit integer vector.
21992198
/// \returns A 256-bit vector of [8 x float] containing the converted values.
2200-
static __inline __m256 __DEFAULT_FN_ATTRS
2201-
_mm256_cvtepi32_ps(__m256i __a)
2202-
{
2199+
static __inline __m256 __DEFAULT_FN_ATTRS_CONSTEXPR
2200+
_mm256_cvtepi32_ps(__m256i __a) {
22032201
return (__m256)__builtin_convertvector((__v8si)__a, __v8sf);
22042202
}
22052203

@@ -2248,9 +2246,8 @@ _mm256_cvtps_epi32(__m256 __a)
22482246
/// \param __a
22492247
/// A 128-bit vector of [4 x float].
22502248
/// \returns A 256-bit vector of [4 x double] containing the converted values.
2251-
static __inline __m256d __DEFAULT_FN_ATTRS
2252-
_mm256_cvtps_pd(__m128 __a)
2253-
{
2249+
static __inline __m256d __DEFAULT_FN_ATTRS_CONSTEXPR
2250+
_mm256_cvtps_pd(__m128 __a) {
22542251
return (__m256d)__builtin_convertvector((__v4sf)__a, __v4df);
22552252
}
22562253

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -934,12 +934,16 @@ __m256d test_mm256_cvtepi32_pd(__m128i A) {
934934
return _mm256_cvtepi32_pd(A);
935935
}
936936

937+
TEST_CONSTEXPR(match_m256d(_mm256_cvtepi32_pd((__m128i)(__v4si){-2, -1, 0, 1}), -2.0, -1.0, 0.0, 1.0));
938+
937939
__m256 test_mm256_cvtepi32_ps(__m256i A) {
938940
// CHECK-LABEL: test_mm256_cvtepi32_ps
939941
// CHECK: sitofp <8 x i32> %{{.*}} to <8 x float>
940942
return _mm256_cvtepi32_ps(A);
941943
}
942944

945+
TEST_CONSTEXPR(match_m256(_mm256_cvtepi32_ps((__m256i)(__v8si){-8, -4, -2, -1, 0, 1, 2, 4}), -8.0f, -4.0f, -2.0f, -1.0f, 0.0f, 1.0f, 2.0f, 4.0f));
946+
943947
__m128i test_mm256_cvtpd_epi32(__m256d A) {
944948
// CHECK-LABEL: test_mm256_cvtpd_epi32
945949
// CHECK: call <4 x i32> @llvm.x86.avx.cvt.pd2dq.256(<4 x double> %{{.*}})
@@ -964,6 +968,8 @@ __m256d test_mm256_cvtps_pd(__m128 A) {
964968
return _mm256_cvtps_pd(A);
965969
}
966970

971+
TEST_CONSTEXPR(match_m256d(_mm256_cvtps_pd((__m128){0.25f, 1.75f, -1.75f, 16777216.0f}), 0.25, 1.75, -1.75, 16777216.0));
972+
967973
double test_mm256_cvtsd_f64(__m256d __a) {
968974
// CHECK-LABEL: test_mm256_cvtsd_f64
969975
// CHECK: extractelement <4 x double> %{{.*}}, i32 0

0 commit comments

Comments
 (0)