//==- RISCVSchedSyntacoreSCR345.td - SCR3/4/5 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 models for Syntacore SCR3, SCR4 and SCR5 // processors. // Configurations: // * SCR3 rv32imc and rv64imac, overview https://syntacore.com/products/scr3 // * SCR4 rv32imfdc and rv64imafdc, overview https://syntacore.com/products/scr4 // * SCR5 rv32imafdc and rv64imafdc, overview // https://syntacore.com/products/scr5 // SCR3-5 are single-issue in-order processors class SyntacoreSchedModel : SchedMachineModel { let MicroOpBufferSize = 0; let IssueWidth = 1; let MispredictPenalty = 3; let CompleteModel = 0; let UnsupportedFeatures = [HasStdExtZbkb, HasStdExtZbkc, HasStdExtZbkx, HasStdExtZknd, HasStdExtZkne, HasStdExtZknh, HasStdExtZksed, HasStdExtZksh, HasStdExtZkr, HasVInstructions]; } // Branching multiclass SCR_Branching { def : WriteRes; def : WriteRes; def : WriteRes; } // Single-cycle integer arithmetic and logic multiclass SCR_IntALU { def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; } // Integer multiplication multiclass SCR_IntMul { let Latency = 2 in { def : WriteRes; def : WriteRes; } } // Integer division multiclass SCR_IntDiv { let Latency = DivLatency, ReleaseAtCycles = [DivLatency] in { def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; } } // Load/store instructions multiclass SCR_BasicMemory { let Latency = LoadStoreLatency in { def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; } } // Floating-point load/store instructions multiclass SCR_FPMemory { let Latency = FPLoadStoreLatency in { def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; } } // Atomic memory multiclass SCR_AtomicMemory { let Latency = 20 in { def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; } } // Floating-point unit (without division and SQRT) multiclass SCR_FPU { // Single and double-precision computational instructions def : WriteRes { let Latency = 3; } def : WriteRes { let Latency = 3; } def : WriteRes { let Latency = 4; } def : WriteRes { let Latency = 4; } def : WriteRes { let Latency = 4; } def : WriteRes { let Latency = 4; } def : WriteRes { let Latency = 2; } def : WriteRes { let Latency = 2; } def : WriteRes { let Latency = 2; } def : WriteRes { let Latency = 2; } // Conversion and move instructions let Latency = 3 in { def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; } let Latency = 2 in { def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; } let Latency = 2 in { def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; } let Latency = 2 in { def : WriteRes; def : WriteRes; } // Comparisons let Latency = 2 in { def : WriteRes; def : WriteRes; } } // FP division and SQRT is not pipelined multiclass SCR_FDU { def : WriteRes { let Latency = 10; let ReleaseAtCycles = [8]; } def : WriteRes { let Latency = 17; let ReleaseAtCycles = [15]; } def : WriteRes { let Latency = 19; let ReleaseAtCycles = [19]; } def : WriteRes { let Latency = 33; let ReleaseAtCycles = [33]; } } // Others multiclass SCR_Other { def : WriteRes; def : WriteRes; def : InstRW<[WriteIALU], (instrs COPY)>; } // Unsupported scheduling classes for SCR3-5. multiclass SCR_Unsupported : UnsupportedSchedSFB, UnsupportedSchedV, UnsupportedSchedZabha, UnsupportedSchedZba, UnsupportedSchedZbb, UnsupportedSchedZbc, UnsupportedSchedZbs, UnsupportedSchedZbkb, UnsupportedSchedZbkx, UnsupportedSchedZfa, UnsupportedSchedZvk, UnsupportedSchedXsf; multiclass SCR3_Unsupported : SCR_Unsupported, UnsupportedSchedF; multiclass SCR4_SCR5_Unsupported : SCR_Unsupported, UnsupportedSchedQ, UnsupportedSchedZfhmin; // Bypasses (none) multiclass SCR_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; } // Floating-point bypasses (none) multiclass SCR4_SCR5_NoReadAdvances : SCR_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; } //===----------------------------------------------------------------------===// // SCR3 scheduling model definition def SyntacoreSCR3RV32Model : SyntacoreSchedModel { let LoadLatency = 2; } let SchedModel = SyntacoreSCR3RV32Model in { let BufferSize = 0 in { def SCR3RV32_ALU : ProcResource<1>; def SCR3RV32_MUL : ProcResource<1>; def SCR3RV32_DIV : ProcResource<1>; def SCR3RV32_LSU : ProcResource<1>; def SCR3RV32_CFU : ProcResource<1>; } defm : SCR_Branching; defm : SCR_IntALU; defm : SCR_IntMul; defm : SCR_IntDiv; defm : SCR_BasicMemory; defm : SCR_AtomicMemory; defm : SCR_Other; defm : SCR3_Unsupported; defm : SCR_NoReadAdvances; } def SyntacoreSCR3RV64Model : SyntacoreSchedModel { let LoadLatency = 2; } let SchedModel = SyntacoreSCR3RV64Model in { let BufferSize = 0 in { def SCR3RV64_ALU : ProcResource<1>; def SCR3RV64_MUL : ProcResource<1>; def SCR3RV64_DIV : ProcResource<1>; def SCR3RV64_LSU : ProcResource<1>; def SCR3RV64_CFU : ProcResource<1>; } defm : SCR_Branching; defm : SCR_IntALU; defm : SCR_IntMul; defm : SCR_IntDiv; defm : SCR_BasicMemory; defm : SCR_AtomicMemory; defm : SCR_Other; defm : SCR3_Unsupported; defm : SCR_NoReadAdvances; } //===----------------------------------------------------------------------===// // SCR4 scheduling model definition def SyntacoreSCR4RV32Model : SyntacoreSchedModel { let LoadLatency = 2; } let SchedModel = SyntacoreSCR4RV32Model in { let BufferSize = 0 in { def SCR4RV32_ALU : ProcResource<1>; def SCR4RV32_MUL : ProcResource<1>; def SCR4RV32_DIV : ProcResource<1>; def SCR4RV32_LSU : ProcResource<1>; def SCR4RV32_CFU : ProcResource<1>; def SCR4RV32_FPU : ProcResource<1>; def SCR4RV32_FDU : ProcResource<1>; // FP div and sqrt resource } defm : SCR_Branching; defm : SCR_IntALU; defm : SCR_IntMul; defm : SCR_IntDiv; defm : SCR_BasicMemory; defm : SCR_FPMemory; defm : SCR_AtomicMemory; defm : SCR_FPU; defm : SCR_FDU; defm : SCR_Other; defm : SCR4_SCR5_Unsupported; defm : SCR4_SCR5_NoReadAdvances; } def SyntacoreSCR4RV64Model : SyntacoreSchedModel { let LoadLatency = 2; } let SchedModel = SyntacoreSCR4RV64Model in { let BufferSize = 0 in { def SCR4RV64_ALU : ProcResource<1>; def SCR4RV64_MUL : ProcResource<1>; def SCR4RV64_DIV : ProcResource<1>; def SCR4RV64_LSU : ProcResource<1>; def SCR4RV64_CFU : ProcResource<1>; def SCR4RV64_FPU : ProcResource<1>; def SCR4RV64_FDU : ProcResource<1>; // FP div and sqrt resource } defm : SCR_Branching; defm : SCR_IntALU; defm : SCR_IntMul; defm : SCR_IntDiv; defm : SCR_BasicMemory; defm : SCR_FPMemory; defm : SCR_AtomicMemory; defm : SCR_FPU; defm : SCR_FDU; defm : SCR_Other; defm : SCR4_SCR5_Unsupported; defm : SCR4_SCR5_NoReadAdvances; } //===----------------------------------------------------------------------===// // SCR5 scheduling model definition def SyntacoreSCR5RV32Model : SyntacoreSchedModel { let LoadLatency = 3; } let SchedModel = SyntacoreSCR5RV32Model in { let BufferSize = 0 in { def SCR5RV32_ALU : ProcResource<1>; def SCR5RV32_MUL : ProcResource<1>; def SCR5RV32_DIV : ProcResource<1>; def SCR5RV32_LSU : ProcResource<1>; def SCR5RV32_CFU : ProcResource<1>; def SCR5RV32_FPU : ProcResource<1>; def SCR5RV32_FDU : ProcResource<1>; // FP div and sqrt resource } defm : SCR_Branching; defm : SCR_IntALU; defm : SCR_IntMul; defm : SCR_IntDiv; defm : SCR_BasicMemory; defm : SCR_FPMemory; defm : SCR_AtomicMemory; defm : SCR_FPU; defm : SCR_FDU; defm : SCR_Other; defm : SCR4_SCR5_Unsupported; defm : SCR4_SCR5_NoReadAdvances; } def SyntacoreSCR5RV64Model : SyntacoreSchedModel { let LoadLatency = 3; } let SchedModel = SyntacoreSCR5RV64Model in { let BufferSize = 0 in { def SCR5RV64_ALU : ProcResource<1>; def SCR5RV64_MUL : ProcResource<1>; def SCR5RV64_DIV : ProcResource<1>; def SCR5RV64_LSU : ProcResource<1>; def SCR5RV64_CFU : ProcResource<1>; def SCR5RV64_FPU : ProcResource<1>; def SCR5RV64_FDU : ProcResource<1>; // FP div and sqrt resource } defm : SCR_Branching; defm : SCR_IntALU; defm : SCR_IntMul; defm : SCR_IntDiv; defm : SCR_BasicMemory; defm : SCR_FPMemory; defm : SCR_AtomicMemory; defm : SCR_FPU; defm : SCR_FDU; defm : SCR_Other; defm : SCR4_SCR5_Unsupported; defm : SCR4_SCR5_NoReadAdvances; }