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

Reply via email to