xref: /aosp_15_r20/external/llvm/lib/Target/AArch64/AArch64SchedKryo.td (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker//==- AArch64SchedKryo.td - Qualcomm Kryo Scheduling Defs ---*- tablegen -*-==//
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// This file defines the machine model for Qualcomm Kryo to support
11*9880d681SAndroid Build Coastguard Worker// instruction scheduling and other instruction cost heuristics.
12*9880d681SAndroid Build Coastguard Worker//
13*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
16*9880d681SAndroid Build Coastguard Worker// The issue width is set to five, matching the five issue queues for expanded
17*9880d681SAndroid Build Coastguard Worker// uops. Now, the latency spreadsheet has information based on fragmented uops,
18*9880d681SAndroid Build Coastguard Worker// but these do not actually take up an issue queue.
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Workerdef KryoModel : SchedMachineModel {
21*9880d681SAndroid Build Coastguard Worker  let IssueWidth        =   5; // 5-wide issue for expanded uops
22*9880d681SAndroid Build Coastguard Worker  let MicroOpBufferSize = 128; // Out-of-order with temporary unified issue buffer
23*9880d681SAndroid Build Coastguard Worker  let LoadLatency       =   4; // Optimistic load latency
24*9880d681SAndroid Build Coastguard Worker  let MispredictPenalty =  14; // Fetch + Decode/Rename/Dispatch + Branch
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Worker  // Enable partial & runtime unrolling. The magic number is chosen based on
27*9880d681SAndroid Build Coastguard Worker  // experiments and benchmarking data.
28*9880d681SAndroid Build Coastguard Worker  let LoopMicroOpBufferSize = 16;
29*9880d681SAndroid Build Coastguard Worker  let CompleteModel = 1;
30*9880d681SAndroid Build Coastguard Worker}
31*9880d681SAndroid Build Coastguard Worker
32*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
33*9880d681SAndroid Build Coastguard Worker// Define each kind of processor resource and number available on Kryo.
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Workerlet SchedModel = KryoModel in {
36*9880d681SAndroid Build Coastguard Worker  def KryoUnitXA : ProcResource<1>;                   // Type X(A) micro-ops
37*9880d681SAndroid Build Coastguard Worker  def KryoUnitXB : ProcResource<1>;                   // Type X(B) micro-ops
38*9880d681SAndroid Build Coastguard Worker  def KryoUnitYA : ProcResource<1>;                   // Type Y(A) micro-ops
39*9880d681SAndroid Build Coastguard Worker  def KryoUnitYB : ProcResource<1>;                   // Type Y(B) micro-ops
40*9880d681SAndroid Build Coastguard Worker  def KryoUnitX : ProcResGroup<[KryoUnitXA,          // Type X micro-ops
41*9880d681SAndroid Build Coastguard Worker                                KryoUnitXB]>;
42*9880d681SAndroid Build Coastguard Worker  def KryoUnitY : ProcResGroup<[KryoUnitYA,          // Type Y micro-ops
43*9880d681SAndroid Build Coastguard Worker                                KryoUnitYB]>;
44*9880d681SAndroid Build Coastguard Worker  def KryoUnitXY : ProcResGroup<[KryoUnitXA,         // Type XY micro-ops
45*9880d681SAndroid Build Coastguard Worker                                 KryoUnitXB,
46*9880d681SAndroid Build Coastguard Worker                                 KryoUnitYA,
47*9880d681SAndroid Build Coastguard Worker                                 KryoUnitYB]>;
48*9880d681SAndroid Build Coastguard Worker  def KryoUnitLSA : ProcResource<1>;                  // Type LS(A) micro-ops
49*9880d681SAndroid Build Coastguard Worker  def KryoUnitLSB : ProcResource<1>;                  // Type LS(B) micro-ops
50*9880d681SAndroid Build Coastguard Worker  def KryoUnitLS : ProcResGroup<[KryoUnitLSA,        // Type LS micro-ops
51*9880d681SAndroid Build Coastguard Worker                                 KryoUnitLSB]>;
52*9880d681SAndroid Build Coastguard Worker}
53*9880d681SAndroid Build Coastguard Worker
54*9880d681SAndroid Build Coastguard Workerlet SchedModel = KryoModel in {
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
57*9880d681SAndroid Build Coastguard Worker// Map the target-defined scheduler read/write resources and latency for
58*9880d681SAndroid Build Coastguard Worker// Kryo.
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteImm,   [KryoUnitXY]> { let Latency = 1; }
61*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteI,     [KryoUnitXY]> { let Latency = 1; }
62*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteISReg, [KryoUnitXY, KryoUnitXY]>
63*9880d681SAndroid Build Coastguard Worker      { let Latency = 2; let NumMicroOps = 2; }
64*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteIEReg, [KryoUnitXY, KryoUnitXY]>
65*9880d681SAndroid Build Coastguard Worker      { let Latency = 2; let NumMicroOps = 2; }
66*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteExtr,  [KryoUnitXY, KryoUnitX]>
67*9880d681SAndroid Build Coastguard Worker      { let Latency = 2; let NumMicroOps = 2; }
68*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteIS,    [KryoUnitXY]> { let Latency = 2; }
69*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteID32,  [KryoUnitXA, KryoUnitY]>
70*9880d681SAndroid Build Coastguard Worker      { let Latency = 8; let NumMicroOps = 1; } // Fragent -1
71*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteID64,  [KryoUnitXA, KryoUnitY]>
72*9880d681SAndroid Build Coastguard Worker      { let Latency = 8; let NumMicroOps = 1; } // Fragent -1
73*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteIM32,  [KryoUnitX]> { let Latency = 5; }
74*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteIM64,  [KryoUnitX]> { let Latency = 5; }
75*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteBr,    [KryoUnitXY]> { let Latency = 1; }
76*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteBrReg, [KryoUnitXY]> { let Latency = 1; }
77*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteLD,    [KryoUnitLS]> { let Latency = 4; }
78*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteST,    [KryoUnitLS]> { let Latency = 4; }
79*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteSTP,   [KryoUnitLS]> { let Latency = 4; }
80*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteAdr,   [KryoUnitXY]> { let Latency = 6; }
81*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteLDIdx, [KryoUnitLS]> { let Latency = 4; }
82*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteSTIdx, [KryoUnitLS]> { let Latency = 4; }
83*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteF,     [KryoUnitXY, KryoUnitXY]>
84*9880d681SAndroid Build Coastguard Worker      { let Latency = 3; let NumMicroOps = 2; }
85*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFCmp,  [KryoUnitXY]> { let Latency = 2; }
86*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFCvt,  [KryoUnitX]> { let Latency = 4; }
87*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFCopy, [KryoUnitXY]> { let Latency = 6; }
88*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFImm,  [KryoUnitXY]> { let Latency = 6; }
89*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFMul,  [KryoUnitX, KryoUnitX]>
90*9880d681SAndroid Build Coastguard Worker      { let Latency = 6; let NumMicroOps = 2; }
91*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFDiv,  [KryoUnitXA, KryoUnitY]>
92*9880d681SAndroid Build Coastguard Worker      { let Latency = 12; let NumMicroOps = 2; } // Fragent -1 / NoRSV +1
93*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteV,     [KryoUnitXY]> { let Latency = 6; }
94*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteVLD,   [KryoUnitLS]> { let Latency = 4; }
95*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteVST,   [KryoUnitLS]> { let Latency = 4; }
96*9880d681SAndroid Build Coastguard Worker
97*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteSys,     []> { let Latency = 1; }
98*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteBarrier, []> { let Latency = 1; }
99*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteHint,    []> { let Latency = 1; }
100*9880d681SAndroid Build Coastguard Worker
101*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteLDHi,    []> { let Latency = 4; }
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteAtomic, []> { let Unsupported = 1; }
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Worker// No forwarding logic is modelled yet.
106*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadI,       0>;
107*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadISReg,   0>;
108*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadIEReg,   0>;
109*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadIM,      0>;
110*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadIMA,     0>;
111*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadID,      0>;
112*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadExtrHi,  0>;
113*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadAdrBase, 0>;
114*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadVLD,     0>;
115*9880d681SAndroid Build Coastguard Worker
116*9880d681SAndroid Build Coastguard Worker
117*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
118*9880d681SAndroid Build Coastguard Worker// Specialize the coarse model by associating instruction groups with the
119*9880d681SAndroid Build Coastguard Worker// subtarget-defined types. As the modeled is refined, this will override most
120*9880d681SAndroid Build Coastguard Worker// of the above SchedWriteRes and SchedAlias mappings.
121*9880d681SAndroid Build Coastguard Worker
122*9880d681SAndroid Build Coastguard Worker// Miscellaneous
123*9880d681SAndroid Build Coastguard Worker// -----------------------------------------------------------------------------
124*9880d681SAndroid Build Coastguard Worker
125*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteI], (instrs COPY)>;
126*9880d681SAndroid Build Coastguard Worker
127*9880d681SAndroid Build Coastguard Worker
128*9880d681SAndroid Build Coastguard Worker// Detailed Refinedments
129*9880d681SAndroid Build Coastguard Worker// -----------------------------------------------------------------------------
130*9880d681SAndroid Build Coastguard Workerinclude "AArch64SchedKryoDetails.td"
131*9880d681SAndroid Build Coastguard Worker
132*9880d681SAndroid Build Coastguard Worker
133*9880d681SAndroid Build Coastguard Worker} // SchedModel = KryoModel
134