@@ -21851,6 +21851,15 @@ X86TargetLowering::LowerFP_TO_INT_SAT(SDValue Op, SelectionDAG &DAG) const {
21851
21851
assert(SatWidth <= DstWidth && SatWidth <= TmpWidth &&
21852
21852
"Expected saturation width smaller than result width");
21853
21853
21854
+ // AVX512 provides VCVTPS/D2UD/QQ which return INT_MAX/LONG_MAX when overflow
21855
+ // happens. X86ISD::FMAX makes sure negative value and NaN return 0.
21856
+ if (Subtarget.hasAVX512() && !IsSigned && SatWidth == DstWidth &&
21857
+ (DstVT == MVT::i32 || (Subtarget.is64Bit() && DstVT == MVT::i64))) {
21858
+ SDValue MinFloatNode = DAG.getConstantFP(0.0, dl, SrcVT);
21859
+ SDValue Clamped = DAG.getNode(X86ISD::FMAX, dl, SrcVT, Src, MinFloatNode);
21860
+ return DAG.getNode(ISD::FP_TO_UINT, dl, DstVT, Clamped);
21861
+ }
21862
+
21854
21863
// Promote result of FP_TO_*INT to at least 32 bits.
21855
21864
if (TmpWidth < 32) {
21856
21865
TmpVT = MVT::i32;
@@ -21912,14 +21921,19 @@ X86TargetLowering::LowerFP_TO_INT_SAT(SDValue Op, SelectionDAG &DAG) const {
21912
21921
return DAG.getNode(ISD::TRUNCATE, dl, DstVT, FpToInt);
21913
21922
}
21914
21923
21915
- // Clamp by MinFloat from below. If Src is NaN, the result is MinFloat.
21916
- SDValue MinClamped = DAG.getNode(
21917
- X86ISD::FMAX, dl, SrcVT, Src, MinFloatNode);
21918
- // Clamp by MaxFloat from above. NaN cannot occur.
21919
- SDValue BothClamped = DAG.getNode(
21920
- X86ISD::FMINC, dl, SrcVT, MinClamped, MaxFloatNode);
21924
+ SDValue MinClamped = Src;
21925
+ // If Src is NaN, the result is MaxFloat.
21926
+ unsigned MinOpc = X86ISD::FMIN; // If Src is NaN, the result is MaxFloat.
21927
+ if (!IsSigned || SatWidth != DstWidth) {
21928
+ // Clamp by MinFloat from below. If Src is NaN, the result is MinFloat.
21929
+ MinClamped = DAG.getNode(X86ISD::FMAX, dl, SrcVT, Src, MinFloatNode);
21930
+ // NaN cannot occur.
21931
+ MinOpc = X86ISD::FMINC;
21932
+ }
21933
+ // Clamp by MaxFloat from above.
21934
+ SDValue Clamped = DAG.getNode(MinOpc, dl, SrcVT, MinClamped, MaxFloatNode);
21921
21935
// Convert clamped value to integer.
21922
- SDValue FpToInt = DAG.getNode(FpToIntOpcode, dl, DstVT, BothClamped );
21936
+ SDValue FpToInt = DAG.getNode(FpToIntOpcode, dl, DstVT, Clamped );
21923
21937
21924
21938
if (!IsSigned) {
21925
21939
// In the unsigned case we're done, because we mapped NaN to MinFloat,
0 commit comments