xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/RISCV/RISCVSchedSyntacoreSCR3.td (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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