Skip to content

Commit 5a6c699

Browse files
sskzakariaaokblast
authored andcommitted
[Headers][X86] Add constexpr support for some AVX512 masked extension/truncation intrinsics. (#161984)
The following AVX[512] intrinsics are now constexpr: * _mm_cvtepi32_epi8 * _mm_cvtepi32_epi16 * _mm_cvtepi64_epi8 * _mm_cvtepi64_epi16 * _mm_cvtepi64_epi32 * _mm256_cvtepi32_epi8 * _mm256_cvtepi32_epi16 * _mm256_cvtepi64_epi8 * _mm256_cvtepi64_epi16 * _mm256_cvtepi64_epi32 * _mm256_mask_cvtepi64_epi32 * _mm256_maskz_cvtepi64_epi32 Fixes #154539
1 parent 3bae5c9 commit 5a6c699

File tree

2 files changed

+49
-38
lines changed

2 files changed

+49
-38
lines changed

clang/lib/Headers/avx512vlintrin.h

Lines changed: 25 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -7330,9 +7330,8 @@ _mm256_mask_cvtusepi64_storeu_epi16 (void * __P, __mmask8 __M, __m256i __A)
73307330
__builtin_ia32_pmovusqw256mem_mask ((__v8hi *) __P, (__v4di) __A, __M);
73317331
}
73327332

7333-
static __inline__ __m128i __DEFAULT_FN_ATTRS128
7334-
_mm_cvtepi32_epi8 (__m128i __A)
7335-
{
7333+
static __inline__ __m128i __DEFAULT_FN_ATTRS128_CONSTEXPR
7334+
_mm_cvtepi32_epi8(__m128i __A) {
73367335
return (__m128i)__builtin_shufflevector(
73377336
__builtin_convertvector((__v4si)__A, __v4qi), (__v4qi){0, 0, 0, 0}, 0, 1,
73387337
2, 3, 4, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7);
@@ -7360,18 +7359,16 @@ _mm_mask_cvtepi32_storeu_epi8 (void * __P, __mmask8 __M, __m128i __A)
73607359
__builtin_ia32_pmovdb128mem_mask ((__v16qi *) __P, (__v4si) __A, __M);
73617360
}
73627361

7363-
static __inline__ __m128i __DEFAULT_FN_ATTRS256
7364-
_mm256_cvtepi32_epi8 (__m256i __A)
7365-
{
7362+
static __inline__ __m128i __DEFAULT_FN_ATTRS256_CONSTEXPR
7363+
_mm256_cvtepi32_epi8(__m256i __A) {
73667364
return (__m128i)__builtin_shufflevector(
73677365
__builtin_convertvector((__v8si)__A, __v8qi),
73687366
(__v8qi){0, 0, 0, 0, 0, 0, 0, 0}, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
73697367
12, 13, 14, 15);
73707368
}
73717369

73727370
static __inline__ __m128i __DEFAULT_FN_ATTRS256
7373-
_mm256_mask_cvtepi32_epi8 (__m128i __O, __mmask8 __M, __m256i __A)
7374-
{
7371+
_mm256_mask_cvtepi32_epi8(__m128i __O, __mmask8 __M, __m256i __A) {
73757372
return (__m128i) __builtin_ia32_pmovdb256_mask ((__v8si) __A,
73767373
(__v16qi) __O, __M);
73777374
}
@@ -7390,9 +7387,8 @@ _mm256_mask_cvtepi32_storeu_epi8 (void * __P, __mmask8 __M, __m256i __A)
73907387
__builtin_ia32_pmovdb256mem_mask ((__v16qi *) __P, (__v8si) __A, __M);
73917388
}
73927389

7393-
static __inline__ __m128i __DEFAULT_FN_ATTRS128
7394-
_mm_cvtepi32_epi16 (__m128i __A)
7395-
{
7390+
static __inline__ __m128i __DEFAULT_FN_ATTRS128_CONSTEXPR
7391+
_mm_cvtepi32_epi16(__m128i __A) {
73967392
return (__m128i)__builtin_shufflevector(
73977393
__builtin_convertvector((__v4si)__A, __v4hi), (__v4hi){0, 0, 0, 0}, 0, 1,
73987394
2, 3, 4, 5, 6, 7);
@@ -7419,9 +7415,8 @@ _mm_mask_cvtepi32_storeu_epi16 (void * __P, __mmask8 __M, __m128i __A)
74197415
__builtin_ia32_pmovdw128mem_mask ((__v8hi *) __P, (__v4si) __A, __M);
74207416
}
74217417

7422-
static __inline__ __m128i __DEFAULT_FN_ATTRS256
7423-
_mm256_cvtepi32_epi16 (__m256i __A)
7424-
{
7418+
static __inline__ __m128i __DEFAULT_FN_ATTRS256_CONSTEXPR
7419+
_mm256_cvtepi32_epi16(__m256i __A) {
74257420
return (__m128i)__builtin_convertvector((__v8si)__A, __v8hi);
74267421
}
74277422

@@ -7446,9 +7441,8 @@ _mm256_mask_cvtepi32_storeu_epi16 (void * __P, __mmask8 __M, __m256i __A)
74467441
__builtin_ia32_pmovdw256mem_mask ((__v8hi *) __P, (__v8si) __A, __M);
74477442
}
74487443

7449-
static __inline__ __m128i __DEFAULT_FN_ATTRS128
7450-
_mm_cvtepi64_epi8 (__m128i __A)
7451-
{
7444+
static __inline__ __m128i __DEFAULT_FN_ATTRS128_CONSTEXPR
7445+
_mm_cvtepi64_epi8(__m128i __A) {
74527446
return (__m128i)__builtin_shufflevector(
74537447
__builtin_convertvector((__v2di)__A, __v2qi), (__v2qi){0, 0}, 0, 1, 2, 3,
74547448
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3);
@@ -7475,9 +7469,8 @@ _mm_mask_cvtepi64_storeu_epi8 (void * __P, __mmask8 __M, __m128i __A)
74757469
__builtin_ia32_pmovqb128mem_mask ((__v16qi *) __P, (__v2di) __A, __M);
74767470
}
74777471

7478-
static __inline__ __m128i __DEFAULT_FN_ATTRS256
7479-
_mm256_cvtepi64_epi8 (__m256i __A)
7480-
{
7472+
static __inline__ __m128i __DEFAULT_FN_ATTRS256_CONSTEXPR
7473+
_mm256_cvtepi64_epi8(__m256i __A) {
74817474
return (__m128i)__builtin_shufflevector(
74827475
__builtin_convertvector((__v4di)__A, __v4qi), (__v4qi){0, 0, 0, 0}, 0, 1,
74837476
2, 3, 4, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7);
@@ -7504,9 +7497,8 @@ _mm256_mask_cvtepi64_storeu_epi8 (void * __P, __mmask8 __M, __m256i __A)
75047497
__builtin_ia32_pmovqb256mem_mask ((__v16qi *) __P, (__v4di) __A, __M);
75057498
}
75067499

7507-
static __inline__ __m128i __DEFAULT_FN_ATTRS128
7508-
_mm_cvtepi64_epi32 (__m128i __A)
7509-
{
7500+
static __inline__ __m128i __DEFAULT_FN_ATTRS128_CONSTEXPR
7501+
_mm_cvtepi64_epi32(__m128i __A) {
75107502
return (__m128i)__builtin_shufflevector(
75117503
__builtin_convertvector((__v2di)__A, __v2si), (__v2si){0, 0}, 0, 1, 2, 3);
75127504
}
@@ -7532,23 +7524,20 @@ _mm_mask_cvtepi64_storeu_epi32 (void * __P, __mmask8 __M, __m128i __A)
75327524
__builtin_ia32_pmovqd128mem_mask ((__v4si *) __P, (__v2di) __A, __M);
75337525
}
75347526

7535-
static __inline__ __m128i __DEFAULT_FN_ATTRS256
7536-
_mm256_cvtepi64_epi32 (__m256i __A)
7537-
{
7527+
static __inline__ __m128i __DEFAULT_FN_ATTRS256_CONSTEXPR
7528+
_mm256_cvtepi64_epi32(__m256i __A) {
75387529
return (__m128i)__builtin_convertvector((__v4di)__A, __v4si);
75397530
}
75407531

7541-
static __inline__ __m128i __DEFAULT_FN_ATTRS256
7542-
_mm256_mask_cvtepi64_epi32 (__m128i __O, __mmask8 __M, __m256i __A)
7543-
{
7532+
static __inline__ __m128i __DEFAULT_FN_ATTRS256_CONSTEXPR
7533+
_mm256_mask_cvtepi64_epi32(__m128i __O, __mmask8 __M, __m256i __A) {
75447534
return (__m128i)__builtin_ia32_selectd_128((__mmask8)__M,
75457535
(__v4si)_mm256_cvtepi64_epi32(__A),
75467536
(__v4si)__O);
75477537
}
75487538

7549-
static __inline__ __m128i __DEFAULT_FN_ATTRS256
7550-
_mm256_maskz_cvtepi64_epi32 (__mmask8 __M, __m256i __A)
7551-
{
7539+
static __inline__ __m128i __DEFAULT_FN_ATTRS256_CONSTEXPR
7540+
_mm256_maskz_cvtepi64_epi32(__mmask8 __M, __m256i __A) {
75527541
return (__m128i)__builtin_ia32_selectd_128((__mmask8)__M,
75537542
(__v4si)_mm256_cvtepi64_epi32(__A),
75547543
(__v4si)_mm_setzero_si128());
@@ -7560,9 +7549,8 @@ _mm256_mask_cvtepi64_storeu_epi32 (void * __P, __mmask8 __M, __m256i __A)
75607549
__builtin_ia32_pmovqd256mem_mask ((__v4si *) __P, (__v4di) __A, __M);
75617550
}
75627551

7563-
static __inline__ __m128i __DEFAULT_FN_ATTRS128
7564-
_mm_cvtepi64_epi16 (__m128i __A)
7565-
{
7552+
static __inline__ __m128i __DEFAULT_FN_ATTRS128_CONSTEXPR
7553+
_mm_cvtepi64_epi16(__m128i __A) {
75667554
return (__m128i)__builtin_shufflevector(
75677555
__builtin_convertvector((__v2di)__A, __v2hi), (__v2hi){0, 0}, 0, 1, 2, 3,
75687556
3, 3, 3, 3);
@@ -7590,9 +7578,8 @@ _mm_mask_cvtepi64_storeu_epi16 (void * __P, __mmask8 __M, __m128i __A)
75907578
__builtin_ia32_pmovqw128mem_mask ((__v8hi *) __P, (__v2di) __A, __M);
75917579
}
75927580

7593-
static __inline__ __m128i __DEFAULT_FN_ATTRS256
7594-
_mm256_cvtepi64_epi16 (__m256i __A)
7595-
{
7581+
static __inline__ __m128i __DEFAULT_FN_ATTRS256_CONSTEXPR
7582+
_mm256_cvtepi64_epi16(__m256i __A) {
75967583
return (__m128i)__builtin_shufflevector(
75977584
__builtin_convertvector((__v4di)__A, __v4hi), (__v4hi){0, 0, 0, 0}, 0, 1,
75987585
2, 3, 4, 5, 6, 7);

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9272,6 +9272,8 @@ __m128i test_mm_cvtepi32_epi8(__m128i __A) {
92729272
return _mm_cvtepi32_epi8(__A);
92739273
}
92749274

9275+
TEST_CONSTEXPR(match_v16qi(_mm_cvtepi32_epi8((__m128i)(__v4si){1, 2, 3, 4}), 1 ,2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0));
9276+
92759277
__m128i test_mm_mask_cvtepi32_epi8(__m128i __O, __mmask8 __M, __m128i __A) {
92769278
// CHECK-LABEL: test_mm_mask_cvtepi32_epi8
92779279
// CHECK: @llvm.x86.avx512.mask.pmov.db.128
@@ -9297,6 +9299,8 @@ __m128i test_mm256_cvtepi32_epi8(__m256i __A) {
92979299
return _mm256_cvtepi32_epi8(__A);
92989300
}
92999301

9302+
TEST_CONSTEXPR(match_v16qi(_mm256_cvtepi32_epi8((__m256i)(__v8si){1, 2, 3, 4, 5, 6, 7, 8}), 1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0 ,0));
9303+
93009304
__m128i test_mm256_mask_cvtepi32_epi8(__m128i __O, __mmask8 __M, __m256i __A) {
93019305
// CHECK-LABEL: test_mm256_mask_cvtepi32_epi8
93029306
// CHECK: @llvm.x86.avx512.mask.pmov.db.256
@@ -9322,6 +9326,8 @@ __m128i test_mm_cvtepi32_epi16(__m128i __A) {
93229326
return _mm_cvtepi32_epi16(__A);
93239327
}
93249328

9329+
TEST_CONSTEXPR(match_v8hi(_mm_cvtepi32_epi16((__m128i)(__v4si){1, 2, 3, 4}), 1 ,2, 3, 4, 0, 0, 0, 0));
9330+
93259331
__m128i test_mm_mask_cvtepi32_epi16(__m128i __O, __mmask8 __M, __m128i __A) {
93269332
// CHECK-LABEL: test_mm_mask_cvtepi32_epi16
93279333
// CHECK: @llvm.x86.avx512.mask.pmov.dw.128
@@ -9346,6 +9352,8 @@ __m128i test_mm256_cvtepi32_epi16(__m256i __A) {
93469352
return _mm256_cvtepi32_epi16(__A);
93479353
}
93489354

9355+
TEST_CONSTEXPR(match_v8hi(_mm256_cvtepi32_epi16((__m256i)(__v8si){1, 2, 3, 4, 5, 6, 7, 8}), 1, 2, 3, 4, 5, 6, 7, 8));
9356+
93499357
__m128i test_mm256_mask_cvtepi32_epi16(__m128i __O, __mmask8 __M, __m256i __A) {
93509358
// CHECK-LABEL: test_mm256_mask_cvtepi32_epi16
93519359
// CHECK: @llvm.x86.avx512.mask.pmov.dw.256
@@ -9371,6 +9379,8 @@ __m128i test_mm_cvtepi64_epi8(__m128i __A) {
93719379
return _mm_cvtepi64_epi8(__A);
93729380
}
93739381

9382+
TEST_CONSTEXPR(match_v16qi(_mm_cvtepi64_epi8((__m128i)(__v2di){1, 2}), 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0));
9383+
93749384
__m128i test_mm_mask_cvtepi64_epi8(__m128i __O, __mmask8 __M, __m128i __A) {
93759385
// CHECK-LABEL: test_mm_mask_cvtepi64_epi8
93769386
// CHECK: @llvm.x86.avx512.mask.pmov.qb.128
@@ -9396,6 +9406,8 @@ __m128i test_mm256_cvtepi64_epi8(__m256i __A) {
93969406
return _mm256_cvtepi64_epi8(__A);
93979407
}
93989408

9409+
TEST_CONSTEXPR(match_v16qi(_mm256_cvtepi64_epi8((__m256i)(__v4di){1, 2, 3, 4}), 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0));
9410+
93999411
__m128i test_mm256_mask_cvtepi64_epi8(__m128i __O, __mmask8 __M, __m256i __A) {
94009412
// CHECK-LABEL: test_mm256_mask_cvtepi64_epi8
94019413
// CHECK: @llvm.x86.avx512.mask.pmov.qb.256
@@ -9421,6 +9433,8 @@ __m128i test_mm_cvtepi64_epi32(__m128i __A) {
94219433
return _mm_cvtepi64_epi32(__A);
94229434
}
94239435

9436+
TEST_CONSTEXPR(match_v4si(_mm_cvtepi64_epi32((__m128i)(__v2di){1, 2}),1, 2, 0, 0));
9437+
94249438
__m128i test_mm_mask_cvtepi64_epi32(__m128i __O, __mmask8 __M, __m128i __A) {
94259439
// CHECK-LABEL: test_mm_mask_cvtepi64_epi32
94269440
// CHECK: @llvm.x86.avx512.mask.pmov.qd.128
@@ -9445,20 +9459,26 @@ __m128i test_mm256_cvtepi64_epi32(__m256i __A) {
94459459
return _mm256_cvtepi64_epi32(__A);
94469460
}
94479461

9462+
TEST_CONSTEXPR(match_v4si(_mm256_cvtepi64_epi32((__m256i)(__v4di){1 ,2 ,3 ,4}), 1, 2, 3, 4));
9463+
94489464
__m128i test_mm256_mask_cvtepi64_epi32(__m128i __O, __mmask8 __M, __m256i __A) {
94499465
// CHECK-LABEL: test_mm256_mask_cvtepi64_epi32
94509466
// CHECK: trunc <4 x i64> %{{.*}} to <4 x i32>
94519467
// CHECK: select <4 x i1> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> %{{.*}}
94529468
return _mm256_mask_cvtepi64_epi32(__O, __M, __A);
94539469
}
94549470

9471+
TEST_CONSTEXPR(match_v4si(_mm256_mask_cvtepi64_epi32(_mm_set1_epi32(-777), 0xA,(__m256i)(__v4di){1, -2, 3, -4}), -777, -2, -777, -4));
9472+
94559473
__m128i test_mm256_maskz_cvtepi64_epi32(__mmask8 __M, __m256i __A) {
94569474
// CHECK-LABEL: test_mm256_maskz_cvtepi64_epi32
94579475
// CHECK: trunc <4 x i64> %{{.*}} to <4 x i32>
94589476
// CHECK: select <4 x i1> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> %{{.*}}
94599477
return _mm256_maskz_cvtepi64_epi32(__M, __A);
94609478
}
94619479

9480+
TEST_CONSTEXPR(match_v4si(_mm256_maskz_cvtepi64_epi32( 0xA,(__m256i)(__v4di){1, -2, 3, -4}),0 , -2, 0, -4));
9481+
94629482
void test_mm256_mask_cvtepi64_storeu_epi32(void * __P, __mmask8 __M, __m256i __A) {
94639483
// CHECK-LABEL: test_mm256_mask_cvtepi64_storeu_epi32
94649484
// CHECK: @llvm.x86.avx512.mask.pmov.qd.mem.256
@@ -9472,6 +9492,8 @@ __m128i test_mm_cvtepi64_epi16(__m128i __A) {
94729492
return _mm_cvtepi64_epi16(__A);
94739493
}
94749494

9495+
TEST_CONSTEXPR(match_v8hi(_mm_cvtepi64_epi16((__m128i)(__v2di){1, 2}),1, 2, 0, 0, 0, 0, 0, 0));
9496+
94759497
__m128i test_mm_mask_cvtepi64_epi16(__m128i __O, __mmask8 __M, __m128i __A) {
94769498
// CHECK-LABEL: test_mm_mask_cvtepi64_epi16
94779499
// CHECK: @llvm.x86.avx512.mask.pmov.qw.128
@@ -9497,6 +9519,8 @@ __m128i test_mm256_cvtepi64_epi16(__m256i __A) {
94979519
return _mm256_cvtepi64_epi16(__A);
94989520
}
94999521

9522+
TEST_CONSTEXPR(match_v8hi(_mm256_cvtepi64_epi16((__m256i)(__v4di){1 ,2, 3, 4}),1, 2, 3, 4, 0, 0, 0, 0));
9523+
95009524
__m128i test_mm256_mask_cvtepi64_epi16(__m128i __O, __mmask8 __M, __m256i __A) {
95019525
// CHECK-LABEL: test_mm256_mask_cvtepi64_epi16
95029526
// CHECK: @llvm.x86.avx512.mask.pmov.qw.256

0 commit comments

Comments
 (0)