xref: /aosp_15_r20/external/llvm/lib/Target/AMDGPU/SISchedule.td (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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