@@ -113,11 +113,9 @@ RISCVTargetLowering::RISCVTargetLowering(const TargetMachine &TM,
113113 }
114114
115115 MVT XLenVT = Subtarget.getXLenVT();
116- MVT XLenPairVT = Subtarget.getXLenPairVT();
117116
118117 // Set up the register classes.
119118 addRegisterClass(XLenVT, &RISCV::GPRRegClass);
120- addRegisterClass(XLenPairVT, &RISCV::GPRPairRegClass);
121119
122120 if (Subtarget.hasStdExtZfhmin())
123121 addRegisterClass(MVT::f16, &RISCV::FPR16RegClass);
@@ -297,11 +295,6 @@ RISCVTargetLowering::RISCVTargetLowering(const TargetMachine &TM,
297295 setCondCodeAction(ISD::SETLE, XLenVT, Expand);
298296 }
299297
300- if (Subtarget.is64Bit())
301- setOperationAction(ISD::BITCAST, MVT::i128, Custom);
302- else
303- setOperationAction(ISD::BITCAST, MVT::i64, Custom);
304-
305298 setOperationAction({ISD::STACKSAVE, ISD::STACKRESTORE}, MVT::Other, Expand);
306299
307300 setOperationAction(ISD::VASTART, MVT::Other, Custom);
@@ -2218,17 +2211,6 @@ bool RISCVTargetLowering::isExtractSubvectorCheap(EVT ResVT, EVT SrcVT,
22182211 return (ResElts * 2) == SrcElts && (Index == 0 || Index == ResElts);
22192212}
22202213
2221- EVT RISCVTargetLowering::getAsmOperandValueType(const DataLayout &DL, Type *Ty,
2222- bool AllowUnknown) const {
2223- if (!Subtarget.is64Bit() && Ty->isIntegerTy(64))
2224- return MVT::riscv_i32_pair;
2225-
2226- if (Subtarget.is64Bit() && Ty->isIntegerTy(128))
2227- return MVT::riscv_i64_pair;
2228-
2229- return TargetLowering::getAsmOperandValueType(DL, Ty, AllowUnknown);
2230- }
2231-
22322214MVT RISCVTargetLowering::getRegisterTypeForCallingConv(LLVMContext &Context,
22332215 CallingConv::ID CC,
22342216 EVT VT) const {
@@ -2248,7 +2230,7 @@ RISCVTargetLowering::getNumRegisters(LLVMContext &Context, EVT VT,
22482230 std::optional<MVT> RegisterVT) const {
22492231 // Pair inline assembly operand
22502232 if (VT == (Subtarget.is64Bit() ? MVT::i128 : MVT::i64) && RegisterVT &&
2251- *RegisterVT == Subtarget.getXLenPairVT() )
2233+ *RegisterVT == MVT::Untyped )
22522234 return 1;
22532235
22542236 return TargetLowering::getNumRegisters(Context, VT, RegisterVT);
@@ -2794,19 +2776,6 @@ RISCVTargetLowering::computeVLMAXBounds(MVT VecVT,
27942776 return std::make_pair(MinVLMAX, MaxVLMAX);
27952777}
27962778
2797- bool RISCVTargetLowering::isLoadBitCastBeneficial(
2798- EVT LoadVT, EVT BitcastVT, const SelectionDAG &DAG,
2799- const MachineMemOperand &MMO) const {
2800- // We want to leave `bitcasts` to/from MVT::riscv_i<xlen>_pair separate from
2801- // loads/stores so they can be turned into BuildGPRPair/::SplitGPRPair nodes.
2802- if (LoadVT == (Subtarget.is64Bit() ? MVT::i128 : MVT::i64) &&
2803- BitcastVT == Subtarget.getXLenPairVT())
2804- return false;
2805-
2806- return TargetLoweringBase::isLoadBitCastBeneficial(LoadVT, BitcastVT, DAG,
2807- MMO);
2808- }
2809-
28102779// The state of RVV BUILD_VECTOR and VECTOR_SHUFFLE lowering is that very few
28112780// of either is (currently) supported. This can get us into an infinite loop
28122781// where we try to lower a BUILD_VECTOR as a VECTOR_SHUFFLE as a BUILD_VECTOR
@@ -6470,13 +6439,6 @@ SDValue RISCVTargetLowering::LowerOperation(SDValue Op,
64706439 std::tie(Lo, Hi) = DAG.SplitScalar(Op0, DL, MVT::i32, MVT::i32);
64716440 return DAG.getNode(RISCVISD::BuildPairF64, DL, MVT::f64, Lo, Hi);
64726441 }
6473- if (VT == Subtarget.getXLenPairVT() && Op0VT.isScalarInteger() &&
6474- Op0VT.getSizeInBits() == 2 * Subtarget.getXLen()) {
6475- SDValue Lo, Hi;
6476- std::tie(Lo, Hi) = DAG.SplitScalar(Op0, DL, XLenVT, XLenVT);
6477- return DAG.getNode(RISCVISD::BuildGPRPair, DL, Subtarget.getXLenPairVT(),
6478- Lo, Hi);
6479- }
64806442
64816443 // Consider other scalar<->scalar casts as legal if the types are legal.
64826444 // Otherwise expand them.
@@ -12999,14 +12961,6 @@ void RISCVTargetLowering::ReplaceNodeResults(SDNode *N,
1299912961 SDValue RetReg = DAG.getNode(ISD::BUILD_PAIR, DL, MVT::i64,
1300012962 NewReg.getValue(0), NewReg.getValue(1));
1300112963 Results.push_back(RetReg);
13002- } else if (VT.isInteger() &&
13003- VT.getSizeInBits() == 2 * Subtarget.getXLen() &&
13004- Op0VT == Subtarget.getXLenPairVT()) {
13005- SDValue NewReg = DAG.getNode(RISCVISD::SplitGPRPair, DL,
13006- DAG.getVTList(XLenVT, XLenVT), Op0);
13007- SDValue RetReg = DAG.getNode(ISD::BUILD_PAIR, DL, VT, NewReg.getValue(0),
13008- NewReg.getValue(1));
13009- Results.push_back(RetReg);
1301012964 } else if (!VT.isVector() && Op0VT.isFixedLengthVector() &&
1301112965 isTypeLegal(Op0VT)) {
1301212966 // Custom-legalize bitcasts from fixed-length vector types to illegal
@@ -21418,6 +21372,17 @@ bool RISCVTargetLowering::splitValueIntoRegisterParts(
2141821372 unsigned NumParts, MVT PartVT, std::optional<CallingConv::ID> CC) const {
2141921373 bool IsABIRegCopy = CC.has_value();
2142021374 EVT ValueVT = Val.getValueType();
21375+
21376+ if (ValueVT == (Subtarget.is64Bit() ? MVT::i128 : MVT::i64) &&
21377+ NumParts == 1 && PartVT == MVT::Untyped) {
21378+ // Pairs in Inline Assembly
21379+ MVT XLenVT = Subtarget.getXLenVT();
21380+ SDValue Lo, Hi;
21381+ std::tie(Lo, Hi) = DAG.SplitScalar(Val, DL, XLenVT, XLenVT);
21382+ Parts[0] = DAG.getNode(RISCVISD::BuildGPRPair, DL, MVT::Untyped, Lo, Hi);
21383+ return true;
21384+ }
21385+
2142121386 if (IsABIRegCopy && (ValueVT == MVT::f16 || ValueVT == MVT::bf16) &&
2142221387 PartVT == MVT::f32) {
2142321388 // Cast the [b]f16 to i16, extend to i32, pad with ones to make a float
@@ -21489,6 +21454,17 @@ SDValue RISCVTargetLowering::joinRegisterPartsIntoValue(
2148921454 SelectionDAG &DAG, const SDLoc &DL, const SDValue *Parts, unsigned NumParts,
2149021455 MVT PartVT, EVT ValueVT, std::optional<CallingConv::ID> CC) const {
2149121456 bool IsABIRegCopy = CC.has_value();
21457+
21458+ if (ValueVT == (Subtarget.is64Bit() ? MVT::i128 : MVT::i64) &&
21459+ NumParts == 1 && PartVT == MVT::Untyped) {
21460+ // Pairs in Inline Assembly
21461+ MVT XLenVT = Subtarget.getXLenVT();
21462+ SDValue Res = DAG.getNode(RISCVISD::SplitGPRPair, DL,
21463+ DAG.getVTList(XLenVT, XLenVT), Parts[0]);
21464+ return DAG.getNode(ISD::BUILD_PAIR, DL, ValueVT, Res.getValue(0),
21465+ Res.getValue(1));
21466+ }
21467+
2149221468 if (IsABIRegCopy && (ValueVT == MVT::f16 || ValueVT == MVT::bf16) &&
2149321469 PartVT == MVT::f32) {
2149421470 SDValue Val = Parts[0];
0 commit comments