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; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits