================ @@ -0,0 +1,503 @@ +//===-- RISCVSchedGenericOOO.td - Generic O3 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. +// * VXU (Vector Unit): 1 unit. +// * 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. +// * Vector instructions: 2-6 cycles. +// * Load/Store: +// * IXU: 4 cycles. +// * FXU: 4 cycles. +// * VXU: 6 cycles. +// * Integer/floating-point/vector div/rem/sqrt/... are non-pipelined. +//===----------------------------------------------------------------------===// + +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]>; +// TODO: Add vector scheduling. +// def GenericOOOVXU : ProcResource<1>; + +//===----------------------------------------------------------------------===// +// Branches +//===----------------------------------------------------------------------===// +def : WriteRes<WriteJmp, [GenericOOOBranch]>; +def : WriteRes<WriteJalr, [GenericOOOBranch]>; +def : WriteRes<WriteJal, [GenericOOOBranch]>; + +//===----------------------------------------------------------------------===// +// Integer arithmetic and logic +//===----------------------------------------------------------------------===// +def : WriteRes<WriteIALU, [GenericOOOALU]>; +def : WriteRes<WriteIALU32, [GenericOOOALU]>; +def : WriteRes<WriteShiftImm, [GenericOOOALU]>; +def : WriteRes<WriteShiftImm32, [GenericOOOALU]>; +def : WriteRes<WriteShiftReg, [GenericOOOALU]>; +def : WriteRes<WriteShiftReg32, [GenericOOOALU]>; + +//===----------------------------------------------------------------------===// +// Integer multiplication +//===----------------------------------------------------------------------===// +let Latency = 4 in { + def : WriteRes<WriteIMul, [GenericOOOMulDiv]>; + def : WriteRes<WriteIMul32, [GenericOOOMulDiv]>; +} + +//===----------------------------------------------------------------------===// +// Integer division +//===----------------------------------------------------------------------===// +def : WriteRes<WriteIDiv32, [GenericOOOMulDiv]> { + let Latency = 13; + let ReleaseAtCycles = [13]; +} +def : WriteRes<WriteIDiv, [GenericOOOMulDiv]> { + let Latency = 21; + let ReleaseAtCycles = [21]; +} +def : WriteRes<WriteIRem32, [GenericOOOMulDiv]> { + let Latency = 13; + let ReleaseAtCycles = [13]; +} +def : WriteRes<WriteIRem, [GenericOOOMulDiv]> { + let Latency = 21; + let ReleaseAtCycles = [21]; +} + +//===----------------------------------------------------------------------===// +// Integer memory +//===----------------------------------------------------------------------===// +// Load +let Latency = 4 in { + def : WriteRes<WriteLDB, [GenericOOOLSU]>; + def : WriteRes<WriteLDH, [GenericOOOLSU]>; + def : WriteRes<WriteLDW, [GenericOOOLSU]>; + def : WriteRes<WriteLDD, [GenericOOOLSU]>; +} + +// Store +def : WriteRes<WriteSTB, [GenericOOOLSU]>; +def : WriteRes<WriteSTH, [GenericOOOLSU]>; +def : WriteRes<WriteSTW, [GenericOOOLSU]>; +def : WriteRes<WriteSTD, [GenericOOOLSU]>; + +//===----------------------------------------------------------------------===// +// Atomic +//===----------------------------------------------------------------------===// +let Latency = 4 in { + def : WriteRes<WriteAtomicLDW, [GenericOOOLSU]>; + def : WriteRes<WriteAtomicLDD, [GenericOOOLSU]>; +} + +let Latency = 5 in { + def : WriteRes<WriteAtomicW, [GenericOOOLSU]>; + def : WriteRes<WriteAtomicD, [GenericOOOLSU]>; +} + +def : WriteRes<WriteAtomicSTW, [GenericOOOLSU]>; +def : WriteRes<WriteAtomicSTD, [GenericOOOLSU]>; + +//===----------------------------------------------------------------------===// +// Floating-point +//===----------------------------------------------------------------------===// +// Floating-point load +let Latency = 4 in { + def : WriteRes<WriteFLD32, [GenericOOOLSU]>; + def : WriteRes<WriteFLD64, [GenericOOOLSU]>; +} + +// Floating-point store +def : WriteRes<WriteFST32, [GenericOOOLSU]>; +def : WriteRes<WriteFST64, [GenericOOOLSU]>; + +// Arithmetic and logic +let Latency = 2 in { + def : WriteRes<WriteFAdd32, [GenericOOOFPU]>; + def : WriteRes<WriteFAdd64, [GenericOOOFPU]>; +} + +def : WriteRes<WriteFSGNJ32, [GenericOOOFPU]>; +def : WriteRes<WriteFSGNJ64, [GenericOOOFPU]>; +def : WriteRes<WriteFMinMax32, [GenericOOOFPU]>; +def : WriteRes<WriteFMinMax64, [GenericOOOFPU]>; + +// Compare +let Latency = 2 in { + def : WriteRes<WriteFCmp32, [GenericOOOFPU]>; + def : WriteRes<WriteFCmp64, [GenericOOOFPU]>; +} + +// Multiplication +let Latency = 4 in { + def : WriteRes<WriteFMul32, [GenericOOOFMulDiv]>; + def : WriteRes<WriteFMul64, [GenericOOOFMulDiv]>; +} + +// FMA +let Latency = 6 in { + def : WriteRes<WriteFMA32, [GenericOOOFMulDiv]>; + def : WriteRes<WriteFMA64, [GenericOOOFMulDiv]>; +} + +// Division +let Latency = 13, ReleaseAtCycles = [13] in { + def : WriteRes<WriteFDiv32, [GenericOOOFMulDiv]>; + def : WriteRes<WriteFSqrt32, [GenericOOOFMulDiv]>; +} + +let Latency = 17, ReleaseAtCycles = [17] in { + def : WriteRes<WriteFDiv64, [GenericOOOFMulDiv]>; + def : WriteRes<WriteFSqrt64, [GenericOOOFMulDiv]>; +} + +// Conversions +let Latency = 2 in { + def : WriteRes<WriteFCvtI32ToF32, [GenericOOOFPU]>; + def : WriteRes<WriteFCvtI32ToF64, [GenericOOOFPU]>; + def : WriteRes<WriteFCvtI64ToF32, [GenericOOOFPU]>; + def : WriteRes<WriteFCvtI64ToF64, [GenericOOOFPU]>; +} + +let Latency = 2 in { + def : WriteRes<WriteFCvtF32ToI32, [GenericOOOFPU]>; + def : WriteRes<WriteFCvtF32ToI64, [GenericOOOFPU]>; +} + +let Latency = 2 in { + def : WriteRes<WriteFCvtF64ToI32, [GenericOOOFPU]>; + def : WriteRes<WriteFCvtF64ToI64, [GenericOOOFPU]>; +} + +let Latency = 2 in { + def : WriteRes<WriteFCvtF64ToF32, [GenericOOOFPU]>; + def : WriteRes<WriteFCvtF32ToF64, [GenericOOOFPU]>; +} + +let Latency = 2 in { + def : WriteRes<WriteFMovI32ToF32, [GenericOOOFPU]>; + def : WriteRes<WriteFMovI64ToF64, [GenericOOOFPU]>; + def : WriteRes<WriteFMovF32ToI32, [GenericOOOFPU]>; + def : WriteRes<WriteFMovF64ToI64, [GenericOOOFPU]>; +} + +// Classify +def : WriteRes<WriteFClass32, [GenericOOOFPU]>; +def : WriteRes<WriteFClass64, [GenericOOOFPU]>; + +//===----------------------------------------------------------------------===// +// Zicsr extension +//===----------------------------------------------------------------------===// +def : WriteRes<WriteCSR, [GenericOOOALU]>; + +//===----------------------------------------------------------------------===// +// Zabha extension +//===----------------------------------------------------------------------===// +let Latency = 5 in { + def : WriteRes<WriteAtomicB, [GenericOOOLSU]>; + def : WriteRes<WriteAtomicH, [GenericOOOLSU]>; +} + +//===----------------------------------------------------------------------===// +// Zba extension +//===----------------------------------------------------------------------===// +def : WriteRes<WriteSHXADD, [GenericOOOALU]>; +def : WriteRes<WriteSHXADD32, [GenericOOOALU]>; + +//===----------------------------------------------------------------------===// +// Zbb extension +//===----------------------------------------------------------------------===// +def : WriteRes<WriteCLZ, [GenericOOOALU]>; +def : WriteRes<WriteCTZ, [GenericOOOALU]>; +def : WriteRes<WriteCPOP, [GenericOOOALU]>; +def : WriteRes<WriteCLZ32, [GenericOOOALU]>; +def : WriteRes<WriteCTZ32, [GenericOOOALU]>; +def : WriteRes<WriteCPOP32, [GenericOOOALU]>; +def : WriteRes<WriteRotateReg, [GenericOOOALU]>; +def : WriteRes<WriteRotateImm, [GenericOOOALU]>; +def : WriteRes<WriteRotateReg32, [GenericOOOALU]>; +def : WriteRes<WriteRotateImm32, [GenericOOOALU]>; +def : WriteRes<WriteREV8, [GenericOOOALU]>; +def : WriteRes<WriteORCB, [GenericOOOALU]>; +def : WriteRes<WriteIMinMax, [GenericOOOALU]>; + +//===----------------------------------------------------------------------===// +// Zbc extension +//===----------------------------------------------------------------------===// +def : WriteRes<WriteCLMUL, [GenericOOOALU]>; + +//===----------------------------------------------------------------------===// +// Zbs extension +//===----------------------------------------------------------------------===// +def : WriteRes<WriteSingleBit, [GenericOOOALU]>; +def : WriteRes<WriteSingleBitImm, [GenericOOOALU]>; +def : WriteRes<WriteBEXT, [GenericOOOALU]>; +def : WriteRes<WriteBEXTI, [GenericOOOALU]>; + +//===----------------------------------------------------------------------===// +// Zbkb extension +//===----------------------------------------------------------------------===// +def : WriteRes<WriteBREV8, [GenericOOOALU]>; +def : WriteRes<WritePACK, [GenericOOOALU]>; +def : WriteRes<WritePACK32, [GenericOOOALU]>; +def : WriteRes<WriteZIP, [GenericOOOALU]>; + +//===----------------------------------------------------------------------===// +// Zbkx extension +//===----------------------------------------------------------------------===// +def : WriteRes<WriteXPERM, [GenericOOOALU]>; + +//===----------------------------------------------------------------------===// +// Zfa extension +//===----------------------------------------------------------------------===// +let Latency = 2 in { + def : WriteRes<WriteFRoundF16, [GenericOOOFPU]>; + def : WriteRes<WriteFRoundF32, [GenericOOOFPU]>; + def : WriteRes<WriteFRoundF64, [GenericOOOFPU]>; +} + +let Latency = 2 in { + def : WriteRes<WriteFLI16, [GenericOOOFPU]>; + def : WriteRes<WriteFLI32, [GenericOOOFPU]>; + def : WriteRes<WriteFLI64, [GenericOOOFPU]>; +} + +//===----------------------------------------------------------------------===// +// Zfh extension +//===----------------------------------------------------------------------===// +// Zfhmin +// Load/Store +let Latency = 4 in +def : WriteRes<WriteFLD16, [GenericOOOLSU]>; +def : WriteRes<WriteFST16, [GenericOOOLSU]>; + +// Conversions +let Latency = 2 in { + def : WriteRes<WriteFCvtF16ToF64, [GenericOOOFPU]>; + def : WriteRes<WriteFCvtF64ToF16, [GenericOOOFPU]>; + def : WriteRes<WriteFCvtF32ToF16, [GenericOOOFPU]>; + def : WriteRes<WriteFCvtF16ToF32, [GenericOOOFPU]>; +} + +let Latency = 2 in { + def : WriteRes<WriteFMovI16ToF16, [GenericOOOFPU]>; + def : WriteRes<WriteFMovF16ToI16, [GenericOOOFPU]>; +} + +// Other than Zfhmin +let Latency = 2 in { + def : WriteRes<WriteFCvtI64ToF16, []>; ---------------- topperc wrote:
Why no ProcResource? https://github.com/llvm/llvm-project/pull/120712 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits