diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoV.td b/llvm/lib/Target/RISCV/RISCVInstrInfoV.td --- a/llvm/lib/Target/RISCV/RISCVInstrInfoV.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoV.td @@ -548,24 +548,22 @@ // Use these multiclasses to define instructions more easily. //===----------------------------------------------------------------------===// -multiclass VIndexLoadStore EEWList> { - foreach n = EEWList in { - defvar w = !cast("LSWidth" # n); - - def VLUXEI # n # _V : - VIndexedLoad, - VLXSchedMC; - def VLOXEI # n # _V : - VIndexedLoad, - VLXSchedMC; - - def VSUXEI # n # _V : - VIndexedStore, - VSXSchedMC; - def VSOXEI # n # _V : - VIndexedStore, - VSXSchedMC; - } +multiclass VIndexLoadStore { + defvar w = !cast("LSWidth" # eew); + + def VLUXEI # eew # _V : + VIndexedLoad, + VLXSchedMC; + def VLOXEI # eew # _V : + VIndexedLoad, + VLXSchedMC; + + def VSUXEI # eew # _V : + VIndexedStore, + VSXSchedMC; + def VSOXEI # eew # _V : + VIndexedStore, + VSXSchedMC; } multiclass VALU_IV_V funct6> { @@ -1020,18 +1018,12 @@ SchedBinaryMC<"WriteVCompressV", "ReadVCompressV", "ReadVCompressV">; } -multiclass VWholeLoadN nf, string opcodestr, RegisterClass VRC> { - foreach l = [8, 16, 32] in { - defvar w = !cast("LSWidth" # l); - defvar s = !cast("WriteVLD" # !add(nf, 1) # "R"); +multiclass VWholeLoadN nf, string opcodestr, RegisterClass VRC> { + defvar w = !cast("LSWidth" # l); + defvar s = !cast("WriteVLD" # !add(nf, 1) # "R"); - def E # l # _V : VWholeLoad, - Sched<[s, ReadVLDX]>; - } -} -multiclass VWholeLoadEEW64 nf, string opcodestr, RegisterClass VRC, SchedReadWrite schedrw> { - def E64_V : VWholeLoad, - Sched<[schedrw, ReadVLDX]>; + def E # l # _V : VWholeLoad, + Sched<[s, ReadVLDX]>; } //===----------------------------------------------------------------------===// @@ -1051,23 +1043,34 @@ "vsetvl", "$rd, $rs1, $rs2">, Sched<[WriteVSETVL, ReadVSETVL, ReadVSETVL]>; } // hasSideEffects = 1, mayLoad = 0, mayStore = 0 -foreach eew = [8, 16, 32] in { +} // Predicates = [HasVInstructions] + +foreach eew = [8, 16, 32, 64] in { defvar w = !cast("LSWidth" # eew); - // Vector Unit-Stride Instructions - def VLE#eew#_V : VUnitStrideLoad, VLESchedMC; - def VSE#eew#_V : VUnitStrideStore, VSESchedMC; + let Predicates = !if(!eq(eew, 64), [HasVInstructionsI64], + [HasVInstructions]) in { + // Vector Unit-Stride Instructions + def VLE#eew#_V : VUnitStrideLoad, VLESchedMC; + def VSE#eew#_V : VUnitStrideStore, VSESchedMC; - // Vector Unit-Stride Fault-only-First Loads - def VLE#eew#FF_V : VUnitStrideLoadFF, VLFSchedMC; + // Vector Unit-Stride Fault-only-First Loads + def VLE#eew#FF_V : VUnitStrideLoadFF, VLFSchedMC; - // Vector Strided Instructions - def VLSE#eew#_V : VStridedLoad, VLSSchedMC; - def VSSE#eew#_V : VStridedStore, VSSSchedMC; -} + // Vector Strided Instructions + def VLSE#eew#_V : VStridedLoad, VLSSchedMC; + def VSSE#eew#_V : VStridedStore, VSSSchedMC; -defm "" : VIndexLoadStore<[8, 16, 32]>; -} // Predicates = [HasVInstructions] + defm VL1R : VWholeLoadN; + defm VL2R : VWholeLoadN; + defm VL4R : VWholeLoadN; + defm VL8R : VWholeLoadN; + } + + let Predicates = !if(!eq(eew, 64), [IsRV64, HasVInstructionsI64], + [HasVInstructions]) in + defm "" : VIndexLoadStore; +} let Predicates = [HasVInstructions] in { def VLM_V : VUnitStrideLoadMask<"vlm.v">, @@ -1079,11 +1082,6 @@ def : InstAlias<"vse1.v $vs3, (${rs1})", (VSM_V VR:$vs3, GPR:$rs1), 0>; -defm VL1R : VWholeLoadN<0, "vl1r", VR>; -defm VL2R : VWholeLoadN<1, "vl2r", VRM2>; -defm VL4R : VWholeLoadN<3, "vl4r", VRM4>; -defm VL8R : VWholeLoadN<7, "vl8r", VRM8>; - def VS1R_V : VWholeStore<0, "vs1r.v", VR>, Sched<[WriteVST1R, ReadVST1R, ReadVSTX]>; def VS2R_V : VWholeStore<1, "vs2r.v", VRM2>, @@ -1099,33 +1097,6 @@ def : InstAlias<"vl8r.v $vd, (${rs1})", (VL8RE8_V VRM8:$vd, GPR:$rs1)>; } // Predicates = [HasVInstructions] -let Predicates = [HasVInstructionsI64] in { -// Vector Unit-Stride Instructions -def VLE64_V : VUnitStrideLoad, - VLESchedMC; - -def VLE64FF_V : VUnitStrideLoadFF, - VLFSchedMC; - -def VSE64_V : VUnitStrideStore, - VSESchedMC; -// Vector Strided Instructions -def VLSE64_V : VStridedLoad, - VLSSchedMC<32>; - -def VSSE64_V : VStridedStore, - VSSSchedMC<64>; - -defm VL1R: VWholeLoadEEW64<0, "vl1r", VR, WriteVLD1R>; -defm VL2R: VWholeLoadEEW64<1, "vl2r", VRM2, WriteVLD2R>; -defm VL4R: VWholeLoadEEW64<3, "vl4r", VRM4, WriteVLD4R>; -defm VL8R: VWholeLoadEEW64<7, "vl8r", VRM8, WriteVLD8R>; -} // Predicates = [HasVInstructionsI64] -let Predicates = [IsRV64, HasVInstructionsI64] in { - // Vector Indexed Instructions - defm "" : VIndexLoadStore<[64]>; -} // [IsRV64, HasVInstructionsI64] - let Predicates = [HasVInstructions] in { // Vector Single-Width Integer Add and Subtract defm VADD_V : VALU_IV_V_X_I<"vadd", 0b000000>;