[clang] 7147e88 - [clang][bytecode] Implement lzcnt/tzcnt/bzhi builtins (#110639)
via cfe-commits
cfe-commits at lists.llvm.org
Tue Oct 1 03:04:36 PDT 2024
Author: Timm Baeder
Date: 2024-10-01T12:04:32+02:00
New Revision: 7147e88f5502c4430e386247e92937a94b3e7c5b
URL: https://github.com/llvm/llvm-project/commit/7147e88f5502c4430e386247e92937a94b3e7c5b
DIFF: https://github.com/llvm/llvm-project/commit/7147e88f5502c4430e386247e92937a94b3e7c5b.diff
LOG: [clang][bytecode] Implement lzcnt/tzcnt/bzhi builtins (#110639)
Added:
Modified:
clang/lib/AST/ByteCode/InterpBuiltin.cpp
Removed:
################################################################################
diff --git a/clang/lib/AST/ByteCode/InterpBuiltin.cpp b/clang/lib/AST/ByteCode/InterpBuiltin.cpp
index eb59cf3e9b1e3d..347b23d7b89c46 100644
--- a/clang/lib/AST/ByteCode/InterpBuiltin.cpp
+++ b/clang/lib/AST/ByteCode/InterpBuiltin.cpp
@@ -1180,6 +1180,45 @@ static bool interp__builtin_ia32_bextr(InterpState &S, CodePtr OpPC,
return true;
}
+static bool interp__builtin_ia32_bzhi(InterpState &S, CodePtr OpPC,
+ const InterpFrame *Frame,
+ const Function *Func,
+ const CallExpr *Call) {
+ PrimType ValT = *S.Ctx.classify(Call->getArg(0));
+ PrimType IndexT = *S.Ctx.classify(Call->getArg(1));
+
+ APSInt Val = peekToAPSInt(S.Stk, ValT,
+ align(primSize(ValT)) + align(primSize(IndexT)));
+ APSInt Idx = peekToAPSInt(S.Stk, IndexT);
+
+ unsigned BitWidth = Val.getBitWidth();
+ uint64_t Index = Idx.extractBitsAsZExtValue(8, 0);
+
+ if (Index < BitWidth)
+ Val.clearHighBits(BitWidth - Index);
+
+ pushInteger(S, Val, Call->getType());
+ return true;
+}
+
+static bool interp__builtin_ia32_lzcnt(InterpState &S, CodePtr OpPC,
+ const InterpFrame *Frame,
+ const Function *Func,
+ const CallExpr *Call) {
+ APSInt Val = peekToAPSInt(S.Stk, *S.Ctx.classify(Call->getArg(0)));
+ pushInteger(S, Val.countLeadingZeros(), Call->getType());
+ return true;
+}
+
+static bool interp__builtin_ia32_tzcnt(InterpState &S, CodePtr OpPC,
+ const InterpFrame *Frame,
+ const Function *Func,
+ const CallExpr *Call) {
+ APSInt Val = peekToAPSInt(S.Stk, *S.Ctx.classify(Call->getArg(0)));
+ pushInteger(S, Val.countTrailingZeros(), Call->getType());
+ return true;
+}
+
static bool interp__builtin_os_log_format_buffer_size(InterpState &S,
CodePtr OpPC,
const InterpFrame *Frame,
@@ -1773,6 +1812,26 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const Function *F,
return false;
break;
+ case clang::X86::BI__builtin_ia32_bzhi_si:
+ case clang::X86::BI__builtin_ia32_bzhi_di:
+ if (!interp__builtin_ia32_bzhi(S, OpPC, Frame, F, Call))
+ return false;
+ break;
+
+ case clang::X86::BI__builtin_ia32_lzcnt_u16:
+ case clang::X86::BI__builtin_ia32_lzcnt_u32:
+ case clang::X86::BI__builtin_ia32_lzcnt_u64:
+ if (!interp__builtin_ia32_lzcnt(S, OpPC, Frame, F, Call))
+ return false;
+ break;
+
+ case clang::X86::BI__builtin_ia32_tzcnt_u16:
+ case clang::X86::BI__builtin_ia32_tzcnt_u32:
+ case clang::X86::BI__builtin_ia32_tzcnt_u64:
+ if (!interp__builtin_ia32_tzcnt(S, OpPC, Frame, F, Call))
+ return false;
+ break;
+
case Builtin::BI__builtin_os_log_format_buffer_size:
if (!interp__builtin_os_log_format_buffer_size(S, OpPC, Frame, F, Call))
return false;
More information about the cfe-commits
mailing list