//- RISCVSchedSpacemitX100.td - Spacemit X100 Scheduling 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 // //===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===// // // Scheduler model for the SpacemiT-X100 processor. // //===----------------------------------------------------------------------===// def SpacemitX100Model : SchedMachineModel { let IssueWidth = 4; // 4 micro-ops are dispatched per cycle. let MicroOpBufferSize = 192; // Max micro-ops that can be buffered. // 64 entry ROB. Max 3 micro-ops share one entry. let LoadLatency = 3; // Cycles for loads to access the cache. let MispredictPenalty = 9; // Extra cycles for a mispredicted branch. let CompleteModel = 0; let UnsupportedFeatures = [HasStdExtZknd, HasStdExtZkne, HasStdExtZknh, HasStdExtZksed, HasStdExtZksh, HasStdExtZkr, HasVInstructions]; } let SchedModel = SpacemitX100Model in { //===----------------------------------------------------------------------===// // Define processor resources for Spacemit-X100 let BufferSize = 6 in { // IQ0, IQ1, BQ: 12 entry queue, can accept 2 ops and issue 1 op per cycle // To model the accept bandwidth, split into 2 sub-queues of 6 entry each def SMTX100_IQ0 : ProcResource<2>; //Integer Queue 0 def SMTX100_IQ1 : ProcResource<2>; //Integer Queue 1 def SMTX100_BQ : ProcResource<2>; //Branch Queue } let BufferSize = 4 in { // LSQ: 16 entry queue, can accept 4 ops and issue 2 op per cycle // To model the accept bandwidth, split into 4 sub-queues of 4 entry each def SMTX100_LSQ : ProcResource<4>; //Load Store Queue // FQ0, FQ1: 8 entry queue, can accept 2 ops and issue 1 op per cycle // To model the accept bandwidth, split into 2 sub-queues of 4 entry each def SMTX100_FQ0 : ProcResource<2>; //Float Queue 0 def SMTX100_FQ1 : ProcResource<2>; //Float Queue 1 } def SMTX100_IQ : ProcResGroup<[SMTX100_IQ0, SMTX100_IQ1]>; def SMTX100_FQ : ProcResGroup<[SMTX100_FQ0, SMTX100_FQ1]>; //===----------------------------------------------------------------------===// // Branching let Latency = 2 in { def : WriteRes; def : WriteRes; def : WriteRes; } // Integer arithmetic and logic def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; // Integer multiplication def : WriteRes { let Latency = 2; } def : WriteRes { let Latency = 3; } // Integer division/remainder // Latency is 4-14, Worst case latency is used let Latency = 14, ReleaseAtCycles = [14] in { def : WriteRes; def : WriteRes; } // Latency is 4-22, Worst case latency is used let Latency = 22, ReleaseAtCycles = [22] in { def : WriteRes; def : WriteRes; } // Bitmanip def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; let Latency = 2 in { def : WriteRes; def : WriteRes; } def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes { let Latency = 2; } // Single-bit instructions def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; // Memory/Atomic memory def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; let Latency = 3 in { def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; } let Latency = 4 in { def : WriteRes; def : WriteRes; def : WriteRes; } // Atomics // Latency is at least 7, not sure worst case latency now let Latency = 7 in { def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; } // Floating point units Half precision let Latency = 3 in { def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; } def : WriteRes { let Latency = 5; } // Latency is 4-12, Worst case latency is used let Latency = 12, ReleaseAtCycles = [12] in { def : WriteRes; def : WriteRes; } // Single precision let Latency = 3 in { def : WriteRes; def : WriteRes; def : WriteRes; } def : WriteRes { let Latency = 4; } def : WriteRes { let Latency = 5; } // Latency is 4-12, Worst case latency is used let Latency = 12, ReleaseAtCycles = [12] in { def : WriteRes; def : WriteRes; } // Double precision let Latency = 3 in { def : WriteRes; def : WriteRes; def : WriteRes; } def : WriteRes { let Latency = 4; } def : WriteRes { let Latency = 4; } // Latency is 4-20, Worst case latency is used let Latency = 20, ReleaseAtCycles = [20] in { def : WriteRes; def : WriteRes; } // Zfa let Latency = 3 in { def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; } // Conversions 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; 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; } // Others def : WriteRes; def : WriteRes; //===----------------------------------------------------------------------===// // Bypass and advance 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; // Bitmanip 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; // Single-bit instructions def : ReadAdvance; def : ReadAdvance; // Zfa def : ReadAdvance; def : ReadAdvance; def : ReadAdvance; //===----------------------------------------------------------------------===// // Unsupported extensions defm : UnsupportedSchedQ; defm : UnsupportedSchedV; defm : UnsupportedSchedZabha; defm : UnsupportedSchedZbkb; defm : UnsupportedSchedZbkx; defm : UnsupportedSchedZfaWithQ; defm : UnsupportedSchedZvk; defm : UnsupportedSchedSFB; defm : UnsupportedSchedXsf; }