diff --git a/clang/include/clang/Basic/BuiltinsX86.td b/clang/include/clang/Basic/BuiltinsX86.td index 500aa85fe5356..0b1c9b3dbfdc3 100644 --- a/clang/include/clang/Basic/BuiltinsX86.td +++ b/clang/include/clang/Basic/BuiltinsX86.td @@ -3193,31 +3193,31 @@ let Features = "avx512bw", Attributes = [NoThrow, Const, Constexpr] in { def kordi : X86Builtin<"unsigned long long int(unsigned long long int, unsigned long long int)">; } -let Features = "avx512dq", Attributes = [NoThrow, Const] in { +let Features = "avx512dq", Attributes = [NoThrow, Const, Constexpr] in { def kortestcqi : X86Builtin<"int(unsigned char, unsigned char)">; def kortestzqi : X86Builtin<"int(unsigned char, unsigned char)">; } -let Features = "avx512f", Attributes = [NoThrow, Const] in { +let Features = "avx512f", Attributes = [NoThrow, Const, Constexpr] in { def kortestchi : X86Builtin<"int(unsigned short, unsigned short)">; def kortestzhi : X86Builtin<"int(unsigned short, unsigned short)">; } -let Features = "avx512bw", Attributes = [NoThrow, Const] in { +let Features = "avx512bw", Attributes = [NoThrow, Const, Constexpr] in { def kortestcsi : X86Builtin<"int(unsigned int, unsigned int)">; def kortestzsi : X86Builtin<"int(unsigned int, unsigned int)">; def kortestcdi : X86Builtin<"int(unsigned long long int, unsigned long long int)">; def kortestzdi : X86Builtin<"int(unsigned long long int, unsigned long long int)">; } -let Features = "avx512dq", Attributes = [NoThrow, Const] in { +let Features = "avx512dq", Attributes = [NoThrow, Const, Constexpr] in { def ktestcqi : X86Builtin<"int(unsigned char, unsigned char)">; def ktestzqi : X86Builtin<"int(unsigned char, unsigned char)">; def ktestchi : X86Builtin<"int(unsigned short, unsigned short)">; def ktestzhi : X86Builtin<"int(unsigned short, unsigned short)">; } -let Features = "avx512bw", Attributes = [NoThrow, Const] in { +let Features = "avx512bw", Attributes = [NoThrow, Const, Constexpr] in { def ktestcsi : X86Builtin<"int(unsigned int, unsigned int)">; def ktestzsi : X86Builtin<"int(unsigned int, unsigned int)">; def ktestcdi : X86Builtin<"int(unsigned long long int, unsigned long long int)">; diff --git a/clang/lib/AST/ByteCode/InterpBuiltin.cpp b/clang/lib/AST/ByteCode/InterpBuiltin.cpp index ab6b3ed1be0aa..7b1f3c5a7189a 100644 --- a/clang/lib/AST/ByteCode/InterpBuiltin.cpp +++ b/clang/lib/AST/ByteCode/InterpBuiltin.cpp @@ -3792,6 +3792,42 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call, return Result; }); + case clang::X86::BI__builtin_ia32_ktestcqi: + case clang::X86::BI__builtin_ia32_ktestchi: + case clang::X86::BI__builtin_ia32_ktestcsi: + case clang::X86::BI__builtin_ia32_ktestcdi: + return interp__builtin_elementwise_int_binop( + S, OpPC, Call, [](const APSInt &A, const APSInt &B) { + return APInt(sizeof(unsigned char) * 8, (~A & B) == 0); + }); + + case clang::X86::BI__builtin_ia32_ktestzqi: + case clang::X86::BI__builtin_ia32_ktestzhi: + case clang::X86::BI__builtin_ia32_ktestzsi: + case clang::X86::BI__builtin_ia32_ktestzdi: + return interp__builtin_elementwise_int_binop( + S, OpPC, Call, [](const APSInt &A, const APSInt &B) { + return APInt(sizeof(unsigned char) * 8, (A & B) == 0); + }); + + case clang::X86::BI__builtin_ia32_kortestcqi: + case clang::X86::BI__builtin_ia32_kortestchi: + case clang::X86::BI__builtin_ia32_kortestcsi: + case clang::X86::BI__builtin_ia32_kortestcdi: + return interp__builtin_elementwise_int_binop( + S, OpPC, Call, [](const APSInt &A, const APSInt &B) { + return APInt(sizeof(unsigned char) * 8, ~(A | B) == 0); + }); + + case clang::X86::BI__builtin_ia32_kortestzqi: + case clang::X86::BI__builtin_ia32_kortestzhi: + case clang::X86::BI__builtin_ia32_kortestzsi: + case clang::X86::BI__builtin_ia32_kortestzdi: + return interp__builtin_elementwise_int_binop( + S, OpPC, Call, [](const APSInt &A, const APSInt &B) { + return APInt(sizeof(unsigned char) * 8, (A | B) == 0); + }); + case clang::X86::BI__builtin_ia32_lzcnt_u16: case clang::X86::BI__builtin_ia32_lzcnt_u32: case clang::X86::BI__builtin_ia32_lzcnt_u64: diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index d0404b957ab03..2abc1c3b5f624 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -15614,6 +15614,54 @@ bool IntExprEvaluator::VisitBuiltinCallExpr(const CallExpr *E, return Success(Val, E); } + case clang::X86::BI__builtin_ia32_ktestcqi: + case clang::X86::BI__builtin_ia32_ktestchi: + case clang::X86::BI__builtin_ia32_ktestcsi: + case clang::X86::BI__builtin_ia32_ktestcdi: { + APSInt A, B; + if (!EvaluateInteger(E->getArg(0), A, Info) || + !EvaluateInteger(E->getArg(1), B, Info)) + return false; + + return Success((~A & B) == 0, E); + } + + case clang::X86::BI__builtin_ia32_ktestzqi: + case clang::X86::BI__builtin_ia32_ktestzhi: + case clang::X86::BI__builtin_ia32_ktestzsi: + case clang::X86::BI__builtin_ia32_ktestzdi: { + APSInt A, B; + if (!EvaluateInteger(E->getArg(0), A, Info) || + !EvaluateInteger(E->getArg(1), B, Info)) + return false; + + return Success((A & B) == 0, E); + } + + case clang::X86::BI__builtin_ia32_kortestcqi: + case clang::X86::BI__builtin_ia32_kortestchi: + case clang::X86::BI__builtin_ia32_kortestcsi: + case clang::X86::BI__builtin_ia32_kortestcdi: { + APSInt A, B; + if (!EvaluateInteger(E->getArg(0), A, Info) || + !EvaluateInteger(E->getArg(1), B, Info)) + return false; + + return Success(~(A | B) == 0, E); + } + + case clang::X86::BI__builtin_ia32_kortestzqi: + case clang::X86::BI__builtin_ia32_kortestzhi: + case clang::X86::BI__builtin_ia32_kortestzsi: + case clang::X86::BI__builtin_ia32_kortestzdi: { + APSInt A, B; + if (!EvaluateInteger(E->getArg(0), A, Info) || + !EvaluateInteger(E->getArg(1), B, Info)) + return false; + + return Success((A | B) == 0, E); + } + case clang::X86::BI__builtin_ia32_lzcnt_u16: case clang::X86::BI__builtin_ia32_lzcnt_u32: case clang::X86::BI__builtin_ia32_lzcnt_u64: { diff --git a/clang/lib/Headers/avx512bwintrin.h b/clang/lib/Headers/avx512bwintrin.h index ac75b6ccde735..21915a4ec2934 100644 --- a/clang/lib/Headers/avx512bwintrin.h +++ b/clang/lib/Headers/avx512bwintrin.h @@ -92,69 +92,65 @@ _kxor_mask64(__mmask64 __A, __mmask64 __B) { return (__mmask64)__builtin_ia32_kxordi((__mmask64)__A, (__mmask64)__B); } -static __inline__ unsigned char __DEFAULT_FN_ATTRS -_kortestc_mask32_u8(__mmask32 __A, __mmask32 __B) -{ +static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR +_kortestc_mask32_u8(__mmask32 __A, __mmask32 __B) { return (unsigned char)__builtin_ia32_kortestcsi(__A, __B); } -static __inline__ unsigned char __DEFAULT_FN_ATTRS -_kortestz_mask32_u8(__mmask32 __A, __mmask32 __B) -{ +static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR +_kortestz_mask32_u8(__mmask32 __A, __mmask32 __B) { return (unsigned char)__builtin_ia32_kortestzsi(__A, __B); } -static __inline__ unsigned char __DEFAULT_FN_ATTRS +static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR _kortest_mask32_u8(__mmask32 __A, __mmask32 __B, unsigned char *__C) { *__C = (unsigned char)__builtin_ia32_kortestcsi(__A, __B); return (unsigned char)__builtin_ia32_kortestzsi(__A, __B); } -static __inline__ unsigned char __DEFAULT_FN_ATTRS +static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR _kortestc_mask64_u8(__mmask64 __A, __mmask64 __B) { return (unsigned char)__builtin_ia32_kortestcdi(__A, __B); } -static __inline__ unsigned char __DEFAULT_FN_ATTRS +static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR _kortestz_mask64_u8(__mmask64 __A, __mmask64 __B) { return (unsigned char)__builtin_ia32_kortestzdi(__A, __B); } -static __inline__ unsigned char __DEFAULT_FN_ATTRS +static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR _kortest_mask64_u8(__mmask64 __A, __mmask64 __B, unsigned char *__C) { *__C = (unsigned char)__builtin_ia32_kortestcdi(__A, __B); return (unsigned char)__builtin_ia32_kortestzdi(__A, __B); } -static __inline__ unsigned char __DEFAULT_FN_ATTRS -_ktestc_mask32_u8(__mmask32 __A, __mmask32 __B) -{ +static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR +_ktestc_mask32_u8(__mmask32 __A, __mmask32 __B) { return (unsigned char)__builtin_ia32_ktestcsi(__A, __B); } -static __inline__ unsigned char __DEFAULT_FN_ATTRS -_ktestz_mask32_u8(__mmask32 __A, __mmask32 __B) -{ +static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR +_ktestz_mask32_u8(__mmask32 __A, __mmask32 __B) { return (unsigned char)__builtin_ia32_ktestzsi(__A, __B); } -static __inline__ unsigned char __DEFAULT_FN_ATTRS +static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR _ktest_mask32_u8(__mmask32 __A, __mmask32 __B, unsigned char *__C) { *__C = (unsigned char)__builtin_ia32_ktestcsi(__A, __B); return (unsigned char)__builtin_ia32_ktestzsi(__A, __B); } -static __inline__ unsigned char __DEFAULT_FN_ATTRS +static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR _ktestc_mask64_u8(__mmask64 __A, __mmask64 __B) { return (unsigned char)__builtin_ia32_ktestcdi(__A, __B); } -static __inline__ unsigned char __DEFAULT_FN_ATTRS +static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR _ktestz_mask64_u8(__mmask64 __A, __mmask64 __B) { return (unsigned char)__builtin_ia32_ktestzdi(__A, __B); } -static __inline__ unsigned char __DEFAULT_FN_ATTRS +static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR _ktest_mask64_u8(__mmask64 __A, __mmask64 __B, unsigned char *__C) { *__C = (unsigned char)__builtin_ia32_ktestcdi(__A, __B); return (unsigned char)__builtin_ia32_ktestzdi(__A, __B); diff --git a/clang/lib/Headers/avx512dqintrin.h b/clang/lib/Headers/avx512dqintrin.h index fef1a2d64d538..29156e7e96434 100644 --- a/clang/lib/Headers/avx512dqintrin.h +++ b/clang/lib/Headers/avx512dqintrin.h @@ -59,55 +59,49 @@ _kxor_mask8(__mmask8 __A, __mmask8 __B) { return (__mmask8)__builtin_ia32_kxorqi((__mmask8)__A, (__mmask8)__B); } -static __inline__ unsigned char __DEFAULT_FN_ATTRS -_kortestc_mask8_u8(__mmask8 __A, __mmask8 __B) -{ +static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR +_kortestc_mask8_u8(__mmask8 __A, __mmask8 __B) { return (unsigned char)__builtin_ia32_kortestcqi(__A, __B); } -static __inline__ unsigned char __DEFAULT_FN_ATTRS -_kortestz_mask8_u8(__mmask8 __A, __mmask8 __B) -{ +static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR +_kortestz_mask8_u8(__mmask8 __A, __mmask8 __B) { return (unsigned char)__builtin_ia32_kortestzqi(__A, __B); } -static __inline__ unsigned char __DEFAULT_FN_ATTRS +static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR _kortest_mask8_u8(__mmask8 __A, __mmask8 __B, unsigned char *__C) { *__C = (unsigned char)__builtin_ia32_kortestcqi(__A, __B); return (unsigned char)__builtin_ia32_kortestzqi(__A, __B); } -static __inline__ unsigned char __DEFAULT_FN_ATTRS -_ktestc_mask8_u8(__mmask8 __A, __mmask8 __B) -{ +static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR +_ktestc_mask8_u8(__mmask8 __A, __mmask8 __B) { return (unsigned char)__builtin_ia32_ktestcqi(__A, __B); } -static __inline__ unsigned char __DEFAULT_FN_ATTRS -_ktestz_mask8_u8(__mmask8 __A, __mmask8 __B) -{ +static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR +_ktestz_mask8_u8(__mmask8 __A, __mmask8 __B) { return (unsigned char)__builtin_ia32_ktestzqi(__A, __B); } -static __inline__ unsigned char __DEFAULT_FN_ATTRS +static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR _ktest_mask8_u8(__mmask8 __A, __mmask8 __B, unsigned char *__C) { *__C = (unsigned char)__builtin_ia32_ktestcqi(__A, __B); return (unsigned char)__builtin_ia32_ktestzqi(__A, __B); } -static __inline__ unsigned char __DEFAULT_FN_ATTRS -_ktestc_mask16_u8(__mmask16 __A, __mmask16 __B) -{ +static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR +_ktestc_mask16_u8(__mmask16 __A, __mmask16 __B) { return (unsigned char)__builtin_ia32_ktestchi(__A, __B); } -static __inline__ unsigned char __DEFAULT_FN_ATTRS -_ktestz_mask16_u8(__mmask16 __A, __mmask16 __B) -{ +static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR +_ktestz_mask16_u8(__mmask16 __A, __mmask16 __B) { return (unsigned char)__builtin_ia32_ktestzhi(__A, __B); } -static __inline__ unsigned char __DEFAULT_FN_ATTRS +static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR _ktest_mask16_u8(__mmask16 __A, __mmask16 __B, unsigned char *__C) { *__C = (unsigned char)__builtin_ia32_ktestchi(__A, __B); return (unsigned char)__builtin_ia32_ktestzhi(__A, __B); diff --git a/clang/lib/Headers/avx512fintrin.h b/clang/lib/Headers/avx512fintrin.h index 18c4a44a4c76e..aa77e270f99a1 100644 --- a/clang/lib/Headers/avx512fintrin.h +++ b/clang/lib/Headers/avx512fintrin.h @@ -8081,31 +8081,27 @@ _mm512_kor(__mmask16 __A, __mmask16 __B) { return (__mmask16) __builtin_ia32_korhi ((__mmask16) __A, (__mmask16) __B); } -static __inline__ int __DEFAULT_FN_ATTRS -_mm512_kortestc (__mmask16 __A, __mmask16 __B) -{ +static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR +_mm512_kortestc(__mmask16 __A, __mmask16 __B) { return __builtin_ia32_kortestchi ((__mmask16) __A, (__mmask16) __B); } -static __inline__ int __DEFAULT_FN_ATTRS -_mm512_kortestz (__mmask16 __A, __mmask16 __B) -{ +static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR +_mm512_kortestz(__mmask16 __A, __mmask16 __B) { return __builtin_ia32_kortestzhi ((__mmask16) __A, (__mmask16) __B); } -static __inline__ unsigned char __DEFAULT_FN_ATTRS -_kortestc_mask16_u8(__mmask16 __A, __mmask16 __B) -{ +static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR +_kortestc_mask16_u8(__mmask16 __A, __mmask16 __B) { return (unsigned char)__builtin_ia32_kortestchi(__A, __B); } -static __inline__ unsigned char __DEFAULT_FN_ATTRS -_kortestz_mask16_u8(__mmask16 __A, __mmask16 __B) -{ +static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR +_kortestz_mask16_u8(__mmask16 __A, __mmask16 __B) { return (unsigned char)__builtin_ia32_kortestzhi(__A, __B); } -static __inline__ unsigned char __DEFAULT_FN_ATTRS +static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR _kortest_mask16_u8(__mmask16 __A, __mmask16 __B, unsigned char *__C) { *__C = (unsigned char)__builtin_ia32_kortestchi(__A, __B); return (unsigned char)__builtin_ia32_kortestzhi(__A, __B); diff --git a/clang/test/CodeGen/X86/avx512bw-builtins.c b/clang/test/CodeGen/X86/avx512bw-builtins.c index be2cd480f7558..d2f5da22cd07c 100644 --- a/clang/test/CodeGen/X86/avx512bw-builtins.c +++ b/clang/test/CodeGen/X86/avx512bw-builtins.c @@ -209,6 +209,10 @@ unsigned char test_kortestz_mask32_u8(__m512i __A, __m512i __B, __m512i __C, __m _mm512_cmpneq_epu16_mask(__C, __D)); } +TEST_CONSTEXPR(_kortestz_mask32_u8(0x0000'0000, 0x0000'0000) == 1); +TEST_CONSTEXPR(_kortestz_mask32_u8(0x0000'0000, 0x8000'0000) == 0); +TEST_CONSTEXPR(_kortestz_mask32_u8(0x0123'4567, 0xFEDC'BA98) == 0); + unsigned char test_kortestc_mask32_u8(__m512i __A, __m512i __B, __m512i __C, __m512i __D) { // CHECK-LABEL: test_kortestc_mask32_u8 // CHECK: [[LHS:%.*]] = bitcast i32 %{{.*}} to <32 x i1> @@ -222,6 +226,10 @@ unsigned char test_kortestc_mask32_u8(__m512i __A, __m512i __B, __m512i __C, __m _mm512_cmpneq_epu16_mask(__C, __D)); } +TEST_CONSTEXPR(_kortestc_mask32_u8(0x0000'0000, 0x0000'0000) == 0); +TEST_CONSTEXPR(_kortestc_mask32_u8(0x0000'0000, 0x8000'0000) == 0); +TEST_CONSTEXPR(_kortestc_mask32_u8(0x0123'4567, 0xFEDC'BA98) == 1); + unsigned char test_kortest_mask32_u8(__m512i __A, __m512i __B, __m512i __C, __m512i __D, unsigned char *CF) { // CHECK-LABEL: test_kortest_mask32_u8 // CHECK: [[LHS:%.*]] = bitcast i32 %{{.*}} to <32 x i1> @@ -242,6 +250,30 @@ unsigned char test_kortest_mask32_u8(__m512i __A, __m512i __B, __m512i __C, __m5 _mm512_cmpneq_epu16_mask(__C, __D), CF); } +// Test constexpr handling. +#if defined(__cplusplus) && (__cplusplus >= 201103L) +constexpr unsigned char +test_kortest_mask32_u8(unsigned int A, unsigned int B) { + unsigned char all_ones{}; + return (_kortest_mask32_u8(A, B, &all_ones) << 4) | all_ones; +} + +void _kortest_mask32_u8() { + constexpr unsigned int A1 = 0x0000'0000; + constexpr unsigned int B1 = 0x0000'0000; + constexpr unsigned char expected_result_1 = 0x10; + static_assert(test_kortest_mask32_u8(A1, B1) == expected_result_1); + constexpr unsigned int A2 = 0x0000'0000; + constexpr unsigned int B2 = 0x8000'0000; + constexpr unsigned char expected_result_2 = 0x00; + static_assert(test_kortest_mask32_u8(A2, B2) == expected_result_2); + constexpr unsigned int A3 = 0x0123'4567; + constexpr unsigned int B3 = 0xFEDC'BA98; + constexpr unsigned char expected_result_3 = 0x01; + static_assert(test_kortest_mask32_u8(A3, B3) == expected_result_3); +} +#endif + unsigned char test_kortestz_mask64_u8(__m512i __A, __m512i __B, __m512i __C, __m512i __D) { // CHECK-LABEL: test_kortestz_mask64_u8 // CHECK: [[LHS:%.*]] = bitcast i64 %{{.*}} to <64 x i1> @@ -255,6 +287,10 @@ unsigned char test_kortestz_mask64_u8(__m512i __A, __m512i __B, __m512i __C, __m _mm512_cmpneq_epu8_mask(__C, __D)); } +TEST_CONSTEXPR(_kortestz_mask64_u8(0x0000'0000'0000'0000, 0x0000'0000'0000'0000) == 1); +TEST_CONSTEXPR(_kortestz_mask64_u8(0x0000'0000'0000'0000, 0x8000'0000'0000'0000) == 0); +TEST_CONSTEXPR(_kortestz_mask64_u8(0x0123'4567'89AB'CDEF, 0xFEDC'BA98'7654'3210) == 0); + unsigned char test_kortestc_mask64_u8(__m512i __A, __m512i __B, __m512i __C, __m512i __D) { // CHECK-LABEL: test_kortestc_mask64_u8 // CHECK: [[LHS:%.*]] = bitcast i64 %{{.*}} to <64 x i1> @@ -268,6 +304,10 @@ unsigned char test_kortestc_mask64_u8(__m512i __A, __m512i __B, __m512i __C, __m _mm512_cmpneq_epu8_mask(__C, __D)); } +TEST_CONSTEXPR(_kortestc_mask64_u8(0x0000'0000'0000'0000, 0x0000'0000'0000'0000) == 0); +TEST_CONSTEXPR(_kortestc_mask64_u8(0x0023'4567'89AB'CDEF, 0xFEDC'BA98'7654'3210) == 0); +TEST_CONSTEXPR(_kortestc_mask64_u8(0x0123'4567'89AB'CDEF, 0xFEDC'BA98'7654'3210) == 1); + unsigned char test_kortest_mask64_u8(__m512i __A, __m512i __B, __m512i __C, __m512i __D, unsigned char *CF) { // CHECK-LABEL: test_kortest_mask64_u8 // CHECK: [[LHS:%.*]] = bitcast i64 %{{.*}} to <64 x i1> @@ -288,6 +328,30 @@ unsigned char test_kortest_mask64_u8(__m512i __A, __m512i __B, __m512i __C, __m5 _mm512_cmpneq_epu8_mask(__C, __D), CF); } +// Test constexpr handling. +#if defined(__cplusplus) && (__cplusplus >= 201103L) +constexpr unsigned char +test_kortest_mask64_u8(unsigned long long A, unsigned long long B) { + unsigned char all_ones{}; + return (_kortest_mask64_u8(A, B, &all_ones) << 4) | all_ones; +} + +void _kortest_mask64_u8() { + constexpr unsigned long long A1 = 0x0000'0000'0000'0000; + constexpr unsigned long long B1 = 0x0000'0000'0000'0000; + constexpr unsigned char expected_result_1 = 0x10; + static_assert(test_kortest_mask64_u8(A1, B1) == expected_result_1); + constexpr unsigned long long A2 = 0x0000'0000'0000'0000; + constexpr unsigned long long B2 = 0x8000'0000'0000'0000; + constexpr unsigned char expected_result_2 = 0x00; + static_assert(test_kortest_mask64_u8(A2, B2) == expected_result_2); + constexpr unsigned long long A3 = 0x0123'4567'89AB'CDEF; + constexpr unsigned long long B3 = 0xFEDC'BA98'7654'3210; + constexpr unsigned char expected_result_3 = 0x01; + static_assert(test_kortest_mask64_u8(A3, B3) == expected_result_3); +} +#endif + unsigned char test_ktestz_mask32_u8(__m512i __A, __m512i __B, __m512i __C, __m512i __D) { // CHECK-LABEL: test_ktestz_mask32_u8 // CHECK: [[LHS:%.*]] = bitcast i32 %{{.*}} to <32 x i1> @@ -298,6 +362,11 @@ unsigned char test_ktestz_mask32_u8(__m512i __A, __m512i __B, __m512i __C, __m51 _mm512_cmpneq_epu16_mask(__C, __D)); } +TEST_CONSTEXPR(_ktestz_mask32_u8(0x0000'0000, 0x0000'0000) == 1); +TEST_CONSTEXPR(_ktestz_mask32_u8(0x0000'0000, 0x8000'0000) == 1); +TEST_CONSTEXPR(_ktestz_mask32_u8(0xF000'0000, 0x8000'0000) == 0); +TEST_CONSTEXPR(_ktestz_mask32_u8(0x0123'4567, 0x0123'4567) == 0); + unsigned char test_ktestc_mask32_u8(__m512i __A, __m512i __B, __m512i __C, __m512i __D) { // CHECK-LABEL: test_ktestc_mask32_u8 // CHECK: [[LHS:%.*]] = bitcast i32 %{{.*}} to <32 x i1> @@ -308,6 +377,11 @@ unsigned char test_ktestc_mask32_u8(__m512i __A, __m512i __B, __m512i __C, __m51 _mm512_cmpneq_epu16_mask(__C, __D)); } +TEST_CONSTEXPR(_ktestc_mask32_u8(0x0000'0000, 0x0000'0000) == 1); +TEST_CONSTEXPR(_ktestc_mask32_u8(0x0000'0000, 0x8000'0000) == 0); +TEST_CONSTEXPR(_ktestc_mask32_u8(0xF000'0000, 0x8000'0000) == 1); +TEST_CONSTEXPR(_ktestc_mask32_u8(0x0123'4567, 0x0123'4567) == 1); + unsigned char test_ktest_mask32_u8(__m512i __A, __m512i __B, __m512i __C, __m512i __D, unsigned char *CF) { // CHECK-LABEL: test_ktest_mask32_u8 // CHECK: [[LHS:%.*]] = bitcast i32 %{{.*}} to <32 x i1> @@ -322,6 +396,34 @@ unsigned char test_ktest_mask32_u8(__m512i __A, __m512i __B, __m512i __C, __m512 _mm512_cmpneq_epu16_mask(__C, __D), CF); } +// Test constexpr handling. +#if defined(__cplusplus) && (__cplusplus >= 201103L) +constexpr unsigned char +test_ktest_mask32_u8(unsigned int A, unsigned int B) { + unsigned char and_not{}; + return (_ktest_mask32_u8(A, B, &and_not) << 4) | and_not; +} + +void _ktest_mask32_u8() { + constexpr unsigned int A1 = 0x0000'0000; + constexpr unsigned int B1 = 0x0000'0000; + constexpr unsigned char expected_result_1 = 0x11; + static_assert(test_ktest_mask32_u8(A1, B1) == expected_result_1); + constexpr unsigned int A2 = 0x0000'0000; + constexpr unsigned int B2 = 0x8000'0000; + constexpr unsigned char expected_result_2 = 0x10; + static_assert(test_ktest_mask32_u8(A2, B2) == expected_result_2); + constexpr unsigned int A3 = 0xF000'0000; + constexpr unsigned int B3 = 0x8000'0000; + constexpr unsigned char expected_result_3 = 0x01; + static_assert(test_ktest_mask32_u8(A3, B3) == expected_result_3); + constexpr unsigned int A4 = 0x0123'4567; + constexpr unsigned int B4 = 0x0123'4567; + constexpr unsigned char expected_result_4 = 0x01; + static_assert(test_ktest_mask32_u8(A4, B4) == expected_result_4); +} +#endif + unsigned char test_ktestz_mask64_u8(__m512i __A, __m512i __B, __m512i __C, __m512i __D) { // CHECK-LABEL: test_ktestz_mask64_u8 // CHECK: [[LHS:%.*]] = bitcast i64 %{{.*}} to <64 x i1> @@ -332,6 +434,11 @@ unsigned char test_ktestz_mask64_u8(__m512i __A, __m512i __B, __m512i __C, __m51 _mm512_cmpneq_epu8_mask(__C, __D)); } +TEST_CONSTEXPR(_ktestz_mask64_u8(0x0000'0000'0000'0000, 0x0000'0000'0000'0000) == 1); +TEST_CONSTEXPR(_ktestz_mask64_u8(0x0000'0000'0000'0000, 0x8000'0000'0000'0000) == 1); +TEST_CONSTEXPR(_ktestz_mask64_u8(0xF000'0000'0000'0000, 0x8000'0000'0000'0000) == 0); +TEST_CONSTEXPR(_ktestz_mask64_u8(0x0123'4567'89AB'CDEF, 0x0123'4567'89AB'CDEF) == 0); + unsigned char test_ktestc_mask64_u8(__m512i __A, __m512i __B, __m512i __C, __m512i __D) { // CHECK-LABEL: test_ktestc_mask64_u8 // CHECK: [[LHS:%.*]] = bitcast i64 %{{.*}} to <64 x i1> @@ -342,6 +449,11 @@ unsigned char test_ktestc_mask64_u8(__m512i __A, __m512i __B, __m512i __C, __m51 _mm512_cmpneq_epu8_mask(__C, __D)); } +TEST_CONSTEXPR(_ktestc_mask64_u8(0x0000'0000'0000'0000, 0x0000'0000'0000'0000) == 1); +TEST_CONSTEXPR(_ktestc_mask64_u8(0x0000'0000'0000'0000, 0x8000'0000'0000'0000) == 0); +TEST_CONSTEXPR(_ktestc_mask64_u8(0xF000'0000'0000'0000, 0x8000'0000'0000'0000) == 1); +TEST_CONSTEXPR(_ktestc_mask64_u8(0x0123'4567'89AB'CDEF, 0x0123'4567'89AB'CDEF) == 1); + unsigned char test_ktest_mask64_u8(__m512i __A, __m512i __B, __m512i __C, __m512i __D, unsigned char *CF) { // CHECK-LABEL: test_ktest_mask64_u8 // CHECK: [[LHS:%.*]] = bitcast i64 %{{.*}} to <64 x i1> @@ -356,6 +468,34 @@ unsigned char test_ktest_mask64_u8(__m512i __A, __m512i __B, __m512i __C, __m512 _mm512_cmpneq_epu8_mask(__C, __D), CF); } +// Test constexpr handling. +#if defined(__cplusplus) && (__cplusplus >= 201402L) +constexpr unsigned char +test_ktest_mask64_u8(unsigned long long A, unsigned long long B) { + unsigned char and_not{}; + return (_ktest_mask64_u8(A, B, &and_not) << 4) | and_not; +} + +void _ktest_mask64_u8() { + constexpr unsigned long long A1 = 0x0000'0000'0000'0000; + constexpr unsigned long long B1 = 0x0000'0000'0000'0000; + constexpr unsigned char expected_result_1 = 0x11; + static_assert(test_ktest_mask64_u8(A1, B1) == expected_result_1); + constexpr unsigned long long A2 = 0x0000'0000'0000'0000; + constexpr unsigned long long B2 = 0x8000'0000'0000'0000; + constexpr unsigned char expected_result_2 = 0x10; + static_assert(test_ktest_mask64_u8(A2, B2) == expected_result_2); + constexpr unsigned long long A3 = 0xF000'0000'0000'0000; + constexpr unsigned long long B3 = 0x8000'0000'0000'0000; + constexpr unsigned char expected_result_3 = 0x01; + static_assert(test_ktest_mask64_u8(A3, B3) == expected_result_3); + constexpr unsigned long long A4 = 0x0123'4567'89AB'CDEF; + constexpr unsigned long long B4 = 0x0123'4567'89AB'CDEF; + constexpr unsigned char expected_result_4 = 0x01; + static_assert(test_ktest_mask64_u8(A4, B4) == expected_result_4); +} +#endif + __mmask32 test_kadd_mask32(__m512i __A, __m512i __B, __m512i __C, __m512i __D, __m512i __E, __m512i __F) { // CHECK-LABEL: test_kadd_mask32 // CHECK: [[LHS:%.*]] = bitcast i32 %{{.*}} to <32 x i1> diff --git a/clang/test/CodeGen/X86/avx512dq-builtins.c b/clang/test/CodeGen/X86/avx512dq-builtins.c index 9c4ada3a2b7b8..efe983ce5b10c 100644 --- a/clang/test/CodeGen/X86/avx512dq-builtins.c +++ b/clang/test/CodeGen/X86/avx512dq-builtins.c @@ -117,6 +117,10 @@ unsigned char test_kortestz_mask8_u8(__m512i __A, __m512i __B, __m512i __C, __m5 _mm512_cmpneq_epu64_mask(__C, __D)); } +TEST_CONSTEXPR(_kortestz_mask8_u8(0x00, 0x00) == 1); +TEST_CONSTEXPR(_kortestz_mask8_u8(0x00, 0x80) == 0); +TEST_CONSTEXPR(_kortestz_mask8_u8(0x01, 0xFE) == 0); + unsigned char test_kortestc_mask8_u8(__m512i __A, __m512i __B, __m512i __C, __m512i __D) { // CHECK-LABEL: test_kortestc_mask8_u8 // CHECK: [[LHS:%.*]] = bitcast i8 %{{.*}} to <8 x i1> @@ -130,6 +134,10 @@ unsigned char test_kortestc_mask8_u8(__m512i __A, __m512i __B, __m512i __C, __m5 _mm512_cmpneq_epu64_mask(__C, __D)); } +TEST_CONSTEXPR(_kortestc_mask8_u8(0x00, 0x00) == 0); +TEST_CONSTEXPR(_kortestc_mask8_u8(0x00, 0x80) == 0); +TEST_CONSTEXPR(_kortestc_mask8_u8(0x01, 0xFE) == 1); + unsigned char test_kortest_mask8_u8(__m512i __A, __m512i __B, __m512i __C, __m512i __D, unsigned char *CF) { // CHECK-LABEL: test_kortest_mask8_u8 // CHECK: [[LHS:%.*]] = bitcast i8 %{{.*}} to <8 x i1> @@ -150,6 +158,30 @@ unsigned char test_kortest_mask8_u8(__m512i __A, __m512i __B, __m512i __C, __m51 _mm512_cmpneq_epu64_mask(__C, __D), CF); } +// Test constexpr handling. +#if defined(__cplusplus) && (__cplusplus >= 201103L) +constexpr unsigned char +test_kortest_mask8_u8(unsigned char A, unsigned char B) { + unsigned char all_ones{}; + return (_kortest_mask8_u8(A, B, &all_ones) << 4) | all_ones; +} + +void _kortest_mask8_u8() { + constexpr unsigned char A1 = 0x00; + constexpr unsigned char B1 = 0x00; + constexpr unsigned char expected_result_1 = 0x10; + static_assert(test_kortest_mask8_u8(A1, B1) == expected_result_1); + constexpr unsigned char A2 = 0x00; + constexpr unsigned char B2 = 0x80; + constexpr unsigned char expected_result_2 = 0x00; + static_assert(test_kortest_mask8_u8(A2, B2) == expected_result_2); + constexpr unsigned char A3 = 0x01; + constexpr unsigned char B3 = 0xFE; + constexpr unsigned char expected_result_3 = 0x01; + static_assert(test_kortest_mask8_u8(A3, B3) == expected_result_3); +} +#endif + unsigned char test_ktestz_mask8_u8(__m512i __A, __m512i __B, __m512i __C, __m512i __D) { // CHECK-LABEL: test_ktestz_mask8_u8 // CHECK: [[LHS:%.*]] = bitcast i8 %{{.*}} to <8 x i1> @@ -160,6 +192,11 @@ unsigned char test_ktestz_mask8_u8(__m512i __A, __m512i __B, __m512i __C, __m512 _mm512_cmpneq_epu64_mask(__C, __D)); } +TEST_CONSTEXPR(_ktestz_mask8_u8(0x00, 0x00) == 1); +TEST_CONSTEXPR(_ktestz_mask8_u8(0x00, 0x80) == 1); +TEST_CONSTEXPR(_ktestz_mask8_u8(0xF0, 0x80) == 0); +TEST_CONSTEXPR(_ktestz_mask8_u8(0x01, 0x01) == 0); + unsigned char test_ktestc_mask8_u8(__m512i __A, __m512i __B, __m512i __C, __m512i __D) { // CHECK-LABEL: test_ktestc_mask8_u8 // CHECK: [[LHS:%.*]] = bitcast i8 %{{.*}} to <8 x i1> @@ -170,6 +207,11 @@ unsigned char test_ktestc_mask8_u8(__m512i __A, __m512i __B, __m512i __C, __m512 _mm512_cmpneq_epu64_mask(__C, __D)); } +TEST_CONSTEXPR(_ktestc_mask8_u8(0x00, 0x00) == 1); +TEST_CONSTEXPR(_ktestc_mask8_u8(0x00, 0x80) == 0); +TEST_CONSTEXPR(_ktestc_mask8_u8(0xF0, 0x80) == 1); +TEST_CONSTEXPR(_ktestc_mask8_u8(0x01, 0x01) == 1); + unsigned char test_ktest_mask8_u8(__m512i __A, __m512i __B, __m512i __C, __m512i __D, unsigned char *CF) { // CHECK-LABEL: test_ktest_mask8_u8 // CHECK: [[LHS:%.*]] = bitcast i8 %{{.*}} to <8 x i1> @@ -184,6 +226,34 @@ unsigned char test_ktest_mask8_u8(__m512i __A, __m512i __B, __m512i __C, __m512i _mm512_cmpneq_epu64_mask(__C, __D), CF); } +// Test constexpr handling. +#if defined(__cplusplus) && (__cplusplus >= 201103L) +constexpr unsigned char +test_ktest_mask8_u8(unsigned char A, unsigned char B) { + unsigned char all_ones{}; + return (_ktest_mask8_u8(A, B, &all_ones) << 4) | all_ones; +} + +void _ktest_mask8_u8() { + constexpr unsigned char A1 = 0x00; + constexpr unsigned char B1 = 0x00; + constexpr unsigned char expected_result_1 = 0x11; + static_assert(test_ktest_mask8_u8(A1, B1) == expected_result_1); + constexpr unsigned char A2 = 0x00; + constexpr unsigned char B2 = 0x80; + constexpr unsigned char expected_result_2 = 0x10; + static_assert(test_ktest_mask8_u8(A2, B2) == expected_result_2); + constexpr unsigned char A3 = 0xF0; + constexpr unsigned char B3 = 0x80; + constexpr unsigned char expected_result_3 = 0x01; + static_assert(test_ktest_mask8_u8(A3, B3) == expected_result_3); + constexpr unsigned char A4 = 0x01; + constexpr unsigned char B4 = 0x01; + constexpr unsigned char expected_result_4 = 0x01; + static_assert(test_ktest_mask8_u8(A4, B4) == expected_result_4); +} +#endif + unsigned char test_ktestz_mask16_u8(__m512i __A, __m512i __B, __m512i __C, __m512i __D) { // CHECK-LABEL: test_ktestz_mask16_u8 // CHECK: [[LHS:%.*]] = bitcast i16 %{{.*}} to <16 x i1> @@ -194,6 +264,11 @@ unsigned char test_ktestz_mask16_u8(__m512i __A, __m512i __B, __m512i __C, __m51 _mm512_cmpneq_epu32_mask(__C, __D)); } +TEST_CONSTEXPR(_ktestz_mask16_u8(0x0000, 0x0000) == 1); +TEST_CONSTEXPR(_ktestz_mask16_u8(0x0000, 0x8000) == 1); +TEST_CONSTEXPR(_ktestz_mask16_u8(0xF000, 0x8000) == 0); +TEST_CONSTEXPR(_ktestz_mask16_u8(0x0123, 0x0123) == 0); + unsigned char test_ktestc_mask16_u8(__m512i __A, __m512i __B, __m512i __C, __m512i __D) { // CHECK-LABEL: test_ktestc_mask16_u8 // CHECK: [[LHS:%.*]] = bitcast i16 %{{.*}} to <16 x i1> @@ -204,6 +279,11 @@ unsigned char test_ktestc_mask16_u8(__m512i __A, __m512i __B, __m512i __C, __m51 _mm512_cmpneq_epu32_mask(__C, __D)); } +TEST_CONSTEXPR(_ktestc_mask16_u8(0x0000, 0x0000) == 1); +TEST_CONSTEXPR(_ktestc_mask16_u8(0x0000, 0x8000) == 0); +TEST_CONSTEXPR(_ktestc_mask16_u8(0xF000, 0x8000) == 1); +TEST_CONSTEXPR(_ktestc_mask16_u8(0x0123, 0x0123) == 1); + unsigned char test_ktest_mask16_u8(__m512i __A, __m512i __B, __m512i __C, __m512i __D, unsigned char *CF) { // CHECK-LABEL: test_ktest_mask16_u8 // CHECK: [[LHS:%.*]] = bitcast i16 %{{.*}} to <16 x i1> @@ -218,6 +298,34 @@ unsigned char test_ktest_mask16_u8(__m512i __A, __m512i __B, __m512i __C, __m512 _mm512_cmpneq_epu32_mask(__C, __D), CF); } +// Test constexpr handling. +#if defined(__cplusplus) && (__cplusplus >= 201103L) +constexpr unsigned char +test_ktest_mask16_u8(unsigned int A, unsigned int B) { + unsigned char all_ones{}; + return (_ktest_mask16_u8(A, B, &all_ones) << 4) | all_ones; +} + +void _ktest_mask16_u8() { + constexpr unsigned int A1 = 0x0000; + constexpr unsigned int B1 = 0x0000; + constexpr unsigned char expected_result_1 = 0x11; + static_assert(test_ktest_mask16_u8(A1, B1) == expected_result_1); + constexpr unsigned int A2 = 0x0000; + constexpr unsigned int B2 = 0x8000; + constexpr unsigned char expected_result_2 = 0x10; + static_assert(test_ktest_mask16_u8(A2, B2) == expected_result_2); + constexpr unsigned int A3 = 0xF000; + constexpr unsigned int B3 = 0x8000; + constexpr unsigned char expected_result_3 = 0x01; + static_assert(test_ktest_mask16_u8(A3, B3) == expected_result_3); + constexpr unsigned int A4 = 0x0123; + constexpr unsigned int B4 = 0x0123; + constexpr unsigned char expected_result_4 = 0x01; + static_assert(test_ktest_mask16_u8(A4, B4) == expected_result_4); +} +#endif + __mmask8 test_kadd_mask8(__m512i __A, __m512i __B, __m512i __C, __m512i __D, __m512i __E, __m512i __F) { // CHECK-LABEL: test_kadd_mask8 // CHECK: [[LHS:%.*]] = bitcast i8 %{{.*}} to <8 x i1> diff --git a/clang/test/CodeGen/X86/avx512f-builtins.c b/clang/test/CodeGen/X86/avx512f-builtins.c index 69599379b6b3d..be55d5b42dc02 100644 --- a/clang/test/CodeGen/X86/avx512f-builtins.c +++ b/clang/test/CodeGen/X86/avx512f-builtins.c @@ -8965,6 +8965,10 @@ int test_mm512_kortestc(__m512i __A, __m512i __B, __m512i __C, __m512i __D) { _mm512_cmpneq_epu32_mask(__C, __D)); } +TEST_CONSTEXPR(_mm512_kortestc(0x0000, 0x0000) == 0); +TEST_CONSTEXPR(_mm512_kortestc(0x0000, 0x8000) == 0); +TEST_CONSTEXPR(_mm512_kortestc(0x0123, 0xFEDC) == 1); + int test_mm512_kortestz(__m512i __A, __m512i __B, __m512i __C, __m512i __D) { // CHECK-LABEL: test_mm512_kortestz // CHECK: [[LHS:%.*]] = bitcast i16 %{{.*}} to <16 x i1> @@ -8977,6 +8981,10 @@ int test_mm512_kortestz(__m512i __A, __m512i __B, __m512i __C, __m512i __D) { _mm512_cmpneq_epu32_mask(__C, __D)); } +TEST_CONSTEXPR(_mm512_kortestz(0x0000, 0x0000) == 1); +TEST_CONSTEXPR(_mm512_kortestz(0x0000, 0x8000) == 0); +TEST_CONSTEXPR(_mm512_kortestz(0x0123, 0xFEDC) == 0); + unsigned char test_kortestz_mask16_u8(__m512i __A, __m512i __B, __m512i __C, __m512i __D) { // CHECK-LABEL: test_kortestz_mask16_u8 // CHECK: [[LHS:%.*]] = bitcast i16 %{{.*}} to <16 x i1> @@ -8990,6 +8998,10 @@ unsigned char test_kortestz_mask16_u8(__m512i __A, __m512i __B, __m512i __C, __m _mm512_cmpneq_epu32_mask(__C, __D)); } +TEST_CONSTEXPR(_kortestz_mask16_u8(0x0000, 0x0000) == 1); +TEST_CONSTEXPR(_kortestz_mask16_u8(0x0000, 0x8000) == 0); +TEST_CONSTEXPR(_kortestz_mask16_u8(0x0123, 0xFEDC) == 0); + unsigned char test_kortestc_mask16_u8(__m512i __A, __m512i __B, __m512i __C, __m512i __D) { // CHECK-LABEL: test_kortestc_mask16_u8 // CHECK: [[LHS:%.*]] = bitcast i16 %{{.*}} to <16 x i1> @@ -9003,6 +9015,10 @@ unsigned char test_kortestc_mask16_u8(__m512i __A, __m512i __B, __m512i __C, __m _mm512_cmpneq_epu32_mask(__C, __D)); } +TEST_CONSTEXPR(_kortestc_mask16_u8(0x0000, 0x0000) == 0); +TEST_CONSTEXPR(_kortestc_mask16_u8(0x0000, 0x8000) == 0); +TEST_CONSTEXPR(_kortestc_mask16_u8(0x0123, 0xFEDC) == 1); + unsigned char test_kortest_mask16_u8(__m512i __A, __m512i __B, __m512i __C, __m512i __D, unsigned char *CF) { // CHECK-LABEL: test_kortest_mask16_u8 // CHECK: [[LHS:%.*]] = bitcast i16 %{{.*}} to <16 x i1> @@ -9023,6 +9039,30 @@ unsigned char test_kortest_mask16_u8(__m512i __A, __m512i __B, __m512i __C, __m5 _mm512_cmpneq_epu32_mask(__C, __D), CF); } +// Test constexpr handling. +#if defined(__cplusplus) && (__cplusplus >= 201103L) +constexpr unsigned char +test_kortest_mask16_u8(unsigned short A, unsigned short B) { + unsigned char all_ones{}; + return (_kortest_mask16_u8(A, B, &all_ones) << 4) | all_ones; +} + +void _kortest_mask16_u8() { + constexpr unsigned short A1 = 0x0000; + constexpr unsigned short B1 = 0x0000; + constexpr unsigned char expected_result_1 = 0x10; + static_assert(test_kortest_mask16_u8(A1, B1) == expected_result_1); + constexpr unsigned short A2 = 0x0000; + constexpr unsigned short B2 = 0x8000; + constexpr unsigned char expected_result_2 = 0x00; + static_assert(test_kortest_mask16_u8(A2, B2) == expected_result_2); + constexpr unsigned short A3 = 0x0123; + constexpr unsigned short B3 = 0xFEDC; + constexpr unsigned char expected_result_3 = 0x01; + static_assert(test_kortest_mask16_u8(A3, B3) == expected_result_3); +} +#endif + __mmask16 test_mm512_kunpackb(__m512i __A, __m512i __B, __m512i __C, __m512i __D, __m512i __E, __m512i __F) { // CHECK-LABEL: test_mm512_kunpackb // CHECK: [[LHS:%.*]] = bitcast i16 %{{.*}} to <16 x i1>