@@ -9820,27 +9820,32 @@ SDValue RISCVTargetLowering::lowerEXTRACT_SUBVECTOR(SDValue Op,
9820
9820
if (SubVecVT.isFixedLengthVector())
9821
9821
ContainerSubVecVT = getContainerForFixedLengthVector(SubVecVT);
9822
9822
9823
- unsigned SubRegIdx, RemIdx;
9824
- // extract_subvector scales the index by vscale is the subvector is scalable,
9823
+ unsigned SubRegIdx;
9824
+ ElementCount RemIdx;
9825
+ // extract_subvector scales the index by vscale if the subvector is scalable,
9825
9826
// and decomposeSubvectorInsertExtractToSubRegs takes this into account. So if
9826
9827
// we have a fixed length subvector, we need to adjust the index by 1/vscale.
9827
9828
if (SubVecVT.isFixedLengthVector()) {
9828
9829
assert(MinVLen == MaxVLen);
9829
9830
unsigned Vscale = MinVLen / RISCV::RVVBitsPerBlock;
9830
- std::tie(SubRegIdx, RemIdx) =
9831
+ auto Decompose =
9831
9832
RISCVTargetLowering::decomposeSubvectorInsertExtractToSubRegs(
9832
9833
VecVT, ContainerSubVecVT, OrigIdx / Vscale, TRI);
9833
- RemIdx = (RemIdx * Vscale) + (OrigIdx % Vscale);
9834
+ SubRegIdx = Decompose.first;
9835
+ RemIdx = ElementCount::getFixed((Decompose.second * Vscale) +
9836
+ (OrigIdx % Vscale));
9834
9837
} else {
9835
- std::tie(SubRegIdx, RemIdx) =
9838
+ auto Decompose =
9836
9839
RISCVTargetLowering::decomposeSubvectorInsertExtractToSubRegs(
9837
9840
VecVT, ContainerSubVecVT, OrigIdx, TRI);
9841
+ SubRegIdx = Decompose.first;
9842
+ RemIdx = ElementCount::getScalable(Decompose.second);
9838
9843
}
9839
9844
9840
9845
// If the Idx has been completely eliminated then this is a subvector extract
9841
9846
// which naturally aligns to a vector register. These can easily be handled
9842
9847
// using subregister manipulation.
9843
- if (RemIdx == 0 ) {
9848
+ if (RemIdx.isZero() ) {
9844
9849
if (SubVecVT.isFixedLengthVector()) {
9845
9850
Vec = DAG.getTargetExtractSubreg(SubRegIdx, DL, ContainerSubVecVT, Vec);
9846
9851
return convertFromScalableVector(SubVecVT, Vec, DAG, Subtarget);
@@ -9867,13 +9872,7 @@ SDValue RISCVTargetLowering::lowerEXTRACT_SUBVECTOR(SDValue Op,
9867
9872
9868
9873
// Slide this vector register down by the desired number of elements in order
9869
9874
// to place the desired subvector starting at element 0.
9870
- SDValue SlidedownAmt;
9871
- if (SubVecVT.isFixedLengthVector())
9872
- SlidedownAmt = DAG.getConstant(RemIdx, DL, Subtarget.getXLenVT());
9873
- else
9874
- SlidedownAmt =
9875
- DAG.getVScale(DL, XLenVT, APInt(XLenVT.getSizeInBits(), RemIdx));
9876
-
9875
+ SDValue SlidedownAmt = DAG.getElementCount(DL, XLenVT, RemIdx);
9877
9876
auto [Mask, VL] = getDefaultScalableVLOps(InterSubVT, DL, DAG, Subtarget);
9878
9877
if (SubVecVT.isFixedLengthVector())
9879
9878
VL = getVLOp(SubVecVT.getVectorNumElements(), InterSubVT, DL, DAG,
0 commit comments