@@ -5095,19 +5095,11 @@ SDValue AArch64TargetLowering::LowerVectorINT_TO_FP(SDValue Op,
50955095 uint64_t VTSize = VT.getFixedSizeInBits();
50965096 uint64_t InVTSize = InVT.getFixedSizeInBits();
50975097 if (VTSize < InVTSize) {
5098- MVT CastVT =
5099- MVT::getVectorVT(MVT::getFloatingPointVT(InVT.getScalarSizeInBits()),
5100- InVT.getVectorNumElements());
5101- if (IsStrict) {
5102- In = DAG.getNode(Opc, dl, {CastVT, MVT::Other},
5103- {Op.getOperand(0), In});
5104- return DAG.getNode(ISD::STRICT_FP_ROUND, dl, {VT, MVT::Other},
5105- {In.getValue(1), In.getValue(0),
5106- DAG.getIntPtrConstant(0, dl, /*isTarget=*/true)});
5107- }
5108- In = DAG.getNode(Opc, dl, CastVT, In);
5109- return DAG.getNode(ISD::FP_ROUND, dl, VT, In,
5110- DAG.getIntPtrConstant(0, dl, /*isTarget=*/true));
5098+ // Due to the absence of any vector instructions to directly convert
5099+ // larger fixed point to lower floating point, we end up using intermediate
5100+ // representation before finally getting VTSize-d floating point. This extra
5101+ // rounding can lead to subtly incorrect results.
5102+ return SDValue();
51115103 }
51125104
51135105 if (VTSize > InVTSize) {
0 commit comments