1bdd1243dSDimitry Andric//==- RISCVSchedSyntacoreSCR1.td - Syntacore SCR1 Scheduling Definitions --------*- tablegen -*-=// 2bdd1243dSDimitry Andric// 3bdd1243dSDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4bdd1243dSDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 5bdd1243dSDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6bdd1243dSDimitry Andric// 7bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 8bdd1243dSDimitry Andric 9bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 10bdd1243dSDimitry Andric 11bdd1243dSDimitry Andric// SCR1: https://github.com/syntacore/scr1 12bdd1243dSDimitry Andric 13bdd1243dSDimitry Andric// This model covers SYNTACORE_SCR1_CFG_RV32IMC_MAX configuration (syntacore-scr1-max). 14bdd1243dSDimitry Andric// SYNTACORE_SCR1_CFG_RV32IC_BASE (syntacore-scr1-base) configuration has essentially 15bdd1243dSDimitry Andric// same scheduling characteristics. 16bdd1243dSDimitry Andric 17bdd1243dSDimitry Andric// SCR1 is single-issue in-order processor 18bdd1243dSDimitry Andricdef SyntacoreSCR1Model : SchedMachineModel { 19bdd1243dSDimitry Andric let MicroOpBufferSize = 0; 20bdd1243dSDimitry Andric let IssueWidth = 1; 21bdd1243dSDimitry Andric let LoadLatency = 2; 22bdd1243dSDimitry Andric let MispredictPenalty = 3; 23bdd1243dSDimitry Andric let CompleteModel = 0; 24bdd1243dSDimitry Andric let UnsupportedFeatures = [HasStdExtZbkb, HasStdExtZbkc, HasStdExtZbkx, 25bdd1243dSDimitry Andric HasStdExtZknd, HasStdExtZkne, HasStdExtZknh, 26bdd1243dSDimitry Andric HasStdExtZksed, HasStdExtZksh, HasStdExtZkr, 27bdd1243dSDimitry Andric HasVInstructions]; 28bdd1243dSDimitry Andric} 29bdd1243dSDimitry Andric 30bdd1243dSDimitry Andriclet SchedModel = SyntacoreSCR1Model in { 31bdd1243dSDimitry Andric 32bdd1243dSDimitry Andriclet BufferSize = 0 in { 33bdd1243dSDimitry Andricdef SCR1_ALU : ProcResource<1>; 34bdd1243dSDimitry Andricdef SCR1_LSU : ProcResource<1>; 35bdd1243dSDimitry Andricdef SCR1_MUL : ProcResource<1>; 36bdd1243dSDimitry Andricdef SCR1_DIV : ProcResource<1>; 37bdd1243dSDimitry Andricdef SCR1_CFU : ProcResource<1>; 38bdd1243dSDimitry Andric} 39bdd1243dSDimitry Andric 40bdd1243dSDimitry Andric// Branching 41bdd1243dSDimitry Andricdef : WriteRes<WriteJmp, [SCR1_CFU]>; 42bdd1243dSDimitry Andricdef : WriteRes<WriteJal, [SCR1_CFU]>; 43bdd1243dSDimitry Andricdef : WriteRes<WriteJalr, [SCR1_CFU]>; 44bdd1243dSDimitry Andric 45bdd1243dSDimitry Andric// Integer arithmetic and logic 46bdd1243dSDimitry Andricdef : WriteRes<WriteIALU32, [SCR1_ALU]>; 47bdd1243dSDimitry Andricdef : WriteRes<WriteIALU, [SCR1_ALU]>; 48bdd1243dSDimitry Andricdef : WriteRes<WriteShiftImm32, [SCR1_ALU]>; 49bdd1243dSDimitry Andricdef : WriteRes<WriteShiftImm, [SCR1_ALU]>; 50bdd1243dSDimitry Andricdef : WriteRes<WriteShiftReg32, [SCR1_ALU]>; 51bdd1243dSDimitry Andricdef : WriteRes<WriteShiftReg, [SCR1_ALU]>; 52bdd1243dSDimitry Andric 53bdd1243dSDimitry Andric// Integer multiplication: single-cycle multiplier in SCR1_CFG_RV32IMC_MAX 54bdd1243dSDimitry Andricdef : WriteRes<WriteIMul, [SCR1_MUL]>; 55bdd1243dSDimitry Andricdef : WriteRes<WriteIMul32, [SCR1_MUL]>; 56bdd1243dSDimitry Andric 57*0fca6ea1SDimitry Andric// Integer division/remainder: latency 33, inverse throughput 33 585f757f3fSDimitry Andriclet Latency = 33, ReleaseAtCycles = [33] in { 59bdd1243dSDimitry Andricdef : WriteRes<WriteIDiv32, [SCR1_DIV]>; 60bdd1243dSDimitry Andricdef : WriteRes<WriteIDiv, [SCR1_DIV]>; 61*0fca6ea1SDimitry Andricdef : WriteRes<WriteIRem32, [SCR1_DIV]>; 62*0fca6ea1SDimitry Andricdef : WriteRes<WriteIRem, [SCR1_DIV]>; 63bdd1243dSDimitry Andric} 64bdd1243dSDimitry Andric 65bdd1243dSDimitry Andric// Load/store instructions on SCR1 have latency 2 and inverse throughput 2 66bdd1243dSDimitry Andric// (SCR1_CFG_RV32IMC_MAX includes TCM) 675f757f3fSDimitry Andriclet Latency = 2, ReleaseAtCycles=[2] in { 68bdd1243dSDimitry Andric// Memory 69bdd1243dSDimitry Andricdef : WriteRes<WriteSTB, [SCR1_LSU]>; 70bdd1243dSDimitry Andricdef : WriteRes<WriteSTH, [SCR1_LSU]>; 71bdd1243dSDimitry Andricdef : WriteRes<WriteSTW, [SCR1_LSU]>; 72bdd1243dSDimitry Andricdef : WriteRes<WriteSTD, [SCR1_LSU]>; 73bdd1243dSDimitry Andricdef : WriteRes<WriteLDB, [SCR1_LSU]>; 74bdd1243dSDimitry Andricdef : WriteRes<WriteLDH, [SCR1_LSU]>; 75bdd1243dSDimitry Andricdef : WriteRes<WriteLDW, [SCR1_LSU]>; 76bdd1243dSDimitry Andricdef : WriteRes<WriteLDD, [SCR1_LSU]>; 77bdd1243dSDimitry Andric} 78bdd1243dSDimitry Andric 79bdd1243dSDimitry Andric// Others 80bdd1243dSDimitry Andricdef : WriteRes<WriteCSR, []>; 81bdd1243dSDimitry Andricdef : WriteRes<WriteNop, []>; 82bdd1243dSDimitry Andric 83bdd1243dSDimitry Andricdef : InstRW<[WriteIALU], (instrs COPY)>; 84bdd1243dSDimitry Andric 85bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 86bdd1243dSDimitry Andric// Bypasses (none) 87bdd1243dSDimitry Andricdef : ReadAdvance<ReadJmp, 0>; 88bdd1243dSDimitry Andricdef : ReadAdvance<ReadJalr, 0>; 89bdd1243dSDimitry Andricdef : ReadAdvance<ReadCSR, 0>; 90bdd1243dSDimitry Andricdef : ReadAdvance<ReadStoreData, 0>; 91bdd1243dSDimitry Andricdef : ReadAdvance<ReadMemBase, 0>; 92bdd1243dSDimitry Andricdef : ReadAdvance<ReadIALU, 0>; 93bdd1243dSDimitry Andricdef : ReadAdvance<ReadIALU32, 0>; 94bdd1243dSDimitry Andricdef : ReadAdvance<ReadShiftImm, 0>; 95bdd1243dSDimitry Andricdef : ReadAdvance<ReadShiftImm32, 0>; 96bdd1243dSDimitry Andricdef : ReadAdvance<ReadShiftReg, 0>; 97bdd1243dSDimitry Andricdef : ReadAdvance<ReadShiftReg32, 0>; 98bdd1243dSDimitry Andricdef : ReadAdvance<ReadIDiv, 0>; 99bdd1243dSDimitry Andricdef : ReadAdvance<ReadIDiv32, 0>; 100*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadIRem, 0>; 101*0fca6ea1SDimitry Andricdef : ReadAdvance<ReadIRem32, 0>; 102bdd1243dSDimitry Andricdef : ReadAdvance<ReadIMul, 0>; 103bdd1243dSDimitry Andricdef : ReadAdvance<ReadIMul32, 0>; 104bdd1243dSDimitry Andric 105bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 106bdd1243dSDimitry Andric// Unsupported extensions 107*0fca6ea1SDimitry Andricdefm : UnsupportedSchedA; 108*0fca6ea1SDimitry Andricdefm : UnsupportedSchedD; 109*0fca6ea1SDimitry Andricdefm : UnsupportedSchedF; 110*0fca6ea1SDimitry Andricdefm : UnsupportedSchedSFB; 111bdd1243dSDimitry Andricdefm : UnsupportedSchedV; 112*0fca6ea1SDimitry Andricdefm : UnsupportedSchedZabha; 113bdd1243dSDimitry Andricdefm : UnsupportedSchedZba; 114bdd1243dSDimitry Andricdefm : UnsupportedSchedZbb; 115bdd1243dSDimitry Andricdefm : UnsupportedSchedZbc; 116bdd1243dSDimitry Andricdefm : UnsupportedSchedZbs; 117bdd1243dSDimitry Andricdefm : UnsupportedSchedZbkb; 118bdd1243dSDimitry Andricdefm : UnsupportedSchedZbkx; 11906c3fb27SDimitry Andricdefm : UnsupportedSchedZfa; 120bdd1243dSDimitry Andricdefm : UnsupportedSchedZfh; 121*0fca6ea1SDimitry Andricdefm : UnsupportedSchedXsfvcp; 122*0fca6ea1SDimitry Andricdefm : UnsupportedSchedZvk; 123bdd1243dSDimitry Andric} 124