Skip to content

Commit a5d85a6

Browse files
authored
[Headers][X86] Allow AVX _mm256_set* intrinsics to be used in constexpr (#152173)
1 parent 5499a70 commit a5d85a6

File tree

3 files changed

+40
-12
lines changed

3 files changed

+40
-12
lines changed

clang/lib/Headers/avxintrin.h

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3777,7 +3777,7 @@ _mm256_set_ps(float __a, float __b, float __c, float __d,
37773777
/// \param __i7
37783778
/// A 32-bit integral value used to initialize bits [31:0] of the result.
37793779
/// \returns An initialized 256-bit integer vector.
3780-
static __inline __m256i __DEFAULT_FN_ATTRS
3780+
static __inline __m256i __DEFAULT_FN_ATTRS_CONSTEXPR
37813781
_mm256_set_epi32(int __i0, int __i1, int __i2, int __i3,
37823782
int __i4, int __i5, int __i6, int __i7)
37833783
{
@@ -3825,7 +3825,7 @@ _mm256_set_epi32(int __i0, int __i1, int __i2, int __i3,
38253825
/// \param __w00
38263826
/// A 16-bit integral value used to initialize bits [15:0] of the result.
38273827
/// \returns An initialized 256-bit integer vector.
3828-
static __inline __m256i __DEFAULT_FN_ATTRS
3828+
static __inline __m256i __DEFAULT_FN_ATTRS_CONSTEXPR
38293829
_mm256_set_epi16(short __w15, short __w14, short __w13, short __w12,
38303830
short __w11, short __w10, short __w09, short __w08,
38313831
short __w07, short __w06, short __w05, short __w04,
@@ -3908,7 +3908,7 @@ _mm256_set_epi16(short __w15, short __w14, short __w13, short __w12,
39083908
/// \param __b00
39093909
/// An 8-bit integral value used to initialize bits [7:0] of the result.
39103910
/// \returns An initialized 256-bit integer vector.
3911-
static __inline __m256i __DEFAULT_FN_ATTRS
3911+
static __inline __m256i __DEFAULT_FN_ATTRS_CONSTEXPR
39123912
_mm256_set_epi8(char __b31, char __b30, char __b29, char __b28,
39133913
char __b27, char __b26, char __b25, char __b24,
39143914
char __b23, char __b22, char __b21, char __b20,
@@ -3943,7 +3943,7 @@ _mm256_set_epi8(char __b31, char __b30, char __b29, char __b28,
39433943
/// \param __d
39443944
/// A 64-bit integral value used to initialize bits [63:0] of the result.
39453945
/// \returns An initialized 256-bit integer vector.
3946-
static __inline __m256i __DEFAULT_FN_ATTRS
3946+
static __inline __m256i __DEFAULT_FN_ATTRS_CONSTEXPR
39473947
_mm256_set_epi64x(long long __a, long long __b, long long __c, long long __d)
39483948
{
39493949
return __extension__ (__m256i)(__v4di){ __d, __c, __b, __a };
@@ -4044,7 +4044,7 @@ _mm256_setr_ps(float __a, float __b, float __c, float __d,
40444044
/// \param __i7
40454045
/// A 32-bit integral value used to initialize bits [255:224] of the result.
40464046
/// \returns An initialized 256-bit integer vector.
4047-
static __inline __m256i __DEFAULT_FN_ATTRS
4047+
static __inline __m256i __DEFAULT_FN_ATTRS_CONSTEXPR
40484048
_mm256_setr_epi32(int __i0, int __i1, int __i2, int __i3,
40494049
int __i4, int __i5, int __i6, int __i7)
40504050
{
@@ -4092,7 +4092,7 @@ _mm256_setr_epi32(int __i0, int __i1, int __i2, int __i3,
40924092
/// \param __w00
40934093
/// A 16-bit integral value used to initialize bits [255:240] of the result.
40944094
/// \returns An initialized 256-bit integer vector.
4095-
static __inline __m256i __DEFAULT_FN_ATTRS
4095+
static __inline __m256i __DEFAULT_FN_ATTRS_CONSTEXPR
40964096
_mm256_setr_epi16(short __w15, short __w14, short __w13, short __w12,
40974097
short __w11, short __w10, short __w09, short __w08,
40984098
short __w07, short __w06, short __w05, short __w04,
@@ -4177,7 +4177,7 @@ _mm256_setr_epi16(short __w15, short __w14, short __w13, short __w12,
41774177
/// \param __b00
41784178
/// An 8-bit integral value used to initialize bits [255:248] of the result.
41794179
/// \returns An initialized 256-bit integer vector.
4180-
static __inline __m256i __DEFAULT_FN_ATTRS
4180+
static __inline __m256i __DEFAULT_FN_ATTRS_CONSTEXPR
41814181
_mm256_setr_epi8(char __b31, char __b30, char __b29, char __b28,
41824182
char __b27, char __b26, char __b25, char __b24,
41834183
char __b23, char __b22, char __b21, char __b20,
@@ -4210,7 +4210,7 @@ _mm256_setr_epi8(char __b31, char __b30, char __b29, char __b28,
42104210
/// \param __d
42114211
/// A 64-bit integral value used to initialize bits [255:192] of the result.
42124212
/// \returns An initialized 256-bit integer vector.
4213-
static __inline __m256i __DEFAULT_FN_ATTRS
4213+
static __inline __m256i __DEFAULT_FN_ATTRS_CONSTEXPR
42144214
_mm256_setr_epi64x(long long __a, long long __b, long long __c, long long __d)
42154215
{
42164216
return _mm256_set_epi64x(__d, __c, __b, __a);
@@ -4267,7 +4267,7 @@ _mm256_set1_ps(float __w)
42674267
/// A 32-bit integral value used to initialize each vector element of the
42684268
/// result.
42694269
/// \returns An initialized 256-bit integer vector of [8 x i32].
4270-
static __inline __m256i __DEFAULT_FN_ATTRS
4270+
static __inline __m256i __DEFAULT_FN_ATTRS_CONSTEXPR
42714271
_mm256_set1_epi32(int __i)
42724272
{
42734273
return _mm256_set_epi32(__i, __i, __i, __i, __i, __i, __i, __i);
@@ -4285,7 +4285,7 @@ _mm256_set1_epi32(int __i)
42854285
/// A 16-bit integral value used to initialize each vector element of the
42864286
/// result.
42874287
/// \returns An initialized 256-bit integer vector of [16 x i16].
4288-
static __inline __m256i __DEFAULT_FN_ATTRS
4288+
static __inline __m256i __DEFAULT_FN_ATTRS_CONSTEXPR
42894289
_mm256_set1_epi16(short __w)
42904290
{
42914291
return _mm256_set_epi16(__w, __w, __w, __w, __w, __w, __w, __w,
@@ -4303,7 +4303,7 @@ _mm256_set1_epi16(short __w)
43034303
/// An 8-bit integral value used to initialize each vector element of the
43044304
/// result.
43054305
/// \returns An initialized 256-bit integer vector of [32 x i8].
4306-
static __inline __m256i __DEFAULT_FN_ATTRS
4306+
static __inline __m256i __DEFAULT_FN_ATTRS_CONSTEXPR
43074307
_mm256_set1_epi8(char __b)
43084308
{
43094309
return _mm256_set_epi8(__b, __b, __b, __b, __b, __b, __b, __b,
@@ -4324,7 +4324,7 @@ _mm256_set1_epi8(char __b)
43244324
/// A 64-bit integral value used to initialize each vector element of the
43254325
/// result.
43264326
/// \returns An initialized 256-bit integer vector of [4 x i64].
4327-
static __inline __m256i __DEFAULT_FN_ATTRS
4327+
static __inline __m256i __DEFAULT_FN_ATTRS_CONSTEXPR
43284328
_mm256_set1_epi64x(long long __q)
43294329
{
43304330
return _mm256_set_epi64x(__q, __q, __q, __q);

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1443,6 +1443,7 @@ __m256i test_mm256_set_epi8(char A0, char A1, char A2, char A3, char A4, char A5
14431443
// CHECK: insertelement <32 x i8> %{{.*}}, i8 %{{.*}}, i32 31
14441444
return _mm256_set_epi8(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21, A22, A23, A24, A25, A26, A27, A28, A29, A30, A31);
14451445
}
1446+
TEST_CONSTEXPR(match_v32qi(_mm256_set_epi8(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31), 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0));
14461447

14471448
__m256i test_mm256_set_epi16(short A0, short A1, short A2, short A3, short A4, short A5, short A6, short A7,
14481449
short A8, short A9, short A10, short A11, short A12, short A13, short A14, short A15) {
@@ -1465,6 +1466,7 @@ __m256i test_mm256_set_epi16(short A0, short A1, short A2, short A3, short A4, s
14651466
// CHECK: insertelement <16 x i16> %{{.*}}, i16 %{{.*}}, i32 15
14661467
return _mm256_set_epi16(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15);
14671468
}
1469+
TEST_CONSTEXPR(match_v16hi(_mm256_set_epi16(0, -1, -2, -3, -4, -5, -6, -7, -8, -9, -10, -11, -12, -13, -14, -15), -15, -14, -13, -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0));
14681470

14691471
__m256i test_mm256_set_epi32(int A0, int A1, int A2, int A3, int A4, int A5, int A6, int A7) {
14701472
// CHECK-LABEL: test_mm256_set_epi32
@@ -1478,6 +1480,7 @@ __m256i test_mm256_set_epi32(int A0, int A1, int A2, int A3, int A4, int A5, int
14781480
// CHECK: insertelement <8 x i32> %{{.*}}, i32 %{{.*}}, i32 7
14791481
return _mm256_set_epi32(A0, A1, A2, A3, A4, A5, A6, A7);
14801482
}
1483+
TEST_CONSTEXPR(match_v8si(_mm256_set_epi32(1, -3, 5, -7, 9, -11, 13, -15), -15, 13, -11, 9, -7, 5, -3, 1));
14811484

14821485
__m256i test_mm256_set_epi64x(long long A0, long long A1, long long A2, long long A3) {
14831486
// CHECK-LABEL: test_mm256_set_epi64x
@@ -1487,6 +1490,7 @@ __m256i test_mm256_set_epi64x(long long A0, long long A1, long long A2, long lon
14871490
// CHECK: insertelement <4 x i64> %{{.*}}, i64 %{{.*}}, i32 3
14881491
return _mm256_set_epi64x(A0, A1, A2, A3);
14891492
}
1493+
TEST_CONSTEXPR(match_v4di(_mm256_set_epi64x(100, -1000, 2000, -200), -200, 2000, -1000, 100));
14901494

14911495
__m256 test_mm256_set_m128(__m128 A, __m128 B) {
14921496
// CHECK-LABEL: test_mm256_set_m128
@@ -1566,6 +1570,7 @@ __m256i test_mm256_set1_epi8(char A) {
15661570
// CHECK: insertelement <32 x i8> %{{.*}}, i8 %{{.*}}, i32 31
15671571
return _mm256_set1_epi8(A);
15681572
}
1573+
TEST_CONSTEXPR(match_v32qi(_mm256_set1_epi8(99), 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99));
15691574

15701575
__m256i test_mm256_set1_epi16(short A) {
15711576
// CHECK-LABEL: test_mm256_set1_epi16
@@ -1587,6 +1592,7 @@ __m256i test_mm256_set1_epi16(short A) {
15871592
// CHECK: insertelement <16 x i16> %{{.*}}, i16 %{{.*}}, i32 15
15881593
return _mm256_set1_epi16(A);
15891594
}
1595+
TEST_CONSTEXPR(match_v16hi(_mm256_set1_epi16(-128), -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128));
15901596

15911597
__m256i test_mm256_set1_epi32(int A) {
15921598
// CHECK-LABEL: test_mm256_set1_epi32
@@ -1600,6 +1606,7 @@ __m256i test_mm256_set1_epi32(int A) {
16001606
// CHECK: insertelement <8 x i32> %{{.*}}, i32 %{{.*}}, i32 7
16011607
return _mm256_set1_epi32(A);
16021608
}
1609+
TEST_CONSTEXPR(match_v8si(_mm256_set1_epi32(55), 55, 55, 55, 55, 55, 55, 55, 55));
16031610

16041611
__m256i test_mm256_set1_epi64x(long long A) {
16051612
// CHECK-LABEL: test_mm256_set1_epi64x
@@ -1609,6 +1616,7 @@ __m256i test_mm256_set1_epi64x(long long A) {
16091616
// CHECK: insertelement <4 x i64> %{{.*}}, i64 %{{.*}}, i32 3
16101617
return _mm256_set1_epi64x(A);
16111618
}
1619+
TEST_CONSTEXPR(match_v4di(_mm256_set1_epi64x(-65535), -65535, -65535, -65535, -65535));
16121620

16131621
__m256d test_mm256_set1_pd(double A) {
16141622
// CHECK-LABEL: test_mm256_set1_pd
@@ -1673,6 +1681,7 @@ __m256i test_mm256_setr_epi8(char A0, char A1, char A2, char A3, char A4, char A
16731681
// CHECK: insertelement <32 x i8> %{{.*}}, i8 %{{.*}}, i32 31
16741682
return _mm256_setr_epi8(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21, A22, A23, A24, A25, A26, A27, A28, A29, A30, A31);
16751683
}
1684+
TEST_CONSTEXPR(match_v32qi(_mm256_setr_epi8(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31), 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31));
16761685

16771686
__m256i test_mm256_setr_epi16(short A0, short A1, short A2, short A3, short A4, short A5, short A6, short A7,
16781687
short A8, short A9, short A10, short A11, short A12, short A13, short A14, short A15) {
@@ -1695,6 +1704,7 @@ __m256i test_mm256_setr_epi16(short A0, short A1, short A2, short A3, short A4,
16951704
// CHECK: insertelement <16 x i16> %{{.*}}, i16 %{{.*}}, i32 15
16961705
return _mm256_setr_epi16(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15);
16971706
}
1707+
TEST_CONSTEXPR(match_v16hi(_mm256_setr_epi16(0, -1, -2, -3, -4, -5, -6, -7, -8, -9, -10, -11, -12, -13, -14, -15), 0, -1, -2, -3, -4, -5, -6, -7, -8, -9, -10, -11, -12, -13, -14, -15));
16981708

16991709
__m256i test_mm256_setr_epi32(int A0, int A1, int A2, int A3, int A4, int A5, int A6, int A7) {
17001710
// CHECK-LABEL: test_mm256_setr_epi32
@@ -1708,6 +1718,7 @@ __m256i test_mm256_setr_epi32(int A0, int A1, int A2, int A3, int A4, int A5, in
17081718
// CHECK: insertelement <8 x i32> %{{.*}}, i32 %{{.*}}, i32 7
17091719
return _mm256_setr_epi32(A0, A1, A2, A3, A4, A5, A6, A7);
17101720
}
1721+
TEST_CONSTEXPR(match_v8si(_mm256_setr_epi32(1, -3, 5, -7, 9, -11, 13, -15), 1, -3, 5, -7, 9, -11, 13, -15));
17111722

17121723
__m256i test_mm256_setr_epi64x(long long A0, long long A1, long long A2, long long A3) {
17131724
// CHECK-LABEL: test_mm256_setr_epi64x
@@ -1717,6 +1728,7 @@ __m256i test_mm256_setr_epi64x(long long A0, long long A1, long long A2, long lo
17171728
// CHECK: insertelement <4 x i64> %{{.*}}, i64 %{{.*}}, i32 3
17181729
return _mm256_setr_epi64x(A0, A1, A2, A3);
17191730
}
1731+
TEST_CONSTEXPR(match_v4di(_mm256_setr_epi64x(100, -1000, 2000, -200), 100, -1000, 2000, -200));
17201732

17211733
__m256 test_mm256_setr_m128(__m128 A, __m128 B) {
17221734
// CHECK-LABEL: test_mm256_setr_m128

clang/test/CodeGen/X86/builtin_test_helpers.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,22 @@ constexpr bool match_v8si(__m256i _v, int a, int b, int c, int d, int e, int f,
8383
return v[0] == a && v[1] == b && v[2] == c && v[3] == d && v[4] == e && v[5] == f && v[6] == g && v[7] == h;
8484
}
8585

86+
constexpr bool match_v16hi(__m256i _v, short a, short b, short c, short d, short e, short f, short g, short h, short i, short j, short k, short l, short m, short n, short o, short p) {
87+
__v16hi v = (__v16hi)_v;
88+
return v[0] == a && v[1] == b && v[2] == c && v[3] == d && v[4] == e && v[5] == f && v[6] == g && v[7] == h && v[8] == i && v[9] == j && v[10] == k && v[11] == l && v[12] == m && v[13] == n && v[14] == o && v[15] == p;
89+
}
90+
91+
constexpr bool match_v32qi(__m256i _v, char __b00, char __b01, char __b02, char __b03, char __b04, char __b05, char __b06, char __b07,
92+
char __b08, char __b09, char __b10, char __b11, char __b12, char __b13, char __b14, char __b15,
93+
char __b16, char __b17, char __b18, char __b19, char __b20, char __b21, char __b22, char __b23,
94+
char __b24, char __b25, char __b26, char __b27, char __b28, char __b29, char __b30, char __b31) {
95+
__v32qi v = (__v32qi)_v;
96+
return v[ 0] == __b00 && v[ 1] == __b01 && v[ 2] == __b02 && v[ 3] == __b03 && v[ 4] == __b04 && v[ 5] == __b05 && v[ 6] == __b06 && v[ 7] == __b07 &&
97+
v[ 8] == __b08 && v[ 9] == __b09 && v[10] == __b10 && v[11] == __b11 && v[12] == __b12 && v[13] == __b13 && v[14] == __b14 && v[15] == __b15 &&
98+
v[16] == __b16 && v[17] == __b17 && v[18] == __b18 && v[19] == __b19 && v[20] == __b20 && v[21] == __b21 && v[22] == __b22 && v[23] == __b23 &&
99+
v[24] == __b24 && v[25] == __b25 && v[26] == __b26 && v[27] == __b27 && v[28] == __b28 && v[29] == __b29 && v[30] == __b30 && v[31] == __b31;
100+
}
101+
86102
constexpr bool match_m512(__m512 v, float a, float b, float c, float d, float e, float f, float g, float h, float i, float j, float k, float l, float m, float n, float o, float p) {
87103
return v[0] == a && v[1] == b && v[2] == c && v[3] == d && v[4] == e && v[5] == f && v[6] == g && v[7] == h && v[8] == i && v[9] == j && v[10] == k && v[11] == l && v[12] == m && v[13] == n && v[14] == o && v[15] == p;
88104
}

0 commit comments

Comments
 (0)