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