Skip to content

Commit ff71edf

Browse files
committed
Allow kadd* to be used in constexpr
1 parent 61acf37 commit ff71edf

File tree

8 files changed

+51
-14
lines changed

8 files changed

+51
-14
lines changed

clang/include/clang/Basic/BuiltinsX86.td

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3073,12 +3073,12 @@ let Features = "avx512dq", Attributes = [NoThrow, Const, RequiredVectorWidth<128
30733073
def fpclassss_mask : X86Builtin<"unsigned char(_Vector<4, float>, _Constant int, unsigned char)">;
30743074
}
30753075

3076-
let Features = "avx512dq", Attributes = [NoThrow, Const] in {
3076+
let Features = "avx512dq", Attributes = [NoThrow, Const, Constexpr] in {
30773077
def kaddqi : X86Builtin<"unsigned char(unsigned char, unsigned char)">;
30783078
def kaddhi : X86Builtin<"unsigned short(unsigned short, unsigned short)">;
30793079
}
30803080

3081-
let Features = "avx512bw", Attributes = [NoThrow, Const] in {
3081+
let Features = "avx512bw", Attributes = [NoThrow, Const, Constexpr] in {
30823082
def kaddsi : X86Builtin<"unsigned int(unsigned int, unsigned int)">;
30833083
def kadddi : X86Builtin<"unsigned long long int(unsigned long long int, unsigned long long int)">;
30843084
}

clang/lib/AST/ByteCode/InterpBuiltin.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3644,6 +3644,14 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,
36443644
case X86::BI__builtin_ia32_knotdi:
36453645
return interp__builtin_knot(S, OpPC, Frame, Call);
36463646

3647+
case X86::BI__builtin_ia32_kaddqi:
3648+
case X86::BI__builtin_ia32_kaddhi:
3649+
case X86::BI__builtin_ia32_kaddsi:
3650+
case X86::BI__builtin_ia32_kadddi:
3651+
return interp__builtin_elementwise_int_binop(
3652+
S, OpPC, Call,
3653+
[](const APSInt &LHS, const APSInt &RHS) { return LHS + RHS; });
3654+
36473655
case Builtin::BI__builtin_elementwise_fshl:
36483656
return interp__builtin_elementwise_triop(S, OpPC, Call,
36493657
llvm::APIntOps::fshl);

clang/lib/AST/ExprConstant.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14705,6 +14705,14 @@ bool IntExprEvaluator::VisitBuiltinCallExpr(const CallExpr *E,
1470514705
APSInt Result = ~Val;
1470614706
return Success(APValue(Result), E);
1470714707
}
14708+
14709+
case X86::BI__builtin_ia32_kaddqi:
14710+
case X86::BI__builtin_ia32_kaddhi:
14711+
case X86::BI__builtin_ia32_kaddsi:
14712+
case X86::BI__builtin_ia32_kadddi: {
14713+
return HandleMaskBinOp(
14714+
[](const APSInt &LHS, const APSInt &RHS) { return LHS + RHS; });
14715+
}
1470814716
}
1470914717
}
1471014718

clang/lib/Headers/avx512bwintrin.h

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -160,14 +160,13 @@ _ktest_mask64_u8(__mmask64 __A, __mmask64 __B, unsigned char *__C) {
160160
return (unsigned char)__builtin_ia32_ktestzdi(__A, __B);
161161
}
162162

163-
static __inline__ __mmask32 __DEFAULT_FN_ATTRS
164-
_kadd_mask32(__mmask32 __A, __mmask32 __B)
165-
{
163+
static __inline__ __mmask32 __DEFAULT_FN_ATTRS_CONSTEXPR
164+
_kadd_mask32(__mmask32 __A, __mmask32 __B) {
166165
return (__mmask32)__builtin_ia32_kaddsi((__mmask32)__A, (__mmask32)__B);
167166
}
168167

169-
static __inline__ __mmask64 __DEFAULT_FN_ATTRS _kadd_mask64(__mmask64 __A,
170-
__mmask64 __B) {
168+
static __inline__ __mmask64 __DEFAULT_FN_ATTRS_CONSTEXPR
169+
_kadd_mask64(__mmask64 __A, __mmask64 __B) {
171170
return (__mmask64)__builtin_ia32_kadddi((__mmask64)__A, (__mmask64)__B);
172171
}
173172

clang/lib/Headers/avx512dqintrin.h

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -113,15 +113,13 @@ _ktest_mask16_u8(__mmask16 __A, __mmask16 __B, unsigned char *__C) {
113113
return (unsigned char)__builtin_ia32_ktestzhi(__A, __B);
114114
}
115115

116-
static __inline__ __mmask8 __DEFAULT_FN_ATTRS
117-
_kadd_mask8(__mmask8 __A, __mmask8 __B)
118-
{
116+
static __inline__ __mmask8 __DEFAULT_FN_ATTRS_CONSTEXPR
117+
_kadd_mask8(__mmask8 __A, __mmask8 __B) {
119118
return (__mmask8)__builtin_ia32_kaddqi((__mmask8)__A, (__mmask8)__B);
120119
}
121120

122-
static __inline__ __mmask16 __DEFAULT_FN_ATTRS
123-
_kadd_mask16(__mmask16 __A, __mmask16 __B)
124-
{
121+
static __inline__ __mmask16 __DEFAULT_FN_ATTRS_CONSTEXPR
122+
_kadd_mask16(__mmask16 __A, __mmask16 __B) {
125123
return (__mmask16)__builtin_ia32_kaddhi((__mmask16)__A, (__mmask16)__B);
126124
}
127125

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,12 @@ __mmask32 test_kadd_mask32(__m512i __A, __m512i __B, __m512i __C, __m512i __D, _
366366
__E, __F);
367367
}
368368

369+
TEST_CONSTEXPR(_kadd_mask32(100000, 200000) == 300000);
370+
TEST_CONSTEXPR(_kadd_mask32(2147483648, 0) == 2147483648);
371+
TEST_CONSTEXPR(_kadd_mask32(0xFFFFFFFF, 1) == 0);
372+
TEST_CONSTEXPR(_kadd_mask32(0xEE6B2800, 0x1DCD6500) == 0x0C388D00);
373+
TEST_CONSTEXPR(_kadd_mask32(0xFFFFFFFA, 10) == 4);
374+
369375
__mmask64 test_kadd_mask64(__m512i __A, __m512i __B, __m512i __C, __m512i __D, __m512i __E, __m512i __F) {
370376
// CHECK-LABEL: test_kadd_mask64
371377
// CHECK: [[LHS:%.*]] = bitcast i64 %{{.*}} to <64 x i1>
@@ -376,6 +382,12 @@ __mmask64 test_kadd_mask64(__m512i __A, __m512i __B, __m512i __C, __m512i __D, _
376382
__E, __F);
377383
}
378384

385+
TEST_CONSTEXPR(_kadd_mask64(10000000000, 20000000000) == 30000000000);
386+
TEST_CONSTEXPR(_kadd_mask64(0x8000000000000000, 0) == 0x8000000000000000);
387+
TEST_CONSTEXPR(_kadd_mask64(0xFFFFFFFFFFFFFFFF, 1) == 0);
388+
TEST_CONSTEXPR(_kadd_mask64(0xFFFFFFFFFFFFFFFA, 10) == 4);
389+
TEST_CONSTEXPR(_kadd_mask64(0xFA0A1F2C6C729C00, 0x0DE0B6B3A7640000) == 0x07EAD5E013D69C00);
390+
379391
__mmask32 test_kshiftli_mask32(__m512i A, __m512i B, __m512i C, __m512i D) {
380392
// CHECK-LABEL: test_kshiftli_mask32
381393
// CHECK: [[VAL:%.*]] = bitcast i32 %{{.*}} to <32 x i1>

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,12 @@ __mmask8 test_kadd_mask8(__m512i __A, __m512i __B, __m512i __C, __m512i __D, __m
228228
__E, __F);
229229
}
230230

231+
TEST_CONSTEXPR(_kadd_mask8(20, 30) == 50);
232+
TEST_CONSTEXPR(_kadd_mask8(128, 0) == 128);
233+
TEST_CONSTEXPR(_kadd_mask8(0xFF, 1) == 0);
234+
TEST_CONSTEXPR(_kadd_mask8(0xC8, 0x64) == 0x2C);
235+
TEST_CONSTEXPR(_kadd_mask8(0xFA, 0x0F) == 0x09);
236+
231237
__mmask16 test_kadd_mask16(__m512i __A, __m512i __B, __m512i __C, __m512i __D, __m512i __E, __m512i __F) {
232238
// CHECK-LABEL: test_kadd_mask16
233239
// CHECK: [[LHS:%.*]] = bitcast i16 %{{.*}} to <16 x i1>
@@ -238,6 +244,12 @@ __mmask16 test_kadd_mask16(__m512i __A, __m512i __B, __m512i __C, __m512i __D, _
238244
__E, __F);
239245
}
240246

247+
TEST_CONSTEXPR(_kadd_mask16(1000, 2000) == 3000);
248+
TEST_CONSTEXPR(_kadd_mask16(32768, 0) == 32768);
249+
TEST_CONSTEXPR(_kadd_mask16(0xFFFF, 1) == 0);
250+
TEST_CONSTEXPR(_kadd_mask16(0xEA60, 0x2710) == 0x1170);
251+
TEST_CONSTEXPR(_kadd_mask16(0xFFFA, 0x14) == 0x0E);
252+
241253
__mmask8 test_kshiftli_mask8(__m512i A, __m512i B, __m512i C, __m512i D) {
242254
// CHECK-LABEL: test_kshiftli_mask8
243255
// CHECK: [[VAL:%.*]] = bitcast i8 %{{.*}} to <8 x i1>

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11106,7 +11106,7 @@ int test_mm512_mask2int(__mmask16 __a)
1110611106
return _mm512_mask2int(__a);
1110711107
}
1110811108

11109-
TEST_CONSTEXPR(_mm512_mask2int(0x8000) == 0x00008000); // Zero-extended
11109+
TEST_CONSTEXPR(_mm512_mask2int(0x8000) == 0x00008000);
1111011110

1111111111
__m128 test_mm_mask_move_ss (__m128 __W, __mmask8 __U, __m128 __A, __m128 __B)
1111211112
{

0 commit comments

Comments
 (0)