xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/RISCV/RISCVSchedule.td (revision 5ffd83dbcc34f10e07f6d3e968ae6365869615f4)
113138422SDimitry Andric//===-- RISCVSchedule.td - RISCV Scheduling Definitions -------*- tablegen -*-===//
213138422SDimitry Andric//
313138422SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
413138422SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
513138422SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
613138422SDimitry Andric//
713138422SDimitry Andric//===----------------------------------------------------------------------===//
813138422SDimitry Andric
913138422SDimitry Andric/// Define scheduler resources associated with def operands.
1013138422SDimitry Andricdef WriteIALU       : SchedWrite;    // 32 or 64-bit integer ALU operations
1113138422SDimitry Andricdef WriteIALU32     : SchedWrite;    // 32-bit integer ALU operations on RV64I
1213138422SDimitry Andricdef WriteShift32    : SchedWrite;    // 32-bit shift operations on RV64Ix
1313138422SDimitry Andricdef WriteShift      : SchedWrite;    // 32 or 64-bit shift operations
1413138422SDimitry Andricdef WriteIDiv       : SchedWrite;    // 32-bit or 64-bit divide and remainder
1513138422SDimitry Andricdef WriteIDiv32     : SchedWrite;    // 32-bit divide and remainder on RV64I
1613138422SDimitry Andricdef WriteIMul       : SchedWrite;    // 32-bit or 64-bit multiply
1713138422SDimitry Andricdef WriteIMul32     : SchedWrite;    // 32-bit multiply on RV64I
1813138422SDimitry Andricdef WriteJmp        : SchedWrite;    // Jump
1913138422SDimitry Andricdef WriteJal        : SchedWrite;    // Jump and link
2013138422SDimitry Andricdef WriteJalr       : SchedWrite;    // Jump and link register
2113138422SDimitry Andricdef WriteJmpReg     : SchedWrite;    // Jump register
2213138422SDimitry Andricdef WriteNop        : SchedWrite;
2313138422SDimitry Andricdef WriteLDB        : SchedWrite;    // Load byte
2413138422SDimitry Andricdef WriteLDH        : SchedWrite;    // Load half-word
2513138422SDimitry Andricdef WriteLDW        : SchedWrite;    // Load word
2613138422SDimitry Andricdef WriteLDWU       : SchedWrite;    // Load word unsigned
2713138422SDimitry Andricdef WriteLDD        : SchedWrite;    // Load double-word
2813138422SDimitry Andricdef WriteCSR        : SchedWrite;    // CSR instructions
2913138422SDimitry Andricdef WriteSTB        : SchedWrite;    // Store byte
3013138422SDimitry Andricdef WriteSTH        : SchedWrite;    // Store half-word
3113138422SDimitry Andricdef WriteSTW        : SchedWrite;    // Store word
3213138422SDimitry Andricdef WriteSTD        : SchedWrite;    // Store double-word
3313138422SDimitry Andricdef WriteAtomicW    : SchedWrite;    //Atomic memory operation word size
3413138422SDimitry Andricdef WriteAtomicD    : SchedWrite;    //Atomic memory operation double word size
3513138422SDimitry Andricdef WriteAtomicLDW  : SchedWrite;    // Atomic load word
3613138422SDimitry Andricdef WriteAtomicLDD  : SchedWrite;    // Atomic load double word
3713138422SDimitry Andricdef WriteAtomicSTW  : SchedWrite;    // Atomic store word
3813138422SDimitry Andricdef WriteAtomicSTD  : SchedWrite;    // Atomic store double word
3913138422SDimitry Andricdef WriteFALU32     : SchedWrite;    // FP 32-bit computation
4013138422SDimitry Andricdef WriteFALU64     : SchedWrite;    // FP 64-bit computation
4113138422SDimitry Andricdef WriteFMul32     : SchedWrite;    // 32-bit floating point multiply
4213138422SDimitry Andricdef WriteFMulAdd32  : SchedWrite;    // 32-bit floating point multiply add
4313138422SDimitry Andricdef WriteFMulSub32  : SchedWrite;    // 32-bit floating point multiply sub
4413138422SDimitry Andricdef WriteFMul64     : SchedWrite;    // 64-bit floating point multiply
4513138422SDimitry Andricdef WriteFMulAdd64  : SchedWrite;      // 64-bit floating point multiply add
4613138422SDimitry Andricdef WriteFMulSub64  : SchedWrite;    // 64-bit floating point multiply sub
4713138422SDimitry Andricdef WriteFDiv32     : SchedWrite;    // 32-bit floating point divide
4813138422SDimitry Andricdef WriteFDiv64     : SchedWrite;    // 64-bit floating point divide
4913138422SDimitry Andricdef WriteFSqrt32    : SchedWrite;    // 32-bit floating point sqrt
5013138422SDimitry Andricdef WriteFSqrt64    : SchedWrite;    // 64-bit floating point sqrt
5113138422SDimitry Andric
5213138422SDimitry Andric// Integer to float conversions
5313138422SDimitry Andricdef WriteFCvtI32ToF32  : SchedWrite;
5413138422SDimitry Andricdef WriteFCvtI32ToF64  : SchedWrite;
5513138422SDimitry Andricdef WriteFCvtI64ToF32  : SchedWrite;    // RV64I only
5613138422SDimitry Andricdef WriteFCvtI64ToF64  : SchedWrite;    // RV64I only
5713138422SDimitry Andric
5813138422SDimitry Andric//Float to integer conversions
5913138422SDimitry Andricdef WriteFCvtF32ToI32  : SchedWrite;
6013138422SDimitry Andricdef WriteFCvtF32ToI64  : SchedWrite;    // RV64I only
6113138422SDimitry Andricdef WriteFCvtF64ToI32  : SchedWrite;
6213138422SDimitry Andricdef WriteFCvtF64ToI64  : SchedWrite;    // RV64I only
6313138422SDimitry Andric
6413138422SDimitry Andric// Float to float conversions
6513138422SDimitry Andricdef WriteFCvtF32ToF64  : SchedWrite;
6613138422SDimitry Andricdef WriteFCvtF64ToF32  : SchedWrite;
6713138422SDimitry Andric
6813138422SDimitry Andricdef WriteFConv32    : SchedWrite;    // 32-bit floating point convert
6913138422SDimitry Andricdef WriteFConv64    : SchedWrite;    // 64-bit floating point convert
7013138422SDimitry Andricdef WriteFClass32   : SchedWrite;    // 32-bit floating point classify
7113138422SDimitry Andricdef WriteFClass64   : SchedWrite;    // 64-bit floating point classify
7213138422SDimitry Andricdef WriteFCmp32     : SchedWrite;    // 32-bit floating point compare
7313138422SDimitry Andricdef WriteFCmp64     : SchedWrite;    // 64-bit floating point compare
74*5ffd83dbSDimitry Andricdef WriteFSGNJ32    : SchedWrite;    // 32-bit floating point sign-injection
75*5ffd83dbSDimitry Andricdef WriteFSGNJ64    : SchedWrite;    // 64-bit floating point sign-injection
76*5ffd83dbSDimitry Andricdef WriteFMinMax32  : SchedWrite;    // 32-bit floating point min or max
77*5ffd83dbSDimitry Andricdef WriteFMinMax64  : SchedWrite;    // 64-bit floating point min or max
7813138422SDimitry Andric
7913138422SDimitry Andricdef WriteFMovF32ToI32     : SchedWrite;
8013138422SDimitry Andricdef WriteFMovI32ToF32     : SchedWrite;
8113138422SDimitry Andricdef WriteFMovF64ToI64     : SchedWrite;    // RV64I only
8213138422SDimitry Andricdef WriteFMovI64ToF64     : SchedWrite;    // RV64I only
8313138422SDimitry Andric
8413138422SDimitry Andricdef WriteFMov32       : SchedWrite;    // 32-bit floating point move
8513138422SDimitry Andricdef WriteFMov64       : SchedWrite;    // 64-bit floating point move
8613138422SDimitry Andricdef WriteFLD32        : SchedWrite;    // Floating point sp load
8713138422SDimitry Andricdef WriteFLD64        : SchedWrite;    // Floating point dp load
8813138422SDimitry Andricdef WriteFST32        : SchedWrite;    // Floating point sp store
8913138422SDimitry Andricdef WriteFST64        : SchedWrite;    // Floating point dp store
9013138422SDimitry Andric
9113138422SDimitry Andric/// Define scheduler resources associated with use operands.
9213138422SDimitry Andricdef ReadJmp         : SchedRead;
9313138422SDimitry Andricdef ReadJalr        : SchedRead;
9413138422SDimitry Andricdef ReadCSR         : SchedRead;
9513138422SDimitry Andricdef ReadMemBase     : SchedRead;
96*5ffd83dbSDimitry Andricdef ReadFMemBase    : SchedRead;
9713138422SDimitry Andricdef ReadStoreData   : SchedRead;
9813138422SDimitry Andricdef ReadIALU        : SchedRead;
9913138422SDimitry Andricdef ReadIALU32      : SchedRead;    // 32-bit integer ALU operations on RV64I
10013138422SDimitry Andricdef ReadShift       : SchedRead;
10113138422SDimitry Andricdef ReadShift32     : SchedRead;    // 32-bit shift operations on RV64Ix
10213138422SDimitry Andricdef ReadIDiv        : SchedRead;
10313138422SDimitry Andricdef ReadIDiv32      : SchedRead;
10413138422SDimitry Andricdef ReadIMul        : SchedRead;
10513138422SDimitry Andricdef ReadIMul32      : SchedRead;
10613138422SDimitry Andricdef ReadAtomicWA    : SchedRead;
10713138422SDimitry Andricdef ReadAtomicWD    : SchedRead;
10813138422SDimitry Andricdef ReadAtomicDA    : SchedRead;
10913138422SDimitry Andricdef ReadAtomicDD    : SchedRead;
11013138422SDimitry Andricdef ReadAtomicLDW   : SchedRead;    // Atomic load word
11113138422SDimitry Andricdef ReadAtomicLDD   : SchedRead;    // Atomic load double word
11213138422SDimitry Andricdef ReadAtomicSTW   : SchedRead;    // Atomic store word
11313138422SDimitry Andricdef ReadAtomicSTD   : SchedRead;    // Atomic store double word
11413138422SDimitry Andricdef ReadFALU32      : SchedRead;    // FP 32-bit computation
11513138422SDimitry Andricdef ReadFALU64      : SchedRead;    // FP 64-bit computation
11613138422SDimitry Andricdef ReadFMul32      : SchedRead;    // 32-bit floating point multiply
11713138422SDimitry Andricdef ReadFMulAdd32   : SchedRead;    // 32-bit floating point multiply add
11813138422SDimitry Andricdef ReadFMulSub32   : SchedRead;    // 32-bit floating point multiply sub
11913138422SDimitry Andricdef ReadFMul64      : SchedRead;    // 64-bit floating point multiply
12013138422SDimitry Andricdef ReadFMulAdd64   : SchedRead;    // 64-bit floating point multiply add
12113138422SDimitry Andricdef ReadFMulSub64   : SchedRead;    // 64-bit floating point multiply sub
12213138422SDimitry Andricdef ReadFDiv32      : SchedRead;    // 32-bit floating point divide
12313138422SDimitry Andricdef ReadFDiv64      : SchedRead;    // 64-bit floating point divide
12413138422SDimitry Andricdef ReadFSqrt32     : SchedRead;    // 32-bit floating point sqrt
12513138422SDimitry Andricdef ReadFSqrt64     : SchedRead;    // 64-bit floating point sqrt
12613138422SDimitry Andricdef ReadFCmp32      : SchedRead;
12713138422SDimitry Andricdef ReadFCmp64      : SchedRead;
128*5ffd83dbSDimitry Andricdef ReadFSGNJ32     : SchedRead;
129*5ffd83dbSDimitry Andricdef ReadFSGNJ64     : SchedRead;
130*5ffd83dbSDimitry Andricdef ReadFMinMax32   : SchedRead;
131*5ffd83dbSDimitry Andricdef ReadFMinMax64   : SchedRead;
13213138422SDimitry Andricdef ReadFCvtF32ToI32     : SchedRead;
13313138422SDimitry Andricdef ReadFCvtF32ToI64     : SchedRead;
13413138422SDimitry Andricdef ReadFCvtF64ToI32     : SchedRead;
13513138422SDimitry Andricdef ReadFCvtF64ToI64     : SchedRead;
13613138422SDimitry Andricdef ReadFCvtI32ToF32     : SchedRead;
13713138422SDimitry Andricdef ReadFCvtI32ToF64     : SchedRead;
13813138422SDimitry Andricdef ReadFCvtI64ToF32     : SchedRead;
13913138422SDimitry Andricdef ReadFCvtI64ToF64     : SchedRead;
14013138422SDimitry Andricdef ReadFMovF32ToI32     : SchedRead;
14113138422SDimitry Andricdef ReadFMovI32ToF32     : SchedRead;
14213138422SDimitry Andricdef ReadFMovF64ToI64     : SchedRead;
14313138422SDimitry Andricdef ReadFMovI64ToF64     : SchedRead;
14413138422SDimitry Andricdef ReadFCvtF32ToF64     : SchedRead;
14513138422SDimitry Andricdef ReadFCvtF64ToF32     : SchedRead;
14613138422SDimitry Andricdef ReadFClass32         : SchedRead;
14713138422SDimitry Andricdef ReadFClass64         : SchedRead;
148