//===-- RISCVSchedMIPSP8700.td - MIPS RISC-V Processor -----*- 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 // //===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===// // P8700 - a RISC-V processor by MIPS. // Pipelines: // - 2 Integer Arithmetic and Logical Units (ALU and AL2) // - Multiply / Divide Unit (MDU) // - Branch Unit (CTI) // - Load Store Unit (LSU) // - Short Floating Point Pipe (FPUS) // - Long Floating Point Pipe (FPUL) //===----------------------------------------------------------------------===// def MIPSP8700Model : SchedMachineModel { int IssueWidth = 4; int MicroOpBufferSize = 96; int LoadLatency = 4; int MispredictPenalty = 8; let CompleteModel = 0; } let SchedModel = MIPSP8700Model in { // Handle ALQ Pipelines. // It contains 1 ALU Unit only. def p8700ALQ : ProcResource<1> { let BufferSize = 16; } // Handle AGQ Pipelines. def p8700AGQ : ProcResource<3> { let BufferSize = 16; } def p8700IssueAL2 : ProcResource<1> { let Super = p8700AGQ; } def p8700IssueCTI : ProcResource<1> { let Super = p8700AGQ; } def p8700IssueLSU : ProcResource<1> { let Super = p8700AGQ; } def p8700WriteEitherALU : ProcResGroup<[p8700ALQ, p8700IssueAL2]>; // Handle Multiply Divide Pipe. def p8700GpDiv : ProcResource<1>; def p8700GpMul : ProcResource<1>; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; // Handle zba. def : WriteRes; def : WriteRes; // Handle zbb. 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; let Latency = 0 in def : WriteRes; let Latency = 4 in { def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; } let Latency = 8 in { def : WriteRes; def : WriteRes; } let Latency = 3 in { def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; } def : WriteRes; def : WriteRes; let Latency = 7 in { def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; } let Latency = 4 in { def : WriteRes; def : WriteRes; } let Latency = 7, ReleaseAtCycles = [7] in { def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; } def : WriteRes; // Handle CTI Pipeline. def : WriteRes; def : WriteRes; def : WriteRes; // Handle FPU Pipelines. def p8700FPQ : ProcResource<3> { let BufferSize = 16; } def p8700IssueFPUS : ProcResource<1> { let Super = p8700FPQ; } def p8700IssueFPUL : ProcResource<1> { let Super = p8700FPQ; } def p8700FpuApu : ProcResource<1>; def p8700FpuLong : ProcResource<1>; 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; } let Latency = 2 in { def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; } def : WriteRes; def : WriteRes; let Latency = 8 in { def : WriteRes; def : WriteRes; } let Latency = 5 in { def : WriteRes; def : WriteRes; } let Latency = 11, ReleaseAtCycles = [1, 11] in { def : WriteRes; def : WriteRes; } let Latency = 17, ReleaseAtCycles = [1, 17] in { 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; // Unsupported extensions. defm : UnsupportedSchedQ; defm : UnsupportedSchedV; defm : UnsupportedSchedZbc; defm : UnsupportedSchedZbs; defm : UnsupportedSchedZbkb; defm : UnsupportedSchedZbkx; defm : UnsupportedSchedZfa; defm : UnsupportedSchedZfhmin; defm : UnsupportedSchedSFB; defm : UnsupportedSchedZabha; defm : UnsupportedSchedZvk; defm : UnsupportedSchedXsf; }