@@ -133,7 +133,7 @@ RISCVTargetLowering::RISCVTargetLowering(const TargetMachine &TM,
133133 if (Subtarget.is64Bit())
134134 addRegisterClass(MVT::f64, &RISCV::GPRRegClass);
135135 else
136- addRegisterClass(MVT::f64, &RISCV::GPRF64PairRegClass );
136+ addRegisterClass(MVT::f64, &RISCV::GPRPairRegClass );
137137 }
138138
139139 static const MVT::SimpleValueType BoolVecVTs[] = {
@@ -20507,7 +20507,7 @@ RISCVTargetLowering::getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
2050720507 if (VT == MVT::f32 && Subtarget.hasStdExtZfinx())
2050820508 return std::make_pair(0U, &RISCV::GPRF32NoX0RegClass);
2050920509 if (VT == MVT::f64 && Subtarget.hasStdExtZdinx() && !Subtarget.is64Bit())
20510- return std::make_pair(0U, &RISCV::GPRF64PairNoX0RegClass );
20510+ return std::make_pair(0U, &RISCV::GPRPairNoX0RegClass );
2051120511 return std::make_pair(0U, &RISCV::GPRNoX0RegClass);
2051220512 case 'f':
2051320513 if (VT == MVT::f16) {
@@ -20524,14 +20524,14 @@ RISCVTargetLowering::getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
2052420524 if (Subtarget.hasStdExtD())
2052520525 return std::make_pair(0U, &RISCV::FPR64RegClass);
2052620526 if (Subtarget.hasStdExtZdinx() && !Subtarget.is64Bit())
20527- return std::make_pair(0U, &RISCV::GPRF64PairNoX0RegClass );
20527+ return std::make_pair(0U, &RISCV::GPRPairNoX0RegClass );
2052820528 if (Subtarget.hasStdExtZdinx() && Subtarget.is64Bit())
2052920529 return std::make_pair(0U, &RISCV::GPRNoX0RegClass);
2053020530 }
2053120531 break;
2053220532 case 'R':
2053320533 if (VT == MVT::f64 && !Subtarget.is64Bit() && Subtarget.hasStdExtZdinx())
20534- return std::make_pair(0U, &RISCV::GPRF64PairNoX0RegClass );
20534+ return std::make_pair(0U, &RISCV::GPRPairNoX0RegClass );
2053520535 return std::make_pair(0U, &RISCV::GPRPairNoX0RegClass);
2053620536 default:
2053720537 break;
@@ -20570,7 +20570,7 @@ RISCVTargetLowering::getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
2057020570 if (VT == MVT::f32 && Subtarget.hasStdExtZfinx())
2057120571 return std::make_pair(0U, &RISCV::GPRF32CRegClass);
2057220572 if (VT == MVT::f64 && Subtarget.hasStdExtZdinx() && !Subtarget.is64Bit())
20573- return std::make_pair(0U, &RISCV::GPRF64PairCRegClass );
20573+ return std::make_pair(0U, &RISCV::GPRPairCRegClass );
2057420574 if (!VT.isVector())
2057520575 return std::make_pair(0U, &RISCV::GPRCRegClass);
2057620576 } else if (Constraint == "cf") {
@@ -20588,7 +20588,7 @@ RISCVTargetLowering::getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
2058820588 if (Subtarget.hasStdExtD())
2058920589 return std::make_pair(0U, &RISCV::FPR64CRegClass);
2059020590 if (Subtarget.hasStdExtZdinx() && !Subtarget.is64Bit())
20591- return std::make_pair(0U, &RISCV::GPRF64PairCRegClass );
20591+ return std::make_pair(0U, &RISCV::GPRPairCRegClass );
2059220592 if (Subtarget.hasStdExtZdinx() && Subtarget.is64Bit())
2059320593 return std::make_pair(0U, &RISCV::GPRCRegClass);
2059420594 }
@@ -20752,7 +20752,7 @@ RISCVTargetLowering::getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
2075220752 // Subtarget into account.
2075320753 if (Res.second == &RISCV::GPRF16RegClass ||
2075420754 Res.second == &RISCV::GPRF32RegClass ||
20755- Res.second == &RISCV::GPRF64PairRegClass )
20755+ Res.second == &RISCV::GPRPairRegClass )
2075620756 return std::make_pair(Res.first, &RISCV::GPRRegClass);
2075720757
2075820758 return Res;
@@ -21379,12 +21379,19 @@ bool RISCVTargetLowering::splitValueIntoRegisterParts(
2137921379 bool IsABIRegCopy = CC.has_value();
2138021380 EVT ValueVT = Val.getValueType();
2138121381
21382- if (ValueVT == (Subtarget.is64Bit() ? MVT::i128 : MVT::i64) &&
21382+ MVT PairVT = Subtarget.is64Bit() ? MVT::i128 : MVT::i64;
21383+ if ((ValueVT == PairVT ||
21384+ (!Subtarget.is64Bit() && Subtarget.hasStdExtZdinx() &&
21385+ ValueVT == MVT::f64)) &&
2138321386 NumParts == 1 && PartVT == MVT::Untyped) {
21384- // Pairs in Inline Assembly
21387+ // Pairs in Inline Assembly, f64 in Inline assembly on rv32_zdinx
2138521388 MVT XLenVT = Subtarget.getXLenVT();
21389+ if (ValueVT == MVT::f64)
21390+ Val = DAG.getBitcast(MVT::i64, Val);
2138621391 auto [Lo, Hi] = DAG.SplitScalar(Val, DL, XLenVT, XLenVT);
21387- Parts[0] = DAG.getNode(RISCVISD::BuildGPRPair, DL, MVT::Untyped, Lo, Hi);
21392+ // Always creating an MVT::Untyped part, so always use
21393+ // RISCVISD::BuildGPRPair.
21394+ Parts[0] = DAG.getNode(RISCVISD::BuildGPRPair, DL, PartVT, Lo, Hi);
2138821395 return true;
2138921396 }
2139021397
@@ -21396,7 +21403,7 @@ bool RISCVTargetLowering::splitValueIntoRegisterParts(
2139621403 Val = DAG.getNode(ISD::ANY_EXTEND, DL, MVT::i32, Val);
2139721404 Val = DAG.getNode(ISD::OR, DL, MVT::i32, Val,
2139821405 DAG.getConstant(0xFFFF0000, DL, MVT::i32));
21399- Val = DAG.getNode(ISD::BITCAST, DL, MVT::f32 , Val);
21406+ Val = DAG.getNode(ISD::BITCAST, DL, PartVT , Val);
2140021407 Parts[0] = Val;
2140121408 return true;
2140221409 }
@@ -21465,14 +21472,24 @@ SDValue RISCVTargetLowering::joinRegisterPartsIntoValue(
2146521472 MVT PartVT, EVT ValueVT, std::optional<CallingConv::ID> CC) const {
2146621473 bool IsABIRegCopy = CC.has_value();
2146721474
21468- if (ValueVT == (Subtarget.is64Bit() ? MVT::i128 : MVT::i64) &&
21475+ MVT PairVT = Subtarget.is64Bit() ? MVT::i128 : MVT::i64;
21476+ if ((ValueVT == PairVT ||
21477+ (!Subtarget.is64Bit() && Subtarget.hasStdExtZdinx() &&
21478+ ValueVT == MVT::f64)) &&
2146921479 NumParts == 1 && PartVT == MVT::Untyped) {
21470- // Pairs in Inline Assembly
21480+ // Pairs in Inline Assembly, f64 in Inline assembly on rv32_zdinx
2147121481 MVT XLenVT = Subtarget.getXLenVT();
21472- SDValue Res = DAG.getNode(RISCVISD::SplitGPRPair, DL,
21473- DAG.getVTList(XLenVT, XLenVT), Parts[0]);
21474- return DAG.getNode(ISD::BUILD_PAIR, DL, ValueVT, Res.getValue(0),
21475- Res.getValue(1));
21482+
21483+ SDValue Val = Parts[0];
21484+ // Always starting with an MVT::Untyped part, so always use
21485+ // RISCVISD::SplitGPRPair
21486+ Val = DAG.getNode(RISCVISD::SplitGPRPair, DL, DAG.getVTList(XLenVT, XLenVT),
21487+ Val);
21488+ Val = DAG.getNode(ISD::BUILD_PAIR, DL, PairVT, Val.getValue(0),
21489+ Val.getValue(1));
21490+ if (ValueVT == MVT::f64)
21491+ Val = DAG.getBitcast(ValueVT, Val);
21492+ return Val;
2147621493 }
2147721494
2147821495 if (IsABIRegCopy && (ValueVT == MVT::f16 || ValueVT == MVT::bf16) &&
0 commit comments