//==- RISCVSchedSyntacoreSCR1.td - Syntacore SCR1 Scheduling Definitions --------*- tablegen -*-=// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===// // SCR1: https://github.com/syntacore/scr1 // This model covers SYNTACORE_SCR1_CFG_RV32IMC_MAX configuration (syntacore-scr1-max). // SYNTACORE_SCR1_CFG_RV32IC_BASE (syntacore-scr1-base) configuration has essentially // same scheduling characteristics. // SCR1 is single-issue in-order processor def SyntacoreSCR1Model : SchedMachineModel { let MicroOpBufferSize = 0; let IssueWidth = 1; let LoadLatency = 2; let MispredictPenalty = 3; let CompleteModel = 0; let UnsupportedFeatures = [HasStdExtZbkb, HasStdExtZbkc, HasStdExtZbkx, HasStdExtZknd, HasStdExtZkne, HasStdExtZknh, HasStdExtZksed, HasStdExtZksh, HasStdExtZkr, HasVInstructions]; } let SchedModel = SyntacoreSCR1Model in { let BufferSize = 0 in { def SCR1_ALU : ProcResource<1>; def SCR1_LSU : ProcResource<1>; def SCR1_MUL : ProcResource<1>; def SCR1_DIV : ProcResource<1>; def SCR1_CFU : ProcResource<1>; } // Branching def : WriteRes; def : WriteRes; def : WriteRes; // Integer arithmetic and logic def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; // Integer multiplication: single-cycle multiplier in SCR1_CFG_RV32IMC_MAX def : WriteRes; def : WriteRes; // Integer division/remainder: latency 33, inverse throughput 33 let Latency = 33, ReleaseAtCycles = [33] in { def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; } // Load/store instructions on SCR1 have latency 2 and inverse throughput 2 // (SCR1_CFG_RV32IMC_MAX includes TCM) let Latency = 2, ReleaseAtCycles=[2] in { // Memory def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; } // Others def : WriteRes; def : WriteRes; def : InstRW<[WriteIALU], (instrs COPY)>; //===----------------------------------------------------------------------===// // Bypasses (none) 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; //===----------------------------------------------------------------------===// // Unsupported extensions defm : UnsupportedSchedA; defm : UnsupportedSchedD; defm : UnsupportedSchedF; defm : UnsupportedSchedSFB; defm : UnsupportedSchedV; defm : UnsupportedSchedZabha; defm : UnsupportedSchedZba; defm : UnsupportedSchedZbb; defm : UnsupportedSchedZbc; defm : UnsupportedSchedZbs; defm : UnsupportedSchedZbkb; defm : UnsupportedSchedZbkx; defm : UnsupportedSchedZfa; defm : UnsupportedSchedZfh; defm : UnsupportedSchedXsfvcp; defm : UnsupportedSchedZvk; }