[llvm] [X86][SSE] Improve ISD::FP_TO_*INT_SAT vector lowering (PR #199416)

via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 1 07:28:22 PDT 2026


================
@@ -22828,8 +22822,89 @@ X86TargetLowering::LowerFP_TO_INT_SAT(SDValue Op, SelectionDAG &DAG) const {
     SDValue Res = DAG.getNode(IsSigned ? X86ISD::CVTTP2IBS : X86ISD::CVTTP2IUBS,
                               dl, VecI16VT, Src);
     return DAG.getNode(ISD::TRUNCATE, dl, DstVT, Res);
-  }
+  } else if (DstVT == MVT::v4i32 && Subtarget.hasSSE2()) {
+    unsigned SatWidth = SatVT.getScalarSizeInBits();
+    assert(SatWidth <= 32 &&
+           "Expected saturation width no wider than result element");
+
+    if (SatWidth == 32) {
+      if (IsSigned) {
+        SDValue Cvt = DAG.getNode(ISD::FP_TO_SINT, dl, DstVT, Src);
+        APFloat PosOvfBoundFlt(SrcVT.getScalarType().getFltSemantics());
+        PosOvfBoundFlt.convertFromAPInt(APInt::getSignedMinValue(32),
+                                        /*IsSigned=*/true,
+                                        APFloat::rmTowardZero);
+        PosOvfBoundFlt.changeSign();
+        SDValue PosOvfBound = DAG.getConstantFP(PosOvfBoundFlt, dl, SrcVT);
+        SDValue PosOvf = DAG.getSetCC(dl, DstVT, Src, PosOvfBound, ISD::SETOGE);
+        SDValue IntMax =
+            DAG.getConstant(APInt::getSignedMaxValue(32), dl, DstVT);
+        SDValue Fixed = DAG.getSelect(dl, DstVT, PosOvf, IntMax, Cvt);
+        SDValue IsNaN = DAG.getSetCC(dl, DstVT, Src, Src, ISD::SETUO);
+        SDValue Zero = DAG.getConstant(0, dl, DstVT);
+        return DAG.getSelect(dl, DstVT, IsNaN, Zero, Fixed);
+      } else {
+        SDValue ZeroFP = DAG.getConstantFP(0.0, dl, SrcVT);
+        SDValue Clamped = DAG.getNode(X86ISD::FMAX, dl, SrcVT, Src, ZeroFP);
+        APFloat OvfBoundFlt(SrcVT.getScalarType().getFltSemantics());
+        OvfBoundFlt.convertFromAPInt(APInt::getOneBitSet(33, 32),
+                                     /*IsSigned=*/false, APFloat::rmTowardZero);
+        SDValue OvfBound = DAG.getConstantFP(OvfBoundFlt, dl, SrcVT);
+        SDValue IsOvf = DAG.getSetCC(dl, DstVT, Clamped, OvfBound, ISD::SETOGE);
+        SDValue Cvt = DAG.getNode(ISD::FP_TO_UINT, dl, DstVT, Clamped);
----------------
Panadulek wrote:

My mistake im gonna fix it.

https://github.com/llvm/llvm-project/pull/199416


More information about the llvm-commits mailing list