Skip to content

Commit 6c45b0f

Browse files
committed
[RISCV] Refactor to reduce some duplication in RISCVInstrInfoV.td. NFC
We had some load/store patterns split because EEW=64 needed a different predicate. Refactor where the foreach is place and use the foreach value to pick the predicate. Reviewed By: wangpc Differential Revision: https://reviews.llvm.org/D157176
1 parent f48969f commit 6c45b0f

File tree

1 file changed

+44
-73
lines changed

1 file changed

+44
-73
lines changed

llvm/lib/Target/RISCV/RISCVInstrInfoV.td

Lines changed: 44 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -548,24 +548,22 @@ class VALUVs2NoVm<bits<6> funct6, bits<5> vs1, RISCVVFormat opv, string opcodest
548548
// Use these multiclasses to define instructions more easily.
549549
//===----------------------------------------------------------------------===//
550550

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>;
569567
}
570568

571569
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"> {
10201018
SchedBinaryMC<"WriteVCompressV", "ReadVCompressV", "ReadVCompressV">;
10211019
}
10221020

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");
10271024

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]>;
10351027
}
10361028

10371029
//===----------------------------------------------------------------------===//
@@ -1051,23 +1043,34 @@ def VSETVL : RVInstSetVL<(outs GPR:$rd), (ins GPR:$rs1, GPR:$rs2),
10511043
"vsetvl", "$rd, $rs1, $rs2">,
10521044
Sched<[WriteVSETVL, ReadVSETVL, ReadVSETVL]>;
10531045
} // 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 {
10551049
defvar w = !cast<RISCVWidth>("LSWidth" # eew);
10561050

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;
10601056

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;
10631059

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>;
10681063

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+
}
10711074

10721075
let Predicates = [HasVInstructions] in {
10731076
def VLM_V : VUnitStrideLoadMask<"vlm.v">,
@@ -1079,11 +1082,6 @@ def : InstAlias<"vle1.v $vd, (${rs1})",
10791082
def : InstAlias<"vse1.v $vs3, (${rs1})",
10801083
(VSM_V VR:$vs3, GPR:$rs1), 0>;
10811084

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-
10871085
def VS1R_V : VWholeStore<0, "vs1r.v", VR>,
10881086
Sched<[WriteVST1R, ReadVST1R, ReadVSTX]>;
10891087
def VS2R_V : VWholeStore<1, "vs2r.v", VRM2>,
@@ -1099,33 +1097,6 @@ def : InstAlias<"vl4r.v $vd, (${rs1})", (VL4RE8_V VRM4:$vd, GPR:$rs1)>;
10991097
def : InstAlias<"vl8r.v $vd, (${rs1})", (VL8RE8_V VRM8:$vd, GPR:$rs1)>;
11001098
} // Predicates = [HasVInstructions]
11011099

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-
11291100
let Predicates = [HasVInstructions] in {
11301101
// Vector Single-Width Integer Add and Subtract
11311102
defm VADD_V : VALU_IV_V_X_I<"vadd", 0b000000>;

0 commit comments

Comments
 (0)