@@ -9776,27 +9776,32 @@ SDValue RISCVTargetLowering::lowerEXTRACT_SUBVECTOR(SDValue Op,
9776
9776
if (SubVecVT.isFixedLengthVector())
9777
9777
ContainerSubVecVT = getContainerForFixedLengthVector(SubVecVT);
9778
9778
9779
- unsigned SubRegIdx, RemIdx;
9780
- // extract_subvector scales the index by vscale is the subvector is scalable,
9779
+ unsigned SubRegIdx;
9780
+ ElementCount RemIdx;
9781
+ // extract_subvector scales the index by vscale if the subvector is scalable,
9781
9782
// and decomposeSubvectorInsertExtractToSubRegs takes this into account. So if
9782
9783
// we have a fixed length subvector, we need to adjust the index by 1/vscale.
9783
9784
if (SubVecVT.isFixedLengthVector()) {
9784
9785
assert(MinVLen == MaxVLen);
9785
9786
unsigned Vscale = MinVLen / RISCV::RVVBitsPerBlock;
9786
- std::tie(SubRegIdx, RemIdx) =
9787
+ auto Decompose =
9787
9788
RISCVTargetLowering::decomposeSubvectorInsertExtractToSubRegs(
9788
9789
VecVT, ContainerSubVecVT, OrigIdx / Vscale, TRI);
9789
- RemIdx = (RemIdx * Vscale) + (OrigIdx % Vscale);
9790
+ SubRegIdx = Decompose.first;
9791
+ RemIdx = ElementCount::getFixed((Decompose.second * Vscale) +
9792
+ (OrigIdx % Vscale));
9790
9793
} else {
9791
- std::tie(SubRegIdx, RemIdx) =
9794
+ auto Decompose =
9792
9795
RISCVTargetLowering::decomposeSubvectorInsertExtractToSubRegs(
9793
9796
VecVT, ContainerSubVecVT, OrigIdx, TRI);
9797
+ SubRegIdx = Decompose.first;
9798
+ RemIdx = ElementCount::getScalable(Decompose.second);
9794
9799
}
9795
9800
9796
9801
// If the Idx has been completely eliminated then this is a subvector extract
9797
9802
// which naturally aligns to a vector register. These can easily be handled
9798
9803
// using subregister manipulation.
9799
- if (RemIdx == 0 ) {
9804
+ if (RemIdx.isZero() ) {
9800
9805
if (SubVecVT.isFixedLengthVector()) {
9801
9806
Vec = DAG.getTargetExtractSubreg(SubRegIdx, DL, ContainerSubVecVT, Vec);
9802
9807
return convertFromScalableVector(SubVecVT, Vec, DAG, Subtarget);
@@ -9823,13 +9828,7 @@ SDValue RISCVTargetLowering::lowerEXTRACT_SUBVECTOR(SDValue Op,
9823
9828
9824
9829
// Slide this vector register down by the desired number of elements in order
9825
9830
// to place the desired subvector starting at element 0.
9826
- SDValue SlidedownAmt;
9827
- if (SubVecVT.isFixedLengthVector())
9828
- SlidedownAmt = DAG.getConstant(RemIdx, DL, Subtarget.getXLenVT());
9829
- else
9830
- SlidedownAmt =
9831
- DAG.getVScale(DL, XLenVT, APInt(XLenVT.getSizeInBits(), RemIdx));
9832
-
9831
+ SDValue SlidedownAmt = DAG.getElementCount(DL, XLenVT, RemIdx);
9833
9832
auto [Mask, VL] = getDefaultScalableVLOps(InterSubVT, DL, DAG, Subtarget);
9834
9833
if (SubVecVT.isFixedLengthVector())
9835
9834
VL = getVLOp(SubVecVT.getVectorNumElements(), InterSubVT, DL, DAG,
0 commit comments