@@ -10299,8 +10299,12 @@ SDValue RISCVTargetLowering::lowerINSERT_SUBVECTOR(SDValue Op,
10299
10299
return Op;
10300
10300
}
10301
10301
10302
+ // Use a insert_subvector that will resolve to an insert subreg.
10303
+ assert(VLen);
10304
+ unsigned Vscale = *VLen / RISCV::RVVBitsPerBlock;
10302
10305
SDValue Insert =
10303
- DAG.getTargetInsertSubreg(SubRegIdx, DL, ContainerVecVT, Vec, SubVec);
10306
+ DAG.getNode(ISD::INSERT_SUBVECTOR, DL, ContainerVecVT, Vec, SubVec,
10307
+ DAG.getConstant(OrigIdx / Vscale, DL, XLenVT));
10304
10308
if (VecVT.isFixedLengthVector())
10305
10309
Insert = convertFromScalableVector(VecVT, Insert, DAG, Subtarget);
10306
10310
return Insert;
@@ -10316,8 +10320,10 @@ SDValue RISCVTargetLowering::lowerINSERT_SUBVECTOR(SDValue Op,
10316
10320
MVT InterSubVT = ContainerVecVT;
10317
10321
SDValue AlignedExtract = Vec;
10318
10322
unsigned AlignedIdx = OrigIdx - RemIdx.getKnownMinValue();
10319
- if (SubVecVT.isFixedLengthVector())
10323
+ if (SubVecVT.isFixedLengthVector()) {
10324
+ assert(VLen);
10320
10325
AlignedIdx /= *VLen / RISCV::RVVBitsPerBlock;
10326
+ }
10321
10327
if (ContainerVecVT.bitsGT(getLMUL1VT(ContainerVecVT))) {
10322
10328
InterSubVT = getLMUL1VT(ContainerVecVT);
10323
10329
// Extract a subvector equal to the nearest full vector register type. This
@@ -10494,10 +10500,14 @@ SDValue RISCVTargetLowering::lowerEXTRACT_SUBVECTOR(SDValue Op,
10494
10500
10495
10501
// If the Idx has been completely eliminated then this is a subvector extract
10496
10502
// which naturally aligns to a vector register. These can easily be handled
10497
- // using subregister manipulation.
10503
+ // using subregister manipulation. We use an extract_subvector that will
10504
+ // resolve to an extract subreg.
10498
10505
if (RemIdx.isZero()) {
10499
10506
if (SubVecVT.isFixedLengthVector()) {
10500
- Vec = DAG.getTargetExtractSubreg(SubRegIdx, DL, ContainerSubVecVT, Vec);
10507
+ assert(VLen);
10508
+ unsigned Vscale = *VLen / RISCV::RVVBitsPerBlock;
10509
+ Vec = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, ContainerSubVecVT, Vec,
10510
+ DAG.getConstant(OrigIdx / Vscale, DL, XLenVT));
10501
10511
return convertFromScalableVector(SubVecVT, Vec, DAG, Subtarget);
10502
10512
}
10503
10513
return Op;
@@ -10515,9 +10525,16 @@ SDValue RISCVTargetLowering::lowerEXTRACT_SUBVECTOR(SDValue Op,
10515
10525
if (VecVT.bitsGT(getLMUL1VT(VecVT))) {
10516
10526
// If VecVT has an LMUL > 1, then SubVecVT should have a smaller LMUL, and
10517
10527
// we should have successfully decomposed the extract into a subregister.
10528
+ // We use an extract_subvector that will resolve to a subreg extract.
10518
10529
assert(SubRegIdx != RISCV::NoSubRegister);
10530
+ unsigned Idx = OrigIdx - RemIdx.getKnownMinValue();
10531
+ if (SubVecVT.isFixedLengthVector()) {
10532
+ assert(VLen);
10533
+ Idx /= *VLen / RISCV::RVVBitsPerBlock;
10534
+ }
10519
10535
InterSubVT = getLMUL1VT(VecVT);
10520
- Vec = DAG.getTargetExtractSubreg(SubRegIdx, DL, InterSubVT, Vec);
10536
+ Vec = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, InterSubVT, Vec,
10537
+ DAG.getConstant(Idx, DL, XLenVT));
10521
10538
}
10522
10539
10523
10540
// Slide this vector register down by the desired number of elements in order
0 commit comments