diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoXSf.td b/llvm/lib/Target/RISCV/RISCVInstrInfoXSf.td index 2d8a47c08a5d2..17fb75eb851c4 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfoXSf.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoXSf.td @@ -167,10 +167,25 @@ multiclass CustomSiFiveVCIX; } +// For XSfvqmaccdod/qoq and XSfvfwmaccqqq +class SiFiveVMACCScheds { + defvar n = !tolower(name); + defvar prefix = !if(!ne(!find(n, "fw"), -1), "FW", "Q"); + defvar suffix = !if(!ne(!find(n, "2x8x2"), -1), "DOD", + !if(!eq(prefix, "Q"), "QOQ", "QQQ")); + + string read = "ReadSF_V" # prefix # "MACC_" # suffix; + string write = "WriteSF_V" # prefix # "MACC_" # suffix; +} + let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in { class CustomSiFiveVMACC funct6, RISCVVFormat opv, string opcodestr> : RVInstVCCustom2 { + opcodestr, "$rd, $rs1, $rs2">, + SchedTernaryMC.write, + SiFiveVMACCScheds.read, + SiFiveVMACCScheds.read, + SiFiveVMACCScheds.read> { let vm = 1; let funct6_lo2 = funct6{1-0}; } @@ -374,9 +389,13 @@ multiclass VPseudoVC_XVW { + defvar SchedWriteName = SiFiveVMACCScheds.write; + defvar SchedReadName = SiFiveVMACCScheds.read; def "Pseudo" # NAME # "_" # mx : VPseudoTernaryNoMaskWithPolicy; + "@earlyclobber $rd">, + SchedTernary; } multiclass VPseudoSiFiveVQMACCDOD { diff --git a/llvm/lib/Target/RISCV/RISCVSchedAndes45.td b/llvm/lib/Target/RISCV/RISCVSchedAndes45.td index 58e9dc9c8535d..bd480aacc539e 100644 --- a/llvm/lib/Target/RISCV/RISCVSchedAndes45.td +++ b/llvm/lib/Target/RISCV/RISCVSchedAndes45.td @@ -332,6 +332,9 @@ defm : UnsupportedSchedSFB; defm : UnsupportedSchedV; defm : UnsupportedSchedXsfvcp; defm : UnsupportedSchedXSfvfnrclipxfqf; +defm : UnsupportedSchedXSfvfwmaccqqq; +defm : UnsupportedSchedXSfvqmaccdod; +defm : UnsupportedSchedXSfvqmaccqoq; defm : UnsupportedSchedZabha; defm : UnsupportedSchedZbkb; defm : UnsupportedSchedZbkx; diff --git a/llvm/lib/Target/RISCV/RISCVSchedGenericOOO.td b/llvm/lib/Target/RISCV/RISCVSchedGenericOOO.td index 27871cb9d9f51..6ad5a008f11ab 100644 --- a/llvm/lib/Target/RISCV/RISCVSchedGenericOOO.td +++ b/llvm/lib/Target/RISCV/RISCVSchedGenericOOO.td @@ -499,4 +499,7 @@ defm : UnsupportedSchedZvk; defm : UnsupportedSchedSFB; defm : UnsupportedSchedXsfvcp; defm : UnsupportedSchedXSfvfnrclipxfqf; +defm : UnsupportedSchedXSfvfwmaccqqq; +defm : UnsupportedSchedXSfvqmaccdod; +defm : UnsupportedSchedXSfvqmaccqoq; } diff --git a/llvm/lib/Target/RISCV/RISCVSchedMIPSP8700.td b/llvm/lib/Target/RISCV/RISCVSchedMIPSP8700.td index 85b5886587de7..4117d7a9f1d58 100644 --- a/llvm/lib/Target/RISCV/RISCVSchedMIPSP8700.td +++ b/llvm/lib/Target/RISCV/RISCVSchedMIPSP8700.td @@ -275,5 +275,8 @@ defm : UnsupportedSchedSFB; defm : UnsupportedSchedZabha; defm : UnsupportedSchedXsfvcp; defm : UnsupportedSchedXSfvfnrclipxfqf; +defm : UnsupportedSchedXSfvfwmaccqqq; +defm : UnsupportedSchedXSfvqmaccdod; +defm : UnsupportedSchedXSfvqmaccqoq; defm : UnsupportedSchedZvk; } diff --git a/llvm/lib/Target/RISCV/RISCVSchedRocket.td b/llvm/lib/Target/RISCV/RISCVSchedRocket.td index 1db0922bf2c5d..b24801f6ecefe 100644 --- a/llvm/lib/Target/RISCV/RISCVSchedRocket.td +++ b/llvm/lib/Target/RISCV/RISCVSchedRocket.td @@ -264,5 +264,8 @@ defm : UnsupportedSchedZfhmin; defm : UnsupportedSchedSFB; defm : UnsupportedSchedXsfvcp; defm : UnsupportedSchedXSfvfnrclipxfqf; +defm : UnsupportedSchedXSfvfwmaccqqq; +defm : UnsupportedSchedXSfvqmaccdod; +defm : UnsupportedSchedXSfvqmaccqoq; defm : UnsupportedSchedZvk; } diff --git a/llvm/lib/Target/RISCV/RISCVSchedSiFive7.td b/llvm/lib/Target/RISCV/RISCVSchedSiFive7.td index 26964d070e67c..9dbab43b6a4e3 100644 --- a/llvm/lib/Target/RISCV/RISCVSchedSiFive7.td +++ b/llvm/lib/Target/RISCV/RISCVSchedSiFive7.td @@ -1072,6 +1072,36 @@ multiclass SiFive7WriteResBase; } + + // XSfvqmaccdod + foreach mx = ["M1", "M2", "M4", "M8"] in { + defvar Cycles = SiFive7GetCyclesDefault.c; + let Latency = 8, + AcquireAtCycles = [0, 1], + ReleaseAtCycles = [1, !add(1, Cycles)] in + defm : LMULWriteResMX<"WriteSF_VQMACC_DOD", [VCQ, VA1], mx, + IsWorstCase=!eq(mx, "M8")>; + } + + // XSfvqmaccqoq + foreach mx = ["MF2", "M1", "M2", "M4"] in { + defvar Cycles = SiFive7GetCyclesDefault.c; + let Latency = 8, + AcquireAtCycles = [0, 1], + ReleaseAtCycles = [1, !add(1, Cycles)] in + defm : LMULWriteResMX<"WriteSF_VQMACC_QOQ", [VCQ, VA1], mx, + IsWorstCase=!eq(mx, "M4")>; + } + + // XSfvfwmaccqqq + foreach mx = SchedMxListFW in { + defvar Cycles = SiFive7GetCyclesDefault.c; + defvar IsWorstCase = SiFive7IsWorstCaseMX.c; + let Latency = 8, + AcquireAtCycles = [0, 1], + ReleaseAtCycles = [1, !add(1, Cycles)] in + defm : LMULWriteResMX<"WriteSF_VFWMACC_QQQ", [VCQ, VA1], mx, IsWorstCase>; + } } //===----------------------------------------------------------------------===// @@ -1353,6 +1383,11 @@ multiclass SiFive7ReadAdvance { defm : LMULReadAdvance<"ReadSF_VFNRClipV", 0>; defm : LMULReadAdvance<"ReadSF_VFNRClipF", 0>; + // SiFive VMACC + defm : LMULReadAdvance<"ReadSF_VQMACC_DOD", 0>; + defm : LMULReadAdvance<"ReadSF_VQMACC_QOQ", 0>; + defm : LMULReadAdvance<"ReadSF_VFWMACC_QQQ", 0>; + // Others def : ReadAdvance; def : ReadAdvance; diff --git a/llvm/lib/Target/RISCV/RISCVSchedSiFiveP400.td b/llvm/lib/Target/RISCV/RISCVSchedSiFiveP400.td index e542d0e2301d0..cb6619b198374 100644 --- a/llvm/lib/Target/RISCV/RISCVSchedSiFiveP400.td +++ b/llvm/lib/Target/RISCV/RISCVSchedSiFiveP400.td @@ -1240,4 +1240,7 @@ defm : UnsupportedSchedSFB; defm : UnsupportedSchedZfa; defm : UnsupportedSchedXsfvcp; defm : UnsupportedSchedXSfvfnrclipxfqf; +defm : UnsupportedSchedXSfvfwmaccqqq; +defm : UnsupportedSchedXSfvqmaccdod; +defm : UnsupportedSchedXSfvqmaccqoq; } diff --git a/llvm/lib/Target/RISCV/RISCVSchedSiFiveP500.td b/llvm/lib/Target/RISCV/RISCVSchedSiFiveP500.td index 184773f943bb1..7dc007f986398 100644 --- a/llvm/lib/Target/RISCV/RISCVSchedSiFiveP500.td +++ b/llvm/lib/Target/RISCV/RISCVSchedSiFiveP500.td @@ -360,4 +360,7 @@ defm : UnsupportedSchedZfa; defm : UnsupportedSchedZvk; defm : UnsupportedSchedXsfvcp; defm : UnsupportedSchedXSfvfnrclipxfqf; +defm : UnsupportedSchedXSfvfwmaccqqq; +defm : UnsupportedSchedXSfvqmaccdod; +defm : UnsupportedSchedXSfvqmaccqoq; } diff --git a/llvm/lib/Target/RISCV/RISCVSchedSiFiveP600.td b/llvm/lib/Target/RISCV/RISCVSchedSiFiveP600.td index 535c639c3150f..a608c23c11a02 100644 --- a/llvm/lib/Target/RISCV/RISCVSchedSiFiveP600.td +++ b/llvm/lib/Target/RISCV/RISCVSchedSiFiveP600.td @@ -1496,4 +1496,7 @@ defm : UnsupportedSchedSFB; defm : UnsupportedSchedZfa; defm : UnsupportedSchedXsfvcp; defm : UnsupportedSchedXSfvfnrclipxfqf; +defm : UnsupportedSchedXSfvfwmaccqqq; +defm : UnsupportedSchedXSfvqmaccdod; +defm : UnsupportedSchedXSfvqmaccqoq; } diff --git a/llvm/lib/Target/RISCV/RISCVSchedSiFiveP800.td b/llvm/lib/Target/RISCV/RISCVSchedSiFiveP800.td index 0bd73a0b80163..26439df3199ce 100644 --- a/llvm/lib/Target/RISCV/RISCVSchedSiFiveP800.td +++ b/llvm/lib/Target/RISCV/RISCVSchedSiFiveP800.td @@ -1185,4 +1185,7 @@ defm : UnsupportedSchedSFB; defm : UnsupportedSchedZfaWithQ; defm : UnsupportedSchedXsfvcp; defm : UnsupportedSchedXSfvfnrclipxfqf; +defm : UnsupportedSchedXSfvfwmaccqqq; +defm : UnsupportedSchedXSfvqmaccdod; +defm : UnsupportedSchedXSfvqmaccqoq; } diff --git a/llvm/lib/Target/RISCV/RISCVSchedSpacemitX60.td b/llvm/lib/Target/RISCV/RISCVSchedSpacemitX60.td index ea6e47260166c..85429ad1806c9 100644 --- a/llvm/lib/Target/RISCV/RISCVSchedSpacemitX60.td +++ b/llvm/lib/Target/RISCV/RISCVSchedSpacemitX60.td @@ -347,6 +347,9 @@ defm : UnsupportedSchedQ; defm : UnsupportedSchedV; defm : UnsupportedSchedXsfvcp; defm : UnsupportedSchedXSfvfnrclipxfqf; +defm : UnsupportedSchedXSfvfwmaccqqq; +defm : UnsupportedSchedXSfvqmaccdod; +defm : UnsupportedSchedXSfvqmaccqoq; defm : UnsupportedSchedZabha; defm : UnsupportedSchedZbkb; defm : UnsupportedSchedZbkx; diff --git a/llvm/lib/Target/RISCV/RISCVSchedSyntacoreSCR1.td b/llvm/lib/Target/RISCV/RISCVSchedSyntacoreSCR1.td index 18c463500b961..727b8d2152c22 100644 --- a/llvm/lib/Target/RISCV/RISCVSchedSyntacoreSCR1.td +++ b/llvm/lib/Target/RISCV/RISCVSchedSyntacoreSCR1.td @@ -118,5 +118,8 @@ defm : UnsupportedSchedZbkx; defm : UnsupportedSchedZfa; defm : UnsupportedSchedXsfvcp; defm : UnsupportedSchedXSfvfnrclipxfqf; +defm : UnsupportedSchedXSfvfwmaccqqq; +defm : UnsupportedSchedXSfvqmaccdod; +defm : UnsupportedSchedXSfvqmaccqoq; defm : UnsupportedSchedZvk; } diff --git a/llvm/lib/Target/RISCV/RISCVSchedSyntacoreSCR345.td b/llvm/lib/Target/RISCV/RISCVSchedSyntacoreSCR345.td index 6b3d6b24b8017..3949eee4a96e8 100644 --- a/llvm/lib/Target/RISCV/RISCVSchedSyntacoreSCR345.td +++ b/llvm/lib/Target/RISCV/RISCVSchedSyntacoreSCR345.td @@ -184,6 +184,9 @@ multiclass SCR_Unsupported : UnsupportedSchedV, UnsupportedSchedXsfvcp, UnsupportedSchedXSfvfnrclipxfqf, + UnsupportedSchedXSfvfwmaccqqq, + UnsupportedSchedXSfvqmaccdod, + UnsupportedSchedXSfvqmaccqoq, UnsupportedSchedZabha, UnsupportedSchedZba, UnsupportedSchedZbb, diff --git a/llvm/lib/Target/RISCV/RISCVSchedSyntacoreSCR7.td b/llvm/lib/Target/RISCV/RISCVSchedSyntacoreSCR7.td index ee25c961515c0..f3aae307eb717 100644 --- a/llvm/lib/Target/RISCV/RISCVSchedSyntacoreSCR7.td +++ b/llvm/lib/Target/RISCV/RISCVSchedSyntacoreSCR7.td @@ -246,6 +246,9 @@ multiclass SCR7_Unsupported { defm : UnsupportedSchedV; defm : UnsupportedSchedXsfvcp; defm : UnsupportedSchedXSfvfnrclipxfqf; + defm : UnsupportedSchedXSfvfwmaccqqq; + defm : UnsupportedSchedXSfvqmaccdod; + defm : UnsupportedSchedXSfvqmaccqoq; defm : UnsupportedSchedZabha; defm : UnsupportedSchedZfa; defm : UnsupportedSchedZfhmin; diff --git a/llvm/lib/Target/RISCV/RISCVSchedTTAscalonD8.td b/llvm/lib/Target/RISCV/RISCVSchedTTAscalonD8.td index d4f0d904b8e89..2a2fc854ea296 100644 --- a/llvm/lib/Target/RISCV/RISCVSchedTTAscalonD8.td +++ b/llvm/lib/Target/RISCV/RISCVSchedTTAscalonD8.td @@ -322,6 +322,9 @@ defm : UnsupportedSchedQ; defm : UnsupportedSchedV; defm : UnsupportedSchedXsfvcp; defm : UnsupportedSchedXSfvfnrclipxfqf; +defm : UnsupportedSchedXSfvfwmaccqqq; +defm : UnsupportedSchedXSfvqmaccdod; +defm : UnsupportedSchedXSfvqmaccqoq; defm : UnsupportedSchedZabha; defm : UnsupportedSchedZbc; defm : UnsupportedSchedZbkb; diff --git a/llvm/lib/Target/RISCV/RISCVSchedXiangShanNanHu.td b/llvm/lib/Target/RISCV/RISCVSchedXiangShanNanHu.td index 735316e48745d..5aad7f5b9e65d 100644 --- a/llvm/lib/Target/RISCV/RISCVSchedXiangShanNanHu.td +++ b/llvm/lib/Target/RISCV/RISCVSchedXiangShanNanHu.td @@ -314,5 +314,8 @@ defm : UnsupportedSchedSFB; defm : UnsupportedSchedZabha; defm : UnsupportedSchedXsfvcp; defm : UnsupportedSchedXSfvfnrclipxfqf; +defm : UnsupportedSchedXSfvfwmaccqqq; +defm : UnsupportedSchedXSfvqmaccdod; +defm : UnsupportedSchedXSfvqmaccqoq; defm : UnsupportedSchedZvk; } diff --git a/llvm/lib/Target/RISCV/RISCVScheduleXSf.td b/llvm/lib/Target/RISCV/RISCVScheduleXSf.td index 56be7a1308a1c..99632e410b4c7 100644 --- a/llvm/lib/Target/RISCV/RISCVScheduleXSf.td +++ b/llvm/lib/Target/RISCV/RISCVScheduleXSf.td @@ -69,3 +69,33 @@ defm : LMULReadAdvance<"ReadSF_VFNRClipV", 0>; defm : LMULReadAdvance<"ReadSF_VFNRClipF", 0>; } // Unsupported = true } + +defm "" : LMULSchedWritesImpl<"WriteSF_VQMACC_DOD", ["M1", "M2", "M4", "M8"]>; +defm "" : LMULSchedReadsImpl<"ReadSF_VQMACC_DOD", ["M1", "M2", "M4", "M8"]>; + +multiclass UnsupportedSchedXSfvqmaccdod { +let Unsupported = true in { +defm : LMULWriteRes<"WriteSF_VQMACC_DOD", []>; +defm : LMULReadAdvance<"ReadSF_VQMACC_DOD", 0>; +} // Unsupported = true +} + +defm "" : LMULSchedWritesImpl<"WriteSF_VQMACC_QOQ", ["MF2", "M1", "M2", "M4"]>; +defm "" : LMULSchedReadsImpl<"ReadSF_VQMACC_QOQ", ["MF2", "M1", "M2", "M4"]>; + +multiclass UnsupportedSchedXSfvqmaccqoq { +let Unsupported = true in { +defm : LMULWriteRes<"WriteSF_VQMACC_QOQ", []>; +defm : LMULReadAdvance<"ReadSF_VQMACC_QOQ", 0>; +} // Unsupported = true +} + +defm "" : LMULSchedWritesImpl<"WriteSF_VFWMACC_QQQ", SchedMxListFW>; +defm "" : LMULSchedReadsImpl<"ReadSF_VFWMACC_QQQ", SchedMxListFW>; + +multiclass UnsupportedSchedXSfvfwmaccqqq { +let Unsupported = true in { +defm : LMULWriteRes<"WriteSF_VFWMACC_QQQ", []>; +defm : LMULReadAdvance<"ReadSF_VFWMACC_QQQ", 0>; +} // Unsupported = true +} diff --git a/llvm/test/tools/llvm-mca/RISCV/SiFive7/xsfvfwmacc.s b/llvm/test/tools/llvm-mca/RISCV/SiFive7/xsfvfwmacc.s new file mode 100644 index 0000000000000..76666c82af208 --- /dev/null +++ b/llvm/test/tools/llvm-mca/RISCV/SiFive7/xsfvfwmacc.s @@ -0,0 +1,75 @@ +# NOTE: Assertions have been autogenerated by utils/update_mca_test_checks.py +# RUN: llvm-mca -mtriple=riscv64 -mcpu=sifive-x280 -mattr='+xsfvfwmaccqqq' -instruction-tables=full -iterations=1 %s | \ +# RUN: FileCheck %s + +vsetvli zero, zero, e16, mf4, ta, ma +sf.vfwmacc.4x4x4 v16, v0, v8 +vsetvli zero, zero, e16, mf2, ta, ma +sf.vfwmacc.4x4x4 v16, v0, v8 +vsetvli zero, zero, e16, m1, ta, ma +sf.vfwmacc.4x4x4 v16, v0, v8 +vsetvli zero, zero, e16, m2, ta, ma +sf.vfwmacc.4x4x4 v16, v0, v8 +vsetvli zero, zero, e16, m4, ta, ma +sf.vfwmacc.4x4x4 v16, v0, v8 + +# CHECK: Resources: +# CHECK-NEXT: [0] - VLEN512SiFive7FDiv:1 +# CHECK-NEXT: [1] - VLEN512SiFive7IDiv:1 +# CHECK-NEXT: [2] - VLEN512SiFive7PipeA:1 +# CHECK-NEXT: [3] - VLEN512SiFive7PipeAB:2 VLEN512SiFive7PipeA, VLEN512SiFive7PipeB +# CHECK-NEXT: [4] - VLEN512SiFive7PipeB:1 +# CHECK-NEXT: [5] - VLEN512SiFive7VA:1 +# CHECK-NEXT: [6] - VLEN512SiFive7VCQ:1 +# CHECK-NEXT: [7] - VLEN512SiFive7VL:1 +# CHECK-NEXT: [8] - VLEN512SiFive7VS:1 + +# CHECK: Instruction Info: +# CHECK-NEXT: [1]: #uOps +# CHECK-NEXT: [2]: Latency +# CHECK-NEXT: [3]: RThroughput +# CHECK-NEXT: [4]: MayLoad +# CHECK-NEXT: [5]: MayStore +# CHECK-NEXT: [6]: HasSideEffects (U) +# CHECK-NEXT: [7]: Bypass Latency +# CHECK-NEXT: [8]: Resources ( | [] | [, | [] | [, | [] | [, | [] | [,