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 @@ -98,54 +98,91 @@ // Scheduling definitions. //===----------------------------------------------------------------------===// -class VMVRSched: Sched <[!cast("WriteVMov" # n # "V"), - !cast("ReadVMov" # n # "V")]>; - -class VLESched : Sched <[WriteVLDE, ReadVLDX, ReadVMask]>; - -class VSESched : Sched <[WriteVSTE, ReadVSTEV, ReadVSTX, ReadVMask]>; - -class VLSSched : Sched <[!cast("WriteVLDS" # n), - ReadVLDX, ReadVLDSX, ReadVMask]>; - -class VSSSched : Sched <[!cast("WriteVSTS" # n), - !cast("ReadVSTS" # n # "V"), - ReadVSTX, ReadVSTSX, ReadVMask]>; - -class VLXSched : - Sched <[!cast("WriteVLD" # o # "X" # n), - ReadVLDX, !cast("ReadVLD" # o # "XV"), ReadVMask]>; - -class VSXSched : - Sched <[!cast("WriteVST" # o # "X" # n), - !cast("ReadVST" # o # "X" # n), - ReadVSTX, !cast("ReadVST" # o # "XV"), ReadVMask]>; - -class VLFSched : Sched <[WriteVLDFF, ReadVLDX, ReadVMask]>; +class VMVRSched : Sched<[ + !cast("WriteVMov" #n #"V"), + !cast("ReadVMov" #n #"V") +]>; + +class VLESched : Sched<[ + !cast("WriteVLDE_" #mx), + !cast("ReadVLDX_" #mx), ReadVMask +]>; + +class VSESched : Sched<[ + !cast("WriteVSTE_" #mx), + !cast("ReadVSTEV_" #mx), + !cast("ReadVSTX_" #mx), ReadVMask +]>; + +class VLSSched : Sched<[ + !cast("WriteVLDS" #n #"_" #mx), + !cast("ReadVLDX_" #mx), + !cast("ReadVLDSX_" #mx), ReadVMask +]>; + +class VSSSched : Sched<[ + !cast("WriteVSTS" #n #"_" #mx), + !cast("ReadVSTS" #n #"V_" #mx), + !cast("ReadVSTX_" #mx), + !cast("ReadVSTSX_" #mx), ReadVMask +]>; + +class VLXSched : Sched<[ + !cast("WriteVLD" #o #"X" #n #"_" #mx), + !cast("ReadVLDX_" #mx), + !cast("ReadVLD" #o #"XV_" #mx), ReadVMask +]>; + +class VSXSched : Sched<[ + !cast("WriteVST" #o #"X" #n #"_" #mx), + !cast("ReadVST" #o #"X" #n #"_" #mx), + !cast("ReadVSTX_" #mx), + !cast("ReadVST" #o #"XV_" #mx), ReadVMask +]>; + +class VLFSched : Sched<[ + !cast("WriteVLDFF_" #mx), + !cast("ReadVLDX_" #mx), ReadVMask +]>; // Unit-Stride Segment Loads and Stores -class VLSEGSched : Sched<[ - !cast("WriteVLSEG" #nf #"e" #eew), ReadVLDX, ReadVMask]>; -class VSSEGSched : Sched<[ - !cast("WriteVSSEG" #nf #"e" #eew), ReadVSTEV, ReadVSTX, - ReadVMask]>; -class VLSEGFFSched : Sched<[ - !cast("WriteVLSEGFF" #nf #"e" #eew), ReadVLDX, ReadVMask]>; +class VLSEGSched : Sched<[ + !cast("WriteVLSEG" #nf #"e" #eew #"_" #mx), + !cast("ReadVLDX_" #mx), ReadVMask +]>; +class VSSEGSched : Sched<[ + !cast("WriteVSSEG" #nf #"e" #eew #"_" #mx), + !cast("ReadVSTEV_" #mx), + !cast("ReadVSTX_" #mx), ReadVMask +]>; +class VLSEGFFSched : Sched<[ + !cast("WriteVLSEGFF" #nf #"e" #eew #"_" #mx), + !cast("ReadVLDX_" #mx), ReadVMask +]>; // Strided Segment Loads and Stores -class VLSSEGSched : Sched<[ - !cast("WriteVLSSEG" #nf #"e" #eew), ReadVLDX, ReadVLDSX, - ReadVMask]>; -class VSSSEGSched : Sched<[ - !cast("WriteVSSSEG" #nf #"e" #eew), - !cast("ReadVSTS" #eew #"V"), ReadVSTX, ReadVSTSX, ReadVMask]>; +class VLSSEGSched : Sched<[ + !cast("WriteVLSSEG" #nf #"e" #eew #"_" #mx), + !cast("ReadVLDX_" #mx), + !cast("ReadVLDSX_" #mx), ReadVMask +]>; +class VSSSEGSched : Sched<[ + !cast("WriteVSSSEG" #nf #"e" #eew #"_" #mx), + !cast("ReadVSTS" #eew #"V" #"_" #mx), + !cast("ReadVSTX_" #mx), + !cast("ReadVSTSX_" #mx), ReadVMask +]>; // Indexed Segment Loads and Stores -class VLXSEGSched : Sched<[ - !cast("WriteVL" #o # "XSEG" #nf #"e" #eew), ReadVLDX, - !cast("ReadVLD" # o # "XV"), ReadVMask]>; -class VSXSEGSched : Sched<[ - !cast("WriteVS" #o # "XSEG" #nf #"e" #eew), - !cast("ReadVST" #o # "X" #eew), ReadVSTX, - !cast("ReadVST" #o # "XV"), ReadVMask]>; +class VLXSEGSched : Sched<[ + !cast("WriteVL" #o #"XSEG" #nf #"e" #eew #"_" #mx), + !cast("ReadVLDX_" #mx), + !cast("ReadVLD" #o #"XV" #"_" #mx), ReadVMask +]>; +class VSXSEGSched : Sched<[ + !cast("WriteVS" #o #"XSEG" #nf #"e" #eew #"_" #mx), + !cast("ReadVST" #o #"X" #eew # "_" # mx), + !cast("ReadVSTX_" #mx), + !cast("ReadVST" #o #"XV" # "_" # mx), ReadVMask +]>; //===----------------------------------------------------------------------===// // Instruction class templates @@ -386,17 +423,17 @@ def VLUXEI # n # _V : VIndexedLoad, - VLXSched; + VLXSched; def VLOXEI # n # _V : VIndexedLoad, - VLXSched; + VLXSched; def VSUXEI # n # _V : VIndexedStore, - VSXSched; + VSXSched; def VSOXEI # n # _V : VIndexedStore, - VSXSched; + VSXSched; } } @@ -719,17 +756,20 @@ multiclass VMALU_MV_Mask funct6, string vm = "v"> { def M : VALUVVNoVm, - Sched<[WriteVMALUV, ReadVMALUV, ReadVMALUV]>; + Sched<[WriteVMALUV_UpperBound, ReadVMALUV_UpperBound, + ReadVMALUV_UpperBound]>; } multiclass VMSFS_MV_V funct6, bits<5> vs1> { def "" : VALUVs2, - Sched<[WriteVMSFSV, ReadVMSFSV, ReadVMask]>; + Sched<[WriteVMSFSV_UpperBound, ReadVMSFSV_UpperBound, + ReadVMask]>; } multiclass VMIOT_MV_V funct6, bits<5> vs1> { def "" : VALUVs2, - Sched<[WriteVMIotV, ReadVMIotV, ReadVMask]>; + Sched<[WriteVMIotV_UpperBound, ReadVMIotV_UpperBound, + ReadVMask]>; } multiclass VSHT_IV_V_X_I funct6, Operand optype = simm5, string vw = "v"> { @@ -878,33 +918,41 @@ multiclass VSLD_IV_X_I funct6, Operand optype = simm5, string vw = "v"> { def X : VALUVX, - Sched<[WriteVISlideX, ReadVISlideV, ReadVISlideX, ReadVMask]>; + Sched<[WriteVISlideX_UpperBound, ReadVISlideV_UpperBound, + ReadVISlideX_UpperBound, ReadVMask]>; def I : VALUVI, - Sched<[WriteVISlideI, ReadVISlideV, ReadVMask]>; + Sched<[WriteVISlideI_UpperBound, ReadVISlideV_UpperBound, + ReadVMask]>; } multiclass VSLD1_MV_X funct6, string vw = "v"> { def X : VALUVX, - Sched<[WriteVISlide1X, ReadVISlideV, ReadVISlideX, ReadVMask]>; + Sched<[WriteVISlide1X_UpperBound, ReadVISlideV_UpperBound, + ReadVISlideX_UpperBound, ReadVMask]>; } multiclass VSLD1_FV_F funct6, string vw = "v"> { def F : VALUVF, - Sched<[WriteVFSlide1F, ReadVFSlideV, ReadVFSlideF, ReadVMask]>; + Sched<[WriteVFSlide1F_UpperBound, ReadVFSlideV_UpperBound, + ReadVFSlideF_UpperBound, ReadVMask]>; } multiclass VGTR_IV_V_X_I funct6, Operand optype = simm5, string vw = "v"> { def V : VALUVV, - Sched<[WriteVGatherV, ReadVGatherV, ReadVGatherV, ReadVMask]>; + Sched<[WriteVGatherV_UpperBound, ReadVGatherV_UpperBound, + ReadVGatherV_UpperBound, ReadVMask]>; def X : VALUVX, - Sched<[WriteVGatherX, ReadVGatherV, ReadVGatherX, ReadVMask]>; + Sched<[WriteVGatherX_UpperBound, ReadVGatherV_UpperBound, + ReadVGatherX_UpperBound, ReadVMask]>; def I : VALUVI, - Sched<[WriteVGatherI, ReadVGatherV, ReadVMask]>; + Sched<[WriteVGatherI_UpperBound, ReadVGatherV_UpperBound, + ReadVMask]>; } multiclass VCPR_MV_Mask funct6, string vm = "v"> { def M : VALUVVNoVm, - Sched<[WriteVCompressV, ReadVCompressV, ReadVCompressV]>; + Sched<[WriteVCompressV_UpperBound, ReadVCompressV_UpperBound, + ReadVCompressV_UpperBound]>; } multiclass VWholeLoadN nf, string opcodestr, RegisterClass VRC> { @@ -913,12 +961,12 @@ defvar s = !cast("WriteVLD" # !add(nf, 1) # "R"); def E # l # _V : VWholeLoad, - Sched<[s, ReadVLDX]>; + Sched<[s, ReadVLDX_UpperBound]>; } } multiclass VWholeLoadEEW64 nf, string opcodestr, RegisterClass VRC, SchedReadWrite schedrw> { def E64_V : VWholeLoad, - Sched<[schedrw, ReadVLDX]>; + Sched<[schedrw, ReadVLDX_UpperBound]>; } //===----------------------------------------------------------------------===// @@ -942,15 +990,15 @@ defvar w = !cast("LSWidth" # eew); // Vector Unit-Stride Instructions - def VLE#eew#_V : VUnitStrideLoad, VLESched; - def VSE#eew#_V : VUnitStrideStore, VSESched; + def VLE#eew#_V : VUnitStrideLoad, VLESched; + def VSE#eew#_V : VUnitStrideStore, VSESched; // Vector Unit-Stride Fault-only-First Loads - def VLE#eew#FF_V : VUnitStrideLoadFF, VLFSched; + def VLE#eew#FF_V : VUnitStrideLoadFF, VLFSched; // Vector Strided Instructions - def VLSE#eew#_V : VStridedLoad, VLSSched; - def VSSE#eew#_V : VStridedStore, VSSSched; + def VLSE#eew#_V : VStridedLoad, VLSSched; + def VSSE#eew#_V : VStridedStore, VSSSched; } defm "" : VIndexLoadStore<[8, 16, 32]>; @@ -958,9 +1006,9 @@ let Predicates = [HasVInstructions] in { def VLM_V : VUnitStrideLoadMask<"vlm.v">, - Sched<[WriteVLDM, ReadVLDX]>; + Sched<[WriteVLDM_UpperBound, ReadVLDX_UpperBound]>; def VSM_V : VUnitStrideStoreMask<"vsm.v">, - Sched<[WriteVSTM, ReadVSTM, ReadVSTX]>; + Sched<[WriteVSTM_UpperBound, ReadVSTM_UpperBound, ReadVSTX_UpperBound]>; def : InstAlias<"vle1.v $vd, (${rs1})", (VLM_V VR:$vd, GPR:$rs1), 0>; def : InstAlias<"vse1.v $vs3, (${rs1})", @@ -972,13 +1020,13 @@ defm VL8R : VWholeLoadN<7, "vl8r", VRM8>; def VS1R_V : VWholeStore<0, "vs1r.v", VR>, - Sched<[WriteVST1R, ReadVST1R, ReadVSTX]>; + Sched<[WriteVST1R, ReadVST1R, ReadVSTX_UpperBound]>; def VS2R_V : VWholeStore<1, "vs2r.v", VRM2>, - Sched<[WriteVST2R, ReadVST2R, ReadVSTX]>; + Sched<[WriteVST2R, ReadVST2R, ReadVSTX_UpperBound]>; def VS4R_V : VWholeStore<3, "vs4r.v", VRM4>, - Sched<[WriteVST4R, ReadVST4R, ReadVSTX]>; + Sched<[WriteVST4R, ReadVST4R, ReadVSTX_UpperBound]>; def VS8R_V : VWholeStore<7, "vs8r.v", VRM8>, - Sched<[WriteVST8R, ReadVST8R, ReadVSTX]>; + Sched<[WriteVST8R, ReadVST8R, ReadVSTX_UpperBound]>; def : InstAlias<"vl1r.v $vd, (${rs1})", (VL1RE8_V VR:$vd, GPR:$rs1)>; def : InstAlias<"vl2r.v $vd, (${rs1})", (VL2RE8_V VRM2:$vd, GPR:$rs1)>; @@ -989,19 +1037,19 @@ let Predicates = [HasVInstructionsI64] in { // Vector Unit-Stride Instructions def VLE64_V : VUnitStrideLoad, - VLESched; + VLESched; def VLE64FF_V : VUnitStrideLoadFF, - VLFSched; + VLFSched; def VSE64_V : VUnitStrideStore, - VSESched; + VSESched; // Vector Strided Instructions def VLSE64_V : VStridedLoad, - VLSSched<32>; + VLSSched<32, UpperBoundLMUL>; def VSSE64_V : VStridedStore, - VSSSched<64>; + VSSSched<64, UpperBoundLMUL>; defm VL1R: VWholeLoadEEW64<0, "vl1r", VR, WriteVLD1R>; defm VL2R: VWholeLoadEEW64<1, "vl2r", VRM2, WriteVLD2R>; @@ -1519,13 +1567,15 @@ def VCPOP_M : RVInstV<0b010000, 0b10000, OPMVV, (outs GPR:$vd), (ins VR:$vs2, VMaskOp:$vm), "vcpop.m", "$vd, $vs2$vm">, - Sched<[WriteVMPopV, ReadVMPopV, ReadVMask]>; + Sched<[WriteVMPopV_UpperBound, ReadVMPopV_UpperBound, + ReadVMask]>; // vfirst find-first-set mask bit def VFIRST_M : RVInstV<0b010000, 0b10001, OPMVV, (outs GPR:$vd), (ins VR:$vs2, VMaskOp:$vm), "vfirst.m", "$vd, $vs2$vm">, - Sched<[WriteVMFFSV, ReadVMFFSV, ReadVMask]>; + Sched<[WriteVMFFSV_UpperBound, ReadVMFFSV_UpperBound, + ReadVMask]>; } // hasSideEffects = 0, mayLoad = 0, mayStore = 0 @@ -1551,17 +1601,18 @@ let vs2 = 0 in def VID_V : RVInstV<0b010100, 0b10001, OPMVV, (outs VR:$vd), (ins VMaskOp:$vm), "vid.v", "$vd$vm">, - Sched<[WriteVMIdxV, ReadVMask]>; + Sched<[WriteVMIdxV_UpperBound, ReadVMask]>; // Integer Scalar Move Instructions let vm = 1, RVVConstraint = NoConstraint in { def VMV_X_S : RVInstV<0b010000, 0b00000, OPMVV, (outs GPR:$vd), (ins VR:$vs2), "vmv.x.s", "$vd, $vs2">, - Sched<[WriteVIMovVX, ReadVIMovVX]>; + Sched<[WriteVIMovVX_UpperBound, ReadVIMovVX_UpperBound]>; let Constraints = "$vd = $vd_wb" in def VMV_S_X : RVInstV2<0b010000, 0b00000, OPMVX, (outs VR:$vd_wb), (ins VR:$vd, GPR:$rs1), "vmv.s.x", "$vd, $rs1">, - Sched<[WriteVIMovXV, ReadVIMovXV, ReadVIMovXX]>; + Sched<[WriteVIMovXV_UpperBound, ReadVIMovXV_UpperBound, + ReadVIMovXX_UpperBound]>; } } // hasSideEffects = 0, mayLoad = 0, mayStore = 0 @@ -1575,11 +1626,12 @@ // Floating-Point Scalar Move Instructions def VFMV_F_S : RVInstV<0b010000, 0b00000, OPFVV, (outs FPR32:$vd), (ins VR:$vs2), "vfmv.f.s", "$vd, $vs2">, - Sched<[WriteVFMovVF, ReadVFMovVF]>; + Sched<[WriteVFMovVF_UpperBound, ReadVFMovVF_UpperBound]>; let Constraints = "$vd = $vd_wb" in def VFMV_S_F : RVInstV2<0b010000, 0b00000, OPFVF, (outs VR:$vd_wb), (ins VR:$vd, FPR32:$rs1), "vfmv.s.f", "$vd, $rs1">, - Sched<[WriteVFMovFV, ReadVFMovFV, ReadVFMovFX]>; + Sched<[WriteVFMovFV_UpperBound, ReadVFMovFV_UpperBound, + ReadVFMovFX_UpperBound]>; } // hasSideEffects = 0, mayLoad = 0, mayStore = 0, vm = 1 @@ -1607,7 +1659,8 @@ let Constraints = "@earlyclobber $vd", RVVConstraint = Vrgather in { defm VRGATHER_V : VGTR_IV_V_X_I<"vrgather", 0b001100, uimm5>; def VRGATHEREI16_VV : VALUVV<0b001110, OPIVV, "vrgatherei16.vv">, - Sched<[WriteVGatherV, ReadVGatherV, ReadVGatherV]>; + Sched<[WriteVGatherV_UpperBound, ReadVGatherV_UpperBound, + ReadVGatherV_UpperBound]>; } // Constraints = "@earlyclobber $vd", RVVConstraint = Vrgather // Vector Compress Instruction @@ -1637,38 +1690,38 @@ def VLSEG#nf#E#eew#_V : VUnitStrideSegmentLoad, - VLSEGSched; + VLSEGSched; def VLSEG#nf#E#eew#FF_V : VUnitStrideSegmentLoadFF, - VLSEGFFSched; + VLSEGFFSched; def VSSEG#nf#E#eew#_V : VUnitStrideSegmentStore, - VSSEGSched; + VSSEGSched; // Vector Strided Instructions def VLSSEG#nf#E#eew#_V : VStridedSegmentLoad, - VLSSEGSched; + VLSSEGSched; def VSSSEG#nf#E#eew#_V : VStridedSegmentStore, - VSSSEGSched; + VSSSEGSched; // Vector Indexed Instructions def VLUXSEG#nf#EI#eew#_V : VIndexedSegmentLoad, - VLXSEGSched; + VLXSEGSched; def VLOXSEG#nf#EI#eew#_V : VIndexedSegmentLoad, - VLXSEGSched; + VLXSEGSched; def VSUXSEG#nf#EI#eew#_V : VIndexedSegmentStore, - VSXSEGSched; + VSXSEGSched; def VSOXSEG#nf#EI#eew#_V : VIndexedSegmentStore, - VSXSEGSched; + VSXSEGSched; } } } // Predicates = [HasVInstructions] @@ -1678,38 +1731,42 @@ // Vector Unit-strided Segment Instructions def VLSEG#nf#E64_V : VUnitStrideSegmentLoad, - VLSEGSched; + VLSEGSched; def VLSEG#nf#E64FF_V : VUnitStrideSegmentLoadFF, - VLSEGFFSched; + VLSEGFFSched; def VSSEG#nf#E64_V : VUnitStrideSegmentStore, - VSSEGSched; + VSSEGSched; // Vector Strided Segment Instructions def VLSSEG#nf#E64_V : VStridedSegmentLoad, - VLSSEGSched; + VLSSEGSched; def VSSSEG#nf#E64_V : VStridedSegmentStore, - VSSSEGSched; + VSSSEGSched; } } // Predicates = [HasVInstructionsI64] let Predicates = [HasVInstructionsI64, IsRV64] in { - foreach nf=2-8 in { + foreach nf = 2 - 8 in { // Vector Indexed Segment Instructions - def VLUXSEG#nf#EI64_V : - VIndexedSegmentLoad, VLXSEGSched; - def VLOXSEG#nf#EI64_V : - VIndexedSegmentLoad, VLXSEGSched; - def VSUXSEG#nf#EI64_V : - VIndexedSegmentStore, VSXSEGSched; - def VSOXSEG#nf#EI64_V : - VIndexedSegmentStore, VSXSEGSched; + def VLUXSEG #nf #EI64_V + : VIndexedSegmentLoad, + VLXSEGSched; + def VLOXSEG #nf #EI64_V + : VIndexedSegmentLoad, + VLXSEGSched; + def VSUXSEG #nf #EI64_V + : VIndexedSegmentStore, + VSXSEGSched; + def VSOXSEG #nf #EI64_V + : VIndexedSegmentStore, + VSXSEGSched; } } // Predicates = [HasVInstructionsI64, IsRV64] diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td b/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td --- a/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td @@ -1607,14 +1607,14 @@ let VLMul = lmul.value in { def "E" # eew # "_V_" # LInfo : VPseudoUSLoadNoMask, - VLESched; + VLESched; def "E" # eew # "_V_" # LInfo # "_TU": VPseudoUSLoadNoMaskTU, - VLESched; + VLESched; def "E" # eew # "_V_" # LInfo # "_MASK" : VPseudoUSLoadMask, RISCVMaskedPseudo, - VLESched; + VLESched; } } } @@ -1628,14 +1628,14 @@ let VLMul = lmul.value in { def "E" # eew # "FF_V_" # LInfo: VPseudoUSLoadFFNoMask, - VLFSched; + VLFSched; def "E" # eew # "FF_V_" # LInfo # "_TU": VPseudoUSLoadFFNoMaskTU, - VLFSched; + VLFSched; def "E" # eew # "FF_V_" # LInfo # "_MASK": VPseudoUSLoadFFMask, RISCVMaskedPseudo, - VLFSched; + VLFSched; } } } @@ -1643,8 +1643,12 @@ multiclass VPseudoLoadMask { foreach mti = AllMasks in { + defvar mx = mti.LMul.MX; + defvar WriteVLDM_MX = !cast("WriteVLDM_" # mx); + defvar ReadVLDX_MX = !cast("ReadVLDX_" # mx); let VLMul = mti.LMul.value in { - def "_V_" # mti.BX : VPseudoUSLoadNoMask; + def "_V_" # mti.BX : VPseudoUSLoadNoMask, + Sched<[WriteVLDM_MX, ReadVLDX_MX]>; } } } @@ -1656,13 +1660,13 @@ defvar vreg = lmul.vrclass; let VLMul = lmul.value in { def "E" # eew # "_V_" # LInfo : VPseudoSLoadNoMask, - VLSSched; + VLSSched; def "E" # eew # "_V_" # LInfo # "_TU": VPseudoSLoadNoMaskTU, - VLSSched; + VLSSched; def "E" # eew # "_V_" # LInfo # "_MASK" : VPseudoSLoadMask, RISCVMaskedPseudo, - VLSSched; + VLSSched; } } } @@ -1686,14 +1690,14 @@ let VLMul = lmul.value in { def "EI" # eew # "_V_" # IdxLInfo # "_" # LInfo : VPseudoILoadNoMask, - VLXSched; + VLXSched; def "EI" # eew # "_V_" # IdxLInfo # "_" # LInfo # "_TU": VPseudoILoadNoMaskTU, - VLXSched; + VLXSched; def "EI" # eew # "_V_" # IdxLInfo # "_" # LInfo # "_MASK" : VPseudoILoadMask, RISCVMaskedPseudo, - VLXSched; + VLXSched; } } } @@ -1708,9 +1712,9 @@ defvar vreg = lmul.vrclass; let VLMul = lmul.value in { def "E" # eew # "_V_" # LInfo : VPseudoUSStoreNoMask, - VSESched; + VSESched; def "E" # eew # "_V_" # LInfo # "_MASK" : VPseudoUSStoreMask, - VSESched; + VSESched; } } } @@ -1718,8 +1722,12 @@ multiclass VPseudoStoreMask { foreach mti = AllMasks in { + defvar mx = mti.LMul.MX; + defvar WriteVSTM_MX = !cast("WriteVSTM_" # mx); + defvar ReadVSTX_MX = !cast("ReadVSTX_" # mx); let VLMul = mti.LMul.value in { - def "_V_" # mti.BX : VPseudoUSStoreNoMask; + def "_V_" # mti.BX : VPseudoUSStoreNoMask, + Sched<[WriteVSTM_MX, ReadVSTX_MX]>; } } } @@ -1731,9 +1739,9 @@ defvar vreg = lmul.vrclass; let VLMul = lmul.value in { def "E" # eew # "_V_" # LInfo : VPseudoSStoreNoMask, - VSSSched; + VSSSched; def "E" # eew # "_V_" # LInfo # "_MASK" : VPseudoSStoreMask, - VSSSched; + VSSSched; } } } @@ -1756,10 +1764,10 @@ let VLMul = lmul.value in { def "EI" # eew # "_V_" # IdxLInfo # "_" # LInfo : VPseudoIStoreNoMask, - VSXSched; + VSXSched; def "EI" # eew # "_V_" # IdxLInfo # "_" # LInfo # "_MASK" : VPseudoIStoreMask, - VSXSched; + VSXSched; } } } @@ -1770,11 +1778,14 @@ multiclass VPseudoVPOP_M { foreach mti = AllMasks in { + defvar mx = mti.LMul.MX; + defvar WriteVMPopV_MX = !cast("WriteVMPopV_" # mx); + defvar ReadVMPopV_MX = !cast("ReadVMPopV_" # mx); let VLMul = mti.LMul.value in { def "_M_" # mti.BX : VPseudoUnaryNoMask, - Sched<[WriteVMPopV, ReadVMPopV, ReadVMPopV]>; + Sched<[WriteVMPopV_MX, ReadVMPopV_MX, ReadVMPopV_MX]>; def "_M_" # mti.BX # "_MASK" : VPseudoMaskUnarySOutMask, - Sched<[WriteVMPopV, ReadVMPopV, ReadVMPopV]>; + Sched<[WriteVMPopV_MX, ReadVMPopV_MX, ReadVMPopV_MX]>; } } } @@ -1782,11 +1793,14 @@ multiclass VPseudoV1ST_M { foreach mti = AllMasks in { + defvar mx = mti.LMul.MX; + defvar WriteVMFFSV_MX = !cast("WriteVMFFSV_" # mx); + defvar ReadVMFFSV_MX = !cast("ReadVMFFSV_" # mx); let VLMul = mti.LMul.value in { def "_M_" # mti.BX : VPseudoUnaryNoMask, - Sched<[WriteVMFFSV, ReadVMFFSV, ReadVMFFSV]>; + Sched<[WriteVMFFSV_MX, ReadVMFFSV_MX, ReadVMFFSV_MX]>; def "_M_" # mti.BX # "_MASK" : VPseudoMaskUnarySOutMask, - Sched<[WriteVMFFSV, ReadVMFFSV, ReadVMFFSV]>; + Sched<[WriteVMFFSV_MX, ReadVMFFSV_MX, ReadVMFFSV_MX]>; } } } @@ -1795,33 +1809,45 @@ defvar constraint = "@earlyclobber $rd"; foreach mti = AllMasks in { + defvar mx = mti.LMul.MX; + defvar WriteVMSFSV_MX = !cast("WriteVMSFSV_" # mx); + defvar ReadVMSFSV_MX = !cast("ReadVMSFSV_" # mx); let VLMul = mti.LMul.value in { def "_M_" # mti.BX : VPseudoUnaryNoMask, - Sched<[WriteVMSFSV, ReadVMSFSV, ReadVMask]>; + Sched<[WriteVMSFSV_MX, ReadVMSFSV_MX, ReadVMask]>; def "_M_" # mti.BX # "_MASK" : VPseudoUnaryMask, - Sched<[WriteVMSFSV, ReadVMSFSV, ReadVMask]>; + Sched<[WriteVMSFSV_MX, ReadVMSFSV_MX, ReadVMask]>; } } } multiclass VPseudoVID_V { foreach m = MxList in { + defvar mx = m.MX; + defvar WriteVMIdxV_MX = !cast("WriteVMIdxV_" # mx); + defvar ReadVMIdxV_MX = !cast("ReadVMIdxV_" # mx); + let VLMul = m.value in { def "_V_" # m.MX : VPseudoNullaryNoMask, - Sched<[WriteVMIdxV, ReadVMask]>; + Sched<[WriteVMIdxV_MX, ReadVMask]>; def "_V_" # m.MX # "_TU": VPseudoNullaryNoMaskTU, - Sched<[WriteVMIdxV, ReadVMask]>; + Sched<[WriteVMIdxV_MX, ReadVMask]>; def "_V_" # m.MX # "_MASK" : VPseudoNullaryMask, RISCVMaskedPseudo, - Sched<[WriteVMIdxV, ReadVMask]>; + Sched<[WriteVMIdxV_MX, ReadVMask]>; } } } multiclass VPseudoNullaryPseudoM { foreach mti = AllMasks in { + defvar mx = mti.LMul.MX; + defvar WriteVMALUV_MX = !cast("WriteVMALUV_" # mx); + defvar ReadVMALUV_MX = !cast("ReadVMALUV_" # mx); + let VLMul = mti.LMul.value in { - def "_M_" # mti.BX : VPseudoNullaryPseudoM; + def "_M_" # mti.BX : VPseudoNullaryPseudoM, + Sched<[WriteVMALUV_MX, ReadVMALUV_MX, ReadVMALUV_MX]>; } } } @@ -1829,23 +1855,30 @@ multiclass VPseudoVIOT_M { defvar constraint = "@earlyclobber $rd"; foreach m = MxList in { + defvar mx = m.MX; + defvar WriteVMIotV_MX = !cast("WriteVMIotV_" # mx); + defvar ReadVMIotV_MX = !cast("ReadVMIotV_" # mx); let VLMul = m.value in { def "_" # m.MX : VPseudoUnaryNoMask, - Sched<[WriteVMIotV, ReadVMIotV, ReadVMask]>; + Sched<[WriteVMIotV_MX, ReadVMIotV_MX, ReadVMask]>; def "_" # m.MX # "_TU" : VPseudoUnaryNoMaskTU, - Sched<[WriteVMIotV, ReadVMIotV, ReadVMask]>; + Sched<[WriteVMIotV_MX, ReadVMIotV_MX, ReadVMask]>; def "_" # m.MX # "_MASK" : VPseudoUnaryMaskTA, RISCVMaskedPseudo, - Sched<[WriteVMIotV, ReadVMIotV, ReadVMask]>; + Sched<[WriteVMIotV_MX, ReadVMIotV_MX, ReadVMask]>; } } } multiclass VPseudoVCPR_V { foreach m = MxList in { + defvar mx = m.MX; + defvar WriteVCompressV_MX = !cast("WriteVCompressV_" # mx); + defvar ReadVCompressV_MX = !cast("ReadVCompressV_" # mx); + let VLMul = m.value in def _VM # "_" # m.MX : VPseudoUnaryAnyMask, - Sched<[WriteVCompressV, ReadVCompressV, ReadVCompressV]>; + Sched<[WriteVCompressV_MX, ReadVCompressV_MX, ReadVCompressV_MX]>; } } @@ -1909,12 +1942,7 @@ } } -multiclass VPseudoBinaryV_VV { - foreach m = MxList in - defm _VV : VPseudoBinary; -} - -multiclass VPseudoBinaryV_VV_LMUL { +multiclass VPseudoBinaryV_VV { defm _VV : VPseudoBinary; } @@ -1925,6 +1953,10 @@ multiclass VPseudoVGTR_VV_EEW { foreach m = MxList in { + defvar mx = m.MX; + defvar WriteVGatherV_MX = !cast("WriteVGatherV_" # mx); + defvar ReadVGatherV_MX = !cast("ReadVGatherV_" # mx); + foreach sew = EEWList in { defvar octuple_lmul = m.octuple; // emul = lmul * eew / sew @@ -1933,25 +1965,26 @@ defvar emulMX = octuple_to_str.ret; defvar emul = !cast("V_" # emulMX); defm _VV : VPseudoBinaryEmul, - Sched<[WriteVGatherV, ReadVGatherV, ReadVGatherV]>; + Sched<[WriteVGatherV_MX, ReadVGatherV_MX, ReadVGatherV_MX]>; } } } } -multiclass VPseudoBinaryV_VX { - foreach m = MxList in - defm "_VX" : VPseudoBinary; -} - -multiclass VPseudoBinaryV_VX_LMUL { +multiclass VPseudoBinaryV_VX { defm "_VX" : VPseudoBinary; } multiclass VPseudoVSLD1_VX { - foreach m = MxList in + foreach m = MxList in { + defvar mx = m.MX; + defvar WriteVISlide1X_MX = !cast("WriteVISlide1X_" # mx); + defvar ReadVISlideV_MX = !cast("ReadVISlideV_" # mx); + defvar ReadVISlideX_MX = !cast("ReadVISlideX_" # mx); + defm "_VX" : VPseudoBinary, - Sched<[WriteVISlide1X, ReadVISlideV, ReadVISlideX, ReadVMask]>; + Sched<[WriteVISlide1X_MX, ReadVISlideV_MX, ReadVISlideX_MX, ReadVMask]>; + } } multiclass VPseudoBinaryV_VF { @@ -1960,28 +1993,35 @@ } multiclass VPseudoVSLD1_VF { - foreach f = FPList in - foreach m = f.MxList in + foreach f = FPList in { + foreach m = f.MxList in { + defvar mx = m.MX; + defvar WriteVFSlide1F_MX = !cast("WriteVFSlide1F_" # mx); + defvar ReadVFSlideV_MX = !cast("ReadVFSlideV_" # mx); + defvar ReadVFSlideF_MX = !cast("ReadVFSlideF_" # mx); + defm "_V" # f.FX : VPseudoBinary, - Sched<[WriteVFSlide1F, ReadVFSlideV, ReadVFSlideF, ReadVMask]>; -} - -multiclass VPseudoBinaryV_VI { - foreach m = MxList in - defm _VI : VPseudoBinary; + Sched<[WriteVFSlide1F_MX, ReadVFSlideV_MX, ReadVFSlideF_MX, ReadVMask]>; + } + } } -multiclass VPseudoBinaryV_VI_LMUL { +multiclass VPseudoBinaryV_VI { defm _VI : VPseudoBinary; } multiclass VPseudoVALU_MM { - foreach m = MxList in + foreach m = MxList in { + defvar mx = m.MX; + defvar WriteVMALUV_MX = !cast("WriteVMALUV_" # mx); + defvar ReadVMALUV_MX = !cast("ReadVMALUV_" # mx); + let VLMul = m.value in { - def "_MM_" # m.MX : VPseudoBinaryNoMask, - Sched<[WriteVMALUV, ReadVMALUV, ReadVMALUV]>; + def "_MM_" # mx : VPseudoBinaryNoMask, + Sched<[WriteVMALUV_MX, ReadVMALUV_MX, ReadVMALUV_MX]>; } + } } // We use earlyclobber here due to @@ -1991,18 +2031,12 @@ // * The destination EEW is greater than the source EEW, the source EMUL is // at least 1, and the overlap is in the highest-numbered part of the // destination register group is legal. Otherwise, it is illegal. -multiclass VPseudoBinaryW_VV mxlist = MxListW> { - foreach m = mxlist in - defm _VV : VPseudoBinary; -} - -multiclass VPseudoBinaryW_VV_LMUL { +multiclass VPseudoBinaryW_VV { defm _VV : VPseudoBinary; } -multiclass VPseudoBinaryW_VX_LMUL { +multiclass VPseudoBinaryW_VX { defm "_VX" : VPseudoBinary; } @@ -2013,23 +2047,14 @@ "@earlyclobber $rd">; } -multiclass VPseudoBinaryW_WV mxlist = MxListW> { - foreach m = mxlist in { - defm _WV : VPseudoBinary; - defm _WV : VPseudoTiedBinary; - } -} - -multiclass VPseudoBinaryW_WV_LMUL { +multiclass VPseudoBinaryW_WV { defm _WV : VPseudoBinary; defm _WV : VPseudoTiedBinary; } -multiclass VPseudoBinaryW_WX_LMUL { +multiclass VPseudoBinaryW_WX { defm "_WX" : VPseudoBinary; } @@ -2043,35 +2068,17 @@ // exception from the spec. // "The destination EEW is smaller than the source EEW and the overlap is in the // lowest-numbered part of the source register group." -multiclass VPseudoBinaryV_WV { - foreach m = MxListW in - defm _WV : VPseudoBinary; -} - -multiclass VPseudoBinaryV_WV_LMUL { +multiclass VPseudoBinaryV_WV { defm _WV : VPseudoBinary; } -multiclass VPseudoBinaryV_WX { - foreach m = MxListW in - defm _WX : VPseudoBinary; -} - -multiclass VPseudoBinaryV_WX_LMUL { +multiclass VPseudoBinaryV_WX { defm _WX : VPseudoBinary; } -multiclass VPseudoBinaryV_WI { - foreach m = MxListW in - defm _WI : VPseudoBinary; -} - -multiclass VPseudoBinaryV_WI_LMUL { +multiclass VPseudoBinaryV_WI { defm _WI : VPseudoBinary; } @@ -2329,13 +2336,7 @@ // lowest-numbered part of the source register group". // With LMUL<=1 the source and dest occupy a single register so any overlap // is in the lowest-numbered part. -multiclass VPseudoBinaryM_VV mxlist = MxList> { - foreach m = mxlist in - defm _VV : VPseudoBinaryM; -} - -multiclass VPseudoBinaryM_VV_LMUL { +multiclass VPseudoBinaryM_VV { defm _VV : VPseudoBinaryM; } @@ -2358,12 +2359,21 @@ } multiclass VPseudoVGTR_VV_VX_VI { - defm "" : VPseudoBinaryV_VV, - Sched<[WriteVGatherV, ReadVGatherV, ReadVGatherV, ReadVMask]>; - defm "" : VPseudoBinaryV_VX, - Sched<[WriteVGatherX, ReadVGatherV, ReadVGatherX, ReadVMask]>; - defm "" : VPseudoBinaryV_VI, - Sched<[WriteVGatherI, ReadVGatherV, ReadVMask]>; + foreach m = MxList in { + defvar mx = m.MX; + defvar WriteVGatherV_MX = !cast("WriteVGatherV_" # mx); + defvar WriteVGatherX_MX = !cast("WriteVGatherX_" # mx); + defvar WriteVGatherI_MX = !cast("WriteVGatherI_" # mx); + defvar ReadVGatherV_MX = !cast("ReadVGatherV_" # mx); + defvar ReadVGatherX_MX = !cast("ReadVGatherX_" # mx); + + defm "" : VPseudoBinaryV_VV, + Sched<[WriteVGatherV_MX, ReadVGatherV_MX, ReadVGatherV_MX, ReadVMask]>; + defm "" : VPseudoBinaryV_VX, + Sched<[WriteVGatherX_MX, ReadVGatherV_MX, ReadVGatherX_MX, ReadVMask]>; + defm "" : VPseudoBinaryV_VI, + Sched<[WriteVGatherI_MX, ReadVGatherV_MX, ReadVMask]>; + } } multiclass VPseudoVSALU_VV_VX_VI { @@ -2375,11 +2385,11 @@ defvar ReadVSALUV_MX = !cast("ReadVSALUV_" # mx); defvar ReadVSALUX_MX = !cast("ReadVSALUX_" # mx); - defm "" : VPseudoBinaryV_VV_LMUL, + defm "" : VPseudoBinaryV_VV, Sched<[WriteVSALUV_MX, ReadVSALUV_MX, ReadVSALUV_MX, ReadVMask]>; - defm "" : VPseudoBinaryV_VX_LMUL, + defm "" : VPseudoBinaryV_VX, Sched<[WriteVSALUX_MX, ReadVSALUV_MX, ReadVSALUX_MX, ReadVMask]>; - defm "" : VPseudoBinaryV_VI_LMUL, + defm "" : VPseudoBinaryV_VI, Sched<[WriteVSALUI_MX, ReadVSALUV_MX, ReadVMask]>; } } @@ -2394,11 +2404,11 @@ defvar ReadVShiftV_MX = !cast("ReadVShiftV_" # mx); defvar ReadVShiftX_MX = !cast("ReadVShiftX_" # mx); - defm "" : VPseudoBinaryV_VV_LMUL, + defm "" : VPseudoBinaryV_VV, Sched<[WriteVShiftV_MX, ReadVShiftV_MX, ReadVShiftV_MX, ReadVMask]>; - defm "" : VPseudoBinaryV_VX_LMUL, + defm "" : VPseudoBinaryV_VX, Sched<[WriteVShiftX_MX, ReadVShiftV_MX, ReadVShiftX_MX, ReadVMask]>; - defm "" : VPseudoBinaryV_VI_LMUL, + defm "" : VPseudoBinaryV_VI, Sched<[WriteVShiftI_MX, ReadVShiftV_MX, ReadVMask]>; } } @@ -2412,11 +2422,11 @@ defvar ReadVSShiftV_MX = !cast("ReadVSShiftV_" # mx); defvar ReadVSShiftX_MX = !cast("ReadVSShiftX_" # mx); - defm "" : VPseudoBinaryV_VV_LMUL, + defm "" : VPseudoBinaryV_VV, Sched<[WriteVSShiftV_MX, ReadVSShiftV_MX, ReadVSShiftV_MX, ReadVMask]>; - defm "" : VPseudoBinaryV_VX_LMUL, + defm "" : VPseudoBinaryV_VX, Sched<[WriteVSShiftX_MX, ReadVSShiftV_MX, ReadVSShiftX_MX, ReadVMask]>; - defm "" : VPseudoBinaryV_VI_LMUL, + defm "" : VPseudoBinaryV_VI, Sched<[WriteVSShiftI_MX, ReadVSShiftV_MX, ReadVMask]>; } } @@ -2430,11 +2440,11 @@ defvar ReadVIALUV_MX = !cast("ReadVIALUV_" # mx); defvar ReadVIALUX_MX = !cast("ReadVIALUX_" # mx); - defm "" : VPseudoBinaryV_VV_LMUL, + defm "" : VPseudoBinaryV_VV, Sched<[WriteVIALUV_MX, ReadVIALUV_MX, ReadVIALUV_MX, ReadVMask]>; - defm "" : VPseudoBinaryV_VX_LMUL, + defm "" : VPseudoBinaryV_VX, Sched<[WriteVIALUX_MX, ReadVIALUV_MX, ReadVIALUX_MX, ReadVMask]>; - defm "" : VPseudoBinaryV_VI_LMUL, + defm "" : VPseudoBinaryV_VI, Sched<[WriteVIALUI_MX, ReadVIALUV_MX, ReadVMask]>; } } @@ -2447,9 +2457,9 @@ defvar ReadVSALUV_MX = !cast("ReadVSALUV_" # mx); defvar ReadVSALUX_MX = !cast("ReadVSALUX_" # mx); - defm "" : VPseudoBinaryV_VV_LMUL, + defm "" : VPseudoBinaryV_VV, Sched<[WriteVSALUV_MX, ReadVSALUV_MX, ReadVSALUV_MX, ReadVMask]>; - defm "" : VPseudoBinaryV_VX_LMUL, + defm "" : VPseudoBinaryV_VX, Sched<[WriteVSALUX_MX, ReadVSALUV_MX, ReadVSALUX_MX, ReadVMask]>; } } @@ -2462,9 +2472,9 @@ defvar ReadVSMulV_MX = !cast("ReadVSMulV_" # mx); defvar ReadVSMulX_MX = !cast("ReadVSMulX_" # mx); - defm "" : VPseudoBinaryV_VV_LMUL, + defm "" : VPseudoBinaryV_VV, Sched<[WriteVSMulV_MX, ReadVSMulV_MX, ReadVSMulV_MX, ReadVMask]>; - defm "" : VPseudoBinaryV_VX_LMUL, + defm "" : VPseudoBinaryV_VX, Sched<[WriteVSMulX_MX, ReadVSMulV_MX, ReadVSMulX_MX, ReadVMask]>; } } @@ -2477,9 +2487,9 @@ defvar ReadVAALUV_MX = !cast("ReadVAALUV_" # mx); defvar ReadVAALUX_MX = !cast("ReadVAALUX_" # mx); - defm "" : VPseudoBinaryV_VV_LMUL, + defm "" : VPseudoBinaryV_VV, Sched<[WriteVAALUV_MX, ReadVAALUV_MX, ReadVAALUV_MX, ReadVMask]>; - defm "" : VPseudoBinaryV_VX_LMUL, + defm "" : VPseudoBinaryV_VX, Sched<[WriteVAALUX_MX, ReadVAALUV_MX, ReadVAALUX_MX, ReadVMask]>; } } @@ -2492,9 +2502,9 @@ defvar ReadVICmpV_MX = !cast("ReadVICmpV_" # mx); defvar ReadVICmpX_MX = !cast("ReadVICmpX_" # mx); - defm "" : VPseudoBinaryV_VV_LMUL, + defm "" : VPseudoBinaryV_VV, Sched<[WriteVICmpV_MX, ReadVICmpV_MX, ReadVICmpV_MX, ReadVMask]>; - defm "" : VPseudoBinaryV_VX_LMUL, + defm "" : VPseudoBinaryV_VX, Sched<[WriteVICmpX_MX, ReadVICmpV_MX, ReadVICmpX_MX, ReadVMask]>; } } @@ -2507,9 +2517,9 @@ defvar ReadVIMulV_MX = !cast("ReadVIMulV_" # mx); defvar ReadVIMulX_MX = !cast("ReadVIMulX_" # mx); - defm "" : VPseudoBinaryV_VV_LMUL, + defm "" : VPseudoBinaryV_VV, Sched<[WriteVIMulV_MX, ReadVIMulV_MX, ReadVIMulV_MX, ReadVMask]>; - defm "" : VPseudoBinaryV_VX_LMUL, + defm "" : VPseudoBinaryV_VX, Sched<[WriteVIMulX_MX, ReadVIMulV_MX, ReadVIMulX_MX, ReadVMask]>; } } @@ -2522,9 +2532,9 @@ defvar ReadVIDivV_MX = !cast("ReadVIDivV_" # mx); defvar ReadVIDivX_MX = !cast("ReadVIDivX_" # mx); - defm "" : VPseudoBinaryV_VV_LMUL, + defm "" : VPseudoBinaryV_VV, Sched<[WriteVIDivV_MX, ReadVIDivV_MX, ReadVIDivV_MX, ReadVMask]>; - defm "" : VPseudoBinaryV_VX_LMUL, + defm "" : VPseudoBinaryV_VX, Sched<[WriteVIDivX_MX, ReadVIDivV_MX, ReadVIDivX_MX, ReadVMask]>; } } @@ -2596,9 +2606,9 @@ defvar ReadVIALUV_MX = !cast("ReadVIALUV_" # mx); defvar ReadVIALUX_MX = !cast("ReadVIALUX_" # mx); - defm "" : VPseudoBinaryV_VV_LMUL, + defm "" : VPseudoBinaryV_VV, Sched<[WriteVIALUV_MX, ReadVIALUV_MX, ReadVIALUV_MX, ReadVMask]>; - defm "" : VPseudoBinaryV_VX_LMUL, + defm "" : VPseudoBinaryV_VX, Sched<[WriteVIALUX_MX, ReadVIALUV_MX, ReadVIALUX_MX, ReadVMask]>; } } @@ -2693,9 +2703,9 @@ defvar ReadVIALUV_MX = !cast("ReadVIALUV_" # mx); defvar ReadVIALUX_MX = !cast("ReadVIALUX_" # mx); - defm "" : VPseudoBinaryV_VX_LMUL, + defm "" : VPseudoBinaryV_VX, Sched<[WriteVIALUX_MX, ReadVIALUV_MX, ReadVIALUX_MX, ReadVMask]>; - defm "" : VPseudoBinaryV_VI_LMUL, + defm "" : VPseudoBinaryV_VI, Sched<[WriteVIALUI_MX, ReadVIALUV_MX, ReadVMask]>; } } @@ -2708,9 +2718,9 @@ defvar ReadVIWALUV_MX = !cast("ReadVIWALUV_" # mx); defvar ReadVIWALUX_MX = !cast("ReadVIWALUX_" # mx); - defm "" : VPseudoBinaryW_VV_LMUL, + defm "" : VPseudoBinaryW_VV, Sched<[WriteVIWALUV_MX, ReadVIWALUV_MX, ReadVIWALUV_MX, ReadVMask]>; - defm "" : VPseudoBinaryW_VX_LMUL, + defm "" : VPseudoBinaryW_VX, Sched<[WriteVIWALUX_MX, ReadVIWALUV_MX, ReadVIWALUX_MX, ReadVMask]>; } } @@ -2723,9 +2733,9 @@ defvar ReadVIWMulV_MX = !cast("ReadVIWMulV_" # mx); defvar ReadVIWMulX_MX = !cast("ReadVIWMulX_" # mx); - defm "" : VPseudoBinaryW_VV_LMUL, + defm "" : VPseudoBinaryW_VV, Sched<[WriteVIWMulV_MX, ReadVIWMulV_MX, ReadVIWMulV_MX, ReadVMask]>; - defm "" : VPseudoBinaryW_VX_LMUL, + defm "" : VPseudoBinaryW_VX, Sched<[WriteVIWMulX_MX, ReadVIWMulV_MX, ReadVIWMulX_MX, ReadVMask]>; } } @@ -2736,7 +2746,7 @@ defvar WriteVFWMulV_MX = !cast("WriteVFWMulV_" # mx); defvar ReadVFWMulV_MX = !cast("ReadVFWMulV_" # mx); - defm "" : VPseudoBinaryW_VV_LMUL, + defm "" : VPseudoBinaryW_VV, Sched<[WriteVFWMulV_MX, ReadVFWMulV_MX, ReadVFWMulV_MX, ReadVMask]>; } @@ -2761,9 +2771,9 @@ defvar ReadVIWALUV_MX = !cast("ReadVIWALUV_" # mx); defvar ReadVIWALUX_MX = !cast("ReadVIWALUX_" # mx); - defm "" : VPseudoBinaryW_WV_LMUL, + defm "" : VPseudoBinaryW_WV, Sched<[WriteVIWALUV_MX, ReadVIWALUV_MX, ReadVIWALUV_MX, ReadVMask]>; - defm "" : VPseudoBinaryW_WX_LMUL, + defm "" : VPseudoBinaryW_WX, Sched<[WriteVIWALUX_MX, ReadVIWALUV_MX, ReadVIWALUX_MX, ReadVMask]>; } } @@ -2774,7 +2784,7 @@ defvar WriteVFWALUV_MX = !cast("WriteVFWALUV_" # mx); defvar ReadVFWALUV_MX = !cast("ReadVFWALUV_" # mx); - defm "" : VPseudoBinaryW_VV_LMUL, + defm "" : VPseudoBinaryW_VV, Sched<[WriteVFWALUV_MX, ReadVFWALUV_MX, ReadVFWALUV_MX, ReadVMask]>; } @@ -2797,7 +2807,7 @@ defvar WriteVFWALUV_MX = !cast("WriteVFWALUV_" # mx); defvar ReadVFWALUV_MX = !cast("ReadVFWALUV_" # mx); - defm "" : VPseudoBinaryW_WV_LMUL, + defm "" : VPseudoBinaryW_WV, Sched<[WriteVFWALUV_MX, ReadVFWALUV_MX, ReadVFWALUV_MX, ReadVMask]>; } foreach f = FPListW in { @@ -2958,11 +2968,11 @@ defvar ReadVNClipV_MX = !cast("ReadVNClipV_" # mx); defvar ReadVNClipX_MX = !cast("ReadVNClipX_" # mx); - defm "" : VPseudoBinaryV_WV_LMUL, + defm "" : VPseudoBinaryV_WV, Sched<[WriteVNClipV_MX, ReadVNClipV_MX, ReadVNClipV_MX, ReadVMask]>; - defm "" : VPseudoBinaryV_WX_LMUL, + defm "" : VPseudoBinaryV_WX, Sched<[WriteVNClipX_MX, ReadVNClipV_MX, ReadVNClipX_MX, ReadVMask]>; - defm "" : VPseudoBinaryV_WI_LMUL, + defm "" : VPseudoBinaryV_WI, Sched<[WriteVNClipI_MX, ReadVNClipV_MX, ReadVMask]>; } } @@ -2976,11 +2986,11 @@ defvar ReadVNShiftV_MX = !cast("ReadVNShiftV_" # mx); defvar ReadVNShiftX_MX = !cast("ReadVNShiftX_" # mx); - defm "" : VPseudoBinaryV_WV_LMUL, + defm "" : VPseudoBinaryV_WV, Sched<[WriteVNShiftV_MX, ReadVNShiftV_MX, ReadVNShiftV_MX, ReadVMask]>; - defm "" : VPseudoBinaryV_WX_LMUL, + defm "" : VPseudoBinaryV_WX, Sched<[WriteVNShiftX_MX, ReadVNShiftV_MX, ReadVNShiftX_MX, ReadVMask]>; - defm "" : VPseudoBinaryV_WI_LMUL, + defm "" : VPseudoBinaryV_WI, Sched<[WriteVNShiftI_MX, ReadVNShiftV_MX, ReadVMask]>; } } @@ -3022,22 +3032,13 @@ } } -multiclass VPseudoTernaryV_VV_AAXA mxlist = MxList> { - foreach m = mxlist in { - defm _VV : VPseudoTernaryWithPolicy; - } -} - -multiclass VPseudoTernaryV_VV_AAXA_LMUL { +multiclass VPseudoTernaryV_VV_AAXA { defm _VV : VPseudoTernaryWithPolicy; } -multiclass VPseudoVSLDV_VX { - foreach m = MxList in - defm _VX : VPseudoTernaryWithPolicy; +multiclass VPseudoVSLDV_VX { + defm _VX : VPseudoTernaryWithPolicy; } multiclass VPseudoTernaryV_VX_AAXA { @@ -3051,14 +3052,7 @@ /*Commutable*/1>; } -multiclass VPseudoTernaryW_VV mxlist = MxListW> { - defvar constraint = "@earlyclobber $rd"; - foreach m = mxlist in - defm _VV : VPseudoTernaryWithPolicy; -} - -multiclass VPseudoTernaryW_VV_LMUL { +multiclass VPseudoTernaryW_VV { defvar constraint = "@earlyclobber $rd"; defm _VV : VPseudoTernaryWithPolicy; @@ -3076,9 +3070,8 @@ m.vrclass, m, constraint>; } -multiclass VPseudoVSLDV_VI { - foreach m = MxList in - defm _VI : VPseudoTernaryWithPolicy; +multiclass VPseudoVSLDV_VI { + defm _VI : VPseudoTernaryWithPolicy; } multiclass VPseudoVMAC_VV_VX_AAXA { @@ -3089,7 +3082,7 @@ defvar ReadVIMulAddV_MX = !cast("ReadVIMulAddV_" # mx); defvar ReadVIMulAddX_MX = !cast("ReadVIMulAddX_" # mx); - defm "" : VPseudoTernaryV_VV_AAXA_LMUL, + defm "" : VPseudoTernaryV_VV_AAXA, Sched<[WriteVIMulAddV_MX, ReadVIMulAddV_MX, ReadVIMulAddV_MX, ReadVIMulAddV_MX, ReadVMask]>; defm "" : VPseudoTernaryV_VX_AAXA, @@ -3104,7 +3097,7 @@ defvar WriteVFMulAddV_MX = !cast("WriteVFMulAddV_" # mx); defvar ReadVFMulAddV_MX = !cast("ReadVFMulAddV_" # mx); - defm "" : VPseudoTernaryV_VV_AAXA_LMUL, + defm "" : VPseudoTernaryV_VV_AAXA, Sched<[WriteVFMulAddV_MX, ReadVFMulAddV_MX, ReadVFMulAddV_MX, ReadVFMulAddV_MX, ReadVMask]>; } @@ -3122,10 +3115,18 @@ } multiclass VPseudoVSLD_VX_VI { - defm "" : VPseudoVSLDV_VX, - Sched<[WriteVISlideX, ReadVISlideV, ReadVISlideV, ReadVISlideX, ReadVMask]>; - defm "" : VPseudoVSLDV_VI, - Sched<[WriteVISlideI, ReadVISlideV, ReadVISlideV, ReadVMask]>; + foreach m = MxList in { + defvar mx = m.MX; + defvar WriteVISlideX_MX = !cast("WriteVISlideX_" # mx); + defvar WriteVISlideI_MX = !cast("WriteVISlideI_" # mx); + defvar ReadVISlideV_MX = !cast("ReadVISlideV_" # mx); + defvar ReadVISlideX_MX = !cast("ReadVISlideX_" # mx); + + defm "" : VPseudoVSLDV_VX, + Sched<[WriteVISlideX_MX, ReadVISlideV_MX, ReadVISlideV_MX, ReadVISlideX_MX, ReadVMask]>; + defm "" : VPseudoVSLDV_VI, + Sched<[WriteVISlideI_MX, ReadVISlideV_MX, ReadVISlideV_MX, ReadVMask]>; + } } multiclass VPseudoVWMAC_VV_VX { @@ -3136,7 +3137,7 @@ defvar ReadVIWMulAddV_MX = !cast("ReadVIWMulAddV_" # mx); defvar ReadVIWMulAddX_MX = !cast("ReadVIWMulAddX_" # mx); - defm "" : VPseudoTernaryW_VV_LMUL, + defm "" : VPseudoTernaryW_VV, Sched<[WriteVIWMulAddV_MX, ReadVIWMulAddV_MX, ReadVIWMulAddV_MX, ReadVIWMulAddV_MX, ReadVMask]>; defm "" : VPseudoTernaryW_VX, @@ -3164,7 +3165,7 @@ defvar WriteVFWMulAddV_MX = !cast("WriteVFWMulAddV_" # mx); defvar ReadVFWMulAddV_MX = !cast("ReadVFWMulAddV_" # mx); - defm "" : VPseudoTernaryW_VV_LMUL, + defm "" : VPseudoTernaryW_VV, Sched<[WriteVFWMulAddV_MX, ReadVFWMulAddV_MX, ReadVFWMulAddV_MX, ReadVFWMulAddV_MX, ReadVMask]>; } @@ -3192,7 +3193,7 @@ defvar ReadVICmpV_MX = !cast("ReadVICmpV_" # mx); defvar ReadVICmpX_MX = !cast("ReadVICmpX_" # mx); - defm "" : VPseudoBinaryM_VV_LMUL, + defm "" : VPseudoBinaryM_VV, Sched<[WriteVICmpV_MX, ReadVICmpV_MX, ReadVICmpV_MX, ReadVMask]>; defm "" : VPseudoBinaryM_VX, Sched<[WriteVICmpX_MX, ReadVICmpV_MX, ReadVICmpX_MX, ReadVMask]>; @@ -3209,7 +3210,7 @@ defvar ReadVICmpV_MX = !cast("ReadVICmpV_" # mx); defvar ReadVICmpX_MX = !cast("ReadVICmpX_" # mx); - defm "" : VPseudoBinaryM_VV_LMUL, + defm "" : VPseudoBinaryM_VV, Sched<[WriteVICmpV_MX, ReadVICmpV_MX, ReadVICmpV_MX, ReadVMask]>; defm "" : VPseudoBinaryM_VX, Sched<[WriteVICmpX_MX, ReadVICmpV_MX, ReadVICmpX_MX, ReadVMask]>; @@ -3222,7 +3223,7 @@ defvar WriteVFCmpV_MX = !cast("WriteVFCmpV_" # mx); defvar ReadVFCmpV_MX = !cast("ReadVFCmpV_" # mx); - defm "" : VPseudoBinaryM_VV_LMUL, + defm "" : VPseudoBinaryM_VV, Sched<[WriteVFCmpV_MX, ReadVFCmpV_MX, ReadVFCmpV_MX, ReadVMask]>; } @@ -3445,11 +3446,11 @@ foreach nf = NFSet.L in { defvar vreg = SegRegClass.RC; def nf # "E" # eew # "_V_" # LInfo : - VPseudoUSSegLoadNoMask, VLSEGSched; + VPseudoUSSegLoadNoMask, VLSEGSched; def nf # "E" # eew # "_V_" # LInfo # "_TU" : - VPseudoUSSegLoadNoMaskTU, VLSEGSched; + VPseudoUSSegLoadNoMaskTU, VLSEGSched; def nf # "E" # eew # "_V_" # LInfo # "_MASK" : - VPseudoUSSegLoadMask, VLSEGSched; + VPseudoUSSegLoadMask, VLSEGSched; } } } @@ -3464,11 +3465,11 @@ foreach nf = NFSet.L in { defvar vreg = SegRegClass.RC; def nf # "E" # eew # "FF_V_" # LInfo : - VPseudoUSSegLoadFFNoMask, VLSEGFFSched; + VPseudoUSSegLoadFFNoMask, VLSEGFFSched; def nf # "E" # eew # "FF_V_" # LInfo # "_TU" : - VPseudoUSSegLoadFFNoMaskTU, VLSEGFFSched; + VPseudoUSSegLoadFFNoMaskTU, VLSEGFFSched; def nf # "E" # eew # "FF_V_" # LInfo # "_MASK" : - VPseudoUSSegLoadFFMask, VLSEGFFSched; + VPseudoUSSegLoadFFMask, VLSEGFFSched; } } } @@ -3483,11 +3484,11 @@ foreach nf = NFSet.L in { defvar vreg = SegRegClass.RC; def nf # "E" # eew # "_V_" # LInfo : VPseudoSSegLoadNoMask, - VLSSEGSched; + VLSSEGSched; def nf # "E" # eew # "_V_" # LInfo # "_TU" : VPseudoSSegLoadNoMaskTU, - VLSSEGSched; + VLSSEGSched; def nf # "E" # eew # "_V_" # LInfo # "_MASK" : VPseudoSSegLoadMask, - VLSSEGSched; + VLSSEGSched; } } } @@ -3514,15 +3515,15 @@ def nf # "EI" # idx_eew # "_V_" # IdxLInfo # "_" # ValLInfo : VPseudoISegLoadNoMask, - VLXSEGSched; + VLXSEGSched; def nf # "EI" # idx_eew # "_V_" # IdxLInfo # "_" # ValLInfo # "_TU" : VPseudoISegLoadNoMaskTU, - VLXSEGSched; + VLXSEGSched; def nf # "EI" # idx_eew # "_V_" # IdxLInfo # "_" # ValLInfo # "_MASK" : VPseudoISegLoadMask, - VLXSEGSched; + VLXSEGSched; } } } @@ -3539,9 +3540,9 @@ foreach nf = NFSet.L in { defvar vreg = SegRegClass.RC; def nf # "E" # eew # "_V_" # LInfo : VPseudoUSSegStoreNoMask, - VSSEGSched; + VSSEGSched; def nf # "E" # eew # "_V_" # LInfo # "_MASK" : VPseudoUSSegStoreMask, - VSSEGSched; + VSSEGSched; } } } @@ -3556,9 +3557,9 @@ foreach nf = NFSet.L in { defvar vreg = SegRegClass.RC; def nf # "E" # eew # "_V_" # LInfo : VPseudoSSegStoreNoMask, - VSSSEGSched; + VSSSEGSched; def nf # "E" # eew # "_V_" # LInfo # "_MASK" : VPseudoSSegStoreMask, - VSSSEGSched; + VSSSEGSched; } } } @@ -3585,11 +3586,11 @@ def nf # "EI" # idx_eew # "_V_" # IdxLInfo # "_" # ValLInfo : VPseudoISegStoreNoMask, - VSXSEGSched; + VSXSEGSched; def nf # "EI" # idx_eew # "_V_" # IdxLInfo # "_" # ValLInfo # "_MASK" : VPseudoISegStoreMask, - VSXSEGSched; + VSXSEGSched; } } } @@ -5041,10 +5042,8 @@ defm PseudoVL : VPseudoUSLoad; defm PseudoVS : VPseudoUSStore; -defm PseudoVLM : VPseudoLoadMask, - Sched<[WriteVLDM, ReadVLDX]>; -defm PseudoVSM : VPseudoStoreMask, - Sched<[WriteVSTM, ReadVSTX]>; +defm PseudoVLM : VPseudoLoadMask; +defm PseudoVSM : VPseudoStoreMask; //===----------------------------------------------------------------------===// // 7.5 Vector Strided Instructions @@ -5566,10 +5565,8 @@ defm PseudoVMXNOR: VPseudoVALU_MM; // Pseudo instructions -defm PseudoVMCLR : VPseudoNullaryPseudoM<"VMXOR">, - Sched<[WriteVMALUV, ReadVMALUV, ReadVMALUV]>; -defm PseudoVMSET : VPseudoNullaryPseudoM<"VMXNOR">, - Sched<[WriteVMALUV, ReadVMALUV, ReadVMALUV]>; +defm PseudoVMCLR : VPseudoNullaryPseudoM<"VMXOR">; +defm PseudoVMSET : VPseudoNullaryPseudoM<"VMXNOR">; //===----------------------------------------------------------------------===// // 16.2. Vector mask population count vcpop @@ -5619,19 +5616,25 @@ let Predicates = [HasVInstructions] in { let mayLoad = 0, mayStore = 0, hasSideEffects = 0 in { foreach m = MxList in { + defvar mx = m.MX; + defvar WriteVIMovVX_MX = !cast("WriteVIMovVX_" # mx); + defvar WriteVIMovXV_MX = !cast("WriteVIMovXV_" # mx); + defvar ReadVIMovVX_MX = !cast("ReadVIMovVX_" # mx); + defvar ReadVIMovXV_MX = !cast("ReadVIMovXV_" # mx); + defvar ReadVIMovXX_MX = !cast("ReadVIMovXX_" # mx); let VLMul = m.value in { let HasSEWOp = 1, BaseInstr = VMV_X_S in - def PseudoVMV_X_S # "_" # m.MX: + def PseudoVMV_X_S # "_" # mx: Pseudo<(outs GPR:$rd), (ins m.vrclass:$rs2, ixlenimm:$sew), []>, - Sched<[WriteVIMovVX, ReadVIMovVX]>, + Sched<[WriteVIMovVX_MX, ReadVIMovVX_MX]>, RISCVVPseudo; let HasVLOp = 1, HasSEWOp = 1, BaseInstr = VMV_S_X, Constraints = "$rd = $rs1" in - def PseudoVMV_S_X # "_" # m.MX: Pseudo<(outs m.vrclass:$rd), + def PseudoVMV_S_X # "_" # mx: Pseudo<(outs m.vrclass:$rd), (ins m.vrclass:$rs1, GPR:$rs2, AVL:$vl, ixlenimm:$sew), []>, - Sched<[WriteVIMovXV, ReadVIMovXV, ReadVIMovXX]>, + Sched<[WriteVIMovXV_MX, ReadVIMovXV_MX, ReadVIMovXX_MX]>, RISCVVPseudo; } } @@ -5646,21 +5649,27 @@ let mayLoad = 0, mayStore = 0, hasSideEffects = 0 in { foreach f = FPList in { foreach m = f.MxList in { + defvar mx = m.MX; + defvar WriteVFMovVF_MX = !cast("WriteVFMovVF_" # mx); + defvar WriteVFMovFV_MX = !cast("WriteVFMovFV_" # mx); + defvar ReadVFMovVF_MX = !cast("ReadVFMovVF_" # mx); + defvar ReadVFMovFV_MX = !cast("ReadVFMovFV_" # mx); + defvar ReadVFMovFX_MX = !cast("ReadVFMovFX_" # mx); let VLMul = m.value in { let HasSEWOp = 1, BaseInstr = VFMV_F_S in - def "PseudoVFMV_" # f.FX # "_S_" # m.MX : + def "PseudoVFMV_" # f.FX # "_S_" # mx : Pseudo<(outs f.fprclass:$rd), (ins m.vrclass:$rs2, ixlenimm:$sew), []>, - Sched<[WriteVFMovVF, ReadVFMovVF]>, + Sched<[WriteVFMovVF_MX, ReadVFMovVF_MX]>, RISCVVPseudo; let HasVLOp = 1, HasSEWOp = 1, BaseInstr = VFMV_S_F, Constraints = "$rd = $rs1" in - def "PseudoVFMV_S_" # f.FX # "_" # m.MX : + def "PseudoVFMV_S_" # f.FX # "_" # mx : Pseudo<(outs m.vrclass:$rd), (ins m.vrclass:$rs1, f.fprclass:$rs2, AVL:$vl, ixlenimm:$sew), []>, - Sched<[WriteVFMovFV, ReadVFMovFV, ReadVFMovFX]>, + Sched<[WriteVFMovFV_MX, ReadVFMovFV_MX, ReadVFMovFX_MX]>, RISCVVPseudo; } } diff --git a/llvm/lib/Target/RISCV/RISCVScheduleV.td b/llvm/lib/Target/RISCV/RISCVScheduleV.td --- a/llvm/lib/Target/RISCV/RISCVScheduleV.td +++ b/llvm/lib/Target/RISCV/RISCVScheduleV.td @@ -9,6 +9,7 @@ //===----------------------------------------------------------------------===// /// Define scheduler resources associated with def operands. +defvar UpperBoundLMUL = "UpperBound"; defvar SchedMxList = ["UpperBound", "M1", "M2", "M4", "M8", "MF2", "MF4", "MF8"]; // Used for widening and narrowing instructions as it doesn't contain M8. defvar SchedMxListW = ["UpperBound", "MF8", "MF4", "MF2", "M1", "M2", "M4"]; @@ -56,51 +57,51 @@ // 7. Vector Loads and Stores // 7.4. Vector Unit-Stride Instructions -def WriteVLDE : SchedWrite; -def WriteVSTE : SchedWrite; +defm "" : LMULSchedWrites<"WriteVLDE">; +defm "" : LMULSchedWrites<"WriteVSTE">; // 7.4.1. Vector Unit-Strided Mask -def WriteVLDM : SchedWrite; -def WriteVSTM : SchedWrite; +defm "" : LMULSchedWrites<"WriteVLDM">; +defm "" : LMULSchedWrites<"WriteVSTM">; // 7.5. Vector Strided Instructions -def WriteVLDS8 : SchedWrite; -def WriteVLDS16 : SchedWrite; -def WriteVLDS32 : SchedWrite; -def WriteVLDS64 : SchedWrite; -def WriteVSTS8 : SchedWrite; -def WriteVSTS16 : SchedWrite; -def WriteVSTS32 : SchedWrite; -def WriteVSTS64 : SchedWrite; +defm "" : LMULSchedWrites<"WriteVLDS8">; +defm "" : LMULSchedWrites<"WriteVLDS16">; +defm "" : LMULSchedWrites<"WriteVLDS32">; +defm "" : LMULSchedWrites<"WriteVLDS64">; +defm "" : LMULSchedWrites<"WriteVSTS8">; +defm "" : LMULSchedWrites<"WriteVSTS16">; +defm "" : LMULSchedWrites<"WriteVSTS32">; +defm "" : LMULSchedWrites<"WriteVSTS64">; // 7.6. Vector Indexed Instructions -def WriteVLDUX8 : SchedWrite; -def WriteVLDUX16 : SchedWrite; -def WriteVLDUX32 : SchedWrite; -def WriteVLDUX64 : SchedWrite; -def WriteVLDOX8 : SchedWrite; -def WriteVLDOX16 : SchedWrite; -def WriteVLDOX32 : SchedWrite; -def WriteVLDOX64 : SchedWrite; -def WriteVSTUX8 : SchedWrite; -def WriteVSTUX16 : SchedWrite; -def WriteVSTUX32 : SchedWrite; -def WriteVSTUX64 : SchedWrite; -def WriteVSTOX8 : SchedWrite; -def WriteVSTOX16 : SchedWrite; -def WriteVSTOX32 : SchedWrite; -def WriteVSTOX64 : SchedWrite; +defm "" : LMULSchedWrites<"WriteVLDUX8">; +defm "" : LMULSchedWrites<"WriteVLDUX16">; +defm "" : LMULSchedWrites<"WriteVLDUX32">; +defm "" : LMULSchedWrites<"WriteVLDUX64">; +defm "" : LMULSchedWrites<"WriteVLDOX8">; +defm "" : LMULSchedWrites<"WriteVLDOX16">; +defm "" : LMULSchedWrites<"WriteVLDOX32">; +defm "" : LMULSchedWrites<"WriteVLDOX64">; +defm "" : LMULSchedWrites<"WriteVSTUX8">; +defm "" : LMULSchedWrites<"WriteVSTUX16">; +defm "" : LMULSchedWrites<"WriteVSTUX32">; +defm "" : LMULSchedWrites<"WriteVSTUX64">; +defm "" : LMULSchedWrites<"WriteVSTOX8">; +defm "" : LMULSchedWrites<"WriteVSTOX16">; +defm "" : LMULSchedWrites<"WriteVSTOX32">; +defm "" : LMULSchedWrites<"WriteVSTOX64">; // 7.7. Vector Unit-stride Fault-Only-First Loads -def WriteVLDFF : SchedWrite; +defm "" : LMULSchedWrites<"WriteVLDFF">; // 7.8. Vector Segment Instructions foreach nf=2-8 in { foreach eew = [8, 16, 32, 64] in { - def WriteVLSEG # nf # e # eew : SchedWrite; - def WriteVSSEG # nf # e # eew : SchedWrite; - def WriteVLSEGFF # nf # e # eew : SchedWrite; - def WriteVLSSEG # nf # e # eew : SchedWrite; - def WriteVSSSEG # nf # e # eew : SchedWrite; - def WriteVLUXSEG # nf # e # eew : SchedWrite; - def WriteVLOXSEG # nf # e # eew : SchedWrite; - def WriteVSUXSEG # nf # e # eew : SchedWrite; - def WriteVSOXSEG # nf # e # eew : SchedWrite; + defm "" : LMULSchedWrites<"WriteVLSEG" # nf # e # eew>; + defm "" : LMULSchedWrites<"WriteVSSEG" # nf # e # eew>; + defm "" : LMULSchedWrites<"WriteVLSEGFF" # nf # e # eew>; + defm "" : LMULSchedWrites<"WriteVLSSEG" # nf # e # eew>; + defm "" : LMULSchedWrites<"WriteVSSSEG" # nf # e # eew>; + defm "" : LMULSchedWrites<"WriteVLUXSEG" # nf # e # eew>; + defm "" : LMULSchedWrites<"WriteVLOXSEG" # nf # e # eew>; + defm "" : LMULSchedWrites<"WriteVSUXSEG" # nf # e # eew>; + defm "" : LMULSchedWrites<"WriteVSOXSEG" # nf # e # eew>; } } // 7.9. Vector Whole Register Instructions @@ -252,39 +253,40 @@ // 15. Vector Mask Instructions // 15.1. Vector Mask-Register Logical Instructions -def WriteVMALUV : SchedWrite; +defm "" : LMULSchedWrites<"WriteVMALUV">; // 15.2. Vector Mask Population Count -def WriteVMPopV : SchedWrite; +defm "" : LMULSchedWrites<"WriteVMPopV">; // 15.3. Vector Find-First-Set Mask Bit -def WriteVMFFSV : SchedWrite; +defm "" : LMULSchedWrites<"WriteVMFFSV">; // 15.4. Vector Set-Before-First Mask Bit // 15.5. Vector Set-Including-First Mask Bit // 15.6. Vector Set-only-First Mask Bit -def WriteVMSFSV : SchedWrite; +defm "" : LMULSchedWrites<"WriteVMSFSV">; // 15.8. Vector Iota Instruction -def WriteVMIotV : SchedWrite; +defm "" : LMULSchedWrites<"WriteVMIotV">; // 15.9. Vector Element Index Instruction -def WriteVMIdxV : SchedWrite; +defm "" : LMULSchedWrites<"WriteVMIdxV">; // 16. Vector Permutation Instructions // 16.1. Integer Scalar Move Instructions -def WriteVIMovVX : SchedWrite; -def WriteVIMovXV : SchedWrite; +defm "" : LMULSchedWrites<"WriteVIMovVX">; +defm "" : LMULSchedWrites<"WriteVIMovXV">; // 16.2. Floating-Point Scalar Move Instructions -def WriteVFMovVF : SchedWrite; -def WriteVFMovFV : SchedWrite; +defm "" : LMULSchedWrites<"WriteVFMovVF">; +defm "" : LMULSchedWrites<"WriteVFMovFV">; // 16.3. Vector Slide Instructions -def WriteVISlideX : SchedWrite; -def WriteVISlideI : SchedWrite; -def WriteVISlide1X : SchedWrite; -def WriteVFSlide1F : SchedWrite; +defm "" : LMULSchedWrites<"WriteVISlideX">; +defm "" : LMULSchedWrites<"WriteVISlideI">; +defm "" : LMULSchedWrites<"WriteVISlide1X">; +defm "" : LMULSchedWrites<"WriteVFSlide1F">; // 16.4. Vector Register Gather Instructions -def WriteVGatherV : SchedWrite; -def WriteVGatherX : SchedWrite; -def WriteVGatherI : SchedWrite; +defm "" : LMULSchedWrites<"WriteVGatherV">; +defm "" : LMULSchedWrites<"WriteVGatherX">; +defm "" : LMULSchedWrites<"WriteVGatherI">; // 16.5. Vector Compress Instruction -def WriteVCompressV : SchedWrite; +defm "" : LMULSchedWrites<"WriteVCompressV">; // 16.6. Whole Vector Register Move +// These are already LMUL aware def WriteVMov1V : SchedWrite; def WriteVMov2V : SchedWrite; def WriteVMov4V : SchedWrite; @@ -298,41 +300,42 @@ def ReadVSETVL : SchedRead; // 7. Vector Loads and Stores -def ReadVLDX : SchedRead; -def ReadVSTX : SchedRead; +defm "" : LMULSchedReads<"ReadVLDX">; +defm "" : LMULSchedReads<"ReadVSTX">; // 7.4. Vector Unit-Stride Instructions -def ReadVSTEV : SchedRead; +defm "" : LMULSchedReads<"ReadVSTEV">; // 7.4.1. Vector Unit-Strided Mask -def ReadVSTM : SchedRead; +defm "" : LMULSchedReads<"ReadVSTM">; // 7.5. Vector Strided Instructions -def ReadVLDSX : SchedRead; -def ReadVSTSX : SchedRead; -def ReadVSTS8V : SchedRead; -def ReadVSTS16V : SchedRead; -def ReadVSTS32V : SchedRead; -def ReadVSTS64V : SchedRead; +defm "" : LMULSchedReads<"ReadVLDSX">; +defm "" : LMULSchedReads<"ReadVSTSX">; +defm "" : LMULSchedReads<"ReadVSTS8V">; +defm "" : LMULSchedReads<"ReadVSTS16V">; +defm "" : LMULSchedReads<"ReadVSTS32V">; +defm "" : LMULSchedReads<"ReadVSTS64V">; // 7.6. Vector Indexed Instructions -def ReadVLDUXV : SchedRead; -def ReadVLDOXV : SchedRead; -def ReadVSTUX8 : SchedRead; -def ReadVSTUX16 : SchedRead; -def ReadVSTUX32 : SchedRead; -def ReadVSTUX64 : SchedRead; -def ReadVSTUXV : SchedRead; -def ReadVSTUX8V : SchedRead; -def ReadVSTUX16V : SchedRead; -def ReadVSTUX32V : SchedRead; -def ReadVSTUX64V : SchedRead; -def ReadVSTOX8 : SchedRead; -def ReadVSTOX16 : SchedRead; -def ReadVSTOX32 : SchedRead; -def ReadVSTOX64 : SchedRead; -def ReadVSTOXV : SchedRead; -def ReadVSTOX8V : SchedRead; -def ReadVSTOX16V : SchedRead; -def ReadVSTOX32V : SchedRead; -def ReadVSTOX64V : SchedRead; +defm "" : LMULSchedReads<"ReadVLDUXV">; +defm "" : LMULSchedReads<"ReadVLDOXV">; +defm "" : LMULSchedReads<"ReadVSTUX8">; +defm "" : LMULSchedReads<"ReadVSTUX16">; +defm "" : LMULSchedReads<"ReadVSTUX32">; +defm "" : LMULSchedReads<"ReadVSTUX64">; +defm "" : LMULSchedReads<"ReadVSTUXV">; +defm "" : LMULSchedReads<"ReadVSTUX8V">; +defm "" : LMULSchedReads<"ReadVSTUX16V">; +defm "" : LMULSchedReads<"ReadVSTUX32V">; +defm "" : LMULSchedReads<"ReadVSTUX64V">; +defm "" : LMULSchedReads<"ReadVSTOX8">; +defm "" : LMULSchedReads<"ReadVSTOX16">; +defm "" : LMULSchedReads<"ReadVSTOX32">; +defm "" : LMULSchedReads<"ReadVSTOX64">; +defm "" : LMULSchedReads<"ReadVSTOXV">; +defm "" : LMULSchedReads<"ReadVSTOX8V">; +defm "" : LMULSchedReads<"ReadVSTOX16V">; +defm "" : LMULSchedReads<"ReadVSTOX32V">; +defm "" : LMULSchedReads<"ReadVSTOX64V">; // 7.9. Vector Whole Register Instructions +// These are already LMUL aware def ReadVST1R : SchedRead; def ReadVST2R : SchedRead; def ReadVST4R : SchedRead; @@ -472,38 +475,39 @@ // 15. Vector Mask Instructions // 15.1. Vector Mask-Register Logical Instructions -def ReadVMALUV : SchedRead; +defm "" : LMULSchedReads<"ReadVMALUV">; // 15.2. Vector Mask Population Count -def ReadVMPopV : SchedRead; +defm "" : LMULSchedReads<"ReadVMPopV">; // 15.3. Vector Find-First-Set Mask Bit -def ReadVMFFSV : SchedRead; +defm "" : LMULSchedReads<"ReadVMFFSV">; // 15.4. Vector Set-Before-First Mask Bit // 15.5. Vector Set-Including-First Mask Bit // 15.6. Vector Set-only-First Mask Bit -def ReadVMSFSV : SchedRead; +defm "" : LMULSchedReads<"ReadVMSFSV">; // 15.8. Vector Iota Instruction -def ReadVMIotV : SchedRead; +defm "" : LMULSchedReads<"ReadVMIotV">; // 16. Vector Permutation Instructions // 16.1. Integer Scalar Move Instructions -def ReadVIMovVX : SchedRead; -def ReadVIMovXV : SchedRead; -def ReadVIMovXX : SchedRead; +defm "" : LMULSchedReads<"ReadVIMovVX">; +defm "" : LMULSchedReads<"ReadVIMovXV">; +defm "" : LMULSchedReads<"ReadVIMovXX">; // 16.2. Floating-Point Scalar Move Instructions -def ReadVFMovVF : SchedRead; -def ReadVFMovFV : SchedRead; -def ReadVFMovFX : SchedRead; +defm "" : LMULSchedReads<"ReadVFMovVF">; +defm "" : LMULSchedReads<"ReadVFMovFV">; +defm "" : LMULSchedReads<"ReadVFMovFX">; // 16.3. Vector Slide Instructions -def ReadVISlideV : SchedRead; -def ReadVISlideX : SchedRead; -def ReadVFSlideV : SchedRead; -def ReadVFSlideF : SchedRead; +defm "" : LMULSchedReads<"ReadVISlideV">; +defm "" : LMULSchedReads<"ReadVISlideX">; +defm "" : LMULSchedReads<"ReadVFSlideV">; +defm "" : LMULSchedReads<"ReadVFSlideF">; // 16.4. Vector Register Gather Instructions -def ReadVGatherV : SchedRead; -def ReadVGatherX : SchedRead; +defm "" : LMULSchedReads<"ReadVGatherV">; +defm "" : LMULSchedReads<"ReadVGatherX">; // 16.5. Vector Compress Instruction -def ReadVCompressV : SchedRead; +defm "" : LMULSchedReads<"ReadVCompressV">; // 16.6. Whole Vector Register Move +// These are already LMUL aware def ReadVMov1V : SchedRead; def ReadVMov2V : SchedRead; def ReadVMov4V : SchedRead; @@ -527,35 +531,36 @@ def : WriteRes; // 7. Vector Loads and Stores -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; +defm "" : LMULWriteRes<"WriteVLDE", []>; +defm "" : LMULWriteRes<"WriteVSTE", []>; +defm "" : LMULWriteRes<"WriteVLDM", []>; +defm "" : LMULWriteRes<"WriteVSTM", []>; +defm "" : LMULWriteRes<"WriteVLDS8", []>; +defm "" : LMULWriteRes<"WriteVLDS16", []>; +defm "" : LMULWriteRes<"WriteVLDS32", []>; +defm "" : LMULWriteRes<"WriteVLDS64", []>; +defm "" : LMULWriteRes<"WriteVSTS8", []>; +defm "" : LMULWriteRes<"WriteVSTS16", []>; +defm "" : LMULWriteRes<"WriteVSTS32", []>; +defm "" : LMULWriteRes<"WriteVSTS64", []>; +defm "" : LMULWriteRes<"WriteVLDUX8", []>; +defm "" : LMULWriteRes<"WriteVLDUX16", []>; +defm "" : LMULWriteRes<"WriteVLDUX32", []>; +defm "" : LMULWriteRes<"WriteVLDUX64", []>; +defm "" : LMULWriteRes<"WriteVLDOX8", []>; +defm "" : LMULWriteRes<"WriteVLDOX16", []>; +defm "" : LMULWriteRes<"WriteVLDOX32", []>; +defm "" : LMULWriteRes<"WriteVLDOX64", []>; +defm "" : LMULWriteRes<"WriteVSTUX8", []>; +defm "" : LMULWriteRes<"WriteVSTUX16", []>; +defm "" : LMULWriteRes<"WriteVSTUX32", []>; +defm "" : LMULWriteRes<"WriteVSTUX64", []>; +defm "" : LMULWriteRes<"WriteVSTOX8", []>; +defm "" : LMULWriteRes<"WriteVSTOX16", []>; +defm "" : LMULWriteRes<"WriteVSTOX32", []>; +defm "" : LMULWriteRes<"WriteVSTOX64", []>; +defm "" : LMULWriteRes<"WriteVLDFF", []>; +// These are already LMUL aware def : WriteRes; def : WriteRes; def : WriteRes; @@ -567,15 +572,15 @@ // Vector Segment Loads and Stores foreach nf=2-8 in { foreach eew = [8, 16, 32, 64] in { - def : WriteRes ("WriteVLSEG" # nf # "e" # eew), []>; - def : WriteRes ("WriteVLSEGFF" # nf # "e" # eew), []>; - def : WriteRes ("WriteVSSEG" # nf # "e" # eew), []>; - def : WriteRes ("WriteVLSSEG" # nf # "e" # eew), []>; - def : WriteRes ("WriteVSSSEG" # nf # "e" # eew), []>; - def : WriteRes ("WriteVLUXSEG" # nf # "e" # eew), []>; - def : WriteRes ("WriteVLOXSEG" # nf # "e" # eew), []>; - def : WriteRes ("WriteVSUXSEG" # nf # "e" # eew), []>; - def : WriteRes ("WriteVSOXSEG" # nf # "e" # eew), []>; + defm "" : LMULWriteRes <"WriteVLSEG" # nf # "e" # eew, []>; + defm "" : LMULWriteRes <"WriteVLSEGFF" # nf # "e" # eew, []>; + defm "" : LMULWriteRes <"WriteVSSEG" # nf # "e" # eew, []>; + defm "" : LMULWriteRes <"WriteVLSSEG" # nf # "e" # eew, []>; + defm "" : LMULWriteRes <"WriteVSSSEG" # nf # "e" # eew, []>; + defm "" : LMULWriteRes <"WriteVLUXSEG" # nf # "e" # eew, []>; + defm "" : LMULWriteRes <"WriteVLOXSEG" # nf # "e" # eew, []>; + defm "" : LMULWriteRes <"WriteVSUXSEG" # nf # "e" # eew, []>; + defm "" : LMULWriteRes <"WriteVSOXSEG" # nf # "e" # eew, []>; } } @@ -666,7 +671,7 @@ defm "" : LMULWriteRes<"WriteVFNCvtFToIV", [], SchedMxListW>; defm "" : LMULWriteRes<"WriteVFNCvtFToFV", [], SchedMxListFW>; -// 15. Vector Reduction Operations +// 14. Vector Reduction Operations def : WriteRes; def : WriteRes; def : WriteRes; @@ -674,27 +679,28 @@ def : WriteRes; def : WriteRes; -// 16. Vector Mask Instructions -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; - -// 17. Vector Permutation Instructions -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; +// 15. Vector Mask Instructions +defm "" : LMULWriteRes<"WriteVMALUV", []>; +defm "" : LMULWriteRes<"WriteVMPopV", []>; +defm "" : LMULWriteRes<"WriteVMFFSV", []>; +defm "" : LMULWriteRes<"WriteVMSFSV", []>; +defm "" : LMULWriteRes<"WriteVMIotV", []>; +defm "" : LMULWriteRes<"WriteVMIdxV", []>; + +// 16. Vector Permutation Instructions +defm "" : LMULWriteRes<"WriteVIMovVX", []>; +defm "" : LMULWriteRes<"WriteVIMovXV", []>; +defm "" : LMULWriteRes<"WriteVFMovVF", []>; +defm "" : LMULWriteRes<"WriteVFMovFV", []>; +defm "" : LMULWriteRes<"WriteVISlideX", []>; +defm "" : LMULWriteRes<"WriteVISlideI", []>; +defm "" : LMULWriteRes<"WriteVISlide1X", []>; +defm "" : LMULWriteRes<"WriteVFSlide1F", []>; +defm "" : LMULWriteRes<"WriteVGatherV", []>; +defm "" : LMULWriteRes<"WriteVGatherX", []>; +defm "" : LMULWriteRes<"WriteVGatherI", []>; +defm "" : LMULWriteRes<"WriteVCompressV", []>; +// These are already LMUL aware def : WriteRes; def : WriteRes; def : WriteRes; @@ -705,36 +711,37 @@ def : ReadAdvance; // 7. Vector Loads and Stores -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; +defm "" : LMULReadAdvance<"ReadVLDX", 0>; +defm "" : LMULReadAdvance<"ReadVSTX", 0>; +defm "" : LMULReadAdvance<"ReadVSTEV", 0>; +defm "" : LMULReadAdvance<"ReadVSTM", 0>; +defm "" : LMULReadAdvance<"ReadVLDSX", 0>; +defm "" : LMULReadAdvance<"ReadVSTSX", 0>; +defm "" : LMULReadAdvance<"ReadVSTS8V", 0>; +defm "" : LMULReadAdvance<"ReadVSTS16V", 0>; +defm "" : LMULReadAdvance<"ReadVSTS32V", 0>; +defm "" : LMULReadAdvance<"ReadVSTS64V", 0>; +defm "" : LMULReadAdvance<"ReadVLDUXV", 0>; +defm "" : LMULReadAdvance<"ReadVLDOXV", 0>; +defm "" : LMULReadAdvance<"ReadVSTUXV", 0>; +defm "" : LMULReadAdvance<"ReadVSTUX8", 0>; +defm "" : LMULReadAdvance<"ReadVSTUX16", 0>; +defm "" : LMULReadAdvance<"ReadVSTUX32", 0>; +defm "" : LMULReadAdvance<"ReadVSTUX64", 0>; +defm "" : LMULReadAdvance<"ReadVSTUX8V", 0>; +defm "" : LMULReadAdvance<"ReadVSTUX16V", 0>; +defm "" : LMULReadAdvance<"ReadVSTUX32V", 0>; +defm "" : LMULReadAdvance<"ReadVSTUX64V", 0>; +defm "" : LMULReadAdvance<"ReadVSTOX8", 0>; +defm "" : LMULReadAdvance<"ReadVSTOX16", 0>; +defm "" : LMULReadAdvance<"ReadVSTOX32", 0>; +defm "" : LMULReadAdvance<"ReadVSTOX64", 0>; +defm "" : LMULReadAdvance<"ReadVSTOXV", 0>; +defm "" : LMULReadAdvance<"ReadVSTOX8V", 0>; +defm "" : LMULReadAdvance<"ReadVSTOX16V", 0>; +defm "" : LMULReadAdvance<"ReadVSTOX32V", 0>; +defm "" : LMULReadAdvance<"ReadVSTOX64V", 0>; +// These are already LMUL aware def : ReadAdvance; def : ReadAdvance; def : ReadAdvance; @@ -815,7 +822,7 @@ defm "" : LMULReadAdvance<"ReadVFNCvtFToIV", 0, SchedMxListW>; defm "" : LMULReadAdvance<"ReadVFNCvtFToFV", 0, SchedMxListFW>; -// 15. Vector Reduction Operations +// 14. Vector Reduction Operations def : ReadAdvance; def : ReadAdvance; def : ReadAdvance; @@ -829,27 +836,28 @@ def : ReadAdvance; def : ReadAdvance; -// 16. Vector Mask Instructions -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; - -// 17. Vector Permutation Instructions -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; -def : ReadAdvance; +// 15. Vector Mask Instructions +defm "" : LMULReadAdvance<"ReadVMALUV", 0>; +defm "" : LMULReadAdvance<"ReadVMPopV", 0>; +defm "" : LMULReadAdvance<"ReadVMFFSV", 0>; +defm "" : LMULReadAdvance<"ReadVMSFSV", 0>; +defm "" : LMULReadAdvance<"ReadVMIotV", 0>; + +// 16. Vector Permutation Instructions +defm "" : LMULReadAdvance<"ReadVIMovVX", 0>; +defm "" : LMULReadAdvance<"ReadVIMovXV", 0>; +defm "" : LMULReadAdvance<"ReadVIMovXX", 0>; +defm "" : LMULReadAdvance<"ReadVFMovVF", 0>; +defm "" : LMULReadAdvance<"ReadVFMovFV", 0>; +defm "" : LMULReadAdvance<"ReadVFMovFX", 0>; +defm "" : LMULReadAdvance<"ReadVISlideV", 0>; +defm "" : LMULReadAdvance<"ReadVISlideX", 0>; +defm "" : LMULReadAdvance<"ReadVFSlideV", 0>; +defm "" : LMULReadAdvance<"ReadVFSlideF", 0>; +defm "" : LMULReadAdvance<"ReadVGatherV", 0>; +defm "" : LMULReadAdvance<"ReadVGatherX", 0>; +defm "" : LMULReadAdvance<"ReadVCompressV", 0>; +// These are already LMUL aware def : ReadAdvance; def : ReadAdvance; def : ReadAdvance;