1*9880d681SAndroid Build Coastguard Worker//=- X86ScheduleBtVer2.td - X86 BtVer2 (Jaguar) Scheduling ---*- 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 AMD btver2 (Jaguar) to support 11*9880d681SAndroid Build Coastguard Worker// instruction scheduling and other instruction cost heuristics. Based off AMD Software 12*9880d681SAndroid Build Coastguard Worker// Optimization Guide for AMD Family 16h Processors & Instruction Latency appendix. 13*9880d681SAndroid Build Coastguard Worker// 14*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Workerdef BtVer2Model : SchedMachineModel { 17*9880d681SAndroid Build Coastguard Worker // All x86 instructions are modeled as a single micro-op, and btver2 can 18*9880d681SAndroid Build Coastguard Worker // decode 2 instructions per cycle. 19*9880d681SAndroid Build Coastguard Worker let IssueWidth = 2; 20*9880d681SAndroid Build Coastguard Worker let MicroOpBufferSize = 64; // Retire Control Unit 21*9880d681SAndroid Build Coastguard Worker let LoadLatency = 5; // FPU latency (worse case cf Integer 3 cycle latency) 22*9880d681SAndroid Build Coastguard Worker let HighLatency = 25; 23*9880d681SAndroid Build Coastguard Worker let MispredictPenalty = 14; // Minimum branch misdirection penalty 24*9880d681SAndroid Build Coastguard Worker let PostRAScheduler = 1; 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Worker // FIXME: SSE4/AVX is unimplemented. This flag is set to allow 27*9880d681SAndroid Build Coastguard Worker // the scheduler to assign a default model to unrecognized opcodes. 28*9880d681SAndroid Build Coastguard Worker let CompleteModel = 0; 29*9880d681SAndroid Build Coastguard Worker} 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Workerlet SchedModel = BtVer2Model in { 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Worker// Jaguar can issue up to 6 micro-ops in one cycle 34*9880d681SAndroid Build Coastguard Workerdef JALU0 : ProcResource<1>; // Integer Pipe0: integer ALU0 (also handle FP->INT jam) 35*9880d681SAndroid Build Coastguard Workerdef JALU1 : ProcResource<1>; // Integer Pipe1: integer ALU1/MUL/DIV 36*9880d681SAndroid Build Coastguard Workerdef JLAGU : ProcResource<1>; // Integer Pipe2: LAGU 37*9880d681SAndroid Build Coastguard Workerdef JSAGU : ProcResource<1>; // Integer Pipe3: SAGU (also handles 3-operand LEA) 38*9880d681SAndroid Build Coastguard Workerdef JFPU0 : ProcResource<1>; // Vector/FPU Pipe0: VALU0/VIMUL/FPA 39*9880d681SAndroid Build Coastguard Workerdef JFPU1 : ProcResource<1>; // Vector/FPU Pipe1: VALU1/STC/FPM 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Worker// Any pipe - FIXME we need this until we can discriminate between int/fpu load/store/moves properly 42*9880d681SAndroid Build Coastguard Workerdef JAny : ProcResGroup<[JALU0, JALU1, JLAGU, JSAGU, JFPU0, JFPU1]>; 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker// Integer Pipe Scheduler 45*9880d681SAndroid Build Coastguard Workerdef JALU01 : ProcResGroup<[JALU0, JALU1]> { 46*9880d681SAndroid Build Coastguard Worker let BufferSize=20; 47*9880d681SAndroid Build Coastguard Worker} 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Worker// AGU Pipe Scheduler 50*9880d681SAndroid Build Coastguard Workerdef JLSAGU : ProcResGroup<[JLAGU, JSAGU]> { 51*9880d681SAndroid Build Coastguard Worker let BufferSize=12; 52*9880d681SAndroid Build Coastguard Worker} 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Worker// Fpu Pipe Scheduler 55*9880d681SAndroid Build Coastguard Workerdef JFPU01 : ProcResGroup<[JFPU0, JFPU1]> { 56*9880d681SAndroid Build Coastguard Worker let BufferSize=18; 57*9880d681SAndroid Build Coastguard Worker} 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Workerdef JDiv : ProcResource<1>; // integer division 60*9880d681SAndroid Build Coastguard Workerdef JMul : ProcResource<1>; // integer multiplication 61*9880d681SAndroid Build Coastguard Workerdef JVALU0 : ProcResource<1>; // vector integer 62*9880d681SAndroid Build Coastguard Workerdef JVALU1 : ProcResource<1>; // vector integer 63*9880d681SAndroid Build Coastguard Workerdef JVIMUL : ProcResource<1>; // vector integer multiplication 64*9880d681SAndroid Build Coastguard Workerdef JSTC : ProcResource<1>; // vector store/convert 65*9880d681SAndroid Build Coastguard Workerdef JFPM : ProcResource<1>; // FP multiplication 66*9880d681SAndroid Build Coastguard Workerdef JFPA : ProcResource<1>; // FP addition 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Worker// Integer loads are 3 cycles, so ReadAfterLd registers needn't be available until 3 69*9880d681SAndroid Build Coastguard Worker// cycles after the memory operand. 70*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadAfterLd, 3>; 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Worker// Many SchedWrites are defined in pairs with and without a folded load. 73*9880d681SAndroid Build Coastguard Worker// Instructions with folded loads are usually micro-fused, so they only appear 74*9880d681SAndroid Build Coastguard Worker// as two micro-ops when dispatched by the schedulers. 75*9880d681SAndroid Build Coastguard Worker// This multiclass defines the resource usage for variants with and without 76*9880d681SAndroid Build Coastguard Worker// folded loads. 77*9880d681SAndroid Build Coastguard Workermulticlass JWriteResIntPair<X86FoldableSchedWrite SchedRW, 78*9880d681SAndroid Build Coastguard Worker ProcResourceKind ExePort, 79*9880d681SAndroid Build Coastguard Worker int Lat> { 80*9880d681SAndroid Build Coastguard Worker // Register variant is using a single cycle on ExePort. 81*9880d681SAndroid Build Coastguard Worker def : WriteRes<SchedRW, [ExePort]> { let Latency = Lat; } 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Worker // Memory variant also uses a cycle on JLAGU and adds 3 cycles to the 84*9880d681SAndroid Build Coastguard Worker // latency. 85*9880d681SAndroid Build Coastguard Worker def : WriteRes<SchedRW.Folded, [JLAGU, ExePort]> { 86*9880d681SAndroid Build Coastguard Worker let Latency = !add(Lat, 3); 87*9880d681SAndroid Build Coastguard Worker } 88*9880d681SAndroid Build Coastguard Worker} 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Workermulticlass JWriteResFpuPair<X86FoldableSchedWrite SchedRW, 91*9880d681SAndroid Build Coastguard Worker ProcResourceKind ExePort, 92*9880d681SAndroid Build Coastguard Worker int Lat> { 93*9880d681SAndroid Build Coastguard Worker // Register variant is using a single cycle on ExePort. 94*9880d681SAndroid Build Coastguard Worker def : WriteRes<SchedRW, [ExePort]> { let Latency = Lat; } 95*9880d681SAndroid Build Coastguard Worker 96*9880d681SAndroid Build Coastguard Worker // Memory variant also uses a cycle on JLAGU and adds 5 cycles to the 97*9880d681SAndroid Build Coastguard Worker // latency. 98*9880d681SAndroid Build Coastguard Worker def : WriteRes<SchedRW.Folded, [JLAGU, ExePort]> { 99*9880d681SAndroid Build Coastguard Worker let Latency = !add(Lat, 5); 100*9880d681SAndroid Build Coastguard Worker } 101*9880d681SAndroid Build Coastguard Worker} 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Worker// A folded store needs a cycle on the SAGU for the store data. 104*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteRMW, [JSAGU]>; 105*9880d681SAndroid Build Coastguard Worker 106*9880d681SAndroid Build Coastguard Worker//////////////////////////////////////////////////////////////////////////////// 107*9880d681SAndroid Build Coastguard Worker// Arithmetic. 108*9880d681SAndroid Build Coastguard Worker//////////////////////////////////////////////////////////////////////////////// 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Workerdefm : JWriteResIntPair<WriteALU, JALU01, 1>; 111*9880d681SAndroid Build Coastguard Workerdefm : JWriteResIntPair<WriteIMul, JALU1, 3>; 112*9880d681SAndroid Build Coastguard Worker 113*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteIMulH, [JALU1]> { 114*9880d681SAndroid Build Coastguard Worker let Latency = 6; 115*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [4]; 116*9880d681SAndroid Build Coastguard Worker} 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Worker// FIXME 8/16 bit divisions 119*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteIDiv, [JALU1, JDiv]> { 120*9880d681SAndroid Build Coastguard Worker let Latency = 25; 121*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 25]; 122*9880d681SAndroid Build Coastguard Worker} 123*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteIDivLd, [JALU1, JLAGU, JDiv]> { 124*9880d681SAndroid Build Coastguard Worker let Latency = 41; 125*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1, 25]; 126*9880d681SAndroid Build Coastguard Worker} 127*9880d681SAndroid Build Coastguard Worker 128*9880d681SAndroid Build Coastguard Worker// This is for simple LEAs with one or two input operands. 129*9880d681SAndroid Build Coastguard Worker// FIXME: SAGU 3-operand LEA 130*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteLEA, [JALU01]>; 131*9880d681SAndroid Build Coastguard Worker 132*9880d681SAndroid Build Coastguard Worker//////////////////////////////////////////////////////////////////////////////// 133*9880d681SAndroid Build Coastguard Worker// Integer shifts and rotates. 134*9880d681SAndroid Build Coastguard Worker//////////////////////////////////////////////////////////////////////////////// 135*9880d681SAndroid Build Coastguard Worker 136*9880d681SAndroid Build Coastguard Workerdefm : JWriteResIntPair<WriteShift, JALU01, 1>; 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard Worker//////////////////////////////////////////////////////////////////////////////// 139*9880d681SAndroid Build Coastguard Worker// Loads, stores, and moves, not folded with other operations. 140*9880d681SAndroid Build Coastguard Worker// FIXME: Split x86 and SSE load/store/moves 141*9880d681SAndroid Build Coastguard Worker//////////////////////////////////////////////////////////////////////////////// 142*9880d681SAndroid Build Coastguard Worker 143*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteLoad, [JLAGU]> { let Latency = 5; } 144*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteStore, [JSAGU]>; 145*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteMove, [JAny]>; 146*9880d681SAndroid Build Coastguard Worker 147*9880d681SAndroid Build Coastguard Worker//////////////////////////////////////////////////////////////////////////////// 148*9880d681SAndroid Build Coastguard Worker// Idioms that clear a register, like xorps %xmm0, %xmm0. 149*9880d681SAndroid Build Coastguard Worker// These can often bypass execution ports completely. 150*9880d681SAndroid Build Coastguard Worker//////////////////////////////////////////////////////////////////////////////// 151*9880d681SAndroid Build Coastguard Worker 152*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteZero, []>; 153*9880d681SAndroid Build Coastguard Worker 154*9880d681SAndroid Build Coastguard Worker//////////////////////////////////////////////////////////////////////////////// 155*9880d681SAndroid Build Coastguard Worker// Branches don't produce values, so they have no latency, but they still 156*9880d681SAndroid Build Coastguard Worker// consume resources. Indirect branches can fold loads. 157*9880d681SAndroid Build Coastguard Worker//////////////////////////////////////////////////////////////////////////////// 158*9880d681SAndroid Build Coastguard Worker 159*9880d681SAndroid Build Coastguard Workerdefm : JWriteResIntPair<WriteJump, JALU01, 1>; 160*9880d681SAndroid Build Coastguard Worker 161*9880d681SAndroid Build Coastguard Worker//////////////////////////////////////////////////////////////////////////////// 162*9880d681SAndroid Build Coastguard Worker// Floating point. This covers both scalar and vector operations. 163*9880d681SAndroid Build Coastguard Worker// FIXME: should we bother splitting JFPU pipe + unit stages for fast instructions? 164*9880d681SAndroid Build Coastguard Worker// FIXME: Double precision latencies 165*9880d681SAndroid Build Coastguard Worker// FIXME: SS vs PS latencies 166*9880d681SAndroid Build Coastguard Worker// FIXME: ymm latencies 167*9880d681SAndroid Build Coastguard Worker//////////////////////////////////////////////////////////////////////////////// 168*9880d681SAndroid Build Coastguard Worker 169*9880d681SAndroid Build Coastguard Workerdefm : JWriteResFpuPair<WriteFAdd, JFPU0, 3>; 170*9880d681SAndroid Build Coastguard Workerdefm : JWriteResFpuPair<WriteFMul, JFPU1, 2>; 171*9880d681SAndroid Build Coastguard Workerdefm : JWriteResFpuPair<WriteFRcp, JFPU1, 2>; 172*9880d681SAndroid Build Coastguard Workerdefm : JWriteResFpuPair<WriteFRsqrt, JFPU1, 2>; 173*9880d681SAndroid Build Coastguard Workerdefm : JWriteResFpuPair<WriteFShuffle, JFPU01, 1>; 174*9880d681SAndroid Build Coastguard Workerdefm : JWriteResFpuPair<WriteFBlend, JFPU01, 1>; 175*9880d681SAndroid Build Coastguard Workerdefm : JWriteResFpuPair<WriteFShuffle256, JFPU01, 1>; 176*9880d681SAndroid Build Coastguard Worker 177*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFSqrt, [JFPU1, JLAGU, JFPM]> { 178*9880d681SAndroid Build Coastguard Worker let Latency = 21; 179*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1, 21]; 180*9880d681SAndroid Build Coastguard Worker} 181*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFSqrtLd, [JFPU1, JLAGU, JFPM]> { 182*9880d681SAndroid Build Coastguard Worker let Latency = 26; 183*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1, 21]; 184*9880d681SAndroid Build Coastguard Worker} 185*9880d681SAndroid Build Coastguard Worker 186*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFDiv, [JFPU1, JLAGU, JFPM]> { 187*9880d681SAndroid Build Coastguard Worker let Latency = 19; 188*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1, 19]; 189*9880d681SAndroid Build Coastguard Worker} 190*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFDivLd, [JFPU1, JLAGU, JFPM]> { 191*9880d681SAndroid Build Coastguard Worker let Latency = 24; 192*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1, 19]; 193*9880d681SAndroid Build Coastguard Worker} 194*9880d681SAndroid Build Coastguard Worker 195*9880d681SAndroid Build Coastguard Worker// FIXME: integer pipes 196*9880d681SAndroid Build Coastguard Workerdefm : JWriteResFpuPair<WriteCvtF2I, JFPU1, 3>; // Float -> Integer. 197*9880d681SAndroid Build Coastguard Workerdefm : JWriteResFpuPair<WriteCvtI2F, JFPU1, 3>; // Integer -> Float. 198*9880d681SAndroid Build Coastguard Workerdefm : JWriteResFpuPair<WriteCvtF2F, JFPU1, 3>; // Float -> Float size conversion. 199*9880d681SAndroid Build Coastguard Worker 200*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFVarBlend, [JFPU01]> { 201*9880d681SAndroid Build Coastguard Worker let Latency = 2; 202*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2]; 203*9880d681SAndroid Build Coastguard Worker} 204*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFVarBlendLd, [JLAGU, JFPU01]> { 205*9880d681SAndroid Build Coastguard Worker let Latency = 7; 206*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 2]; 207*9880d681SAndroid Build Coastguard Worker} 208*9880d681SAndroid Build Coastguard Worker 209*9880d681SAndroid Build Coastguard Worker// Vector integer operations. 210*9880d681SAndroid Build Coastguard Workerdefm : JWriteResFpuPair<WriteVecALU, JFPU01, 1>; 211*9880d681SAndroid Build Coastguard Workerdefm : JWriteResFpuPair<WriteVecShift, JFPU01, 1>; 212*9880d681SAndroid Build Coastguard Workerdefm : JWriteResFpuPair<WriteVecIMul, JFPU0, 2>; 213*9880d681SAndroid Build Coastguard Workerdefm : JWriteResFpuPair<WriteShuffle, JFPU01, 1>; 214*9880d681SAndroid Build Coastguard Workerdefm : JWriteResFpuPair<WriteBlend, JFPU01, 1>; 215*9880d681SAndroid Build Coastguard Workerdefm : JWriteResFpuPair<WriteVecLogic, JFPU01, 1>; 216*9880d681SAndroid Build Coastguard Workerdefm : JWriteResFpuPair<WriteShuffle256, JFPU01, 1>; 217*9880d681SAndroid Build Coastguard Worker 218*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteVarBlend, [JFPU01]> { 219*9880d681SAndroid Build Coastguard Worker let Latency = 2; 220*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2]; 221*9880d681SAndroid Build Coastguard Worker} 222*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteVarBlendLd, [JLAGU, JFPU01]> { 223*9880d681SAndroid Build Coastguard Worker let Latency = 7; 224*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 2]; 225*9880d681SAndroid Build Coastguard Worker} 226*9880d681SAndroid Build Coastguard Worker 227*9880d681SAndroid Build Coastguard Worker// FIXME: why do we need to define AVX2 resource on CPU that doesn't have AVX2? 228*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteVarVecShift, [JFPU01]> { 229*9880d681SAndroid Build Coastguard Worker let Latency = 1; 230*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1]; 231*9880d681SAndroid Build Coastguard Worker} 232*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteVarVecShiftLd, [JLAGU, JFPU01]> { 233*9880d681SAndroid Build Coastguard Worker let Latency = 6; 234*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1]; 235*9880d681SAndroid Build Coastguard Worker} 236*9880d681SAndroid Build Coastguard Worker 237*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteMPSAD, [JFPU0]> { 238*9880d681SAndroid Build Coastguard Worker let Latency = 3; 239*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2]; 240*9880d681SAndroid Build Coastguard Worker} 241*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteMPSADLd, [JLAGU, JFPU0]> { 242*9880d681SAndroid Build Coastguard Worker let Latency = 8; 243*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 2]; 244*9880d681SAndroid Build Coastguard Worker} 245*9880d681SAndroid Build Coastguard Worker 246*9880d681SAndroid Build Coastguard Worker//////////////////////////////////////////////////////////////////////////////// 247*9880d681SAndroid Build Coastguard Worker// String instructions. 248*9880d681SAndroid Build Coastguard Worker// Packed Compare Implicit Length Strings, Return Mask 249*9880d681SAndroid Build Coastguard Worker// FIXME: approximate latencies + pipe dependencies 250*9880d681SAndroid Build Coastguard Worker//////////////////////////////////////////////////////////////////////////////// 251*9880d681SAndroid Build Coastguard Worker 252*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WritePCmpIStrM, [JFPU01]> { 253*9880d681SAndroid Build Coastguard Worker let Latency = 7; 254*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2]; 255*9880d681SAndroid Build Coastguard Worker} 256*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WritePCmpIStrMLd, [JLAGU, JFPU01]> { 257*9880d681SAndroid Build Coastguard Worker let Latency = 12; 258*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 2]; 259*9880d681SAndroid Build Coastguard Worker} 260*9880d681SAndroid Build Coastguard Worker 261*9880d681SAndroid Build Coastguard Worker// Packed Compare Explicit Length Strings, Return Mask 262*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WritePCmpEStrM, [JFPU01]> { 263*9880d681SAndroid Build Coastguard Worker let Latency = 13; 264*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [5]; 265*9880d681SAndroid Build Coastguard Worker} 266*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WritePCmpEStrMLd, [JLAGU, JFPU01]> { 267*9880d681SAndroid Build Coastguard Worker let Latency = 18; 268*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 5]; 269*9880d681SAndroid Build Coastguard Worker} 270*9880d681SAndroid Build Coastguard Worker 271*9880d681SAndroid Build Coastguard Worker// Packed Compare Implicit Length Strings, Return Index 272*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WritePCmpIStrI, [JFPU01]> { 273*9880d681SAndroid Build Coastguard Worker let Latency = 6; 274*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2]; 275*9880d681SAndroid Build Coastguard Worker} 276*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WritePCmpIStrILd, [JLAGU, JFPU01]> { 277*9880d681SAndroid Build Coastguard Worker let Latency = 11; 278*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 2]; 279*9880d681SAndroid Build Coastguard Worker} 280*9880d681SAndroid Build Coastguard Worker 281*9880d681SAndroid Build Coastguard Worker// Packed Compare Explicit Length Strings, Return Index 282*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WritePCmpEStrI, [JFPU01]> { 283*9880d681SAndroid Build Coastguard Worker let Latency = 13; 284*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [5]; 285*9880d681SAndroid Build Coastguard Worker} 286*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WritePCmpEStrILd, [JLAGU, JFPU01]> { 287*9880d681SAndroid Build Coastguard Worker let Latency = 18; 288*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 5]; 289*9880d681SAndroid Build Coastguard Worker} 290*9880d681SAndroid Build Coastguard Worker 291*9880d681SAndroid Build Coastguard Worker//////////////////////////////////////////////////////////////////////////////// 292*9880d681SAndroid Build Coastguard Worker// AES Instructions. 293*9880d681SAndroid Build Coastguard Worker//////////////////////////////////////////////////////////////////////////////// 294*9880d681SAndroid Build Coastguard Worker 295*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteAESDecEnc, [JFPU01, JVIMUL]> { 296*9880d681SAndroid Build Coastguard Worker let Latency = 3; 297*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1]; 298*9880d681SAndroid Build Coastguard Worker} 299*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteAESDecEncLd, [JFPU01, JLAGU, JVIMUL]> { 300*9880d681SAndroid Build Coastguard Worker let Latency = 8; 301*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1, 1]; 302*9880d681SAndroid Build Coastguard Worker} 303*9880d681SAndroid Build Coastguard Worker 304*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteAESIMC, [JVIMUL]> { 305*9880d681SAndroid Build Coastguard Worker let Latency = 2; 306*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1]; 307*9880d681SAndroid Build Coastguard Worker} 308*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteAESIMCLd, [JLAGU, JVIMUL]> { 309*9880d681SAndroid Build Coastguard Worker let Latency = 7; 310*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1]; 311*9880d681SAndroid Build Coastguard Worker} 312*9880d681SAndroid Build Coastguard Worker 313*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteAESKeyGen, [JVIMUL]> { 314*9880d681SAndroid Build Coastguard Worker let Latency = 2; 315*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1]; 316*9880d681SAndroid Build Coastguard Worker} 317*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteAESKeyGenLd, [JLAGU, JVIMUL]> { 318*9880d681SAndroid Build Coastguard Worker let Latency = 7; 319*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1]; 320*9880d681SAndroid Build Coastguard Worker} 321*9880d681SAndroid Build Coastguard Worker 322*9880d681SAndroid Build Coastguard Worker//////////////////////////////////////////////////////////////////////////////// 323*9880d681SAndroid Build Coastguard Worker// Carry-less multiplication instructions. 324*9880d681SAndroid Build Coastguard Worker//////////////////////////////////////////////////////////////////////////////// 325*9880d681SAndroid Build Coastguard Worker 326*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteCLMul, [JVIMUL]> { 327*9880d681SAndroid Build Coastguard Worker let Latency = 2; 328*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1]; 329*9880d681SAndroid Build Coastguard Worker} 330*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteCLMulLd, [JLAGU, JVIMUL]> { 331*9880d681SAndroid Build Coastguard Worker let Latency = 7; 332*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1]; 333*9880d681SAndroid Build Coastguard Worker} 334*9880d681SAndroid Build Coastguard Worker 335*9880d681SAndroid Build Coastguard Worker// FIXME: pipe for system/microcode? 336*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteSystem, [JAny]> { let Latency = 100; } 337*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteMicrocoded, [JAny]> { let Latency = 100; } 338*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFence, [JSAGU]>; 339*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteNop, []>; 340*9880d681SAndroid Build Coastguard Worker} // SchedModel 341*9880d681SAndroid Build Coastguard Worker 342