[clang] 816eb9e - [Clang][bytecode] Add interp__builtin_elementwise_triop_fp to handle general 3-operand floating point intrinsics (#157106)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Sep 5 07:57:10 PDT 2025
Author: Simon Pilgrim
Date: 2025-09-05T14:57:07Z
New Revision: 816eb9e71d896e3dd591bda8283ac7094c988c13
URL: https://github.com/llvm/llvm-project/commit/816eb9e71d896e3dd591bda8283ac7094c988c13
DIFF: https://github.com/llvm/llvm-project/commit/816eb9e71d896e3dd591bda8283ac7094c988c13.diff
LOG: [Clang][bytecode] Add interp__builtin_elementwise_triop_fp to handle general 3-operand floating point intrinsics (#157106)
Refactor interp__builtin_elementwise_fma into something similar to interp__builtin_elementwise_triop with a callback function argument to allow reuse with other intrinsics.
This will allow reuse with some upcoming x86 intrinsics
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 4454d4b5b0897..4d3d6397e5ed9 100644
--- a/clang/lib/AST/ByteCode/InterpBuiltin.cpp
+++ b/clang/lib/AST/ByteCode/InterpBuiltin.cpp
@@ -2736,8 +2736,11 @@ static bool interp__builtin_ia32_pmul(InterpState &S, CodePtr OpPC,
return true;
}
-static bool interp__builtin_elementwise_fma(InterpState &S, CodePtr OpPC,
- const CallExpr *Call) {
+static bool interp__builtin_elementwise_triop_fp(
+ InterpState &S, CodePtr OpPC, const CallExpr *Call,
+ llvm::function_ref<APFloat(const APFloat &, const APFloat &,
+ const APFloat &, llvm::RoundingMode)>
+ Fn) {
assert(Call->getNumArgs() == 3);
FPOptions FPO = Call->getFPFeaturesInEffect(S.Ctx.getLangOpts());
@@ -2756,8 +2759,7 @@ static bool interp__builtin_elementwise_fma(InterpState &S, CodePtr OpPC,
const Floating &Z = S.Stk.pop<Floating>();
const Floating &Y = S.Stk.pop<Floating>();
const Floating &X = S.Stk.pop<Floating>();
- APFloat F = X.getAPFloat();
- F.fusedMultiplyAdd(Y.getAPFloat(), Z.getAPFloat(), RM);
+ APFloat F = Fn(X.getAPFloat(), Y.getAPFloat(), Z.getAPFloat(), RM);
Floating Result = S.allocFloat(X.getSemantics());
Result.copy(F);
S.Stk.push<Floating>(Result);
@@ -2788,8 +2790,8 @@ static bool interp__builtin_elementwise_fma(InterpState &S, CodePtr OpPC,
APFloat X = VX.elem<T>(I).getAPFloat();
APFloat Y = VY.elem<T>(I).getAPFloat();
APFloat Z = VZ.elem<T>(I).getAPFloat();
- (void)X.fusedMultiplyAdd(Y, Z, RM);
- Dst.elem<Floating>(I) = Floating(X);
+ APFloat F = Fn(X, Y, Z, RM);
+ Dst.elem<Floating>(I) = Floating(F);
}
Dst.initializeAllElements();
return true;
@@ -3410,7 +3412,14 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,
return interp__builtin_ia32_pmul(S, OpPC, Call, BuiltinID);
case Builtin::BI__builtin_elementwise_fma:
- return interp__builtin_elementwise_fma(S, OpPC, Call);
+ return interp__builtin_elementwise_triop_fp(
+ S, OpPC, Call,
+ [](const APFloat &X, const APFloat &Y, const APFloat &Z,
+ llvm::RoundingMode RM) {
+ APFloat F = X;
+ F.fusedMultiplyAdd(Y, Z, RM);
+ return F;
+ });
case clang::X86::BI__builtin_ia32_pblendvb128:
case clang::X86::BI__builtin_ia32_pblendvb256:
More information about the cfe-commits
mailing list