Skip to content

Commit 471c262

Browse files
committed
[X86][Clang] Add constexpr support for AVX512 kshift intrinsics Fixes #162056
1 parent 00c8e61 commit 471c262

File tree

6 files changed

+85
-6
lines changed

6 files changed

+85
-6
lines changed

clang/include/clang/Basic/BuiltinsX86.td

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3148,28 +3148,28 @@ let Features = "avx512bw", Attributes = [NoThrow, Const, Constexpr] in {
31483148
def kxordi : X86Builtin<"unsigned long long int(unsigned long long int, unsigned long long int)">;
31493149
}
31503150

3151-
let Features = "avx512dq", Attributes = [NoThrow, Const] in {
3151+
let Features = "avx512dq", Attributes = [NoThrow, Const, Constexpr] in {
31523152
def kshiftliqi : X86Builtin<"unsigned char(unsigned char, _Constant unsigned int)">;
31533153
}
31543154

3155-
let Features = "avx512f", Attributes = [NoThrow, Const] in {
3155+
let Features = "avx512f", Attributes = [NoThrow, Const, Constexpr] in {
31563156
def kshiftlihi : X86Builtin<"unsigned short(unsigned short, _Constant unsigned int)">;
31573157
}
31583158

3159-
let Features = "avx512bw", Attributes = [NoThrow, Const] in {
3159+
let Features = "avx512bw", Attributes = [NoThrow, Const, Constexpr] in {
31603160
def kshiftlisi : X86Builtin<"unsigned int(unsigned int, _Constant unsigned int)">;
31613161
def kshiftlidi : X86Builtin<"unsigned long long int(unsigned long long int, _Constant unsigned int)">;
31623162
}
31633163

3164-
let Features = "avx512dq", Attributes = [NoThrow, Const] in {
3164+
let Features = "avx512dq", Attributes = [NoThrow, Const, Constexpr] in {
31653165
def kshiftriqi : X86Builtin<"unsigned char(unsigned char, _Constant unsigned int)">;
31663166
}
31673167

3168-
let Features = "avx512f", Attributes = [NoThrow, Const] in {
3168+
let Features = "avx512f", Attributes = [NoThrow, Const, Constexpr] in {
31693169
def kshiftrihi : X86Builtin<"unsigned short(unsigned short, _Constant unsigned int)">;
31703170
}
31713171

3172-
let Features = "avx512bw", Attributes = [NoThrow, Const] in {
3172+
let Features = "avx512bw", Attributes = [NoThrow, Const, Constexpr] in {
31733173
def kshiftrisi : X86Builtin<"unsigned int(unsigned int, _Constant unsigned int)">;
31743174
def kshiftridi : X86Builtin<"unsigned long long int(unsigned long long int, _Constant unsigned int)">;
31753175
}

clang/lib/AST/ByteCode/InterpBuiltin.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4255,6 +4255,28 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,
42554255
return APInt(sizeof(unsigned char) * 8, (A | B) == 0);
42564256
});
42574257

4258+
case clang::X86::BI__builtin_ia32_kshiftliqi:
4259+
case clang::X86::BI__builtin_ia32_kshiftlihi:
4260+
case clang::X86::BI__builtin_ia32_kshiftlisi:
4261+
case clang::X86::BI__builtin_ia32_kshiftlidi:
4262+
return interp__builtin_elementwise_int_binop(
4263+
S, OpPC, Call, [](const APSInt &LHS, const APSInt &RHS) {
4264+
if (RHS.uge(LHS.getBitWidth()))
4265+
return APInt::getZero(LHS.getBitWidth());
4266+
return LHS.shl(RHS.getZExtValue());
4267+
});
4268+
4269+
case clang::X86::BI__builtin_ia32_kshiftriqi:
4270+
case clang::X86::BI__builtin_ia32_kshiftrihi:
4271+
case clang::X86::BI__builtin_ia32_kshiftrisi:
4272+
case clang::X86::BI__builtin_ia32_kshiftridi:
4273+
return interp__builtin_elementwise_int_binop(
4274+
S, OpPC, Call, [](const APSInt &LHS, const APSInt &RHS) {
4275+
if (RHS.uge(LHS.getBitWidth()))
4276+
return APInt::getZero(LHS.getBitWidth());
4277+
return LHS.lshr(RHS.getZExtValue());
4278+
});
4279+
42584280
case clang::X86::BI__builtin_ia32_lzcnt_u16:
42594281
case clang::X86::BI__builtin_ia32_lzcnt_u32:
42604282
case clang::X86::BI__builtin_ia32_lzcnt_u64:

clang/lib/AST/ExprConstant.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17054,6 +17054,28 @@ bool IntExprEvaluator::VisitBuiltinCallExpr(const CallExpr *E,
1705417054
return Success(Val, E);
1705517055
}
1705617056

17057+
case X86::BI__builtin_ia32_kshiftliqi:
17058+
case X86::BI__builtin_ia32_kshiftlihi:
17059+
case X86::BI__builtin_ia32_kshiftlisi:
17060+
case X86::BI__builtin_ia32_kshiftlidi: {
17061+
return HandleMaskBinOp([](const APSInt &LHS, const APSInt &RHS) {
17062+
if (RHS.uge(LHS.getBitWidth()))
17063+
return APSInt(APInt::getZero(LHS.getBitWidth()), LHS.isUnsigned());
17064+
return APSInt(LHS.shl(RHS.getZExtValue()), LHS.isUnsigned());
17065+
});
17066+
}
17067+
17068+
case X86::BI__builtin_ia32_kshiftriqi:
17069+
case X86::BI__builtin_ia32_kshiftrihi:
17070+
case X86::BI__builtin_ia32_kshiftrisi:
17071+
case X86::BI__builtin_ia32_kshiftridi: {
17072+
return HandleMaskBinOp([](const APSInt &LHS, const APSInt &RHS) {
17073+
if (RHS.uge(LHS.getBitWidth()))
17074+
return APSInt(APInt::getZero(LHS.getBitWidth()), LHS.isUnsigned());
17075+
return APSInt(LHS.lshr(RHS.getZExtValue()), LHS.isUnsigned());
17076+
});
17077+
}
17078+
1705717079
case clang::X86::BI__builtin_ia32_vec_ext_v4hi:
1705817080
case clang::X86::BI__builtin_ia32_vec_ext_v16qi:
1705917081
case clang::X86::BI__builtin_ia32_vec_ext_v8hi:

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -556,6 +556,23 @@ __mmask64 test_kshiftri_mask64(__m512i A, __m512i B, __m512i C, __m512i D) {
556556
return _mm512_mask_cmpneq_epu8_mask(_kshiftri_mask64(_mm512_cmpneq_epu8_mask(A, B), 32), C, D);
557557
}
558558

559+
TEST_CONSTEXPR(_kshiftli_mask32(0x00000001, 1) == 0x00000002);
560+
TEST_CONSTEXPR(_kshiftli_mask32(0x00000001, 31) == 0x80000000);
561+
TEST_CONSTEXPR(_kshiftli_mask32(0x00000001, 32) == 0x00000000);
562+
TEST_CONSTEXPR(_kshiftli_mask32(0x0000FFFF, 8) == 0x00FFFF00);
563+
TEST_CONSTEXPR(_kshiftri_mask32(0x80000000, 1) == 0x40000000);
564+
TEST_CONSTEXPR(_kshiftri_mask32(0x80000000, 31) == 0x00000001);
565+
TEST_CONSTEXPR(_kshiftri_mask32(0x80000000, 32) == 0x00000000);
566+
TEST_CONSTEXPR(_kshiftri_mask32(0xFFFF0000, 8) == 0x00FFFF00);
567+
TEST_CONSTEXPR(_kshiftli_mask64(0x0000000000000001ULL, 1) == 0x0000000000000002ULL);
568+
TEST_CONSTEXPR(_kshiftli_mask64(0x0000000000000001ULL, 63) == 0x8000000000000000ULL);
569+
TEST_CONSTEXPR(_kshiftli_mask64(0x0000000000000001ULL, 64) == 0x0000000000000000ULL);
570+
TEST_CONSTEXPR(_kshiftli_mask64(0x00000000FFFFFFFFULL, 16) == 0x0000FFFFFFFF0000ULL);
571+
TEST_CONSTEXPR(_kshiftri_mask64(0x8000000000000000ULL, 1) == 0x4000000000000000ULL);
572+
TEST_CONSTEXPR(_kshiftri_mask64(0x8000000000000000ULL, 63) == 0x0000000000000001ULL);
573+
TEST_CONSTEXPR(_kshiftri_mask64(0x8000000000000000ULL, 64) == 0x0000000000000000ULL);
574+
TEST_CONSTEXPR(_kshiftri_mask64(0xFFFFFFFF00000000ULL, 16) == 0x0000FFFFFFFF0000ULL);
575+
559576
unsigned int test_cvtmask32_u32(__m512i A, __m512i B) {
560577
// CHECK-LABEL: test_cvtmask32_u32
561578
return _cvtmask32_u32(_mm512_cmpneq_epu16_mask(A, B));

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,15 @@ __mmask8 test_kshiftri_mask8(__m512i A, __m512i B, __m512i C, __m512i D) {
372372
return _mm512_mask_cmpneq_epu64_mask(_kshiftri_mask8(_mm512_cmpneq_epu64_mask(A, B), 2), C, D);
373373
}
374374

375+
TEST_CONSTEXPR(_kshiftli_mask8(0x01, 1) == 0x02);
376+
TEST_CONSTEXPR(_kshiftli_mask8(0x01, 7) == 0x80);
377+
TEST_CONSTEXPR(_kshiftli_mask8(0x01, 8) == 0x00);
378+
TEST_CONSTEXPR(_kshiftli_mask8(0x0F, 2) == 0x3C);
379+
TEST_CONSTEXPR(_kshiftri_mask8(0x80, 1) == 0x40);
380+
TEST_CONSTEXPR(_kshiftri_mask8(0x80, 7) == 0x01);
381+
TEST_CONSTEXPR(_kshiftri_mask8(0x80, 8) == 0x00);
382+
TEST_CONSTEXPR(_kshiftri_mask8(0xF0, 2) == 0x3C);
383+
375384
unsigned int test_cvtmask8_u32(__m512i A, __m512i B) {
376385
// CHECK-LABEL: test_cvtmask8_u32
377386
// CHECK: zext i8 %{{.*}} to i32

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9581,6 +9581,15 @@ __mmask16 test_kshiftri_mask16(__m512i A, __m512i B, __m512i C, __m512i D) {
95819581
return _mm512_mask_cmpneq_epu32_mask(_kshiftri_mask16(_mm512_cmpneq_epu32_mask(A, B), 1), C, D);
95829582
}
95839583

9584+
TEST_CONSTEXPR(_kshiftli_mask16(0x0001, 1) == 0x0002);
9585+
TEST_CONSTEXPR(_kshiftli_mask16(0x0001, 15) == 0x8000);
9586+
TEST_CONSTEXPR(_kshiftli_mask16(0x0001, 16) == 0x0000);
9587+
TEST_CONSTEXPR(_kshiftli_mask16(0x00FF, 4) == 0x0FF0);
9588+
TEST_CONSTEXPR(_kshiftri_mask16(0x8000, 1) == 0x4000);
9589+
TEST_CONSTEXPR(_kshiftri_mask16(0x8000, 15) == 0x0001);
9590+
TEST_CONSTEXPR(_kshiftri_mask16(0x8000, 16) == 0x0000);
9591+
TEST_CONSTEXPR(_kshiftri_mask16(0xFF00, 4) == 0x0FF0);
9592+
95849593
unsigned int test_cvtmask16_u32(__m512i A, __m512i B) {
95859594
// CHECK-LABEL: test_cvtmask16_u32
95869595
// CHECK: bitcast <16 x i1> %{{.*}} to i16

0 commit comments

Comments
 (0)