Skip to content

Commit 335cfb3

Browse files
authored
[clang][x86] Add initial constexpr support for VPOPCNTDQ intrinsics (#118017)
#117473 added constexpr support to __builtin_elementwise_popcount - which the VPOPCNTDQ intrinsics just wrap. Still working on how to make __builtin_ia32_select* intrinsic wrappers constexpr
1 parent 261a402 commit 335cfb3

File tree

5 files changed

+65
-6
lines changed

5 files changed

+65
-6
lines changed

clang/lib/Headers/avx512vpopcntdqintrin.h

+10-2
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,14 @@
2121
__target__("avx512vpopcntdq,evex512"), \
2222
__min_vector_width__(512)))
2323

24-
static __inline__ __m512i __DEFAULT_FN_ATTRS _mm512_popcnt_epi64(__m512i __A) {
24+
#if defined(__cplusplus) && (__cplusplus >= 201103L)
25+
#define __DEFAULT_FN_ATTRS_CONSTEXPR __DEFAULT_FN_ATTRS constexpr
26+
#else
27+
#define __DEFAULT_FN_ATTRS_CONSTEXPR __DEFAULT_FN_ATTRS
28+
#endif
29+
30+
static __inline__ __m512i __DEFAULT_FN_ATTRS_CONSTEXPR
31+
_mm512_popcnt_epi64(__m512i __A) {
2532
return (__m512i)__builtin_elementwise_popcount((__v8du)__A);
2633
}
2734

@@ -36,7 +43,8 @@ _mm512_maskz_popcnt_epi64(__mmask8 __U, __m512i __A) {
3643
return _mm512_mask_popcnt_epi64((__m512i)_mm512_setzero_si512(), __U, __A);
3744
}
3845

39-
static __inline__ __m512i __DEFAULT_FN_ATTRS _mm512_popcnt_epi32(__m512i __A) {
46+
static __inline__ __m512i __DEFAULT_FN_ATTRS_CONSTEXPR
47+
_mm512_popcnt_epi32(__m512i __A) {
4048
return (__m512i)__builtin_elementwise_popcount((__v16su)__A);
4149
}
4250

clang/lib/Headers/avx512vpopcntdqvlintrin.h

+12-4
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,15 @@
2525
__target__("avx512vpopcntdq,avx512vl,no-evex512"), \
2626
__min_vector_width__(256)))
2727

28-
static __inline__ __m128i __DEFAULT_FN_ATTRS128
28+
#if defined(__cplusplus) && (__cplusplus >= 201103L)
29+
#define __DEFAULT_FN_ATTRS128_CONSTEXPR __DEFAULT_FN_ATTRS128 constexpr
30+
#define __DEFAULT_FN_ATTRS256_CONSTEXPR __DEFAULT_FN_ATTRS256 constexpr
31+
#else
32+
#define __DEFAULT_FN_ATTRS128_CONSTEXPR __DEFAULT_FN_ATTRS128
33+
#define __DEFAULT_FN_ATTRS256_CONSTEXPR __DEFAULT_FN_ATTRS256
34+
#endif
35+
36+
static __inline__ __m128i __DEFAULT_FN_ATTRS128_CONSTEXPR
2937
_mm_popcnt_epi64(__m128i __A) {
3038
return (__m128i)__builtin_elementwise_popcount((__v2du)__A);
3139
}
@@ -41,7 +49,7 @@ _mm_maskz_popcnt_epi64(__mmask8 __U, __m128i __A) {
4149
return _mm_mask_popcnt_epi64((__m128i)_mm_setzero_si128(), __U, __A);
4250
}
4351

44-
static __inline__ __m128i __DEFAULT_FN_ATTRS128
52+
static __inline__ __m128i __DEFAULT_FN_ATTRS128_CONSTEXPR
4553
_mm_popcnt_epi32(__m128i __A) {
4654
return (__m128i)__builtin_elementwise_popcount((__v4su)__A);
4755
}
@@ -57,7 +65,7 @@ _mm_maskz_popcnt_epi32(__mmask8 __U, __m128i __A) {
5765
return _mm_mask_popcnt_epi32((__m128i)_mm_setzero_si128(), __U, __A);
5866
}
5967

60-
static __inline__ __m256i __DEFAULT_FN_ATTRS256
68+
static __inline__ __m256i __DEFAULT_FN_ATTRS256_CONSTEXPR
6169
_mm256_popcnt_epi64(__m256i __A) {
6270
return (__m256i)__builtin_elementwise_popcount((__v4du)__A);
6371
}
@@ -73,7 +81,7 @@ _mm256_maskz_popcnt_epi64(__mmask8 __U, __m256i __A) {
7381
return _mm256_mask_popcnt_epi64((__m256i)_mm256_setzero_si256(), __U, __A);
7482
}
7583

76-
static __inline__ __m256i __DEFAULT_FN_ATTRS256
84+
static __inline__ __m256i __DEFAULT_FN_ATTRS256_CONSTEXPR
7785
_mm256_popcnt_epi32(__m256i __A) {
7886
return (__m256i)__builtin_elementwise_popcount((__v8su)__A);
7987
}

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

+8
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,43 @@
11
// RUN: %clang_cc1 -flax-vector-conversions=none -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +avx512vpopcntdq -emit-llvm -o - -Wall -Werror | FileCheck %s
22

33
#include <immintrin.h>
4+
#include "builtin_test_helpers.h"
45

56
__m512i test_mm512_popcnt_epi64(__m512i __A) {
67
// CHECK-LABEL: @test_mm512_popcnt_epi64
78
// CHECK: @llvm.ctpop.v8i64
89
return _mm512_popcnt_epi64(__A);
910
}
11+
TEST_CONSTEXPR(match_v8di(_mm512_popcnt_epi64((__m512i)(__v8di){+5, -3, -10, +8, 0, -256, +256, -128}), 2, 31, 30, 1, 0, 24, 1, 25));
12+
1013
__m512i test_mm512_mask_popcnt_epi64(__m512i __W, __mmask8 __U, __m512i __A) {
1114
// CHECK-LABEL: @test_mm512_mask_popcnt_epi64
1215
// CHECK: @llvm.ctpop.v8i64
1316
// CHECK: select <8 x i1> %{{[0-9]+}}, <8 x i64> %{{.*}}, <8 x i64> %{{.*}}
1417
return _mm512_mask_popcnt_epi64(__W, __U, __A);
1518
}
19+
1620
__m512i test_mm512_maskz_popcnt_epi64(__mmask8 __U, __m512i __A) {
1721
// CHECK-LABEL: @test_mm512_maskz_popcnt_epi64
1822
// CHECK: @llvm.ctpop.v8i64
1923
// CHECK: select <8 x i1> %{{[0-9]+}}, <8 x i64> %{{.*}}, <8 x i64> %{{.*}}
2024
return _mm512_maskz_popcnt_epi64(__U, __A);
2125
}
26+
2227
__m512i test_mm512_popcnt_epi32(__m512i __A) {
2328
// CHECK-LABEL: @test_mm512_popcnt_epi32
2429
// CHECK: @llvm.ctpop.v16i32
2530
return _mm512_popcnt_epi32(__A);
2631
}
32+
TEST_CONSTEXPR(match_v16si(_mm512_popcnt_epi32((__m512i)(__v16si){+5, -3, -10, +8, 0, -256, +256, -128, +3, +9, +15, +33, +63, +129, +511, +1025}), 2, 31, 30, 1, 0, 24, 1, 25, 2, 2, 4, 2, 6, 2, 9, 2));
33+
2734
__m512i test_mm512_mask_popcnt_epi32(__m512i __W, __mmask16 __U, __m512i __A) {
2835
// CHECK-LABEL: @test_mm512_mask_popcnt_epi32
2936
// CHECK: @llvm.ctpop.v16i32
3037
// CHECK: select <16 x i1> %{{[0-9]+}}, <16 x i32> %{{.*}}, <16 x i32> %{{.*}}
3138
return _mm512_mask_popcnt_epi32(__W, __U, __A);
3239
}
40+
3341
__m512i test_mm512_maskz_popcnt_epi32(__mmask16 __U, __m512i __A) {
3442
// CHECK-LABEL: @test_mm512_maskz_popcnt_epi32
3543
// CHECK: @llvm.ctpop.v16i32

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

+15
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,43 @@
11
// RUN: %clang_cc1 -flax-vector-conversions=none -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +avx512vpopcntdq -target-feature +avx512vl -emit-llvm -o - -Wall -Werror | FileCheck %s
22

33
#include <immintrin.h>
4+
#include "builtin_test_helpers.h"
45

56
__m128i test_mm_popcnt_epi64(__m128i __A) {
67
// CHECK-LABEL: @test_mm_popcnt_epi64
78
// CHECK: @llvm.ctpop.v2i64
89
return _mm_popcnt_epi64(__A);
910
}
11+
TEST_CONSTEXPR(match_v2di(_mm_popcnt_epi64((__m128i)(__v2di){+5, -3}), 2, 63));
12+
1013
__m128i test_mm_mask_popcnt_epi64(__m128i __W, __mmask8 __U, __m128i __A) {
1114
// CHECK-LABEL: @test_mm_mask_popcnt_epi64
1215
// CHECK: @llvm.ctpop.v2i64
1316
// CHECK: select <2 x i1> %{{.+}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}}
1417
return _mm_mask_popcnt_epi64(__W, __U, __A);
1518
}
19+
1620
__m128i test_mm_maskz_popcnt_epi64(__mmask8 __U, __m128i __A) {
1721
// CHECK-LABEL: @test_mm_maskz_popcnt_epi64
1822
// CHECK: @llvm.ctpop.v2i64
1923
// CHECK: select <2 x i1> %{{.+}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}}
2024
return _mm_maskz_popcnt_epi64(__U, __A);
2125
}
26+
2227
__m128i test_mm_popcnt_epi32(__m128i __A) {
2328
// CHECK-LABEL: @test_mm_popcnt_epi32
2429
// CHECK: @llvm.ctpop.v4i32
2530
return _mm_popcnt_epi32(__A);
2631
}
32+
TEST_CONSTEXPR(match_v4si(_mm_popcnt_epi32((__m128i)(__v4si){+5, -3, -10, +8}), 2, 31, 30, 1));
33+
2734
__m128i test_mm_mask_popcnt_epi32(__m128i __W, __mmask8 __U, __m128i __A) {
2835
// CHECK-LABEL: @test_mm_mask_popcnt_epi32
2936
// CHECK: @llvm.ctpop.v4i32
3037
// CHECK: select <4 x i1> %{{.+}}, <4 x i32> %{{.*}}, <4 x i32> %{{.*}}
3138
return _mm_mask_popcnt_epi32(__W, __U, __A);
3239
}
40+
3341
__m128i test_mm_maskz_popcnt_epi32(__mmask8 __U, __m128i __A) {
3442
// CHECK-LABEL: @test_mm_maskz_popcnt_epi32
3543
// CHECK: @llvm.ctpop.v4i32
@@ -42,29 +50,36 @@ __m256i test_mm256_popcnt_epi64(__m256i __A) {
4250
// CHECK: @llvm.ctpop.v4i64
4351
return _mm256_popcnt_epi64(__A);
4452
}
53+
TEST_CONSTEXPR(match_v4di(_mm256_popcnt_epi64((__m256i)(__v4di){+5, -3, -10, +8}), 2, 63, 62, 1));
54+
4555
__m256i test_mm256_mask_popcnt_epi64(__m256i __W, __mmask8 __U, __m256i __A) {
4656
// CHECK-LABEL: @test_mm256_mask_popcnt_epi64
4757
// CHECK: @llvm.ctpop.v4i64
4858
// CHECK: select <4 x i1> %{{.+}}, <4 x i64> %{{.*}}, <4 x i64> %{{.*}}
4959
return _mm256_mask_popcnt_epi64(__W, __U, __A);
5060
}
61+
5162
__m256i test_mm256_maskz_popcnt_epi64(__mmask8 __U, __m256i __A) {
5263
// CHECK-LABEL: @test_mm256_maskz_popcnt_epi64
5364
// CHECK: @llvm.ctpop.v4i64
5465
// CHECK: select <4 x i1> %{{.+}}, <4 x i64> %{{.*}}, <4 x i64> %{{.*}}
5566
return _mm256_maskz_popcnt_epi64(__U, __A);
5667
}
68+
5769
__m256i test_mm256_popcnt_epi32(__m256i __A) {
5870
// CHECK-LABEL: @test_mm256_popcnt_epi32
5971
// CHECK: @llvm.ctpop.v8i32
6072
return _mm256_popcnt_epi32(__A);
6173
}
74+
TEST_CONSTEXPR(match_v8si(_mm256_popcnt_epi32((__m256i)(__v8si){+5, -3, -10, +8, 0, -256, +256, -128}), 2, 31, 30, 1, 0, 24, 1, 25));
75+
6276
__m256i test_mm256_mask_popcnt_epi32(__m256i __W, __mmask8 __U, __m256i __A) {
6377
// CHECK-LABEL: @test_mm256_mask_popcnt_epi32
6478
// CHECK: @llvm.ctpop.v8i32
6579
// CHECK: select <8 x i1> %{{.+}}, <8 x i32> %{{.*}}, <8 x i32> %{{.*}}
6680
return _mm256_mask_popcnt_epi32(__W, __U, __A);
6781
}
82+
6883
__m256i test_mm256_maskz_popcnt_epi32(__mmask8 __U, __m256i __A) {
6984
// CHECK-LABEL: @test_mm256_maskz_popcnt_epi32
7085
// CHECK: @llvm.ctpop.v8i32

clang/test/CodeGen/X86/builtin_test_helpers.h

+20
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,16 @@ constexpr bool match_m256i(__m256i _v, unsigned long long a, unsigned long long
7373
return v[0] == a && v[1] == b && v[2] == c && v[3] == d;
7474
}
7575

76+
constexpr bool match_v4di(__m256i _v, long long a, long long b, long long c, long long d) {
77+
__v4di v = (__v4di)_v;
78+
return v[0] == a && v[1] == b && v[2] == c && v[3] == d;
79+
}
80+
81+
constexpr bool match_v8si(__m256i _v, int a, int b, int c, int d, int e, int f, int g, int h) {
82+
__v8si v = (__v8si)_v;
83+
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;
84+
}
85+
7686
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) {
7787
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;
7888
}
@@ -86,6 +96,16 @@ constexpr bool match_m512i(__m512i _v, unsigned long long a, unsigned long long
8696
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;
8797
}
8898

99+
constexpr bool match_v8di(__m512i _v, long long a, long long b, long long c, long long d, long long e, long long f, long long g, long long h) {
100+
__v8di v = (__v8di)_v;
101+
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;
102+
}
103+
104+
constexpr bool match_v16si(__m512i _v, int a, int b, int c, int d, int e, int f, int g, int h, int i, int j, int k, int l, int m, int n, int o, int p) {
105+
__v16si v = (__v16si)_v;
106+
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;
107+
}
108+
89109
#define TEST_CONSTEXPR(...) static_assert(__VA_ARGS__)
90110

91111
#else

0 commit comments

Comments
 (0)