@@ -277,6 +277,68 @@ class VPseudo<Instruction instr, LMULInfo m, dag outs, dag ins> :
277
277
let VLMul = m.value;
278
278
}
279
279
280
+ class VPseudoUSLoadNoMask<VReg RetClass>:
281
+ Pseudo<(outs RetClass:$rd),
282
+ (ins GPR:$rs1, GPR:$vl, ixlenimm:$sew),[]>,
283
+ RISCVVPseudo {
284
+ let mayLoad = 1;
285
+ let mayStore = 0;
286
+ let hasSideEffects = 0;
287
+ let usesCustomInserter = 1;
288
+ let Uses = [VL, VTYPE];
289
+ let VLIndex = 2;
290
+ let SEWIndex = 3;
291
+ let HasDummyMask = 1;
292
+ let BaseInstr = !cast<Instruction>(PseudoToVInst<NAME>.VInst);
293
+ }
294
+
295
+ class VPseudoUSLoadMask<VReg RetClass>:
296
+ Pseudo<(outs GetVRegNoV0<RetClass>.R:$rd),
297
+ (ins GetVRegNoV0<RetClass>.R:$merge,
298
+ GPR:$rs1,
299
+ VMaskOp:$vm, GPR:$vl, ixlenimm:$sew),[]>,
300
+ RISCVVPseudo {
301
+ let mayLoad = 1;
302
+ let mayStore = 0;
303
+ let hasSideEffects = 0;
304
+ let usesCustomInserter = 1;
305
+ let Constraints = "$rd = $merge";
306
+ let Uses = [VL, VTYPE];
307
+ let VLIndex = 4;
308
+ let SEWIndex = 5;
309
+ let MergeOpIndex = 1;
310
+ let BaseInstr = !cast<Instruction>(PseudoToVInst<NAME>.VInst);
311
+ }
312
+
313
+ class VPseudoUSStoreNoMask<VReg StClass>:
314
+ Pseudo<(outs),
315
+ (ins StClass:$rd, GPR:$rs1, GPR:$vl, ixlenimm:$sew),[]>,
316
+ RISCVVPseudo {
317
+ let mayLoad = 0;
318
+ let mayStore = 1;
319
+ let hasSideEffects = 0;
320
+ let usesCustomInserter = 1;
321
+ let Uses = [VL, VTYPE];
322
+ let VLIndex = 2;
323
+ let SEWIndex = 3;
324
+ let HasDummyMask = 1;
325
+ let BaseInstr = !cast<Instruction>(PseudoToVInst<NAME>.VInst);
326
+ }
327
+
328
+ class VPseudoUSStoreMask<VReg StClass>:
329
+ Pseudo<(outs),
330
+ (ins StClass:$rd, GPR:$rs1, VMaskOp:$vm, GPR:$vl, ixlenimm:$sew),[]>,
331
+ RISCVVPseudo {
332
+ let mayLoad = 0;
333
+ let mayStore = 1;
334
+ let hasSideEffects = 0;
335
+ let usesCustomInserter = 1;
336
+ let Uses = [VL, VTYPE];
337
+ let VLIndex = 3;
338
+ let SEWIndex = 4;
339
+ let BaseInstr = !cast<Instruction>(PseudoToVInst<NAME>.VInst);
340
+ }
341
+
280
342
class VPseudoBinaryNoMask<VReg RetClass,
281
343
VReg Op1Class,
282
344
DAGOperand Op2Class,
@@ -342,6 +404,28 @@ class VPseudoBinaryCarryIn<VReg RetClass,
342
404
let VLMul = MInfo.value;
343
405
}
344
406
407
+ multiclass VPseudoUSLoad {
408
+ foreach lmul = MxList.m in {
409
+ defvar LInfo = lmul.MX;
410
+ defvar vreg = lmul.vrclass;
411
+ let VLMul = lmul.value in {
412
+ def "_V_" # LInfo : VPseudoUSLoadNoMask<vreg>;
413
+ def "_V_" # LInfo # "_MASK" : VPseudoUSLoadMask<vreg>;
414
+ }
415
+ }
416
+ }
417
+
418
+ multiclass VPseudoUSStore {
419
+ foreach lmul = MxList.m in {
420
+ defvar LInfo = lmul.MX;
421
+ defvar vreg = lmul.vrclass;
422
+ let VLMul = lmul.value in {
423
+ def "_V_" # LInfo : VPseudoUSStoreNoMask<vreg>;
424
+ def "_V_" # LInfo # "_MASK" : VPseudoUSStoreMask<vreg>;
425
+ }
426
+ }
427
+ }
428
+
345
429
multiclass VPseudoBinary<VReg RetClass,
346
430
VReg Op1Class,
347
431
DAGOperand Op2Class,
@@ -519,8 +603,32 @@ multiclass VPseudoBinaryV_WV_WX_WI {
519
603
}
520
604
521
605
//===----------------------------------------------------------------------===//
522
- // Helpers to define the different patterns.
606
+ // Helpers to define the SDNode patterns.
523
607
//===----------------------------------------------------------------------===//
608
+
609
+ multiclass VPatUSLoadStoreSDNode<LLVMType type,
610
+ LLVMType mask_type,
611
+ int sew,
612
+ LMULInfo vlmul,
613
+ RegisterClass reg_rs1,
614
+ VReg reg_class>
615
+ {
616
+ defvar load_instr = !cast<Instruction>("PseudoVLE"#sew#"_V_"#vlmul.MX);
617
+ defvar store_instr = !cast<Instruction>("PseudoVSE"#sew#"_V_"#vlmul.MX);
618
+ // Load
619
+ def : Pat<(type (load reg_rs1:$rs1)),
620
+ (load_instr reg_rs1:$rs1, VLMax, sew)>;
621
+ // Store
622
+ def : Pat<(store type:$rs2, reg_rs1:$rs1),
623
+ (store_instr reg_class:$rs2, reg_rs1:$rs1, VLMax, sew)>;
624
+ }
625
+
626
+ multiclass VPatUSLoadStoreSDNodes<RegisterClass reg_rs1> {
627
+ foreach vti = AllVectors in
628
+ defm "" : VPatUSLoadStoreSDNode<vti.Vector, vti.Mask, vti.SEW, vti.LMul,
629
+ reg_rs1, vti.RegClass>;
630
+ }
631
+
524
632
class VPatBinarySDNode<SDNode vop,
525
633
string instruction_name,
526
634
ValueType result_type,
@@ -546,6 +654,9 @@ multiclass VPatBinarySDNode<SDNode vop, string instruction_name>
546
654
vti.LMul, vti.RegClass, vti.RegClass>;
547
655
}
548
656
657
+ //===----------------------------------------------------------------------===//
658
+ // Helpers to define the intrinsic patterns.
659
+ //===----------------------------------------------------------------------===//
549
660
class VPatBinaryNoMask<string intrinsic_name,
550
661
string inst,
551
662
string kind,
@@ -922,83 +1033,10 @@ def PseudoVSETVLI : Pseudo<(outs GPR:$rd), (ins GPR:$rs1, VTypeIOp:$vtypei), []>
922
1033
// 7. Vector Loads and Stores
923
1034
//===----------------------------------------------------------------------===//
924
1035
925
- // Pseudos.
1036
+ // Pseudos Unit-Stride Loads and Stores
926
1037
foreach eew = EEWList in {
927
- foreach lmul = MxList.m in {
928
- defvar LInfo = lmul.MX;
929
- defvar vreg = lmul.vrclass;
930
- defvar vlmul = lmul.value;
931
- defvar constraint = "$rd = $merge";
932
-
933
- let mayLoad = 1, mayStore = 0, hasSideEffects = 0,
934
- usesCustomInserter = 1,
935
- VLMul = vlmul in
936
- {
937
- let Uses = [VL, VTYPE], VLIndex = 4, SEWIndex = 5, MergeOpIndex = 1,
938
- Constraints = constraint,
939
- BaseInstr = !cast<Instruction>("VLE" # eew # "_V") in
940
- def "PseudoVLE" # eew # "_V_" # LInfo
941
- : Pseudo<(outs vreg:$rd),
942
- (ins vreg:$merge, GPR:$rs1, VMaskOp:$mask, GPR:$vl,
943
- ixlenimm:$sew),
944
- []>,
945
- RISCVVPseudo;
946
- }
947
-
948
- let mayLoad = 0, mayStore = 1, hasSideEffects = 0,
949
- usesCustomInserter = 1,
950
- VLMul = vlmul in
951
- {
952
- // Masked stores do not have a merge operand as merge is done in memory
953
- let Uses = [VL, VTYPE],
954
- VLIndex = 3, SEWIndex = 4, MergeOpIndex = -1,
955
- BaseInstr = !cast<Instruction>("VSE" # eew # "_V") in
956
- def "PseudoVSE" # eew # "_V_" # LInfo
957
- : Pseudo<(outs),
958
- (ins vreg:$rd, GPR:$rs1, VMaskOp:$mask, GPR:$vl,
959
- ixlenimm:$sew),
960
- []>,
961
- RISCVVPseudo;
962
- }
963
- }
964
- }
965
-
966
- // Patterns.
967
- multiclass pat_load_store<LLVMType type,
968
- LLVMType mask_type,
969
- int sew,
970
- LMULInfo vlmul,
971
- VReg reg_class>
972
- {
973
- defvar load_instr = !cast<Instruction>("PseudoVLE" # sew # "_V_"# vlmul.MX);
974
- defvar store_instr = !cast<Instruction>("PseudoVSE" # sew # "_V_"# vlmul.MX);
975
- // Load
976
- def : Pat<(type (load GPR:$rs1)),
977
- (load_instr (type (IMPLICIT_DEF)),
978
- GPR:$rs1,
979
- (mask_type zero_reg),
980
- VLMax, sew)>;
981
- def : Pat<(type (load AddrFI:$rs1)),
982
- (load_instr (type (IMPLICIT_DEF)),
983
- AddrFI:$rs1,
984
- (mask_type zero_reg),
985
- VLMax, sew)>;
986
-
987
- // Store
988
- def : Pat<(store type:$rs2, GPR:$rs1),
989
- (store_instr reg_class:$rs2, GPR:$rs1,
990
- (mask_type zero_reg),
991
- VLMax, sew)>;
992
- def : Pat<(store type:$rs2, AddrFI:$rs1),
993
- (store_instr reg_class:$rs2, AddrFI:$rs1,
994
- (mask_type zero_reg),
995
- VLMax, sew)>;
996
- }
997
-
998
- foreach vti = AllVectors in
999
- {
1000
- defm : pat_load_store<vti.Vector, vti.Mask,
1001
- vti.SEW, vti.LMul, vti.RegClass>;
1038
+ defm PseudoVLE # eew : VPseudoUSLoad;
1039
+ defm PseudoVSE # eew : VPseudoUSStore;
1002
1040
}
1003
1041
1004
1042
//===----------------------------------------------------------------------===//
@@ -1078,6 +1116,12 @@ defm PseudoVFRSUB : VPseudoBinaryV_VX</*IsFloat=*/1>;
1078
1116
let Predicates = [HasStdExtV] in {
1079
1117
1080
1118
// Whole-register vector patterns.
1119
+
1120
+ // 7.4. Vector Unit-Stride Instructions
1121
+ defm "" : VPatUSLoadStoreSDNodes<GPR>;
1122
+ defm "" : VPatUSLoadStoreSDNodes<AddrFI>;
1123
+
1124
+ // 12.1. Vector Single-Width Integer Add and Subtract
1081
1125
defm "" : VPatBinarySDNode<add, "PseudoVADD">;
1082
1126
1083
1127
//===----------------------------------------------------------------------===//
0 commit comments