[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