97 auto srcType = op.getSourceVectorType();
98 auto dstType = op.getDestVectorType();
99 int64_t srcRank = srcType.getRank();
102 if ((srcType.isScalable() || dstType.isScalable()) && srcRank == 1)
105 if (op.getOffsets().getValue().empty())
108 int64_t dstRank = dstType.getRank();
109 assert(dstRank >= srcRank);
110 if (dstRank != srcRank)
113 if (srcType == dstType) {
114 rewriter.
replaceOp(op, op.getValueToStore());
119 cast<IntegerAttr>(op.getOffsets().getValue().front()).getInt();
120 int64_t size = srcType.getShape().front();
122 cast<IntegerAttr>(op.getStrides().getValue().front()).getInt();
124 auto loc = op.getLoc();
125 Value res = op.getDest();
128 int nSrc = srcType.getShape().front();
129 int nDest = dstType.getShape().front();
132 for (
int64_t i = 0; i < nSrc; ++i)
134 Value scaledSource = ShuffleOp::create(
135 rewriter, loc, op.getValueToStore(), op.getValueToStore(), offsets);
140 for (
int64_t i = 0, e = offset + size * stride; i < nDest; ++i) {
141 if (i < offset || i >= e || (i - offset) % stride != 0)
142 offsets.push_back(nDest + i);
144 offsets.push_back((i - offset) / stride);
155 for (
int64_t off = offset, e = offset + size * stride, idx = 0; off < e;
156 off += stride, ++idx) {
158 Value extractedSource =
159 ExtractOp::create(rewriter, loc, op.getValueToStore(), idx);
160 if (isa<VectorType>(extractedSource.
getType())) {
163 Value extractedDest =
164 ExtractOp::create(rewriter, loc, op.getDest(), off);
167 extractedSource = InsertStridedSliceOp::create(
168 rewriter, loc, extractedSource, extractedDest,
173 res = InsertOp::create(rewriter, loc, extractedSource, res, off);