@@ -1757,6 +1757,29 @@ class XVPseudoUnaryMask<VReg RetClass, VReg OpClass, string Constraint = ""> :
1757
1757
let HasSEWOp = 1;
1758
1758
}
1759
1759
1760
+ class XVPseudoNullaryNoMask<VReg RegClass>:
1761
+ Pseudo<(outs RegClass:$rd),
1762
+ (ins RegClass:$merge, AVL:$vl, ixlenimm:$sew), []>, RISCVVPseudo {
1763
+ let mayLoad = 0;
1764
+ let mayStore = 0;
1765
+ let hasSideEffects = 0;
1766
+ let Constraints = "$rd = $merge";
1767
+ let HasVLOp = 1;
1768
+ let HasSEWOp = 1;
1769
+ }
1770
+
1771
+ class XVPseudoNullaryMask<VReg RegClass>:
1772
+ Pseudo<(outs GetVRegNoV0<RegClass>.R:$rd),
1773
+ (ins GetVRegNoV0<RegClass>.R:$merge, VMaskOp:$vm, AVL:$vl,
1774
+ ixlenimm:$sew), []>, RISCVVPseudo {
1775
+ let mayLoad = 0;
1776
+ let mayStore = 0;
1777
+ let hasSideEffects = 0;
1778
+ let Constraints ="$rd = $merge";
1779
+ let HasVLOp = 1;
1780
+ let HasSEWOp = 1;
1781
+ }
1782
+
1760
1783
multiclass XVPseudoBinary<VReg RetClass,
1761
1784
VReg Op1Class,
1762
1785
DAGOperand Op2Class,
@@ -2596,6 +2619,38 @@ multiclass XVPseudoVSFS_M {
2596
2619
}
2597
2620
}
2598
2621
2622
+ multiclass XVPseudoVIOT_M {
2623
+ defvar constraint = "@earlyclobber $rd";
2624
+ foreach m = MxListXTHeadV in {
2625
+ defvar mx = m.MX;
2626
+ defvar WriteVMIotV_MX = !cast<SchedWrite>("WriteVMIotV_" # mx);
2627
+ defvar ReadVMIotV_MX = !cast<SchedRead>("ReadVMIotV_" # mx);
2628
+ let VLMul = m.value in {
2629
+ def "_" # m.MX : XVPseudoUnaryNoMask<m.vrclass, VR, constraint>,
2630
+ Sched<[WriteVMIotV_MX, ReadVMIotV_MX, ReadVMask]>;
2631
+ def "_" # m.MX # "_MASK" : XVPseudoUnaryMask<m.vrclass, VR, constraint>,
2632
+ RISCVMaskedPseudo<MaskIdx=2>,
2633
+ Sched<[WriteVMIotV_MX, ReadVMIotV_MX, ReadVMask]>;
2634
+ }
2635
+ }
2636
+ }
2637
+
2638
+ multiclass XVPseudoVID_V {
2639
+ foreach m = MxListXTHeadV in {
2640
+ defvar mx = m.MX;
2641
+ defvar WriteVMIdxV_MX = !cast<SchedWrite>("WriteVMIdxV_" # mx);
2642
+ defvar ReadVMIdxV_MX = !cast<SchedRead>("ReadVMIdxV_" # mx);
2643
+
2644
+ let VLMul = m.value in {
2645
+ def "_V_" # m.MX : XVPseudoNullaryNoMask<m.vrclass>,
2646
+ Sched<[WriteVMIdxV_MX, ReadVMask]>;
2647
+ def "_V_" # m.MX # "_MASK" : XVPseudoNullaryMask<m.vrclass>,
2648
+ RISCVMaskedPseudo<MaskIdx=1>,
2649
+ Sched<[WriteVMIdxV_MX, ReadVMask]>;
2650
+ }
2651
+ }
2652
+ }
2653
+
2599
2654
//===----------------------------------------------------------------------===//
2600
2655
// Helpers to define the intrinsic patterns for the XTHeadVector extension.
2601
2656
//===----------------------------------------------------------------------===//
@@ -3066,6 +3121,24 @@ multiclass XVPatBinaryM_MM<string intrinsic, string instruction> {
3066
3121
mti.Log2SEW, VR, VR>;
3067
3122
}
3068
3123
3124
+ multiclass XVPatNullaryV<string intrinsic, string instruction> {
3125
+ foreach vti = AllIntegerXVectors in {
3126
+ let Predicates = GetXVTypePredicates<vti>.Predicates in {
3127
+ def : Pat<(vti.Vector (!cast<Intrinsic>(intrinsic)
3128
+ (vti.Vector vti.RegClass:$merge),
3129
+ VLOpFrag)),
3130
+ (!cast<Instruction>(instruction#"_V_" # vti.LMul.MX)
3131
+ vti.RegClass:$merge, GPR:$vl, vti.Log2SEW)>;
3132
+ def : Pat<(vti.Vector (!cast<Intrinsic>(intrinsic # "_mask")
3133
+ (vti.Vector vti.RegClass:$merge),
3134
+ (vti.Mask V0), VLOpFrag)),
3135
+ (!cast<Instruction>(instruction#"_V_" # vti.LMul.MX # "_MASK")
3136
+ vti.RegClass:$merge, (vti.Mask V0),
3137
+ GPR:$vl, vti.Log2SEW)>;
3138
+ }
3139
+ }
3140
+ }
3141
+
3069
3142
multiclass XVPatNullaryM<string intrinsic, string inst> {
3070
3143
foreach mti = AllXMasks in
3071
3144
def : Pat<(mti.Mask (!cast<Intrinsic>(intrinsic)
@@ -3120,6 +3193,63 @@ multiclass XVPatUnaryM_M<string intrinsic,
3120
3193
}
3121
3194
}
3122
3195
3196
+ class XVPatUnaryNoMask<string intrinsic_name,
3197
+ string inst,
3198
+ string kind,
3199
+ ValueType result_type,
3200
+ ValueType op2_type,
3201
+ int log2sew,
3202
+ LMULInfo vlmul,
3203
+ VReg result_reg_class,
3204
+ VReg op2_reg_class,
3205
+ bit isSEWAware = 0> :
3206
+ Pat<(result_type (!cast<Intrinsic>(intrinsic_name)
3207
+ (result_type result_reg_class:$merge),
3208
+ (op2_type op2_reg_class:$rs2),
3209
+ VLOpFrag)),
3210
+ (!cast<Instruction>(
3211
+ !if(isSEWAware,
3212
+ inst#"_"#kind#"_"#vlmul.MX#"_E"#!shl(1, log2sew),
3213
+ inst#"_"#kind#"_"#vlmul.MX))
3214
+ (result_type result_reg_class:$merge),
3215
+ (op2_type op2_reg_class:$rs2),
3216
+ GPR:$vl, log2sew)>;
3217
+
3218
+ class XVPatUnaryMask<string intrinsic_name,
3219
+ string inst,
3220
+ string kind,
3221
+ ValueType result_type,
3222
+ ValueType op2_type,
3223
+ ValueType mask_type,
3224
+ int log2sew,
3225
+ LMULInfo vlmul,
3226
+ VReg result_reg_class,
3227
+ VReg op2_reg_class,
3228
+ bit isSEWAware = 0> :
3229
+ Pat<(result_type (!cast<Intrinsic>(intrinsic_name#"_mask")
3230
+ (result_type result_reg_class:$merge),
3231
+ (op2_type op2_reg_class:$rs2),
3232
+ (mask_type V0),
3233
+ VLOpFrag)),
3234
+ (!cast<Instruction>(
3235
+ !if(isSEWAware,
3236
+ inst#"_"#kind#"_"#vlmul.MX#"_E"#!shl(1, log2sew)#"_MASK",
3237
+ inst#"_"#kind#"_"#vlmul.MX#"_MASK"))
3238
+ (result_type result_reg_class:$merge),
3239
+ (op2_type op2_reg_class:$rs2),
3240
+ (mask_type V0), GPR:$vl, log2sew)>;
3241
+
3242
+ multiclass XVPatUnaryV_M<string intrinsic, string instruction> {
3243
+ foreach vti = AllIntegerXVectors in {
3244
+ let Predicates = GetXVTypePredicates<vti>.Predicates in {
3245
+ def : XVPatUnaryNoMask<intrinsic, instruction, "M", vti.Vector, vti.Mask,
3246
+ vti.Log2SEW, vti.LMul, vti.RegClass, VR>;
3247
+ def : XVPatUnaryMask<intrinsic, instruction, "M", vti.Vector, vti.Mask,
3248
+ vti.Mask, vti.Log2SEW, vti.LMul, vti.RegClass, VR>;
3249
+ }
3250
+ }
3251
+ }
3252
+
3123
3253
multiclass XVPatCompare_VI<string intrinsic, string inst,
3124
3254
ImmLeaf ImmType> {
3125
3255
foreach vti = AllIntegerXVectors in {
@@ -4069,4 +4199,15 @@ defm : XVPatUnaryM_M<"int_riscv_th_vmsbf", "PseudoTH_VMSBF">;
4069
4199
defm : XVPatUnaryM_M<"int_riscv_th_vmsif", "PseudoTH_VMSIF">;
4070
4200
defm : XVPatUnaryM_M<"int_riscv_th_vmsof", "PseudoTH_VMSOF">;
4071
4201
4202
+ //===----------------------------------------------------------------------===//
4203
+ // 16.7. Vector Iota Operations
4204
+ // 16.8. Vector Element Index Operations
4205
+ //===----------------------------------------------------------------------===//
4206
+ defm PseudoTH_VIOTA_M: XVPseudoVIOT_M;
4207
+ defm PseudoTH_VID : XVPseudoVID_V;
4208
+
4209
+ // Patterns
4210
+ defm : XVPatUnaryV_M<"int_riscv_th_viota", "PseudoTH_VIOTA">;
4211
+ defm : XVPatNullaryV<"int_riscv_th_vid", "PseudoTH_VID">;
4212
+
4072
4213
include "RISCVInstrInfoXTHeadVVLPatterns.td"
0 commit comments