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