[clang] [clang][Interp] Implement __builtin_popcount() (PR #67929)
Timm Baeder via cfe-commits
cfe-commits at lists.llvm.org
Sun Oct 1 10:42:26 PDT 2023
https://github.com/tbaederr created https://github.com/llvm/llvm-project/pull/67929
None
>From ce44117306858aa1bff3766dc640201ffd99a89f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbaeder at redhat.com>
Date: Sun, 1 Oct 2023 19:41:15 +0200
Subject: [PATCH] [clang][Interp] Implement __builtin_popcount()
---
clang/lib/AST/Interp/InterpBuiltin.cpp | 20 ++++++++++++++++++++
clang/test/AST/Interp/builtin-functions.cpp | 9 +++++++++
2 files changed, 29 insertions(+)
diff --git a/clang/lib/AST/Interp/InterpBuiltin.cpp b/clang/lib/AST/Interp/InterpBuiltin.cpp
index d816145598049b0..bba0255219bc0d7 100644
--- a/clang/lib/AST/Interp/InterpBuiltin.cpp
+++ b/clang/lib/AST/Interp/InterpBuiltin.cpp
@@ -398,6 +398,16 @@ static bool interp__builtin_fabs(InterpState &S, CodePtr OpPC,
return true;
}
+static bool interp__builtin_popcount(InterpState &S, CodePtr OpPC,
+ const InterpFrame *Frame,
+ const Function *Func,
+ const CallExpr *Call) {
+ PrimType ArgT = *S.getContext().classify(Call->getArg(0)->getType());
+ APSInt Val = peekToAPSInt(S.Stk, ArgT);
+ pushInt(S, Val.popcount());
+ return true;
+}
+
bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const Function *F,
const CallExpr *Call) {
InterpFrame *Frame = S.Current;
@@ -513,6 +523,16 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const Function *F,
return Ret<PT_Float>(S, OpPC, Dummy);
break;
+ case Builtin::BI__builtin_popcount:
+ case Builtin::BI__builtin_popcountl:
+ case Builtin::BI__builtin_popcountll:
+ case Builtin::BI__popcnt16: // Microsoft variants of popcount
+ case Builtin::BI__popcnt:
+ case Builtin::BI__popcnt64:
+ if (interp__builtin_popcount(S, OpPC, Frame, F, Call))
+ return retInt(S, OpPC, Dummy);
+ break;
+
default:
return false;
}
diff --git a/clang/test/AST/Interp/builtin-functions.cpp b/clang/test/AST/Interp/builtin-functions.cpp
index cd4ad010af12220..755f2b755412ef6 100644
--- a/clang/test/AST/Interp/builtin-functions.cpp
+++ b/clang/test/AST/Interp/builtin-functions.cpp
@@ -260,3 +260,12 @@ namespace SourceLocation {
static_assert(c.a.n == __LINE__ - 1, "");
}
}
+
+namespace popcount {
+ static_assert(__builtin_popcount(~0u) == __CHAR_BIT__ * sizeof(unsigned int), "");
+ static_assert(__builtin_popcount(0) == 0, "");
+ static_assert(__builtin_popcountl(~0ul) == __CHAR_BIT__ * sizeof(unsigned long), "");
+ static_assert(__builtin_popcountl(0) == 0, "");
+ static_assert(__builtin_popcountll(~0ull) == __CHAR_BIT__ * sizeof(unsigned long long), "");
+ static_assert(__builtin_popcountll(0) == 0, "");
+}
More information about the cfe-commits
mailing list