@@ -113,11 +113,9 @@ RISCVTargetLowering::RISCVTargetLowering(const TargetMachine &TM,
113
113
}
114
114
115
115
MVT XLenVT = Subtarget.getXLenVT();
116
- MVT XLenPairVT = Subtarget.getXLenPairVT();
117
116
118
117
// Set up the register classes.
119
118
addRegisterClass(XLenVT, &RISCV::GPRRegClass);
120
- addRegisterClass(XLenPairVT, &RISCV::GPRPairRegClass);
121
119
122
120
if (Subtarget.hasStdExtZfhmin())
123
121
addRegisterClass(MVT::f16, &RISCV::FPR16RegClass);
@@ -297,11 +295,6 @@ RISCVTargetLowering::RISCVTargetLowering(const TargetMachine &TM,
297
295
setCondCodeAction(ISD::SETLE, XLenVT, Expand);
298
296
}
299
297
300
- if (Subtarget.is64Bit())
301
- setOperationAction(ISD::BITCAST, MVT::i128, Custom);
302
- else
303
- setOperationAction(ISD::BITCAST, MVT::i64, Custom);
304
-
305
298
setOperationAction({ISD::STACKSAVE, ISD::STACKRESTORE}, MVT::Other, Expand);
306
299
307
300
setOperationAction(ISD::VASTART, MVT::Other, Custom);
@@ -2218,17 +2211,6 @@ bool RISCVTargetLowering::isExtractSubvectorCheap(EVT ResVT, EVT SrcVT,
2218
2211
return (ResElts * 2) == SrcElts && (Index == 0 || Index == ResElts);
2219
2212
}
2220
2213
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
-
2232
2214
MVT RISCVTargetLowering::getRegisterTypeForCallingConv(LLVMContext &Context,
2233
2215
CallingConv::ID CC,
2234
2216
EVT VT) const {
@@ -2248,7 +2230,7 @@ RISCVTargetLowering::getNumRegisters(LLVMContext &Context, EVT VT,
2248
2230
std::optional<MVT> RegisterVT) const {
2249
2231
// Pair inline assembly operand
2250
2232
if (VT == (Subtarget.is64Bit() ? MVT::i128 : MVT::i64) && RegisterVT &&
2251
- *RegisterVT == Subtarget.getXLenPairVT() )
2233
+ *RegisterVT == MVT::Untyped )
2252
2234
return 1;
2253
2235
2254
2236
return TargetLowering::getNumRegisters(Context, VT, RegisterVT);
@@ -2794,19 +2776,6 @@ RISCVTargetLowering::computeVLMAXBounds(MVT VecVT,
2794
2776
return std::make_pair(MinVLMAX, MaxVLMAX);
2795
2777
}
2796
2778
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
-
2810
2779
// The state of RVV BUILD_VECTOR and VECTOR_SHUFFLE lowering is that very few
2811
2780
// of either is (currently) supported. This can get us into an infinite loop
2812
2781
// 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,
6470
6439
std::tie(Lo, Hi) = DAG.SplitScalar(Op0, DL, MVT::i32, MVT::i32);
6471
6440
return DAG.getNode(RISCVISD::BuildPairF64, DL, MVT::f64, Lo, Hi);
6472
6441
}
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
- }
6480
6442
6481
6443
// Consider other scalar<->scalar casts as legal if the types are legal.
6482
6444
// Otherwise expand them.
@@ -12999,14 +12961,6 @@ void RISCVTargetLowering::ReplaceNodeResults(SDNode *N,
12999
12961
SDValue RetReg = DAG.getNode(ISD::BUILD_PAIR, DL, MVT::i64,
13000
12962
NewReg.getValue(0), NewReg.getValue(1));
13001
12963
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);
13010
12964
} else if (!VT.isVector() && Op0VT.isFixedLengthVector() &&
13011
12965
isTypeLegal(Op0VT)) {
13012
12966
// Custom-legalize bitcasts from fixed-length vector types to illegal
@@ -21418,6 +21372,17 @@ bool RISCVTargetLowering::splitValueIntoRegisterParts(
21418
21372
unsigned NumParts, MVT PartVT, std::optional<CallingConv::ID> CC) const {
21419
21373
bool IsABIRegCopy = CC.has_value();
21420
21374
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
+
21421
21386
if (IsABIRegCopy && (ValueVT == MVT::f16 || ValueVT == MVT::bf16) &&
21422
21387
PartVT == MVT::f32) {
21423
21388
// Cast the [b]f16 to i16, extend to i32, pad with ones to make a float
@@ -21489,6 +21454,17 @@ SDValue RISCVTargetLowering::joinRegisterPartsIntoValue(
21489
21454
SelectionDAG &DAG, const SDLoc &DL, const SDValue *Parts, unsigned NumParts,
21490
21455
MVT PartVT, EVT ValueVT, std::optional<CallingConv::ID> CC) const {
21491
21456
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
+
21492
21468
if (IsABIRegCopy && (ValueVT == MVT::f16 || ValueVT == MVT::bf16) &&
21493
21469
PartVT == MVT::f32) {
21494
21470
SDValue Val = Parts[0];
0 commit comments