15ffd83dbSDimitry Andric//===-- SISchedule.td - SI Scheduling definitions -------------------------===// 20b57cec5SDimitry Andric// 30b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric// 70b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric// 90b57cec5SDimitry Andric// MachineModel definitions for Southern Islands (SI) 100b57cec5SDimitry Andric// 110b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 120b57cec5SDimitry Andric 130b57cec5SDimitry Andricdef : PredicateProlog<[{ 140b57cec5SDimitry Andric const SIInstrInfo *TII = 150b57cec5SDimitry Andric static_cast<const SIInstrInfo*>(SchedModel->getInstrInfo()); 160b57cec5SDimitry Andric (void)TII; 170b57cec5SDimitry Andric}]>; 180b57cec5SDimitry Andric 190b57cec5SDimitry Andricdef WriteBranch : SchedWrite; 200b57cec5SDimitry Andricdef WriteExport : SchedWrite; 210b57cec5SDimitry Andricdef WriteLDS : SchedWrite; 220b57cec5SDimitry Andricdef WriteSALU : SchedWrite; 230b57cec5SDimitry Andricdef WriteSMEM : SchedWrite; 240b57cec5SDimitry Andricdef WriteVMEM : SchedWrite; 250b57cec5SDimitry Andricdef WriteBarrier : SchedWrite; 260b57cec5SDimitry Andric 270b57cec5SDimitry Andricdef MIVGPRRead : SchedRead; 280b57cec5SDimitry Andricdef MIMFMARead : SchedRead; 290b57cec5SDimitry Andric 305ffd83dbSDimitry Andric// Normal 16 or 32 bit VALU instructions 310b57cec5SDimitry Andricdef Write32Bit : SchedWrite; 325ffd83dbSDimitry Andric// Conversion to or from F32 (but not converting F64 to or from F32) 335ffd83dbSDimitry Andricdef WriteFloatCvt : SchedWrite; 345ffd83dbSDimitry Andric// F16 or F32 transcendental instructions (these are quarter rate) 355ffd83dbSDimitry Andricdef WriteTrans32 : SchedWrite; 365ffd83dbSDimitry Andric// Other quarter rate VALU instructions 370b57cec5SDimitry Andricdef WriteQuarterRate32 : SchedWrite; 380b57cec5SDimitry Andric 390b57cec5SDimitry Andricdef WriteFloatFMA : SchedWrite; 400b57cec5SDimitry Andric 410b57cec5SDimitry Andric// Slow quarter rate f64 instruction. 420b57cec5SDimitry Andricdef WriteDouble : SchedWrite; 430b57cec5SDimitry Andric 440b57cec5SDimitry Andric// half rate f64 instruction (same as v_add_f64) 450b57cec5SDimitry Andricdef WriteDoubleAdd : SchedWrite; 460b57cec5SDimitry Andric 470b57cec5SDimitry Andric// Conversion to or from f64 instruction 480b57cec5SDimitry Andricdef WriteDoubleCvt : SchedWrite; 490b57cec5SDimitry Andric 505ffd83dbSDimitry Andric// F64 "transcendental" (actually only reciprocal and/or square root) 515ffd83dbSDimitry Andric// instructions 525ffd83dbSDimitry Andricdef WriteTrans64 : SchedWrite; 535ffd83dbSDimitry Andric 540b57cec5SDimitry Andric// Half rate 64-bit instructions. 550b57cec5SDimitry Andricdef Write64Bit : SchedWrite; 560b57cec5SDimitry Andric 57fe6060f1SDimitry Andric// Integer multiplications. 58fe6060f1SDimitry Andricdef WriteIntMul : SchedWrite; 59fe6060f1SDimitry Andric 600b57cec5SDimitry Andric// mAI multipass instructions. 610b57cec5SDimitry Andricdef Write2PassMAI : SchedWrite; 62*81ad6265SDimitry Andricdef Write4PassMAI : SchedWrite; 630b57cec5SDimitry Andricdef Write8PassMAI : SchedWrite; 640b57cec5SDimitry Andricdef Write16PassMAI : SchedWrite; 65fe6060f1SDimitry Andricdef Write4PassDGEMM : SchedWrite; 66fe6060f1SDimitry Andricdef Write8PassDGEMM : SchedWrite; 670b57cec5SDimitry Andric 680b57cec5SDimitry Andric// FIXME: Should there be a class for instructions which are VALU 690b57cec5SDimitry Andric// instructions and have VALU rates, but write to the SALU (i.e. VOPC 700b57cec5SDimitry Andric// instructions) 710b57cec5SDimitry Andric 720b57cec5SDimitry Andricclass SISchedMachineModel : SchedMachineModel { 735ffd83dbSDimitry Andric let CompleteModel = 1; 740b57cec5SDimitry Andric // MicroOpBufferSize = 1 means that instructions will always be added 750b57cec5SDimitry Andric // the ready queue when they become available. This exposes them 760b57cec5SDimitry Andric // to the register pressure analysis. 770b57cec5SDimitry Andric let MicroOpBufferSize = 1; 780b57cec5SDimitry Andric let IssueWidth = 1; 790b57cec5SDimitry Andric let PostRAScheduler = 1; 800b57cec5SDimitry Andric 810b57cec5SDimitry Andric // FIXME:Approximate 2 * branch cost. Try to hack around bad 820b57cec5SDimitry Andric // early-ifcvt heuristics. These need improvement to avoid the OOE 830b57cec5SDimitry Andric // heuristics. 840b57cec5SDimitry Andric int MispredictPenalty = 20; 850b57cec5SDimitry Andric} 860b57cec5SDimitry Andric 870b57cec5SDimitry Andricdef SIFullSpeedModel : SISchedMachineModel; 880b57cec5SDimitry Andricdef SIQuarterSpeedModel : SISchedMachineModel; 89fe6060f1SDimitry Andricdef SIDPFullSpeedModel : SISchedMachineModel; 90*81ad6265SDimitry Andricdef SIDPGFX940FullSpeedModel : SISchedMachineModel; 910b57cec5SDimitry Andricdef GFX10SpeedModel : SISchedMachineModel; 92*81ad6265SDimitry Andricdef GFX11SpeedModel : SISchedMachineModel; 930b57cec5SDimitry Andric 940b57cec5SDimitry Andric// XXX: Are the resource counts correct? 950b57cec5SDimitry Andricdef HWBranch : ProcResource<1> { 960b57cec5SDimitry Andric let BufferSize = 1; 970b57cec5SDimitry Andric} 980b57cec5SDimitry Andricdef HWExport : ProcResource<1> { 994824e7fdSDimitry Andric let BufferSize = 1; 1000b57cec5SDimitry Andric} 1010b57cec5SDimitry Andricdef HWLGKM : ProcResource<1> { 1024824e7fdSDimitry Andric let BufferSize = 1; 1030b57cec5SDimitry Andric} 1040b57cec5SDimitry Andricdef HWSALU : ProcResource<1> { 1050b57cec5SDimitry Andric let BufferSize = 1; 1060b57cec5SDimitry Andric} 1070b57cec5SDimitry Andricdef HWVMEM : ProcResource<1> { 1084824e7fdSDimitry Andric let BufferSize = 1; 1090b57cec5SDimitry Andric} 1100b57cec5SDimitry Andricdef HWVALU : ProcResource<1> { 1110b57cec5SDimitry Andric let BufferSize = 1; 1120b57cec5SDimitry Andric} 113fe6060f1SDimitry Andricdef HWTransVALU : ProcResource<1> { // Transcendental VALU 114fe6060f1SDimitry Andric let BufferSize = 1; 115fe6060f1SDimitry Andric} 1160b57cec5SDimitry Andricdef HWRC : ProcResource<1> { // Register destination cache 1170b57cec5SDimitry Andric let BufferSize = 1; 1180b57cec5SDimitry Andric} 119e8d8bef9SDimitry Andricdef HWXDL : ProcResource<1> { // MFMA CU 120e8d8bef9SDimitry Andric let BufferSize = 0; 121e8d8bef9SDimitry Andric} 1220b57cec5SDimitry Andric 1230b57cec5SDimitry Andricclass HWWriteRes<SchedWrite write, list<ProcResourceKind> resources, 1240b57cec5SDimitry Andric int latency> : WriteRes<write, resources> { 1250b57cec5SDimitry Andric let Latency = latency; 1260b57cec5SDimitry Andric} 1270b57cec5SDimitry Andric 1280b57cec5SDimitry Andricclass HWVALUWriteRes<SchedWrite write, int latency> : 1290b57cec5SDimitry Andric HWWriteRes<write, [HWVALU], latency>; 1300b57cec5SDimitry Andric 1310b57cec5SDimitry Andricdef PredMIReadVGPR : SchedPredicate<[{TII->hasVGPRUses(*MI)}]>; 1320b57cec5SDimitry Andric 1330b57cec5SDimitry Andricdef MIReadVGPR : SchedReadVariant<[ 1340b57cec5SDimitry Andric SchedVar<PredMIReadVGPR, [MIVGPRRead]>, 1350b57cec5SDimitry Andric SchedVar<NoSchedPred, [ReadDefault]>]>; 1360b57cec5SDimitry Andric 1370b57cec5SDimitry Andric// The latency numbers are taken from AMD Accelerated Parallel Processing 1380b57cec5SDimitry Andric// guide. They may not be accurate. 1390b57cec5SDimitry Andric 1400b57cec5SDimitry Andric// The latency values are 1 / (operations / cycle) / 4. 1410b57cec5SDimitry Andricmulticlass SICommonWriteRes { 1420b57cec5SDimitry Andric 143349cc55cSDimitry Andric let RetireOOO = 1 in { // llvm-mca specific flag 1440b57cec5SDimitry Andric def : HWWriteRes<WriteBranch, [HWBranch], 8>; 1450b57cec5SDimitry Andric def : HWWriteRes<WriteExport, [HWExport], 4>; 1460b57cec5SDimitry Andric def : HWWriteRes<WriteLDS, [HWLGKM], 5>; // Can be between 2 and 64 1470b57cec5SDimitry Andric def : HWWriteRes<WriteSALU, [HWSALU], 1>; 1480b57cec5SDimitry Andric def : HWWriteRes<WriteSMEM, [HWLGKM], 5>; 1490b57cec5SDimitry Andric def : HWWriteRes<WriteVMEM, [HWVMEM], 80>; 1500b57cec5SDimitry Andric def : HWWriteRes<WriteBarrier, [HWBranch], 500>; // XXX: Guessed ??? 1510b57cec5SDimitry Andric 1520b57cec5SDimitry Andric def : HWVALUWriteRes<Write32Bit, 1>; 1535ffd83dbSDimitry Andric def : HWVALUWriteRes<WriteFloatCvt, 4>; 1545ffd83dbSDimitry Andric def : HWVALUWriteRes<WriteTrans32, 4>; 1550b57cec5SDimitry Andric def : HWVALUWriteRes<WriteQuarterRate32, 4>; 156e8d8bef9SDimitry Andric 157fe6060f1SDimitry Andric def : HWVALUWriteRes<Write4PassDGEMM, 4>; 158fe6060f1SDimitry Andric def : HWVALUWriteRes<Write8PassDGEMM, 16>; 159fe6060f1SDimitry Andric 160e8d8bef9SDimitry Andric let ResourceCycles = [2] in 161e8d8bef9SDimitry Andric def : HWWriteRes<Write2PassMAI, [HWXDL], 2>; 162*81ad6265SDimitry Andric let ResourceCycles = [4] in 163*81ad6265SDimitry Andric def : HWWriteRes<Write4PassMAI, [HWXDL], 4>; 164e8d8bef9SDimitry Andric let ResourceCycles = [8] in 165e8d8bef9SDimitry Andric def : HWWriteRes<Write8PassMAI, [HWXDL], 8>; 166e8d8bef9SDimitry Andric let ResourceCycles = [16] in 167e8d8bef9SDimitry Andric def : HWWriteRes<Write16PassMAI, [HWXDL], 16>; 168349cc55cSDimitry Andric } // End RetireOOO = 1 1690b57cec5SDimitry Andric 1700b57cec5SDimitry Andric def : ReadAdvance<MIVGPRRead, -2>; 1710b57cec5SDimitry Andric 1725ffd83dbSDimitry Andric // Technically mfma reads can be from 0 to 4 cycles but that does not make 1730b57cec5SDimitry Andric // sense to model because its register setup is huge. In particular if we 1745ffd83dbSDimitry Andric // properly model read advance as -2 for a vgpr read it will result in a 1750b57cec5SDimitry Andric // bad scheduling of acc writes before that mfma. To avoid it we would 1760b57cec5SDimitry Andric // need to consume 2 or 4 more vgprs to be initialized before the acc 1770b57cec5SDimitry Andric // write sequence. Just assume worst case here. 1780b57cec5SDimitry Andric def : ReadAdvance<MIMFMARead, -4>; 1790b57cec5SDimitry Andric} 1800b57cec5SDimitry Andric 1810b57cec5SDimitry Andricdef PredIsVGPR32Copy : SchedPredicate<[{TII->isVGPRCopy(*MI) && TII->getOpSize(*MI, 0) <= 32}]>; 1820b57cec5SDimitry Andricdef PredIsVGPR64Copy : SchedPredicate<[{TII->isVGPRCopy(*MI) && TII->getOpSize(*MI, 0) > 32}]>; 1830b57cec5SDimitry Andricdef WriteCopy : SchedWriteVariant<[ 1840b57cec5SDimitry Andric SchedVar<PredIsVGPR32Copy, [Write32Bit]>, 1850b57cec5SDimitry Andric SchedVar<PredIsVGPR64Copy, [Write64Bit]>, 1860b57cec5SDimitry Andric SchedVar<NoSchedPred, [WriteSALU]>]>; 1870b57cec5SDimitry Andric 1880b57cec5SDimitry Andriclet SchedModel = SIFullSpeedModel in { 1890b57cec5SDimitry Andric 1900b57cec5SDimitry Andricdefm : SICommonWriteRes; 1910b57cec5SDimitry Andric 192349cc55cSDimitry Andriclet RetireOOO = 1 in { // llvm-mca specific flag 193fe6060f1SDimitry Andricdef : HWVALUWriteRes<Write64Bit, 2>; 194fe6060f1SDimitry Andricdef : HWVALUWriteRes<WriteIntMul, 4>; 1950b57cec5SDimitry Andricdef : HWVALUWriteRes<WriteFloatFMA, 1>; 1960b57cec5SDimitry Andricdef : HWVALUWriteRes<WriteDouble, 4>; 1970b57cec5SDimitry Andricdef : HWVALUWriteRes<WriteDoubleAdd, 2>; 1980b57cec5SDimitry Andricdef : HWVALUWriteRes<WriteDoubleCvt, 4>; 1995ffd83dbSDimitry Andricdef : HWVALUWriteRes<WriteTrans64, 4>; 200349cc55cSDimitry Andric} // End RetireOOO = 1 2010b57cec5SDimitry Andric 2020b57cec5SDimitry Andricdef : InstRW<[WriteCopy], (instrs COPY)>; 2030b57cec5SDimitry Andric 2040b57cec5SDimitry Andric} // End SchedModel = SIFullSpeedModel 2050b57cec5SDimitry Andric 2060b57cec5SDimitry Andriclet SchedModel = SIQuarterSpeedModel in { 2070b57cec5SDimitry Andric 2080b57cec5SDimitry Andricdefm : SICommonWriteRes; 2090b57cec5SDimitry Andric 210349cc55cSDimitry Andriclet RetireOOO = 1 in { // llvm-mca specific flag 211fe6060f1SDimitry Andricdef : HWVALUWriteRes<Write64Bit, 2>; 212fe6060f1SDimitry Andricdef : HWVALUWriteRes<WriteIntMul, 4>; 2130b57cec5SDimitry Andricdef : HWVALUWriteRes<WriteFloatFMA, 16>; 2140b57cec5SDimitry Andricdef : HWVALUWriteRes<WriteDouble, 16>; 2150b57cec5SDimitry Andricdef : HWVALUWriteRes<WriteDoubleAdd, 8>; 2160b57cec5SDimitry Andricdef : HWVALUWriteRes<WriteDoubleCvt, 4>; 2175ffd83dbSDimitry Andricdef : HWVALUWriteRes<WriteTrans64, 16>; 218349cc55cSDimitry Andric} // End RetireOOO = 1 2190b57cec5SDimitry Andric 2200b57cec5SDimitry Andricdef : InstRW<[WriteCopy], (instrs COPY)>; 221fe6060f1SDimitry Andricdef : InstRW<[Write64Bit, MIReadVGPR], (instregex "^V_ACCVGPR_WRITE_B32_e64$")>; 222fe6060f1SDimitry Andricdef : InstRW<[Write2PassMAI, MIMFMARead], (instregex "^V_MFMA_..._4X4X")>; 223fe6060f1SDimitry Andricdef : InstRW<[Write8PassMAI, MIMFMARead], (instregex "^V_MFMA_..._16X16X")>; 224fe6060f1SDimitry Andricdef : InstRW<[Write16PassMAI, MIMFMARead], (instregex "^V_MFMA_..._32X32X")>; 2250b57cec5SDimitry Andric 2260b57cec5SDimitry Andric} // End SchedModel = SIQuarterSpeedModel 2270b57cec5SDimitry Andric 228fe6060f1SDimitry Andriclet SchedModel = SIDPFullSpeedModel in { 229fe6060f1SDimitry Andric 230fe6060f1SDimitry Andricdefm : SICommonWriteRes; 231fe6060f1SDimitry Andric 232349cc55cSDimitry Andriclet RetireOOO = 1 in { // llvm-mca specific flag 233fe6060f1SDimitry Andricdef : HWVALUWriteRes<WriteFloatFMA, 1>; 234fe6060f1SDimitry Andricdef : HWVALUWriteRes<WriteDouble, 1>; 235fe6060f1SDimitry Andricdef : HWVALUWriteRes<WriteDoubleAdd, 1>; 236fe6060f1SDimitry Andricdef : HWVALUWriteRes<WriteDoubleCvt, 1>; 237fe6060f1SDimitry Andricdef : HWVALUWriteRes<WriteTrans64, 4>; 238fe6060f1SDimitry Andricdef : HWVALUWriteRes<WriteIntMul, 1>; 239fe6060f1SDimitry Andricdef : HWVALUWriteRes<Write64Bit, 1>; 240349cc55cSDimitry Andric} // End RetireOOO = 1 241fe6060f1SDimitry Andric 242fe6060f1SDimitry Andricdef : InstRW<[WriteCopy], (instrs COPY)>; 243fe6060f1SDimitry Andricdef : InstRW<[Write64Bit], (instregex "^V_ACCVGPR_WRITE_B32_e64$")>; 244fe6060f1SDimitry Andricdef : InstRW<[Write2PassMAI, MIMFMARead], (instregex "^V_MFMA_.32_4X4X")>; 245fe6060f1SDimitry Andricdef : InstRW<[Write8PassMAI, MIMFMARead], (instregex "^V_MFMA_.32_16X16X")>; 246fe6060f1SDimitry Andricdef : InstRW<[Write16PassMAI, MIMFMARead], (instregex "^V_MFMA_.32_32X32X")>; 247fe6060f1SDimitry Andricdef : InstRW<[Write4PassDGEMM, MIMFMARead], (instregex "^V_MFMA_.64_4X4X")>; 248fe6060f1SDimitry Andricdef : InstRW<[Write8PassDGEMM, MIMFMARead], (instregex "^V_MFMA_.64_16X16X")>; 249fe6060f1SDimitry Andric 250fe6060f1SDimitry Andric} // End SchedModel = SIDPFullSpeedModel 251fe6060f1SDimitry Andric 252*81ad6265SDimitry Andriclet SchedModel = SIDPGFX940FullSpeedModel in { 253*81ad6265SDimitry Andric 254*81ad6265SDimitry Andricdefm : SICommonWriteRes; 255*81ad6265SDimitry Andric 256*81ad6265SDimitry Andricdef : HWVALUWriteRes<WriteFloatFMA, 1>; 257*81ad6265SDimitry Andricdef : HWVALUWriteRes<WriteDouble, 1>; 258*81ad6265SDimitry Andricdef : HWVALUWriteRes<WriteDoubleAdd, 1>; 259*81ad6265SDimitry Andricdef : HWVALUWriteRes<WriteDoubleCvt, 1>; 260*81ad6265SDimitry Andricdef : HWVALUWriteRes<WriteTrans64, 4>; 261*81ad6265SDimitry Andricdef : HWVALUWriteRes<WriteIntMul, 1>; 262*81ad6265SDimitry Andricdef : HWVALUWriteRes<Write64Bit, 1>; 263*81ad6265SDimitry Andric 264*81ad6265SDimitry Andricdef : InstRW<[WriteCopy], (instrs COPY)>; 265*81ad6265SDimitry Andricdef : InstRW<[Write64Bit], (instregex "^V_ACCVGPR_WRITE_B32_e64$")>; 266*81ad6265SDimitry Andricdef : InstRW<[Write2PassMAI, MIMFMARead], (instregex "^V_MFMA_.32_4X4X")>; 267*81ad6265SDimitry Andric 268*81ad6265SDimitry Andricdef : InstRW<[Write4PassMAI, MIMFMARead], (instregex "^V_MFMA_.32_16X16X8X")>; 269*81ad6265SDimitry Andricdef : InstRW<[Write4PassMAI, MIMFMARead], (instregex "^V_MFMA_.32_16X16X16")>; 270*81ad6265SDimitry Andricdef : InstRW<[Write4PassMAI, MIMFMARead], (instregex "^V_MFMA_.32_16X16X32")>; 271*81ad6265SDimitry Andricdef : InstRW<[Write8PassMAI, MIMFMARead], (instregex "^V_MFMA_.32_16X16X[14][FBI]")>; 272*81ad6265SDimitry Andric 273*81ad6265SDimitry Andricdef : InstRW<[Write8PassMAI, MIMFMARead], (instregex "^V_MFMA_.32_32X32X4XF")>; 274*81ad6265SDimitry Andricdef : InstRW<[Write8PassMAI, MIMFMARead], (instregex "^V_MFMA_.32_32X32X8")>; 275*81ad6265SDimitry Andricdef : InstRW<[Write8PassMAI, MIMFMARead], (instregex "^V_MFMA_.32_32X32X16")>; 276*81ad6265SDimitry Andricdef : InstRW<[Write16PassMAI, MIMFMARead], (instregex "^V_MFMA_.32_32X32X[124][FBI]")>; 277*81ad6265SDimitry Andric 278*81ad6265SDimitry Andricdef : InstRW<[Write4PassDGEMM, MIMFMARead], (instregex "^V_MFMA_.64_4X4X")>; 279*81ad6265SDimitry Andricdef : InstRW<[Write8PassDGEMM, MIMFMARead], (instregex "^V_MFMA_.64_16X16X")>; 280*81ad6265SDimitry Andric 281*81ad6265SDimitry Andricdef : InstRW<[Write4PassMAI, MIMFMARead], (instregex "^V_SMFMAC_.32_16X16X")>; 282*81ad6265SDimitry Andricdef : InstRW<[Write8PassMAI, MIMFMARead], (instregex "^V_SMFMAC_.32_32X32X")>; 283*81ad6265SDimitry Andric 284*81ad6265SDimitry Andric} // End SchedModel = SIDPGFX940FullSpeedModel 285*81ad6265SDimitry Andric 2860b57cec5SDimitry Andriclet SchedModel = GFX10SpeedModel in { 2870b57cec5SDimitry Andric 2880b57cec5SDimitry Andric// The latency values are 1 / (operations / cycle). 2890b57cec5SDimitry Andric// Add 1 stall cycle for VGPR read. 290349cc55cSDimitry Andriclet RetireOOO = 1 in { // llvm-mca specific flag 2910b57cec5SDimitry Andricdef : HWWriteRes<Write32Bit, [HWVALU, HWRC], 5>; 2925ffd83dbSDimitry Andricdef : HWWriteRes<WriteFloatCvt, [HWVALU, HWRC], 5>; 2935ffd83dbSDimitry Andricdef : HWWriteRes<Write64Bit, [HWVALU, HWRC], 6>; 294fe6060f1SDimitry Andricdef : HWWriteRes<WriteTrans32, [HWTransVALU, HWRC], 10>; 2955ffd83dbSDimitry Andricdef : HWWriteRes<WriteQuarterRate32, [HWVALU, HWRC], 8>; 2960b57cec5SDimitry Andricdef : HWWriteRes<WriteFloatFMA, [HWVALU, HWRC], 5>; 2975ffd83dbSDimitry Andricdef : HWWriteRes<WriteDouble, [HWVALU, HWRC], 22>; 2985ffd83dbSDimitry Andricdef : HWWriteRes<WriteDoubleAdd, [HWVALU, HWRC], 22>; 2995ffd83dbSDimitry Andricdef : HWWriteRes<WriteDoubleCvt, [HWVALU, HWRC], 22>; 300fe6060f1SDimitry Andricdef : HWWriteRes<WriteIntMul, [HWVALU, HWRC], 8>; 301fe6060f1SDimitry Andricdef : HWWriteRes<WriteTrans64, [HWVALU, HWTransVALU, HWRC], 24>; 3020b57cec5SDimitry Andric 3030b57cec5SDimitry Andricdef : HWWriteRes<WriteBranch, [HWBranch], 32>; 3040b57cec5SDimitry Andricdef : HWWriteRes<WriteExport, [HWExport, HWRC], 16>; 3050b57cec5SDimitry Andricdef : HWWriteRes<WriteLDS, [HWLGKM, HWRC], 20>; 3065ffd83dbSDimitry Andricdef : HWWriteRes<WriteSALU, [HWSALU, HWRC], 2>; 3070b57cec5SDimitry Andricdef : HWWriteRes<WriteSMEM, [HWLGKM, HWRC], 20>; 3080b57cec5SDimitry Andricdef : HWWriteRes<WriteVMEM, [HWVMEM, HWRC], 320>; 3090b57cec5SDimitry Andricdef : HWWriteRes<WriteBarrier, [HWBranch], 2000>; 310349cc55cSDimitry Andric} // End RetireOOO = 1 3110b57cec5SDimitry Andric 3120b57cec5SDimitry Andricdef : InstRW<[WriteCopy], (instrs COPY)>; 3130b57cec5SDimitry Andric 3140b57cec5SDimitry Andric} // End SchedModel = GFX10SpeedModel 315*81ad6265SDimitry Andric 316*81ad6265SDimitry Andriclet SchedModel = GFX11SpeedModel in { 317*81ad6265SDimitry Andric 318*81ad6265SDimitry Andricdef : HWWriteRes<Write32Bit, [HWVALU, HWRC], 5>; 319*81ad6265SDimitry Andricdef : HWWriteRes<WriteFloatCvt, [HWVALU, HWRC], 5>; 320*81ad6265SDimitry Andricdef : HWWriteRes<Write64Bit, [HWVALU, HWRC], 6>; 321*81ad6265SDimitry Andricdef : HWWriteRes<WriteTrans32, [HWVALU, HWRC], 10>; 322*81ad6265SDimitry Andricdef : HWWriteRes<WriteQuarterRate32, [HWVALU, HWRC], 8>; 323*81ad6265SDimitry Andricdef : HWWriteRes<WriteFloatFMA, [HWVALU, HWRC], 5>; 324*81ad6265SDimitry Andricdef : HWWriteRes<WriteDouble, [HWVALU, HWRC], 38>; 325*81ad6265SDimitry Andricdef : HWWriteRes<WriteDoubleAdd, [HWVALU, HWRC], 38>; 326*81ad6265SDimitry Andricdef : HWWriteRes<WriteDoubleCvt, [HWVALU, HWRC], 38>; 327*81ad6265SDimitry Andricdef : HWWriteRes<WriteIntMul, [HWVALU, HWRC], 8>; 328*81ad6265SDimitry Andricdef : HWWriteRes<WriteTrans64, [HWVALU, HWRC], 40>; 329*81ad6265SDimitry Andric 330*81ad6265SDimitry Andricdef : HWWriteRes<WriteBranch, [HWBranch], 32>; 331*81ad6265SDimitry Andricdef : HWWriteRes<WriteExport, [HWExport, HWRC], 16>; 332*81ad6265SDimitry Andricdef : HWWriteRes<WriteLDS, [HWLGKM, HWRC], 20>; 333*81ad6265SDimitry Andricdef : HWWriteRes<WriteSALU, [HWSALU, HWRC], 2>; 334*81ad6265SDimitry Andricdef : HWWriteRes<WriteSMEM, [HWLGKM, HWRC], 20>; 335*81ad6265SDimitry Andricdef : HWWriteRes<WriteVMEM, [HWVMEM, HWRC], 320>; 336*81ad6265SDimitry Andricdef : HWWriteRes<WriteBarrier, [HWBranch], 2000>; 337*81ad6265SDimitry Andric 338*81ad6265SDimitry Andricdef : InstRW<[WriteCopy], (instrs COPY)>; 339*81ad6265SDimitry Andric 340*81ad6265SDimitry Andric} // End SchedModel = GFX11SpeedModel 341