Skip to content

Commit 8843bc5

Browse files
TianYe717RKSimon
andauthored
[Headers][X86] Allow integer/fp absolute intrinsics to be used in constexpr (#154662)
Fixes #153556. In addition, four supporting intrinsics were also updated to constexpr and tested, as they are directly used by the above intrinsics: - _mm512_mask_and_epi64 - _mm512_mask_and_epi32 - _mm_and_epi32 - _mm256_and_epi32 Co-authored-by: Simon Pilgrim <[email protected]>
1 parent 7060fc5 commit 8843bc5

17 files changed

+190
-141
lines changed

clang/lib/Headers/avx2intrin.h

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -112,10 +112,9 @@
112112
/// \param __a
113113
/// A 256-bit integer vector.
114114
/// \returns A 256-bit integer vector containing the result.
115-
static __inline__ __m256i __DEFAULT_FN_ATTRS256
116-
_mm256_abs_epi8(__m256i __a)
117-
{
118-
return (__m256i)__builtin_elementwise_abs((__v32qs)__a);
115+
static __inline__ __m256i __DEFAULT_FN_ATTRS256_CONSTEXPR
116+
_mm256_abs_epi8(__m256i __a) {
117+
return (__m256i)__builtin_elementwise_abs((__v32qs)__a);
119118
}
120119

121120
/// Computes the absolute value of each signed 16-bit element in the 256-bit
@@ -129,10 +128,9 @@ _mm256_abs_epi8(__m256i __a)
129128
/// \param __a
130129
/// A 256-bit vector of [16 x i16].
131130
/// \returns A 256-bit vector of [16 x i16] containing the result.
132-
static __inline__ __m256i __DEFAULT_FN_ATTRS256
133-
_mm256_abs_epi16(__m256i __a)
134-
{
135-
return (__m256i)__builtin_elementwise_abs((__v16hi)__a);
131+
static __inline__ __m256i __DEFAULT_FN_ATTRS256_CONSTEXPR
132+
_mm256_abs_epi16(__m256i __a) {
133+
return (__m256i)__builtin_elementwise_abs((__v16hi)__a);
136134
}
137135

138136
/// Computes the absolute value of each signed 32-bit element in the 256-bit
@@ -146,10 +144,9 @@ _mm256_abs_epi16(__m256i __a)
146144
/// \param __a
147145
/// A 256-bit vector of [8 x i32].
148146
/// \returns A 256-bit vector of [8 x i32] containing the result.
149-
static __inline__ __m256i __DEFAULT_FN_ATTRS256
150-
_mm256_abs_epi32(__m256i __a)
151-
{
152-
return (__m256i)__builtin_elementwise_abs((__v8si)__a);
147+
static __inline__ __m256i __DEFAULT_FN_ATTRS256_CONSTEXPR
148+
_mm256_abs_epi32(__m256i __a) {
149+
return (__m256i)__builtin_elementwise_abs((__v8si)__a);
153150
}
154151

155152
/// Converts the elements of two 256-bit vectors of [16 x i16] to 8-bit

clang/lib/Headers/avx512bwintrin.h

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -481,45 +481,39 @@ _mm512_mask_blend_epi16 (__mmask32 __U, __m512i __A, __m512i __W)
481481
(__v32hi) __A);
482482
}
483483

484-
static __inline__ __m512i __DEFAULT_FN_ATTRS512
485-
_mm512_abs_epi8 (__m512i __A)
486-
{
484+
static __inline__ __m512i __DEFAULT_FN_ATTRS512_CONSTEXPR
485+
_mm512_abs_epi8(__m512i __A) {
487486
return (__m512i)__builtin_elementwise_abs((__v64qs)__A);
488487
}
489488

490-
static __inline__ __m512i __DEFAULT_FN_ATTRS512
491-
_mm512_mask_abs_epi8 (__m512i __W, __mmask64 __U, __m512i __A)
492-
{
489+
static __inline__ __m512i __DEFAULT_FN_ATTRS512_CONSTEXPR
490+
_mm512_mask_abs_epi8(__m512i __W, __mmask64 __U, __m512i __A) {
493491
return (__m512i)__builtin_ia32_selectb_512((__mmask64)__U,
494492
(__v64qi)_mm512_abs_epi8(__A),
495493
(__v64qi)__W);
496494
}
497495

498-
static __inline__ __m512i __DEFAULT_FN_ATTRS512
499-
_mm512_maskz_abs_epi8 (__mmask64 __U, __m512i __A)
500-
{
496+
static __inline__ __m512i __DEFAULT_FN_ATTRS512_CONSTEXPR
497+
_mm512_maskz_abs_epi8(__mmask64 __U, __m512i __A) {
501498
return (__m512i)__builtin_ia32_selectb_512((__mmask64)__U,
502499
(__v64qi)_mm512_abs_epi8(__A),
503500
(__v64qi)_mm512_setzero_si512());
504501
}
505502

506-
static __inline__ __m512i __DEFAULT_FN_ATTRS512
507-
_mm512_abs_epi16 (__m512i __A)
508-
{
503+
static __inline__ __m512i __DEFAULT_FN_ATTRS512_CONSTEXPR
504+
_mm512_abs_epi16(__m512i __A) {
509505
return (__m512i)__builtin_elementwise_abs((__v32hi)__A);
510506
}
511507

512-
static __inline__ __m512i __DEFAULT_FN_ATTRS512
513-
_mm512_mask_abs_epi16 (__m512i __W, __mmask32 __U, __m512i __A)
514-
{
508+
static __inline__ __m512i __DEFAULT_FN_ATTRS512_CONSTEXPR
509+
_mm512_mask_abs_epi16(__m512i __W, __mmask32 __U, __m512i __A) {
515510
return (__m512i)__builtin_ia32_selectw_512((__mmask32)__U,
516511
(__v32hi)_mm512_abs_epi16(__A),
517512
(__v32hi)__W);
518513
}
519514

520-
static __inline__ __m512i __DEFAULT_FN_ATTRS512
521-
_mm512_maskz_abs_epi16 (__mmask32 __U, __m512i __A)
522-
{
515+
static __inline__ __m512i __DEFAULT_FN_ATTRS512_CONSTEXPR
516+
_mm512_maskz_abs_epi16(__mmask32 __U, __m512i __A) {
523517
return (__m512i)__builtin_ia32_selectw_512((__mmask32)__U,
524518
(__v32hi)_mm512_abs_epi16(__A),
525519
(__v32hi)_mm512_setzero_si512());

clang/lib/Headers/avx512fintrin.h

Lines changed: 26 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -642,9 +642,8 @@ _mm512_and_epi32(__m512i __a, __m512i __b)
642642
return (__m512i)((__v16su)__a & (__v16su)__b);
643643
}
644644

645-
static __inline__ __m512i __DEFAULT_FN_ATTRS512
646-
_mm512_mask_and_epi32(__m512i __src, __mmask16 __k, __m512i __a, __m512i __b)
647-
{
645+
static __inline__ __m512i __DEFAULT_FN_ATTRS512_CONSTEXPR
646+
_mm512_mask_and_epi32(__m512i __src, __mmask16 __k, __m512i __a, __m512i __b) {
648647
return (__m512i)__builtin_ia32_selectd_512((__mmask16)__k,
649648
(__v16si) _mm512_and_epi32(__a, __b),
650649
(__v16si) __src);
@@ -663,12 +662,10 @@ _mm512_and_epi64(__m512i __a, __m512i __b)
663662
return (__m512i)((__v8du)__a & (__v8du)__b);
664663
}
665664

666-
static __inline__ __m512i __DEFAULT_FN_ATTRS512
667-
_mm512_mask_and_epi64(__m512i __src, __mmask8 __k, __m512i __a, __m512i __b)
668-
{
669-
return (__m512i) __builtin_ia32_selectq_512 ((__mmask8) __k,
670-
(__v8di) _mm512_and_epi64(__a, __b),
671-
(__v8di) __src);
665+
static __inline__ __m512i __DEFAULT_FN_ATTRS512_CONSTEXPR
666+
_mm512_mask_and_epi64(__m512i __src, __mmask8 __k, __m512i __a, __m512i __b) {
667+
return (__m512i)__builtin_ia32_selectq_512(
668+
(__mmask8)__k, (__v8di)_mm512_and_epi64(__a, __b), (__v8di)__src);
672669
}
673670

674671
static __inline__ __m512i __DEFAULT_FN_ATTRS512
@@ -1848,45 +1845,39 @@ _mm512_mask_ceil_pd (__m512d __W, __mmask8 __U, __m512d __A)
18481845
_MM_FROUND_CUR_DIRECTION);
18491846
}
18501847

1851-
static __inline __m512i __DEFAULT_FN_ATTRS512
1852-
_mm512_abs_epi64(__m512i __A)
1853-
{
1848+
static __inline __m512i __DEFAULT_FN_ATTRS512_CONSTEXPR
1849+
_mm512_abs_epi64(__m512i __A) {
18541850
return (__m512i)__builtin_elementwise_abs((__v8di)__A);
18551851
}
18561852

1857-
static __inline__ __m512i __DEFAULT_FN_ATTRS512
1858-
_mm512_mask_abs_epi64 (__m512i __W, __mmask8 __U, __m512i __A)
1859-
{
1853+
static __inline__ __m512i __DEFAULT_FN_ATTRS512_CONSTEXPR
1854+
_mm512_mask_abs_epi64(__m512i __W, __mmask8 __U, __m512i __A) {
18601855
return (__m512i)__builtin_ia32_selectq_512((__mmask8)__U,
18611856
(__v8di)_mm512_abs_epi64(__A),
18621857
(__v8di)__W);
18631858
}
18641859

1865-
static __inline__ __m512i __DEFAULT_FN_ATTRS512
1866-
_mm512_maskz_abs_epi64 (__mmask8 __U, __m512i __A)
1867-
{
1860+
static __inline__ __m512i __DEFAULT_FN_ATTRS512_CONSTEXPR
1861+
_mm512_maskz_abs_epi64(__mmask8 __U, __m512i __A) {
18681862
return (__m512i)__builtin_ia32_selectq_512((__mmask8)__U,
18691863
(__v8di)_mm512_abs_epi64(__A),
18701864
(__v8di)_mm512_setzero_si512());
18711865
}
18721866

1873-
static __inline __m512i __DEFAULT_FN_ATTRS512
1874-
_mm512_abs_epi32(__m512i __A)
1875-
{
1867+
static __inline __m512i __DEFAULT_FN_ATTRS512_CONSTEXPR
1868+
_mm512_abs_epi32(__m512i __A) {
18761869
return (__m512i)__builtin_elementwise_abs((__v16si) __A);
18771870
}
18781871

1879-
static __inline__ __m512i __DEFAULT_FN_ATTRS512
1880-
_mm512_mask_abs_epi32 (__m512i __W, __mmask16 __U, __m512i __A)
1881-
{
1872+
static __inline__ __m512i __DEFAULT_FN_ATTRS512_CONSTEXPR
1873+
_mm512_mask_abs_epi32(__m512i __W, __mmask16 __U, __m512i __A) {
18821874
return (__m512i)__builtin_ia32_selectd_512(__U,
18831875
(__v16si)_mm512_abs_epi32(__A),
18841876
(__v16si)__W);
18851877
}
18861878

1887-
static __inline__ __m512i __DEFAULT_FN_ATTRS512
1888-
_mm512_maskz_abs_epi32 (__mmask16 __U, __m512i __A)
1889-
{
1879+
static __inline__ __m512i __DEFAULT_FN_ATTRS512_CONSTEXPR
1880+
_mm512_maskz_abs_epi32(__mmask16 __U, __m512i __A) {
18901881
return (__m512i)__builtin_ia32_selectd_512(__U,
18911882
(__v16si)_mm512_abs_epi32(__A),
18921883
(__v16si)_mm512_setzero_si512());
@@ -9238,27 +9229,23 @@ _mm512_set_ps(float __A, float __B, float __C, float __D, float __E, float __F,
92389229
_mm512_set_ps((e15),(e14),(e13),(e12),(e11),(e10),(e9),(e8),(e7),(e6),(e5), \
92399230
(e4),(e3),(e2),(e1),(e0))
92409231

9241-
static __inline__ __m512 __DEFAULT_FN_ATTRS512
9242-
_mm512_abs_ps(__m512 __A)
9243-
{
9232+
static __inline__ __m512 __DEFAULT_FN_ATTRS512_CONSTEXPR
9233+
_mm512_abs_ps(__m512 __A) {
92449234
return (__m512)_mm512_and_epi32(_mm512_set1_epi32(0x7FFFFFFF),(__m512i)__A) ;
92459235
}
92469236

9247-
static __inline__ __m512 __DEFAULT_FN_ATTRS512
9248-
_mm512_mask_abs_ps(__m512 __W, __mmask16 __K, __m512 __A)
9249-
{
9237+
static __inline__ __m512 __DEFAULT_FN_ATTRS512_CONSTEXPR
9238+
_mm512_mask_abs_ps(__m512 __W, __mmask16 __K, __m512 __A) {
92509239
return (__m512)_mm512_mask_and_epi32((__m512i)__W, __K, _mm512_set1_epi32(0x7FFFFFFF),(__m512i)__A) ;
92519240
}
92529241

9253-
static __inline__ __m512d __DEFAULT_FN_ATTRS512
9254-
_mm512_abs_pd(__m512d __A)
9255-
{
9242+
static __inline__ __m512d __DEFAULT_FN_ATTRS512_CONSTEXPR
9243+
_mm512_abs_pd(__m512d __A) {
92569244
return (__m512d)_mm512_and_epi64(_mm512_set1_epi64(0x7FFFFFFFFFFFFFFF),(__v8di)__A) ;
92579245
}
92589246

9259-
static __inline__ __m512d __DEFAULT_FN_ATTRS512
9260-
_mm512_mask_abs_pd(__m512d __W, __mmask8 __K, __m512d __A)
9261-
{
9247+
static __inline__ __m512d __DEFAULT_FN_ATTRS512_CONSTEXPR
9248+
_mm512_mask_abs_pd(__m512d __W, __mmask8 __K, __m512d __A) {
92629249
return (__m512d)_mm512_mask_and_epi64((__v8di)__W, __K, _mm512_set1_epi64(0x7FFFFFFFFFFFFFFF),(__v8di)__A);
92639250
}
92649251

clang/lib/Headers/avx512fp16intrin.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -561,7 +561,8 @@ _mm512_maskz_max_ph(__mmask32 __U, __m512h __A, __m512h __B) {
561561
(__mmask32)(U), (__v32hf)_mm512_max_round_ph((A), (B), (R)), \
562562
(__v32hf)_mm512_setzero_ph()))
563563

564-
static __inline__ __m512h __DEFAULT_FN_ATTRS512 _mm512_abs_ph(__m512h __A) {
564+
static __inline__ __m512h __DEFAULT_FN_ATTRS512_CONSTEXPR
565+
_mm512_abs_ph(__m512h __A) {
565566
return (__m512h)_mm512_and_epi32(_mm512_set1_epi32(0x7FFF7FFF), (__m512i)__A);
566567
}
567568

clang/lib/Headers/avx512vlbwintrin.h

Lines changed: 16 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -486,65 +486,57 @@ _mm256_mask_blend_epi16 (__mmask16 __U, __m256i __A, __m256i __W)
486486
(__v16hi) __A);
487487
}
488488

489-
static __inline__ __m128i __DEFAULT_FN_ATTRS128
490-
_mm_mask_abs_epi8(__m128i __W, __mmask16 __U, __m128i __A)
491-
{
489+
static __inline__ __m128i __DEFAULT_FN_ATTRS128_CONSTEXPR
490+
_mm_mask_abs_epi8(__m128i __W, __mmask16 __U, __m128i __A) {
492491
return (__m128i)__builtin_ia32_selectb_128((__mmask16)__U,
493492
(__v16qi)_mm_abs_epi8(__A),
494493
(__v16qi)__W);
495494
}
496495

497-
static __inline__ __m128i __DEFAULT_FN_ATTRS128
498-
_mm_maskz_abs_epi8(__mmask16 __U, __m128i __A)
499-
{
496+
static __inline__ __m128i __DEFAULT_FN_ATTRS128_CONSTEXPR
497+
_mm_maskz_abs_epi8(__mmask16 __U, __m128i __A) {
500498
return (__m128i)__builtin_ia32_selectb_128((__mmask16)__U,
501499
(__v16qi)_mm_abs_epi8(__A),
502500
(__v16qi)_mm_setzero_si128());
503501
}
504502

505-
static __inline__ __m256i __DEFAULT_FN_ATTRS256
506-
_mm256_mask_abs_epi8(__m256i __W, __mmask32 __U, __m256i __A)
507-
{
503+
static __inline__ __m256i __DEFAULT_FN_ATTRS256_CONSTEXPR
504+
_mm256_mask_abs_epi8(__m256i __W, __mmask32 __U, __m256i __A) {
508505
return (__m256i)__builtin_ia32_selectb_256((__mmask32)__U,
509506
(__v32qi)_mm256_abs_epi8(__A),
510507
(__v32qi)__W);
511508
}
512509

513-
static __inline__ __m256i __DEFAULT_FN_ATTRS256
514-
_mm256_maskz_abs_epi8 (__mmask32 __U, __m256i __A)
515-
{
510+
static __inline__ __m256i __DEFAULT_FN_ATTRS256_CONSTEXPR
511+
_mm256_maskz_abs_epi8(__mmask32 __U, __m256i __A) {
516512
return (__m256i)__builtin_ia32_selectb_256((__mmask32)__U,
517513
(__v32qi)_mm256_abs_epi8(__A),
518514
(__v32qi)_mm256_setzero_si256());
519515
}
520516

521-
static __inline__ __m128i __DEFAULT_FN_ATTRS128
522-
_mm_mask_abs_epi16(__m128i __W, __mmask8 __U, __m128i __A)
523-
{
517+
static __inline__ __m128i __DEFAULT_FN_ATTRS128_CONSTEXPR
518+
_mm_mask_abs_epi16(__m128i __W, __mmask8 __U, __m128i __A) {
524519
return (__m128i)__builtin_ia32_selectw_128((__mmask8)__U,
525520
(__v8hi)_mm_abs_epi16(__A),
526521
(__v8hi)__W);
527522
}
528523

529-
static __inline__ __m128i __DEFAULT_FN_ATTRS128
530-
_mm_maskz_abs_epi16(__mmask8 __U, __m128i __A)
531-
{
524+
static __inline__ __m128i __DEFAULT_FN_ATTRS128_CONSTEXPR
525+
_mm_maskz_abs_epi16(__mmask8 __U, __m128i __A) {
532526
return (__m128i)__builtin_ia32_selectw_128((__mmask8)__U,
533527
(__v8hi)_mm_abs_epi16(__A),
534528
(__v8hi)_mm_setzero_si128());
535529
}
536530

537-
static __inline__ __m256i __DEFAULT_FN_ATTRS256
538-
_mm256_mask_abs_epi16(__m256i __W, __mmask16 __U, __m256i __A)
539-
{
531+
static __inline__ __m256i __DEFAULT_FN_ATTRS256_CONSTEXPR
532+
_mm256_mask_abs_epi16(__m256i __W, __mmask16 __U, __m256i __A) {
540533
return (__m256i)__builtin_ia32_selectw_256((__mmask16)__U,
541534
(__v16hi)_mm256_abs_epi16(__A),
542535
(__v16hi)__W);
543536
}
544537

545-
static __inline__ __m256i __DEFAULT_FN_ATTRS256
546-
_mm256_maskz_abs_epi16(__mmask16 __U, __m256i __A)
547-
{
538+
static __inline__ __m256i __DEFAULT_FN_ATTRS256_CONSTEXPR
539+
_mm256_maskz_abs_epi16(__mmask16 __U, __m256i __A) {
548540
return (__m256i)__builtin_ia32_selectw_256((__mmask16)__U,
549541
(__v16hi)_mm256_abs_epi16(__A),
550542
(__v16hi)_mm256_setzero_si256());

clang/lib/Headers/avx512vlfp16intrin.h

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,14 @@
2626
__target__("avx512fp16,avx512vl,no-evex512"), \
2727
__min_vector_width__(128)))
2828

29+
#if defined(__cplusplus) && (__cplusplus >= 201103L)
30+
#define __DEFAULT_FN_ATTRS256_CONSTEXPR __DEFAULT_FN_ATTRS256 constexpr
31+
#define __DEFAULT_FN_ATTRS128_CONSTEXPR __DEFAULT_FN_ATTRS128 constexpr
32+
#else
33+
#define __DEFAULT_FN_ATTRS256_CONSTEXPR __DEFAULT_FN_ATTRS256
34+
#define __DEFAULT_FN_ATTRS128_CONSTEXPR __DEFAULT_FN_ATTRS128
35+
#endif
36+
2937
static __inline__ _Float16 __DEFAULT_FN_ATTRS128 _mm_cvtsh_h(__m128h __a) {
3038
return __a[0];
3139
}
@@ -315,11 +323,13 @@ static __inline__ __m128h __DEFAULT_FN_ATTRS128 _mm_maskz_max_ph(__mmask8 __U,
315323
(__v8hf)_mm_setzero_ph());
316324
}
317325

318-
static __inline__ __m256h __DEFAULT_FN_ATTRS256 _mm256_abs_ph(__m256h __A) {
326+
static __inline__ __m256h __DEFAULT_FN_ATTRS256_CONSTEXPR
327+
_mm256_abs_ph(__m256h __A) {
319328
return (__m256h)_mm256_and_epi32(_mm256_set1_epi32(0x7FFF7FFF), (__m256i)__A);
320329
}
321330

322-
static __inline__ __m128h __DEFAULT_FN_ATTRS128 _mm_abs_ph(__m128h __A) {
331+
static __inline__ __m128h __DEFAULT_FN_ATTRS128_CONSTEXPR
332+
_mm_abs_ph(__m128h __A) {
323333
return (__m128h)_mm_and_epi32(_mm_set1_epi32(0x7FFF7FFF), (__m128i)__A);
324334
}
325335

@@ -2066,6 +2076,8 @@ _mm_reduce_min_ph(__m128h __V) {
20662076

20672077
#undef __DEFAULT_FN_ATTRS128
20682078
#undef __DEFAULT_FN_ATTRS256
2079+
#undef __DEFAULT_FN_ATTRS256_CONSTEXPR
2080+
#undef __DEFAULT_FN_ATTRS128_CONSTEXPR
20692081

20702082
#endif
20712083
#endif

0 commit comments

Comments
 (0)