Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions clang/include/clang/Basic/BuiltinsX86.td
Original file line number Diff line number Diff line change
Expand Up @@ -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)">;
Expand Down
36 changes: 36 additions & 0 deletions clang/lib/AST/ByteCode/InterpBuiltin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
48 changes: 48 additions & 0 deletions clang/lib/AST/ExprConstant.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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: {
Expand Down
36 changes: 16 additions & 20 deletions clang/lib/Headers/avx512bwintrin.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
36 changes: 15 additions & 21 deletions clang/lib/Headers/avx512dqintrin.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
22 changes: 9 additions & 13 deletions clang/lib/Headers/avx512fintrin.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
Loading