@@ -548,24 +548,22 @@ class VALUVs2NoVm<bits<6> funct6, bits<5> vs1, RISCVVFormat opv, string opcodest
548
548
// Use these multiclasses to define instructions more easily.
549
549
//===----------------------------------------------------------------------===//
550
550
551
- multiclass VIndexLoadStore<list<int> EEWList> {
552
- foreach n = EEWList in {
553
- defvar w = !cast<RISCVWidth>("LSWidth" # n);
554
-
555
- def VLUXEI # n # _V :
556
- VIndexedLoad<MOPLDIndexedUnord, w, "vluxei" # n # ".v">,
557
- VLXSchedMC<n, isOrdered=0>;
558
- def VLOXEI # n # _V :
559
- VIndexedLoad<MOPLDIndexedOrder, w, "vloxei" # n # ".v">,
560
- VLXSchedMC<n, isOrdered=1>;
561
-
562
- def VSUXEI # n # _V :
563
- VIndexedStore<MOPSTIndexedUnord, w, "vsuxei" # n # ".v">,
564
- VSXSchedMC<n, isOrdered=0>;
565
- def VSOXEI # n # _V :
566
- VIndexedStore<MOPSTIndexedOrder, w, "vsoxei" # n # ".v">,
567
- VSXSchedMC<n, isOrdered=1>;
568
- }
551
+ multiclass VIndexLoadStore<int eew> {
552
+ defvar w = !cast<RISCVWidth>("LSWidth" # eew);
553
+
554
+ def VLUXEI # eew # _V :
555
+ VIndexedLoad<MOPLDIndexedUnord, w, "vluxei" # eew # ".v">,
556
+ VLXSchedMC<eew, isOrdered=0>;
557
+ def VLOXEI # eew # _V :
558
+ VIndexedLoad<MOPLDIndexedOrder, w, "vloxei" # eew # ".v">,
559
+ VLXSchedMC<eew, isOrdered=1>;
560
+
561
+ def VSUXEI # eew # _V :
562
+ VIndexedStore<MOPSTIndexedUnord, w, "vsuxei" # eew # ".v">,
563
+ VSXSchedMC<eew, isOrdered=0>;
564
+ def VSOXEI # eew # _V :
565
+ VIndexedStore<MOPSTIndexedOrder, w, "vsoxei" # eew # ".v">,
566
+ VSXSchedMC<eew, isOrdered=1>;
569
567
}
570
568
571
569
multiclass VALU_IV_V<string opcodestr, bits<6> funct6> {
@@ -1020,18 +1018,12 @@ multiclass VCPR_MV_Mask<string opcodestr, bits<6> funct6, string vm = "v"> {
1020
1018
SchedBinaryMC<"WriteVCompressV", "ReadVCompressV", "ReadVCompressV">;
1021
1019
}
1022
1020
1023
- multiclass VWholeLoadN<bits<3> nf, string opcodestr, RegisterClass VRC> {
1024
- foreach l = [8, 16, 32] in {
1025
- defvar w = !cast<RISCVWidth>("LSWidth" # l);
1026
- defvar s = !cast<SchedWrite>("WriteVLD" # !add(nf, 1) # "R");
1021
+ multiclass VWholeLoadN<int l, bits<3> nf, string opcodestr, RegisterClass VRC> {
1022
+ defvar w = !cast<RISCVWidth>("LSWidth" # l);
1023
+ defvar s = !cast<SchedWrite>("WriteVLD" # !add(nf, 1) # "R");
1027
1024
1028
- def E # l # _V : VWholeLoad<nf, w, opcodestr # "e" # l # ".v", VRC>,
1029
- Sched<[s, ReadVLDX]>;
1030
- }
1031
- }
1032
- multiclass VWholeLoadEEW64<bits<3> nf, string opcodestr, RegisterClass VRC, SchedReadWrite schedrw> {
1033
- def E64_V : VWholeLoad<nf, LSWidth64, opcodestr # "e64.v", VRC>,
1034
- Sched<[schedrw, ReadVLDX]>;
1025
+ def E # l # _V : VWholeLoad<nf, w, opcodestr # "e" # l # ".v", VRC>,
1026
+ Sched<[s, ReadVLDX]>;
1035
1027
}
1036
1028
1037
1029
//===----------------------------------------------------------------------===//
@@ -1051,23 +1043,34 @@ def VSETVL : RVInstSetVL<(outs GPR:$rd), (ins GPR:$rs1, GPR:$rs2),
1051
1043
"vsetvl", "$rd, $rs1, $rs2">,
1052
1044
Sched<[WriteVSETVL, ReadVSETVL, ReadVSETVL]>;
1053
1045
} // hasSideEffects = 1, mayLoad = 0, mayStore = 0
1054
- foreach eew = [8, 16, 32] in {
1046
+ } // Predicates = [HasVInstructions]
1047
+
1048
+ foreach eew = [8, 16, 32, 64] in {
1055
1049
defvar w = !cast<RISCVWidth>("LSWidth" # eew);
1056
1050
1057
- // Vector Unit-Stride Instructions
1058
- def VLE#eew#_V : VUnitStrideLoad<w, "vle"#eew#".v">, VLESchedMC;
1059
- def VSE#eew#_V : VUnitStrideStore<w, "vse"#eew#".v">, VSESchedMC;
1051
+ let Predicates = !if(!eq(eew, 64), [HasVInstructionsI64],
1052
+ [HasVInstructions]) in {
1053
+ // Vector Unit-Stride Instructions
1054
+ def VLE#eew#_V : VUnitStrideLoad<w, "vle"#eew#".v">, VLESchedMC;
1055
+ def VSE#eew#_V : VUnitStrideStore<w, "vse"#eew#".v">, VSESchedMC;
1060
1056
1061
- // Vector Unit-Stride Fault-only-First Loads
1062
- def VLE#eew#FF_V : VUnitStrideLoadFF<w, "vle"#eew#"ff.v">, VLFSchedMC;
1057
+ // Vector Unit-Stride Fault-only-First Loads
1058
+ def VLE#eew#FF_V : VUnitStrideLoadFF<w, "vle"#eew#"ff.v">, VLFSchedMC;
1063
1059
1064
- // Vector Strided Instructions
1065
- def VLSE#eew#_V : VStridedLoad<w, "vlse"#eew#".v">, VLSSchedMC<eew>;
1066
- def VSSE#eew#_V : VStridedStore<w, "vsse"#eew#".v">, VSSSchedMC<eew>;
1067
- }
1060
+ // Vector Strided Instructions
1061
+ def VLSE#eew#_V : VStridedLoad<w, "vlse"#eew#".v">, VLSSchedMC<eew>;
1062
+ def VSSE#eew#_V : VStridedStore<w, "vsse"#eew#".v">, VSSSchedMC<eew>;
1068
1063
1069
- defm "" : VIndexLoadStore<[8, 16, 32]>;
1070
- } // Predicates = [HasVInstructions]
1064
+ defm VL1R : VWholeLoadN<eew, 0, "vl1r", VR>;
1065
+ defm VL2R : VWholeLoadN<eew, 1, "vl2r", VRM2>;
1066
+ defm VL4R : VWholeLoadN<eew, 3, "vl4r", VRM4>;
1067
+ defm VL8R : VWholeLoadN<eew, 7, "vl8r", VRM8>;
1068
+ }
1069
+
1070
+ let Predicates = !if(!eq(eew, 64), [IsRV64, HasVInstructionsI64],
1071
+ [HasVInstructions]) in
1072
+ defm "" : VIndexLoadStore<eew>;
1073
+ }
1071
1074
1072
1075
let Predicates = [HasVInstructions] in {
1073
1076
def VLM_V : VUnitStrideLoadMask<"vlm.v">,
@@ -1079,11 +1082,6 @@ def : InstAlias<"vle1.v $vd, (${rs1})",
1079
1082
def : InstAlias<"vse1.v $vs3, (${rs1})",
1080
1083
(VSM_V VR:$vs3, GPR:$rs1), 0>;
1081
1084
1082
- defm VL1R : VWholeLoadN<0, "vl1r", VR>;
1083
- defm VL2R : VWholeLoadN<1, "vl2r", VRM2>;
1084
- defm VL4R : VWholeLoadN<3, "vl4r", VRM4>;
1085
- defm VL8R : VWholeLoadN<7, "vl8r", VRM8>;
1086
-
1087
1085
def VS1R_V : VWholeStore<0, "vs1r.v", VR>,
1088
1086
Sched<[WriteVST1R, ReadVST1R, ReadVSTX]>;
1089
1087
def VS2R_V : VWholeStore<1, "vs2r.v", VRM2>,
@@ -1099,33 +1097,6 @@ def : InstAlias<"vl4r.v $vd, (${rs1})", (VL4RE8_V VRM4:$vd, GPR:$rs1)>;
1099
1097
def : InstAlias<"vl8r.v $vd, (${rs1})", (VL8RE8_V VRM8:$vd, GPR:$rs1)>;
1100
1098
} // Predicates = [HasVInstructions]
1101
1099
1102
- let Predicates = [HasVInstructionsI64] in {
1103
- // Vector Unit-Stride Instructions
1104
- def VLE64_V : VUnitStrideLoad<LSWidth64, "vle64.v">,
1105
- VLESchedMC;
1106
-
1107
- def VLE64FF_V : VUnitStrideLoadFF<LSWidth64, "vle64ff.v">,
1108
- VLFSchedMC;
1109
-
1110
- def VSE64_V : VUnitStrideStore<LSWidth64, "vse64.v">,
1111
- VSESchedMC;
1112
- // Vector Strided Instructions
1113
- def VLSE64_V : VStridedLoad<LSWidth64, "vlse64.v">,
1114
- VLSSchedMC<32>;
1115
-
1116
- def VSSE64_V : VStridedStore<LSWidth64, "vsse64.v">,
1117
- VSSSchedMC<64>;
1118
-
1119
- defm VL1R: VWholeLoadEEW64<0, "vl1r", VR, WriteVLD1R>;
1120
- defm VL2R: VWholeLoadEEW64<1, "vl2r", VRM2, WriteVLD2R>;
1121
- defm VL4R: VWholeLoadEEW64<3, "vl4r", VRM4, WriteVLD4R>;
1122
- defm VL8R: VWholeLoadEEW64<7, "vl8r", VRM8, WriteVLD8R>;
1123
- } // Predicates = [HasVInstructionsI64]
1124
- let Predicates = [IsRV64, HasVInstructionsI64] in {
1125
- // Vector Indexed Instructions
1126
- defm "" : VIndexLoadStore<[64]>;
1127
- } // [IsRV64, HasVInstructionsI64]
1128
-
1129
1100
let Predicates = [HasVInstructions] in {
1130
1101
// Vector Single-Width Integer Add and Subtract
1131
1102
defm VADD_V : VALU_IV_V_X_I<"vadd", 0b000000>;
0 commit comments