//===-- RISCVSchedGenericOOO.td - Generic OOO 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 // //===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===// // We assume that: // * 6-issue out-of-order CPU with 192 ROB entries. // * Units: // * IXU (Integer ALU Unit): 4 units, only one can execute mul/div. // * FXU (Floating-point Unit): 2 units. // * LSU (Load/Store Unit): 2 units. // * Latency: // * Integer instructions: 1 cycle. // * Multiplication instructions: 4 cycles. // * Division instructions: 13-21 cycles. // * Floating-point instructions: 2-6 cycles. // * Floating-point fdiv/fsqrt instructions: 9-21 cycles. // * Load/Store: // * IXU: 4 cycles. // * FXU: 4 cycles. // * Integer/floating-point/vector div/rem/sqrt/... are non-pipelined. // // TODO: Add vector scheduling. //===----------------------------------------------------------------------===// def GenericOOOModel : SchedMachineModel { int IssueWidth = 6; int MicroOpBufferSize = 192; int LoadLatency = 4; int MispredictPenalty = 8; let CompleteModel = 0; } let SchedModel = GenericOOOModel in { //===----------------------------------------------------------------------===// // Resource groups //===----------------------------------------------------------------------===// def GenericOOOBranch : ProcResource<1>; def GenericOOOMulDiv : ProcResource<1>; def GenericOOOInt : ProcResource<2>; def GenericOOOALU : ProcResGroup<[GenericOOOBranch, GenericOOOMulDiv, GenericOOOInt]>; def GenericOOOLSU : ProcResource<2>; def GenericOOOFMulDiv : ProcResource<1>; def GenericOOOFloat : ProcResource<1>; def GenericOOOFPU : ProcResGroup<[GenericOOOFMulDiv, GenericOOOFloat]>; //===----------------------------------------------------------------------===// // Branches //===----------------------------------------------------------------------===// def : WriteRes; def : WriteRes; def : WriteRes; //===----------------------------------------------------------------------===// // Integer arithmetic and logic //===----------------------------------------------------------------------===// def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; //===----------------------------------------------------------------------===// // Integer multiplication //===----------------------------------------------------------------------===// let Latency = 4 in { def : WriteRes; def : WriteRes; } //===----------------------------------------------------------------------===// // Integer division //===----------------------------------------------------------------------===// def : WriteRes { let Latency = 13; let ReleaseAtCycles = [13]; } def : WriteRes { let Latency = 21; let ReleaseAtCycles = [21]; } def : WriteRes { let Latency = 13; let ReleaseAtCycles = [13]; } def : WriteRes { let Latency = 21; let ReleaseAtCycles = [21]; } //===----------------------------------------------------------------------===// // Integer memory //===----------------------------------------------------------------------===// // Load let Latency = 4 in { def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; } // Store def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; //===----------------------------------------------------------------------===// // Atomic //===----------------------------------------------------------------------===// let Latency = 4 in { def : WriteRes; def : WriteRes; } let Latency = 5 in { def : WriteRes; def : WriteRes; } def : WriteRes; def : WriteRes; //===----------------------------------------------------------------------===// // Floating-point //===----------------------------------------------------------------------===// // Floating-point load let Latency = 4 in { def : WriteRes; def : WriteRes; } // Floating-point store def : WriteRes; def : WriteRes; // Arithmetic and logic let Latency = 2 in { def : WriteRes; def : WriteRes; } def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; // Compare let Latency = 2 in { def : WriteRes; def : WriteRes; } // Multiplication let Latency = 4 in { def : WriteRes; def : WriteRes; } // FMA let Latency = 6 in { def : WriteRes; def : WriteRes; } // Division let Latency = 13, ReleaseAtCycles = [13] in { def : WriteRes; def : WriteRes; } let Latency = 17, ReleaseAtCycles = [17] in { def : WriteRes; def : WriteRes; } // Conversions let Latency = 2 in { def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; } let Latency = 2 in { def : WriteRes; def : WriteRes; } let Latency = 2 in { def : WriteRes; def : WriteRes; } let Latency = 2 in { def : WriteRes; def : WriteRes; } let Latency = 2 in { def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; } // Classify def : WriteRes; def : WriteRes; //===----------------------------------------------------------------------===// // Zicsr extension //===----------------------------------------------------------------------===// def : WriteRes; //===----------------------------------------------------------------------===// // Zabha extension //===----------------------------------------------------------------------===// let Latency = 5 in { def : WriteRes; def : WriteRes; } //===----------------------------------------------------------------------===// // Zba extension //===----------------------------------------------------------------------===// def : WriteRes; def : WriteRes; //===----------------------------------------------------------------------===// // Zbb extension //===----------------------------------------------------------------------===// 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; //===----------------------------------------------------------------------===// // Zbc extension //===----------------------------------------------------------------------===// def : WriteRes; //===----------------------------------------------------------------------===// // Zbs extension //===----------------------------------------------------------------------===// def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; //===----------------------------------------------------------------------===// // Zbkb extension //===----------------------------------------------------------------------===// def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; //===----------------------------------------------------------------------===// // Zbkx extension //===----------------------------------------------------------------------===// def : WriteRes; //===----------------------------------------------------------------------===// // Zfa extension //===----------------------------------------------------------------------===// let Latency = 2 in { def : WriteRes; def : WriteRes; def : WriteRes; } let Latency = 2 in { def : WriteRes; def : WriteRes; def : WriteRes; } //===----------------------------------------------------------------------===// // Zfh extension //===----------------------------------------------------------------------===// // Zfhmin // Load/Store let Latency = 4 in def : WriteRes; def : WriteRes; // Conversions let Latency = 2 in { def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; } let Latency = 2 in { def : WriteRes; def : WriteRes; } // Other than Zfhmin let Latency = 2 in { def : WriteRes; def : WriteRes; def : WriteRes; def : WriteRes; } // Arithmetic and logic let Latency = 2 in def : WriteRes; def : WriteRes; def : WriteRes; // Compare let Latency = 2 in def : WriteRes; // Multiplication let Latency = 4 in def : WriteRes; // FMA let Latency = 6 in def : WriteRes; // Division let Latency = 9, ReleaseAtCycles = [9] in { def : WriteRes; def : WriteRes; } // Classify def : WriteRes; //===----------------------------------------------------------------------===// // Misc //===----------------------------------------------------------------------===// let Latency = 0 in 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; // Zabha def : ReadAdvance; def : ReadAdvance; def : ReadAdvance; def : ReadAdvance; // Zba extension def : ReadAdvance; def : ReadAdvance; // Zbb extension def : ReadAdvance; def : ReadAdvance; def : ReadAdvance; def : ReadAdvance; def : ReadAdvance; def : ReadAdvance; def : ReadAdvance; def : ReadAdvance; def : ReadAdvance; def : ReadAdvance; def : ReadAdvance; def : ReadAdvance; def : ReadAdvance; // Zbc extension def : ReadAdvance; // Zbs extension def : ReadAdvance; def : ReadAdvance; // Zbkb def : ReadAdvance; def : ReadAdvance; def : ReadAdvance; def : ReadAdvance; // Zbkx def : ReadAdvance; // Zfa extension def : ReadAdvance; def : ReadAdvance; def : ReadAdvance; // Zfh extension def : ReadAdvance; def : ReadAdvance; def : ReadAdvance; def : ReadAdvance; def : ReadAdvance; def : ReadAdvance; def : ReadAdvance; def : ReadAdvance; 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 : UnsupportedSchedZfaWithQ; defm : UnsupportedSchedZvk; defm : UnsupportedSchedSFB; defm : UnsupportedSchedXsf; }