@@ -64,6 +64,26 @@ def Log2 : SDNodeXForm<imm, [{
6464 return CurDAG->getTargetConstant(Imm, SDLoc(N), N->getValueType(0));
6565}]>;
6666
67+ //===----------------------------------------------------------------------===//
68+ // Pseudo table
69+ //===----------------------------------------------------------------------===//
70+
71+ class RISCVNDSVLN<bit M, bit U, bits<3> S, bits<3> L> {
72+ bits<1> Masked = M;
73+ bits<1> Unsigned = U;
74+ bits<3> Log2SEW = S;
75+ bits<3> LMUL = L;
76+ Pseudo Pseudo = !cast<Pseudo>(NAME);
77+ }
78+
79+ def RISCVNDSVLNTable : GenericTable {
80+ let FilterClass = "RISCVNDSVLN";
81+ let CppTypeName = "NDSVLNPseudo";
82+ let Fields = ["Masked", "Unsigned", "Log2SEW", "LMUL", "Pseudo"];
83+ let PrimaryKey = ["Masked", "Unsigned", "Log2SEW", "LMUL"];
84+ let PrimaryKeyName = "getNDSVLNPseudo";
85+ }
86+
6787//===----------------------------------------------------------------------===//
6888// Instruction Class Templates
6989//===----------------------------------------------------------------------===//
@@ -416,6 +436,39 @@ class NDSRVInstVLN<bits<5> funct5, string opcodestr>
416436 let RVVConstraint = VMConstraint;
417437}
418438
439+ class VPseudoVLN8NoMask<VReg RetClass, bit U> :
440+ Pseudo<(outs RetClass:$rd),
441+ (ins RetClass:$dest,
442+ GPRMemZeroOffset:$rs1,
443+ AVL:$vl, sew:$sew, vec_policy:$policy), []>,
444+ RISCVVPseudo,
445+ RISCVNDSVLN</*Masked*/0, /*Unsigned*/U, !logtwo(8), VLMul> {
446+ let mayLoad = 1;
447+ let mayStore = 0;
448+ let hasSideEffects = 0;
449+ let HasVLOp = 1;
450+ let HasSEWOp = 1;
451+ let HasVecPolicyOp = 1;
452+ let Constraints = "$rd = $dest";
453+ }
454+
455+ class VPseudoVLN8Mask<VReg RetClass, bit U> :
456+ Pseudo<(outs GetVRegNoV0<RetClass>.R:$rd),
457+ (ins GetVRegNoV0<RetClass>.R:$passthru,
458+ GPRMemZeroOffset:$rs1,
459+ VMaskOp:$vm, AVL:$vl, sew:$sew, vec_policy:$policy), []>,
460+ RISCVVPseudo,
461+ RISCVNDSVLN</*Masked*/1, /*Unsigned*/U, !logtwo(8), VLMul> {
462+ let mayLoad = 1;
463+ let mayStore = 0;
464+ let hasSideEffects = 0;
465+ let HasVLOp = 1;
466+ let HasSEWOp = 1;
467+ let HasVecPolicyOp = 1;
468+ let UsesMaskPolicy = 1;
469+ let Constraints = "$rd = $passthru";
470+ }
471+
419472//===----------------------------------------------------------------------===//
420473// Multiclass
421474//===----------------------------------------------------------------------===//
@@ -465,6 +518,22 @@ multiclass VPatConversionBF16_S<string intrinsic, string instruction> {
465518 }
466519}
467520
521+ multiclass VPseudoVLN8<bit U> {
522+ foreach lmul = MxSet<8>.m in {
523+ defvar LInfo = lmul.MX;
524+ defvar vreg = lmul.vrclass;
525+ let VLMul = lmul.value in {
526+ def "_V_" # LInfo :
527+ VPseudoVLN8NoMask<vreg, U>,
528+ VLESched<LInfo>;
529+ def "_V_" # LInfo # "_MASK" :
530+ VPseudoVLN8Mask<vreg, U>,
531+ RISCVMaskedPseudo<MaskIdx=2>,
532+ VLESched<LInfo>;
533+ }
534+ }
535+ }
536+
468537let fprclass = !cast<RegisterClass>("FPR32") in
469538def SCALAR_F16_FPR32 : FPR_Info<16>;
470539
@@ -684,6 +753,11 @@ defm : VPatConversionS_BF16<"int_riscv_nds_vfwcvt_s_bf16",
684753defm : VPatConversionBF16_S<"int_riscv_nds_vfncvt_bf16_s",
685754 "PseudoNDS_VFNCVT_BF16">;
686755
756+ let Predicates = [HasVendorXAndesVSIntLoad] in {
757+ defm PseudoNDS_VLN8 : VPseudoVLN8<0>;
758+ defm PseudoNDS_VLNU8 : VPseudoVLN8<1>;
759+ } // Predicates = [HasVendorXAndesVSIntLoad]
760+
687761let Predicates = [HasVendorXAndesVPackFPH],
688762 mayRaiseFPException = true in {
689763defm PseudoNDS_VFPMADT : VPseudoVFPMAD_VF_RM;
0 commit comments