1*0fca6ea1SDimitry Andric//==- RISCVSchedSyntacoreSCR3.td - Syntacore SCR3 Scheduling Definitions -*- tablegen -*-=// 2*0fca6ea1SDimitry Andric// 3*0fca6ea1SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0fca6ea1SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 5*0fca6ea1SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0fca6ea1SDimitry Andric// 7*0fca6ea1SDimitry Andric//===----------------------------------------------------------------------===// 8*0fca6ea1SDimitry Andric 9*0fca6ea1SDimitry Andric//===----------------------------------------------------------------------===// 10*0fca6ea1SDimitry Andric 11*0fca6ea1SDimitry Andric// This model covers SYNTACORE_SCR3_RV32IMC and SYNTACORE_RV64IMAC 12*0fca6ea1SDimitry Andric// configurations (syntacore-scr3-rv32/64). 13*0fca6ea1SDimitry Andric// Overview: https://syntacore.com/products/scr3 14*0fca6ea1SDimitry Andric 15*0fca6ea1SDimitry Andric// SCR3 is single-issue in-order processor 16*0fca6ea1SDimitry Andricclass SyntacoreSCR3Model : SchedMachineModel { 17*0fca6ea1SDimitry Andric let MicroOpBufferSize = 0; 18*0fca6ea1SDimitry Andric let IssueWidth = 1; 19*0fca6ea1SDimitry Andric let LoadLatency = 2; 20*0fca6ea1SDimitry Andric let MispredictPenalty = 3; 21*0fca6ea1SDimitry Andric let CompleteModel = 0; 22*0fca6ea1SDimitry Andric let UnsupportedFeatures = [HasStdExtD, HasStdExtZbkb, HasStdExtZbkc, HasStdExtZbkx, 23*0fca6ea1SDimitry Andric HasStdExtZknd, HasStdExtZkne, HasStdExtZknh, 24*0fca6ea1SDimitry Andric HasStdExtZksed, HasStdExtZksh, HasStdExtZkr, 25*0fca6ea1SDimitry Andric HasVInstructions]; 26*0fca6ea1SDimitry Andric} 27*0fca6ea1SDimitry Andric 28*0fca6ea1SDimitry Andric// Branching 29*0fca6ea1SDimitry Andricmulticlass SCR3_Branching<ProcResourceKind BRU> { 30*0fca6ea1SDimitry Andric def : WriteRes<WriteJmp, [BRU]>; 31*0fca6ea1SDimitry Andric def : WriteRes<WriteJal, [BRU]>; 32*0fca6ea1SDimitry Andric def : WriteRes<WriteJalr, [BRU]>; 33*0fca6ea1SDimitry Andric} 34*0fca6ea1SDimitry Andric 35*0fca6ea1SDimitry Andric// Single-cycle integer arithmetic and logic 36*0fca6ea1SDimitry Andricmulticlass SCR3_IntALU<ProcResourceKind ALU> { 37*0fca6ea1SDimitry Andric def : WriteRes<WriteIALU, [ALU]>; 38*0fca6ea1SDimitry Andric def : WriteRes<WriteIALU32, [ALU]>; 39*0fca6ea1SDimitry Andric def : WriteRes<WriteShiftImm, [ALU]>; 40*0fca6ea1SDimitry Andric def : WriteRes<WriteShiftImm32, [ALU]>; 41*0fca6ea1SDimitry Andric def : WriteRes<WriteShiftReg, [ALU]>; 42*0fca6ea1SDimitry Andric def : WriteRes<WriteShiftReg32, [ALU]>; 43*0fca6ea1SDimitry Andric} 44*0fca6ea1SDimitry Andric 45*0fca6ea1SDimitry Andric// Integer multiplication 46*0fca6ea1SDimitry Andricmulticlass SCR3_IntMul<ProcResourceKind MUL> { 47*0fca6ea1SDimitry Andric let Latency = 2 in { 48*0fca6ea1SDimitry Andric def : WriteRes<WriteIMul, [MUL]>; 49*0fca6ea1SDimitry Andric def : WriteRes<WriteIMul32, [MUL]>; 50*0fca6ea1SDimitry Andric } 51*0fca6ea1SDimitry Andric} 52*0fca6ea1SDimitry Andric 53*0fca6ea1SDimitry Andric// Integer division 54*0fca6ea1SDimitry Andricmulticlass SCR3_IntDiv<ProcResourceKind DIV, int DivLatency> { 55*0fca6ea1SDimitry Andric let Latency = DivLatency, ReleaseAtCycles = [DivLatency] in { 56*0fca6ea1SDimitry Andric def : WriteRes<WriteIDiv, [DIV]>; 57*0fca6ea1SDimitry Andric def : WriteRes<WriteIDiv32, [DIV]>; 58*0fca6ea1SDimitry Andric def : WriteRes<WriteIRem, [DIV]>; 59*0fca6ea1SDimitry Andric def : WriteRes<WriteIRem32, [DIV]>; 60*0fca6ea1SDimitry Andric } 61*0fca6ea1SDimitry Andric} 62*0fca6ea1SDimitry Andric 63*0fca6ea1SDimitry Andric// Load/store instructions on SCR3 have latency 2 64*0fca6ea1SDimitry Andricmulticlass SCR3_Memory<ProcResourceKind LSU> { 65*0fca6ea1SDimitry Andric let Latency = 2 in { 66*0fca6ea1SDimitry Andric def : WriteRes<WriteSTB, [LSU]>; 67*0fca6ea1SDimitry Andric def : WriteRes<WriteSTH, [LSU]>; 68*0fca6ea1SDimitry Andric def : WriteRes<WriteSTW, [LSU]>; 69*0fca6ea1SDimitry Andric def : WriteRes<WriteSTD, [LSU]>; 70*0fca6ea1SDimitry Andric def : WriteRes<WriteLDB, [LSU]>; 71*0fca6ea1SDimitry Andric def : WriteRes<WriteLDH, [LSU]>; 72*0fca6ea1SDimitry Andric def : WriteRes<WriteLDW, [LSU]>; 73*0fca6ea1SDimitry Andric def : WriteRes<WriteLDD, [LSU]>; 74*0fca6ea1SDimitry Andric } 75*0fca6ea1SDimitry Andric} 76*0fca6ea1SDimitry Andric 77*0fca6ea1SDimitry Andric// Atomic memory 78*0fca6ea1SDimitry Andricmulticlass SCR3_AtomicMemory<ProcResourceKind LSU> { 79*0fca6ea1SDimitry Andric let Latency = 20 in { 80*0fca6ea1SDimitry Andric def : WriteRes<WriteAtomicLDW, [LSU]>; 81*0fca6ea1SDimitry Andric def : WriteRes<WriteAtomicLDD, [LSU]>; 82*0fca6ea1SDimitry Andric def : WriteRes<WriteAtomicW, [LSU]>; 83*0fca6ea1SDimitry Andric def : WriteRes<WriteAtomicD, [LSU]>; 84*0fca6ea1SDimitry Andric def : WriteRes<WriteAtomicSTW, [LSU]>; 85*0fca6ea1SDimitry Andric def : WriteRes<WriteAtomicSTD, [LSU]>; 86*0fca6ea1SDimitry Andric } 87*0fca6ea1SDimitry Andric} 88*0fca6ea1SDimitry Andric 89*0fca6ea1SDimitry Andric// Others 90*0fca6ea1SDimitry Andricmulticlass SCR3_Other { 91*0fca6ea1SDimitry Andric def : WriteRes<WriteCSR, []>; 92*0fca6ea1SDimitry Andric def : WriteRes<WriteNop, []>; 93*0fca6ea1SDimitry Andric 94*0fca6ea1SDimitry Andric def : InstRW<[WriteIALU], (instrs COPY)>; 95*0fca6ea1SDimitry Andric} 96*0fca6ea1SDimitry Andric 97*0fca6ea1SDimitry Andric 98*0fca6ea1SDimitry Andricmulticlass SCR3_Unsupported { 99*0fca6ea1SDimitry Andric defm : UnsupportedSchedD; 100*0fca6ea1SDimitry Andric defm : UnsupportedSchedF; 101*0fca6ea1SDimitry Andric defm : UnsupportedSchedSFB; 102*0fca6ea1SDimitry Andric defm : UnsupportedSchedV; 103*0fca6ea1SDimitry Andric defm : UnsupportedSchedXsfvcp; 104*0fca6ea1SDimitry Andric defm : UnsupportedSchedZabha; 105*0fca6ea1SDimitry Andric defm : UnsupportedSchedZba; 106*0fca6ea1SDimitry Andric defm : UnsupportedSchedZbb; 107*0fca6ea1SDimitry Andric defm : UnsupportedSchedZbc; 108*0fca6ea1SDimitry Andric defm : UnsupportedSchedZbs; 109*0fca6ea1SDimitry Andric defm : UnsupportedSchedZbkb; 110*0fca6ea1SDimitry Andric defm : UnsupportedSchedZbkx; 111*0fca6ea1SDimitry Andric defm : UnsupportedSchedZfa; 112*0fca6ea1SDimitry Andric defm : UnsupportedSchedZfh; 113*0fca6ea1SDimitry Andric defm : UnsupportedSchedZvk; 114*0fca6ea1SDimitry Andric} 115*0fca6ea1SDimitry Andric 116*0fca6ea1SDimitry Andric// Bypasses (none) 117*0fca6ea1SDimitry Andricmulticlass SCR3_NoReadAdvances { 118*0fca6ea1SDimitry Andric def : ReadAdvance<ReadJmp, 0>; 119*0fca6ea1SDimitry Andric def : ReadAdvance<ReadJalr, 0>; 120*0fca6ea1SDimitry Andric def : ReadAdvance<ReadCSR, 0>; 121*0fca6ea1SDimitry Andric def : ReadAdvance<ReadStoreData, 0>; 122*0fca6ea1SDimitry Andric def : ReadAdvance<ReadMemBase, 0>; 123*0fca6ea1SDimitry Andric def : ReadAdvance<ReadIALU, 0>; 124*0fca6ea1SDimitry Andric def : ReadAdvance<ReadIALU32, 0>; 125*0fca6ea1SDimitry Andric def : ReadAdvance<ReadShiftImm, 0>; 126*0fca6ea1SDimitry Andric def : ReadAdvance<ReadShiftImm32, 0>; 127*0fca6ea1SDimitry Andric def : ReadAdvance<ReadShiftReg, 0>; 128*0fca6ea1SDimitry Andric def : ReadAdvance<ReadShiftReg32, 0>; 129*0fca6ea1SDimitry Andric def : ReadAdvance<ReadIDiv, 0>; 130*0fca6ea1SDimitry Andric def : ReadAdvance<ReadIDiv32, 0>; 131*0fca6ea1SDimitry Andric def : ReadAdvance<ReadIRem, 0>; 132*0fca6ea1SDimitry Andric def : ReadAdvance<ReadIRem32, 0>; 133*0fca6ea1SDimitry Andric def : ReadAdvance<ReadIMul, 0>; 134*0fca6ea1SDimitry Andric def : ReadAdvance<ReadIMul32, 0>; 135*0fca6ea1SDimitry Andric def : ReadAdvance<ReadAtomicWA, 0>; 136*0fca6ea1SDimitry Andric def : ReadAdvance<ReadAtomicWD, 0>; 137*0fca6ea1SDimitry Andric def : ReadAdvance<ReadAtomicDA, 0>; 138*0fca6ea1SDimitry Andric def : ReadAdvance<ReadAtomicDD, 0>; 139*0fca6ea1SDimitry Andric def : ReadAdvance<ReadAtomicLDW, 0>; 140*0fca6ea1SDimitry Andric def : ReadAdvance<ReadAtomicLDD, 0>; 141*0fca6ea1SDimitry Andric def : ReadAdvance<ReadAtomicSTW, 0>; 142*0fca6ea1SDimitry Andric def : ReadAdvance<ReadAtomicSTD, 0>; 143*0fca6ea1SDimitry Andric} 144*0fca6ea1SDimitry Andric 145*0fca6ea1SDimitry Andricdef SyntacoreSCR3RV32Model : SyntacoreSCR3Model; 146*0fca6ea1SDimitry Andric 147*0fca6ea1SDimitry Andriclet SchedModel = SyntacoreSCR3RV32Model in { 148*0fca6ea1SDimitry Andric let BufferSize = 0 in { 149*0fca6ea1SDimitry Andric def SCR3RV32_ALU : ProcResource<1>; 150*0fca6ea1SDimitry Andric def SCR3RV32_MUL : ProcResource<1>; 151*0fca6ea1SDimitry Andric def SCR3RV32_DIV : ProcResource<1>; 152*0fca6ea1SDimitry Andric def SCR3RV32_LSU : ProcResource<1>; 153*0fca6ea1SDimitry Andric def SCR3RV32_CFU : ProcResource<1>; 154*0fca6ea1SDimitry Andric } 155*0fca6ea1SDimitry Andric 156*0fca6ea1SDimitry Andric defm : SCR3_Branching<SCR3RV32_CFU>; 157*0fca6ea1SDimitry Andric defm : SCR3_IntALU<SCR3RV32_ALU>; 158*0fca6ea1SDimitry Andric defm : SCR3_IntMul<SCR3RV32_MUL>; 159*0fca6ea1SDimitry Andric defm : SCR3_IntDiv<SCR3RV32_DIV, /* div latency = */ 8>; 160*0fca6ea1SDimitry Andric defm : SCR3_Memory<SCR3RV32_LSU>; 161*0fca6ea1SDimitry Andric defm : SCR3_AtomicMemory<SCR3RV32_LSU>; 162*0fca6ea1SDimitry Andric defm : SCR3_Other; 163*0fca6ea1SDimitry Andric 164*0fca6ea1SDimitry Andric defm : SCR3_Unsupported; 165*0fca6ea1SDimitry Andric defm : SCR3_NoReadAdvances; 166*0fca6ea1SDimitry Andric} 167*0fca6ea1SDimitry Andric 168*0fca6ea1SDimitry Andricdef SyntacoreSCR3RV64Model : SyntacoreSCR3Model; 169*0fca6ea1SDimitry Andric 170*0fca6ea1SDimitry Andriclet SchedModel = SyntacoreSCR3RV64Model in { 171*0fca6ea1SDimitry Andric let BufferSize = 0 in { 172*0fca6ea1SDimitry Andric def SCR3RV64_ALU : ProcResource<1>; 173*0fca6ea1SDimitry Andric def SCR3RV64_MUL : ProcResource<1>; 174*0fca6ea1SDimitry Andric def SCR3RV64_DIV : ProcResource<1>; 175*0fca6ea1SDimitry Andric def SCR3RV64_LSU : ProcResource<1>; 176*0fca6ea1SDimitry Andric def SCR3RV64_CFU : ProcResource<1>; 177*0fca6ea1SDimitry Andric } 178*0fca6ea1SDimitry Andric 179*0fca6ea1SDimitry Andric defm : SCR3_Branching<SCR3RV64_CFU>; 180*0fca6ea1SDimitry Andric defm : SCR3_IntALU<SCR3RV64_ALU>; 181*0fca6ea1SDimitry Andric defm : SCR3_IntMul<SCR3RV64_MUL>; 182*0fca6ea1SDimitry Andric defm : SCR3_IntDiv<SCR3RV64_DIV, /* div latency = */ 11>; 183*0fca6ea1SDimitry Andric defm : SCR3_Memory<SCR3RV64_LSU>; 184*0fca6ea1SDimitry Andric defm : SCR3_AtomicMemory<SCR3RV64_LSU>; 185*0fca6ea1SDimitry Andric defm : SCR3_Other; 186*0fca6ea1SDimitry Andric 187*0fca6ea1SDimitry Andric defm : SCR3_Unsupported; 188*0fca6ea1SDimitry Andric defm : SCR3_NoReadAdvances; 189*0fca6ea1SDimitry Andric} 190