[clang] [Clang] `constexpr` builtin floating point classification / comparison functions (PR #94118)
Mital Ashok via cfe-commits
cfe-commits at lists.llvm.org
Tue Jun 4 11:16:14 PDT 2024
================
@@ -430,6 +430,78 @@ static bool interp__builtin_iszero(InterpState &S, CodePtr OpPC,
return true;
}
+static bool interp__builtin_signbit(InterpState &S, CodePtr OpPC,
+ const InterpFrame *Frame, const Function *F,
+ const CallExpr *Call) {
+ const Floating &Arg = S.Stk.peek<Floating>();
+
+ pushInteger(S, Arg.isNegative(), Call->getType());
+ return true;
+}
+
+static bool interp_floating_comparison(InterpState &S, CodePtr OpPC,
+ const InterpFrame *Frame,
+ const Function *F,
+ const CallExpr *Call) {
+ const Floating &RHS = S.Stk.peek<Floating>();
+ const Floating &LHS = S.Stk.peek<Floating>(align(2u * primSize(PT_Float)));
+ unsigned ID = F->getBuiltinID();
+ assert(ID == Builtin::BI__builtin_isgreater ||
+ ID == Builtin::BI__builtin_isgreaterequal ||
+ ID == Builtin::BI__builtin_isless ||
+ ID == Builtin::BI__builtin_islessequal ||
+ ID == Builtin::BI__builtin_islessgreater ||
+ ID == Builtin::BI__builtin_isunordered);
+
+ ComparisonCategoryResult Cmp = LHS.compare(RHS);
+ bool FunctionResult;
+ if (ID == Builtin::BI__builtin_isunordered ||
----------------
MitalAshok wrote:
It turned out much nicer when I switched on the builtin ID first, so there's not much left to share. This could be extracted to a `bool ComparisonFunction(unsigned BuiltinID, const APFloat &LHS, const APFloat &RHS)`, but I don't know where I could put that so that ExprConstant.cpp and InterpBuiltin.cpp could both access it
https://github.com/llvm/llvm-project/pull/94118
More information about the cfe-commits
mailing list