1//===-- RISCVSchedule.td - RISC-V 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 17def WriteIDiv32 : SchedWrite; // 32-bit divide on RV64I 18def WriteIRem : SchedWrite; // 32-bit or 64-bit remainder 19def WriteIRem32 : SchedWrite; // 32-bit remainder on RV64I 20def WriteIMul : SchedWrite; // 32-bit or 64-bit multiply 21def WriteIMul32 : SchedWrite; // 32-bit multiply on RV64I 22def WriteJmp : SchedWrite; // Jump 23def WriteJal : SchedWrite; // Jump and link 24def WriteJalr : SchedWrite; // Jump and link register 25def WriteNop : SchedWrite; 26def WriteLDB : SchedWrite; // Load byte 27def WriteLDH : SchedWrite; // Load half-word 28def WriteLDW : SchedWrite; // Load word 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 WriteAtomicB : SchedWrite; //Atomic memory operation byte size 36def WriteAtomicH : SchedWrite; //Atomic memory operation halfword size 37def WriteAtomicW : SchedWrite; //Atomic memory operation word size 38def WriteAtomicD : SchedWrite; //Atomic memory operation double word size 39def WriteAtomicLDW : SchedWrite; // Atomic load word 40def WriteAtomicLDD : SchedWrite; // Atomic load double word 41def WriteAtomicSTW : SchedWrite; // Atomic store word 42def WriteAtomicSTD : SchedWrite; // Atomic store double word 43def WriteFAdd16 : SchedWrite; // 16-bit floating point addition/subtraction 44def WriteFAdd32 : SchedWrite; // 32-bit floating point addition/subtraction 45def WriteFAdd64 : SchedWrite; // 64-bit floating point addition/subtraction 46def WriteFMul16 : SchedWrite; // 16-bit floating point multiply 47def WriteFMul32 : SchedWrite; // 32-bit floating point multiply 48def WriteFMul64 : SchedWrite; // 64-bit floating point multiply 49def WriteFMA16 : SchedWrite; // 16-bit floating point fused multiply-add 50def WriteFMA32 : SchedWrite; // 32-bit floating point fused multiply-add 51def WriteFMA64 : SchedWrite; // 64-bit floating point fused multiply-add 52def WriteFDiv16 : SchedWrite; // 16-bit floating point divide 53def WriteFDiv32 : SchedWrite; // 32-bit floating point divide 54def WriteFDiv64 : SchedWrite; // 64-bit floating point divide 55def WriteFSqrt16 : SchedWrite; // 16-bit floating point sqrt 56def WriteFSqrt32 : SchedWrite; // 32-bit floating point sqrt 57def WriteFSqrt64 : SchedWrite; // 64-bit floating point sqrt 58 59// Integer to float conversions 60def WriteFCvtI32ToF16 : SchedWrite; 61def WriteFCvtI32ToF32 : SchedWrite; 62def WriteFCvtI32ToF64 : SchedWrite; 63def WriteFCvtI64ToF16 : SchedWrite; // RV64I only 64def WriteFCvtI64ToF32 : SchedWrite; // RV64I only 65def WriteFCvtI64ToF64 : SchedWrite; // RV64I only 66 67//Float to integer conversions 68def WriteFCvtF16ToI32 : SchedWrite; 69def WriteFCvtF16ToI64 : SchedWrite; // RV64I only 70def WriteFCvtF32ToI32 : SchedWrite; 71def WriteFCvtF32ToI64 : SchedWrite; // RV64I only 72def WriteFCvtF64ToI32 : SchedWrite; 73def WriteFCvtF64ToI64 : SchedWrite; // RV64I only 74 75// Float to float conversions 76def WriteFCvtF32ToF64 : SchedWrite; 77def WriteFCvtF64ToF32 : SchedWrite; 78def WriteFCvtF16ToF32 : SchedWrite; 79def WriteFCvtF32ToF16 : SchedWrite; 80def WriteFCvtF16ToF64 : SchedWrite; 81def WriteFCvtF64ToF16 : SchedWrite; 82 83// Zfa found instructions. 84def WriteFRoundF32 : SchedWrite; 85def WriteFRoundF64 : SchedWrite; 86def WriteFRoundF16 : SchedWrite; 87 88def WriteFClass16 : SchedWrite; // 16-bit floating point classify 89def WriteFClass32 : SchedWrite; // 32-bit floating point classify 90def WriteFClass64 : SchedWrite; // 64-bit floating point classify 91def WriteFCmp16 : SchedWrite; // 16-bit floating point compare 92def WriteFCmp32 : SchedWrite; // 32-bit floating point compare 93def WriteFCmp64 : SchedWrite; // 64-bit floating point compare 94def WriteFSGNJ16 : SchedWrite; // 16-bit floating point sign-injection 95def WriteFSGNJ32 : SchedWrite; // 32-bit floating point sign-injection 96def WriteFSGNJ64 : SchedWrite; // 64-bit floating point sign-injection 97def WriteFMinMax16 : SchedWrite; // 16-bit floating point min or max 98def WriteFMinMax32 : SchedWrite; // 32-bit floating point min or max 99def WriteFMinMax64 : SchedWrite; // 64-bit floating point min or max 100 101def WriteFMovF16ToI16 : SchedWrite; 102def WriteFMovI16ToF16 : SchedWrite; 103def WriteFMovF32ToI32 : SchedWrite; 104def WriteFMovI32ToF32 : SchedWrite; 105def WriteFMovF64ToI64 : SchedWrite; // RV64I only 106def WriteFMovI64ToF64 : SchedWrite; // RV64I only 107 108def WriteFLI16 : SchedWrite; // Floating point constant load 109def WriteFLI32 : SchedWrite; // Floating point constant load 110def WriteFLI64 : SchedWrite; // Floating point constant load 111 112def WriteFLD16 : SchedWrite; // Floating point sp load 113def WriteFLD32 : SchedWrite; // Floating point sp load 114def WriteFLD64 : SchedWrite; // Floating point dp load 115def WriteFST16 : SchedWrite; // Floating point sp store 116def WriteFST32 : SchedWrite; // Floating point sp store 117def WriteFST64 : SchedWrite; // Floating point dp store 118 119// short forward branch for Bullet 120def WriteSFB : SchedWrite; 121def ReadSFBJmp : SchedRead; 122def ReadSFBALU : SchedRead; 123 124/// Define scheduler resources associated with use operands. 125def ReadJmp : SchedRead; 126def ReadJalr : SchedRead; 127def ReadCSR : SchedRead; 128def ReadMemBase : SchedRead; 129def ReadFMemBase : SchedRead; 130def ReadStoreData : SchedRead; 131def ReadFStoreData : SchedRead; 132def ReadIALU : SchedRead; 133def ReadIALU32 : SchedRead; // 32-bit integer ALU operations on RV64I 134def ReadShiftImm : SchedRead; 135def ReadShiftImm32 : SchedRead; // 32-bit shift by immediate operations on RV64Ix 136def ReadShiftReg : SchedRead; 137def ReadShiftReg32 : SchedRead; // 32-bit shift by register operations on RV64Ix 138def ReadIDiv : SchedRead; 139def ReadIDiv32 : SchedRead; 140def ReadIRem : SchedRead; 141def ReadIRem32 : SchedRead; 142def ReadIMul : SchedRead; 143def ReadIMul32 : SchedRead; 144def ReadAtomicBA : SchedRead; 145def ReadAtomicBD : SchedRead; 146def ReadAtomicHA : SchedRead; 147def ReadAtomicHD : SchedRead; 148def ReadAtomicWA : SchedRead; 149def ReadAtomicWD : SchedRead; 150def ReadAtomicDA : SchedRead; 151def ReadAtomicDD : SchedRead; 152def ReadAtomicLDW : SchedRead; // Atomic load word 153def ReadAtomicLDD : SchedRead; // Atomic load double word 154def ReadAtomicSTW : SchedRead; // Atomic store word 155def ReadAtomicSTD : SchedRead; // Atomic store double word 156def ReadFAdd16 : SchedRead; // 16-bit floating point addition/subtraction 157def ReadFAdd32 : SchedRead; // 32-bit floating point addition/subtraction 158def ReadFAdd64 : SchedRead; // 64-bit floating point addition/subtraction 159def ReadFMul16 : SchedRead; // 16-bit floating point multiply 160def ReadFMul32 : SchedRead; // 32-bit floating point multiply 161def ReadFMul64 : SchedRead; // 64-bit floating point multiply 162def ReadFMA16 : SchedRead; // 16-bit floating point fused multiply-add 163def ReadFMA16Addend : SchedRead; // 16-bit floating point fused multiply-add (addend) 164def ReadFMA32 : SchedRead; // 32-bit floating point fused multiply-add 165def ReadFMA32Addend : SchedRead; // 32-bit floating point fused multiply-add (addend) 166def ReadFMA64 : SchedRead; // 64-bit floating point fused multiply-add 167def ReadFMA64Addend : SchedRead; // 64-bit floating point fused multiply-add (addend) 168def ReadFDiv16 : SchedRead; // 16-bit floating point divide 169def ReadFDiv32 : SchedRead; // 32-bit floating point divide 170def ReadFDiv64 : SchedRead; // 64-bit floating point divide 171def ReadFSqrt16 : SchedRead; // 16-bit floating point sqrt 172def ReadFSqrt32 : SchedRead; // 32-bit floating point sqrt 173def ReadFSqrt64 : SchedRead; // 64-bit floating point sqrt 174def ReadFCmp16 : SchedRead; 175def ReadFCmp32 : SchedRead; 176def ReadFCmp64 : SchedRead; 177def ReadFSGNJ16 : SchedRead; 178def ReadFSGNJ32 : SchedRead; 179def ReadFSGNJ64 : SchedRead; 180def ReadFMinMax16 : SchedRead; 181def ReadFMinMax32 : SchedRead; 182def ReadFMinMax64 : SchedRead; 183def ReadFCvtF16ToI32 : SchedRead; 184def ReadFCvtF16ToI64 : SchedRead; 185def ReadFCvtF32ToI32 : SchedRead; 186def ReadFCvtF32ToI64 : SchedRead; 187def ReadFCvtF64ToI32 : SchedRead; 188def ReadFCvtF64ToI64 : SchedRead; 189def ReadFCvtI32ToF16 : SchedRead; 190def ReadFCvtI32ToF32 : SchedRead; 191def ReadFCvtI32ToF64 : SchedRead; 192def ReadFCvtI64ToF16 : SchedRead; 193def ReadFCvtI64ToF32 : SchedRead; 194def ReadFCvtI64ToF64 : SchedRead; 195def ReadFMovF16ToI16 : SchedRead; 196def ReadFMovI16ToF16 : SchedRead; 197def ReadFMovF32ToI32 : SchedRead; 198def ReadFMovI32ToF32 : SchedRead; 199def ReadFMovF64ToI64 : SchedRead; 200def ReadFMovI64ToF64 : SchedRead; 201def ReadFCvtF32ToF64 : SchedRead; 202def ReadFCvtF64ToF32 : SchedRead; 203def ReadFCvtF16ToF32 : SchedRead; 204def ReadFCvtF32ToF16 : SchedRead; 205def ReadFCvtF16ToF64 : SchedRead; 206def ReadFCvtF64ToF16 : SchedRead; 207def ReadFRoundF16 : SchedRead; 208def ReadFRoundF32 : SchedRead; 209def ReadFRoundF64 : SchedRead; 210def ReadFClass16 : SchedRead; 211def ReadFClass32 : SchedRead; 212def ReadFClass64 : SchedRead; 213 214// For CPUs that support Zfhmin, but not Zfh. 215multiclass UnsupportedSchedZfh { 216let Unsupported = true in { 217def : WriteRes<WriteFAdd16, []>; 218def : WriteRes<WriteFClass16, []>; 219def : WriteRes<WriteFCvtI64ToF16, []>; 220def : WriteRes<WriteFCvtI32ToF16, []>; 221def : WriteRes<WriteFCvtF16ToI64, []>; 222def : WriteRes<WriteFCvtF16ToI32, []>; 223def : WriteRes<WriteFDiv16, []>; 224def : WriteRes<WriteFCmp16, []>; 225def : WriteRes<WriteFMA16, []>; 226def : WriteRes<WriteFMinMax16, []>; 227def : WriteRes<WriteFMul16, []>; 228def : WriteRes<WriteFSGNJ16, []>; 229def : WriteRes<WriteFSqrt16, []>; 230 231def : ReadAdvance<ReadFAdd16, 0>; 232def : ReadAdvance<ReadFClass16, 0>; 233def : ReadAdvance<ReadFCvtI64ToF16, 0>; 234def : ReadAdvance<ReadFCvtI32ToF16, 0>; 235def : ReadAdvance<ReadFCvtF16ToI64, 0>; 236def : ReadAdvance<ReadFCvtF16ToI32, 0>; 237def : ReadAdvance<ReadFDiv16, 0>; 238def : ReadAdvance<ReadFCmp16, 0>; 239def : ReadAdvance<ReadFMA16, 0>; 240def : ReadAdvance<ReadFMA16Addend, 0>; 241def : ReadAdvance<ReadFMinMax16, 0>; 242def : ReadAdvance<ReadFMul16, 0>; 243def : ReadAdvance<ReadFSGNJ16, 0>; 244def : ReadAdvance<ReadFSqrt16, 0>; 245} // Unsupported = true 246} 247 248// For CPUs that support neither Zfhmin or Zfh. 249multiclass UnsupportedSchedZfhmin : UnsupportedSchedZfh { 250let Unsupported = true in { 251def : WriteRes<WriteFCvtF16ToF64, []>; 252def : WriteRes<WriteFCvtF64ToF16, []>; 253def : WriteRes<WriteFCvtF16ToF32, []>; 254def : WriteRes<WriteFCvtF32ToF16, []>; 255def : WriteRes<WriteFLD16, []>; 256def : WriteRes<WriteFMovI16ToF16, []>; 257def : WriteRes<WriteFMovF16ToI16, []>; 258def : WriteRes<WriteFST16, []>; 259 260def : ReadAdvance<ReadFCvtF16ToF64, 0>; 261def : ReadAdvance<ReadFCvtF64ToF16, 0>; 262def : ReadAdvance<ReadFCvtF16ToF32, 0>; 263def : ReadAdvance<ReadFCvtF32ToF16, 0>; 264def : ReadAdvance<ReadFMovI16ToF16, 0>; 265def : ReadAdvance<ReadFMovF16ToI16, 0>; 266} // Unsupported = true 267} 268 269multiclass UnsupportedSchedD { 270let Unsupported = true in { 271def : WriteRes<WriteFST64, []>; 272def : WriteRes<WriteFLD64, []>; 273def : WriteRes<WriteFAdd64, []>; 274def : WriteRes<WriteFSGNJ64, []>; 275def : WriteRes<WriteFMinMax64, []>; 276def : WriteRes<WriteFCvtI32ToF64, []>; 277def : WriteRes<WriteFCvtI64ToF64, []>; 278def : WriteRes<WriteFCvtF64ToI32, []>; 279def : WriteRes<WriteFCvtF64ToI64, []>; 280def : WriteRes<WriteFCvtF32ToF64, []>; 281def : WriteRes<WriteFCvtF64ToF32, []>; 282def : WriteRes<WriteFClass64, []>; 283def : WriteRes<WriteFCmp64, []>; 284def : WriteRes<WriteFMovF64ToI64, []>; 285def : WriteRes<WriteFMovI64ToF64, []>; 286def : WriteRes<WriteFMul64, []>; 287def : WriteRes<WriteFMA64, []>; 288def : WriteRes<WriteFDiv64, []>; 289def : WriteRes<WriteFSqrt64, []>; 290 291def : ReadAdvance<ReadFAdd64, 0>; 292def : ReadAdvance<ReadFMul64, 0>; 293def : ReadAdvance<ReadFMA64, 0>; 294def : ReadAdvance<ReadFMA64Addend, 0>; 295def : ReadAdvance<ReadFDiv64, 0>; 296def : ReadAdvance<ReadFSqrt64, 0>; 297def : ReadAdvance<ReadFCmp64, 0>; 298def : ReadAdvance<ReadFSGNJ64, 0>; 299def : ReadAdvance<ReadFMinMax64, 0>; 300def : ReadAdvance<ReadFCvtF64ToI32, 0>; 301def : ReadAdvance<ReadFCvtF64ToI64, 0>; 302def : ReadAdvance<ReadFCvtI32ToF64, 0>; 303def : ReadAdvance<ReadFCvtI64ToF64, 0>; 304def : ReadAdvance<ReadFCvtF32ToF64, 0>; 305def : ReadAdvance<ReadFCvtF64ToF32, 0>; 306def : ReadAdvance<ReadFMovF64ToI64, 0>; 307def : ReadAdvance<ReadFMovI64ToF64, 0>; 308def : ReadAdvance<ReadFClass64, 0>; 309} // Unsupported = true 310} 311 312// For CPUs with no floating point. 313multiclass UnsupportedSchedF : UnsupportedSchedD, UnsupportedSchedZfhmin { 314let Unsupported = true in { 315def : WriteRes<WriteFST32, []>; 316def : WriteRes<WriteFLD32, []>; 317def : WriteRes<WriteFAdd32, []>; 318def : WriteRes<WriteFSGNJ32, []>; 319def : WriteRes<WriteFMinMax32, []>; 320def : WriteRes<WriteFCvtI32ToF32, []>; 321def : WriteRes<WriteFCvtI64ToF32, []>; 322def : WriteRes<WriteFCvtF32ToI32, []>; 323def : WriteRes<WriteFCvtF32ToI64, []>; 324def : WriteRes<WriteFClass32, []>; 325def : WriteRes<WriteFCmp32, []>; 326def : WriteRes<WriteFMovF32ToI32, []>; 327def : WriteRes<WriteFMovI32ToF32, []>; 328def : WriteRes<WriteFMul32, []>; 329def : WriteRes<WriteFMA32, []>; 330def : WriteRes<WriteFDiv32, []>; 331def : WriteRes<WriteFSqrt32, []>; 332 333def : ReadAdvance<ReadFAdd32, 0>; 334def : ReadAdvance<ReadFMul32, 0>; 335def : ReadAdvance<ReadFMA32, 0>; 336def : ReadAdvance<ReadFMA32Addend, 0>; 337def : ReadAdvance<ReadFDiv32, 0>; 338def : ReadAdvance<ReadFSqrt32, 0>; 339def : ReadAdvance<ReadFCmp32, 0>; 340def : ReadAdvance<ReadFSGNJ32, 0>; 341def : ReadAdvance<ReadFMinMax32, 0>; 342def : ReadAdvance<ReadFCvtF32ToI32, 0>; 343def : ReadAdvance<ReadFCvtF32ToI64, 0>; 344def : ReadAdvance<ReadFCvtI32ToF32, 0>; 345def : ReadAdvance<ReadFCvtI64ToF32, 0>; 346def : ReadAdvance<ReadFMovF32ToI32, 0>; 347def : ReadAdvance<ReadFMovI32ToF32, 0>; 348def : ReadAdvance<ReadFClass32, 0>; 349def : ReadAdvance<ReadFStoreData, 0>; 350def : ReadAdvance<ReadFMemBase, 0>; 351} // Unsupported = true 352} 353 354multiclass UnsupportedSchedSFB { 355let Unsupported = true in { 356def : WriteRes<WriteSFB, []>; 357 358def : ReadAdvance<ReadSFBJmp, 0>; 359def : ReadAdvance<ReadSFBALU, 0>; 360} // Unsupported = true 361} 362 363multiclass UnsupportedSchedZfa { 364let Unsupported = true in { 365def : WriteRes<WriteFRoundF16, []>; 366def : WriteRes<WriteFRoundF32, []>; 367def : WriteRes<WriteFRoundF64, []>; 368def : WriteRes<WriteFLI16, []>; 369def : WriteRes<WriteFLI32, []>; 370def : WriteRes<WriteFLI64, []>; 371 372def : ReadAdvance<ReadFRoundF32, 0>; 373def : ReadAdvance<ReadFRoundF64, 0>; 374def : ReadAdvance<ReadFRoundF16, 0>; 375} // Unsupported = true 376} 377 378multiclass UnsupportedSchedZabha { 379let Unsupported = true in { 380def : WriteRes<WriteAtomicB, []>; 381def : WriteRes<WriteAtomicH, []>; 382 383def : ReadAdvance<ReadAtomicBA, 0>; 384def : ReadAdvance<ReadAtomicBD, 0>; 385def : ReadAdvance<ReadAtomicHA, 0>; 386def : ReadAdvance<ReadAtomicHD, 0>; 387} // Unsupported = true 388} 389 390multiclass UnsupportedSchedA { 391let Unsupported = true in { 392def : WriteRes<WriteAtomicW, []>; 393def : WriteRes<WriteAtomicD, []>; 394def : WriteRes<WriteAtomicLDW, []>; 395def : WriteRes<WriteAtomicLDD, []>; 396def : WriteRes<WriteAtomicSTW, []>; 397def : WriteRes<WriteAtomicSTD, []>; 398 399def : ReadAdvance<ReadAtomicWA, 0>; 400def : ReadAdvance<ReadAtomicWD, 0>; 401def : ReadAdvance<ReadAtomicDA, 0>; 402def : ReadAdvance<ReadAtomicDD, 0>; 403def : ReadAdvance<ReadAtomicLDW, 0>; 404def : ReadAdvance<ReadAtomicLDD, 0>; 405def : ReadAdvance<ReadAtomicSTW, 0>; 406def : ReadAdvance<ReadAtomicSTD, 0>; 407} // Unsupported = true 408} 409 410// Include the scheduler resources for other instruction extensions. 411include "RISCVScheduleZb.td" 412include "RISCVScheduleV.td" 413include "RISCVScheduleXSf.td" 414include "RISCVScheduleZvk.td" 415