1//===-- RISCVScheduleB.td - RISCV Scheduling Definitions B -*- 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.
10
11// Zba extension
12def WriteSHXADD      : SchedWrite; // sh1add/sh2add/sh3add
13def WriteSHXADD32    : SchedWrite; // sh1add.uw/sh2add.uw/sh3add.uw
14
15// Zbb extension
16def WriteRotateImm   : SchedWrite;
17def WriteRotateImm32 : SchedWrite;
18def WriteRotateReg   : SchedWrite;
19def WriteRotateReg32 : SchedWrite;
20def WriteCLZ         : SchedWrite;
21def WriteCLZ32       : SchedWrite;
22def WriteCTZ         : SchedWrite;
23def WriteCTZ32       : SchedWrite;
24def WriteCPOP        : SchedWrite;
25def WriteCPOP32      : SchedWrite;
26def WriteREV8        : SchedWrite;
27def WriteORCB        : SchedWrite;
28
29// Zbc extension
30def WriteCLMUL       : SchedWrite; // CLMUL/CLMULR/CLMULH
31
32// Zbs extension
33def WriteSingleBit   : SchedWrite; // BCLR/BSET/BINV/BEXT
34def WriteSingleBitImm: SchedWrite; // BCLRI/BSETI/BINVI/BEXTI
35
36// Zbe extension
37def WriteDecompress  : SchedWrite; // bdecompress
38def WriteCompress    : SchedWrite; // bcompress
39def WriteDecompress32: SchedWrite; // bdecompressw
40def WriteCompress32  : SchedWrite; // bcompressw
41
42// Zbf extension
43def WriteBFP         : SchedWrite; // BFP
44def WriteBFP32       : SchedWrite; // BFPW
45
46// Zbm extension
47def WriteBMatrix     : SchedWrite; // bmator/bmatxor/bmatflip
48
49// Zbp extension
50def WriteORC         : SchedWrite; // gorc
51def WriteREV         : SchedWrite; // grev
52def WriteORC32       : SchedWrite; // gorcw
53def WriteREV32       : SchedWrite; // grevw
54def WriteREVImm      : SchedWrite; // grevi
55def WriteORCImm      : SchedWrite; // gorci
56def WriteREVImm32    : SchedWrite; // greviw
57def WriteORCImm32    : SchedWrite; // gorciw
58def WriteSHFL        : SchedWrite; // shfl
59def WriteUNSHFL      : SchedWrite; // unshfl
60def WriteSHFL32      : SchedWrite; // shflw
61def WriteUNSHFL32    : SchedWrite; // unshflw
62def WriteSHFLImm     : SchedWrite; // shfli
63def WriteUNSHFLImm   : SchedWrite; // unshfli
64def WriteXPERMH      : SchedWrite; // xperm.h
65def WriteXPERMW      : SchedWrite; // xperm.w
66def WritePACK        : SchedWrite; // pack/packh
67def WritePACK32      : SchedWrite; // packw
68def WritePACKU       : SchedWrite; // packu
69def WritePACKU32     : SchedWrite; // packuw
70
71// Zbr extension
72def WriteCRCB        : SchedWrite; // crc32.b
73def WriteCRCH        : SchedWrite; // crc32.h
74def WriteCRCW        : SchedWrite; // crc32.w
75def WriteCRCD        : SchedWrite; // crc32.d
76def WriteCRCCB       : SchedWrite; // crc32c.b
77def WriteCRCCH       : SchedWrite; // crc32c.h
78def WriteCRCCW       : SchedWrite; // crc32c.w
79def WriteCRCCD       : SchedWrite; // crc32c.d
80
81// Zbt extension
82def WriteCMix        : SchedWrite; // cmix
83def WriteCMov        : SchedWrite; // cmov
84def WriteFSReg       : SchedWrite; // fsl/fsr
85def WriteFSRImm      : SchedWrite; // fsri
86def WriteFSReg32     : SchedWrite; // fslw/fsrw
87def WriteFSRImm32    : SchedWrite; // fsriw
88
89/// Define scheduler resources associated with use operands.
90
91// Zba extension
92def ReadSHXADD      : SchedRead; // sh1add/sh2add/sh3add
93def ReadSHXADD32    : SchedRead; // sh1add.uw/sh2add.uw/sh3add.uw
94
95// Zbb extension
96def ReadRotateImm   : SchedRead;
97def ReadRotateImm32 : SchedRead;
98def ReadRotateReg   : SchedRead;
99def ReadRotateReg32 : SchedRead;
100def ReadCLZ         : SchedRead;
101def ReadCLZ32       : SchedRead;
102def ReadCTZ         : SchedRead;
103def ReadCTZ32       : SchedRead;
104def ReadCPOP        : SchedRead;
105def ReadCPOP32      : SchedRead;
106def ReadREV8        : SchedRead;
107def ReadORCB        : SchedRead;
108
109// Zbc extension
110def ReadCLMUL       : SchedRead; // CLMUL/CLMULR/CLMULH
111
112// Zbs extension
113def ReadSingleBit   : SchedRead; // BCLR/BSET/BINV/BEXT
114def ReadSingleBitImm: SchedRead; // BCLRI/BSETI/BINVI/BEXTI
115
116// Zbe extension
117def ReadDecompress  : SchedRead; // bdecompress
118def ReadCompress    : SchedRead; // bcompress
119def ReadDecompress32: SchedRead; // bdecompressw
120def ReadCompress32  : SchedRead; // bcompressw
121
122// Zbf extension
123def ReadBFP         : SchedRead; // BFP
124def ReadBFP32       : SchedRead; // BFPW
125
126// Zbm extension
127def ReadBMatrix     : SchedRead; // bmator/bmatxor/bmatflip
128
129// Zbp extension
130def ReadORC         : SchedRead; // gorc
131def ReadREV         : SchedRead; // grev
132def ReadORC32       : SchedRead; // gorcw
133def ReadREV32       : SchedRead; // grevw
134def ReadREVImm      : SchedRead; // grevi
135def ReadORCImm      : SchedRead; // groci
136def ReadREVImm32    : SchedRead; // greviw
137def ReadORCImm32    : SchedRead; // gorciw
138def ReadSHFL        : SchedRead; // shfl
139def ReadUNSHFL      : SchedRead; // unshfl
140def ReadSHFL32      : SchedRead; // shflw
141def ReadUNSHFL32    : SchedRead; // unshflw
142def ReadSHFLImm     : SchedRead; // shfli
143def ReadUNSHFLImm   : SchedRead; // unshfli
144def ReadXPERMH      : SchedRead; // xperm.h
145def ReadXPERMW      : SchedRead; // xperm.w
146def ReadPACK        : SchedRead; // pack/packh
147def ReadPACK32      : SchedRead; // packw
148def ReadPACKU       : SchedRead; // packu
149def ReadPACKU32     : SchedRead; // packuw
150
151// Zbr extension
152def ReadCRCB        : SchedRead; // crc32.b
153def ReadCRCH        : SchedRead; // crc32.h
154def ReadCRCW        : SchedRead; // crc32.w
155def ReadCRCD        : SchedRead; // crc32.d
156def ReadCRCCB       : SchedRead; // crc32c.b
157def ReadCRCCH       : SchedRead; // crc32c.h
158def ReadCRCCW       : SchedRead; // crc32c.w
159def ReadCRCCD       : SchedRead; // crc32c.d
160
161// Zbt extension
162def ReadCMix        : SchedRead; // cmix
163def ReadCMov        : SchedRead; // cmov
164def ReadFSReg       : SchedRead; // fsl/fsr
165def ReadFSRImm      : SchedRead; // fsri
166def ReadFSReg32     : SchedRead; // fslw/fsrw
167def ReadFSRImm32    : SchedRead; // fsriw
168
169/// Define default scheduler resources for B.
170
171multiclass UnsupportedSchedZba {
172let Unsupported = true in {
173def : WriteRes<WriteSHXADD, []>;
174def : WriteRes<WriteSHXADD32, []>;
175
176def : ReadAdvance<ReadSHXADD, 0>;
177def : ReadAdvance<ReadSHXADD32, 0>;
178}
179}
180
181multiclass UnsupportedSchedZbb {
182let Unsupported = true in {
183def : WriteRes<WriteRotateImm, []>;
184def : WriteRes<WriteRotateImm32, []>;
185def : WriteRes<WriteRotateReg, []>;
186def : WriteRes<WriteRotateReg32, []>;
187def : WriteRes<WriteCLZ, []>;
188def : WriteRes<WriteCLZ32, []>;
189def : WriteRes<WriteCTZ, []>;
190def : WriteRes<WriteCTZ32, []>;
191def : WriteRes<WriteCPOP, []>;
192def : WriteRes<WriteCPOP32, []>;
193def : WriteRes<WriteREV8, []>;
194def : WriteRes<WriteORCB, []>;
195
196def : ReadAdvance<ReadRotateImm, 0>;
197def : ReadAdvance<ReadRotateImm32, 0>;
198def : ReadAdvance<ReadRotateReg, 0>;
199def : ReadAdvance<ReadRotateReg32, 0>;
200def : ReadAdvance<ReadCLZ, 0>;
201def : ReadAdvance<ReadCLZ32, 0>;
202def : ReadAdvance<ReadCTZ, 0>;
203def : ReadAdvance<ReadCTZ32, 0>;
204def : ReadAdvance<ReadCPOP, 0>;
205def : ReadAdvance<ReadCPOP32, 0>;
206def : ReadAdvance<ReadREV8, 0>;
207def : ReadAdvance<ReadORCB, 0>;
208}
209}
210
211multiclass UnsupportedSchedZbc {
212let Unsupported = true in {
213def : WriteRes<WriteCLMUL, []>;
214
215def : ReadAdvance<ReadCLMUL, 0>;
216}
217}
218
219multiclass UnsupportedSchedZbs {
220let Unsupported = true in {
221def : WriteRes<WriteSingleBit, []>;
222def : WriteRes<WriteSingleBitImm, []>;
223
224def : ReadAdvance<ReadSingleBit, 0>;
225def : ReadAdvance<ReadSingleBitImm, 0>;
226}
227}
228
229multiclass UnsupportedSchedZbe {
230let Unsupported = true in {
231def : WriteRes<WriteDecompress, []>;
232def : WriteRes<WriteCompress, []>;
233def : WriteRes<WriteDecompress32, []>;
234def : WriteRes<WriteCompress32, []>;
235
236def : ReadAdvance<ReadDecompress, 0>;
237def : ReadAdvance<ReadCompress, 0>;
238def : ReadAdvance<ReadDecompress32, 0>;
239def : ReadAdvance<ReadCompress32, 0>;
240}
241}
242
243multiclass UnsupportedSchedZbf {
244let Unsupported = true in {
245def : WriteRes<WriteBFP, []>;
246def : WriteRes<WriteBFP32, []>;
247
248def : ReadAdvance<ReadBFP, 0>;
249def : ReadAdvance<ReadBFP32, 0>;
250}
251}
252
253multiclass UnsupportedSchedZbm {
254let Unsupported = true in {
255def : WriteRes<WriteBMatrix, []>;
256
257def : ReadAdvance<ReadBMatrix, 0>;
258}
259}
260
261multiclass UnsupportedSchedZbp {
262let Unsupported = true in {
263def : WriteRes<WriteORC, []>;
264def : WriteRes<WriteREV, []>;
265def : WriteRes<WriteORC32, []>;
266def : WriteRes<WriteREV32, []>;
267def : WriteRes<WriteREVImm, []>;
268def : WriteRes<WriteORCImm, []>;
269def : WriteRes<WriteREVImm32, []>;
270def : WriteRes<WriteORCImm32, []>;
271def : WriteRes<WriteSHFL, []>;
272def : WriteRes<WriteUNSHFL, []>;
273def : WriteRes<WriteSHFL32, []>;
274def : WriteRes<WriteUNSHFL32, []>;
275def : WriteRes<WriteSHFLImm, []>;
276def : WriteRes<WriteUNSHFLImm, []>;
277def : WriteRes<WriteXPERMH, []>;
278def : WriteRes<WriteXPERMW, []>;
279def : WriteRes<WritePACK, []>;
280def : WriteRes<WritePACK32, []>;
281def : WriteRes<WritePACKU, []>;
282def : WriteRes<WritePACKU32, []>;
283
284def : ReadAdvance<ReadORC, 0>;
285def : ReadAdvance<ReadREV, 0>;
286def : ReadAdvance<ReadORC32, 0>;
287def : ReadAdvance<ReadREV32, 0>;
288def : ReadAdvance<ReadREVImm, 0>;
289def : ReadAdvance<ReadORCImm, 0>;
290def : ReadAdvance<ReadREVImm32, 0>;
291def : ReadAdvance<ReadORCImm32, 0>;
292def : ReadAdvance<ReadSHFL, 0>;
293def : ReadAdvance<ReadUNSHFL, 0>;
294def : ReadAdvance<ReadSHFL32, 0>;
295def : ReadAdvance<ReadUNSHFL32, 0>;
296def : ReadAdvance<ReadSHFLImm, 0>;
297def : ReadAdvance<ReadUNSHFLImm, 0>;
298def : ReadAdvance<ReadXPERMH, 0>;
299def : ReadAdvance<ReadXPERMW, 0>;
300def : ReadAdvance<ReadPACK, 0>;
301def : ReadAdvance<ReadPACK32, 0>;
302def : ReadAdvance<ReadPACKU, 0>;
303def : ReadAdvance<ReadPACKU32, 0>;
304}
305}
306
307multiclass UnsupportedSchedZbr {
308let Unsupported = true in {
309def : WriteRes<WriteCRCB, []>;
310def : WriteRes<WriteCRCH, []>;
311def : WriteRes<WriteCRCW, []>;
312def : WriteRes<WriteCRCD, []>;
313def : WriteRes<WriteCRCCB, []>;
314def : WriteRes<WriteCRCCH, []>;
315def : WriteRes<WriteCRCCW, []>;
316def : WriteRes<WriteCRCCD, []>;
317
318def : ReadAdvance<ReadCRCB, 0>;
319def : ReadAdvance<ReadCRCH, 0>;
320def : ReadAdvance<ReadCRCW, 0>;
321def : ReadAdvance<ReadCRCD, 0>;
322def : ReadAdvance<ReadCRCCB, 0>;
323def : ReadAdvance<ReadCRCCH, 0>;
324def : ReadAdvance<ReadCRCCW, 0>;
325def : ReadAdvance<ReadCRCCD, 0>;
326}
327}
328
329multiclass UnsupportedSchedZbt {
330let Unsupported = true in {
331def : WriteRes<WriteCMix, []>;
332def : WriteRes<WriteCMov, []>;
333def : WriteRes<WriteFSReg, []>;
334def : WriteRes<WriteFSRImm, []>;
335def : WriteRes<WriteFSReg32, []>;
336def : WriteRes<WriteFSRImm32, []>;
337
338def : ReadAdvance<ReadCMix, 0>;
339def : ReadAdvance<ReadCMov, 0>;
340def : ReadAdvance<ReadFSReg, 0>;
341def : ReadAdvance<ReadFSRImm, 0>;
342def : ReadAdvance<ReadFSReg32, 0>;
343def : ReadAdvance<ReadFSRImm32, 0>;
344}
345}
346