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