================ @@ -0,0 +1,290 @@ +//===-- 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>; + +let Latency = 1 in { +def : WriteRes<WriteIALU, [p8700WriteEitherALU]>; +def : WriteRes<WriteIALU32, [p8700WriteEitherALU]>; +def : WriteRes<WriteShiftImm, [p8700WriteEitherALU]>; +def : WriteRes<WriteShiftImm32, [p8700WriteEitherALU]>; +def : WriteRes<WriteShiftReg, [p8700WriteEitherALU]>; +def : WriteRes<WriteShiftReg32, [p8700WriteEitherALU]>; + +// Handle zba. +def : WriteRes<WriteSHXADD, [p8700WriteEitherALU]>; +def : WriteRes<WriteSHXADD32, [p8700WriteEitherALU]>; +} + +// Handle zbb. +let Latency = 2 in { +def : WriteRes<WriteCLZ, [p8700IssueAL2]>; +def : WriteRes<WriteCTZ, [p8700IssueAL2]>; +def : WriteRes<WriteCPOP, [p8700IssueAL2]>; +def : WriteRes<WriteCLZ32, [p8700IssueAL2]>; +def : WriteRes<WriteCTZ32, [p8700IssueAL2]>; +def : WriteRes<WriteCPOP32, [p8700IssueAL2]>; +} +let Latency = 1 in { +def : WriteRes<WriteRotateReg, [p8700WriteEitherALU]>; +def : WriteRes<WriteRotateImm, [p8700WriteEitherALU]>; +def : WriteRes<WriteRotateReg32, [p8700WriteEitherALU]>; +def : WriteRes<WriteRotateImm32, [p8700WriteEitherALU]>; +def : WriteRes<WriteREV8, [p8700WriteEitherALU]>; +def : WriteRes<WriteORCB, [p8700WriteEitherALU]>; +def : WriteRes<WriteIMinMax, [p8700WriteEitherALU]>; +} + +let Latency = 0 in { +def : WriteRes<WriteNop, [p8700WriteEitherALU]>; +} + +let Latency = 4 in { +def : WriteRes<WriteLDB, [p8700IssueLSU]>; +def : WriteRes<WriteLDH, [p8700IssueLSU]>; +def : WriteRes<WriteLDW, [p8700IssueLSU]>; +def : WriteRes<WriteLDD, [p8700IssueLSU]>; + +def : WriteRes<WriteAtomicW, [p8700IssueLSU]>; +def : WriteRes<WriteAtomicD, [p8700IssueLSU]>; +def : WriteRes<WriteAtomicLDW, [p8700IssueLSU]>; +def : WriteRes<WriteAtomicLDD, [p8700IssueLSU]>; +} + +let Latency = 8 in { +def : WriteRes<WriteFLD32, [p8700IssueLSU]>; +def : WriteRes<WriteFLD64, [p8700IssueLSU]>; +} + +let Latency = 3 in { +def : WriteRes<WriteSTB, [p8700IssueLSU]>; +def : WriteRes<WriteSTH, [p8700IssueLSU]>; +def : WriteRes<WriteSTW, [p8700IssueLSU]>; +def : WriteRes<WriteSTD, [p8700IssueLSU]>; + +def : WriteRes<WriteAtomicSTW, [p8700IssueLSU]>; +def : WriteRes<WriteAtomicSTD, [p8700IssueLSU]>; +} + +let Latency = 1 in { +def : WriteRes<WriteFST32, [p8700IssueLSU]>; +def : WriteRes<WriteFST64, [p8700IssueLSU]>; +} + +let Latency = 7 in { +def : WriteRes<WriteFMovI32ToF32, [p8700IssueLSU]>; +def : WriteRes<WriteFMovF32ToI32, [p8700IssueLSU]>; +def : WriteRes<WriteFMovI64ToF64, [p8700IssueLSU]>; +def : WriteRes<WriteFMovF64ToI64, [p8700IssueLSU]>; +} + +let Latency = 4 in { +def : WriteRes<WriteIMul, [p8700GpMul]>; +def : WriteRes<WriteIMul32, [p8700GpMul]>; +} + +let Latency = 8, ReleaseAtCycles = [5] in { +def : WriteRes<WriteIDiv, [p8700GpDiv]>; +def : WriteRes<WriteIDiv32, [p8700GpDiv]>; +} + +def : WriteRes<WriteCSR, [p8700ALQ]>; + +def : WriteRes<WriteIRem, []>; +def : WriteRes<WriteIRem32, []>; + +// Handle CTI Pipeline. +let Latency = 1 in { ---------------- mshockwave wrote:
ditto https://github.com/llvm/llvm-project/pull/119885 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits