1//===-- RISCVSchedule.td - RISCV 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/// Define scheduler resources associated with def operands.
10def WriteIALU       : SchedWrite;    // 32 or 64-bit integer ALU operations
11def WriteIALU32     : SchedWrite;    // 32-bit integer ALU operations on RV64I
12def WriteShiftImm   : SchedWrite;    // 32 or 64-bit shift by immediate operations
13def WriteShiftImm32 : SchedWrite;    // 32-bit shift by immediate operations on RV64Ix
14def WriteShiftReg   : SchedWrite;    // 32 or 64-bit shift by immediate operations
15def WriteShiftReg32 : SchedWrite;    // 32-bit shift by immediate operations on RV64Ix
16def WriteIDiv       : SchedWrite;    // 32-bit or 64-bit divide and remainder
17def WriteIDiv32     : SchedWrite;    // 32-bit divide and remainder on RV64I
18def WriteIMul       : SchedWrite;    // 32-bit or 64-bit multiply
19def WriteIMul32     : SchedWrite;    // 32-bit multiply on RV64I
20def WriteJmp        : SchedWrite;    // Jump
21def WriteJal        : SchedWrite;    // Jump and link
22def WriteJalr       : SchedWrite;    // Jump and link register
23def WriteJmpReg     : SchedWrite;    // Jump register
24def WriteNop        : SchedWrite;
25def WriteLDB        : SchedWrite;    // Load byte
26def WriteLDH        : SchedWrite;    // Load half-word
27def WriteLDW        : SchedWrite;    // Load word
28def WriteLDWU       : SchedWrite;    // Load word unsigned
29def WriteLDD        : SchedWrite;    // Load double-word
30def WriteCSR        : SchedWrite;    // CSR instructions
31def WriteSTB        : SchedWrite;    // Store byte
32def WriteSTH        : SchedWrite;    // Store half-word
33def WriteSTW        : SchedWrite;    // Store word
34def WriteSTD        : SchedWrite;    // Store double-word
35def WriteAtomicW    : SchedWrite;    //Atomic memory operation word size
36def WriteAtomicD    : SchedWrite;    //Atomic memory operation double word size
37def WriteAtomicLDW  : SchedWrite;    // Atomic load word
38def WriteAtomicLDD  : SchedWrite;    // Atomic load double word
39def WriteAtomicSTW  : SchedWrite;    // Atomic store word
40def WriteAtomicSTD  : SchedWrite;    // Atomic store double word
41def WriteFALU16     : SchedWrite;    // FP 16-bit computation
42def WriteFALU32     : SchedWrite;    // FP 32-bit computation
43def WriteFALU64     : SchedWrite;    // FP 64-bit computation
44def WriteFMul16     : SchedWrite;    // 16-bit floating point multiply
45def WriteFMA16      : SchedWrite;    // 16-bit floating point fused multiply-add
46def WriteFMul32     : SchedWrite;    // 32-bit floating point multiply
47def WriteFMA32      : SchedWrite;    // 32-bit floating point fused multiply-add
48def WriteFMul64     : SchedWrite;    // 64-bit floating point multiply
49def WriteFMA64      : SchedWrite;    // 64-bit floating point fused multiply-add
50def WriteFDiv16     : SchedWrite;    // 16-bit floating point divide
51def WriteFDiv32     : SchedWrite;    // 32-bit floating point divide
52def WriteFDiv64     : SchedWrite;    // 64-bit floating point divide
53def WriteFSqrt16    : SchedWrite;    // 16-bit floating point sqrt
54def WriteFSqrt32    : SchedWrite;    // 32-bit floating point sqrt
55def WriteFSqrt64    : SchedWrite;    // 64-bit floating point sqrt
56
57// Integer to float conversions
58def WriteFCvtI32ToF16  : SchedWrite;
59def WriteFCvtI32ToF32  : SchedWrite;
60def WriteFCvtI32ToF64  : SchedWrite;
61def WriteFCvtI64ToF16  : SchedWrite;    // RV64I only
62def WriteFCvtI64ToF32  : SchedWrite;    // RV64I only
63def WriteFCvtI64ToF64  : SchedWrite;    // RV64I only
64
65//Float to integer conversions
66def WriteFCvtF16ToI32  : SchedWrite;
67def WriteFCvtF16ToI64  : SchedWrite;    // RV64I only
68def WriteFCvtF32ToI32  : SchedWrite;
69def WriteFCvtF32ToI64  : SchedWrite;    // RV64I only
70def WriteFCvtF64ToI32  : SchedWrite;
71def WriteFCvtF64ToI64  : SchedWrite;    // RV64I only
72
73// Float to float conversions
74def WriteFCvtF32ToF64  : SchedWrite;
75def WriteFCvtF64ToF32  : SchedWrite;
76def WriteFCvtF16ToF32  : SchedWrite;
77def WriteFCvtF32ToF16  : SchedWrite;
78def WriteFCvtF16ToF64  : SchedWrite;
79def WriteFCvtF64ToF16  : SchedWrite;
80
81def WriteFClass16   : SchedWrite;    // 16-bit floating point classify
82def WriteFClass32   : SchedWrite;    // 32-bit floating point classify
83def WriteFClass64   : SchedWrite;    // 64-bit floating point classify
84def WriteFCmp16     : SchedWrite;    // 16-bit floating point compare
85def WriteFCmp32     : SchedWrite;    // 32-bit floating point compare
86def WriteFCmp64     : SchedWrite;    // 64-bit floating point compare
87def WriteFSGNJ16    : SchedWrite;    // 16-bit floating point sign-injection
88def WriteFSGNJ32    : SchedWrite;    // 32-bit floating point sign-injection
89def WriteFSGNJ64    : SchedWrite;    // 64-bit floating point sign-injection
90def WriteFMinMax16  : SchedWrite;    // 16-bit floating point min or max
91def WriteFMinMax32  : SchedWrite;    // 32-bit floating point min or max
92def WriteFMinMax64  : SchedWrite;    // 64-bit floating point min or max
93
94def WriteFMovF16ToI16     : SchedWrite;
95def WriteFMovI16ToF16     : SchedWrite;
96def WriteFMovF32ToI32     : SchedWrite;
97def WriteFMovI32ToF32     : SchedWrite;
98def WriteFMovF64ToI64     : SchedWrite;    // RV64I only
99def WriteFMovI64ToF64     : SchedWrite;    // RV64I only
100
101def WriteFLD16        : SchedWrite;    // Floating point sp load
102def WriteFLD32        : SchedWrite;    // Floating point sp load
103def WriteFLD64        : SchedWrite;    // Floating point dp load
104def WriteFST16        : SchedWrite;    // Floating point sp store
105def WriteFST32        : SchedWrite;    // Floating point sp store
106def WriteFST64        : SchedWrite;    // Floating point dp store
107
108/// Define scheduler resources associated with use operands.
109def ReadJmp         : SchedRead;
110def ReadJalr        : SchedRead;
111def ReadCSR         : SchedRead;
112def ReadMemBase     : SchedRead;
113def ReadFMemBase    : SchedRead;
114def ReadStoreData   : SchedRead;
115def ReadIALU        : SchedRead;
116def ReadIALU32      : SchedRead;    // 32-bit integer ALU operations on RV64I
117def ReadShiftImm    : SchedRead;
118def ReadShiftImm32  : SchedRead;    // 32-bit shift by immediate operations on RV64Ix
119def ReadShiftReg    : SchedRead;
120def ReadShiftReg32  : SchedRead;    // 32-bit shift by register operations on RV64Ix
121def ReadIDiv        : SchedRead;
122def ReadIDiv32      : SchedRead;
123def ReadIMul        : SchedRead;
124def ReadIMul32      : SchedRead;
125def ReadAtomicWA    : SchedRead;
126def ReadAtomicWD    : SchedRead;
127def ReadAtomicDA    : SchedRead;
128def ReadAtomicDD    : SchedRead;
129def ReadAtomicLDW   : SchedRead;    // Atomic load word
130def ReadAtomicLDD   : SchedRead;    // Atomic load double word
131def ReadAtomicSTW   : SchedRead;    // Atomic store word
132def ReadAtomicSTD   : SchedRead;    // Atomic store double word
133def ReadFALU16      : SchedRead;    // FP 16-bit computation
134def ReadFALU32      : SchedRead;    // FP 32-bit computation
135def ReadFALU64      : SchedRead;    // FP 64-bit computation
136def ReadFMul16      : SchedRead;    // 16-bit floating point multiply
137def ReadFMA16       : SchedRead;    // 16-bit floating point fused multiply-add
138def ReadFMul32      : SchedRead;    // 32-bit floating point multiply
139def ReadFMA32       : SchedRead;    // 32-bit floating point fused multiply-add
140def ReadFMul64      : SchedRead;    // 64-bit floating point multiply
141def ReadFMA64       : SchedRead;    // 64-bit floating point fused multiply-add
142def ReadFDiv16      : SchedRead;    // 16-bit floating point divide
143def ReadFDiv32      : SchedRead;    // 32-bit floating point divide
144def ReadFDiv64      : SchedRead;    // 64-bit floating point divide
145def ReadFSqrt16     : SchedRead;    // 16-bit floating point sqrt
146def ReadFSqrt32     : SchedRead;    // 32-bit floating point sqrt
147def ReadFSqrt64     : SchedRead;    // 64-bit floating point sqrt
148def ReadFCmp16      : SchedRead;
149def ReadFCmp32      : SchedRead;
150def ReadFCmp64      : SchedRead;
151def ReadFSGNJ16     : SchedRead;
152def ReadFSGNJ32     : SchedRead;
153def ReadFSGNJ64     : SchedRead;
154def ReadFMinMax16   : SchedRead;
155def ReadFMinMax32   : SchedRead;
156def ReadFMinMax64   : SchedRead;
157def ReadFCvtF16ToI32     : SchedRead;
158def ReadFCvtF16ToI64     : SchedRead;
159def ReadFCvtF32ToI32     : SchedRead;
160def ReadFCvtF32ToI64     : SchedRead;
161def ReadFCvtF64ToI32     : SchedRead;
162def ReadFCvtF64ToI64     : SchedRead;
163def ReadFCvtI32ToF16     : SchedRead;
164def ReadFCvtI32ToF32     : SchedRead;
165def ReadFCvtI32ToF64     : SchedRead;
166def ReadFCvtI64ToF16     : SchedRead;
167def ReadFCvtI64ToF32     : SchedRead;
168def ReadFCvtI64ToF64     : SchedRead;
169def ReadFMovF16ToI16     : SchedRead;
170def ReadFMovI16ToF16     : SchedRead;
171def ReadFMovF32ToI32     : SchedRead;
172def ReadFMovI32ToF32     : SchedRead;
173def ReadFMovF64ToI64     : SchedRead;
174def ReadFMovI64ToF64     : SchedRead;
175def ReadFCvtF32ToF64     : SchedRead;
176def ReadFCvtF64ToF32     : SchedRead;
177def ReadFCvtF16ToF32     : SchedRead;
178def ReadFCvtF32ToF16     : SchedRead;
179def ReadFCvtF16ToF64     : SchedRead;
180def ReadFCvtF64ToF16     : SchedRead;
181def ReadFClass16         : SchedRead;
182def ReadFClass32         : SchedRead;
183def ReadFClass64         : SchedRead;
184
185multiclass UnsupportedSchedZfh {
186let Unsupported = true in {
187def : WriteRes<WriteFALU16, []>;
188def : WriteRes<WriteFClass16, []>;
189def : WriteRes<WriteFCvtF16ToF64, []>;
190def : WriteRes<WriteFCvtF64ToF16, []>;
191def : WriteRes<WriteFCvtI64ToF16, []>;
192def : WriteRes<WriteFCvtF32ToF16, []>;
193def : WriteRes<WriteFCvtI32ToF16, []>;
194def : WriteRes<WriteFCvtF16ToI64, []>;
195def : WriteRes<WriteFCvtF16ToF32, []>;
196def : WriteRes<WriteFCvtF16ToI32, []>;
197def : WriteRes<WriteFDiv16, []>;
198def : WriteRes<WriteFCmp16, []>;
199def : WriteRes<WriteFLD16, []>;
200def : WriteRes<WriteFMA16, []>;
201def : WriteRes<WriteFMinMax16, []>;
202def : WriteRes<WriteFMul16, []>;
203def : WriteRes<WriteFMovI16ToF16, []>;
204def : WriteRes<WriteFMovF16ToI16, []>;
205def : WriteRes<WriteFSGNJ16, []>;
206def : WriteRes<WriteFST16, []>;
207def : WriteRes<WriteFSqrt16, []>;
208
209def : ReadAdvance<ReadFALU16, 0>;
210def : ReadAdvance<ReadFClass16, 0>;
211def : ReadAdvance<ReadFCvtF16ToF64, 0>;
212def : ReadAdvance<ReadFCvtF64ToF16, 0>;
213def : ReadAdvance<ReadFCvtI64ToF16, 0>;
214def : ReadAdvance<ReadFCvtF32ToF16, 0>;
215def : ReadAdvance<ReadFCvtI32ToF16, 0>;
216def : ReadAdvance<ReadFCvtF16ToI64, 0>;
217def : ReadAdvance<ReadFCvtF16ToF32, 0>;
218def : ReadAdvance<ReadFCvtF16ToI32, 0>;
219def : ReadAdvance<ReadFDiv16, 0>;
220def : ReadAdvance<ReadFCmp16, 0>;
221def : ReadAdvance<ReadFMA16, 0>;
222def : ReadAdvance<ReadFMinMax16, 0>;
223def : ReadAdvance<ReadFMul16, 0>;
224def : ReadAdvance<ReadFMovI16ToF16, 0>;
225def : ReadAdvance<ReadFMovF16ToI16, 0>;
226def : ReadAdvance<ReadFSGNJ16, 0>;
227def : ReadAdvance<ReadFSqrt16, 0>;
228} // Unsupported = true
229}
230
231// Include the scheduler resources for other instruction extensions.
232include "RISCVScheduleB.td"
233include "RISCVScheduleV.td"
234