//==- RISCVSchedSyntacoreSCR7.td - Syntacore SCR7 Sched Defs -*- 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 // //===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===// // This file covers scheduling model for rv64imafdcv_zba_zbb_zbc_zbs // configuration of Syntacore SCR7 processor. // Overview: https://syntacore.com/products/scr7 // SCR7 is an out-of-order superscalar dual-issue core. // FIXME: add V and Zkn extensions scheduling model def SyntacoreSCR7Model : SchedMachineModel { let MicroOpBufferSize = 36; let IssueWidth = 2; let MispredictPenalty = 9; let LoadLatency = 3; let CompleteModel = 0; let UnsupportedFeatures = [HasStdExtZksed, HasStdExtZksh, HasStdExtZkr, HasStdExtZcmt, HasVInstructions]; } // Branching multiclass SCR7_Branching { def : WriteRes; def : WriteRes; def : WriteRes; } // Single-cycle integer arithmetic and logic multiclass SCR7_IntALU { def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; } // Pipelined integer multiplication multiclass SCR7_IntMul Resources> { let Latency = 3 in { def : WriteRes; def : WriteRes; } } // Common implementation for WriteIDiv and WriteIDiv32 sched writes. multiclass SCR7_IntDivImpl Resources, list ReleaseCycles, int DivLatency, SchedWrite DivWrite, SchedWrite RemWrite> { let Latency = DivLatency, ReleaseAtCycles = ReleaseCycles in { def : WriteRes; def : WriteRes; } } // Non-pipelined integer division multiclass SCR7_IntDiv Resources, list ReleaseCycles, int DivLatency> { defm : SCR7_IntDivImpl; } multiclass SCR7_IntDiv32 Resources, list ReleaseCycles, int DivLatency> { defm : SCR7_IntDivImpl; } multiclass SCR7_Bitmanip { let Latency = 1 in { // Zba def : WriteRes; def : WriteRes; // Zbb 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; // Zbs def : WriteRes; def : WriteRes; // Zbc def : WriteRes; def : WriteRes; def : WriteRes; } } multiclass SCR7_ScalarCrypto { let Latency = 1 in { // Zbkb def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; // Zbkx def : WriteRes; } } multiclass SCR7_IntPipeline { defm : SCR7_Branching; defm : SCR7_Bitmanip; defm : SCR7_ScalarCrypto; defm : SCR7_IntALU; defm : SCR7_IntMul<[ALU_MUL_IS, MUL]>; defm : SCR7_IntDiv<[ALU_DIV_IS, DIV], /* ReleaseAtCycles */[1, 35], /* Latency */ 35>; defm : SCR7_IntDiv32<[ALU_DIV_IS, DIV], /* ReleaseAtCycles */[1, 19], /* Latency */ 19>; } // Load/store instructions multiclass SCR7_BasicMemory { let Latency = 3 in { def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; } } // Atomic memory multiclass SCR7_AtomicMemory { let Latency = 19 in { def : WriteRes; def : WriteRes; } let Latency = 21 in { def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; } } multiclass SCR7_FPU { // FALU operations let Latency = 4 in { 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; } // FMA operations let Latency = 6 in { def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; } def : WriteRes { let Latency = 16; let ReleaseAtCycles = [1, 15]; } def : WriteRes { let Latency = 30; let ReleaseAtCycles = [1, 29]; } def : WriteRes { let Latency = 18; let ReleaseAtCycles = [1, 16]; } def : WriteRes { let Latency = 32; let ReleaseAtCycles = [1, 30]; } } // Others multiclass SCR7_Other { def : WriteRes; def : WriteRes; def : InstRW<[WriteIALU], (instrs COPY)>; } // Unsupported scheduling classes for SCR7. multiclass SCR7_Unsupported { defm : UnsupportedSchedQ; defm : UnsupportedSchedSFB; defm : UnsupportedSchedV; defm : UnsupportedSchedZabha; defm : UnsupportedSchedZfa; defm : UnsupportedSchedZfhmin; defm : UnsupportedSchedZvk; defm : UnsupportedSchedXsf; } // Bypasses (none) multiclass SCR7_NoReadAdvances { 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; 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; 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; } let SchedModel = SyntacoreSCR7Model in { // Integer pipeline has two reservation stations with single issue port // each. Every station has eight entries: // First station: // - ALU (+ bitmanip and scalar crypto) // - Pipelined Multiplier (3 stage) // Second station: // - ALU (+ bitmanip and scalar crypto) // - Non-pipelined divider (other units are not blocked) def SCR7_ALU_MUL_IS : ProcResource<1> { let BufferSize = 8; } def SCR7_ALU_DIV_IS : ProcResource<1> { let BufferSize = 8; } def SCR7_ALU_Any : ProcResGroup<[SCR7_ALU_MUL_IS, SCR7_ALU_DIV_IS]>; def SCR7_MUL : ProcResource<1> { let BufferSize = 1; } def SCR7_DIV : ProcResource<1> { let BufferSize = 1; } defm : SCR7_IntPipeline; // SCR7 single-issue LSU with sixteen entries. def SCR7_LSU : ProcResource<1> { let BufferSize = 16; } defm : SCR7_BasicMemory; defm : SCR7_AtomicMemory; // FPU has one issue slot with eight entries: // - FP ALU // - FMA // - Non-pipelined FDIV/FSQRT def SCR7_FPU_IS : ProcResource<1> { let BufferSize = 8; } def SCR7_FALU : ProcResource<1> { let BufferSize = 1; } def SCR7_FMA : ProcResource<1> { let BufferSize = 1; } def SCR7_FDIVSQRT : ProcResource<1> { let BufferSize = 1; } defm : SCR7_FPU; defm : SCR7_Other; defm : SCR7_Unsupported; defm : SCR7_NoReadAdvances; }