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

Simon Pilgrim via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 9 03:40:35 PDT 2026


================
@@ -22541,8 +22547,179 @@ SDValue X86TargetLowering::LRINT_LLRINTHelper(SDNode *N,
   return DAG.getLoad(DstVT, DL, Chain, StackPtr, MPI);
 }
 
-SDValue
-X86TargetLowering::LowerFP_TO_INT_SAT(SDValue Op, SelectionDAG &DAG) const {
+static SDValue lowerVectorFP_TO_INT_SAT(SDValue Op, SelectionDAG &DAG,
+                                        const X86Subtarget &Subtarget) {
+  const TargetLowering &TLI = DAG.getTargetLoweringInfo();
+  SDNode *Node = Op.getNode();
+  bool IsSigned = Node->getOpcode() == ISD::FP_TO_SINT_SAT;
+  SDLoc dl(SDValue(Node, 0));
+  SDValue Src = Node->getOperand(0);
+  EVT SrcVT = Src.getValueType();
+  EVT DstVT = Node->getValueType(0);
+  EVT SatVT = cast<VTSDNode>(Node->getOperand(1))->getVT();
+
+  if (DstVT == MVT::v2i32 || DstVT == MVT::v4i32 || DstVT == MVT::v8i32 ||
+      DstVT == MVT::v16i32) {
+    unsigned SatWidth = SatVT.getScalarSizeInBits();
+    assert(SatWidth <= 32 &&
+           "Expected saturation width no wider than result element");
+
+    if (SatWidth == 32 && (SrcVT.getScalarType() == MVT::f16 ||
+                           SrcVT.getScalarType() == MVT::bf16)) {
+      EVT F32VT = EVT::getVectorVT(*DAG.getContext(), MVT::f32,
+                                   SrcVT.getVectorNumElements());
----------------
RKSimon wrote:

```suggestion
  SrcVT = SrcVT.changeVectorElementType(MVT::f32);
  Src = DAG.getNode(ISD::FP_EXTEND, dl, SrcVT, Src);
```

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


More information about the llvm-commits mailing list