@@ -19167,24 +19167,31 @@ static SDValue LowerFLDEXP(SDValue Op, const X86Subtarget &Subtarget,
1916719167 default:
1916819168 return SDValue();
1916919169 case MVT::f16:
19170- if (!Subtarget.hasFP16()) {
19171- X = DAG.getNode(ISD::FP_EXTEND, DL, MVT::f32, X);
19172- }
19173- break;
19170+ if (!Subtarget.hasFP16())
19171+ X = DAG.getFPExtendOrRound(X, DL, MVT::f32);
19172+ [[fallthrough]];
1917419173 case MVT::f32:
19175- case MVT::f64:
19176- break;
19174+ case MVT::f64: {
19175+ MVT VT = MVT::getVectorVT(X.getSimpleValueType(),
19176+ 128 / X.getSimpleValueType().getSizeInBits());
19177+ Exp = DAG.getNode(ISD::SINT_TO_FP, DL, X.getValueType(), Exp);
19178+ SDValue VX = DAG.getNode(ISD::SCALAR_TO_VECTOR, DL, VT, X);
19179+ SDValue VExp = DAG.getNode(ISD::SCALAR_TO_VECTOR, DL, VT, Exp);
19180+ SDValue Scalefs = DAG.getNode(X86ISD::SCALEFS, DL, VT, VX, VExp, VX);
19181+ SDValue Final = DAG.getExtractVectorElt(DL, X.getValueType(), Scalefs, 0);
19182+ if (X.getValueType() != XTy)
19183+ Final = DAG.getFPExtendOrRound(Final, DL, XTy);
19184+ return Final;
19185+ }
1917719186 case MVT::v4f32:
1917819187 case MVT::v2f64:
1917919188 case MVT::v8f32:
1918019189 case MVT::v4f64:
1918119190 case MVT::v16f32:
1918219191 case MVT::v8f64:
19183- if (XTy.getSizeInBits() == 512 || Subtarget.hasVLX()) {
19184- Exp = DAG.getNode(ISD::SINT_TO_FP, DL, XTy, Exp);
19192+ Exp = DAG.getNode(ISD::SINT_TO_FP, DL, XTy, Exp);
19193+ if (XTy.getSizeInBits() == 512 || Subtarget.hasVLX())
1918519194 return DAG.getNode(X86ISD::SCALEF, DL, XTy, X, Exp, X);
19186- }
19187- Exp = DAG.getNode(ISD::SINT_TO_FP, DL, X.getValueType(), Exp);
1918819195 break;
1918919196 case MVT::v8f16:
1919019197 case MVT::v16f16:
@@ -19196,8 +19203,8 @@ static SDValue LowerFLDEXP(SDValue Op, const X86Subtarget &Subtarget,
1919619203 break;
1919719204 }
1919819205 ExtVT = XTy.changeVectorElementType(MVT::f32);
19199- X = DAG.getNode(ISD::FP_EXTEND , DL, ExtVT, X );
19200- Exp = DAG.getNode(ISD::SIGN_EXTEND , DL, ExtVT.changeTypeToInteger(), Exp );
19206+ X = DAG.getFPExtendOrRound(X , DL, ExtVT);
19207+ Exp = DAG.getSExtOrTrunc(Exp , DL, ExtVT.changeTypeToInteger());
1920119208 break;
1920219209 case MVT::v32f16:
1920319210 if (Subtarget.hasFP16()) {
@@ -19207,35 +19214,20 @@ static SDValue LowerFLDEXP(SDValue Op, const X86Subtarget &Subtarget,
1920719214 return splitVectorOp(Op, DAG, DL);
1920819215 }
1920919216
19210- if (XTy.isVector()) {
19211- SDValue WideX = widenSubVector(X, true, Subtarget, DAG, DL, 512);
19212- SDValue WideExp = widenSubVector(Exp, true, Subtarget, DAG, DL, 512);
19213- if (XTy.getScalarType() == MVT::f16 && !Subtarget.hasFP16()) {
19214- WideExp =
19215- DAG.getNode(ISD::SINT_TO_FP, DL, WideX.getSimpleValueType(), WideExp);
19216- SDValue Scalef = DAG.getNode(X86ISD::SCALEF, DL, WideX.getValueType(),
19217- WideX, WideExp, WideX);
19218- SDValue Final =
19219- DAG.getExtractSubvector(DL, X.getSimpleValueType(), Scalef, 0);
19220- return DAG.getNode(ISD::FP_ROUND, DL, XTy, Final,
19221- DAG.getTargetConstant(0, DL, MVT::i32));
19222- }
19217+ SDValue WideX = widenSubVector(X, true, Subtarget, DAG, DL, 512);
19218+ SDValue WideExp = widenSubVector(Exp, true, Subtarget, DAG, DL, 512);
19219+ if (X.getValueType() != XTy) {
19220+ WideExp =
19221+ DAG.getNode(ISD::SINT_TO_FP, DL, WideX.getSimpleValueType(), WideExp);
1922319222 SDValue Scalef = DAG.getNode(X86ISD::SCALEF, DL, WideX.getValueType(),
1922419223 WideX, WideExp, WideX);
19225- return DAG.getExtractSubvector(DL, XTy, Scalef, 0);
19226- } else {
19227- MVT VT = MVT::getVectorVT(X.getSimpleValueType(),
19228- 128 / X.getSimpleValueType().getSizeInBits());
19229- Exp = DAG.getNode(ISD::SINT_TO_FP, DL, X.getValueType(), Exp);
19230- SDValue VX = DAG.getInsertVectorElt(DL, DAG.getUNDEF(VT), X, 0);
19231- SDValue VExp = DAG.getInsertVectorElt(DL, DAG.getUNDEF(VT), Exp, 0);
19232- SDValue Scalefs = DAG.getNode(X86ISD::SCALEFS, DL, VT, VX, VExp, VX);
19233- SDValue Final = DAG.getExtractVectorElt(DL, X.getValueType(), Scalefs, 0);
19234- if (X.getValueType() != XTy)
19235- Final = DAG.getNode(ISD::FP_ROUND, DL, XTy, Final,
19236- DAG.getTargetConstant(0, DL, MVT::i32));
19237- return Final;
19224+ SDValue Final =
19225+ DAG.getExtractSubvector(DL, X.getSimpleValueType(), Scalef, 0);
19226+ return DAG.getFPExtendOrRound(Final, DL, XTy);
1923819227 }
19228+ SDValue Scalef = DAG.getNode(X86ISD::SCALEF, DL, WideX.getValueType(), WideX,
19229+ WideExp, WideX);
19230+ return DAG.getExtractSubvector(DL, XTy, Scalef, 0);
1923919231}
1924019232
1924119233static SDValue LowerSCALAR_TO_VECTOR(SDValue Op, const X86Subtarget &Subtarget,
0 commit comments