[clang] [X86][Clang] VectorExprEvaluator::VisitCallExpr / InterpretBuiltin - allow SSE/AVX FP2INT conversion intrinsics to be used in constexpr (PR #214611)
Timm Baeder via cfe-commits
cfe-commits at lists.llvm.org
Fri Aug 14 03:05:19 PDT 2026
================
@@ -4668,6 +4668,57 @@ static bool interp__builtin_ia32_bmac(InterpState &S, CodePtr OpPC,
return true;
}
+static bool interp_builtin_ia32_cvt_scalar_to_int(InterpState &S, CodePtr OpPC,
+ const CallExpr *E) {
+ Pointer SrcVecPtr = S.Stk.pop<Pointer>();
+ Pointer Lane0Ptr = SrcVecPtr.atIndex(0);
+ const Floating &FloatElem = Lane0Ptr.deref<Floating>();
+ unsigned BitWidth = S.getASTContext().getIntWidth(E->getType());
+
+ llvm::APSInt IntResult(BitWidth, /*isUnsigned=*/false);
+ bool IsExact = false;
+ // We only allow exact conversions so rounding mode does not matter for cvt*
+ // and cvtt* builtins
+ FloatElem.getAPFloat().convertToInteger(
+ IntResult, llvm::APFloat::rmTowardZero, &IsExact);
+ if (!IsExact)
+ return false;
+
+ pushInteger(S, IntResult, E->getType());
+ return true;
+}
+
+static bool interp_builtin_ia32_cvt_vector_to_int(InterpState &S, CodePtr OpPC,
+ const CallExpr *E) {
+ Pointer SrcVecPtr = S.Stk.pop<Pointer>();
+ const Pointer &Dst = S.Stk.peek<Pointer>();
+
+ unsigned NumSrcElts = SrcVecPtr.getNumElems();
+ unsigned NumDstElts = Dst.getNumElems();
+ llvm::SmallVector<int32_t, 8> ConvertedElts;
+ for (unsigned I = 0; I < NumSrcElts; ++I) {
+ const Floating &FloatElem = SrcVecPtr.atIndex(I).deref<Floating>();
----------------
tbaederr wrote:
```suggestion
const Floating &FloatElem = SrcVecPtr.elem<Floating>(I);
```
https://github.com/llvm/llvm-project/pull/214611
More information about the cfe-commits
mailing list