Skip to content

Commit 991d754

Browse files
authored
[RISCV] Implement base scheduling model for andes 45 series processor. (#141008)
This patch implements scheduling model for IMAFD and Zb extension. The latency and throughput of all instructions, except load/store, are measured by llvm-exegesis. Scheduling model for V and other extensions will be added in a follow-up patch.
1 parent b36e161 commit 991d754

File tree

5 files changed

+725
-4
lines changed

5 files changed

+725
-4
lines changed

llvm/lib/Target/RISCV/RISCV.td

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ include "RISCVMacroFusion.td"
5151
//===----------------------------------------------------------------------===//
5252
// RISC-V Scheduling Models
5353
//===----------------------------------------------------------------------===//
54+
include "RISCVSchedAndes45.td"
5455
include "RISCVSchedGenericOOO.td"
5556
include "RISCVSchedMIPSP8700.td"
5657
include "RISCVSchedRocket.td"

llvm/lib/Target/RISCV/RISCVProcessors.td

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -679,7 +679,7 @@ def ANDES_AX25 : RISCVProcessorModel<"andes-ax25",
679679
FeatureVendorXAndesPerf]>;
680680

681681
def ANDES_N45 : RISCVProcessorModel<"andes-n45",
682-
NoSchedModel,
682+
Andes45Model,
683683
[Feature32Bit,
684684
FeatureStdExtI,
685685
FeatureStdExtZicsr,
@@ -693,7 +693,7 @@ def ANDES_N45 : RISCVProcessorModel<"andes-n45",
693693
FeatureVendorXAndesPerf]>;
694694

695695
def ANDES_NX45 : RISCVProcessorModel<"andes-nx45",
696-
NoSchedModel,
696+
Andes45Model,
697697
[Feature64Bit,
698698
FeatureStdExtI,
699699
FeatureStdExtZicsr,
@@ -707,7 +707,7 @@ def ANDES_NX45 : RISCVProcessorModel<"andes-nx45",
707707
FeatureVendorXAndesPerf]>;
708708

709709
def ANDES_A45 : RISCVProcessorModel<"andes-a45",
710-
NoSchedModel,
710+
Andes45Model,
711711
[Feature32Bit,
712712
FeatureStdExtI,
713713
FeatureStdExtZicsr,
@@ -721,7 +721,7 @@ def ANDES_A45 : RISCVProcessorModel<"andes-a45",
721721
FeatureVendorXAndesPerf]>;
722722

723723
def ANDES_AX45 : RISCVProcessorModel<"andes-ax45",
724-
NoSchedModel,
724+
Andes45Model,
725725
[Feature64Bit,
726726
FeatureStdExtI,
727727
FeatureStdExtZicsr,
Lines changed: 339 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,339 @@
1+
//==- RISCVSchedAndes45.td - Andes45 Scheduling Definitions --*- tablegen -*-=//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
//===----------------------------------------------------------------------===//
10+
11+
// FIXME: Implement sheduling model for V and other extensions.
12+
def Andes45Model : SchedMachineModel {
13+
let MicroOpBufferSize = 0; // Andes45 is in-order processor
14+
let IssueWidth = 2; // 2 micro-ops dispatched per cycle
15+
let LoadLatency = 2;
16+
let MispredictPenalty = 5;
17+
let CompleteModel = 0;
18+
}
19+
20+
let SchedModel = Andes45Model in {
21+
22+
//===----------------------------------------------------------------------===//
23+
// Define each kind of processor resource and number available.
24+
25+
//===----------------------------------------------------------------------===//
26+
// Andes 45 series CPU
27+
// - 2 Interger Arithmetic and Logical Units (ALU)
28+
// - Multiply / Divide Unit (MDU)
29+
// - Load Store Unit (LSU)
30+
// - Control and Status Register Unit (CSR)
31+
// - Floating Point Multiply-Accumulate Unit (FMAC)
32+
// - Floating Point Divide / SQRT Unit (FDIV)
33+
// - Floating Point Move Unit (FMV)
34+
// - Floating Point Misc Unit (FMISC)
35+
//===----------------------------------------------------------------------===//
36+
37+
let BufferSize = 0 in {
38+
def Andes45ALU : ProcResource<2>;
39+
def Andes45MDU : ProcResource<1>;
40+
def Andes45LSU : ProcResource<1>;
41+
def Andes45CSR : ProcResource<1>;
42+
43+
def Andes45FMAC : ProcResource<1>;
44+
def Andes45FDIV : ProcResource<1>;
45+
def Andes45FMV : ProcResource<1>;
46+
def Andes45FMISC : ProcResource<1>;
47+
}
48+
49+
// Integer arithmetic and logic
50+
def : WriteRes<WriteIALU, [Andes45ALU]>;
51+
def : WriteRes<WriteIALU32, [Andes45ALU]>;
52+
def : WriteRes<WriteShiftImm, [Andes45ALU]>;
53+
def : WriteRes<WriteShiftImm32, [Andes45ALU]>;
54+
def : WriteRes<WriteShiftReg, [Andes45ALU]>;
55+
def : WriteRes<WriteShiftReg32, [Andes45ALU]>;
56+
57+
// Branching
58+
def : WriteRes<WriteJmp, [Andes45ALU]>;
59+
def : WriteRes<WriteJal, [Andes45ALU]>;
60+
def : WriteRes<WriteJalr, [Andes45ALU]>;
61+
62+
// Integer multiplication
63+
let Latency = 3 in {
64+
def : WriteRes<WriteIMul, [Andes45MDU]>;
65+
def : WriteRes<WriteIMul32, [Andes45MDU]>;
66+
}
67+
68+
// Integer division
69+
let Latency = 39, ReleaseAtCycles = [39] in {
70+
def : WriteRes<WriteIDiv, [Andes45MDU]>;
71+
def : WriteRes<WriteIDiv32, [Andes45MDU]>;
72+
}
73+
74+
// Integer remainder
75+
let Latency = 39, ReleaseAtCycles = [39] in {
76+
def : WriteRes<WriteIRem, [Andes45MDU]>;
77+
def : WriteRes<WriteIRem32, [Andes45MDU]>;
78+
}
79+
80+
// Memory
81+
let Latency = 5 in {
82+
def : WriteRes<WriteLDB, [Andes45LSU]>;
83+
def : WriteRes<WriteLDH, [Andes45LSU]>;
84+
def : WriteRes<WriteFLD16, [Andes45LSU]>;
85+
}
86+
87+
let Latency = 3 in {
88+
def : WriteRes<WriteLDW, [Andes45LSU]>;
89+
def : WriteRes<WriteLDD, [Andes45LSU]>;
90+
def : WriteRes<WriteFLD32, [Andes45LSU]>;
91+
def : WriteRes<WriteFLD64, [Andes45LSU]>;
92+
}
93+
94+
let Latency = 1 in {
95+
def : WriteRes<WriteSTB, [Andes45LSU]>;
96+
def : WriteRes<WriteSTH, [Andes45LSU]>;
97+
def : WriteRes<WriteSTW, [Andes45LSU]>;
98+
def : WriteRes<WriteSTD, [Andes45LSU]>;
99+
def : WriteRes<WriteFST16, [Andes45LSU]>;
100+
def : WriteRes<WriteFST32, [Andes45LSU]>;
101+
def : WriteRes<WriteFST64, [Andes45LSU]>;
102+
}
103+
104+
// Atomic Memory
105+
let Latency = 9 in {
106+
def : WriteRes<WriteAtomicW, [Andes45LSU]>;
107+
def : WriteRes<WriteAtomicD, [Andes45LSU]>;
108+
def : WriteRes<WriteAtomicLDW, [Andes45LSU]>;
109+
def : WriteRes<WriteAtomicLDD, [Andes45LSU]>;
110+
}
111+
112+
let Latency = 3 in {
113+
def : WriteRes<WriteAtomicSTW, [Andes45LSU]>;
114+
def : WriteRes<WriteAtomicSTD, [Andes45LSU]>;
115+
}
116+
117+
// FMAC
118+
let Latency = 4 in {
119+
def : WriteRes<WriteFAdd16, [Andes45FMAC]>;
120+
def : WriteRes<WriteFAdd32, [Andes45FMAC]>;
121+
def : WriteRes<WriteFAdd64, [Andes45FMAC]>;
122+
def : WriteRes<WriteFMul16, [Andes45FMAC]>;
123+
def : WriteRes<WriteFMul32, [Andes45FMAC]>;
124+
def : WriteRes<WriteFMul64, [Andes45FMAC]>;
125+
def : WriteRes<WriteFMA16, [Andes45FMAC]>;
126+
def : WriteRes<WriteFMA32, [Andes45FMAC]>;
127+
def : WriteRes<WriteFMA64, [Andes45FMAC]>;
128+
}
129+
130+
// FDIV
131+
let Latency = 12, ReleaseAtCycles = [12] in
132+
def : WriteRes<WriteFDiv16, [Andes45FDIV]>;
133+
let Latency = 11, ReleaseAtCycles = [11] in
134+
def : WriteRes<WriteFSqrt16, [Andes45FDIV]>;
135+
136+
let Latency = 19, ReleaseAtCycles = [19] in
137+
def : WriteRes<WriteFDiv32, [Andes45FDIV]>;
138+
let Latency = 18, ReleaseAtCycles = [18] in
139+
def : WriteRes<WriteFSqrt32, [Andes45FDIV]>;
140+
141+
let Latency = 33, ReleaseAtCycles = [33] in
142+
def : WriteRes<WriteFDiv64, [Andes45FDIV]>;
143+
let Latency = 32, ReleaseAtCycles = [32] in
144+
def : WriteRes<WriteFSqrt64, [Andes45FDIV]>;
145+
146+
// FMV
147+
def : WriteRes<WriteFSGNJ16, [Andes45FMV]>;
148+
def : WriteRes<WriteFSGNJ32, [Andes45FMV]>;
149+
def : WriteRes<WriteFSGNJ64, [Andes45FMV]>;
150+
def : WriteRes<WriteFMovF16ToI16, [Andes45FMV]>;
151+
def : WriteRes<WriteFMovI16ToF16, [Andes45FMV]>;
152+
def : WriteRes<WriteFMovF32ToI32, [Andes45FMV]>;
153+
def : WriteRes<WriteFMovI32ToF32, [Andes45FMV]>;
154+
def : WriteRes<WriteFMovF64ToI64, [Andes45FMV]>;
155+
def : WriteRes<WriteFMovI64ToF64, [Andes45FMV]>;
156+
157+
// FMISC
158+
let Latency = 2 in {
159+
def : WriteRes<WriteFMinMax16, [Andes45FMISC]>;
160+
def : WriteRes<WriteFMinMax32, [Andes45FMISC]>;
161+
def : WriteRes<WriteFMinMax64, [Andes45FMISC]>;
162+
def : WriteRes<WriteFClass16, [Andes45FMISC]>;
163+
def : WriteRes<WriteFClass32, [Andes45FMISC]>;
164+
def : WriteRes<WriteFClass64, [Andes45FMISC]>;
165+
def : WriteRes<WriteFCmp16, [Andes45FMISC]>;
166+
def : WriteRes<WriteFCmp32, [Andes45FMISC]>;
167+
def : WriteRes<WriteFCmp64, [Andes45FMISC]>;
168+
def : WriteRes<WriteFCvtF16ToI32, [Andes45FMISC]>;
169+
def : WriteRes<WriteFCvtF16ToI64, [Andes45FMISC]>;
170+
def : WriteRes<WriteFCvtF32ToI32, [Andes45FMISC]>;
171+
def : WriteRes<WriteFCvtF32ToI64, [Andes45FMISC]>;
172+
def : WriteRes<WriteFCvtF64ToI32, [Andes45FMISC]>;
173+
def : WriteRes<WriteFCvtF64ToI64, [Andes45FMISC]>;
174+
def : WriteRes<WriteFCvtI32ToF16, [Andes45FMISC]>;
175+
def : WriteRes<WriteFCvtI32ToF32, [Andes45FMISC]>;
176+
def : WriteRes<WriteFCvtI32ToF64, [Andes45FMISC]>;
177+
def : WriteRes<WriteFCvtI64ToF16, [Andes45FMISC]>;
178+
def : WriteRes<WriteFCvtI64ToF32, [Andes45FMISC]>;
179+
def : WriteRes<WriteFCvtI64ToF64, [Andes45FMISC]>;
180+
def : WriteRes<WriteFCvtF16ToF32, [Andes45FMISC]>;
181+
def : WriteRes<WriteFCvtF16ToF64, [Andes45FMISC]>;
182+
def : WriteRes<WriteFCvtF32ToF16, [Andes45FMISC]>;
183+
def : WriteRes<WriteFCvtF32ToF64, [Andes45FMISC]>;
184+
def : WriteRes<WriteFCvtF64ToF16, [Andes45FMISC]>;
185+
def : WriteRes<WriteFCvtF64ToF32, [Andes45FMISC]>;
186+
}
187+
188+
// Bitmanip
189+
// Zba extension
190+
def : WriteRes<WriteSHXADD, [Andes45ALU]>;
191+
def : WriteRes<WriteSHXADD32, [Andes45ALU]>;
192+
193+
// Zbb extension
194+
def : WriteRes<WriteRotateImm, [Andes45ALU]>;
195+
def : WriteRes<WriteRotateImm32, [Andes45ALU]>;
196+
def : WriteRes<WriteRotateReg, [Andes45ALU]>;
197+
def : WriteRes<WriteRotateReg32, [Andes45ALU]>;
198+
def : WriteRes<WriteREV8, [Andes45ALU]>;
199+
def : WriteRes<WriteORCB, [Andes45ALU]>;
200+
def : WriteRes<WriteIMinMax, [Andes45ALU]>;
201+
202+
let Latency = 3 in {
203+
def : WriteRes<WriteCLZ, [Andes45ALU]>;
204+
def : WriteRes<WriteCLZ32, [Andes45ALU]>;
205+
def : WriteRes<WriteCTZ, [Andes45ALU]>;
206+
def : WriteRes<WriteCTZ32, [Andes45ALU]>;
207+
def : WriteRes<WriteCPOP, [Andes45ALU]>;
208+
def : WriteRes<WriteCPOP32, [Andes45ALU]>;
209+
}
210+
211+
// Zbc extension
212+
let Latency = 3 in
213+
def : WriteRes<WriteCLMUL, [Andes45ALU]>;
214+
215+
// Zbs extension
216+
def : WriteRes<WriteSingleBit, [Andes45ALU]>;
217+
def : WriteRes<WriteSingleBitImm, [Andes45ALU]>;
218+
def : WriteRes<WriteBEXT, [Andes45ALU]>;
219+
def : WriteRes<WriteBEXTI, [Andes45ALU]>;
220+
221+
// Others
222+
def : WriteRes<WriteCSR, [Andes45CSR]>;
223+
def : WriteRes<WriteNop, []>;
224+
225+
//===----------------------------------------------------------------------===//
226+
227+
// Bypass and advance
228+
def : ReadAdvance<ReadIALU, 0>;
229+
def : ReadAdvance<ReadIALU32, 0>;
230+
def : ReadAdvance<ReadShiftImm, 0>;
231+
def : ReadAdvance<ReadShiftImm32, 0>;
232+
def : ReadAdvance<ReadShiftReg, 0>;
233+
def : ReadAdvance<ReadShiftReg32, 0>;
234+
def : ReadAdvance<ReadJalr, 0>;
235+
def : ReadAdvance<ReadJmp, 0>;
236+
def : ReadAdvance<ReadIMul, 0>;
237+
def : ReadAdvance<ReadIMul32, 0>;
238+
def : ReadAdvance<ReadIDiv, 0>;
239+
def : ReadAdvance<ReadIDiv32, 0>;
240+
def : ReadAdvance<ReadIRem, 0>;
241+
def : ReadAdvance<ReadIRem32, 0>;
242+
def : ReadAdvance<ReadStoreData, 0>;
243+
def : ReadAdvance<ReadMemBase, 0>;
244+
def : ReadAdvance<ReadAtomicWA, 0>;
245+
def : ReadAdvance<ReadAtomicWD, 0>;
246+
def : ReadAdvance<ReadAtomicDA, 0>;
247+
def : ReadAdvance<ReadAtomicDD, 0>;
248+
def : ReadAdvance<ReadAtomicLDW, 0>;
249+
def : ReadAdvance<ReadAtomicLDD, 0>;
250+
def : ReadAdvance<ReadAtomicSTW, 0>;
251+
def : ReadAdvance<ReadAtomicSTD, 0>;
252+
def : ReadAdvance<ReadFStoreData, 0>;
253+
def : ReadAdvance<ReadFMemBase, 0>;
254+
def : ReadAdvance<ReadFAdd16, 0>;
255+
def : ReadAdvance<ReadFAdd32, 0>;
256+
def : ReadAdvance<ReadFAdd64, 0>;
257+
def : ReadAdvance<ReadFMul16, 0>;
258+
def : ReadAdvance<ReadFMul32, 0>;
259+
def : ReadAdvance<ReadFMul64, 0>;
260+
def : ReadAdvance<ReadFMA16, 0>;
261+
def : ReadAdvance<ReadFMA32, 0>;
262+
def : ReadAdvance<ReadFMA64, 0>;
263+
def : ReadAdvance<ReadFMA16Addend, 0>;
264+
def : ReadAdvance<ReadFMA32Addend, 0>;
265+
def : ReadAdvance<ReadFMA64Addend, 0>;
266+
def : ReadAdvance<ReadFDiv16, 0>;
267+
def : ReadAdvance<ReadFDiv32, 0>;
268+
def : ReadAdvance<ReadFDiv64, 0>;
269+
def : ReadAdvance<ReadFSqrt16, 0>;
270+
def : ReadAdvance<ReadFSqrt32, 0>;
271+
def : ReadAdvance<ReadFSqrt64, 0>;
272+
def : ReadAdvance<ReadFSGNJ16, 0>;
273+
def : ReadAdvance<ReadFSGNJ32, 0>;
274+
def : ReadAdvance<ReadFSGNJ64, 0>;
275+
def : ReadAdvance<ReadFMovF16ToI16, 0>;
276+
def : ReadAdvance<ReadFMovI16ToF16, 0>;
277+
def : ReadAdvance<ReadFMovF32ToI32, 0>;
278+
def : ReadAdvance<ReadFMovI32ToF32, 0>;
279+
def : ReadAdvance<ReadFMovF64ToI64, 0>;
280+
def : ReadAdvance<ReadFMovI64ToF64, 0>;
281+
def : ReadAdvance<ReadFMinMax16, 0>;
282+
def : ReadAdvance<ReadFMinMax32, 0>;
283+
def : ReadAdvance<ReadFMinMax64, 0>;
284+
def : ReadAdvance<ReadFClass16, 0>;
285+
def : ReadAdvance<ReadFClass32, 0>;
286+
def : ReadAdvance<ReadFClass64, 0>;
287+
def : ReadAdvance<ReadFCmp16, 0>;
288+
def : ReadAdvance<ReadFCmp32, 0>;
289+
def : ReadAdvance<ReadFCmp64, 0>;
290+
def : ReadAdvance<ReadFCvtF16ToI32, 0>;
291+
def : ReadAdvance<ReadFCvtF16ToI64, 0>;
292+
def : ReadAdvance<ReadFCvtF32ToI32, 0>;
293+
def : ReadAdvance<ReadFCvtF32ToI64, 0>;
294+
def : ReadAdvance<ReadFCvtF64ToI32, 0>;
295+
def : ReadAdvance<ReadFCvtF64ToI64, 0>;
296+
def : ReadAdvance<ReadFCvtI32ToF16, 0>;
297+
def : ReadAdvance<ReadFCvtI32ToF32, 0>;
298+
def : ReadAdvance<ReadFCvtI32ToF64, 0>;
299+
def : ReadAdvance<ReadFCvtI64ToF16, 0>;
300+
def : ReadAdvance<ReadFCvtI64ToF32, 0>;
301+
def : ReadAdvance<ReadFCvtI64ToF64, 0>;
302+
def : ReadAdvance<ReadFCvtF16ToF32, 0>;
303+
def : ReadAdvance<ReadFCvtF16ToF64, 0>;
304+
def : ReadAdvance<ReadFCvtF32ToF16, 0>;
305+
def : ReadAdvance<ReadFCvtF32ToF64, 0>;
306+
def : ReadAdvance<ReadFCvtF64ToF16, 0>;
307+
def : ReadAdvance<ReadFCvtF64ToF32, 0>;
308+
def : ReadAdvance<ReadSHXADD, 0>;
309+
def : ReadAdvance<ReadSHXADD32, 0>;
310+
def : ReadAdvance<ReadRotateImm, 1>;
311+
def : ReadAdvance<ReadRotateImm32, 1>;
312+
def : ReadAdvance<ReadRotateReg, 1>;
313+
def : ReadAdvance<ReadRotateReg32, 1>;
314+
def : ReadAdvance<ReadCLZ, 0>;
315+
def : ReadAdvance<ReadCLZ32, 0>;
316+
def : ReadAdvance<ReadCTZ, 0>;
317+
def : ReadAdvance<ReadCTZ32, 0>;
318+
def : ReadAdvance<ReadCPOP, 0>;
319+
def : ReadAdvance<ReadCPOP32, 0>;
320+
def : ReadAdvance<ReadREV8, 0>;
321+
def : ReadAdvance<ReadORCB, 0>;
322+
def : ReadAdvance<ReadIMinMax, 0>;
323+
def : ReadAdvance<ReadCLMUL, 0>;
324+
def : ReadAdvance<ReadSingleBit, 0>;
325+
def : ReadAdvance<ReadSingleBitImm, 0>;
326+
def : ReadAdvance<ReadCSR, 0>;
327+
328+
//===----------------------------------------------------------------------===//
329+
// Unsupported extensions
330+
defm : UnsupportedSchedQ;
331+
defm : UnsupportedSchedSFB;
332+
defm : UnsupportedSchedV;
333+
defm : UnsupportedSchedXsfvcp;
334+
defm : UnsupportedSchedZabha;
335+
defm : UnsupportedSchedZbkb;
336+
defm : UnsupportedSchedZbkx;
337+
defm : UnsupportedSchedZfa;
338+
defm : UnsupportedSchedZvk;
339+
}

0 commit comments

Comments
 (0)