1*9880d681SAndroid Build Coastguard Worker//===-- SISchedule.td - SI Scheduling definitons -------------------------===// 2*9880d681SAndroid Build Coastguard Worker// 3*9880d681SAndroid Build Coastguard Worker// The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker// 5*9880d681SAndroid Build Coastguard Worker// This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker// License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker// 8*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker// 10*9880d681SAndroid Build Coastguard Worker// MachineModel definitions for Southern Islands (SI) 11*9880d681SAndroid Build Coastguard Worker// 12*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Workerdef : PredicateProlog<[{ 15*9880d681SAndroid Build Coastguard Worker const SIInstrInfo *TII = 16*9880d681SAndroid Build Coastguard Worker static_cast<const SIInstrInfo*>(SchedModel->getInstrInfo()); 17*9880d681SAndroid Build Coastguard Worker (void)TII; 18*9880d681SAndroid Build Coastguard Worker}]>; 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Workerdef WriteBranch : SchedWrite; 21*9880d681SAndroid Build Coastguard Workerdef WriteExport : SchedWrite; 22*9880d681SAndroid Build Coastguard Workerdef WriteLDS : SchedWrite; 23*9880d681SAndroid Build Coastguard Workerdef WriteSALU : SchedWrite; 24*9880d681SAndroid Build Coastguard Workerdef WriteSMEM : SchedWrite; 25*9880d681SAndroid Build Coastguard Workerdef WriteVMEM : SchedWrite; 26*9880d681SAndroid Build Coastguard Workerdef WriteBarrier : SchedWrite; 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Worker// Vector ALU instructions 29*9880d681SAndroid Build Coastguard Workerdef Write32Bit : SchedWrite; 30*9880d681SAndroid Build Coastguard Workerdef WriteQuarterRate32 : SchedWrite; 31*9880d681SAndroid Build Coastguard Workerdef WriteFullOrQuarterRate32 : SchedWrite; 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Workerdef WriteFloatFMA : SchedWrite; 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Worker// Slow quarter rate f64 instruction. 36*9880d681SAndroid Build Coastguard Workerdef WriteDouble : SchedWrite; 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Worker// half rate f64 instruction (same as v_add_f64) 39*9880d681SAndroid Build Coastguard Workerdef WriteDoubleAdd : SchedWrite; 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Worker// Half rate 64-bit instructions. 42*9880d681SAndroid Build Coastguard Workerdef Write64Bit : SchedWrite; 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker// FIXME: Should there be a class for instructions which are VALU 45*9880d681SAndroid Build Coastguard Worker// instructions and have VALU rates, but write to the SALU (i.e. VOPC 46*9880d681SAndroid Build Coastguard Worker// instructions) 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Workerclass SISchedMachineModel : SchedMachineModel { 49*9880d681SAndroid Build Coastguard Worker let CompleteModel = 0; 50*9880d681SAndroid Build Coastguard Worker let IssueWidth = 1; 51*9880d681SAndroid Build Coastguard Worker let PostRAScheduler = 1; 52*9880d681SAndroid Build Coastguard Worker} 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Workerdef SIFullSpeedModel : SISchedMachineModel; 55*9880d681SAndroid Build Coastguard Workerdef SIQuarterSpeedModel : SISchedMachineModel; 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker// XXX: Are the resource counts correct? 58*9880d681SAndroid Build Coastguard Workerdef HWBranch : ProcResource<1> { 59*9880d681SAndroid Build Coastguard Worker let BufferSize = 1; 60*9880d681SAndroid Build Coastguard Worker} 61*9880d681SAndroid Build Coastguard Workerdef HWExport : ProcResource<1> { 62*9880d681SAndroid Build Coastguard Worker let BufferSize = 7; // Taken from S_WAITCNT 63*9880d681SAndroid Build Coastguard Worker} 64*9880d681SAndroid Build Coastguard Workerdef HWLGKM : ProcResource<1> { 65*9880d681SAndroid Build Coastguard Worker let BufferSize = 31; // Taken from S_WAITCNT 66*9880d681SAndroid Build Coastguard Worker} 67*9880d681SAndroid Build Coastguard Workerdef HWSALU : ProcResource<1> { 68*9880d681SAndroid Build Coastguard Worker let BufferSize = 1; 69*9880d681SAndroid Build Coastguard Worker} 70*9880d681SAndroid Build Coastguard Workerdef HWVMEM : ProcResource<1> { 71*9880d681SAndroid Build Coastguard Worker let BufferSize = 15; // Taken from S_WAITCNT 72*9880d681SAndroid Build Coastguard Worker} 73*9880d681SAndroid Build Coastguard Workerdef HWVALU : ProcResource<1> { 74*9880d681SAndroid Build Coastguard Worker let BufferSize = 1; 75*9880d681SAndroid Build Coastguard Worker} 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Workerclass HWWriteRes<SchedWrite write, list<ProcResourceKind> resources, 78*9880d681SAndroid Build Coastguard Worker int latency> : WriteRes<write, resources> { 79*9880d681SAndroid Build Coastguard Worker let Latency = latency; 80*9880d681SAndroid Build Coastguard Worker} 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Workerclass HWVALUWriteRes<SchedWrite write, int latency> : 83*9880d681SAndroid Build Coastguard Worker HWWriteRes<write, [HWVALU], latency>; 84*9880d681SAndroid Build Coastguard Worker 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Worker// The latency numbers are taken from AMD Accelerated Parallel Processing 87*9880d681SAndroid Build Coastguard Worker// guide. They may not be accurate. 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Worker// The latency values are 1 / (operations / cycle) / 4. 90*9880d681SAndroid Build Coastguard Workermulticlass SICommonWriteRes { 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Worker def : HWWriteRes<WriteBranch, [HWBranch], 8>; 93*9880d681SAndroid Build Coastguard Worker def : HWWriteRes<WriteExport, [HWExport], 4>; 94*9880d681SAndroid Build Coastguard Worker def : HWWriteRes<WriteLDS, [HWLGKM], 5>; // Can be between 2 and 64 95*9880d681SAndroid Build Coastguard Worker def : HWWriteRes<WriteSALU, [HWSALU], 1>; 96*9880d681SAndroid Build Coastguard Worker def : HWWriteRes<WriteSMEM, [HWLGKM], 5>; 97*9880d681SAndroid Build Coastguard Worker def : HWWriteRes<WriteVMEM, [HWVMEM], 80>; 98*9880d681SAndroid Build Coastguard Worker def : HWWriteRes<WriteBarrier, [HWBranch], 500>; // XXX: Guessed ??? 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Worker def : HWVALUWriteRes<Write32Bit, 1>; 101*9880d681SAndroid Build Coastguard Worker def : HWVALUWriteRes<Write64Bit, 2>; 102*9880d681SAndroid Build Coastguard Worker def : HWVALUWriteRes<WriteQuarterRate32, 4>; 103*9880d681SAndroid Build Coastguard Worker} 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Workerdef PredIsVGPR32Copy : SchedPredicate<[{TII->isVGPRCopy(*MI) && TII->getOpSize(*MI, 0) <= 32}]>; 106*9880d681SAndroid Build Coastguard Workerdef PredIsVGPR64Copy : SchedPredicate<[{TII->isVGPRCopy(*MI) && TII->getOpSize(*MI, 0) > 32}]>; 107*9880d681SAndroid Build Coastguard Workerdef WriteCopy : SchedWriteVariant<[ 108*9880d681SAndroid Build Coastguard Worker SchedVar<PredIsVGPR32Copy, [Write32Bit]>, 109*9880d681SAndroid Build Coastguard Worker SchedVar<PredIsVGPR64Copy, [Write64Bit]>, 110*9880d681SAndroid Build Coastguard Worker SchedVar<NoSchedPred, [WriteSALU]>]>; 111*9880d681SAndroid Build Coastguard Worker 112*9880d681SAndroid Build Coastguard Workerlet SchedModel = SIFullSpeedModel in { 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Workerdefm : SICommonWriteRes; 115*9880d681SAndroid Build Coastguard Worker 116*9880d681SAndroid Build Coastguard Workerdef : HWVALUWriteRes<WriteFloatFMA, 1>; 117*9880d681SAndroid Build Coastguard Workerdef : HWVALUWriteRes<WriteDouble, 4>; 118*9880d681SAndroid Build Coastguard Workerdef : HWVALUWriteRes<WriteDoubleAdd, 2>; 119*9880d681SAndroid Build Coastguard Worker 120*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteCopy], (instrs COPY)>; 121*9880d681SAndroid Build Coastguard Worker 122*9880d681SAndroid Build Coastguard Worker} // End SchedModel = SIFullSpeedModel 123*9880d681SAndroid Build Coastguard Worker 124*9880d681SAndroid Build Coastguard Workerlet SchedModel = SIQuarterSpeedModel in { 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Workerdefm : SICommonWriteRes; 127*9880d681SAndroid Build Coastguard Worker 128*9880d681SAndroid Build Coastguard Workerdef : HWVALUWriteRes<WriteFloatFMA, 16>; 129*9880d681SAndroid Build Coastguard Workerdef : HWVALUWriteRes<WriteDouble, 16>; 130*9880d681SAndroid Build Coastguard Workerdef : HWVALUWriteRes<WriteDoubleAdd, 8>; 131*9880d681SAndroid Build Coastguard Worker 132*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteCopy], (instrs COPY)>; 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Worker} // End SchedModel = SIQuarterSpeedModel 135