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 @@ -809,26 +809,30 @@ def VSETVL : RVInstSetVL<(outs GPR:$rd), (ins GPR:$rs1, GPR:$rs2), "vsetvl", "$rd, $rs1, $rs2">; } // hasSideEffects = 1, mayLoad = 0, mayStore = 0 - -// Vector Unit-Stride Instructions -def VLE8_V : VUnitStrideLoad, - VLESched<8>; -def VLE16_V : VUnitStrideLoad, - VLESched<16>; -def VLE32_V : VUnitStrideLoad, - VLESched<32>; -def VLE64_V : VUnitStrideLoad, - VLESched<64>; - -// Vector Unit-Stride Fault-only-First Loads -def VLE8FF_V : VUnitStrideLoadFF, - VLFSched<8>; -def VLE16FF_V : VUnitStrideLoadFF, - VLFSched<16>; -def VLE32FF_V : VUnitStrideLoadFF, - VLFSched<32>; -def VLE64FF_V : VUnitStrideLoadFF, - VLFSched<64>; +foreach eew = [8, 16, 32, 64] in { + defvar w = !cast("LSWidth" # eew); + + // Vector Unit-Stride Instructions + 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; + + // Vector Strided Instructions + def VLSE#eew#_V : VStridedLoad, VLSSched; + def VSSE#eew#_V : VStridedStore, VSSSched; + + // Vector Indexed Instructions + def VLUXEI#eew#_V : + VIndexedLoad, VLXSched; + def VLOXEI#eew#_V : + VIndexedLoad, VLXSched; + def VSUXEI#eew#_V : + VIndexedStore, VSXSched; + def VSOXEI#eew#_V : + VIndexedStore, VSXSched; +} def VLM_V : VUnitStrideLoadMask<"vlm.v">, Sched<[WriteVLDM, ReadVLDX]>; @@ -839,53 +843,6 @@ def : InstAlias<"vse1.v $vs3, (${rs1})", (VSM_V VR:$vs3, GPR:$rs1), 0>; -def VSE8_V : VUnitStrideStore, - VSESched<8>; -def VSE16_V : VUnitStrideStore, - VSESched<16>; -def VSE32_V : VUnitStrideStore, - VSESched<32>; -def VSE64_V : VUnitStrideStore, - VSESched<64>; - -// Vector Strided Instructions -def VLSE8_V : VStridedLoad, - VLSSched<8>; -def VLSE16_V : VStridedLoad, - VLSSched<16>; -def VLSE32_V : VStridedLoad, - VLSSched<32>; -def VLSE64_V : VStridedLoad, - VLSSched<32>; - -def VSSE8_V : VStridedStore, - VSSSched<8>; -def VSSE16_V : VStridedStore, - VSSSched<16>; -def VSSE32_V : VStridedStore, - VSSSched<32>; -def VSSE64_V : VStridedStore, - VSSSched<64>; - -// Vector Indexed Instructions -foreach n = [8, 16, 32, 64] in { -defvar w = !cast("LSWidth" # n); - -def VLUXEI # n # _V : - VIndexedLoad, - VLXSched; -def VLOXEI # n # _V : - VIndexedLoad, - VLXSched; - -def VSUXEI # n # _V : - VIndexedStore, - VSXSched; -def VSOXEI # n # _V : - VIndexedStore, - VSXSched; -} - defm VL1R : VWholeLoadN<0, "vl1r", VR>; defm VL2R : VWholeLoadN<1, "vl2r", VRM2>; defm VL4R : VWholeLoadN<3, "vl4r", VRM4>; @@ -1472,107 +1429,52 @@ let Predicates = [HasStdExtZvlsseg] in { foreach nf=2-8 in { - def VLSEG#nf#E8_V : VUnitStrideSegmentLoad; - def VLSEG#nf#E16_V : VUnitStrideSegmentLoad; - def VLSEG#nf#E32_V : VUnitStrideSegmentLoad; - def VLSEG#nf#E64_V : VUnitStrideSegmentLoad; - - def VLSEG#nf#E8FF_V : VUnitStrideSegmentLoadFF; - def VLSEG#nf#E16FF_V : VUnitStrideSegmentLoadFF; - def VLSEG#nf#E32FF_V : VUnitStrideSegmentLoadFF; - def VLSEG#nf#E64FF_V : VUnitStrideSegmentLoadFF; - - def VSSEG#nf#E8_V : VUnitStrideSegmentStore; - def VSSEG#nf#E16_V : VUnitStrideSegmentStore; - def VSSEG#nf#E32_V : VUnitStrideSegmentStore; - def VSSEG#nf#E64_V : VUnitStrideSegmentStore; - - // Vector Strided Instructions - def VLSSEG#nf#E8_V : VStridedSegmentLoad; - def VLSSEG#nf#E16_V : VStridedSegmentLoad; - def VLSSEG#nf#E32_V : VStridedSegmentLoad; - def VLSSEG#nf#E64_V : VStridedSegmentLoad; - - def VSSSEG#nf#E8_V : VStridedSegmentStore; - def VSSSEG#nf#E16_V : VStridedSegmentStore; - def VSSSEG#nf#E32_V : VStridedSegmentStore; - def VSSSEG#nf#E64_V : VStridedSegmentStore; - - // Vector Indexed Instructions - def VLUXSEG#nf#EI8_V : VIndexedSegmentLoad; - def VLUXSEG#nf#EI16_V : VIndexedSegmentLoad; - def VLUXSEG#nf#EI32_V : VIndexedSegmentLoad; - def VLUXSEG#nf#EI64_V : VIndexedSegmentLoad; - - def VLOXSEG#nf#EI8_V : VIndexedSegmentLoad; - def VLOXSEG#nf#EI16_V : VIndexedSegmentLoad; - def VLOXSEG#nf#EI32_V : VIndexedSegmentLoad; - def VLOXSEG#nf#EI64_V : VIndexedSegmentLoad; - - def VSUXSEG#nf#EI8_V : VIndexedSegmentStore; - def VSUXSEG#nf#EI16_V : VIndexedSegmentStore; - def VSUXSEG#nf#EI32_V : VIndexedSegmentStore; - def VSUXSEG#nf#EI64_V : VIndexedSegmentStore; - - def VSOXSEG#nf#EI8_V : VIndexedSegmentStore; - def VSOXSEG#nf#EI16_V : VIndexedSegmentStore; - def VSOXSEG#nf#EI32_V : VIndexedSegmentStore; - def VSOXSEG#nf#EI64_V : VIndexedSegmentStore; + foreach eew = [8, 16, 32, 64] in { + defvar w = !cast("LSWidth"#eew); + + def VLSEG#nf#E#eew#_V : + VUnitStrideSegmentLoad; + def VLSEG#nf#E#eew#FF_V : + VUnitStrideSegmentLoadFF; + def VSSEG#nf#E#eew#_V : + VUnitStrideSegmentStore; + + // Vector Strided Instructions + def VLSSEG#nf#E#eew#_V : + VStridedSegmentLoad; + def VSSSEG#nf#E#eew#_V : + VStridedSegmentStore; + + // Vector Indexed Instructions + def VLUXSEG#nf#EI#eew#_V : + VIndexedSegmentLoad; + def VLOXSEG#nf#EI#eew#_V : + VIndexedSegmentLoad; + def VSUXSEG#nf#EI#eew#_V : + VIndexedSegmentStore; + def VSOXSEG#nf#EI#eew#_V : + VIndexedSegmentStore; + } } } // Predicates = [HasStdExtZvlsseg] let Predicates = [HasStdExtZvamo, HasStdExtA] in { - defm VAMOSWAPEI8 : VAMO; - defm VAMOSWAPEI16 : VAMO; - defm VAMOSWAPEI32 : VAMO; - - defm VAMOADDEI8 : VAMO; - defm VAMOADDEI16 : VAMO; - defm VAMOADDEI32 : VAMO; - - defm VAMOXOREI8 : VAMO; - defm VAMOXOREI16 : VAMO; - defm VAMOXOREI32 : VAMO; - - defm VAMOANDEI8 : VAMO; - defm VAMOANDEI16 : VAMO; - defm VAMOANDEI32 : VAMO; - - defm VAMOOREI8 : VAMO; - defm VAMOOREI16 : VAMO; - defm VAMOOREI32 : VAMO; - - defm VAMOMINEI8 : VAMO; - defm VAMOMINEI16 : VAMO; - defm VAMOMINEI32 : VAMO; - - defm VAMOMAXEI8 : VAMO; - defm VAMOMAXEI16 : VAMO; - defm VAMOMAXEI32 : VAMO; - - defm VAMOMINUEI8 : VAMO; - defm VAMOMINUEI16 : VAMO; - defm VAMOMINUEI32 : VAMO; - - defm VAMOMAXUEI8 : VAMO; - defm VAMOMAXUEI16 : VAMO; - defm VAMOMAXUEI32 : VAMO; + foreach eew = [8, 16, 32] in { + defvar w = !cast("LSWidth"#eew); + defm VAMOSWAPEI#eew : VAMO; + defm VAMOADDEI#eew : VAMO; + defm VAMOXOREI#eew : VAMO; + defm VAMOANDEI#eew : VAMO; + defm VAMOOREI#eew : VAMO; + defm VAMOMINEI#eew : VAMO; + defm VAMOMAXEI#eew : VAMO; + defm VAMOMINUEI#eew : VAMO; + defm VAMOMAXUEI#eew : VAMO; + } } // Predicates = [HasStdExtZvamo, HasStdExtA] let Predicates = [HasStdExtZvamo, HasStdExtA, IsRV64] in {