1*9880d681SAndroid Build Coastguard Worker//=- AArch64SchedM1.td - Samsung Exynos-M1 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 Samsung Exynos-M1 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 Exynos-M1 is a traditional superscalar microprocessor with a 17*9880d681SAndroid Build Coastguard Worker// 4-wide in-order stage for decode and dispatch and a wider issue stage. 18*9880d681SAndroid Build Coastguard Worker// The execution units and loads and stores are out-of-order. 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Workerdef ExynosM1Model : SchedMachineModel { 21*9880d681SAndroid Build Coastguard Worker let IssueWidth = 4; // Up to 4 uops per cycle. 22*9880d681SAndroid Build Coastguard Worker let MicroOpBufferSize = 96; // ROB size. 23*9880d681SAndroid Build Coastguard Worker let LoopMicroOpBufferSize = 24; // Based on the instruction queue size. 24*9880d681SAndroid Build Coastguard Worker let LoadLatency = 4; // Optimistic load cases. 25*9880d681SAndroid Build Coastguard Worker let MispredictPenalty = 14; // Minimum branch misprediction penalty. 26*9880d681SAndroid Build Coastguard Worker let CompleteModel = 0; // Use the default model otherwise. 27*9880d681SAndroid Build Coastguard Worker} 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 30*9880d681SAndroid Build Coastguard Worker// Define each kind of processor resource and number available on the Exynos-M1, 31*9880d681SAndroid Build Coastguard Worker// which has 9 pipelines, each with its own queue with out-of-order dispatch. 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Workerdef M1UnitA : ProcResource<2>; // Simple integer 34*9880d681SAndroid Build Coastguard Workerdef M1UnitC : ProcResource<1>; // Simple and complex integer 35*9880d681SAndroid Build Coastguard Workerdef M1UnitB : ProcResource<2>; // Branch 36*9880d681SAndroid Build Coastguard Workerdef M1UnitL : ProcResource<1>; // Load 37*9880d681SAndroid Build Coastguard Workerdef M1UnitS : ProcResource<1>; // Store 38*9880d681SAndroid Build Coastguard Workerdef M1PipeF0 : ProcResource<1>; // FP #0 39*9880d681SAndroid Build Coastguard Workerdef M1PipeF1 : ProcResource<1>; // FP #1 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Workerlet Super = M1PipeF0 in { 42*9880d681SAndroid Build Coastguard Worker def M1UnitFMAC : ProcResource<1>; // FP multiplication 43*9880d681SAndroid Build Coastguard Worker def M1UnitFCVT : ProcResource<1>; // FP conversion 44*9880d681SAndroid Build Coastguard Worker def M1UnitNAL0 : ProcResource<1>; // Simple vector. 45*9880d681SAndroid Build Coastguard Worker def M1UnitNMISC : ProcResource<1>; // Miscellanea 46*9880d681SAndroid Build Coastguard Worker def M1UnitNCRYPT : ProcResource<1>; // Cryptographic 47*9880d681SAndroid Build Coastguard Worker} 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Workerlet Super = M1PipeF1 in { 50*9880d681SAndroid Build Coastguard Worker def M1UnitFADD : ProcResource<1>; // Simple FP 51*9880d681SAndroid Build Coastguard Worker let BufferSize = 1 in 52*9880d681SAndroid Build Coastguard Worker def M1UnitFVAR : ProcResource<1>; // FP division & square root (serialized) 53*9880d681SAndroid Build Coastguard Worker def M1UnitNAL1 : ProcResource<1>; // Simple vector. 54*9880d681SAndroid Build Coastguard Worker def M1UnitFST : ProcResource<1>; // FP store 55*9880d681SAndroid Build Coastguard Worker} 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Workerlet SchedModel = ExynosM1Model in { 58*9880d681SAndroid Build Coastguard Worker def M1UnitALU : ProcResGroup<[M1UnitA, 59*9880d681SAndroid Build Coastguard Worker M1UnitC]>; // All simple integer. 60*9880d681SAndroid Build Coastguard Worker def M1UnitNALU : ProcResGroup<[M1UnitNAL0, 61*9880d681SAndroid Build Coastguard Worker M1UnitNAL1]>; // All simple vector. 62*9880d681SAndroid Build Coastguard Worker} 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Workerlet SchedModel = ExynosM1Model in { 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 67*9880d681SAndroid Build Coastguard Worker// Coarse scheduling model for the Exynos-M1. 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Worker// Branch instructions. 70*9880d681SAndroid Build Coastguard Worker// TODO: Non-conditional direct branches take zero cycles and units. 71*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteBr, [M1UnitB]> { let Latency = 1; } 72*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteBrReg, [M1UnitC]> { let Latency = 1; } 73*9880d681SAndroid Build Coastguard Worker// TODO: Branch and link is much different. 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Worker// Arithmetic and logical integer instructions. 76*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteI, [M1UnitALU]> { let Latency = 1; } 77*9880d681SAndroid Build Coastguard Worker// TODO: Shift over 3 and some extensions take 2 cycles. 78*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteISReg, [M1UnitALU]> { let Latency = 1; } 79*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteIEReg, [M1UnitALU]> { let Latency = 1; } 80*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteIS, [M1UnitALU]> { let Latency = 1; } 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Worker// Move instructions. 83*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteImm, [M1UnitALU]> { let Latency = 1; } 84*9880d681SAndroid Build Coastguard Worker 85*9880d681SAndroid Build Coastguard Worker// Divide and multiply instructions. 86*9880d681SAndroid Build Coastguard Worker// TODO: Division blocks the divider inside C. 87*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteID32, [M1UnitC]> { let Latency = 13; } 88*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteID64, [M1UnitC]> { let Latency = 21; } 89*9880d681SAndroid Build Coastguard Worker// TODO: Long multiplication take 5 cycles and also the ALU. 90*9880d681SAndroid Build Coastguard Worker// TODO: Multiplication with accumulation can be advanced. 91*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteIM32, [M1UnitC]> { let Latency = 3; } 92*9880d681SAndroid Build Coastguard Worker// TODO: 64-bit multiplication has a throughput of 1/2. 93*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteIM64, [M1UnitC]> { let Latency = 4; } 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Worker// Miscellaneous instructions. 96*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteExtr, [M1UnitALU, 97*9880d681SAndroid Build Coastguard Worker M1UnitALU]> { let Latency = 2; } 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Worker// TODO: The latency for the post or pre register is 1 cycle. 100*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteAdr, []> { let Latency = 0; } 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Worker// Load instructions. 103*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteLD, [M1UnitL]> { let Latency = 4; } 104*9880d681SAndroid Build Coastguard Worker// TODO: Extended address requires also the ALU. 105*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteLDIdx, [M1UnitL]> { let Latency = 5; } 106*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteLDHi, [M1UnitALU]> { let Latency = 4; } 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Worker// Store instructions. 109*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteST, [M1UnitS]> { let Latency = 1; } 110*9880d681SAndroid Build Coastguard Worker// TODO: Extended address requires also the ALU. 111*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteSTIdx, [M1UnitS]> { let Latency = 1; } 112*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteSTP, [M1UnitS]> { let Latency = 1; } 113*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteSTX, [M1UnitS]> { let Latency = 1; } 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard Worker// FP data instructions. 116*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteF, [M1UnitFADD]> { let Latency = 3; } 117*9880d681SAndroid Build Coastguard Worker// TODO: FCCMP is much different. 118*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFCmp, [M1UnitNMISC]> { let Latency = 4; } 119*9880d681SAndroid Build Coastguard Worker// TODO: DP takes longer. 120*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFDiv, [M1UnitFVAR]> { let Latency = 15; } 121*9880d681SAndroid Build Coastguard Worker// TODO: MACC takes longer. 122*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFMul, [M1UnitFMAC]> { let Latency = 4; } 123*9880d681SAndroid Build Coastguard Worker 124*9880d681SAndroid Build Coastguard Worker// FP miscellaneous instructions. 125*9880d681SAndroid Build Coastguard Worker// TODO: Conversion between register files is much different. 126*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFCvt, [M1UnitFCVT]> { let Latency = 3; } 127*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFImm, [M1UnitNALU]> { let Latency = 1; } 128*9880d681SAndroid Build Coastguard Worker// TODO: Copy from FPR to GPR is much different. 129*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFCopy, [M1UnitS]> { let Latency = 4; } 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Worker// FP load instructions. 132*9880d681SAndroid Build Coastguard Worker// TODO: ASIMD loads are much different. 133*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteVLD, [M1UnitL]> { let Latency = 5; } 134*9880d681SAndroid Build Coastguard Worker 135*9880d681SAndroid Build Coastguard Worker// FP store instructions. 136*9880d681SAndroid Build Coastguard Worker// TODO: ASIMD stores are much different. 137*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteVST, [M1UnitS, M1UnitFST]> { let Latency = 1; } 138*9880d681SAndroid Build Coastguard Worker 139*9880d681SAndroid Build Coastguard Worker// ASIMD FP instructions. 140*9880d681SAndroid Build Coastguard Worker// TODO: Other operations are much different. 141*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteV, [M1UnitFADD]> { let Latency = 3; } 142*9880d681SAndroid Build Coastguard Worker 143*9880d681SAndroid Build Coastguard Worker// Other miscellaneous instructions. 144*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteAtomic, []> { let Unsupported = 1; } 145*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteBarrier, []> { let Latency = 1; } 146*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteHint, []> { let Latency = 1; } 147*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteSys, []> { let Latency = 1; } 148*9880d681SAndroid Build Coastguard Worker 149*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 150*9880d681SAndroid Build Coastguard Worker// Generic fast forwarding. 151*9880d681SAndroid Build Coastguard Worker 152*9880d681SAndroid Build Coastguard Worker// TODO: Add FP register forwarding rules. 153*9880d681SAndroid Build Coastguard Worker 154*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadI, 0>; 155*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadISReg, 0>; 156*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadIEReg, 0>; 157*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadIM, 0>; 158*9880d681SAndroid Build Coastguard Worker// Integer multiply-accumulate. 159*9880d681SAndroid Build Coastguard Worker// TODO: The forwarding for WriteIM64 saves actually 3 cycles. 160*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadIMA, 2, [WriteIM32, WriteIM64]>; 161*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadID, 0>; 162*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadExtrHi, 0>; 163*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadAdrBase, 0>; 164*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadVLD, 0>; 165*9880d681SAndroid Build Coastguard Worker 166*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 167*9880d681SAndroid Build Coastguard Worker// Finer scheduling model for the Exynos-M1. 168*9880d681SAndroid Build Coastguard Worker 169*9880d681SAndroid Build Coastguard Workerdef M1WriteNEONA : SchedWriteRes<[M1UnitNALU, 170*9880d681SAndroid Build Coastguard Worker M1UnitNALU, 171*9880d681SAndroid Build Coastguard Worker M1UnitFADD]> { let Latency = 9; } 172*9880d681SAndroid Build Coastguard Workerdef M1WriteNEONB : SchedWriteRes<[M1UnitNALU, 173*9880d681SAndroid Build Coastguard Worker M1UnitFST]> { let Latency = 5; } 174*9880d681SAndroid Build Coastguard Workerdef M1WriteNEONC : SchedWriteRes<[M1UnitNALU, 175*9880d681SAndroid Build Coastguard Worker M1UnitFST]> { let Latency = 6; } 176*9880d681SAndroid Build Coastguard Workerdef M1WriteNEOND : SchedWriteRes<[M1UnitNALU, 177*9880d681SAndroid Build Coastguard Worker M1UnitFST, 178*9880d681SAndroid Build Coastguard Worker M1UnitL]> { let Latency = 10; } 179*9880d681SAndroid Build Coastguard Workerdef M1WriteNEONE : SchedWriteRes<[M1UnitFCVT, 180*9880d681SAndroid Build Coastguard Worker M1UnitFST]> { let Latency = 8; } 181*9880d681SAndroid Build Coastguard Workerdef M1WriteNEONF : SchedWriteRes<[M1UnitFCVT, 182*9880d681SAndroid Build Coastguard Worker M1UnitFST, 183*9880d681SAndroid Build Coastguard Worker M1UnitL]> { let Latency = 13; } 184*9880d681SAndroid Build Coastguard Workerdef M1WriteNEONG : SchedWriteRes<[M1UnitNMISC, 185*9880d681SAndroid Build Coastguard Worker M1UnitFST]> { let Latency = 6; } 186*9880d681SAndroid Build Coastguard Workerdef M1WriteNEONH : SchedWriteRes<[M1UnitNALU, 187*9880d681SAndroid Build Coastguard Worker M1UnitFST]> { let Latency = 3; } 188*9880d681SAndroid Build Coastguard Workerdef M1WriteNEONI : SchedWriteRes<[M1UnitFST, 189*9880d681SAndroid Build Coastguard Worker M1UnitL]> { let Latency = 9; } 190*9880d681SAndroid Build Coastguard Workerdef M1WriteNEONJ : SchedWriteRes<[M1UnitNMISC, 191*9880d681SAndroid Build Coastguard Worker M1UnitFMAC]> { let Latency = 6; } 192*9880d681SAndroid Build Coastguard Workerdef M1WriteNEONK : SchedWriteRes<[M1UnitNMISC, 193*9880d681SAndroid Build Coastguard Worker M1UnitFMAC]> { let Latency = 7; } 194*9880d681SAndroid Build Coastguard Workerdef M1WriteALU1 : SchedWriteRes<[M1UnitALU]> { let Latency = 1; } 195*9880d681SAndroid Build Coastguard Workerdef M1WriteB : SchedWriteRes<[M1UnitB]> { let Latency = 1; } 196*9880d681SAndroid Build Coastguard Worker// FIXME: This is the worst case, conditional branch and link. 197*9880d681SAndroid Build Coastguard Workerdef M1WriteBL : SchedWriteRes<[M1UnitB, 198*9880d681SAndroid Build Coastguard Worker M1UnitALU]> { let Latency = 1; } 199*9880d681SAndroid Build Coastguard Worker// FIXME: This is the worst case, when using LR. 200*9880d681SAndroid Build Coastguard Workerdef M1WriteBLR : SchedWriteRes<[M1UnitB, 201*9880d681SAndroid Build Coastguard Worker M1UnitALU, 202*9880d681SAndroid Build Coastguard Worker M1UnitALU]> { let Latency = 2; } 203*9880d681SAndroid Build Coastguard Workerdef M1WriteC1 : SchedWriteRes<[M1UnitC]> { let Latency = 1; } 204*9880d681SAndroid Build Coastguard Workerdef M1WriteC2 : SchedWriteRes<[M1UnitC]> { let Latency = 2; } 205*9880d681SAndroid Build Coastguard Workerdef M1WriteFADD3 : SchedWriteRes<[M1UnitFADD]> { let Latency = 3; } 206*9880d681SAndroid Build Coastguard Workerdef M1WriteFCVT3 : SchedWriteRes<[M1UnitFCVT]> { let Latency = 3; } 207*9880d681SAndroid Build Coastguard Workerdef M1WriteFCVT4 : SchedWriteRes<[M1UnitFCVT]> { let Latency = 4; } 208*9880d681SAndroid Build Coastguard Workerdef M1WriteFMAC4 : SchedWriteRes<[M1UnitFMAC]> { let Latency = 4; } 209*9880d681SAndroid Build Coastguard Workerdef M1WriteFMAC5 : SchedWriteRes<[M1UnitFMAC]> { let Latency = 5; } 210*9880d681SAndroid Build Coastguard Workerdef M1WriteFVAR15 : SchedWriteRes<[M1UnitFVAR]> { let Latency = 15; } 211*9880d681SAndroid Build Coastguard Workerdef M1WriteFVAR23 : SchedWriteRes<[M1UnitFVAR]> { let Latency = 23; } 212*9880d681SAndroid Build Coastguard Workerdef M1WriteNALU1 : SchedWriteRes<[M1UnitNALU]> { let Latency = 1; } 213*9880d681SAndroid Build Coastguard Workerdef M1WriteNALU2 : SchedWriteRes<[M1UnitNALU]> { let Latency = 2; } 214*9880d681SAndroid Build Coastguard Workerdef M1WriteNAL11 : SchedWriteRes<[M1UnitNAL1]> { let Latency = 1; } 215*9880d681SAndroid Build Coastguard Workerdef M1WriteNAL12 : SchedWriteRes<[M1UnitNAL1]> { let Latency = 2; } 216*9880d681SAndroid Build Coastguard Workerdef M1WriteNAL13 : SchedWriteRes<[M1UnitNAL1]> { let Latency = 3; } 217*9880d681SAndroid Build Coastguard Workerdef M1WriteNCRYPT1 : SchedWriteRes<[M1UnitNCRYPT]> { let Latency = 1; } 218*9880d681SAndroid Build Coastguard Workerdef M1WriteNCRYPT5 : SchedWriteRes<[M1UnitNCRYPT]> { let Latency = 5; } 219*9880d681SAndroid Build Coastguard Workerdef M1WriteNMISC1 : SchedWriteRes<[M1UnitNMISC]> { let Latency = 1; } 220*9880d681SAndroid Build Coastguard Workerdef M1WriteNMISC2 : SchedWriteRes<[M1UnitNMISC]> { let Latency = 2; } 221*9880d681SAndroid Build Coastguard Workerdef M1WriteNMISC3 : SchedWriteRes<[M1UnitNMISC]> { let Latency = 3; } 222*9880d681SAndroid Build Coastguard Workerdef M1WriteNMISC4 : SchedWriteRes<[M1UnitNMISC]> { let Latency = 4; } 223*9880d681SAndroid Build Coastguard Workerdef M1WriteS4 : SchedWriteRes<[M1UnitS]> { let Latency = 4; } 224*9880d681SAndroid Build Coastguard Workerdef M1WriteTB : SchedWriteRes<[M1UnitC, 225*9880d681SAndroid Build Coastguard Worker M1UnitALU]> { let Latency = 2; } 226*9880d681SAndroid Build Coastguard Worker 227*9880d681SAndroid Build Coastguard Worker// Branch instructions 228*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteB ], (instrs Bcc)>; 229*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteBL], (instrs BL)>; 230*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteBLR], (instrs BLR)>; 231*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteC1], (instregex "^CBN?Z[WX]")>; 232*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteTB], (instregex "^TBN?Z[WX]")>; 233*9880d681SAndroid Build Coastguard Worker 234*9880d681SAndroid Build Coastguard Worker// Arithmetic and logical integer instructions. 235*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteALU1], (instrs COPY)>; 236*9880d681SAndroid Build Coastguard Worker 237*9880d681SAndroid Build Coastguard Worker// Divide and multiply instructions. 238*9880d681SAndroid Build Coastguard Worker 239*9880d681SAndroid Build Coastguard Worker// Miscellaneous instructions. 240*9880d681SAndroid Build Coastguard Worker 241*9880d681SAndroid Build Coastguard Worker// Load instructions. 242*9880d681SAndroid Build Coastguard Worker 243*9880d681SAndroid Build Coastguard Worker// Store instructions. 244*9880d681SAndroid Build Coastguard Worker 245*9880d681SAndroid Build Coastguard Worker// FP data instructions. 246*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNALU1], (instregex "^F(ABS|NEG)[DS]r")>; 247*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteFADD3], (instregex "^F(ADD|SUB)[DS]rr")>; 248*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNEONG], (instregex "^FCCMPE?[DS]rr")>; 249*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNMISC4], (instregex "^FCMPE?[DS]r")>; 250*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteFVAR15], (instrs FDIVSrr)>; 251*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteFVAR23], (instrs FDIVDrr)>; 252*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNMISC2], (instregex "^F(MAX|MIN).+rr")>; 253*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteFMAC4], (instregex "^FN?MUL[DS]rr")>; 254*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteFMAC5], (instregex "^FN?M(ADD|SUB)[DS]rrr")>; 255*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteFCVT3], (instregex "^FRINT.+r")>; 256*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNEONH], (instregex "^FCSEL[DS]rrr")>; 257*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteFVAR15], (instrs FSQRTSr)>; 258*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteFVAR23], (instrs FSQRTDr)>; 259*9880d681SAndroid Build Coastguard Worker 260*9880d681SAndroid Build Coastguard Worker// FP miscellaneous instructions. 261*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteFCVT3], (instregex "^FCVT[DS][DS]r")>; 262*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNEONF], (instregex "^[FSU]CVT[AMNPZ][SU](_Int)?[SU]?[XW]?[DS]?[rds]i?")>; 263*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNEONE], (instregex "^[SU]CVTF[SU]")>; 264*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNALU1], (instregex "^FMOV[DS][ir]")>; 265*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteS4], (instregex "^FMOV[WX][DS](High)?r")>; 266*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNEONI], (instregex "^FMOV[DS][WX](High)?r")>; 267*9880d681SAndroid Build Coastguard Worker 268*9880d681SAndroid Build Coastguard Worker// FP load instructions. 269*9880d681SAndroid Build Coastguard Worker 270*9880d681SAndroid Build Coastguard Worker// FP store instructions. 271*9880d681SAndroid Build Coastguard Worker 272*9880d681SAndroid Build Coastguard Worker// ASIMD instructions. 273*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNMISC3], (instregex "^[SU]ABAL?v")>; 274*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNMISC1], (instregex "^[SU]ABDL?v")>; 275*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNMISC1], (instregex "^(SQ)?ABSv")>; 276*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNMISC1], (instregex "^SQNEGv")>; 277*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNALU1], (instregex "^(ADD|NEG|SUB)v")>; 278*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNMISC3], (instregex "^[SU]?H(ADD|SUB)v")>; 279*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNMISC3], (instregex "^[SU]?AD[AD](L|LP|P|W)V?2?v")>; 280*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNMISC3], (instregex "^[SU]?SUB[LW]2?v")>; 281*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNMISC3], (instregex "^R?(ADD|SUB)HN?2?v")>; 282*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNMISC3], (instregex "^[SU]+Q(ADD|SUB)v")>; 283*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNMISC3], (instregex "^[SU]RHADDv")>; 284*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNMISC1], (instregex "^CM(EQ|GE|GT|HI|HS|LE|LT)v")>; 285*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNALU1], (instregex "^CMTSTv")>; 286*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNALU1], (instregex "^(AND|BIC|EOR|MVNI|NOT|ORN|ORR)v")>; 287*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNMISC1], (instregex "^[SU](MIN|MAX)v")>; 288*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNMISC2], (instregex "^[SU](MIN|MAX)Pv")>; 289*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNMISC3], (instregex "^[SU](MIN|MAX)Vv")>; 290*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNMISC4], (instregex "^(MUL|SQR?DMULH)v")>; 291*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNMISC4], (instregex "^ML[AS]v")>; 292*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNMISC4], (instregex "^(S|U|SQD|SQRD)ML[AS][HL]v")>; 293*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNMISC4], (instregex "^(S|U|SQD)MULLv")>; 294*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNAL13], (instregex "^(S|SR|U|UR)SRAv")>; 295*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNALU1], (instregex "^[SU]?SH(L|LL|R)2?v")>; 296*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNALU1], (instregex "^S[LR]Iv")>; 297*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNAL13], (instregex "^[SU]?(Q|QR|R)?SHR(N|U|UN)?2?v")>; 298*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNAL13], (instregex "^[SU](Q|QR|R)SHLU?v")>; 299*9880d681SAndroid Build Coastguard Worker 300*9880d681SAndroid Build Coastguard Worker// ASIMD FP instructions. 301*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNALU1], (instregex "^F(ABS|NEG)v")>; 302*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNMISC3], (instregex "^F(ABD|ADD|SUB)v")>; 303*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNEONA], (instregex "^FADDP")>; 304*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNMISC1], (instregex "^F(AC|CM)(EQ|GE|GT|LE|LT)v[^1]")>; 305*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteFCVT3], (instregex "^[FVSU]CVTX?[AFLMNPZ][SU]?(_Int)?v")>; 306*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteFVAR15], (instregex "FDIVv.f32")>; 307*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteFVAR23], (instregex "FDIVv2f64")>; 308*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteFVAR15], (instregex "FSQRTv.f32")>; 309*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteFVAR23], (instregex "FSQRTv2f64")>; 310*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNMISC1], (instregex "^F(MAX|MIN)(NM)?V?v")>; 311*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNMISC2], (instregex "^F(MAX|MIN)(NM)?Pv")>; 312*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNEONJ], (instregex "^FMULX?v.i")>; 313*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteFMAC4], (instregex "^FMULX?v.f")>; 314*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNEONK], (instregex "^FML[AS]v.i")>; 315*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteFMAC5], (instregex "^FML[AS]v.f")>; 316*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteFCVT3], (instregex "^FRINT[AIMNPXZ]v")>; 317*9880d681SAndroid Build Coastguard Worker 318*9880d681SAndroid Build Coastguard Worker// ASIMD miscellaneous instructions. 319*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNALU1], (instregex "^RBITv")>; 320*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNAL11], (instregex "^(BIF|BIT|BSL)v")>; 321*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNALU1], (instregex "^CPY")>; 322*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNEONB], (instregex "^DUPv.+gpr")>; 323*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNALU1], (instregex "^DUPv.+lane")>; 324*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNAL13], (instregex "^[SU]?Q?XTU?Nv")>; 325*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNEONC], (instregex "^INSv.+gpr")>; 326*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteFCVT4], (instregex "^[FU](RECP|RSQRT)Ev")>; 327*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNMISC1], (instregex "^[FU](RECP|RSQRT)Xv")>; 328*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteFMAC5], (instregex "^F(RECP|RSQRT)Sv")>; 329*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNALU1], (instregex "^REV(16|32|64)v")>; 330*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNAL11], (instregex "^TB[LX]v8i8One")>; 331*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteSequence<[M1WriteNAL11], 2>], 332*9880d681SAndroid Build Coastguard Worker (instregex "^TB[LX]v8i8Two")>; 333*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteSequence<[M1WriteNAL11], 3>], 334*9880d681SAndroid Build Coastguard Worker (instregex "^TB[LX]v8i8Three")>; 335*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteSequence<[M1WriteNAL11], 4>], 336*9880d681SAndroid Build Coastguard Worker (instregex "^TB[LX]v8i8Four")>; 337*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNAL12], (instregex "^TB[LX]v16i8One")>; 338*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteSequence<[M1WriteNAL12], 2>], 339*9880d681SAndroid Build Coastguard Worker (instregex "^TB[LX]v16i8Two")>; 340*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteSequence<[M1WriteNAL12], 3>], 341*9880d681SAndroid Build Coastguard Worker (instregex "^TB[LX]v16i8Three")>; 342*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteSequence<[M1WriteNAL12], 4>], 343*9880d681SAndroid Build Coastguard Worker (instregex "^TB[LX]v16i8Four")>; 344*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNEOND], (instregex "^[SU]MOVv")>; 345*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNALU1], (instregex "^INSv.+lane")>; 346*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNALU1], (instregex "^(TRN|UZP)[12](v8i8|v4i16|v2i32)")>; 347*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNALU2], (instregex "^(TRN|UZP)[12](v16i8|v8i16|v4i32|v2i64)")>; 348*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNALU1], (instregex "^ZIP[12]v")>; 349*9880d681SAndroid Build Coastguard Worker 350*9880d681SAndroid Build Coastguard Worker// ASIMD load instructions. 351*9880d681SAndroid Build Coastguard Worker 352*9880d681SAndroid Build Coastguard Worker// ASIMD store instructions. 353*9880d681SAndroid Build Coastguard Worker 354*9880d681SAndroid Build Coastguard Worker// Cryptography instructions. 355*9880d681SAndroid Build Coastguard Workerdef M1WriteAES : SchedWriteRes<[M1UnitNCRYPT]> { let Latency = 1; } 356*9880d681SAndroid Build Coastguard Workerdef M1ReadAES : SchedReadAdvance<1, [M1WriteAES]>; 357*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteAES, M1ReadAES], (instregex "^AES")>; 358*9880d681SAndroid Build Coastguard Worker 359*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNCRYPT1], (instregex "^PMUL")>; 360*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNCRYPT1], (instregex "^SHA1(H|SU)")>; 361*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNCRYPT5], (instregex "^SHA1[CMP]")>; 362*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNCRYPT1], (instregex "^SHA256SU0")>; 363*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteNCRYPT5], (instregex "^SHA256(H|SU1)")>; 364*9880d681SAndroid Build Coastguard Worker 365*9880d681SAndroid Build Coastguard Worker// CRC instructions. 366*9880d681SAndroid Build Coastguard Workerdef : InstRW<[M1WriteC2], (instregex "^CRC32")>; 367*9880d681SAndroid Build Coastguard Worker 368*9880d681SAndroid Build Coastguard Worker} // SchedModel = ExynosM1Model 369