1*9880d681SAndroid Build Coastguard Worker//=- X86SchedHaswell.td - X86 Haswell 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 Haswell to support instruction 11*9880d681SAndroid Build Coastguard Worker// 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 Workerdef HaswellModel : SchedMachineModel { 16*9880d681SAndroid Build Coastguard Worker // All x86 instructions are modeled as a single micro-op, and HW can decode 4 17*9880d681SAndroid Build Coastguard Worker // instructions per cycle. 18*9880d681SAndroid Build Coastguard Worker let IssueWidth = 4; 19*9880d681SAndroid Build Coastguard Worker let MicroOpBufferSize = 192; // Based on the reorder buffer. 20*9880d681SAndroid Build Coastguard Worker let LoadLatency = 4; 21*9880d681SAndroid Build Coastguard Worker let MispredictPenalty = 16; 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Worker // Based on the LSD (loop-stream detector) queue size and benchmarking data. 24*9880d681SAndroid Build Coastguard Worker let LoopMicroOpBufferSize = 50; 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Worker // FIXME: SSE4 and AVX are 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 = HaswellModel in { 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Worker// Haswell can issue micro-ops to 8 different ports in one cycle. 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Worker// Ports 0, 1, 5, and 6 handle all computation. 36*9880d681SAndroid Build Coastguard Worker// Port 4 gets the data half of stores. Store data can be available later than 37*9880d681SAndroid Build Coastguard Worker// the store address, but since we don't model the latency of stores, we can 38*9880d681SAndroid Build Coastguard Worker// ignore that. 39*9880d681SAndroid Build Coastguard Worker// Ports 2 and 3 are identical. They handle loads and the address half of 40*9880d681SAndroid Build Coastguard Worker// stores. Port 7 can handle address calculations. 41*9880d681SAndroid Build Coastguard Workerdef HWPort0 : ProcResource<1>; 42*9880d681SAndroid Build Coastguard Workerdef HWPort1 : ProcResource<1>; 43*9880d681SAndroid Build Coastguard Workerdef HWPort2 : ProcResource<1>; 44*9880d681SAndroid Build Coastguard Workerdef HWPort3 : ProcResource<1>; 45*9880d681SAndroid Build Coastguard Workerdef HWPort4 : ProcResource<1>; 46*9880d681SAndroid Build Coastguard Workerdef HWPort5 : ProcResource<1>; 47*9880d681SAndroid Build Coastguard Workerdef HWPort6 : ProcResource<1>; 48*9880d681SAndroid Build Coastguard Workerdef HWPort7 : ProcResource<1>; 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Worker// Many micro-ops are capable of issuing on multiple ports. 51*9880d681SAndroid Build Coastguard Workerdef HWPort01 : ProcResGroup<[HWPort0, HWPort1]>; 52*9880d681SAndroid Build Coastguard Workerdef HWPort23 : ProcResGroup<[HWPort2, HWPort3]>; 53*9880d681SAndroid Build Coastguard Workerdef HWPort237 : ProcResGroup<[HWPort2, HWPort3, HWPort7]>; 54*9880d681SAndroid Build Coastguard Workerdef HWPort04 : ProcResGroup<[HWPort0, HWPort4]>; 55*9880d681SAndroid Build Coastguard Workerdef HWPort05 : ProcResGroup<[HWPort0, HWPort5]>; 56*9880d681SAndroid Build Coastguard Workerdef HWPort06 : ProcResGroup<[HWPort0, HWPort6]>; 57*9880d681SAndroid Build Coastguard Workerdef HWPort15 : ProcResGroup<[HWPort1, HWPort5]>; 58*9880d681SAndroid Build Coastguard Workerdef HWPort16 : ProcResGroup<[HWPort1, HWPort6]>; 59*9880d681SAndroid Build Coastguard Workerdef HWPort56 : ProcResGroup<[HWPort5, HWPort6]>; 60*9880d681SAndroid Build Coastguard Workerdef HWPort015 : ProcResGroup<[HWPort0, HWPort1, HWPort5]>; 61*9880d681SAndroid Build Coastguard Workerdef HWPort056 : ProcResGroup<[HWPort0, HWPort5, HWPort6]>; 62*9880d681SAndroid Build Coastguard Workerdef HWPort0156: ProcResGroup<[HWPort0, HWPort1, HWPort5, HWPort6]>; 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Worker// 60 Entry Unified Scheduler 65*9880d681SAndroid Build Coastguard Workerdef HWPortAny : ProcResGroup<[HWPort0, HWPort1, HWPort2, HWPort3, HWPort4, 66*9880d681SAndroid Build Coastguard Worker HWPort5, HWPort6, HWPort7]> { 67*9880d681SAndroid Build Coastguard Worker let BufferSize=60; 68*9880d681SAndroid Build Coastguard Worker} 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Worker// Integer division issued on port 0. 71*9880d681SAndroid Build Coastguard Workerdef HWDivider : ProcResource<1>; 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Worker// Loads are 4 cycles, so ReadAfterLd registers needn't be available until 4 74*9880d681SAndroid Build Coastguard Worker// cycles after the memory operand. 75*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadAfterLd, 4>; 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Worker// Many SchedWrites are defined in pairs with and without a folded load. 78*9880d681SAndroid Build Coastguard Worker// Instructions with folded loads are usually micro-fused, so they only appear 79*9880d681SAndroid Build Coastguard Worker// as two micro-ops when queued in the reservation station. 80*9880d681SAndroid Build Coastguard Worker// This multiclass defines the resource usage for variants with and without 81*9880d681SAndroid Build Coastguard Worker// folded loads. 82*9880d681SAndroid Build Coastguard Workermulticlass HWWriteResPair<X86FoldableSchedWrite SchedRW, 83*9880d681SAndroid Build Coastguard Worker ProcResourceKind ExePort, 84*9880d681SAndroid Build Coastguard Worker int Lat> { 85*9880d681SAndroid Build Coastguard Worker // Register variant is using a single cycle on ExePort. 86*9880d681SAndroid Build Coastguard Worker def : WriteRes<SchedRW, [ExePort]> { let Latency = Lat; } 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Worker // Memory variant also uses a cycle on port 2/3 and adds 4 cycles to the 89*9880d681SAndroid Build Coastguard Worker // latency. 90*9880d681SAndroid Build Coastguard Worker def : WriteRes<SchedRW.Folded, [HWPort23, ExePort]> { 91*9880d681SAndroid Build Coastguard Worker let Latency = !add(Lat, 4); 92*9880d681SAndroid Build Coastguard Worker } 93*9880d681SAndroid Build Coastguard Worker} 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Worker// A folded store needs a cycle on port 4 for the store data, but it does not 96*9880d681SAndroid Build Coastguard Worker// need an extra port 2/3 cycle to recompute the address. 97*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteRMW, [HWPort4]>; 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Worker// Store_addr on 237. 100*9880d681SAndroid Build Coastguard Worker// Store_data on 4. 101*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteStore, [HWPort237, HWPort4]>; 102*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteLoad, [HWPort23]> { let Latency = 4; } 103*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteMove, [HWPort0156]>; 104*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteZero, []>; 105*9880d681SAndroid Build Coastguard Worker 106*9880d681SAndroid Build Coastguard Workerdefm : HWWriteResPair<WriteALU, HWPort0156, 1>; 107*9880d681SAndroid Build Coastguard Workerdefm : HWWriteResPair<WriteIMul, HWPort1, 3>; 108*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteIMulH, []> { let Latency = 3; } 109*9880d681SAndroid Build Coastguard Workerdefm : HWWriteResPair<WriteShift, HWPort06, 1>; 110*9880d681SAndroid Build Coastguard Workerdefm : HWWriteResPair<WriteJump, HWPort06, 1>; 111*9880d681SAndroid Build Coastguard Worker 112*9880d681SAndroid Build Coastguard Worker// This is for simple LEAs with one or two input operands. 113*9880d681SAndroid Build Coastguard Worker// The complex ones can only execute on port 1, and they require two cycles on 114*9880d681SAndroid Build Coastguard Worker// the port to read all inputs. We don't model that. 115*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteLEA, [HWPort15]>; 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Worker// This is quite rough, latency depends on the dividend. 118*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteIDiv, [HWPort0, HWDivider]> { 119*9880d681SAndroid Build Coastguard Worker let Latency = 25; 120*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 10]; 121*9880d681SAndroid Build Coastguard Worker} 122*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteIDivLd, [HWPort23, HWPort0, HWDivider]> { 123*9880d681SAndroid Build Coastguard Worker let Latency = 29; 124*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1, 10]; 125*9880d681SAndroid Build Coastguard Worker} 126*9880d681SAndroid Build Coastguard Worker 127*9880d681SAndroid Build Coastguard Worker// Scalar and vector floating point. 128*9880d681SAndroid Build Coastguard Workerdefm : HWWriteResPair<WriteFAdd, HWPort1, 3>; 129*9880d681SAndroid Build Coastguard Workerdefm : HWWriteResPair<WriteFMul, HWPort0, 5>; 130*9880d681SAndroid Build Coastguard Workerdefm : HWWriteResPair<WriteFDiv, HWPort0, 12>; // 10-14 cycles. 131*9880d681SAndroid Build Coastguard Workerdefm : HWWriteResPair<WriteFRcp, HWPort0, 5>; 132*9880d681SAndroid Build Coastguard Workerdefm : HWWriteResPair<WriteFRsqrt, HWPort0, 5>; 133*9880d681SAndroid Build Coastguard Workerdefm : HWWriteResPair<WriteFSqrt, HWPort0, 15>; 134*9880d681SAndroid Build Coastguard Workerdefm : HWWriteResPair<WriteCvtF2I, HWPort1, 3>; 135*9880d681SAndroid Build Coastguard Workerdefm : HWWriteResPair<WriteCvtI2F, HWPort1, 4>; 136*9880d681SAndroid Build Coastguard Workerdefm : HWWriteResPair<WriteCvtF2F, HWPort1, 3>; 137*9880d681SAndroid Build Coastguard Workerdefm : HWWriteResPair<WriteFShuffle, HWPort5, 1>; 138*9880d681SAndroid Build Coastguard Workerdefm : HWWriteResPair<WriteFBlend, HWPort015, 1>; 139*9880d681SAndroid Build Coastguard Workerdefm : HWWriteResPair<WriteFShuffle256, HWPort5, 3>; 140*9880d681SAndroid Build Coastguard Worker 141*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFVarBlend, [HWPort5]> { 142*9880d681SAndroid Build Coastguard Worker let Latency = 2; 143*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2]; 144*9880d681SAndroid Build Coastguard Worker} 145*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFVarBlendLd, [HWPort5, HWPort23]> { 146*9880d681SAndroid Build Coastguard Worker let Latency = 6; 147*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2, 1]; 148*9880d681SAndroid Build Coastguard Worker} 149*9880d681SAndroid Build Coastguard Worker 150*9880d681SAndroid Build Coastguard Worker// Vector integer operations. 151*9880d681SAndroid Build Coastguard Workerdefm : HWWriteResPair<WriteVecShift, HWPort0, 1>; 152*9880d681SAndroid Build Coastguard Workerdefm : HWWriteResPair<WriteVecLogic, HWPort015, 1>; 153*9880d681SAndroid Build Coastguard Workerdefm : HWWriteResPair<WriteVecALU, HWPort15, 1>; 154*9880d681SAndroid Build Coastguard Workerdefm : HWWriteResPair<WriteVecIMul, HWPort0, 5>; 155*9880d681SAndroid Build Coastguard Workerdefm : HWWriteResPair<WriteShuffle, HWPort5, 1>; 156*9880d681SAndroid Build Coastguard Workerdefm : HWWriteResPair<WriteBlend, HWPort15, 1>; 157*9880d681SAndroid Build Coastguard Workerdefm : HWWriteResPair<WriteShuffle256, HWPort5, 3>; 158*9880d681SAndroid Build Coastguard Worker 159*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteVarBlend, [HWPort5]> { 160*9880d681SAndroid Build Coastguard Worker let Latency = 2; 161*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2]; 162*9880d681SAndroid Build Coastguard Worker} 163*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteVarBlendLd, [HWPort5, HWPort23]> { 164*9880d681SAndroid Build Coastguard Worker let Latency = 6; 165*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2, 1]; 166*9880d681SAndroid Build Coastguard Worker} 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteVarVecShift, [HWPort0, HWPort5]> { 169*9880d681SAndroid Build Coastguard Worker let Latency = 2; 170*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2, 1]; 171*9880d681SAndroid Build Coastguard Worker} 172*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteVarVecShiftLd, [HWPort0, HWPort5, HWPort23]> { 173*9880d681SAndroid Build Coastguard Worker let Latency = 6; 174*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2, 1, 1]; 175*9880d681SAndroid Build Coastguard Worker} 176*9880d681SAndroid Build Coastguard Worker 177*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteMPSAD, [HWPort0, HWPort5]> { 178*9880d681SAndroid Build Coastguard Worker let Latency = 6; 179*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 2]; 180*9880d681SAndroid Build Coastguard Worker} 181*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteMPSADLd, [HWPort23, HWPort0, HWPort5]> { 182*9880d681SAndroid Build Coastguard Worker let Latency = 6; 183*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1, 2]; 184*9880d681SAndroid Build Coastguard Worker} 185*9880d681SAndroid Build Coastguard Worker 186*9880d681SAndroid Build Coastguard Worker// String instructions. 187*9880d681SAndroid Build Coastguard Worker// Packed Compare Implicit Length Strings, Return Mask 188*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WritePCmpIStrM, [HWPort0]> { 189*9880d681SAndroid Build Coastguard Worker let Latency = 10; 190*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [3]; 191*9880d681SAndroid Build Coastguard Worker} 192*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WritePCmpIStrMLd, [HWPort0, HWPort23]> { 193*9880d681SAndroid Build Coastguard Worker let Latency = 10; 194*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [3, 1]; 195*9880d681SAndroid Build Coastguard Worker} 196*9880d681SAndroid Build Coastguard Worker 197*9880d681SAndroid Build Coastguard Worker// Packed Compare Explicit Length Strings, Return Mask 198*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WritePCmpEStrM, [HWPort0, HWPort16, HWPort5]> { 199*9880d681SAndroid Build Coastguard Worker let Latency = 10; 200*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [3, 2, 4]; 201*9880d681SAndroid Build Coastguard Worker} 202*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WritePCmpEStrMLd, [HWPort05, HWPort16, HWPort23]> { 203*9880d681SAndroid Build Coastguard Worker let Latency = 10; 204*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [6, 2, 1]; 205*9880d681SAndroid Build Coastguard Worker} 206*9880d681SAndroid Build Coastguard Worker 207*9880d681SAndroid Build Coastguard Worker// Packed Compare Implicit Length Strings, Return Index 208*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WritePCmpIStrI, [HWPort0]> { 209*9880d681SAndroid Build Coastguard Worker let Latency = 11; 210*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [3]; 211*9880d681SAndroid Build Coastguard Worker} 212*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WritePCmpIStrILd, [HWPort0, HWPort23]> { 213*9880d681SAndroid Build Coastguard Worker let Latency = 11; 214*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [3, 1]; 215*9880d681SAndroid Build Coastguard Worker} 216*9880d681SAndroid Build Coastguard Worker 217*9880d681SAndroid Build Coastguard Worker// Packed Compare Explicit Length Strings, Return Index 218*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WritePCmpEStrI, [HWPort05, HWPort16]> { 219*9880d681SAndroid Build Coastguard Worker let Latency = 11; 220*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [6, 2]; 221*9880d681SAndroid Build Coastguard Worker} 222*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WritePCmpEStrILd, [HWPort0, HWPort16, HWPort5, HWPort23]> { 223*9880d681SAndroid Build Coastguard Worker let Latency = 11; 224*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [3, 2, 2, 1]; 225*9880d681SAndroid Build Coastguard Worker} 226*9880d681SAndroid Build Coastguard Worker 227*9880d681SAndroid Build Coastguard Worker// AES Instructions. 228*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteAESDecEnc, [HWPort5]> { 229*9880d681SAndroid Build Coastguard Worker let Latency = 7; 230*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1]; 231*9880d681SAndroid Build Coastguard Worker} 232*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteAESDecEncLd, [HWPort5, HWPort23]> { 233*9880d681SAndroid Build Coastguard Worker let Latency = 7; 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<WriteAESIMC, [HWPort5]> { 238*9880d681SAndroid Build Coastguard Worker let Latency = 14; 239*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2]; 240*9880d681SAndroid Build Coastguard Worker} 241*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteAESIMCLd, [HWPort5, HWPort23]> { 242*9880d681SAndroid Build Coastguard Worker let Latency = 14; 243*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2, 1]; 244*9880d681SAndroid Build Coastguard Worker} 245*9880d681SAndroid Build Coastguard Worker 246*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteAESKeyGen, [HWPort0, HWPort5]> { 247*9880d681SAndroid Build Coastguard Worker let Latency = 10; 248*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2, 8]; 249*9880d681SAndroid Build Coastguard Worker} 250*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteAESKeyGenLd, [HWPort0, HWPort5, HWPort23]> { 251*9880d681SAndroid Build Coastguard Worker let Latency = 10; 252*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2, 7, 1]; 253*9880d681SAndroid Build Coastguard Worker} 254*9880d681SAndroid Build Coastguard Worker 255*9880d681SAndroid Build Coastguard Worker// Carry-less multiplication instructions. 256*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteCLMul, [HWPort0, HWPort5]> { 257*9880d681SAndroid Build Coastguard Worker let Latency = 7; 258*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2, 1]; 259*9880d681SAndroid Build Coastguard Worker} 260*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteCLMulLd, [HWPort0, HWPort5, HWPort23]> { 261*9880d681SAndroid Build Coastguard Worker let Latency = 7; 262*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2, 1, 1]; 263*9880d681SAndroid Build Coastguard Worker} 264*9880d681SAndroid Build Coastguard Worker 265*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteSystem, [HWPort0156]> { let Latency = 100; } 266*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteMicrocoded, [HWPort0156]> { let Latency = 100; } 267*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFence, [HWPort23, HWPort4]>; 268*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteNop, []>; 269*9880d681SAndroid Build Coastguard Worker 270*9880d681SAndroid Build Coastguard Worker//================ Exceptions ================// 271*9880d681SAndroid Build Coastguard Worker 272*9880d681SAndroid Build Coastguard Worker//-- Specific Scheduling Models --// 273*9880d681SAndroid Build Coastguard Worker 274*9880d681SAndroid Build Coastguard Worker// Starting with P0. 275*9880d681SAndroid Build Coastguard Workerdef WriteP0 : SchedWriteRes<[HWPort0]>; 276*9880d681SAndroid Build Coastguard Worker 277*9880d681SAndroid Build Coastguard Workerdef WriteP0_P1_Lat4 : SchedWriteRes<[HWPort0, HWPort1]> { 278*9880d681SAndroid Build Coastguard Worker let Latency = 4; 279*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 280*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1]; 281*9880d681SAndroid Build Coastguard Worker} 282*9880d681SAndroid Build Coastguard Worker 283*9880d681SAndroid Build Coastguard Workerdef WriteP0_P1_Lat4Ld : SchedWriteRes<[HWPort0, HWPort1, HWPort23]> { 284*9880d681SAndroid Build Coastguard Worker let Latency = 8; 285*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 286*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1, 1]; 287*9880d681SAndroid Build Coastguard Worker} 288*9880d681SAndroid Build Coastguard Worker 289*9880d681SAndroid Build Coastguard Workerdef WriteP01 : SchedWriteRes<[HWPort01]>; 290*9880d681SAndroid Build Coastguard Worker 291*9880d681SAndroid Build Coastguard Workerdef Write2P01 : SchedWriteRes<[HWPort01]> { 292*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 293*9880d681SAndroid Build Coastguard Worker} 294*9880d681SAndroid Build Coastguard Workerdef Write3P01 : SchedWriteRes<[HWPort01]> { 295*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 296*9880d681SAndroid Build Coastguard Worker} 297*9880d681SAndroid Build Coastguard Worker 298*9880d681SAndroid Build Coastguard Workerdef WriteP015 : SchedWriteRes<[HWPort015]>; 299*9880d681SAndroid Build Coastguard Worker 300*9880d681SAndroid Build Coastguard Workerdef WriteP01_P5 : SchedWriteRes<[HWPort01, HWPort5]> { 301*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 302*9880d681SAndroid Build Coastguard Worker} 303*9880d681SAndroid Build Coastguard Workerdef WriteP06 : SchedWriteRes<[HWPort06]>; 304*9880d681SAndroid Build Coastguard Worker 305*9880d681SAndroid Build Coastguard Workerdef Write2P06 : SchedWriteRes<[HWPort06]> { 306*9880d681SAndroid Build Coastguard Worker let Latency = 1; 307*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 308*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2]; 309*9880d681SAndroid Build Coastguard Worker} 310*9880d681SAndroid Build Coastguard Worker 311*9880d681SAndroid Build Coastguard Workerdef Write3P06_Lat2 : SchedWriteRes<[HWPort06]> { 312*9880d681SAndroid Build Coastguard Worker let Latency = 2; 313*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 314*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [3]; 315*9880d681SAndroid Build Coastguard Worker} 316*9880d681SAndroid Build Coastguard Worker 317*9880d681SAndroid Build Coastguard Workerdef WriteP0156_P23 : SchedWriteRes<[HWPort0156, HWPort23]> { 318*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 319*9880d681SAndroid Build Coastguard Worker} 320*9880d681SAndroid Build Coastguard Worker 321*9880d681SAndroid Build Coastguard Workerdef Write2P0156_P23 : SchedWriteRes<[HWPort0156, HWPort23]> { 322*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 323*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2, 1]; 324*9880d681SAndroid Build Coastguard Worker} 325*9880d681SAndroid Build Coastguard Worker 326*9880d681SAndroid Build Coastguard Workerdef Write2P0156_Lat2 : SchedWriteRes<[HWPort0156]> { 327*9880d681SAndroid Build Coastguard Worker let Latency = 2; 328*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2]; 329*9880d681SAndroid Build Coastguard Worker} 330*9880d681SAndroid Build Coastguard Workerdef Write2P0156_Lat2Ld : SchedWriteRes<[HWPort0156, HWPort23]> { 331*9880d681SAndroid Build Coastguard Worker let Latency = 6; 332*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2, 1]; 333*9880d681SAndroid Build Coastguard Worker} 334*9880d681SAndroid Build Coastguard Worker 335*9880d681SAndroid Build Coastguard Workerdef Write5P0156 : SchedWriteRes<[HWPort0156]> { 336*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 5; 337*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [5]; 338*9880d681SAndroid Build Coastguard Worker} 339*9880d681SAndroid Build Coastguard Worker 340*9880d681SAndroid Build Coastguard Workerdef WriteP0156_2P237_P4 : SchedWriteRes<[HWPort0156, HWPort237, HWPort4]> { 341*9880d681SAndroid Build Coastguard Worker let Latency = 1; 342*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 2, 1]; 343*9880d681SAndroid Build Coastguard Worker} 344*9880d681SAndroid Build Coastguard Worker 345*9880d681SAndroid Build Coastguard Workerdef Write2P0156_2P237_P4 : SchedWriteRes<[HWPort0156, HWPort237, HWPort4]> { 346*9880d681SAndroid Build Coastguard Worker let Latency = 1; 347*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2, 2, 1]; 348*9880d681SAndroid Build Coastguard Worker} 349*9880d681SAndroid Build Coastguard Worker 350*9880d681SAndroid Build Coastguard Workerdef Write3P0156_2P237_P4 : SchedWriteRes<[HWPort0156, HWPort237, HWPort4]> { 351*9880d681SAndroid Build Coastguard Worker let Latency = 1; 352*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [3, 2, 1]; 353*9880d681SAndroid Build Coastguard Worker} 354*9880d681SAndroid Build Coastguard Worker 355*9880d681SAndroid Build Coastguard Worker// Starting with P1. 356*9880d681SAndroid Build Coastguard Workerdef WriteP1 : SchedWriteRes<[HWPort1]>; 357*9880d681SAndroid Build Coastguard Worker 358*9880d681SAndroid Build Coastguard Workerdef WriteP1_P23 : SchedWriteRes<[HWPort1, HWPort23]> { 359*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 360*9880d681SAndroid Build Coastguard Worker} 361*9880d681SAndroid Build Coastguard Workerdef WriteP1_Lat3 : SchedWriteRes<[HWPort1]> { 362*9880d681SAndroid Build Coastguard Worker let Latency = 3; 363*9880d681SAndroid Build Coastguard Worker} 364*9880d681SAndroid Build Coastguard Workerdef WriteP1_Lat3Ld : SchedWriteRes<[HWPort1, HWPort23]> { 365*9880d681SAndroid Build Coastguard Worker let Latency = 7; 366*9880d681SAndroid Build Coastguard Worker} 367*9880d681SAndroid Build Coastguard Worker 368*9880d681SAndroid Build Coastguard Workerdef Write2P1 : SchedWriteRes<[HWPort1]> { 369*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 370*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2]; 371*9880d681SAndroid Build Coastguard Worker} 372*9880d681SAndroid Build Coastguard Workerdef Write2P1_P23 : SchedWriteRes<[HWPort1, HWPort23]> { 373*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 374*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2, 1]; 375*9880d681SAndroid Build Coastguard Worker} 376*9880d681SAndroid Build Coastguard Workerdef WriteP15 : SchedWriteRes<[HWPort15]>; 377*9880d681SAndroid Build Coastguard Workerdef WriteP15Ld : SchedWriteRes<[HWPort15, HWPort23]> { 378*9880d681SAndroid Build Coastguard Worker let Latency = 4; 379*9880d681SAndroid Build Coastguard Worker} 380*9880d681SAndroid Build Coastguard Worker 381*9880d681SAndroid Build Coastguard Workerdef WriteP1_P5_Lat4 : SchedWriteRes<[HWPort1, HWPort5]> { 382*9880d681SAndroid Build Coastguard Worker let Latency = 4; 383*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 384*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1]; 385*9880d681SAndroid Build Coastguard Worker} 386*9880d681SAndroid Build Coastguard Worker 387*9880d681SAndroid Build Coastguard Workerdef WriteP1_P5_Lat4Ld : SchedWriteRes<[HWPort1, HWPort5, HWPort23]> { 388*9880d681SAndroid Build Coastguard Worker let Latency = 8; 389*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 390*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1, 1]; 391*9880d681SAndroid Build Coastguard Worker} 392*9880d681SAndroid Build Coastguard Worker 393*9880d681SAndroid Build Coastguard Workerdef WriteP1_P5_Lat6 : SchedWriteRes<[HWPort1, HWPort5]> { 394*9880d681SAndroid Build Coastguard Worker let Latency = 6; 395*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 396*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1]; 397*9880d681SAndroid Build Coastguard Worker} 398*9880d681SAndroid Build Coastguard Worker 399*9880d681SAndroid Build Coastguard Workerdef WriteP1_P5_Lat6Ld : SchedWriteRes<[HWPort1, HWPort5, HWPort23]> { 400*9880d681SAndroid Build Coastguard Worker let Latency = 10; 401*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 402*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1, 1]; 403*9880d681SAndroid Build Coastguard Worker} 404*9880d681SAndroid Build Coastguard Worker 405*9880d681SAndroid Build Coastguard Worker// Starting with P2. 406*9880d681SAndroid Build Coastguard Workerdef Write2P237_P4 : SchedWriteRes<[HWPort237, HWPort4]> { 407*9880d681SAndroid Build Coastguard Worker let Latency = 1; 408*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2, 1]; 409*9880d681SAndroid Build Coastguard Worker} 410*9880d681SAndroid Build Coastguard Worker 411*9880d681SAndroid Build Coastguard Worker// Starting with P5. 412*9880d681SAndroid Build Coastguard Workerdef WriteP5 : SchedWriteRes<[HWPort5]>; 413*9880d681SAndroid Build Coastguard Workerdef WriteP5Ld : SchedWriteRes<[HWPort5, HWPort23]> { 414*9880d681SAndroid Build Coastguard Worker let Latency = 5; 415*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 416*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1]; 417*9880d681SAndroid Build Coastguard Worker} 418*9880d681SAndroid Build Coastguard Worker 419*9880d681SAndroid Build Coastguard Worker// Notation: 420*9880d681SAndroid Build Coastguard Worker// - r: register. 421*9880d681SAndroid Build Coastguard Worker// - mm: 64 bit mmx register. 422*9880d681SAndroid Build Coastguard Worker// - x = 128 bit xmm register. 423*9880d681SAndroid Build Coastguard Worker// - (x)mm = mmx or xmm register. 424*9880d681SAndroid Build Coastguard Worker// - y = 256 bit ymm register. 425*9880d681SAndroid Build Coastguard Worker// - v = any vector register. 426*9880d681SAndroid Build Coastguard Worker// - m = memory. 427*9880d681SAndroid Build Coastguard Worker 428*9880d681SAndroid Build Coastguard Worker//=== Integer Instructions ===// 429*9880d681SAndroid Build Coastguard Worker//-- Move instructions --// 430*9880d681SAndroid Build Coastguard Worker 431*9880d681SAndroid Build Coastguard Worker// MOV. 432*9880d681SAndroid Build Coastguard Worker// r16,m. 433*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteALULd], (instregex "MOV16rm")>; 434*9880d681SAndroid Build Coastguard Worker 435*9880d681SAndroid Build Coastguard Worker// MOVSX, MOVZX. 436*9880d681SAndroid Build Coastguard Worker// r,m. 437*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteLoad], (instregex "MOV(S|Z)X32rm(8|16)")>; 438*9880d681SAndroid Build Coastguard Worker 439*9880d681SAndroid Build Coastguard Worker// CMOVcc. 440*9880d681SAndroid Build Coastguard Worker// r,r. 441*9880d681SAndroid Build Coastguard Workerdef : InstRW<[Write2P0156_Lat2], 442*9880d681SAndroid Build Coastguard Worker (instregex "CMOV(O|NO|B|AE|E|NE|BE|A|S|NS|P|NP|L|GE|LE|G)(16|32|64)rr")>; 443*9880d681SAndroid Build Coastguard Worker// r,m. 444*9880d681SAndroid Build Coastguard Workerdef : InstRW<[Write2P0156_Lat2Ld, ReadAfterLd], 445*9880d681SAndroid Build Coastguard Worker (instregex "CMOV(O|NO|B|AE|E|NE|BE|A|S|NS|P|NP|L|GE|LE|G)(16|32|64)rm")>; 446*9880d681SAndroid Build Coastguard Worker 447*9880d681SAndroid Build Coastguard Worker// XCHG. 448*9880d681SAndroid Build Coastguard Worker// r,r. 449*9880d681SAndroid Build Coastguard Workerdef WriteXCHG : SchedWriteRes<[HWPort0156]> { 450*9880d681SAndroid Build Coastguard Worker let Latency = 2; 451*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [3]; 452*9880d681SAndroid Build Coastguard Worker} 453*9880d681SAndroid Build Coastguard Worker 454*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteXCHG], (instregex "XCHG(8|16|32|64)rr", "XCHG(16|32|64)ar")>; 455*9880d681SAndroid Build Coastguard Worker 456*9880d681SAndroid Build Coastguard Worker// r,m. 457*9880d681SAndroid Build Coastguard Workerdef WriteXCHGrm : SchedWriteRes<[]> { 458*9880d681SAndroid Build Coastguard Worker let Latency = 21; 459*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 8; 460*9880d681SAndroid Build Coastguard Worker} 461*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteXCHGrm], (instregex "XCHG(8|16|32|64)rm")>; 462*9880d681SAndroid Build Coastguard Worker 463*9880d681SAndroid Build Coastguard Worker// XLAT. 464*9880d681SAndroid Build Coastguard Workerdef WriteXLAT : SchedWriteRes<[]> { 465*9880d681SAndroid Build Coastguard Worker let Latency = 7; 466*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 467*9880d681SAndroid Build Coastguard Worker} 468*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteXLAT], (instregex "XLAT")>; 469*9880d681SAndroid Build Coastguard Worker 470*9880d681SAndroid Build Coastguard Worker// PUSH. 471*9880d681SAndroid Build Coastguard Worker// m. 472*9880d681SAndroid Build Coastguard Workerdef : InstRW<[Write2P237_P4], (instregex "PUSH(16|32)rmm")>; 473*9880d681SAndroid Build Coastguard Worker 474*9880d681SAndroid Build Coastguard Worker// PUSHF. 475*9880d681SAndroid Build Coastguard Workerdef WritePushF : SchedWriteRes<[HWPort1, HWPort4, HWPort237, HWPort06]> { 476*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 4; 477*9880d681SAndroid Build Coastguard Worker} 478*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WritePushF], (instregex "PUSHF(16|32)")>; 479*9880d681SAndroid Build Coastguard Worker 480*9880d681SAndroid Build Coastguard Worker// PUSHA. 481*9880d681SAndroid Build Coastguard Workerdef WritePushA : SchedWriteRes<[]> { 482*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 19; 483*9880d681SAndroid Build Coastguard Worker} 484*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WritePushA], (instregex "PUSHA(16|32)")>; 485*9880d681SAndroid Build Coastguard Worker 486*9880d681SAndroid Build Coastguard Worker// POP. 487*9880d681SAndroid Build Coastguard Worker// m. 488*9880d681SAndroid Build Coastguard Workerdef : InstRW<[Write2P237_P4], (instregex "POP(16|32)rmm")>; 489*9880d681SAndroid Build Coastguard Worker 490*9880d681SAndroid Build Coastguard Worker// POPF. 491*9880d681SAndroid Build Coastguard Workerdef WritePopF : SchedWriteRes<[]> { 492*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 9; 493*9880d681SAndroid Build Coastguard Worker} 494*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WritePopF], (instregex "POPF(16|32)")>; 495*9880d681SAndroid Build Coastguard Worker 496*9880d681SAndroid Build Coastguard Worker// POPA. 497*9880d681SAndroid Build Coastguard Workerdef WritePopA : SchedWriteRes<[]> { 498*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 18; 499*9880d681SAndroid Build Coastguard Worker} 500*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WritePopA], (instregex "POPA(16|32)")>; 501*9880d681SAndroid Build Coastguard Worker 502*9880d681SAndroid Build Coastguard Worker// LAHF SAHF. 503*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP06], (instregex "(S|L)AHF")>; 504*9880d681SAndroid Build Coastguard Worker 505*9880d681SAndroid Build Coastguard Worker// BSWAP. 506*9880d681SAndroid Build Coastguard Worker// r32. 507*9880d681SAndroid Build Coastguard Workerdef WriteBSwap32 : SchedWriteRes<[HWPort15]>; 508*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteBSwap32], (instregex "BSWAP32r")>; 509*9880d681SAndroid Build Coastguard Worker 510*9880d681SAndroid Build Coastguard Worker// r64. 511*9880d681SAndroid Build Coastguard Workerdef WriteBSwap64 : SchedWriteRes<[HWPort06, HWPort15]> { 512*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 513*9880d681SAndroid Build Coastguard Worker} 514*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteBSwap64], (instregex "BSWAP64r")>; 515*9880d681SAndroid Build Coastguard Worker 516*9880d681SAndroid Build Coastguard Worker// MOVBE. 517*9880d681SAndroid Build Coastguard Worker// r16,m16 / r64,m64. 518*9880d681SAndroid Build Coastguard Workerdef : InstRW<[Write2P0156_Lat2Ld], (instregex "MOVBE(16|64)rm")>; 519*9880d681SAndroid Build Coastguard Worker 520*9880d681SAndroid Build Coastguard Worker// r32, m32. 521*9880d681SAndroid Build Coastguard Workerdef WriteMoveBE32rm : SchedWriteRes<[HWPort15, HWPort23]> { 522*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 523*9880d681SAndroid Build Coastguard Worker} 524*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteMoveBE32rm], (instregex "MOVBE32rm")>; 525*9880d681SAndroid Build Coastguard Worker 526*9880d681SAndroid Build Coastguard Worker// m16,r16. 527*9880d681SAndroid Build Coastguard Workerdef WriteMoveBE16mr : SchedWriteRes<[HWPort06, HWPort237, HWPort4]> { 528*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 529*9880d681SAndroid Build Coastguard Worker} 530*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteMoveBE16mr], (instregex "MOVBE16mr")>; 531*9880d681SAndroid Build Coastguard Worker 532*9880d681SAndroid Build Coastguard Worker// m32,r32. 533*9880d681SAndroid Build Coastguard Workerdef WriteMoveBE32mr : SchedWriteRes<[HWPort15, HWPort237, HWPort4]> { 534*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 535*9880d681SAndroid Build Coastguard Worker} 536*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteMoveBE32mr], (instregex "MOVBE32mr")>; 537*9880d681SAndroid Build Coastguard Worker 538*9880d681SAndroid Build Coastguard Worker// m64,r64. 539*9880d681SAndroid Build Coastguard Workerdef WriteMoveBE64mr : SchedWriteRes<[HWPort06, HWPort15, HWPort237, HWPort4]> { 540*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 4; 541*9880d681SAndroid Build Coastguard Worker} 542*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteMoveBE64mr], (instregex "MOVBE64mr")>; 543*9880d681SAndroid Build Coastguard Worker 544*9880d681SAndroid Build Coastguard Worker//-- Arithmetic instructions --// 545*9880d681SAndroid Build Coastguard Worker 546*9880d681SAndroid Build Coastguard Worker// ADD SUB. 547*9880d681SAndroid Build Coastguard Worker// m,r/i. 548*9880d681SAndroid Build Coastguard Workerdef : InstRW<[Write2P0156_2P237_P4], 549*9880d681SAndroid Build Coastguard Worker (instregex "(ADD|SUB)(8|16|32|64)m(r|i)", 550*9880d681SAndroid Build Coastguard Worker "(ADD|SUB)(8|16|32|64)mi8", "(ADD|SUB)64mi32")>; 551*9880d681SAndroid Build Coastguard Worker 552*9880d681SAndroid Build Coastguard Worker// ADC SBB. 553*9880d681SAndroid Build Coastguard Worker// r,r/i. 554*9880d681SAndroid Build Coastguard Workerdef : InstRW<[Write2P0156_Lat2], (instregex "(ADC|SBB)(8|16|32|64)r(r|i)", 555*9880d681SAndroid Build Coastguard Worker "(ADC|SBB)(16|32|64)ri8", 556*9880d681SAndroid Build Coastguard Worker "(ADC|SBB)64ri32", 557*9880d681SAndroid Build Coastguard Worker "(ADC|SBB)(8|16|32|64)rr_REV")>; 558*9880d681SAndroid Build Coastguard Worker 559*9880d681SAndroid Build Coastguard Worker// r,m. 560*9880d681SAndroid Build Coastguard Workerdef : InstRW<[Write2P0156_Lat2Ld, ReadAfterLd], (instregex "(ADC|SBB)(8|16|32|64)rm")>; 561*9880d681SAndroid Build Coastguard Worker 562*9880d681SAndroid Build Coastguard Worker// m,r/i. 563*9880d681SAndroid Build Coastguard Workerdef : InstRW<[Write3P0156_2P237_P4], 564*9880d681SAndroid Build Coastguard Worker (instregex "(ADC|SBB)(8|16|32|64)m(r|i)", 565*9880d681SAndroid Build Coastguard Worker "(ADC|SBB)(16|32|64)mi8", 566*9880d681SAndroid Build Coastguard Worker "(ADC|SBB)64mi32")>; 567*9880d681SAndroid Build Coastguard Worker 568*9880d681SAndroid Build Coastguard Worker// INC DEC NOT NEG. 569*9880d681SAndroid Build Coastguard Worker// m. 570*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP0156_2P237_P4], 571*9880d681SAndroid Build Coastguard Worker (instregex "(INC|DEC|NOT|NEG)(8|16|32|64)m", 572*9880d681SAndroid Build Coastguard Worker "(INC|DEC)64(16|32)m")>; 573*9880d681SAndroid Build Coastguard Worker 574*9880d681SAndroid Build Coastguard Worker// MUL IMUL. 575*9880d681SAndroid Build Coastguard Worker// r16. 576*9880d681SAndroid Build Coastguard Workerdef WriteMul16 : SchedWriteRes<[HWPort1, HWPort0156]> { 577*9880d681SAndroid Build Coastguard Worker let Latency = 4; 578*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 4; 579*9880d681SAndroid Build Coastguard Worker} 580*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteMul16], (instregex "IMUL16r", "MUL16r")>; 581*9880d681SAndroid Build Coastguard Worker 582*9880d681SAndroid Build Coastguard Worker// m16. 583*9880d681SAndroid Build Coastguard Workerdef WriteMul16Ld : SchedWriteRes<[HWPort1, HWPort0156, HWPort23]> { 584*9880d681SAndroid Build Coastguard Worker let Latency = 8; 585*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 5; 586*9880d681SAndroid Build Coastguard Worker} 587*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteMul16Ld], (instregex "IMUL16m", "MUL16m")>; 588*9880d681SAndroid Build Coastguard Worker 589*9880d681SAndroid Build Coastguard Worker// r32. 590*9880d681SAndroid Build Coastguard Workerdef WriteMul32 : SchedWriteRes<[HWPort1, HWPort0156]> { 591*9880d681SAndroid Build Coastguard Worker let Latency = 4; 592*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 593*9880d681SAndroid Build Coastguard Worker} 594*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteMul32], (instregex "IMUL32r", "MUL32r")>; 595*9880d681SAndroid Build Coastguard Worker 596*9880d681SAndroid Build Coastguard Worker// m32. 597*9880d681SAndroid Build Coastguard Workerdef WriteMul32Ld : SchedWriteRes<[HWPort1, HWPort0156, HWPort23]> { 598*9880d681SAndroid Build Coastguard Worker let Latency = 8; 599*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 4; 600*9880d681SAndroid Build Coastguard Worker} 601*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteMul32Ld], (instregex "IMUL32m", "MUL32m")>; 602*9880d681SAndroid Build Coastguard Worker 603*9880d681SAndroid Build Coastguard Worker// r64. 604*9880d681SAndroid Build Coastguard Workerdef WriteMul64 : SchedWriteRes<[HWPort1, HWPort6]> { 605*9880d681SAndroid Build Coastguard Worker let Latency = 3; 606*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 607*9880d681SAndroid Build Coastguard Worker} 608*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteMul64], (instregex "IMUL64r", "MUL64r")>; 609*9880d681SAndroid Build Coastguard Worker 610*9880d681SAndroid Build Coastguard Worker// m64. 611*9880d681SAndroid Build Coastguard Workerdef WriteMul64Ld : SchedWriteRes<[HWPort1, HWPort6, HWPort23]> { 612*9880d681SAndroid Build Coastguard Worker let Latency = 7; 613*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 614*9880d681SAndroid Build Coastguard Worker} 615*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteMul64Ld], (instregex "IMUL64m", "MUL64m")>; 616*9880d681SAndroid Build Coastguard Worker 617*9880d681SAndroid Build Coastguard Worker// r16,r16. 618*9880d681SAndroid Build Coastguard Workerdef WriteMul16rri : SchedWriteRes<[HWPort1, HWPort0156]> { 619*9880d681SAndroid Build Coastguard Worker let Latency = 4; 620*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 621*9880d681SAndroid Build Coastguard Worker} 622*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteMul16rri], (instregex "IMUL16rri", "IMUL16rri8")>; 623*9880d681SAndroid Build Coastguard Worker 624*9880d681SAndroid Build Coastguard Worker// r16,m16. 625*9880d681SAndroid Build Coastguard Workerdef WriteMul16rmi : SchedWriteRes<[HWPort1, HWPort0156, HWPort23]> { 626*9880d681SAndroid Build Coastguard Worker let Latency = 8; 627*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 628*9880d681SAndroid Build Coastguard Worker} 629*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteMul16rmi], (instregex "IMUL16rmi", "IMUL16rmi8")>; 630*9880d681SAndroid Build Coastguard Worker 631*9880d681SAndroid Build Coastguard Worker// MULX. 632*9880d681SAndroid Build Coastguard Worker// r32,r32,r32. 633*9880d681SAndroid Build Coastguard Workerdef WriteMulX32 : SchedWriteRes<[HWPort1, HWPort056]> { 634*9880d681SAndroid Build Coastguard Worker let Latency = 4; 635*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 636*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 2]; 637*9880d681SAndroid Build Coastguard Worker} 638*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteMulX32], (instregex "MULX32rr")>; 639*9880d681SAndroid Build Coastguard Worker 640*9880d681SAndroid Build Coastguard Worker// r32,r32,m32. 641*9880d681SAndroid Build Coastguard Workerdef WriteMulX32Ld : SchedWriteRes<[HWPort1, HWPort056, HWPort23]> { 642*9880d681SAndroid Build Coastguard Worker let Latency = 8; 643*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 4; 644*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 2, 1]; 645*9880d681SAndroid Build Coastguard Worker} 646*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteMulX32Ld], (instregex "MULX32rm")>; 647*9880d681SAndroid Build Coastguard Worker 648*9880d681SAndroid Build Coastguard Worker// r64,r64,r64. 649*9880d681SAndroid Build Coastguard Workerdef WriteMulX64 : SchedWriteRes<[HWPort1, HWPort6]> { 650*9880d681SAndroid Build Coastguard Worker let Latency = 4; 651*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 652*9880d681SAndroid Build Coastguard Worker} 653*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteMulX64], (instregex "MULX64rr")>; 654*9880d681SAndroid Build Coastguard Worker 655*9880d681SAndroid Build Coastguard Worker// r64,r64,m64. 656*9880d681SAndroid Build Coastguard Workerdef WriteMulX64Ld : SchedWriteRes<[HWPort1, HWPort6, HWPort23]> { 657*9880d681SAndroid Build Coastguard Worker let Latency = 8; 658*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 659*9880d681SAndroid Build Coastguard Worker} 660*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteMulX64Ld], (instregex "MULX64rm")>; 661*9880d681SAndroid Build Coastguard Worker 662*9880d681SAndroid Build Coastguard Worker// DIV. 663*9880d681SAndroid Build Coastguard Worker// r8. 664*9880d681SAndroid Build Coastguard Workerdef WriteDiv8 : SchedWriteRes<[HWPort0, HWPort1, HWPort5, HWPort6]> { 665*9880d681SAndroid Build Coastguard Worker let Latency = 22; 666*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 9; 667*9880d681SAndroid Build Coastguard Worker} 668*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteDiv8], (instregex "DIV8r")>; 669*9880d681SAndroid Build Coastguard Worker 670*9880d681SAndroid Build Coastguard Worker// r16. 671*9880d681SAndroid Build Coastguard Workerdef WriteDiv16 : SchedWriteRes<[HWPort0, HWPort1, HWPort5, HWPort6]> { 672*9880d681SAndroid Build Coastguard Worker let Latency = 23; 673*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 10; 674*9880d681SAndroid Build Coastguard Worker} 675*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteDiv16], (instregex "DIV16r")>; 676*9880d681SAndroid Build Coastguard Worker 677*9880d681SAndroid Build Coastguard Worker// r32. 678*9880d681SAndroid Build Coastguard Workerdef WriteDiv32 : SchedWriteRes<[HWPort0, HWPort1, HWPort5, HWPort6]> { 679*9880d681SAndroid Build Coastguard Worker let Latency = 22; 680*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 10; 681*9880d681SAndroid Build Coastguard Worker} 682*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteDiv32], (instregex "DIV32r")>; 683*9880d681SAndroid Build Coastguard Worker 684*9880d681SAndroid Build Coastguard Worker// r64. 685*9880d681SAndroid Build Coastguard Workerdef WriteDiv64 : SchedWriteRes<[HWPort0, HWPort1, HWPort5, HWPort6]> { 686*9880d681SAndroid Build Coastguard Worker let Latency = 32; 687*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 36; 688*9880d681SAndroid Build Coastguard Worker} 689*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteDiv64], (instregex "DIV64r")>; 690*9880d681SAndroid Build Coastguard Worker 691*9880d681SAndroid Build Coastguard Worker// IDIV. 692*9880d681SAndroid Build Coastguard Worker// r8. 693*9880d681SAndroid Build Coastguard Workerdef WriteIDiv8 : SchedWriteRes<[HWPort0, HWPort1, HWPort5, HWPort6]> { 694*9880d681SAndroid Build Coastguard Worker let Latency = 23; 695*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 9; 696*9880d681SAndroid Build Coastguard Worker} 697*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteIDiv8], (instregex "IDIV8r")>; 698*9880d681SAndroid Build Coastguard Worker 699*9880d681SAndroid Build Coastguard Worker// r16. 700*9880d681SAndroid Build Coastguard Workerdef WriteIDiv16 : SchedWriteRes<[HWPort0, HWPort1, HWPort5, HWPort6]> { 701*9880d681SAndroid Build Coastguard Worker let Latency = 23; 702*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 10; 703*9880d681SAndroid Build Coastguard Worker} 704*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteIDiv16], (instregex "IDIV16r")>; 705*9880d681SAndroid Build Coastguard Worker 706*9880d681SAndroid Build Coastguard Worker// r32. 707*9880d681SAndroid Build Coastguard Workerdef WriteIDiv32 : SchedWriteRes<[HWPort0, HWPort1, HWPort5, HWPort6]> { 708*9880d681SAndroid Build Coastguard Worker let Latency = 22; 709*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 9; 710*9880d681SAndroid Build Coastguard Worker} 711*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteIDiv32], (instregex "IDIV32r")>; 712*9880d681SAndroid Build Coastguard Worker 713*9880d681SAndroid Build Coastguard Worker// r64. 714*9880d681SAndroid Build Coastguard Workerdef WriteIDiv64 : SchedWriteRes<[HWPort0, HWPort1, HWPort5, HWPort6]> { 715*9880d681SAndroid Build Coastguard Worker let Latency = 39; 716*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 59; 717*9880d681SAndroid Build Coastguard Worker} 718*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteIDiv64], (instregex "IDIV64r")>; 719*9880d681SAndroid Build Coastguard Worker 720*9880d681SAndroid Build Coastguard Worker//-- Logic instructions --// 721*9880d681SAndroid Build Coastguard Worker 722*9880d681SAndroid Build Coastguard Worker// AND OR XOR. 723*9880d681SAndroid Build Coastguard Worker// m,r/i. 724*9880d681SAndroid Build Coastguard Workerdef : InstRW<[Write2P0156_2P237_P4], 725*9880d681SAndroid Build Coastguard Worker (instregex "(AND|OR|XOR)(8|16|32|64)m(r|i)", 726*9880d681SAndroid Build Coastguard Worker "(AND|OR|XOR)(8|16|32|64)mi8", "(AND|OR|XOR)64mi32")>; 727*9880d681SAndroid Build Coastguard Worker 728*9880d681SAndroid Build Coastguard Worker// SHR SHL SAR. 729*9880d681SAndroid Build Coastguard Worker// m,i. 730*9880d681SAndroid Build Coastguard Workerdef WriteShiftRMW : SchedWriteRes<[HWPort06, HWPort237, HWPort4]> { 731*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 4; 732*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2, 1, 1]; 733*9880d681SAndroid Build Coastguard Worker} 734*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteShiftRMW], (instregex "S(A|H)(R|L)(8|16|32|64)m(i|1)")>; 735*9880d681SAndroid Build Coastguard Worker 736*9880d681SAndroid Build Coastguard Worker// r,cl. 737*9880d681SAndroid Build Coastguard Workerdef : InstRW<[Write3P06_Lat2], (instregex "S(A|H)(R|L)(8|16|32|64)rCL")>; 738*9880d681SAndroid Build Coastguard Worker 739*9880d681SAndroid Build Coastguard Worker// m,cl. 740*9880d681SAndroid Build Coastguard Workerdef WriteShiftClLdRMW : SchedWriteRes<[HWPort06, HWPort23, HWPort4]> { 741*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 6; 742*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [3, 2, 1]; 743*9880d681SAndroid Build Coastguard Worker} 744*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteShiftClLdRMW], (instregex "S(A|H)(R|L)(8|16|32|64)mCL")>; 745*9880d681SAndroid Build Coastguard Worker 746*9880d681SAndroid Build Coastguard Worker// ROR ROL. 747*9880d681SAndroid Build Coastguard Worker// r,1. 748*9880d681SAndroid Build Coastguard Workerdef : InstRW<[Write2P06], (instregex "RO(R|L)(8|16|32|64)r1")>; 749*9880d681SAndroid Build Coastguard Worker 750*9880d681SAndroid Build Coastguard Worker// m,i. 751*9880d681SAndroid Build Coastguard Workerdef WriteRotateRMW : SchedWriteRes<[HWPort06, HWPort237, HWPort4]> { 752*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 5; 753*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2, 2, 1]; 754*9880d681SAndroid Build Coastguard Worker} 755*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteRotateRMW], (instregex "RO(R|L)(8|16|32|64)mi")>; 756*9880d681SAndroid Build Coastguard Worker 757*9880d681SAndroid Build Coastguard Worker// r,cl. 758*9880d681SAndroid Build Coastguard Workerdef : InstRW<[Write3P06_Lat2], (instregex "RO(R|L)(8|16|32|64)rCL")>; 759*9880d681SAndroid Build Coastguard Worker 760*9880d681SAndroid Build Coastguard Worker// m,cl. 761*9880d681SAndroid Build Coastguard Workerdef WriteRotateRMWCL : SchedWriteRes<[]> { 762*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 6; 763*9880d681SAndroid Build Coastguard Worker} 764*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteRotateRMWCL], (instregex "RO(R|L)(8|16|32|64)mCL")>; 765*9880d681SAndroid Build Coastguard Worker 766*9880d681SAndroid Build Coastguard Worker// RCR RCL. 767*9880d681SAndroid Build Coastguard Worker// r,1. 768*9880d681SAndroid Build Coastguard Workerdef WriteRCr1 : SchedWriteRes<[HWPort06, HWPort0156]> { 769*9880d681SAndroid Build Coastguard Worker let Latency = 2; 770*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 771*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2, 1]; 772*9880d681SAndroid Build Coastguard Worker} 773*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteRCr1], (instregex "RC(R|L)(8|16|32|64)r1")>; 774*9880d681SAndroid Build Coastguard Worker 775*9880d681SAndroid Build Coastguard Worker// m,1. 776*9880d681SAndroid Build Coastguard Workerdef WriteRCm1 : SchedWriteRes<[]> { 777*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 6; 778*9880d681SAndroid Build Coastguard Worker} 779*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteRCm1], (instregex "RC(R|L)(8|16|32|64)m1")>; 780*9880d681SAndroid Build Coastguard Worker 781*9880d681SAndroid Build Coastguard Worker// r,i. 782*9880d681SAndroid Build Coastguard Workerdef WriteRCri : SchedWriteRes<[HWPort0156]> { 783*9880d681SAndroid Build Coastguard Worker let Latency = 6; 784*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 8; 785*9880d681SAndroid Build Coastguard Worker} 786*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteRCri], (instregex "RC(R|L)(8|16|32|64)r(i|CL)")>; 787*9880d681SAndroid Build Coastguard Worker 788*9880d681SAndroid Build Coastguard Worker// m,i. 789*9880d681SAndroid Build Coastguard Workerdef WriteRCmi : SchedWriteRes<[]> { 790*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 11; 791*9880d681SAndroid Build Coastguard Worker} 792*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteRCmi], (instregex "RC(R|L)(8|16|32|64)m(i|CL)")>; 793*9880d681SAndroid Build Coastguard Worker 794*9880d681SAndroid Build Coastguard Worker// SHRD SHLD. 795*9880d681SAndroid Build Coastguard Worker// r,r,i. 796*9880d681SAndroid Build Coastguard Workerdef WriteShDrr : SchedWriteRes<[HWPort1]> { 797*9880d681SAndroid Build Coastguard Worker let Latency = 3; 798*9880d681SAndroid Build Coastguard Worker} 799*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteShDrr], (instregex "SH(R|L)D(16|32|64)rri8")>; 800*9880d681SAndroid Build Coastguard Worker 801*9880d681SAndroid Build Coastguard Worker// m,r,i. 802*9880d681SAndroid Build Coastguard Workerdef WriteShDmr : SchedWriteRes<[]> { 803*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 5; 804*9880d681SAndroid Build Coastguard Worker} 805*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteShDmr], (instregex "SH(R|L)D(16|32|64)mri8")>; 806*9880d681SAndroid Build Coastguard Worker 807*9880d681SAndroid Build Coastguard Worker// r,r,cl. 808*9880d681SAndroid Build Coastguard Workerdef WriteShlDCL : SchedWriteRes<[HWPort0156]> { 809*9880d681SAndroid Build Coastguard Worker let Latency = 3; 810*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 4; 811*9880d681SAndroid Build Coastguard Worker} 812*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteShlDCL], (instregex "SHLD(16|32|64)rrCL")>; 813*9880d681SAndroid Build Coastguard Worker 814*9880d681SAndroid Build Coastguard Worker// r,r,cl. 815*9880d681SAndroid Build Coastguard Workerdef WriteShrDCL : SchedWriteRes<[HWPort0156]> { 816*9880d681SAndroid Build Coastguard Worker let Latency = 4; 817*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 4; 818*9880d681SAndroid Build Coastguard Worker} 819*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteShrDCL], (instregex "SHRD(16|32|64)rrCL")>; 820*9880d681SAndroid Build Coastguard Worker 821*9880d681SAndroid Build Coastguard Worker// m,r,cl. 822*9880d681SAndroid Build Coastguard Workerdef WriteShDmrCL : SchedWriteRes<[]> { 823*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 7; 824*9880d681SAndroid Build Coastguard Worker} 825*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteShDmrCL], (instregex "SH(R|L)D(16|32|64)mrCL")>; 826*9880d681SAndroid Build Coastguard Worker 827*9880d681SAndroid Build Coastguard Worker// BT. 828*9880d681SAndroid Build Coastguard Worker// r,r/i. 829*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteShift], (instregex "BT(16|32|64)r(r|i8)")>; 830*9880d681SAndroid Build Coastguard Worker 831*9880d681SAndroid Build Coastguard Worker// m,r. 832*9880d681SAndroid Build Coastguard Workerdef WriteBTmr : SchedWriteRes<[]> { 833*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 10; 834*9880d681SAndroid Build Coastguard Worker} 835*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteBTmr], (instregex "BT(16|32|64)mr")>; 836*9880d681SAndroid Build Coastguard Worker 837*9880d681SAndroid Build Coastguard Worker// m,i. 838*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteShiftLd], (instregex "BT(16|32|64)mi8")>; 839*9880d681SAndroid Build Coastguard Worker 840*9880d681SAndroid Build Coastguard Worker// BTR BTS BTC. 841*9880d681SAndroid Build Coastguard Worker// r,r,i. 842*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteShift], (instregex "BT(R|S|C)(16|32|64)r(r|i8)")>; 843*9880d681SAndroid Build Coastguard Worker 844*9880d681SAndroid Build Coastguard Worker// m,r. 845*9880d681SAndroid Build Coastguard Workerdef WriteBTRSCmr : SchedWriteRes<[]> { 846*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 11; 847*9880d681SAndroid Build Coastguard Worker} 848*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteBTRSCmr], (instregex "BT(R|S|C)(16|32|64)mr")>; 849*9880d681SAndroid Build Coastguard Worker 850*9880d681SAndroid Build Coastguard Worker// m,i. 851*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteShiftLd], (instregex "BT(R|S|C)(16|32|64)mi8")>; 852*9880d681SAndroid Build Coastguard Worker 853*9880d681SAndroid Build Coastguard Worker// BSF BSR. 854*9880d681SAndroid Build Coastguard Worker// r,r. 855*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP1_Lat3], (instregex "BS(R|F)(16|32|64)rr")>; 856*9880d681SAndroid Build Coastguard Worker// r,m. 857*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP1_Lat3Ld], (instregex "BS(R|F)(16|32|64)rm")>; 858*9880d681SAndroid Build Coastguard Worker 859*9880d681SAndroid Build Coastguard Worker// SETcc. 860*9880d681SAndroid Build Coastguard Worker// r. 861*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteShift], 862*9880d681SAndroid Build Coastguard Worker (instregex "SET(O|NO|B|AE|E|NE|BE|A|S|NS|P|NP|L|GE|LE|G)r")>; 863*9880d681SAndroid Build Coastguard Worker// m. 864*9880d681SAndroid Build Coastguard Workerdef WriteSetCCm : SchedWriteRes<[HWPort06, HWPort237, HWPort4]> { 865*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 866*9880d681SAndroid Build Coastguard Worker} 867*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteSetCCm], 868*9880d681SAndroid Build Coastguard Worker (instregex "SET(O|NO|B|AE|E|NE|BE|A|S|NS|P|NP|L|GE|LE|G)m")>; 869*9880d681SAndroid Build Coastguard Worker 870*9880d681SAndroid Build Coastguard Worker// CLD STD. 871*9880d681SAndroid Build Coastguard Workerdef WriteCldStd : SchedWriteRes<[HWPort15, HWPort6]> { 872*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 873*9880d681SAndroid Build Coastguard Worker} 874*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteCldStd], (instregex "STD", "CLD")>; 875*9880d681SAndroid Build Coastguard Worker 876*9880d681SAndroid Build Coastguard Worker// LZCNT TZCNT. 877*9880d681SAndroid Build Coastguard Worker// r,r. 878*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP1_Lat3], (instregex "(L|TZCNT)(16|32|64)rr")>; 879*9880d681SAndroid Build Coastguard Worker// r,m. 880*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP1_Lat3Ld], (instregex "(L|TZCNT)(16|32|64)rm")>; 881*9880d681SAndroid Build Coastguard Worker 882*9880d681SAndroid Build Coastguard Worker// ANDN. 883*9880d681SAndroid Build Coastguard Worker// r,r. 884*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP15], (instregex "ANDN(32|64)rr")>; 885*9880d681SAndroid Build Coastguard Worker// r,m. 886*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP15Ld], (instregex "ANDN(32|64)rm")>; 887*9880d681SAndroid Build Coastguard Worker 888*9880d681SAndroid Build Coastguard Worker// BLSI BLSMSK BLSR. 889*9880d681SAndroid Build Coastguard Worker// r,r. 890*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP15], (instregex "BLS(I|MSK|R)(32|64)rr")>; 891*9880d681SAndroid Build Coastguard Worker// r,m. 892*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP15Ld], (instregex "BLS(I|MSK|R)(32|64)rm")>; 893*9880d681SAndroid Build Coastguard Worker 894*9880d681SAndroid Build Coastguard Worker// BEXTR. 895*9880d681SAndroid Build Coastguard Worker// r,r,r. 896*9880d681SAndroid Build Coastguard Workerdef : InstRW<[Write2P0156_Lat2], (instregex "BEXTR(32|64)rr")>; 897*9880d681SAndroid Build Coastguard Worker// r,m,r. 898*9880d681SAndroid Build Coastguard Workerdef : InstRW<[Write2P0156_Lat2Ld], (instregex "BEXTR(32|64)rm")>; 899*9880d681SAndroid Build Coastguard Worker 900*9880d681SAndroid Build Coastguard Worker// BZHI. 901*9880d681SAndroid Build Coastguard Worker// r,r,r. 902*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP15], (instregex "BZHI(32|64)rr")>; 903*9880d681SAndroid Build Coastguard Worker// r,m,r. 904*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP15Ld], (instregex "BZHI(32|64)rm")>; 905*9880d681SAndroid Build Coastguard Worker 906*9880d681SAndroid Build Coastguard Worker// PDEP PEXT. 907*9880d681SAndroid Build Coastguard Worker// r,r,r. 908*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP1_Lat3], (instregex "PDEP(32|64)rr", "PEXT(32|64)rr")>; 909*9880d681SAndroid Build Coastguard Worker// r,m,r. 910*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP1_Lat3Ld], (instregex "PDEP(32|64)rm", "PEXT(32|64)rm")>; 911*9880d681SAndroid Build Coastguard Worker 912*9880d681SAndroid Build Coastguard Worker//-- Control transfer instructions --// 913*9880d681SAndroid Build Coastguard Worker 914*9880d681SAndroid Build Coastguard Worker// J(E|R)CXZ. 915*9880d681SAndroid Build Coastguard Workerdef WriteJCXZ : SchedWriteRes<[HWPort0156, HWPort6]> { 916*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 917*9880d681SAndroid Build Coastguard Worker} 918*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteJCXZ], (instregex "JCXZ", "JECXZ_(32|64)", "JRCXZ")>; 919*9880d681SAndroid Build Coastguard Worker 920*9880d681SAndroid Build Coastguard Worker// LOOP. 921*9880d681SAndroid Build Coastguard Workerdef WriteLOOP : SchedWriteRes<[]> { 922*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 7; 923*9880d681SAndroid Build Coastguard Worker} 924*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteLOOP], (instregex "LOOP")>; 925*9880d681SAndroid Build Coastguard Worker 926*9880d681SAndroid Build Coastguard Worker// LOOP(N)E 927*9880d681SAndroid Build Coastguard Workerdef WriteLOOPE : SchedWriteRes<[]> { 928*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 11; 929*9880d681SAndroid Build Coastguard Worker} 930*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteLOOPE], (instregex "LOOPE", "LOOPNE")>; 931*9880d681SAndroid Build Coastguard Worker 932*9880d681SAndroid Build Coastguard Worker// CALL. 933*9880d681SAndroid Build Coastguard Worker// r. 934*9880d681SAndroid Build Coastguard Workerdef WriteCALLr : SchedWriteRes<[HWPort237, HWPort4, HWPort6]> { 935*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 936*9880d681SAndroid Build Coastguard Worker} 937*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteCALLr], (instregex "CALL(16|32)r")>; 938*9880d681SAndroid Build Coastguard Worker 939*9880d681SAndroid Build Coastguard Worker// m. 940*9880d681SAndroid Build Coastguard Workerdef WriteCALLm : SchedWriteRes<[HWPort237, HWPort4, HWPort6]> { 941*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 4; 942*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2, 1, 1]; 943*9880d681SAndroid Build Coastguard Worker} 944*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteCALLm], (instregex "CALL(16|32)m")>; 945*9880d681SAndroid Build Coastguard Worker 946*9880d681SAndroid Build Coastguard Worker// RET. 947*9880d681SAndroid Build Coastguard Workerdef WriteRET : SchedWriteRes<[HWPort237, HWPort6]> { 948*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 949*9880d681SAndroid Build Coastguard Worker} 950*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteRET], (instregex "RET(L|Q|W)", "LRET(L|Q|W)")>; 951*9880d681SAndroid Build Coastguard Worker 952*9880d681SAndroid Build Coastguard Worker// i. 953*9880d681SAndroid Build Coastguard Workerdef WriteRETI : SchedWriteRes<[HWPort23, HWPort6, HWPort015]> { 954*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 4; 955*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 2, 1]; 956*9880d681SAndroid Build Coastguard Worker} 957*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteRETI], (instregex "RETI(L|Q|W)", "LRETI(L|Q|W)")>; 958*9880d681SAndroid Build Coastguard Worker 959*9880d681SAndroid Build Coastguard Worker// BOUND. 960*9880d681SAndroid Build Coastguard Worker// r,m. 961*9880d681SAndroid Build Coastguard Workerdef WriteBOUND : SchedWriteRes<[]> { 962*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 15; 963*9880d681SAndroid Build Coastguard Worker} 964*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteBOUND], (instregex "BOUNDS(16|32)rm")>; 965*9880d681SAndroid Build Coastguard Worker 966*9880d681SAndroid Build Coastguard Worker// INTO. 967*9880d681SAndroid Build Coastguard Workerdef WriteINTO : SchedWriteRes<[]> { 968*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 4; 969*9880d681SAndroid Build Coastguard Worker} 970*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteINTO], (instregex "INTO")>; 971*9880d681SAndroid Build Coastguard Worker 972*9880d681SAndroid Build Coastguard Worker//-- String instructions --// 973*9880d681SAndroid Build Coastguard Worker 974*9880d681SAndroid Build Coastguard Worker// LODSB/W. 975*9880d681SAndroid Build Coastguard Workerdef : InstRW<[Write2P0156_P23], (instregex "LODS(B|W)")>; 976*9880d681SAndroid Build Coastguard Worker 977*9880d681SAndroid Build Coastguard Worker// LODSD/Q. 978*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP0156_P23], (instregex "LODS(L|Q)")>; 979*9880d681SAndroid Build Coastguard Worker 980*9880d681SAndroid Build Coastguard Worker// STOS. 981*9880d681SAndroid Build Coastguard Workerdef WriteSTOS : SchedWriteRes<[HWPort23, HWPort0156, HWPort4]> { 982*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 983*9880d681SAndroid Build Coastguard Worker} 984*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteSTOS], (instregex "STOS(B|L|Q|W)")>; 985*9880d681SAndroid Build Coastguard Worker 986*9880d681SAndroid Build Coastguard Worker// MOVS. 987*9880d681SAndroid Build Coastguard Workerdef WriteMOVS : SchedWriteRes<[HWPort23, HWPort4, HWPort0156]> { 988*9880d681SAndroid Build Coastguard Worker let Latency = 4; 989*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 5; 990*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2, 1, 2]; 991*9880d681SAndroid Build Coastguard Worker} 992*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteMOVS], (instregex "MOVS(B|L|Q|W)")>; 993*9880d681SAndroid Build Coastguard Worker 994*9880d681SAndroid Build Coastguard Worker// SCAS. 995*9880d681SAndroid Build Coastguard Workerdef : InstRW<[Write2P0156_P23], (instregex "SCAS(B|W|L|Q)")>; 996*9880d681SAndroid Build Coastguard Worker 997*9880d681SAndroid Build Coastguard Worker// CMPS. 998*9880d681SAndroid Build Coastguard Workerdef WriteCMPS : SchedWriteRes<[HWPort23, HWPort0156]> { 999*9880d681SAndroid Build Coastguard Worker let Latency = 4; 1000*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 5; 1001*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2, 3]; 1002*9880d681SAndroid Build Coastguard Worker} 1003*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteCMPS], (instregex "CMPS(B|L|Q|W)")>; 1004*9880d681SAndroid Build Coastguard Worker 1005*9880d681SAndroid Build Coastguard Worker//-- Synchronization instructions --// 1006*9880d681SAndroid Build Coastguard Worker 1007*9880d681SAndroid Build Coastguard Worker// XADD. 1008*9880d681SAndroid Build Coastguard Workerdef WriteXADD : SchedWriteRes<[]> { 1009*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 5; 1010*9880d681SAndroid Build Coastguard Worker} 1011*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteXADD], (instregex "XADD(8|16|32|64)rm")>; 1012*9880d681SAndroid Build Coastguard Worker 1013*9880d681SAndroid Build Coastguard Worker// CMPXCHG. 1014*9880d681SAndroid Build Coastguard Workerdef WriteCMPXCHG : SchedWriteRes<[]> { 1015*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 6; 1016*9880d681SAndroid Build Coastguard Worker} 1017*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteCMPXCHG], (instregex "CMPXCHG(8|16|32|64)rm")>; 1018*9880d681SAndroid Build Coastguard Worker 1019*9880d681SAndroid Build Coastguard Worker// CMPXCHG8B. 1020*9880d681SAndroid Build Coastguard Workerdef WriteCMPXCHG8B : SchedWriteRes<[]> { 1021*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 15; 1022*9880d681SAndroid Build Coastguard Worker} 1023*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteCMPXCHG8B], (instregex "CMPXCHG8B")>; 1024*9880d681SAndroid Build Coastguard Worker 1025*9880d681SAndroid Build Coastguard Worker// CMPXCHG16B. 1026*9880d681SAndroid Build Coastguard Workerdef WriteCMPXCHG16B : SchedWriteRes<[]> { 1027*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 22; 1028*9880d681SAndroid Build Coastguard Worker} 1029*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteCMPXCHG16B], (instregex "CMPXCHG16B")>; 1030*9880d681SAndroid Build Coastguard Worker 1031*9880d681SAndroid Build Coastguard Worker//-- Other --// 1032*9880d681SAndroid Build Coastguard Worker 1033*9880d681SAndroid Build Coastguard Worker// PAUSE. 1034*9880d681SAndroid Build Coastguard Workerdef WritePAUSE : SchedWriteRes<[HWPort05, HWPort6]> { 1035*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 5; 1036*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 3]; 1037*9880d681SAndroid Build Coastguard Worker} 1038*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WritePAUSE], (instregex "PAUSE")>; 1039*9880d681SAndroid Build Coastguard Worker 1040*9880d681SAndroid Build Coastguard Worker// LEAVE. 1041*9880d681SAndroid Build Coastguard Workerdef : InstRW<[Write2P0156_P23], (instregex "LEAVE")>; 1042*9880d681SAndroid Build Coastguard Worker 1043*9880d681SAndroid Build Coastguard Worker// XGETBV. 1044*9880d681SAndroid Build Coastguard Workerdef WriteXGETBV : SchedWriteRes<[]> { 1045*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 8; 1046*9880d681SAndroid Build Coastguard Worker} 1047*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteXGETBV], (instregex "XGETBV")>; 1048*9880d681SAndroid Build Coastguard Worker 1049*9880d681SAndroid Build Coastguard Worker// RDTSC. 1050*9880d681SAndroid Build Coastguard Workerdef WriteRDTSC : SchedWriteRes<[]> { 1051*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 15; 1052*9880d681SAndroid Build Coastguard Worker} 1053*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteRDTSC], (instregex "RDTSC")>; 1054*9880d681SAndroid Build Coastguard Worker 1055*9880d681SAndroid Build Coastguard Worker// RDPMC. 1056*9880d681SAndroid Build Coastguard Workerdef WriteRDPMC : SchedWriteRes<[]> { 1057*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 34; 1058*9880d681SAndroid Build Coastguard Worker} 1059*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteRDPMC], (instregex "RDPMC")>; 1060*9880d681SAndroid Build Coastguard Worker 1061*9880d681SAndroid Build Coastguard Worker// RDRAND. 1062*9880d681SAndroid Build Coastguard Workerdef WriteRDRAND : SchedWriteRes<[HWPort23, HWPort015]> { 1063*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 17; 1064*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 16]; 1065*9880d681SAndroid Build Coastguard Worker} 1066*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteRDRAND], (instregex "RDRAND(16|32|64)r")>; 1067*9880d681SAndroid Build Coastguard Worker 1068*9880d681SAndroid Build Coastguard Worker//=== Floating Point x87 Instructions ===// 1069*9880d681SAndroid Build Coastguard Worker//-- Move instructions --// 1070*9880d681SAndroid Build Coastguard Worker 1071*9880d681SAndroid Build Coastguard Worker// FLD. 1072*9880d681SAndroid Build Coastguard Worker// m80. 1073*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP01], (instregex "LD_Frr")>; 1074*9880d681SAndroid Build Coastguard Worker 1075*9880d681SAndroid Build Coastguard Workerdef WriteLD_F80m : SchedWriteRes<[HWPort01, HWPort23]> { 1076*9880d681SAndroid Build Coastguard Worker let Latency = 4; 1077*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 4; 1078*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2, 2]; 1079*9880d681SAndroid Build Coastguard Worker} 1080*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteLD_F80m], (instregex "LD_F80m")>; 1081*9880d681SAndroid Build Coastguard Worker 1082*9880d681SAndroid Build Coastguard Worker// FBLD. 1083*9880d681SAndroid Build Coastguard Worker// m80. 1084*9880d681SAndroid Build Coastguard Workerdef WriteFBLD : SchedWriteRes<[]> { 1085*9880d681SAndroid Build Coastguard Worker let Latency = 47; 1086*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 43; 1087*9880d681SAndroid Build Coastguard Worker} 1088*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteFBLD], (instregex "FBLDm")>; 1089*9880d681SAndroid Build Coastguard Worker 1090*9880d681SAndroid Build Coastguard Worker// FST(P). 1091*9880d681SAndroid Build Coastguard Worker// r. 1092*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP01], (instregex "ST_(F|FP)rr")>; 1093*9880d681SAndroid Build Coastguard Worker 1094*9880d681SAndroid Build Coastguard Worker// m80. 1095*9880d681SAndroid Build Coastguard Workerdef WriteST_FP80m : SchedWriteRes<[HWPort0156, HWPort23, HWPort4]> { 1096*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 7; 1097*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [3, 2, 2]; 1098*9880d681SAndroid Build Coastguard Worker} 1099*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteST_FP80m], (instregex "ST_FP80m")>; 1100*9880d681SAndroid Build Coastguard Worker 1101*9880d681SAndroid Build Coastguard Worker// FBSTP. 1102*9880d681SAndroid Build Coastguard Worker// m80. 1103*9880d681SAndroid Build Coastguard Workerdef WriteFBSTP : SchedWriteRes<[]> { 1104*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 226; 1105*9880d681SAndroid Build Coastguard Worker} 1106*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteFBSTP], (instregex "FBSTPm")>; 1107*9880d681SAndroid Build Coastguard Worker 1108*9880d681SAndroid Build Coastguard Worker// FXCHG. 1109*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteNop], (instregex "XCH_F")>; 1110*9880d681SAndroid Build Coastguard Worker 1111*9880d681SAndroid Build Coastguard Worker// FILD. 1112*9880d681SAndroid Build Coastguard Workerdef WriteFILD : SchedWriteRes<[HWPort01, HWPort23]> { 1113*9880d681SAndroid Build Coastguard Worker let Latency = 6; 1114*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 1115*9880d681SAndroid Build Coastguard Worker} 1116*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteFILD], (instregex "ILD_F(16|32|64)m")>; 1117*9880d681SAndroid Build Coastguard Worker 1118*9880d681SAndroid Build Coastguard Worker// FIST(P) FISTTP. 1119*9880d681SAndroid Build Coastguard Workerdef WriteFIST : SchedWriteRes<[HWPort1, HWPort23, HWPort4]> { 1120*9880d681SAndroid Build Coastguard Worker let Latency = 7; 1121*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 1122*9880d681SAndroid Build Coastguard Worker} 1123*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteFIST], (instregex "IST_(F|FP)(16|32)m")>; 1124*9880d681SAndroid Build Coastguard Worker 1125*9880d681SAndroid Build Coastguard Worker// FLDZ. 1126*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP01], (instregex "LD_F0")>; 1127*9880d681SAndroid Build Coastguard Worker 1128*9880d681SAndroid Build Coastguard Worker// FLD1. 1129*9880d681SAndroid Build Coastguard Workerdef : InstRW<[Write2P01], (instregex "LD_F1")>; 1130*9880d681SAndroid Build Coastguard Worker 1131*9880d681SAndroid Build Coastguard Worker// FLDPI FLDL2E etc. 1132*9880d681SAndroid Build Coastguard Workerdef : InstRW<[Write2P01], (instregex "FLDPI", "FLDL2(T|E)" "FLDL(G|N)2")>; 1133*9880d681SAndroid Build Coastguard Worker 1134*9880d681SAndroid Build Coastguard Worker// FCMOVcc. 1135*9880d681SAndroid Build Coastguard Workerdef WriteFCMOVcc : SchedWriteRes<[HWPort0, HWPort5]> { 1136*9880d681SAndroid Build Coastguard Worker let Latency = 2; 1137*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 1138*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2, 1]; 1139*9880d681SAndroid Build Coastguard Worker} 1140*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteFCMOVcc], (instregex "CMOV(B|BE|P|NB|NBE|NE|NP)_F")>; 1141*9880d681SAndroid Build Coastguard Worker 1142*9880d681SAndroid Build Coastguard Worker// FNSTSW. 1143*9880d681SAndroid Build Coastguard Worker// AX. 1144*9880d681SAndroid Build Coastguard Workerdef WriteFNSTSW : SchedWriteRes<[HWPort0, HWPort0156]> { 1145*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 1146*9880d681SAndroid Build Coastguard Worker} 1147*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteFNSTSW], (instregex "FNSTSW16r")>; 1148*9880d681SAndroid Build Coastguard Worker 1149*9880d681SAndroid Build Coastguard Worker// m16. 1150*9880d681SAndroid Build Coastguard Workerdef WriteFNSTSWm : SchedWriteRes<[HWPort0, HWPort4, HWPort237]> { 1151*9880d681SAndroid Build Coastguard Worker let Latency = 6; 1152*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 1153*9880d681SAndroid Build Coastguard Worker} 1154*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteFNSTSWm], (instregex "FNSTSWm")>; 1155*9880d681SAndroid Build Coastguard Worker 1156*9880d681SAndroid Build Coastguard Worker// FLDCW. 1157*9880d681SAndroid Build Coastguard Workerdef WriteFLDCW : SchedWriteRes<[HWPort01, HWPort23, HWPort6]> { 1158*9880d681SAndroid Build Coastguard Worker let Latency = 7; 1159*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 1160*9880d681SAndroid Build Coastguard Worker} 1161*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteFLDCW], (instregex "FLDCW16m")>; 1162*9880d681SAndroid Build Coastguard Worker 1163*9880d681SAndroid Build Coastguard Worker// FNSTCW. 1164*9880d681SAndroid Build Coastguard Workerdef WriteFNSTCW : SchedWriteRes<[HWPort237, HWPort4, HWPort6]> { 1165*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 1166*9880d681SAndroid Build Coastguard Worker} 1167*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteFNSTCW], (instregex "FNSTCW16m")>; 1168*9880d681SAndroid Build Coastguard Worker 1169*9880d681SAndroid Build Coastguard Worker// FINCSTP FDECSTP. 1170*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP01], (instregex "FINCSTP", "FDECSTP")>; 1171*9880d681SAndroid Build Coastguard Worker 1172*9880d681SAndroid Build Coastguard Worker// FFREE. 1173*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP01], (instregex "FFREE")>; 1174*9880d681SAndroid Build Coastguard Worker 1175*9880d681SAndroid Build Coastguard Worker// FNSAVE. 1176*9880d681SAndroid Build Coastguard Workerdef WriteFNSAVE : SchedWriteRes<[]> { 1177*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 147; 1178*9880d681SAndroid Build Coastguard Worker} 1179*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteFNSAVE], (instregex "FSAVEm")>; 1180*9880d681SAndroid Build Coastguard Worker 1181*9880d681SAndroid Build Coastguard Worker// FRSTOR. 1182*9880d681SAndroid Build Coastguard Workerdef WriteFRSTOR : SchedWriteRes<[]> { 1183*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 90; 1184*9880d681SAndroid Build Coastguard Worker} 1185*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteFRSTOR], (instregex "FRSTORm")>; 1186*9880d681SAndroid Build Coastguard Worker 1187*9880d681SAndroid Build Coastguard Worker//-- Arithmetic instructions --// 1188*9880d681SAndroid Build Coastguard Worker 1189*9880d681SAndroid Build Coastguard Worker// FABS. 1190*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP0], (instregex "ABS_F")>; 1191*9880d681SAndroid Build Coastguard Worker 1192*9880d681SAndroid Build Coastguard Worker// FCHS. 1193*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP0], (instregex "CHS_F")>; 1194*9880d681SAndroid Build Coastguard Worker 1195*9880d681SAndroid Build Coastguard Worker// FCOM(P) FUCOM(P). 1196*9880d681SAndroid Build Coastguard Worker// r. 1197*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP1], (instregex "COM_FST0r", "COMP_FST0r", "UCOM_Fr", 1198*9880d681SAndroid Build Coastguard Worker "UCOM_FPr")>; 1199*9880d681SAndroid Build Coastguard Worker// m. 1200*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP1_P23], (instregex "FCOM(32|64)m", "FCOMP(32|64)m")>; 1201*9880d681SAndroid Build Coastguard Worker 1202*9880d681SAndroid Build Coastguard Worker// FCOMPP FUCOMPP. 1203*9880d681SAndroid Build Coastguard Worker// r. 1204*9880d681SAndroid Build Coastguard Workerdef : InstRW<[Write2P01], (instregex "FCOMPP", "UCOM_FPPr")>; 1205*9880d681SAndroid Build Coastguard Worker 1206*9880d681SAndroid Build Coastguard Worker// FCOMI(P) FUCOMI(P). 1207*9880d681SAndroid Build Coastguard Worker// m. 1208*9880d681SAndroid Build Coastguard Workerdef : InstRW<[Write3P01], (instregex "COM_FIr", "COM_FIPr", "UCOM_FIr", 1209*9880d681SAndroid Build Coastguard Worker "UCOM_FIPr")>; 1210*9880d681SAndroid Build Coastguard Worker 1211*9880d681SAndroid Build Coastguard Worker// FICOM(P). 1212*9880d681SAndroid Build Coastguard Workerdef : InstRW<[Write2P1_P23], (instregex "FICOM(16|32)m", "FICOMP(16|32)m")>; 1213*9880d681SAndroid Build Coastguard Worker 1214*9880d681SAndroid Build Coastguard Worker// FTST. 1215*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP1], (instregex "TST_F")>; 1216*9880d681SAndroid Build Coastguard Worker 1217*9880d681SAndroid Build Coastguard Worker// FXAM. 1218*9880d681SAndroid Build Coastguard Workerdef : InstRW<[Write2P1], (instregex "FXAM")>; 1219*9880d681SAndroid Build Coastguard Worker 1220*9880d681SAndroid Build Coastguard Worker// FPREM. 1221*9880d681SAndroid Build Coastguard Workerdef WriteFPREM : SchedWriteRes<[]> { 1222*9880d681SAndroid Build Coastguard Worker let Latency = 19; 1223*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 28; 1224*9880d681SAndroid Build Coastguard Worker} 1225*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteFPREM], (instregex "FPREM")>; 1226*9880d681SAndroid Build Coastguard Worker 1227*9880d681SAndroid Build Coastguard Worker// FPREM1. 1228*9880d681SAndroid Build Coastguard Workerdef WriteFPREM1 : SchedWriteRes<[]> { 1229*9880d681SAndroid Build Coastguard Worker let Latency = 27; 1230*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 41; 1231*9880d681SAndroid Build Coastguard Worker} 1232*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteFPREM1], (instregex "FPREM1")>; 1233*9880d681SAndroid Build Coastguard Worker 1234*9880d681SAndroid Build Coastguard Worker// FRNDINT. 1235*9880d681SAndroid Build Coastguard Workerdef WriteFRNDINT : SchedWriteRes<[]> { 1236*9880d681SAndroid Build Coastguard Worker let Latency = 11; 1237*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 17; 1238*9880d681SAndroid Build Coastguard Worker} 1239*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteFRNDINT], (instregex "FRNDINT")>; 1240*9880d681SAndroid Build Coastguard Worker 1241*9880d681SAndroid Build Coastguard Worker//-- Math instructions --// 1242*9880d681SAndroid Build Coastguard Worker 1243*9880d681SAndroid Build Coastguard Worker// FSCALE. 1244*9880d681SAndroid Build Coastguard Workerdef WriteFSCALE : SchedWriteRes<[]> { 1245*9880d681SAndroid Build Coastguard Worker let Latency = 75; // 49-125 1246*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 50; // 25-75 1247*9880d681SAndroid Build Coastguard Worker} 1248*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteFSCALE], (instregex "FSCALE")>; 1249*9880d681SAndroid Build Coastguard Worker 1250*9880d681SAndroid Build Coastguard Worker// FXTRACT. 1251*9880d681SAndroid Build Coastguard Workerdef WriteFXTRACT : SchedWriteRes<[]> { 1252*9880d681SAndroid Build Coastguard Worker let Latency = 15; 1253*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 17; 1254*9880d681SAndroid Build Coastguard Worker} 1255*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteFXTRACT], (instregex "FXTRACT")>; 1256*9880d681SAndroid Build Coastguard Worker 1257*9880d681SAndroid Build Coastguard Worker//-- Other instructions --// 1258*9880d681SAndroid Build Coastguard Worker 1259*9880d681SAndroid Build Coastguard Worker// FNOP. 1260*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP01], (instregex "FNOP")>; 1261*9880d681SAndroid Build Coastguard Worker 1262*9880d681SAndroid Build Coastguard Worker// WAIT. 1263*9880d681SAndroid Build Coastguard Workerdef : InstRW<[Write2P01], (instregex "WAIT")>; 1264*9880d681SAndroid Build Coastguard Worker 1265*9880d681SAndroid Build Coastguard Worker// FNCLEX. 1266*9880d681SAndroid Build Coastguard Workerdef : InstRW<[Write5P0156], (instregex "FNCLEX")>; 1267*9880d681SAndroid Build Coastguard Worker 1268*9880d681SAndroid Build Coastguard Worker// FNINIT. 1269*9880d681SAndroid Build Coastguard Workerdef WriteFNINIT : SchedWriteRes<[]> { 1270*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 26; 1271*9880d681SAndroid Build Coastguard Worker} 1272*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteFNINIT], (instregex "FNINIT")>; 1273*9880d681SAndroid Build Coastguard Worker 1274*9880d681SAndroid Build Coastguard Worker//=== Integer MMX and XMM Instructions ===// 1275*9880d681SAndroid Build Coastguard Worker//-- Move instructions --// 1276*9880d681SAndroid Build Coastguard Worker 1277*9880d681SAndroid Build Coastguard Worker// MOVD. 1278*9880d681SAndroid Build Coastguard Worker// r32/64 <- (x)mm. 1279*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP0], (instregex "MMX_MOVD64grr", "MMX_MOVD64from64rr", 1280*9880d681SAndroid Build Coastguard Worker "VMOVPDI2DIrr", "MOVPDI2DIrr")>; 1281*9880d681SAndroid Build Coastguard Worker 1282*9880d681SAndroid Build Coastguard Worker// (x)mm <- r32/64. 1283*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP5], (instregex "MMX_MOVD64rr", "MMX_MOVD64to64rr", 1284*9880d681SAndroid Build Coastguard Worker "VMOVDI2PDIrr", "MOVDI2PDIrr")>; 1285*9880d681SAndroid Build Coastguard Worker 1286*9880d681SAndroid Build Coastguard Worker// MOVQ. 1287*9880d681SAndroid Build Coastguard Worker// r64 <- (x)mm. 1288*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP0], (instregex "VMOVPQIto64rr")>; 1289*9880d681SAndroid Build Coastguard Worker 1290*9880d681SAndroid Build Coastguard Worker// (x)mm <- r64. 1291*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP5], (instregex "VMOV64toPQIrr", "VMOVZQI2PQIrr")>; 1292*9880d681SAndroid Build Coastguard Worker 1293*9880d681SAndroid Build Coastguard Worker// (x)mm <- (x)mm. 1294*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP015], (instregex "MMX_MOVQ64rr")>; 1295*9880d681SAndroid Build Coastguard Worker 1296*9880d681SAndroid Build Coastguard Worker// (V)MOVDQA/U. 1297*9880d681SAndroid Build Coastguard Worker// x <- x. 1298*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP015], (instregex "MOVDQ(A|U)rr", "VMOVDQ(A|U)rr", 1299*9880d681SAndroid Build Coastguard Worker "MOVDQ(A|U)rr_REV", "VMOVDQ(A|U)rr_REV", 1300*9880d681SAndroid Build Coastguard Worker "VMOVDQ(A|U)Yrr", "VMOVDQ(A|U)Yrr_REV")>; 1301*9880d681SAndroid Build Coastguard Worker 1302*9880d681SAndroid Build Coastguard Worker// MOVDQ2Q. 1303*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP01_P5], (instregex "MMX_MOVDQ2Qrr")>; 1304*9880d681SAndroid Build Coastguard Worker 1305*9880d681SAndroid Build Coastguard Worker// MOVQ2DQ. 1306*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP015], (instregex "MMX_MOVQ2DQrr")>; 1307*9880d681SAndroid Build Coastguard Worker 1308*9880d681SAndroid Build Coastguard Worker 1309*9880d681SAndroid Build Coastguard Worker// PACKSSWB/DW. 1310*9880d681SAndroid Build Coastguard Worker// mm <- mm. 1311*9880d681SAndroid Build Coastguard Workerdef WriteMMXPACKSSrr : SchedWriteRes<[HWPort5]> { 1312*9880d681SAndroid Build Coastguard Worker let Latency = 2; 1313*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 1314*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [3]; 1315*9880d681SAndroid Build Coastguard Worker} 1316*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteMMXPACKSSrr], (instregex "MMX_PACKSSDWirr", 1317*9880d681SAndroid Build Coastguard Worker "MMX_PACKSSWBirr", "MMX_PACKUSWBirr")>; 1318*9880d681SAndroid Build Coastguard Worker 1319*9880d681SAndroid Build Coastguard Worker// mm <- m64. 1320*9880d681SAndroid Build Coastguard Workerdef WriteMMXPACKSSrm : SchedWriteRes<[HWPort23, HWPort5]> { 1321*9880d681SAndroid Build Coastguard Worker let Latency = 4; 1322*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 1323*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 3]; 1324*9880d681SAndroid Build Coastguard Worker} 1325*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteMMXPACKSSrm], (instregex "MMX_PACKSSDWirm", 1326*9880d681SAndroid Build Coastguard Worker "MMX_PACKSSWBirm", "MMX_PACKUSWBirm")>; 1327*9880d681SAndroid Build Coastguard Worker 1328*9880d681SAndroid Build Coastguard Worker// VPMOVSX/ZX BW BD BQ DW DQ. 1329*9880d681SAndroid Build Coastguard Worker// y <- x. 1330*9880d681SAndroid Build Coastguard Workerdef WriteVPMOVSX : SchedWriteRes<[HWPort5]> { 1331*9880d681SAndroid Build Coastguard Worker let Latency = 3; 1332*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 1; 1333*9880d681SAndroid Build Coastguard Worker} 1334*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVPMOVSX], (instregex "VPMOV(SX|ZX)(BW|BQ|DW|DQ)Yrr")>; 1335*9880d681SAndroid Build Coastguard Worker 1336*9880d681SAndroid Build Coastguard Worker// PBLENDW. 1337*9880d681SAndroid Build Coastguard Worker// x,x,i / v,v,v,i 1338*9880d681SAndroid Build Coastguard Workerdef WritePBLENDWr : SchedWriteRes<[HWPort5]>; 1339*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WritePBLENDWr], (instregex "(V?)PBLENDW(Y?)rri")>; 1340*9880d681SAndroid Build Coastguard Worker 1341*9880d681SAndroid Build Coastguard Worker// x,m,i / v,v,m,i 1342*9880d681SAndroid Build Coastguard Workerdef WritePBLENDWm : SchedWriteRes<[HWPort5, HWPort23]> { 1343*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 1344*9880d681SAndroid Build Coastguard Worker let Latency = 4; 1345*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1]; 1346*9880d681SAndroid Build Coastguard Worker} 1347*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WritePBLENDWm, ReadAfterLd], (instregex "(V?)PBLENDW(Y?)rmi")>; 1348*9880d681SAndroid Build Coastguard Worker 1349*9880d681SAndroid Build Coastguard Worker// VPBLENDD. 1350*9880d681SAndroid Build Coastguard Worker// v,v,v,i. 1351*9880d681SAndroid Build Coastguard Workerdef WriteVPBLENDDr : SchedWriteRes<[HWPort015]>; 1352*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVPBLENDDr], (instregex "VPBLENDD(Y?)rri")>; 1353*9880d681SAndroid Build Coastguard Worker 1354*9880d681SAndroid Build Coastguard Worker// v,v,m,i 1355*9880d681SAndroid Build Coastguard Workerdef WriteVPBLENDDm : SchedWriteRes<[HWPort015, HWPort23]> { 1356*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 1357*9880d681SAndroid Build Coastguard Worker let Latency = 4; 1358*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1]; 1359*9880d681SAndroid Build Coastguard Worker} 1360*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVPBLENDDm, ReadAfterLd], (instregex "VPBLENDD(Y?)rmi")>; 1361*9880d681SAndroid Build Coastguard Worker 1362*9880d681SAndroid Build Coastguard Worker// MASKMOVQ. 1363*9880d681SAndroid Build Coastguard Workerdef WriteMASKMOVQ : SchedWriteRes<[HWPort0, HWPort4, HWPort23]> { 1364*9880d681SAndroid Build Coastguard Worker let Latency = 13; 1365*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 4; 1366*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1, 2]; 1367*9880d681SAndroid Build Coastguard Worker} 1368*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteMASKMOVQ], (instregex "MMX_MASKMOVQ(64)?")>; 1369*9880d681SAndroid Build Coastguard Worker 1370*9880d681SAndroid Build Coastguard Worker// MASKMOVDQU. 1371*9880d681SAndroid Build Coastguard Workerdef WriteMASKMOVDQU : SchedWriteRes<[HWPort04, HWPort56, HWPort23]> { 1372*9880d681SAndroid Build Coastguard Worker let Latency = 14; 1373*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 10; 1374*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [4, 2, 4]; 1375*9880d681SAndroid Build Coastguard Worker} 1376*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteMASKMOVDQU], (instregex "(V?)MASKMOVDQU(64)?")>; 1377*9880d681SAndroid Build Coastguard Worker 1378*9880d681SAndroid Build Coastguard Worker// VPMASKMOV D/Q. 1379*9880d681SAndroid Build Coastguard Worker// v,v,m. 1380*9880d681SAndroid Build Coastguard Workerdef WriteVPMASKMOVr : SchedWriteRes<[HWPort5, HWPort23]> { 1381*9880d681SAndroid Build Coastguard Worker let Latency = 4; 1382*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 1383*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2, 1]; 1384*9880d681SAndroid Build Coastguard Worker} 1385*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVPMASKMOVr, ReadAfterLd], 1386*9880d681SAndroid Build Coastguard Worker (instregex "VPMASKMOV(D|Q)(Y?)rm")>; 1387*9880d681SAndroid Build Coastguard Worker 1388*9880d681SAndroid Build Coastguard Worker// m, v,v. 1389*9880d681SAndroid Build Coastguard Workerdef WriteVPMASKMOVm : SchedWriteRes<[HWPort0, HWPort1, HWPort4, HWPort23]> { 1390*9880d681SAndroid Build Coastguard Worker let Latency = 13; 1391*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 4; 1392*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1, 1, 1]; 1393*9880d681SAndroid Build Coastguard Worker} 1394*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVPMASKMOVm], (instregex "VPMASKMOV(D|Q)(Y?)mr")>; 1395*9880d681SAndroid Build Coastguard Worker 1396*9880d681SAndroid Build Coastguard Worker// PMOVMSKB. 1397*9880d681SAndroid Build Coastguard Workerdef WritePMOVMSKB : SchedWriteRes<[HWPort0]> { 1398*9880d681SAndroid Build Coastguard Worker let Latency = 3; 1399*9880d681SAndroid Build Coastguard Worker} 1400*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WritePMOVMSKB], (instregex "(V|MMX_)?PMOVMSKB(Y?)rr")>; 1401*9880d681SAndroid Build Coastguard Worker 1402*9880d681SAndroid Build Coastguard Worker// PEXTR B/W/D/Q. 1403*9880d681SAndroid Build Coastguard Worker// r32,x,i. 1404*9880d681SAndroid Build Coastguard Workerdef WritePEXTRr : SchedWriteRes<[HWPort0, HWPort5]> { 1405*9880d681SAndroid Build Coastguard Worker let Latency = 2; 1406*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 1407*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1]; 1408*9880d681SAndroid Build Coastguard Worker} 1409*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WritePEXTRr], (instregex "PEXTR(B|W|D|Q)rr", "MMX_PEXTRWirri")>; 1410*9880d681SAndroid Build Coastguard Worker 1411*9880d681SAndroid Build Coastguard Worker// m8,x,i. 1412*9880d681SAndroid Build Coastguard Workerdef WritePEXTRm : SchedWriteRes<[HWPort23, HWPort4, HWPort5]> { 1413*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 1414*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1, 1]; 1415*9880d681SAndroid Build Coastguard Worker} 1416*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WritePEXTRm], (instregex "PEXTR(B|W|D|Q)mr")>; 1417*9880d681SAndroid Build Coastguard Worker 1418*9880d681SAndroid Build Coastguard Worker// VPBROADCAST B/W. 1419*9880d681SAndroid Build Coastguard Worker// x, m8/16. 1420*9880d681SAndroid Build Coastguard Workerdef WriteVPBROADCAST128Ld : SchedWriteRes<[HWPort01, HWPort23, HWPort5]> { 1421*9880d681SAndroid Build Coastguard Worker let Latency = 5; 1422*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 1423*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1, 1]; 1424*9880d681SAndroid Build Coastguard Worker} 1425*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVPBROADCAST128Ld, ReadAfterLd], 1426*9880d681SAndroid Build Coastguard Worker (instregex "VPBROADCAST(B|W)rm")>; 1427*9880d681SAndroid Build Coastguard Worker 1428*9880d681SAndroid Build Coastguard Worker// y, m8/16 1429*9880d681SAndroid Build Coastguard Workerdef WriteVPBROADCAST256Ld : SchedWriteRes<[HWPort01, HWPort23, HWPort5]> { 1430*9880d681SAndroid Build Coastguard Worker let Latency = 7; 1431*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 1432*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1, 1]; 1433*9880d681SAndroid Build Coastguard Worker} 1434*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVPBROADCAST256Ld, ReadAfterLd], 1435*9880d681SAndroid Build Coastguard Worker (instregex "VPBROADCAST(B|W)Yrm")>; 1436*9880d681SAndroid Build Coastguard Worker 1437*9880d681SAndroid Build Coastguard Worker// VPGATHERDD. 1438*9880d681SAndroid Build Coastguard Worker// x. 1439*9880d681SAndroid Build Coastguard Workerdef WriteVPGATHERDD128 : SchedWriteRes<[]> { 1440*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 20; 1441*9880d681SAndroid Build Coastguard Worker} 1442*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVPGATHERDD128, ReadAfterLd], (instregex "VPGATHERDDrm")>; 1443*9880d681SAndroid Build Coastguard Worker 1444*9880d681SAndroid Build Coastguard Worker// y. 1445*9880d681SAndroid Build Coastguard Workerdef WriteVPGATHERDD256 : SchedWriteRes<[]> { 1446*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 34; 1447*9880d681SAndroid Build Coastguard Worker} 1448*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVPGATHERDD256, ReadAfterLd], (instregex "VPGATHERDDYrm")>; 1449*9880d681SAndroid Build Coastguard Worker 1450*9880d681SAndroid Build Coastguard Worker// VPGATHERQD. 1451*9880d681SAndroid Build Coastguard Worker// x. 1452*9880d681SAndroid Build Coastguard Workerdef WriteVPGATHERQD128 : SchedWriteRes<[]> { 1453*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 15; 1454*9880d681SAndroid Build Coastguard Worker} 1455*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVPGATHERQD128, ReadAfterLd], (instregex "VPGATHERQDrm")>; 1456*9880d681SAndroid Build Coastguard Worker 1457*9880d681SAndroid Build Coastguard Worker// y. 1458*9880d681SAndroid Build Coastguard Workerdef WriteVPGATHERQD256 : SchedWriteRes<[]> { 1459*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 22; 1460*9880d681SAndroid Build Coastguard Worker} 1461*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVPGATHERQD256, ReadAfterLd], (instregex "VPGATHERQDYrm")>; 1462*9880d681SAndroid Build Coastguard Worker 1463*9880d681SAndroid Build Coastguard Worker// VPGATHERDQ. 1464*9880d681SAndroid Build Coastguard Worker// x. 1465*9880d681SAndroid Build Coastguard Workerdef WriteVPGATHERDQ128 : SchedWriteRes<[]> { 1466*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 12; 1467*9880d681SAndroid Build Coastguard Worker} 1468*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVPGATHERDQ128, ReadAfterLd], (instregex "VPGATHERDQrm")>; 1469*9880d681SAndroid Build Coastguard Worker 1470*9880d681SAndroid Build Coastguard Worker// y. 1471*9880d681SAndroid Build Coastguard Workerdef WriteVPGATHERDQ256 : SchedWriteRes<[]> { 1472*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 20; 1473*9880d681SAndroid Build Coastguard Worker} 1474*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVPGATHERDQ256, ReadAfterLd], (instregex "VPGATHERDQYrm")>; 1475*9880d681SAndroid Build Coastguard Worker 1476*9880d681SAndroid Build Coastguard Worker// VPGATHERQQ. 1477*9880d681SAndroid Build Coastguard Worker// x. 1478*9880d681SAndroid Build Coastguard Workerdef WriteVPGATHERQQ128 : SchedWriteRes<[]> { 1479*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 14; 1480*9880d681SAndroid Build Coastguard Worker} 1481*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVPGATHERQQ128, ReadAfterLd], (instregex "VPGATHERQQrm")>; 1482*9880d681SAndroid Build Coastguard Worker 1483*9880d681SAndroid Build Coastguard Worker// y. 1484*9880d681SAndroid Build Coastguard Workerdef WriteVPGATHERQQ256 : SchedWriteRes<[]> { 1485*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 22; 1486*9880d681SAndroid Build Coastguard Worker} 1487*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVPGATHERQQ256, ReadAfterLd], (instregex "VPGATHERQQYrm")>; 1488*9880d681SAndroid Build Coastguard Worker 1489*9880d681SAndroid Build Coastguard Worker//-- Arithmetic instructions --// 1490*9880d681SAndroid Build Coastguard Worker 1491*9880d681SAndroid Build Coastguard Worker// PHADD|PHSUB (S) W/D. 1492*9880d681SAndroid Build Coastguard Worker// v <- v,v. 1493*9880d681SAndroid Build Coastguard Workerdef WritePHADDSUBr : SchedWriteRes<[HWPort1, HWPort5]> { 1494*9880d681SAndroid Build Coastguard Worker let Latency = 3; 1495*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 1496*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 2]; 1497*9880d681SAndroid Build Coastguard Worker} 1498*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WritePHADDSUBr], (instregex "MMX_PHADD(W?)rr64", 1499*9880d681SAndroid Build Coastguard Worker "MMX_PHADDSWrr64", 1500*9880d681SAndroid Build Coastguard Worker "MMX_PHSUB(W|D)rr64", 1501*9880d681SAndroid Build Coastguard Worker "MMX_PHSUBSWrr64", 1502*9880d681SAndroid Build Coastguard Worker "(V?)PH(ADD|SUB)(W|D)(Y?)rr", 1503*9880d681SAndroid Build Coastguard Worker "(V?)PH(ADD|SUB)SWrr(256)?")>; 1504*9880d681SAndroid Build Coastguard Worker 1505*9880d681SAndroid Build Coastguard Worker// v <- v,m. 1506*9880d681SAndroid Build Coastguard Workerdef WritePHADDSUBm : SchedWriteRes<[HWPort1, HWPort5, HWPort23]> { 1507*9880d681SAndroid Build Coastguard Worker let Latency = 6; 1508*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 1509*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 2, 1]; 1510*9880d681SAndroid Build Coastguard Worker} 1511*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WritePHADDSUBm, ReadAfterLd], 1512*9880d681SAndroid Build Coastguard Worker (instregex "MMX_PHADD(W?)rm64", 1513*9880d681SAndroid Build Coastguard Worker "MMX_PHADDSWrm64", 1514*9880d681SAndroid Build Coastguard Worker "MMX_PHSUB(W|D)rm64", 1515*9880d681SAndroid Build Coastguard Worker "MMX_PHSUBSWrm64", 1516*9880d681SAndroid Build Coastguard Worker "(V?)PH(ADD|SUB)(W|D)(Y?)rm", 1517*9880d681SAndroid Build Coastguard Worker "(V?)PH(ADD|SUB)SWrm(128|256)?")>; 1518*9880d681SAndroid Build Coastguard Worker 1519*9880d681SAndroid Build Coastguard Worker// PCMPGTQ. 1520*9880d681SAndroid Build Coastguard Worker// v <- v,v. 1521*9880d681SAndroid Build Coastguard Workerdef WritePCMPGTQr : SchedWriteRes<[HWPort0]> { 1522*9880d681SAndroid Build Coastguard Worker let Latency = 5; 1523*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 1; 1524*9880d681SAndroid Build Coastguard Worker} 1525*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WritePCMPGTQr], (instregex "(V?)PCMPGTQ(Y?)rr")>; 1526*9880d681SAndroid Build Coastguard Worker 1527*9880d681SAndroid Build Coastguard Worker// v <- v,m. 1528*9880d681SAndroid Build Coastguard Workerdef WritePCMPGTQm : SchedWriteRes<[HWPort0, HWPort23]> { 1529*9880d681SAndroid Build Coastguard Worker let Latency = 5; 1530*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 1531*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1]; 1532*9880d681SAndroid Build Coastguard Worker} 1533*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WritePCMPGTQm, ReadAfterLd], (instregex "(V?)PCMPGTQ(Y?)rm")>; 1534*9880d681SAndroid Build Coastguard Worker 1535*9880d681SAndroid Build Coastguard Worker// PMULLD. 1536*9880d681SAndroid Build Coastguard Worker// x,x / y,y,y. 1537*9880d681SAndroid Build Coastguard Workerdef WritePMULLDr : SchedWriteRes<[HWPort0]> { 1538*9880d681SAndroid Build Coastguard Worker let Latency = 10; 1539*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 1540*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2]; 1541*9880d681SAndroid Build Coastguard Worker} 1542*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WritePMULLDr], (instregex "(V?)PMULLD(Y?)rr")>; 1543*9880d681SAndroid Build Coastguard Worker 1544*9880d681SAndroid Build Coastguard Worker// x,m / y,y,m. 1545*9880d681SAndroid Build Coastguard Workerdef WritePMULLDm : SchedWriteRes<[HWPort0, HWPort23]> { 1546*9880d681SAndroid Build Coastguard Worker let Latency = 10; 1547*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 1548*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2, 1]; 1549*9880d681SAndroid Build Coastguard Worker} 1550*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WritePMULLDm, ReadAfterLd], (instregex "(V?)PMULLD(Y?)rm")>; 1551*9880d681SAndroid Build Coastguard Worker 1552*9880d681SAndroid Build Coastguard Worker//-- Logic instructions --// 1553*9880d681SAndroid Build Coastguard Worker 1554*9880d681SAndroid Build Coastguard Worker// PTEST. 1555*9880d681SAndroid Build Coastguard Worker// v,v. 1556*9880d681SAndroid Build Coastguard Workerdef WritePTESTr : SchedWriteRes<[HWPort0, HWPort5]> { 1557*9880d681SAndroid Build Coastguard Worker let Latency = 2; 1558*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 1559*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1]; 1560*9880d681SAndroid Build Coastguard Worker} 1561*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WritePTESTr], (instregex "(V?)PTEST(Y?)rr")>; 1562*9880d681SAndroid Build Coastguard Worker 1563*9880d681SAndroid Build Coastguard Worker// v,m. 1564*9880d681SAndroid Build Coastguard Workerdef WritePTESTm : SchedWriteRes<[HWPort0, HWPort5, HWPort23]> { 1565*9880d681SAndroid Build Coastguard Worker let Latency = 6; 1566*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 1567*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1, 1]; 1568*9880d681SAndroid Build Coastguard Worker} 1569*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WritePTESTr], (instregex "(V?)PTEST(Y?)rm")>; 1570*9880d681SAndroid Build Coastguard Worker 1571*9880d681SAndroid Build Coastguard Worker// PSLL,PSRL,PSRA W/D/Q. 1572*9880d681SAndroid Build Coastguard Worker// x,x / v,v,x. 1573*9880d681SAndroid Build Coastguard Workerdef WritePShift : SchedWriteRes<[HWPort0, HWPort5]> { 1574*9880d681SAndroid Build Coastguard Worker let Latency = 2; 1575*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 1576*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1]; 1577*9880d681SAndroid Build Coastguard Worker} 1578*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WritePShift], (instregex "(V?)PS(LL|RL|RA)(W|D|Q)(Y?)rr")>; 1579*9880d681SAndroid Build Coastguard Worker 1580*9880d681SAndroid Build Coastguard Worker// PSLL,PSRL DQ. 1581*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP5], (instregex "(V?)PS(R|L)LDQ(Y?)ri")>; 1582*9880d681SAndroid Build Coastguard Worker 1583*9880d681SAndroid Build Coastguard Worker//-- Other --// 1584*9880d681SAndroid Build Coastguard Worker 1585*9880d681SAndroid Build Coastguard Worker// EMMS. 1586*9880d681SAndroid Build Coastguard Workerdef WriteEMMS : SchedWriteRes<[]> { 1587*9880d681SAndroid Build Coastguard Worker let Latency = 13; 1588*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 31; 1589*9880d681SAndroid Build Coastguard Worker} 1590*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteEMMS], (instregex "MMX_EMMS")>; 1591*9880d681SAndroid Build Coastguard Worker 1592*9880d681SAndroid Build Coastguard Worker//=== Floating Point XMM and YMM Instructions ===// 1593*9880d681SAndroid Build Coastguard Worker//-- Move instructions --// 1594*9880d681SAndroid Build Coastguard Worker 1595*9880d681SAndroid Build Coastguard Worker// MOVMSKP S/D. 1596*9880d681SAndroid Build Coastguard Worker// r32 <- x. 1597*9880d681SAndroid Build Coastguard Workerdef WriteMOVMSKPr : SchedWriteRes<[HWPort0]> { 1598*9880d681SAndroid Build Coastguard Worker let Latency = 3; 1599*9880d681SAndroid Build Coastguard Worker} 1600*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteMOVMSKPr], (instregex "(V?)MOVMSKP(S|D)rr")>; 1601*9880d681SAndroid Build Coastguard Worker 1602*9880d681SAndroid Build Coastguard Worker// r32 <- y. 1603*9880d681SAndroid Build Coastguard Workerdef WriteVMOVMSKPYr : SchedWriteRes<[HWPort0]> { 1604*9880d681SAndroid Build Coastguard Worker let Latency = 2; 1605*9880d681SAndroid Build Coastguard Worker} 1606*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVMOVMSKPYr], (instregex "VMOVMSKP(S|D)Yrr")>; 1607*9880d681SAndroid Build Coastguard Worker 1608*9880d681SAndroid Build Coastguard Worker// VPERM2F128. 1609*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteFShuffle256], (instregex "VPERM2F128rr")>; 1610*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteFShuffle256Ld, ReadAfterLd], (instregex "VPERM2F128rm")>; 1611*9880d681SAndroid Build Coastguard Worker 1612*9880d681SAndroid Build Coastguard Worker// BLENDVP S/D. 1613*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteFVarBlend], (instregex "BLENDVP(S|D)rr0")>; 1614*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteFVarBlendLd, ReadAfterLd], (instregex "BLENDVP(S|D)rm0")>; 1615*9880d681SAndroid Build Coastguard Worker 1616*9880d681SAndroid Build Coastguard Worker// VBROADCASTF128. 1617*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteLoad], (instregex "VBROADCASTF128")>; 1618*9880d681SAndroid Build Coastguard Worker 1619*9880d681SAndroid Build Coastguard Worker// EXTRACTPS. 1620*9880d681SAndroid Build Coastguard Worker// r32,x,i. 1621*9880d681SAndroid Build Coastguard Workerdef WriteEXTRACTPSr : SchedWriteRes<[HWPort0, HWPort5]> { 1622*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 1623*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1]; 1624*9880d681SAndroid Build Coastguard Worker} 1625*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteEXTRACTPSr], (instregex "(V?)EXTRACTPSrr")>; 1626*9880d681SAndroid Build Coastguard Worker 1627*9880d681SAndroid Build Coastguard Worker// m32,x,i. 1628*9880d681SAndroid Build Coastguard Workerdef WriteEXTRACTPSm : SchedWriteRes<[HWPort0, HWPort5, HWPort23]> { 1629*9880d681SAndroid Build Coastguard Worker let Latency = 4; 1630*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 1631*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1, 1]; 1632*9880d681SAndroid Build Coastguard Worker} 1633*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteEXTRACTPSm], (instregex "(V?)EXTRACTPSmr")>; 1634*9880d681SAndroid Build Coastguard Worker 1635*9880d681SAndroid Build Coastguard Worker// VEXTRACTF128. 1636*9880d681SAndroid Build Coastguard Worker// x,y,i. 1637*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteFShuffle256], (instregex "VEXTRACTF128rr")>; 1638*9880d681SAndroid Build Coastguard Worker 1639*9880d681SAndroid Build Coastguard Worker// m128,y,i. 1640*9880d681SAndroid Build Coastguard Workerdef WriteVEXTRACTF128m : SchedWriteRes<[HWPort23, HWPort4]> { 1641*9880d681SAndroid Build Coastguard Worker let Latency = 4; 1642*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 1643*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1]; 1644*9880d681SAndroid Build Coastguard Worker} 1645*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVEXTRACTF128m], (instregex "VEXTRACTF128mr")>; 1646*9880d681SAndroid Build Coastguard Worker 1647*9880d681SAndroid Build Coastguard Worker// VINSERTF128. 1648*9880d681SAndroid Build Coastguard Worker// y,y,x,i. 1649*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteFShuffle256], (instregex "VINSERTF128rr")>; 1650*9880d681SAndroid Build Coastguard Worker 1651*9880d681SAndroid Build Coastguard Worker// y,y,m128,i. 1652*9880d681SAndroid Build Coastguard Workerdef WriteVINSERTF128m : SchedWriteRes<[HWPort015, HWPort23]> { 1653*9880d681SAndroid Build Coastguard Worker let Latency = 4; 1654*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 1655*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1]; 1656*9880d681SAndroid Build Coastguard Worker} 1657*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteFShuffle256, ReadAfterLd], (instregex "VINSERTF128rm")>; 1658*9880d681SAndroid Build Coastguard Worker 1659*9880d681SAndroid Build Coastguard Worker// VMASKMOVP S/D. 1660*9880d681SAndroid Build Coastguard Worker// v,v,m. 1661*9880d681SAndroid Build Coastguard Workerdef WriteVMASKMOVPrm : SchedWriteRes<[HWPort5, HWPort23]> { 1662*9880d681SAndroid Build Coastguard Worker let Latency = 4; 1663*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 1664*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2, 1]; 1665*9880d681SAndroid Build Coastguard Worker} 1666*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVMASKMOVPrm], (instregex "VMASKMOVP(S|D)(Y?)rm")>; 1667*9880d681SAndroid Build Coastguard Worker 1668*9880d681SAndroid Build Coastguard Worker// m128,x,x. 1669*9880d681SAndroid Build Coastguard Workerdef WriteVMASKMOVPmr : SchedWriteRes<[HWPort0, HWPort1, HWPort4, HWPort23]> { 1670*9880d681SAndroid Build Coastguard Worker let Latency = 13; 1671*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 4; 1672*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1, 1, 1]; 1673*9880d681SAndroid Build Coastguard Worker} 1674*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVMASKMOVPmr], (instregex "VMASKMOVP(S|D)mr")>; 1675*9880d681SAndroid Build Coastguard Worker 1676*9880d681SAndroid Build Coastguard Worker// m256,y,y. 1677*9880d681SAndroid Build Coastguard Workerdef WriteVMASKMOVPYmr : SchedWriteRes<[HWPort0, HWPort1, HWPort4, HWPort23]> { 1678*9880d681SAndroid Build Coastguard Worker let Latency = 14; 1679*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 4; 1680*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1, 1, 1]; 1681*9880d681SAndroid Build Coastguard Worker} 1682*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVMASKMOVPYmr], (instregex "VMASKMOVP(S|D)Ymr")>; 1683*9880d681SAndroid Build Coastguard Worker 1684*9880d681SAndroid Build Coastguard Worker// VGATHERDPS. 1685*9880d681SAndroid Build Coastguard Worker// x. 1686*9880d681SAndroid Build Coastguard Workerdef WriteVGATHERDPS128 : SchedWriteRes<[]> { 1687*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 20; 1688*9880d681SAndroid Build Coastguard Worker} 1689*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVGATHERDPS128, ReadAfterLd], (instregex "VGATHERDPSrm")>; 1690*9880d681SAndroid Build Coastguard Worker 1691*9880d681SAndroid Build Coastguard Worker// y. 1692*9880d681SAndroid Build Coastguard Workerdef WriteVGATHERDPS256 : SchedWriteRes<[]> { 1693*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 34; 1694*9880d681SAndroid Build Coastguard Worker} 1695*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVGATHERDPS256, ReadAfterLd], (instregex "VGATHERDPSYrm")>; 1696*9880d681SAndroid Build Coastguard Worker 1697*9880d681SAndroid Build Coastguard Worker// VGATHERQPS. 1698*9880d681SAndroid Build Coastguard Worker// x. 1699*9880d681SAndroid Build Coastguard Workerdef WriteVGATHERQPS128 : SchedWriteRes<[]> { 1700*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 15; 1701*9880d681SAndroid Build Coastguard Worker} 1702*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVGATHERQPS128, ReadAfterLd], (instregex "VGATHERQPSrm")>; 1703*9880d681SAndroid Build Coastguard Worker 1704*9880d681SAndroid Build Coastguard Worker// y. 1705*9880d681SAndroid Build Coastguard Workerdef WriteVGATHERQPS256 : SchedWriteRes<[]> { 1706*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 22; 1707*9880d681SAndroid Build Coastguard Worker} 1708*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVGATHERQPS256, ReadAfterLd], (instregex "VGATHERQPSYrm")>; 1709*9880d681SAndroid Build Coastguard Worker 1710*9880d681SAndroid Build Coastguard Worker// VGATHERDPD. 1711*9880d681SAndroid Build Coastguard Worker// x. 1712*9880d681SAndroid Build Coastguard Workerdef WriteVGATHERDPD128 : SchedWriteRes<[]> { 1713*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 12; 1714*9880d681SAndroid Build Coastguard Worker} 1715*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVGATHERDPD128, ReadAfterLd], (instregex "VGATHERDPDrm")>; 1716*9880d681SAndroid Build Coastguard Worker 1717*9880d681SAndroid Build Coastguard Worker// y. 1718*9880d681SAndroid Build Coastguard Workerdef WriteVGATHERDPD256 : SchedWriteRes<[]> { 1719*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 20; 1720*9880d681SAndroid Build Coastguard Worker} 1721*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVGATHERDPD256, ReadAfterLd], (instregex "VGATHERDPDYrm")>; 1722*9880d681SAndroid Build Coastguard Worker 1723*9880d681SAndroid Build Coastguard Worker// VGATHERQPD. 1724*9880d681SAndroid Build Coastguard Worker// x. 1725*9880d681SAndroid Build Coastguard Workerdef WriteVGATHERQPD128 : SchedWriteRes<[]> { 1726*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 14; 1727*9880d681SAndroid Build Coastguard Worker} 1728*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVGATHERQPD128, ReadAfterLd], (instregex "VGATHERQPDrm")>; 1729*9880d681SAndroid Build Coastguard Worker 1730*9880d681SAndroid Build Coastguard Worker// y. 1731*9880d681SAndroid Build Coastguard Workerdef WriteVGATHERQPD256 : SchedWriteRes<[]> { 1732*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 22; 1733*9880d681SAndroid Build Coastguard Worker} 1734*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVGATHERQPD256, ReadAfterLd], (instregex "VGATHERQPDYrm")>; 1735*9880d681SAndroid Build Coastguard Worker 1736*9880d681SAndroid Build Coastguard Worker//-- Conversion instructions --// 1737*9880d681SAndroid Build Coastguard Worker 1738*9880d681SAndroid Build Coastguard Worker// CVTPD2PS. 1739*9880d681SAndroid Build Coastguard Worker// x,x. 1740*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP1_P5_Lat4], (instregex "(V?)CVTPD2PSrr")>; 1741*9880d681SAndroid Build Coastguard Worker 1742*9880d681SAndroid Build Coastguard Worker// x,m128. 1743*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP1_P5_Lat4Ld], (instregex "(V?)CVTPD2PS(X?)rm")>; 1744*9880d681SAndroid Build Coastguard Worker 1745*9880d681SAndroid Build Coastguard Worker// x,y. 1746*9880d681SAndroid Build Coastguard Workerdef WriteCVTPD2PSYrr : SchedWriteRes<[HWPort1, HWPort5]> { 1747*9880d681SAndroid Build Coastguard Worker let Latency = 5; 1748*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 1749*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1]; 1750*9880d681SAndroid Build Coastguard Worker} 1751*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteCVTPD2PSYrr], (instregex "(V?)CVTPD2PSYrr")>; 1752*9880d681SAndroid Build Coastguard Worker 1753*9880d681SAndroid Build Coastguard Worker// x,m256. 1754*9880d681SAndroid Build Coastguard Workerdef WriteCVTPD2PSYrm : SchedWriteRes<[HWPort1, HWPort5, HWPort23]> { 1755*9880d681SAndroid Build Coastguard Worker let Latency = 9; 1756*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 1757*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1, 1]; 1758*9880d681SAndroid Build Coastguard Worker} 1759*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteCVTPD2PSYrm], (instregex "(V?)CVTPD2PSYrm")>; 1760*9880d681SAndroid Build Coastguard Worker 1761*9880d681SAndroid Build Coastguard Worker// CVTSD2SS. 1762*9880d681SAndroid Build Coastguard Worker// x,x. 1763*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP1_P5_Lat4], (instregex "(Int_)?(V)?CVTSD2SSrr")>; 1764*9880d681SAndroid Build Coastguard Worker 1765*9880d681SAndroid Build Coastguard Worker// x,m64. 1766*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP1_P5_Lat4Ld], (instregex "(Int_)?(V)?CVTSD2SSrm")>; 1767*9880d681SAndroid Build Coastguard Worker 1768*9880d681SAndroid Build Coastguard Worker// CVTPS2PD. 1769*9880d681SAndroid Build Coastguard Worker// x,x. 1770*9880d681SAndroid Build Coastguard Workerdef WriteCVTPS2PDrr : SchedWriteRes<[HWPort0, HWPort5]> { 1771*9880d681SAndroid Build Coastguard Worker let Latency = 2; 1772*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 1773*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1]; 1774*9880d681SAndroid Build Coastguard Worker} 1775*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteCVTPS2PDrr], (instregex "(V?)CVTPS2PDrr")>; 1776*9880d681SAndroid Build Coastguard Worker 1777*9880d681SAndroid Build Coastguard Worker// x,m64. 1778*9880d681SAndroid Build Coastguard Worker// y,m128. 1779*9880d681SAndroid Build Coastguard Workerdef WriteCVTPS2PDrm : SchedWriteRes<[HWPort0, HWPort23]> { 1780*9880d681SAndroid Build Coastguard Worker let Latency = 5; 1781*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 1782*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1]; 1783*9880d681SAndroid Build Coastguard Worker} 1784*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteCVTPS2PDrm], (instregex "(V?)CVTPS2PD(Y?)rm")>; 1785*9880d681SAndroid Build Coastguard Worker 1786*9880d681SAndroid Build Coastguard Worker// y,x. 1787*9880d681SAndroid Build Coastguard Workerdef WriteVCVTPS2PDYrr : SchedWriteRes<[HWPort0, HWPort5]> { 1788*9880d681SAndroid Build Coastguard Worker let Latency = 5; 1789*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 1790*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1]; 1791*9880d681SAndroid Build Coastguard Worker} 1792*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVCVTPS2PDYrr], (instregex "VCVTPS2PDYrr")>; 1793*9880d681SAndroid Build Coastguard Worker 1794*9880d681SAndroid Build Coastguard Worker// CVTSS2SD. 1795*9880d681SAndroid Build Coastguard Worker// x,x. 1796*9880d681SAndroid Build Coastguard Workerdef WriteCVTSS2SDrr : SchedWriteRes<[HWPort0, HWPort5]> { 1797*9880d681SAndroid Build Coastguard Worker let Latency = 2; 1798*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 1799*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1]; 1800*9880d681SAndroid Build Coastguard Worker} 1801*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteCVTSS2SDrr], (instregex "(Int_)?(V?)CVTSS2SDrr")>; 1802*9880d681SAndroid Build Coastguard Worker 1803*9880d681SAndroid Build Coastguard Worker// x,m32. 1804*9880d681SAndroid Build Coastguard Workerdef WriteCVTSS2SDrm : SchedWriteRes<[HWPort0, HWPort23]> { 1805*9880d681SAndroid Build Coastguard Worker let Latency = 5; 1806*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 1807*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1]; 1808*9880d681SAndroid Build Coastguard Worker} 1809*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteCVTSS2SDrm], (instregex "(Int_)?(V?)CVTSS2SDrm")>; 1810*9880d681SAndroid Build Coastguard Worker 1811*9880d681SAndroid Build Coastguard Worker// CVTDQ2PD. 1812*9880d681SAndroid Build Coastguard Worker// x,x. 1813*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP1_P5_Lat4], (instregex "(V)?CVTDQ2PDrr")>; 1814*9880d681SAndroid Build Coastguard Worker 1815*9880d681SAndroid Build Coastguard Worker// y,x. 1816*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP1_P5_Lat6], (instregex "VCVTDQ2PDYrr")>; 1817*9880d681SAndroid Build Coastguard Worker 1818*9880d681SAndroid Build Coastguard Worker// CVT(T)PD2DQ. 1819*9880d681SAndroid Build Coastguard Worker// x,x. 1820*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP1_P5_Lat4], (instregex "(V?)CVT(T?)PD2DQrr")>; 1821*9880d681SAndroid Build Coastguard Worker// x,m128. 1822*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP1_P5_Lat4Ld], (instregex "(V?)CVT(T?)PD2DQrm")>; 1823*9880d681SAndroid Build Coastguard Worker// x,y. 1824*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP1_P5_Lat6], (instregex "VCVT(T?)PD2DQYrr")>; 1825*9880d681SAndroid Build Coastguard Worker// x,m256. 1826*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP1_P5_Lat6Ld], (instregex "VCVT(T?)PD2DQYrm")>; 1827*9880d681SAndroid Build Coastguard Worker 1828*9880d681SAndroid Build Coastguard Worker// CVT(T)PS2PI. 1829*9880d681SAndroid Build Coastguard Worker// mm,x. 1830*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP1_P5_Lat4], (instregex "MMX_CVT(T?)PS2PIirr")>; 1831*9880d681SAndroid Build Coastguard Worker 1832*9880d681SAndroid Build Coastguard Worker// CVTPI2PD. 1833*9880d681SAndroid Build Coastguard Worker// x,mm. 1834*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP1_P5_Lat4], (instregex "MMX_CVT(T?)PI2PDirr")>; 1835*9880d681SAndroid Build Coastguard Worker 1836*9880d681SAndroid Build Coastguard Worker// CVT(T)PD2PI. 1837*9880d681SAndroid Build Coastguard Worker// mm,x. 1838*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP1_P5_Lat4], (instregex "MMX_CVT(T?)PD2PIirr")>; 1839*9880d681SAndroid Build Coastguard Worker 1840*9880d681SAndroid Build Coastguard Worker// CVSTSI2SS. 1841*9880d681SAndroid Build Coastguard Worker// x,r32. 1842*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP1_P5_Lat4], (instregex "(Int_)?(V?)CVT(T?)SI2SS(64)?rr")>; 1843*9880d681SAndroid Build Coastguard Worker 1844*9880d681SAndroid Build Coastguard Worker// CVT(T)SS2SI. 1845*9880d681SAndroid Build Coastguard Worker// r32,x. 1846*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP0_P1_Lat4], (instregex "(Int_)?(V?)CVT(T?)SS2SI(64)?rr")>; 1847*9880d681SAndroid Build Coastguard Worker// r32,m32. 1848*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP0_P1_Lat4Ld], (instregex "(Int_)?(V?)CVT(T?)SS2SI(64)?rm")>; 1849*9880d681SAndroid Build Coastguard Worker 1850*9880d681SAndroid Build Coastguard Worker// CVTSI2SD. 1851*9880d681SAndroid Build Coastguard Worker// x,r32/64. 1852*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP0_P1_Lat4], (instregex "(Int_)?(V?)CVTSI2SS(64)?rr")>; 1853*9880d681SAndroid Build Coastguard Worker 1854*9880d681SAndroid Build Coastguard Worker// CVTSD2SI. 1855*9880d681SAndroid Build Coastguard Worker// r32/64 1856*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP0_P1_Lat4], (instregex "(Int_)?(V?)CVT(T?)SD2SI(64)?rr")>; 1857*9880d681SAndroid Build Coastguard Worker// r32,m32. 1858*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP0_P1_Lat4Ld], (instregex "(Int_)?(V?)CVT(T?)SD2SI(64)?rm")>; 1859*9880d681SAndroid Build Coastguard Worker 1860*9880d681SAndroid Build Coastguard Worker// VCVTPS2PH. 1861*9880d681SAndroid Build Coastguard Worker// x,v,i. 1862*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP1_P5_Lat4], (instregex "VCVTPS2PH(Y?)rr")>; 1863*9880d681SAndroid Build Coastguard Worker// m,v,i. 1864*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP1_P5_Lat4Ld, WriteRMW], (instregex "VCVTPS2PH(Y?)mr")>; 1865*9880d681SAndroid Build Coastguard Worker 1866*9880d681SAndroid Build Coastguard Worker// VCVTPH2PS. 1867*9880d681SAndroid Build Coastguard Worker// v,x. 1868*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP1_P5_Lat4], (instregex "VCVTPH2PS(Y?)rr")>; 1869*9880d681SAndroid Build Coastguard Worker 1870*9880d681SAndroid Build Coastguard Worker//-- Arithmetic instructions --// 1871*9880d681SAndroid Build Coastguard Worker 1872*9880d681SAndroid Build Coastguard Worker// HADD, HSUB PS/PD 1873*9880d681SAndroid Build Coastguard Worker// x,x / v,v,v. 1874*9880d681SAndroid Build Coastguard Workerdef WriteHADDSUBPr : SchedWriteRes<[HWPort1, HWPort5]> { 1875*9880d681SAndroid Build Coastguard Worker let Latency = 5; 1876*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 1877*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 2]; 1878*9880d681SAndroid Build Coastguard Worker} 1879*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteHADDSUBPr], (instregex "(V?)H(ADD|SUB)P(S|D)(Y?)rr")>; 1880*9880d681SAndroid Build Coastguard Worker 1881*9880d681SAndroid Build Coastguard Worker// x,m / v,v,m. 1882*9880d681SAndroid Build Coastguard Workerdef WriteHADDSUBPm : SchedWriteRes<[HWPort1, HWPort5, HWPort23]> { 1883*9880d681SAndroid Build Coastguard Worker let Latency = 9; 1884*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 4; 1885*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 2, 1]; 1886*9880d681SAndroid Build Coastguard Worker} 1887*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteHADDSUBPm], (instregex "(V?)H(ADD|SUB)P(S|D)(Y?)rm")>; 1888*9880d681SAndroid Build Coastguard Worker 1889*9880d681SAndroid Build Coastguard Worker// MULL SS/SD PS/PD. 1890*9880d681SAndroid Build Coastguard Worker// x,x / v,v,v. 1891*9880d681SAndroid Build Coastguard Workerdef WriteMULr : SchedWriteRes<[HWPort01]> { 1892*9880d681SAndroid Build Coastguard Worker let Latency = 5; 1893*9880d681SAndroid Build Coastguard Worker} 1894*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteMULr], (instregex "(V?)MUL(P|S)(S|D)rr")>; 1895*9880d681SAndroid Build Coastguard Worker 1896*9880d681SAndroid Build Coastguard Worker// x,m / v,v,m. 1897*9880d681SAndroid Build Coastguard Workerdef WriteMULm : SchedWriteRes<[HWPort01, HWPort23]> { 1898*9880d681SAndroid Build Coastguard Worker let Latency = 9; 1899*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 1900*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1]; 1901*9880d681SAndroid Build Coastguard Worker} 1902*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteMULm], (instregex "(V?)MUL(P|S)(S|D)rm")>; 1903*9880d681SAndroid Build Coastguard Worker 1904*9880d681SAndroid Build Coastguard Worker// VDIVPS. 1905*9880d681SAndroid Build Coastguard Worker// y,y,y. 1906*9880d681SAndroid Build Coastguard Workerdef WriteVDIVPSYrr : SchedWriteRes<[HWPort0, HWPort15]> { 1907*9880d681SAndroid Build Coastguard Worker let Latency = 19; // 18-21 cycles. 1908*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 1909*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2, 1]; 1910*9880d681SAndroid Build Coastguard Worker} 1911*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVDIVPSYrr], (instregex "VDIVPSYrr")>; 1912*9880d681SAndroid Build Coastguard Worker 1913*9880d681SAndroid Build Coastguard Worker// y,y,m256. 1914*9880d681SAndroid Build Coastguard Workerdef WriteVDIVPSYrm : SchedWriteRes<[HWPort0, HWPort15, HWPort23]> { 1915*9880d681SAndroid Build Coastguard Worker let Latency = 23; // 18-21 + 4 cycles. 1916*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 4; 1917*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2, 1, 1]; 1918*9880d681SAndroid Build Coastguard Worker} 1919*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVDIVPSYrm, ReadAfterLd], (instregex "VDIVPSYrm")>; 1920*9880d681SAndroid Build Coastguard Worker 1921*9880d681SAndroid Build Coastguard Worker// VDIVPD. 1922*9880d681SAndroid Build Coastguard Worker// y,y,y. 1923*9880d681SAndroid Build Coastguard Workerdef WriteVDIVPDYrr : SchedWriteRes<[HWPort0, HWPort15]> { 1924*9880d681SAndroid Build Coastguard Worker let Latency = 27; // 19-35 cycles. 1925*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 1926*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2, 1]; 1927*9880d681SAndroid Build Coastguard Worker} 1928*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVDIVPDYrr], (instregex "VDIVPDYrr")>; 1929*9880d681SAndroid Build Coastguard Worker 1930*9880d681SAndroid Build Coastguard Worker// y,y,m256. 1931*9880d681SAndroid Build Coastguard Workerdef WriteVDIVPDYrm : SchedWriteRes<[HWPort0, HWPort15, HWPort23]> { 1932*9880d681SAndroid Build Coastguard Worker let Latency = 31; // 19-35 + 4 cycles. 1933*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 4; 1934*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2, 1, 1]; 1935*9880d681SAndroid Build Coastguard Worker} 1936*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVDIVPDYrm, ReadAfterLd], (instregex "VDIVPDYrm")>; 1937*9880d681SAndroid Build Coastguard Worker 1938*9880d681SAndroid Build Coastguard Worker// VRCPPS. 1939*9880d681SAndroid Build Coastguard Worker// y,y. 1940*9880d681SAndroid Build Coastguard Workerdef WriteVRCPPSr : SchedWriteRes<[HWPort0, HWPort15]> { 1941*9880d681SAndroid Build Coastguard Worker let Latency = 7; 1942*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 1943*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2, 1]; 1944*9880d681SAndroid Build Coastguard Worker} 1945*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVRCPPSr], (instregex "VRCPPSYr(_Int)?")>; 1946*9880d681SAndroid Build Coastguard Worker 1947*9880d681SAndroid Build Coastguard Worker// y,m256. 1948*9880d681SAndroid Build Coastguard Workerdef WriteVRCPPSm : SchedWriteRes<[HWPort0, HWPort15, HWPort23]> { 1949*9880d681SAndroid Build Coastguard Worker let Latency = 11; 1950*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 4; 1951*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2, 1, 1]; 1952*9880d681SAndroid Build Coastguard Worker} 1953*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVRCPPSm], (instregex "VRCPPSYm(_Int)?")>; 1954*9880d681SAndroid Build Coastguard Worker 1955*9880d681SAndroid Build Coastguard Worker// ROUND SS/SD PS/PD. 1956*9880d681SAndroid Build Coastguard Worker// v,v,i. 1957*9880d681SAndroid Build Coastguard Workerdef WriteROUNDr : SchedWriteRes<[HWPort1]> { 1958*9880d681SAndroid Build Coastguard Worker let Latency = 6; 1959*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 1960*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2]; 1961*9880d681SAndroid Build Coastguard Worker} 1962*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteROUNDr], (instregex "(V?)ROUND(Y?)(S|P)(S|D)r(_Int)?")>; 1963*9880d681SAndroid Build Coastguard Worker 1964*9880d681SAndroid Build Coastguard Worker// v,m,i. 1965*9880d681SAndroid Build Coastguard Workerdef WriteROUNDm : SchedWriteRes<[HWPort1, HWPort23]> { 1966*9880d681SAndroid Build Coastguard Worker let Latency = 10; 1967*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 1968*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2, 1]; 1969*9880d681SAndroid Build Coastguard Worker} 1970*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteROUNDm], (instregex "(V?)ROUND(Y?)(S|P)(S|D)m(_Int)?")>; 1971*9880d681SAndroid Build Coastguard Worker 1972*9880d681SAndroid Build Coastguard Worker// DPPS. 1973*9880d681SAndroid Build Coastguard Worker// x,x,i / v,v,v,i. 1974*9880d681SAndroid Build Coastguard Workerdef WriteDPPSr : SchedWriteRes<[HWPort0, HWPort1, HWPort5]> { 1975*9880d681SAndroid Build Coastguard Worker let Latency = 14; 1976*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 4; 1977*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2, 1, 1]; 1978*9880d681SAndroid Build Coastguard Worker} 1979*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteDPPSr], (instregex "(V?)DPPS(Y?)rri")>; 1980*9880d681SAndroid Build Coastguard Worker 1981*9880d681SAndroid Build Coastguard Worker// x,m,i / v,v,m,i. 1982*9880d681SAndroid Build Coastguard Workerdef WriteDPPSm : SchedWriteRes<[HWPort0, HWPort1, HWPort5, HWPort23, HWPort6]> { 1983*9880d681SAndroid Build Coastguard Worker let Latency = 18; 1984*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 6; 1985*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2, 1, 1, 1, 1]; 1986*9880d681SAndroid Build Coastguard Worker} 1987*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteDPPSm, ReadAfterLd], (instregex "(V?)DPPS(Y?)rmi")>; 1988*9880d681SAndroid Build Coastguard Worker 1989*9880d681SAndroid Build Coastguard Worker// DPPD. 1990*9880d681SAndroid Build Coastguard Worker// x,x,i. 1991*9880d681SAndroid Build Coastguard Workerdef WriteDPPDr : SchedWriteRes<[HWPort0, HWPort1, HWPort5]> { 1992*9880d681SAndroid Build Coastguard Worker let Latency = 9; 1993*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 1994*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1, 1]; 1995*9880d681SAndroid Build Coastguard Worker} 1996*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteDPPDr], (instregex "(V?)DPPDrri")>; 1997*9880d681SAndroid Build Coastguard Worker 1998*9880d681SAndroid Build Coastguard Worker// x,m,i. 1999*9880d681SAndroid Build Coastguard Workerdef WriteDPPDm : SchedWriteRes<[HWPort0, HWPort1, HWPort5, HWPort23]> { 2000*9880d681SAndroid Build Coastguard Worker let Latency = 13; 2001*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 4; 2002*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1, 1, 1]; 2003*9880d681SAndroid Build Coastguard Worker} 2004*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteDPPDm], (instregex "(V?)DPPDrmi")>; 2005*9880d681SAndroid Build Coastguard Worker 2006*9880d681SAndroid Build Coastguard Worker// VFMADD. 2007*9880d681SAndroid Build Coastguard Worker// v,v,v. 2008*9880d681SAndroid Build Coastguard Workerdef WriteFMADDr : SchedWriteRes<[HWPort01]> { 2009*9880d681SAndroid Build Coastguard Worker let Latency = 5; 2010*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 1; 2011*9880d681SAndroid Build Coastguard Worker} 2012*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteFMADDr], 2013*9880d681SAndroid Build Coastguard Worker (instregex 2014*9880d681SAndroid Build Coastguard Worker // 3p forms. 2015*9880d681SAndroid Build Coastguard Worker "VF(N?)M(ADD|SUB|ADDSUB|SUBADD)P(S|D)(r213|r132|r231)r(Y)?", 2016*9880d681SAndroid Build Coastguard Worker // 3s forms. 2017*9880d681SAndroid Build Coastguard Worker "VF(N?)M(ADD|SUB)S(S|D)(r132|r231|r213)r", 2018*9880d681SAndroid Build Coastguard Worker // 4s/4s_int forms. 2019*9880d681SAndroid Build Coastguard Worker "VF(N?)M(ADD|SUB)S(S|D)4rr(_REV|_Int)?", 2020*9880d681SAndroid Build Coastguard Worker // 4p forms. 2021*9880d681SAndroid Build Coastguard Worker "VF(N?)M(ADD|SUB)P(S|D)4rr(Y)?(_REV)?")>; 2022*9880d681SAndroid Build Coastguard Worker 2023*9880d681SAndroid Build Coastguard Worker// v,v,m. 2024*9880d681SAndroid Build Coastguard Workerdef WriteFMADDm : SchedWriteRes<[HWPort01, HWPort23]> { 2025*9880d681SAndroid Build Coastguard Worker let Latency = 9; 2026*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 2027*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1]; 2028*9880d681SAndroid Build Coastguard Worker} 2029*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteFMADDm], 2030*9880d681SAndroid Build Coastguard Worker (instregex 2031*9880d681SAndroid Build Coastguard Worker // 3p forms. 2032*9880d681SAndroid Build Coastguard Worker "VF(N?)M(ADD|SUB|ADDSUB|SUBADD)P(S|D)(r213|r132|r231)m(Y)?", 2033*9880d681SAndroid Build Coastguard Worker // 3s forms. 2034*9880d681SAndroid Build Coastguard Worker "VF(N?)M(ADD|SUB)S(S|D)(r132|r231|r213)m", 2035*9880d681SAndroid Build Coastguard Worker // 4s/4s_int forms. 2036*9880d681SAndroid Build Coastguard Worker "VF(N?)M(ADD|SUB)S(S|D)4(rm|mr)(_Int)?", 2037*9880d681SAndroid Build Coastguard Worker // 4p forms. 2038*9880d681SAndroid Build Coastguard Worker "VF(N?)M(ADD|SUB)P(S|D)4(rm|mr)(Y)?")>; 2039*9880d681SAndroid Build Coastguard Worker 2040*9880d681SAndroid Build Coastguard Worker//-- Math instructions --// 2041*9880d681SAndroid Build Coastguard Worker 2042*9880d681SAndroid Build Coastguard Worker// VSQRTPS. 2043*9880d681SAndroid Build Coastguard Worker// y,y. 2044*9880d681SAndroid Build Coastguard Workerdef WriteVSQRTPSYr : SchedWriteRes<[HWPort0, HWPort15]> { 2045*9880d681SAndroid Build Coastguard Worker let Latency = 19; 2046*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 2047*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2, 1]; 2048*9880d681SAndroid Build Coastguard Worker} 2049*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVSQRTPSYr], (instregex "VSQRTPSYr")>; 2050*9880d681SAndroid Build Coastguard Worker 2051*9880d681SAndroid Build Coastguard Worker// y,m256. 2052*9880d681SAndroid Build Coastguard Workerdef WriteVSQRTPSYm : SchedWriteRes<[HWPort0, HWPort15, HWPort23]> { 2053*9880d681SAndroid Build Coastguard Worker let Latency = 23; 2054*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 4; 2055*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2, 1, 1]; 2056*9880d681SAndroid Build Coastguard Worker} 2057*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVSQRTPSYm], (instregex "VSQRTPSYm")>; 2058*9880d681SAndroid Build Coastguard Worker 2059*9880d681SAndroid Build Coastguard Worker// VSQRTPD. 2060*9880d681SAndroid Build Coastguard Worker// y,y. 2061*9880d681SAndroid Build Coastguard Workerdef WriteVSQRTPDYr : SchedWriteRes<[HWPort0, HWPort15]> { 2062*9880d681SAndroid Build Coastguard Worker let Latency = 28; 2063*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 2064*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2, 1]; 2065*9880d681SAndroid Build Coastguard Worker} 2066*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVSQRTPDYr], (instregex "VSQRTPDYr")>; 2067*9880d681SAndroid Build Coastguard Worker 2068*9880d681SAndroid Build Coastguard Worker// y,m256. 2069*9880d681SAndroid Build Coastguard Workerdef WriteVSQRTPDYm : SchedWriteRes<[HWPort0, HWPort15, HWPort23]> { 2070*9880d681SAndroid Build Coastguard Worker let Latency = 32; 2071*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 4; 2072*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2, 1, 1]; 2073*9880d681SAndroid Build Coastguard Worker} 2074*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVSQRTPDYm], (instregex "VSQRTPDYm")>; 2075*9880d681SAndroid Build Coastguard Worker 2076*9880d681SAndroid Build Coastguard Worker// RSQRT SS/PS. 2077*9880d681SAndroid Build Coastguard Worker// x,x. 2078*9880d681SAndroid Build Coastguard Workerdef WriteRSQRTr : SchedWriteRes<[HWPort0]> { 2079*9880d681SAndroid Build Coastguard Worker let Latency = 5; 2080*9880d681SAndroid Build Coastguard Worker} 2081*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteRSQRTr], (instregex "(V?)RSQRT(SS|PS)r(_Int)?")>; 2082*9880d681SAndroid Build Coastguard Worker 2083*9880d681SAndroid Build Coastguard Worker// x,m128. 2084*9880d681SAndroid Build Coastguard Workerdef WriteRSQRTm : SchedWriteRes<[HWPort0, HWPort23]> { 2085*9880d681SAndroid Build Coastguard Worker let Latency = 9; 2086*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 2087*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1]; 2088*9880d681SAndroid Build Coastguard Worker} 2089*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteRSQRTm], (instregex "(V?)RSQRT(SS|PS)m(_Int)?")>; 2090*9880d681SAndroid Build Coastguard Worker 2091*9880d681SAndroid Build Coastguard Worker// RSQRTPS 256. 2092*9880d681SAndroid Build Coastguard Worker// y,y. 2093*9880d681SAndroid Build Coastguard Workerdef WriteRSQRTPSYr : SchedWriteRes<[HWPort0, HWPort15]> { 2094*9880d681SAndroid Build Coastguard Worker let Latency = 7; 2095*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 2096*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2, 1]; 2097*9880d681SAndroid Build Coastguard Worker} 2098*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteRSQRTPSYr], (instregex "VRSQRTPSYr(_Int)?")>; 2099*9880d681SAndroid Build Coastguard Worker 2100*9880d681SAndroid Build Coastguard Worker// y,m256. 2101*9880d681SAndroid Build Coastguard Workerdef WriteRSQRTPSYm : SchedWriteRes<[HWPort0, HWPort15, HWPort23]> { 2102*9880d681SAndroid Build Coastguard Worker let Latency = 11; 2103*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 4; 2104*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2, 1, 1]; 2105*9880d681SAndroid Build Coastguard Worker} 2106*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteRSQRTPSYm], (instregex "VRSQRTPSYm(_Int)?")>; 2107*9880d681SAndroid Build Coastguard Worker 2108*9880d681SAndroid Build Coastguard Worker//-- Logic instructions --// 2109*9880d681SAndroid Build Coastguard Worker 2110*9880d681SAndroid Build Coastguard Worker// AND, ANDN, OR, XOR PS/PD. 2111*9880d681SAndroid Build Coastguard Worker// x,x / v,v,v. 2112*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP5], (instregex "(V?)(AND|ANDN|OR|XOR)P(S|D)(Y?)rr")>; 2113*9880d681SAndroid Build Coastguard Worker// x,m / v,v,m. 2114*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteP5Ld, ReadAfterLd], 2115*9880d681SAndroid Build Coastguard Worker (instregex "(V?)(AND|ANDN|OR|XOR)P(S|D)(Y?)rm")>; 2116*9880d681SAndroid Build Coastguard Worker 2117*9880d681SAndroid Build Coastguard Worker//-- Other instructions --// 2118*9880d681SAndroid Build Coastguard Worker 2119*9880d681SAndroid Build Coastguard Worker// VZEROUPPER. 2120*9880d681SAndroid Build Coastguard Workerdef WriteVZEROUPPER : SchedWriteRes<[]> { 2121*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 4; 2122*9880d681SAndroid Build Coastguard Worker} 2123*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVZEROUPPER], (instregex "VZEROUPPER")>; 2124*9880d681SAndroid Build Coastguard Worker 2125*9880d681SAndroid Build Coastguard Worker// VZEROALL. 2126*9880d681SAndroid Build Coastguard Workerdef WriteVZEROALL : SchedWriteRes<[]> { 2127*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 12; 2128*9880d681SAndroid Build Coastguard Worker} 2129*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteVZEROALL], (instregex "VZEROALL")>; 2130*9880d681SAndroid Build Coastguard Worker 2131*9880d681SAndroid Build Coastguard Worker// LDMXCSR. 2132*9880d681SAndroid Build Coastguard Workerdef WriteLDMXCSR : SchedWriteRes<[HWPort0, HWPort6, HWPort23]> { 2133*9880d681SAndroid Build Coastguard Worker let Latency = 6; 2134*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 2135*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1, 1]; 2136*9880d681SAndroid Build Coastguard Worker} 2137*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteLDMXCSR], (instregex "(V)?LDMXCSR")>; 2138*9880d681SAndroid Build Coastguard Worker 2139*9880d681SAndroid Build Coastguard Worker// STMXCSR. 2140*9880d681SAndroid Build Coastguard Workerdef WriteSTMXCSR : SchedWriteRes<[HWPort0, HWPort4, HWPort6, HWPort237]> { 2141*9880d681SAndroid Build Coastguard Worker let Latency = 7; 2142*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 4; 2143*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [1, 1, 1, 1]; 2144*9880d681SAndroid Build Coastguard Worker} 2145*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteSTMXCSR], (instregex "(V)?STMXCSR")>; 2146*9880d681SAndroid Build Coastguard Worker 2147*9880d681SAndroid Build Coastguard Worker} // SchedModel 2148