Skip to content

Commit e89734e

Browse files
[Headers][X86] Allow vector bitcast intrinsics to be used in constexpr (#167180)
Fixes #156348
1 parent 9e11754 commit e89734e

File tree

4 files changed

+71
-30
lines changed

4 files changed

+71
-30
lines changed

clang/lib/Headers/avx512fintrin.h

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -407,19 +407,19 @@ _mm512_castps256_ps512(__m256 __a)
407407
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
408408
}
409409

410-
static __inline __m128d __DEFAULT_FN_ATTRS512
410+
static __inline __m128d __DEFAULT_FN_ATTRS512_CONSTEXPR
411411
_mm512_castpd512_pd128(__m512d __a)
412412
{
413413
return __builtin_shufflevector(__a, __a, 0, 1);
414414
}
415415

416-
static __inline __m256d __DEFAULT_FN_ATTRS512
416+
static __inline __m256d __DEFAULT_FN_ATTRS512_CONSTEXPR
417417
_mm512_castpd512_pd256 (__m512d __A)
418418
{
419419
return __builtin_shufflevector(__A, __A, 0, 1, 2, 3);
420420
}
421421

422-
static __inline __m128 __DEFAULT_FN_ATTRS512
422+
static __inline __m128 __DEFAULT_FN_ATTRS512_CONSTEXPR
423423
_mm512_castps512_ps128(__m512 __a)
424424
{
425425
return __builtin_shufflevector(__a, __a, 0, 1, 2, 3);
@@ -430,13 +430,13 @@ _mm512_castps512_ps256(__m512 __A) {
430430
return __builtin_shufflevector(__A, __A, 0, 1, 2, 3, 4, 5, 6, 7);
431431
}
432432

433-
static __inline __m512 __DEFAULT_FN_ATTRS512
433+
static __inline __m512 __DEFAULT_FN_ATTRS512_CONSTEXPR
434434
_mm512_castpd_ps (__m512d __A)
435435
{
436436
return (__m512) (__A);
437437
}
438438

439-
static __inline __m512i __DEFAULT_FN_ATTRS512
439+
static __inline __m512i __DEFAULT_FN_ATTRS512_CONSTEXPR
440440
_mm512_castpd_si512 (__m512d __A)
441441
{
442442
return (__m512i) (__A);
@@ -451,13 +451,13 @@ _mm512_castpd128_pd512 (__m128d __A)
451451
__B, 0, 1, 2, 3, 4, 5, 6, 7);
452452
}
453453

454-
static __inline __m512d __DEFAULT_FN_ATTRS512
454+
static __inline __m512d __DEFAULT_FN_ATTRS512_CONSTEXPR
455455
_mm512_castps_pd (__m512 __A)
456456
{
457457
return (__m512d) (__A);
458458
}
459459

460-
static __inline __m512i __DEFAULT_FN_ATTRS512
460+
static __inline __m512i __DEFAULT_FN_ATTRS512_CONSTEXPR
461461
_mm512_castps_si512 (__m512 __A)
462462
{
463463
return (__m512i) (__A);
@@ -487,19 +487,19 @@ _mm512_castsi256_si512 (__m256i __A)
487487
return __builtin_shufflevector( __A, __builtin_nondeterministic_value(__A), 0, 1, 2, 3, 4, 5, 6, 7);
488488
}
489489

490-
static __inline __m512 __DEFAULT_FN_ATTRS512
490+
static __inline __m512 __DEFAULT_FN_ATTRS512_CONSTEXPR
491491
_mm512_castsi512_ps (__m512i __A)
492492
{
493493
return (__m512) (__A);
494494
}
495495

496-
static __inline __m512d __DEFAULT_FN_ATTRS512
496+
static __inline __m512d __DEFAULT_FN_ATTRS512_CONSTEXPR
497497
_mm512_castsi512_pd (__m512i __A)
498498
{
499499
return (__m512d) (__A);
500500
}
501501

502-
static __inline __m128i __DEFAULT_FN_ATTRS512
502+
static __inline __m128i __DEFAULT_FN_ATTRS512_CONSTEXPR
503503
_mm512_castsi512_si128 (__m512i __A)
504504
{
505505
return (__m128i)__builtin_shufflevector(__A, __A , 0, 1);

clang/lib/Headers/avx512fp16intrin.h

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -117,78 +117,78 @@ _mm512_set1_pch(_Float16 _Complex __h) {
117117
return (__m512h)_mm512_set1_ps(__builtin_bit_cast(float, __h));
118118
}
119119

120-
static __inline__ __m128 __DEFAULT_FN_ATTRS128 _mm_castph_ps(__m128h __a) {
120+
static __inline__ __m128 __DEFAULT_FN_ATTRS128_CONSTEXPR _mm_castph_ps(__m128h __a) {
121121
return (__m128)__a;
122122
}
123123

124-
static __inline__ __m256 __DEFAULT_FN_ATTRS256 _mm256_castph_ps(__m256h __a) {
124+
static __inline__ __m256 __DEFAULT_FN_ATTRS256_CONSTEXPR _mm256_castph_ps(__m256h __a) {
125125
return (__m256)__a;
126126
}
127127

128-
static __inline__ __m512 __DEFAULT_FN_ATTRS512 _mm512_castph_ps(__m512h __a) {
128+
static __inline__ __m512 __DEFAULT_FN_ATTRS512_CONSTEXPR _mm512_castph_ps(__m512h __a) {
129129
return (__m512)__a;
130130
}
131131

132-
static __inline__ __m128d __DEFAULT_FN_ATTRS128 _mm_castph_pd(__m128h __a) {
132+
static __inline__ __m128d __DEFAULT_FN_ATTRS128_CONSTEXPR _mm_castph_pd(__m128h __a) {
133133
return (__m128d)__a;
134134
}
135135

136-
static __inline__ __m256d __DEFAULT_FN_ATTRS256 _mm256_castph_pd(__m256h __a) {
136+
static __inline__ __m256d __DEFAULT_FN_ATTRS256_CONSTEXPR _mm256_castph_pd(__m256h __a) {
137137
return (__m256d)__a;
138138
}
139139

140-
static __inline__ __m512d __DEFAULT_FN_ATTRS512 _mm512_castph_pd(__m512h __a) {
140+
static __inline__ __m512d __DEFAULT_FN_ATTRS512_CONSTEXPR _mm512_castph_pd(__m512h __a) {
141141
return (__m512d)__a;
142142
}
143143

144-
static __inline__ __m128i __DEFAULT_FN_ATTRS128 _mm_castph_si128(__m128h __a) {
144+
static __inline__ __m128i __DEFAULT_FN_ATTRS128_CONSTEXPR _mm_castph_si128(__m128h __a) {
145145
return (__m128i)__a;
146146
}
147147

148-
static __inline__ __m256i __DEFAULT_FN_ATTRS256
148+
static __inline__ __m256i __DEFAULT_FN_ATTRS256_CONSTEXPR
149149
_mm256_castph_si256(__m256h __a) {
150150
return (__m256i)__a;
151151
}
152152

153-
static __inline__ __m512i __DEFAULT_FN_ATTRS512
153+
static __inline__ __m512i __DEFAULT_FN_ATTRS512_CONSTEXPR
154154
_mm512_castph_si512(__m512h __a) {
155155
return (__m512i)__a;
156156
}
157157

158-
static __inline__ __m128h __DEFAULT_FN_ATTRS128 _mm_castps_ph(__m128 __a) {
158+
static __inline__ __m128h __DEFAULT_FN_ATTRS128_CONSTEXPR _mm_castps_ph(__m128 __a) {
159159
return (__m128h)__a;
160160
}
161161

162-
static __inline__ __m256h __DEFAULT_FN_ATTRS256 _mm256_castps_ph(__m256 __a) {
162+
static __inline__ __m256h __DEFAULT_FN_ATTRS256_CONSTEXPR _mm256_castps_ph(__m256 __a) {
163163
return (__m256h)__a;
164164
}
165165

166-
static __inline__ __m512h __DEFAULT_FN_ATTRS512 _mm512_castps_ph(__m512 __a) {
166+
static __inline__ __m512h __DEFAULT_FN_ATTRS512_CONSTEXPR _mm512_castps_ph(__m512 __a) {
167167
return (__m512h)__a;
168168
}
169169

170-
static __inline__ __m128h __DEFAULT_FN_ATTRS128 _mm_castpd_ph(__m128d __a) {
170+
static __inline__ __m128h __DEFAULT_FN_ATTRS128_CONSTEXPR _mm_castpd_ph(__m128d __a) {
171171
return (__m128h)__a;
172172
}
173173

174-
static __inline__ __m256h __DEFAULT_FN_ATTRS256 _mm256_castpd_ph(__m256d __a) {
174+
static __inline__ __m256h __DEFAULT_FN_ATTRS256_CONSTEXPR _mm256_castpd_ph(__m256d __a) {
175175
return (__m256h)__a;
176176
}
177177

178-
static __inline__ __m512h __DEFAULT_FN_ATTRS512 _mm512_castpd_ph(__m512d __a) {
178+
static __inline__ __m512h __DEFAULT_FN_ATTRS512_CONSTEXPR _mm512_castpd_ph(__m512d __a) {
179179
return (__m512h)__a;
180180
}
181181

182-
static __inline__ __m128h __DEFAULT_FN_ATTRS128 _mm_castsi128_ph(__m128i __a) {
182+
static __inline__ __m128h __DEFAULT_FN_ATTRS128_CONSTEXPR _mm_castsi128_ph(__m128i __a) {
183183
return (__m128h)__a;
184184
}
185185

186-
static __inline__ __m256h __DEFAULT_FN_ATTRS256
186+
static __inline__ __m256h __DEFAULT_FN_ATTRS256_CONSTEXPR
187187
_mm256_castsi256_ph(__m256i __a) {
188188
return (__m256h)__a;
189189
}
190190

191-
static __inline__ __m512h __DEFAULT_FN_ATTRS512
191+
static __inline__ __m512h __DEFAULT_FN_ATTRS512_CONSTEXPR
192192
_mm512_castsi512_ph(__m512i __a) {
193193
return (__m512h)__a;
194194
}

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

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10085,20 +10085,23 @@ __m512 test_mm512_castpd_ps (__m512d __A)
1008510085
// CHECK: bitcast <8 x double> %{{.}} to <16 x float>
1008610086
return _mm512_castpd_ps (__A);
1008710087
}
10088+
TEST_CONSTEXPR(match_m512(_mm512_castpd_ps((__m512d){-1.0, +2.0, +4.0, -6.0, -1.0, +2.0, +4.0, -6.0}), +0.0f, -1.875f, +0.0f, +2.0f, +0.0f, +2.25f, 0.0f, -2.375f, +0.0f, -1.875f, +0.0f, +2.0f, +0.0f, +2.25f, 0.0f, -2.375f));
1008810089

1008910090
__m512d test_mm512_castps_pd (__m512 __A)
1009010091
{
1009110092
// CHECK-LABEL: test_mm512_castps_pd
1009210093
// CHECK: bitcast <16 x float> %{{.}} to <8 x double>
1009310094
return _mm512_castps_pd (__A);
1009410095
}
10096+
TEST_CONSTEXPR(match_m512d(_mm512_castps_pd((__m512){0.0f, -1.0f, 0.0f, 4.0f, 0.0f, -2.0f, 0.0f, 6.0f, 0.0f, -1.0f, 0.0f, 4.0f, 0.0f, -2.0f, 0.0f, 6.0f}), -0.0078125, 512.0, -2.0, +8192.0, -0.0078125, 512.0, -2.0, +8192.0));
1009510097

1009610098
__m512i test_mm512_castpd_si512 (__m512d __A)
1009710099
{
1009810100
// CHECK-LABEL: test_mm512_castpd_si512
1009910101
// CHECK: bitcast <8 x double> %{{.}} to <8 x i64>
1010010102
return _mm512_castpd_si512 (__A);
1010110103
}
10104+
TEST_CONSTEXPR(match_m512i(_mm512_castpd_si512((__m512d){-1.0, +2.0, -3.0, +4.0, -1.0, +2.0, -3.0, +4.0}), 0xBFF0000000000000ULL, 0x4000000000000000ULL, 0xC008000000000000ULL, 0x4010000000000000ULL, 0xBFF0000000000000ULL, 0x4000000000000000ULL, 0xC008000000000000ULL, 0x4010000000000000ULL));
1010210105

1010310106
__m512 test_mm512_castps128_ps512(__m128 __A) {
1010410107
// CHECK-LABEL: test_mm512_castps128_ps512
@@ -10252,20 +10255,36 @@ __m512d test_mm512_castpd256_pd512(__m256d a)
1025210255
return _mm512_castpd256_pd512(a);
1025310256
}
1025410257

10258+
__m128d test_mm512_castpd512_pd128 (__m512d __A)
10259+
{
10260+
// CHECK-LABEL: test_mm512_castpd512_pd128
10261+
// CHECK: shufflevector <8 x double> %{{.}}, <8 x double> %{{.}}, <2 x i32> <i32 0, i32 1>
10262+
return _mm512_castpd512_pd128 (__A);
10263+
}
10264+
TEST_CONSTEXPR(match_m128d(_mm512_castpd512_pd128((__m512d){0.0, 1.0, 2.0, 4.0, -8.0, -16.0, -32.0, -64.0}), 0.0, 1.0));
10265+
1025510266
__m256d test_mm512_castpd512_pd256 (__m512d __A)
1025610267
{
1025710268
// CHECK-LABEL: test_mm512_castpd512_pd256
1025810269
// CHECK: shufflevector <8 x double> %{{.}}, <8 x double> %{{.}}, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1025910270
return _mm512_castpd512_pd256 (__A);
1026010271
}
10272+
TEST_CONSTEXPR(match_m256d(_mm512_castpd512_pd256((__m512d){0.0, 1.0, 2.0, 4.0, -8.0, -16.0, -32.0, -64.0}), 0.0, 1.0, 2.0, 4.0));
10273+
10274+
__m128 test_mm512_castps512_ps128 (__m512 __A)
10275+
{
10276+
// CHECK-LABEL: test_mm512_castps512_ps128
10277+
// CHECK: shufflevector <16 x float> %{{.}}, <16 x float> %{{.}}, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
10278+
return _mm512_castps512_ps128 (__A);
10279+
}
10280+
TEST_CONSTEXPR(match_m128(_mm512_castps512_ps128((__m512){0.0f, 1.0f, 2.0f, 4.0f, -8.0f, -16.0f, -32.0f, -64.0f, -128.0f, -256.0f, -512.0f, -1024.0f, -2048.0f, -4096.0f, -8192.0f, -16384.0f}), 0.0f, 1.0f, 2.0f, 4.0f));
1026110281

1026210282
__m256 test_mm512_castps512_ps256 (__m512 __A)
1026310283
{
1026410284
// CHECK-LABEL: test_mm512_castps512_ps256
1026510285
// CHECK: shufflevector <16 x float> %{{.}}, <16 x float> %{{.}}, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
1026610286
return _mm512_castps512_ps256 (__A);
1026710287
}
10268-
1026910288
TEST_CONSTEXPR(match_m256(_mm512_castps512_ps256((__m512){0.0f, 1.0f, 2.0f, 4.0f, -8.0f, -16.0f, -32.0f, -64.0f, -128.0f, -256.0f, -512.0f, -1024.0f, -2048.0f, -4096.0f, -8192.0f, -16384.0f}), 0.0f, 1.0f, 2.0f, 4.0f, -8.0f, -16.0f, -32.0f, -64.0f));
1027010289

1027110290
__m512i test_mm512_castps_si512 (__m512 __A)
@@ -10274,6 +10293,8 @@ __m512i test_mm512_castps_si512 (__m512 __A)
1027410293
// CHECK: bitcast <16 x float> %{{.}} to <8 x i64>
1027510294
return _mm512_castps_si512 (__A);
1027610295
}
10296+
TEST_CONSTEXPR(match_m512i(_mm512_castps_si512((__m512){1.0f, -2.0f, -4.0f, 8.0f, -16.0f, +16.0f, +32.0f, -32.0f, 1.0f, -2.0f, -4.0f, 8.0f, -16.0f, +16.0f, +32.0f, -32.0f}), 0xC00000003F800000ULL, 0x41000000c0800000ULL, 0x41800000C1800000ULL, 0xC200000042000000ULL, 0xC00000003F800000ULL, 0x41000000c0800000ULL, 0x41800000C1800000ULL, 0xC200000042000000ULL));
10297+
1027710298
__m512i test_mm512_castsi128_si512(__m128i __A) {
1027810299
// CHECK-LABEL: test_mm512_castsi128_si512
1027910300
// CHECK: [[B:%.*]] = freeze <4 x i64> poison
@@ -10298,28 +10319,30 @@ __m512 test_mm512_castsi512_ps (__m512i __A)
1029810319
// CHECK: bitcast <8 x i64> %{{.}} to <16 x float>
1029910320
return _mm512_castsi512_ps (__A);
1030010321
}
10322+
TEST_CONSTEXPR(match_m512(_mm512_castsi512_ps((__m512i)(__v8du){0x42000000c1800000ULL, 0x43000000c2800000ULL, 0x41000000c0800000ULL, 0xC00000003F800000ULL, 0x42000000c1800000ULL, 0x43000000c2800000ULL, 0x41000000c0800000ULL, 0xC00000003F800000ULL}), -16.0f, 32.0f, -64.0f, 128.0f, -4.0f, 8.0f, 1.0f, -2.0f, -16.0f, 32.0f, -64.0f, 128.0f, -4.0f, 8.0f, 1.0f, -2.0f));
1030110323

1030210324
__m512d test_mm512_castsi512_pd (__m512i __A)
1030310325
{
1030410326
// CHECK-LABEL: test_mm512_castsi512_pd
1030510327
// CHECK: bitcast <8 x i64> %{{.}} to <8 x double>
1030610328
return _mm512_castsi512_pd (__A);
1030710329
}
10330+
TEST_CONSTEXPR(match_m512d(_mm512_castsi512_pd((__m512i)(__v8du){0x4070000000000000ULL, 0xC000000000000000ULL, 0xBFF0000000000000ULL, 0xC008000000000000ULL, 0x4070000000000000ULL, 0xC000000000000000ULL, 0xBFF0000000000000ULL, 0xC008000000000000ULL}), 256.0, -2.0, -1.0, -3.0, 256.0, -2.0, -1.0, -3.0));
1030810331

1030910332
__m128i test_mm512_castsi512_si128 (__m512i __A)
1031010333
{
1031110334
// CHECK-LABEL: test_mm512_castsi512_si128
1031210335
// CHECK: shufflevector <8 x i64> %{{.}}, <8 x i64> %{{.}}, <2 x i32> <i32 0, i32 1>
1031310336
return _mm512_castsi512_si128 (__A);
1031410337
}
10338+
TEST_CONSTEXPR(match_m128i(_mm512_castsi512_si128((__m512i)(__v8du){0xBFF0000000000000ULL, 0x4070000000000000ULL, 0xC000000000000000ULL, 0xC008000000000000ULL, 0xBFF0000000000000ULL, 0x4070000000000000ULL, 0xC000000000000000ULL, 0xC008000000000000ULL}), 0xBFF0000000000000ULL, 0x4070000000000000ULL));
1031510339

1031610340
__m256i test_mm512_castsi512_si256 (__m512i __A)
1031710341
{
1031810342
// CHECK-LABEL: test_mm512_castsi512_si256
1031910343
// CHECK: shufflevector <8 x i64> %{{.}}, <8 x i64> %{{.}}, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1032010344
return _mm512_castsi512_si256 (__A);
1032110345
}
10322-
1032310346
TEST_CONSTEXPR(match_v8si(_mm512_castsi512_si256((__m512i)(__v16si){0, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384}), 0, 1, 2, 4, 8, 16, 32, 64));
1032410347

1032510348
__m128 test_mm_cvt_roundsd_ss(__m128 __A, __m128d __B) {

0 commit comments

Comments
 (0)