@@ -220,43 +220,63 @@ void RISCVDAGToDAGISel::selectVLSEGMask(SDNode *Node, unsigned IntNo,
220
220
CurDAG->RemoveDeadNode (Node);
221
221
}
222
222
223
- void RISCVDAGToDAGISel::selectVSSEG (SDNode *Node, unsigned IntNo) {
223
+ void RISCVDAGToDAGISel::selectVSSEG (SDNode *Node, unsigned IntNo,
224
+ bool IsStrided) {
224
225
SDLoc DL (Node);
225
226
unsigned NF = Node->getNumOperands () - 4 ;
227
+ if (IsStrided)
228
+ NF--;
226
229
EVT VT = Node->getOperand (2 )->getValueType (0 );
227
230
unsigned ScalarSize = VT.getScalarSizeInBits ();
228
231
MVT XLenVT = Subtarget->getXLenVT ();
229
232
RISCVVLMUL LMUL = getLMUL (VT);
230
233
SDValue SEW = CurDAG->getTargetConstant (ScalarSize, DL, XLenVT);
231
234
SmallVector<SDValue, 8 > Regs (Node->op_begin () + 2 , Node->op_begin () + 2 + NF);
232
235
SDValue StoreVal = createTuple (*CurDAG, Regs, NF, LMUL);
233
- SDValue Operands[] = {StoreVal,
234
- Node->getOperand (2 + NF), // Base pointer.
235
- Node->getOperand (3 + NF), // VL.
236
- SEW, Node->getOperand (0 )}; // Chain
236
+ SmallVector<SDValue, 6 > Operands;
237
+ Operands.push_back (StoreVal);
238
+ Operands.push_back (Node->getOperand (2 + NF)); // Base pointer.
239
+ if (IsStrided) {
240
+ Operands.push_back (Node->getOperand (3 + NF)); // Stride.
241
+ Operands.push_back (Node->getOperand (4 + NF)); // VL.
242
+ } else {
243
+ Operands.push_back (Node->getOperand (3 + NF)); // VL.
244
+ }
245
+ Operands.push_back (SEW);
246
+ Operands.push_back (Node->getOperand (0 )); // Chain.
237
247
const RISCVZvlssegTable::RISCVZvlsseg *P = RISCVZvlssegTable::getPseudo (
238
248
IntNo, ScalarSize, static_cast <unsigned >(LMUL));
239
249
SDNode *Store =
240
250
CurDAG->getMachineNode (P->Pseudo , DL, Node->getValueType (0 ), Operands);
241
251
ReplaceNode (Node, Store);
242
252
}
243
253
244
- void RISCVDAGToDAGISel::selectVSSEGMask (SDNode *Node, unsigned IntNo) {
254
+ void RISCVDAGToDAGISel::selectVSSEGMask (SDNode *Node, unsigned IntNo,
255
+ bool IsStrided) {
245
256
SDLoc DL (Node);
246
257
unsigned NF = Node->getNumOperands () - 5 ;
258
+ if (IsStrided)
259
+ NF--;
247
260
EVT VT = Node->getOperand (2 )->getValueType (0 );
248
261
unsigned ScalarSize = VT.getScalarSizeInBits ();
249
262
MVT XLenVT = Subtarget->getXLenVT ();
250
263
RISCVVLMUL LMUL = getLMUL (VT);
251
264
SDValue SEW = CurDAG->getTargetConstant (ScalarSize, DL, XLenVT);
252
265
SmallVector<SDValue, 8 > Regs (Node->op_begin () + 2 , Node->op_begin () + 2 + NF);
253
266
SDValue StoreVal = createTuple (*CurDAG, Regs, NF, LMUL);
254
- SDValue Operands[] = {StoreVal,
255
- Node->getOperand (2 + NF), // Base pointer.
256
- Node->getOperand (3 + NF), // Mask.
257
- Node->getOperand (4 + NF), // VL.
258
- SEW,
259
- Node->getOperand (0 )}; // Chain
267
+ SmallVector<SDValue, 7 > Operands;
268
+ Operands.push_back (StoreVal);
269
+ Operands.push_back (Node->getOperand (2 + NF)); // Base pointer.
270
+ if (IsStrided) {
271
+ Operands.push_back (Node->getOperand (3 + NF)); // Stride.
272
+ Operands.push_back (Node->getOperand (4 + NF)); // Mask.
273
+ Operands.push_back (Node->getOperand (5 + NF)); // VL.
274
+ } else {
275
+ Operands.push_back (Node->getOperand (3 + NF)); // Mask.
276
+ Operands.push_back (Node->getOperand (4 + NF)); // VL.
277
+ }
278
+ Operands.push_back (SEW);
279
+ Operands.push_back (Node->getOperand (0 )); // Chain.
260
280
const RISCVZvlssegTable::RISCVZvlsseg *P = RISCVZvlssegTable::getPseudo (
261
281
IntNo, ScalarSize, static_cast <unsigned >(LMUL));
262
282
SDNode *Store =
@@ -439,7 +459,7 @@ void RISCVDAGToDAGISel::Select(SDNode *Node) {
439
459
case Intrinsic::riscv_vsseg6:
440
460
case Intrinsic::riscv_vsseg7:
441
461
case Intrinsic::riscv_vsseg8: {
442
- selectVSSEG (Node, IntNo);
462
+ selectVSSEG (Node, IntNo, /* IsStrided= */ false );
443
463
return ;
444
464
}
445
465
case Intrinsic::riscv_vsseg2_mask:
@@ -449,7 +469,27 @@ void RISCVDAGToDAGISel::Select(SDNode *Node) {
449
469
case Intrinsic::riscv_vsseg6_mask:
450
470
case Intrinsic::riscv_vsseg7_mask:
451
471
case Intrinsic::riscv_vsseg8_mask: {
452
- selectVSSEGMask (Node, IntNo);
472
+ selectVSSEGMask (Node, IntNo, /* IsStrided=*/ false );
473
+ return ;
474
+ }
475
+ case Intrinsic::riscv_vssseg2:
476
+ case Intrinsic::riscv_vssseg3:
477
+ case Intrinsic::riscv_vssseg4:
478
+ case Intrinsic::riscv_vssseg5:
479
+ case Intrinsic::riscv_vssseg6:
480
+ case Intrinsic::riscv_vssseg7:
481
+ case Intrinsic::riscv_vssseg8: {
482
+ selectVSSEG (Node, IntNo, /* IsStrided=*/ true );
483
+ return ;
484
+ }
485
+ case Intrinsic::riscv_vssseg2_mask:
486
+ case Intrinsic::riscv_vssseg3_mask:
487
+ case Intrinsic::riscv_vssseg4_mask:
488
+ case Intrinsic::riscv_vssseg5_mask:
489
+ case Intrinsic::riscv_vssseg6_mask:
490
+ case Intrinsic::riscv_vssseg7_mask:
491
+ case Intrinsic::riscv_vssseg8_mask: {
492
+ selectVSSEGMask (Node, IntNo, /* IsStrided=*/ true );
453
493
return ;
454
494
}
455
495
}
0 commit comments