================
@@ -4668,6 +4668,71 @@ 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>();
+ const Floating &FloatElem = SrcVecPtr.elem<Floating>(0);
+
+ unsigned BitWidth = S.getASTContext().getIntWidth(E->getType());
+ bool IsUnsigned = E->getType()->isUnsignedIntegerType();
+
+ llvm::APSInt IntResult(BitWidth, IsUnsigned);
+ 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 NumSrcElems = SrcVecPtr.getNumElems();
+ unsigned NumDstElems = Dst.getNumElems();
+
+ QualType ElemType = Dst.getFieldDesc()->getElemQualType();
+ unsigned BitWidth = S.getASTContext().getIntWidth(ElemType);
+ bool IsUnsigned = ElemType->isUnsignedIntegerType();
+
+ bool Failed = false;
+ PrimType ElemT = *S.getContext().classify(ElemType);
+ INT_TYPE_SWITCH_NO_BOOL(ElemT, {
+ llvm::SmallVector<T> ConvertedElts;
+ ConvertedElts.reserve(NumSrcElems);
+ for (unsigned I = 0; I != NumSrcElems; ++I) {
+ const Floating &FloatElem = SrcVecPtr.elem<Floating>(I);
+ llvm::APSInt IntResult(BitWidth, IsUnsigned);
+
+ bool IsExact = false;
+ FloatElem.getAPFloat().convertToInteger(
+ IntResult, llvm::APFloat::rmTowardZero, &IsExact);
+ if (!IsExact) {
+ Failed = true;
----------------
RKSimon wrote:
why not just return false?
https://github.com/llvm/llvm-project/pull/214611
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits