================
@@ -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>();
+ llvm::APSInt IntResult(32, /*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;
+
+ ConvertedElts.push_back(IntResult.getSExtValue());
+ }
+
+ for (unsigned I = 0; I < NumDstElts; ++I)
----------------
tbaederr wrote:
```suggestion
for (unsigned I = 0; I != NumDstElts; ++I)
```
https://github.com/llvm/llvm-project/pull/214611
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits