@@ -2348,8 +2348,7 @@ bool RISCVTargetLowering::isExtractSubvectorCheap(EVT ResVT, EVT SrcVT,
2348
2348
return false;
2349
2349
2350
2350
// Only support extracting a fixed from a fixed vector for now.
2351
- if (ResVT.isScalableVector() || SrcVT.isScalableVector() ||
2352
- SrcVT.isRISCVVectorTuple())
2351
+ if (ResVT.isScalableVector() || SrcVT.isScalableVector())
2353
2352
return false;
2354
2353
2355
2354
EVT EltVT = ResVT.getVectorElementType();
@@ -2589,11 +2588,8 @@ unsigned RISCVTargetLowering::getSubregIndexByMVT(MVT VT, unsigned Index) {
2589
2588
}
2590
2589
2591
2590
unsigned RISCVTargetLowering::getRegClassIDForVecVT(MVT VT) {
2592
- if (VT.getVectorElementType() == MVT::i1)
2593
- return RISCV::VRRegClassID;
2594
-
2595
2591
if (VT.isRISCVVectorTuple()) {
2596
- unsigned NF = VT.getVectorNumElements ();
2592
+ unsigned NF = VT.getRISCVVectorTupleNumFields ();
2597
2593
unsigned RegsPerField = std::max(1U, (unsigned)VT.getSizeInBits() /
2598
2594
(NF * RISCV::RVVBitsPerBlock));
2599
2595
switch (RegsPerField) {
@@ -2630,6 +2626,8 @@ unsigned RISCVTargetLowering::getRegClassIDForVecVT(MVT VT) {
2630
2626
llvm_unreachable("Invalid vector tuple type RegClass.");
2631
2627
}
2632
2628
2629
+ if (VT.getVectorElementType() == MVT::i1)
2630
+ return RISCV::VRRegClassID;
2633
2631
return getRegClassIDForLMUL(getLMUL(VT));
2634
2632
}
2635
2633
@@ -2646,7 +2644,6 @@ RISCVTargetLowering::decomposeSubvectorInsertExtractToSubRegs(
2646
2644
RISCV::VRM4RegClassID > RISCV::VRM2RegClassID &&
2647
2645
RISCV::VRM2RegClassID > RISCV::VRRegClassID),
2648
2646
"Register classes not ordered");
2649
-
2650
2647
unsigned VecRegClassID = getRegClassIDForVecVT(VecVT);
2651
2648
unsigned SubRegClassID = getRegClassIDForVecVT(SubVecVT);
2652
2649
@@ -7043,7 +7040,7 @@ SDValue RISCVTargetLowering::LowerOperation(SDValue Op,
7043
7040
MachineFrameInfo &MFI = MF.getFrameInfo();
7044
7041
SDLoc DL(Op);
7045
7042
MVT XLenVT = Subtarget.getXLenVT();
7046
- unsigned NF = VecTy.getVectorMinNumElements ();
7043
+ unsigned NF = VecTy.getRISCVVectorTupleNumFields ();
7047
7044
unsigned Sz = VecTy.getSizeInBits();
7048
7045
unsigned NumElts = Sz / (NF * 8);
7049
7046
int Log2LMUL = Log2_64(NumElts) - 3;
@@ -7064,7 +7061,7 @@ SDValue RISCVTargetLowering::LowerOperation(SDValue Op,
7064
7061
SDValue LoadVal = DAG.getLoad(
7065
7062
MVT::getScalableVectorVT(MVT::i8, NumElts), DL, DAG.getEntryNode(),
7066
7063
BasePtr, Load->getPointerInfo(), Align(8));
7067
- Ret = DAG.getNode(ISD ::INSERT_SUBVECTOR, DL, VecTy, Ret, LoadVal,
7064
+ Ret = DAG.getNode(RISCVISD ::INSERT_SUBVECTOR, DL, VecTy, Ret, LoadVal,
7068
7065
DAG.getVectorIdxConstant(i, DL));
7069
7066
BasePtr = DAG.getNode(ISD::ADD, DL, XLenVT, BasePtr, VROffset, Flag);
7070
7067
}
@@ -7087,7 +7084,7 @@ SDValue RISCVTargetLowering::LowerOperation(SDValue Op,
7087
7084
MachineFrameInfo &MFI = MF.getFrameInfo();
7088
7085
SDLoc DL(Op);
7089
7086
MVT XLenVT = Subtarget.getXLenVT();
7090
- unsigned NF = VecTy.getVectorMinNumElements ();
7087
+ unsigned NF = VecTy.getRISCVVectorTupleNumFields ();
7091
7088
unsigned Sz = VecTy.getSizeInBits();
7092
7089
unsigned NumElts = Sz / (NF * 8);
7093
7090
int Log2LMUL = Log2_64(NumElts) - 3;
@@ -7106,7 +7103,7 @@ SDValue RISCVTargetLowering::LowerOperation(SDValue Op,
7106
7103
7107
7104
// Extract subregisters in a vector tuple and store them individually.
7108
7105
for (unsigned i = 0; i < NF; ++i) {
7109
- auto Extract = DAG.getNode(ISD ::EXTRACT_SUBVECTOR, DL,
7106
+ auto Extract = DAG.getNode(RISCVISD ::EXTRACT_SUBVECTOR, DL,
7110
7107
MVT::getScalableVectorVT(MVT::i8, NumElts),
7111
7108
StoredVal, DAG.getVectorIdxConstant(i, DL));
7112
7109
Ret = DAG.getStore(Chain, DL, Extract, BasePtr, Store->getPointerInfo(),
@@ -9297,14 +9294,14 @@ SDValue RISCVTargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op,
9297
9294
SDValue SubVec = Op.getOperand(2);
9298
9295
SDValue Index = Op.getOperand(3);
9299
9296
9300
- return DAG.getNode(ISD ::INSERT_SUBVECTOR, DL, Op.getValueType(), Vec,
9297
+ return DAG.getNode(RISCVISD ::INSERT_SUBVECTOR, DL, Op.getValueType(), Vec,
9301
9298
SubVec, Index);
9302
9299
}
9303
9300
case Intrinsic::riscv_vector_extract: {
9304
9301
SDValue Vec = Op.getOperand(1);
9305
9302
SDValue Index = Op.getOperand(2);
9306
9303
9307
- return DAG.getNode(ISD ::EXTRACT_SUBVECTOR, DL, Op.getValueType(), Vec,
9304
+ return DAG.getNode(RISCVISD ::EXTRACT_SUBVECTOR, DL, Op.getValueType(), Vec,
9308
9305
Index);
9309
9306
}
9310
9307
case Intrinsic::thread_pointer: {
@@ -9744,7 +9741,7 @@ SDValue RISCVTargetLowering::LowerINTRINSIC_W_CHAIN(SDValue Op,
9744
9741
SmallVector<SDValue, 9> Results;
9745
9742
for (unsigned int RetIdx = 0; RetIdx < NF; RetIdx++) {
9746
9743
SDValue SubVec =
9747
- DAG.getNode(ISD ::EXTRACT_SUBVECTOR, DL, ContainerVT,
9744
+ DAG.getNode(RISCVISD ::EXTRACT_SUBVECTOR, DL, ContainerVT,
9748
9745
Result.getValue(0), DAG.getVectorIdxConstant(RetIdx, DL));
9749
9746
Results.push_back(convertFromScalableVector(VT, SubVec, DAG, Subtarget));
9750
9747
}
@@ -9864,7 +9861,7 @@ SDValue RISCVTargetLowering::LowerINTRINSIC_VOID(SDValue Op,
9864
9861
SDValue StoredVal = DAG.getUNDEF(VecTupTy);
9865
9862
for (unsigned i = 0; i < NF; i++)
9866
9863
StoredVal = DAG.getNode(
9867
- ISD ::INSERT_SUBVECTOR, DL, VecTupTy, StoredVal,
9864
+ RISCVISD ::INSERT_SUBVECTOR, DL, VecTupTy, StoredVal,
9868
9865
convertToScalableVector(
9869
9866
ContainerVT, FixedIntrinsic->getOperand(2 + i), DAG, Subtarget),
9870
9867
DAG.getVectorIdxConstant(i, DL));
@@ -19504,7 +19501,7 @@ bool RISCV::CC_RISCV(const DataLayout &DL, RISCVABI::ABI ABI, unsigned ValNo,
19504
19501
Reg = State.AllocateReg(ArgFPR32s);
19505
19502
else if (ValVT == MVT::f64 && !UseGPRForF64)
19506
19503
Reg = State.AllocateReg(ArgFPR64s);
19507
- else if (ValVT.isVector()) {
19504
+ else if (ValVT.isVector() || ValVT.isRISCVVectorTuple() ) {
19508
19505
Reg = allocateRVVReg(ValVT, ValNo, FirstMaskArgument, State, TLI);
19509
19506
if (!Reg) {
19510
19507
// For return values, the vector must be passed fully via registers or
@@ -19555,7 +19552,8 @@ bool RISCV::CC_RISCV(const DataLayout &DL, RISCVABI::ABI ABI, unsigned ValNo,
19555
19552
}
19556
19553
19557
19554
assert((!UseGPRForF16_F32 || !UseGPRForF64 || LocVT == XLenVT ||
19558
- (TLI.getSubtarget().hasVInstructions() && ValVT.isVector())) &&
19555
+ (TLI.getSubtarget().hasVInstructions() &&
19556
+ (ValVT.isVector() || ValVT.isRISCVVectorTuple()))) &&
19559
19557
"Expected an XLenVT or vector types at this stage");
19560
19558
19561
19559
if (Reg) {
@@ -20933,6 +20931,8 @@ const char *RISCVTargetLowering::getTargetNodeName(unsigned Opcode) const {
20933
20931
NODE_NAME_CASE(CZERO_EQZ)
20934
20932
NODE_NAME_CASE(CZERO_NEZ)
20935
20933
NODE_NAME_CASE(SW_GUARDED_BRIND)
20934
+ NODE_NAME_CASE(INSERT_SUBVECTOR)
20935
+ NODE_NAME_CASE(EXTRACT_SUBVECTOR)
20936
20936
NODE_NAME_CASE(SF_VC_XV_SE)
20937
20937
NODE_NAME_CASE(SF_VC_IV_SE)
20938
20938
NODE_NAME_CASE(SF_VC_VV_SE)
@@ -21867,17 +21867,17 @@ bool RISCVTargetLowering::splitValueIntoRegisterParts(
21867
21867
}
21868
21868
21869
21869
if (ValueVT.isRISCVVectorTuple() && PartVT.isRISCVVectorTuple()) {
21870
- unsigned ValNF = ValueVT.getVectorNumElements ();
21871
- unsigned ValLMUL = std::max(1U, (unsigned)ValueVT.getSizeInBits() /
21872
- ( ValNF * RISCV::RVVBitsPerBlock) );
21873
- unsigned PartNF = PartVT.getVectorNumElements ();
21874
- unsigned PartLMUL = std::max(1U, (unsigned)PartVT.getSizeInBits() /
21875
- ( PartNF * RISCV::RVVBitsPerBlock) );
21870
+ unsigned ValNF = ValueVT.getRISCVVectorTupleNumFields ();
21871
+ unsigned ValLMUL =
21872
+ divideCeil(ValueVT.getSizeInBits(), ValNF * RISCV::RVVBitsPerBlock);
21873
+ unsigned PartNF = PartVT.getRISCVVectorTupleNumFields ();
21874
+ unsigned PartLMUL =
21875
+ divideCeil(PartVT.getSizeInBits(), PartNF * RISCV::RVVBitsPerBlock);
21876
21876
assert(ValNF == PartNF && ValLMUL == PartLMUL &&
21877
- "RISCV vector tuple type only accepts same register class type "
21877
+ "RISC-V vector tuple type only accepts same register class type "
21878
21878
"INSERT_SUBVECTOR");
21879
21879
21880
- Val = DAG.getNode(ISD ::INSERT_SUBVECTOR, DL, PartVT, DAG.getUNDEF(PartVT),
21880
+ Val = DAG.getNode(RISCVISD ::INSERT_SUBVECTOR, DL, PartVT, DAG.getUNDEF(PartVT),
21881
21881
Val, DAG.getVectorIdxConstant(0, DL));
21882
21882
Parts[0] = Val;
21883
21883
return true;
0 commit comments