@@ -357,7 +357,8 @@ void RISCVDAGToDAGISel::selectVLSEGFF(SDNode *Node, bool IsMasked) {
357
357
unsigned NF = Node->getNumValues () - 2 ; // Do not count VL and Chain.
358
358
MVT VT = Node->getSimpleValueType (0 );
359
359
MVT XLenVT = Subtarget->getXLenVT ();
360
- unsigned Log2SEW = Log2_32 (VT.getScalarSizeInBits ());
360
+ unsigned SEW = VT.getScalarSizeInBits ();
361
+ unsigned Log2SEW = Log2_32 (SEW);
361
362
RISCVII::VLMUL LMUL = RISCVTargetLowering::getLMUL (VT);
362
363
363
364
unsigned CurOp = 2 ;
@@ -379,8 +380,18 @@ void RISCVDAGToDAGISel::selectVLSEGFF(SDNode *Node, bool IsMasked) {
379
380
Log2SEW, static_cast <unsigned >(LMUL));
380
381
MachineSDNode *Load = CurDAG->getMachineNode (P->Pseudo , DL, MVT::Untyped,
381
382
MVT::Other, MVT::Glue, Operands);
383
+ bool TailAgnostic = true ;
384
+ bool MaskAgnostic = false ;
385
+ if (IsMasked) {
386
+ uint64_t Policy = Node->getConstantOperandVal (Node->getNumOperands () - 1 );
387
+ TailAgnostic = Policy & RISCVII::TAIL_AGNOSTIC;
388
+ MaskAgnostic = Policy & RISCVII::MASK_AGNOSTIC;
389
+ }
390
+ unsigned VType =
391
+ RISCVVType::encodeVTYPE (LMUL, SEW, TailAgnostic, MaskAgnostic);
392
+ SDValue VTypeOp = CurDAG->getTargetConstant (VType, DL, XLenVT);
382
393
SDNode *ReadVL = CurDAG->getMachineNode (RISCV::PseudoReadVL, DL, XLenVT,
383
- /* Glue*/ SDValue (Load, 2 ));
394
+ VTypeOp, /* Glue*/ SDValue (Load, 2 ));
384
395
385
396
if (auto *MemOp = dyn_cast<MemSDNode>(Node))
386
397
CurDAG->setNodeMemRefs (Load, {MemOp->getMemOperand ()});
@@ -1342,7 +1353,8 @@ void RISCVDAGToDAGISel::Select(SDNode *Node) {
1342
1353
bool IsMasked = IntNo == Intrinsic::riscv_vleff_mask;
1343
1354
1344
1355
MVT VT = Node->getSimpleValueType (0 );
1345
- unsigned Log2SEW = Log2_32 (VT.getScalarSizeInBits ());
1356
+ unsigned SEW = VT.getScalarSizeInBits ();
1357
+ unsigned Log2SEW = Log2_32 (SEW);
1346
1358
1347
1359
unsigned CurOp = 2 ;
1348
1360
// Masked intrinsic only have TU version pseduo instructions.
@@ -1365,8 +1377,20 @@ void RISCVDAGToDAGISel::Select(SDNode *Node) {
1365
1377
MachineSDNode *Load =
1366
1378
CurDAG->getMachineNode (P->Pseudo , DL, Node->getValueType (0 ),
1367
1379
MVT::Other, MVT::Glue, Operands);
1368
- SDNode *ReadVL = CurDAG->getMachineNode (RISCV::PseudoReadVL, DL, XLenVT,
1369
- /* Glue*/ SDValue (Load, 2 ));
1380
+ bool TailAgnostic = !IsTU;
1381
+ bool MaskAgnostic = false ;
1382
+ if (IsMasked) {
1383
+ uint64_t Policy =
1384
+ Node->getConstantOperandVal (Node->getNumOperands () - 1 );
1385
+ TailAgnostic = Policy & RISCVII::TAIL_AGNOSTIC;
1386
+ MaskAgnostic = Policy & RISCVII::MASK_AGNOSTIC;
1387
+ }
1388
+ unsigned VType =
1389
+ RISCVVType::encodeVTYPE (LMUL, SEW, TailAgnostic, MaskAgnostic);
1390
+ SDValue VTypeOp = CurDAG->getTargetConstant (VType, DL, XLenVT);
1391
+ SDNode *ReadVL =
1392
+ CurDAG->getMachineNode (RISCV::PseudoReadVL, DL, XLenVT, VTypeOp,
1393
+ /* Glue*/ SDValue (Load, 2 ));
1370
1394
1371
1395
if (auto *MemOp = dyn_cast<MemSDNode>(Node))
1372
1396
CurDAG->setNodeMemRefs (Load, {MemOp->getMemOperand ()});
0 commit comments