//==- RISCVSchedAndes45.td - Andes45 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 // //===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===// // FIXME: Implement sheduling model for V and other extensions. def Andes45Model : SchedMachineModel { let MicroOpBufferSize = 0; // Andes45 is in-order processor let IssueWidth = 2; // 2 micro-ops dispatched per cycle let LoadLatency = 2; let MispredictPenalty = 5; let CompleteModel = 0; } let SchedModel = Andes45Model in { //===----------------------------------------------------------------------===// // Define each kind of processor resource and number available. //===----------------------------------------------------------------------===// // Andes 45 series CPU // - 2 Interger Arithmetic and Logical Units (ALU) // - Multiply / Divide Unit (MDU) // - Load Store Unit (LSU) // - Control and Status Register Unit (CSR) // - Floating Point Multiply-Accumulate Unit (FMAC) // - Floating Point Divide / SQRT Unit (FDIV) // - Floating Point Move Unit (FMV) // - Floating Point Misc Unit (FMISC) //===----------------------------------------------------------------------===// let BufferSize = 0 in { def Andes45ALU : ProcResource<2>; def Andes45MDU : ProcResource<1>; def Andes45LSU : ProcResource<1>; def Andes45CSR : ProcResource<1>; def Andes45FMAC : ProcResource<1>; def Andes45FDIV : ProcResource<1>; def Andes45FMV : ProcResource<1>; def Andes45FMISC : ProcResource<1>; } // Integer arithmetic and logic def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; // Short forward branch def : WriteRes { let Latency = 1; let NumMicroOps = 2; } // Branching def : WriteRes; def : WriteRes; def : WriteRes; // Integer multiplication let Latency = 3 in { def : WriteRes; def : WriteRes; } // Integer division let Latency = 39, ReleaseAtCycles = [39] in { def : WriteRes; def : WriteRes; } // Integer remainder let Latency = 39, ReleaseAtCycles = [39] in { def : WriteRes; def : WriteRes; } // Memory let Latency = 5 in { def : WriteRes; def : WriteRes; def : WriteRes; } let Latency = 3 in { def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; } let Latency = 1 in { def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; } // Atomic Memory let Latency = 9 in { def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; } let Latency = 3 in { def : WriteRes; def : WriteRes; } // FMAC let Latency = 4 in { def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; } // FDIV let Latency = 12, ReleaseAtCycles = [12] in def : WriteRes; let Latency = 11, ReleaseAtCycles = [11] in def : WriteRes; let Latency = 19, ReleaseAtCycles = [19] in def : WriteRes; let Latency = 18, ReleaseAtCycles = [18] in def : WriteRes; let Latency = 33, ReleaseAtCycles = [33] in def : WriteRes; let Latency = 32, ReleaseAtCycles = [32] in def : WriteRes; // FMV def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; // FMISC let Latency = 2 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; } // Bitmanip // Zba extension def : WriteRes; def : WriteRes; // Zbb extension 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; def : WriteRes; def : WriteRes; } // Zbc extension let Latency = 3 in def : WriteRes; // Zbs extension 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; 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; //===----------------------------------------------------------------------===// // Unsupported extensions defm : UnsupportedSchedQ; defm : UnsupportedSchedV; defm : UnsupportedSchedZabha; defm : UnsupportedSchedZbkb; defm : UnsupportedSchedZbkx; defm : UnsupportedSchedZfa; defm : UnsupportedSchedZvk; defm : UnsupportedSchedXsf; }