1349cc55cSDimitry Andric//=- X86SchedIceLake.td - X86 Ice Lake Scheduling ------------*- tablegen -*-=// 2349cc55cSDimitry Andric// 3349cc55cSDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4349cc55cSDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 5349cc55cSDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6349cc55cSDimitry Andric// 7349cc55cSDimitry Andric//===----------------------------------------------------------------------===// 8349cc55cSDimitry Andric// 9349cc55cSDimitry Andric// This file defines the machine model for Ice Lake to support 10349cc55cSDimitry Andric// instruction scheduling and other instruction cost heuristics. 11349cc55cSDimitry Andric// 12349cc55cSDimitry Andric// TODO: This is mainly a copy X86SchedSkylakeServer.td, but allows us to 13349cc55cSDimitry Andric// iteratively improve scheduling handling toward better modelling the 14349cc55cSDimitry Andric// Ice Lake (Sunny/Cypress Cove) microarchitecture. 15349cc55cSDimitry Andric// 16349cc55cSDimitry Andric//===----------------------------------------------------------------------===// 17349cc55cSDimitry Andric 18349cc55cSDimitry Andricdef IceLakeModel : SchedMachineModel { 19349cc55cSDimitry Andric // All x86 instructions are modeled as a single micro-op, and Ice Lake can 20349cc55cSDimitry Andric // decode 6 instructions per cycle. 21349cc55cSDimitry Andric let IssueWidth = 6; 2206c3fb27SDimitry Andric let MicroOpBufferSize = 352; // Based on the reorder buffer. 23349cc55cSDimitry Andric let LoadLatency = 5; 24349cc55cSDimitry Andric let MispredictPenalty = 14; 25349cc55cSDimitry Andric 26349cc55cSDimitry Andric // Based on the LSD (loop-stream detector) queue size and benchmarking data. 27349cc55cSDimitry Andric let LoopMicroOpBufferSize = 50; 28349cc55cSDimitry Andric 29349cc55cSDimitry Andric // This flag is set to allow the scheduler to assign a default model to 30349cc55cSDimitry Andric // unrecognized opcodes. 31349cc55cSDimitry Andric let CompleteModel = 0; 32349cc55cSDimitry Andric} 33349cc55cSDimitry Andric 34349cc55cSDimitry Andriclet SchedModel = IceLakeModel in { 35349cc55cSDimitry Andric 36349cc55cSDimitry Andric// Ice Lake can issue micro-ops to 8 different ports in one cycle. 37349cc55cSDimitry Andric 38349cc55cSDimitry Andric// Ports 0, 1, 5, and 6 handle all computation. 39349cc55cSDimitry Andric// Ports 4 and 9 gets the data half of stores. Store data can be available later 40349cc55cSDimitry Andric// than the store address, but since we don't model the latency of stores, we 41349cc55cSDimitry Andric// can ignore that. 42349cc55cSDimitry Andric// Ports 2 and 3 are identical. They handle loads and address calculations. 43349cc55cSDimitry Andric// Ports 7 and 8 are identical. They handle stores address calculations. 44349cc55cSDimitry Andricdef ICXPort0 : ProcResource<1>; 45349cc55cSDimitry Andricdef ICXPort1 : ProcResource<1>; 46349cc55cSDimitry Andricdef ICXPort2 : ProcResource<1>; 47349cc55cSDimitry Andricdef ICXPort3 : ProcResource<1>; 48349cc55cSDimitry Andricdef ICXPort4 : ProcResource<1>; 49349cc55cSDimitry Andricdef ICXPort5 : ProcResource<1>; 50349cc55cSDimitry Andricdef ICXPort6 : ProcResource<1>; 51349cc55cSDimitry Andricdef ICXPort7 : ProcResource<1>; 52349cc55cSDimitry Andricdef ICXPort8 : ProcResource<1>; 53349cc55cSDimitry Andricdef ICXPort9 : ProcResource<1>; 54349cc55cSDimitry Andric 55349cc55cSDimitry Andric// Many micro-ops are capable of issuing on multiple ports. 56349cc55cSDimitry Andricdef ICXPort01 : ProcResGroup<[ICXPort0, ICXPort1]>; 57349cc55cSDimitry Andricdef ICXPort23 : ProcResGroup<[ICXPort2, ICXPort3]>; 58349cc55cSDimitry Andricdef ICXPort04 : ProcResGroup<[ICXPort0, ICXPort4]>; 59349cc55cSDimitry Andricdef ICXPort05 : ProcResGroup<[ICXPort0, ICXPort5]>; 60349cc55cSDimitry Andricdef ICXPort06 : ProcResGroup<[ICXPort0, ICXPort6]>; 61349cc55cSDimitry Andricdef ICXPort15 : ProcResGroup<[ICXPort1, ICXPort5]>; 62349cc55cSDimitry Andricdef ICXPort16 : ProcResGroup<[ICXPort1, ICXPort6]>; 63349cc55cSDimitry Andricdef ICXPort49 : ProcResGroup<[ICXPort4, ICXPort9]>; 64349cc55cSDimitry Andricdef ICXPort56 : ProcResGroup<[ICXPort5, ICXPort6]>; 65349cc55cSDimitry Andricdef ICXPort78 : ProcResGroup<[ICXPort7, ICXPort8]>; 66349cc55cSDimitry Andricdef ICXPort015 : ProcResGroup<[ICXPort0, ICXPort1, ICXPort5]>; 67349cc55cSDimitry Andricdef ICXPort056 : ProcResGroup<[ICXPort0, ICXPort5, ICXPort6]>; 68349cc55cSDimitry Andricdef ICXPort0156: ProcResGroup<[ICXPort0, ICXPort1, ICXPort5, ICXPort6]>; 69349cc55cSDimitry Andric 70349cc55cSDimitry Andricdef ICXDivider : ProcResource<1>; // Integer division issued on port 0. 71349cc55cSDimitry Andric// FP division and sqrt on port 0. 72349cc55cSDimitry Andricdef ICXFPDivider : ProcResource<1>; 73349cc55cSDimitry Andric 74349cc55cSDimitry Andric// 60 Entry Unified Scheduler 75349cc55cSDimitry Andricdef ICXPortAny : ProcResGroup<[ICXPort0, ICXPort1, ICXPort2, ICXPort3, ICXPort4, 76349cc55cSDimitry Andric ICXPort5, ICXPort6, ICXPort7, ICXPort8, ICXPort9]> { 77349cc55cSDimitry Andric let BufferSize=60; 78349cc55cSDimitry Andric} 79349cc55cSDimitry Andric 80349cc55cSDimitry Andric// Integer loads are 5 cycles, so ReadAfterLd registers needn't be available until 5 81349cc55cSDimitry Andric// cycles after the memory operand. 82349cc55cSDimitry Andricdef : ReadAdvance<ReadAfterLd, 5>; 83349cc55cSDimitry Andric 84349cc55cSDimitry Andric// Vector loads are 5/6/7 cycles, so ReadAfterVec*Ld registers needn't be available 85349cc55cSDimitry Andric// until 5/6/7 cycles after the memory operand. 86349cc55cSDimitry Andricdef : ReadAdvance<ReadAfterVecLd, 5>; 87349cc55cSDimitry Andricdef : ReadAdvance<ReadAfterVecXLd, 6>; 88349cc55cSDimitry Andricdef : ReadAdvance<ReadAfterVecYLd, 7>; 89349cc55cSDimitry Andric 90349cc55cSDimitry Andricdef : ReadAdvance<ReadInt2Fpu, 0>; 91349cc55cSDimitry Andric 92349cc55cSDimitry Andric// Many SchedWrites are defined in pairs with and without a folded load. 93349cc55cSDimitry Andric// Instructions with folded loads are usually micro-fused, so they only appear 94349cc55cSDimitry Andric// as two micro-ops when queued in the reservation station. 95349cc55cSDimitry Andric// This multiclass defines the resource usage for variants with and without 96349cc55cSDimitry Andric// folded loads. 97349cc55cSDimitry Andricmulticlass ICXWriteResPair<X86FoldableSchedWrite SchedRW, 98349cc55cSDimitry Andric list<ProcResourceKind> ExePorts, 99349cc55cSDimitry Andric int Lat, list<int> Res = [1], int UOps = 1, 100bdd1243dSDimitry Andric int LoadLat = 5, int LoadUOps = 1> { 101349cc55cSDimitry Andric // Register variant is using a single cycle on ExePort. 102349cc55cSDimitry Andric def : WriteRes<SchedRW, ExePorts> { 103349cc55cSDimitry Andric let Latency = Lat; 1045f757f3fSDimitry Andric let ReleaseAtCycles = Res; 105349cc55cSDimitry Andric let NumMicroOps = UOps; 106349cc55cSDimitry Andric } 107349cc55cSDimitry Andric 108349cc55cSDimitry Andric // Memory variant also uses a cycle on port 2/3 and adds LoadLat cycles to 109349cc55cSDimitry Andric // the latency (default = 5). 110349cc55cSDimitry Andric def : WriteRes<SchedRW.Folded, !listconcat([ICXPort23], ExePorts)> { 111349cc55cSDimitry Andric let Latency = !add(Lat, LoadLat); 1125f757f3fSDimitry Andric let ReleaseAtCycles = !listconcat([1], Res); 113bdd1243dSDimitry Andric let NumMicroOps = !add(UOps, LoadUOps); 114349cc55cSDimitry Andric } 115349cc55cSDimitry Andric} 116349cc55cSDimitry Andric 117349cc55cSDimitry Andric// A folded store needs a cycle on port 4 for the store data, and an extra port 118349cc55cSDimitry Andric// 2/3/7 cycle to recompute the address. 11906c3fb27SDimitry Andricdef : WriteRes<WriteRMW, [ICXPort78,ICXPort49]>; 120349cc55cSDimitry Andric 121349cc55cSDimitry Andric// Arithmetic. 122349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteALU, [ICXPort0156], 1>; // Simple integer ALU op. 123349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteADC, [ICXPort06], 1>; // Integer ALU + flags op. 124349cc55cSDimitry Andric 125349cc55cSDimitry Andric// Integer multiplication. 126349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteIMul8, [ICXPort1], 3>; 127349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteIMul16, [ICXPort1,ICXPort06,ICXPort0156], 4, [1,1,2], 4>; 128349cc55cSDimitry Andricdefm : X86WriteRes<WriteIMul16Imm, [ICXPort1,ICXPort0156], 4, [1,1], 2>; 129349cc55cSDimitry Andricdefm : X86WriteRes<WriteIMul16ImmLd, [ICXPort1,ICXPort0156,ICXPort23], 8, [1,1,1], 3>; 130349cc55cSDimitry Andricdefm : X86WriteRes<WriteIMul16Reg, [ICXPort1], 3, [1], 1>; 131349cc55cSDimitry Andricdefm : X86WriteRes<WriteIMul16RegLd, [ICXPort1,ICXPort0156,ICXPort23], 8, [1,1,1], 3>; 132349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteIMul32, [ICXPort1,ICXPort06,ICXPort0156], 4, [1,1,1], 3>; 133349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteMULX32, [ICXPort1,ICXPort06,ICXPort0156], 3, [1,1,1], 3>; 134349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteIMul32Imm, [ICXPort1], 3>; 135349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteIMul32Reg, [ICXPort1], 3>; 136349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteIMul64, [ICXPort1,ICXPort5], 4, [1,1], 2>; 137349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteMULX64, [ICXPort1,ICXPort5], 3, [1,1], 2>; 138349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteIMul64Imm, [ICXPort1], 3>; 139349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteIMul64Reg, [ICXPort1], 3>; 140349cc55cSDimitry Andricdef ICXWriteIMulH : WriteRes<WriteIMulH, []> { let Latency = 4; } 141349cc55cSDimitry Andricdef : WriteRes<WriteIMulHLd, []> { 142349cc55cSDimitry Andric let Latency = !add(ICXWriteIMulH.Latency, SkylakeServerModel.LoadLatency); 143349cc55cSDimitry Andric} 144349cc55cSDimitry Andric 145349cc55cSDimitry Andricdefm : X86WriteRes<WriteBSWAP32, [ICXPort15], 1, [1], 1>; 146349cc55cSDimitry Andricdefm : X86WriteRes<WriteBSWAP64, [ICXPort06, ICXPort15], 2, [1,1], 2>; 147349cc55cSDimitry Andricdefm : X86WriteRes<WriteCMPXCHG,[ICXPort06, ICXPort0156], 5, [2,3], 5>; 14806c3fb27SDimitry Andricdefm : X86WriteRes<WriteCMPXCHGRMW,[ICXPort23,ICXPort06,ICXPort0156,ICXPort78,ICXPort49], 8, [1,2,1,1,1], 6>; 149349cc55cSDimitry Andricdefm : X86WriteRes<WriteXCHG, [ICXPort0156], 2, [3], 3>; 150349cc55cSDimitry Andric 151349cc55cSDimitry Andric// TODO: Why isn't the ICXDivider used? 152349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteDiv8, [ICXPort0, ICXDivider], 25, [1,10], 1, 4>; 153349cc55cSDimitry Andricdefm : X86WriteRes<WriteDiv16, [ICXPort0,ICXPort1,ICXPort5,ICXPort6,ICXPort05,ICXPort0156], 76, [7,2,8,3,1,11], 32>; 154349cc55cSDimitry Andricdefm : X86WriteRes<WriteDiv32, [ICXPort0,ICXPort1,ICXPort5,ICXPort6,ICXPort05,ICXPort0156], 76, [7,2,8,3,1,11], 32>; 155349cc55cSDimitry Andricdefm : X86WriteRes<WriteDiv64, [ICXPort0,ICXPort1,ICXPort5,ICXPort6,ICXPort05,ICXPort0156], 76, [7,2,8,3,1,11], 32>; 156349cc55cSDimitry Andricdefm : X86WriteRes<WriteDiv16Ld, [ICXPort0,ICXPort23,ICXDivider], 29, [1,1,10], 2>; 157349cc55cSDimitry Andricdefm : X86WriteRes<WriteDiv32Ld, [ICXPort0,ICXPort23,ICXDivider], 29, [1,1,10], 2>; 158349cc55cSDimitry Andricdefm : X86WriteRes<WriteDiv64Ld, [ICXPort0,ICXPort23,ICXDivider], 29, [1,1,10], 2>; 159349cc55cSDimitry Andric 160349cc55cSDimitry Andricdefm : X86WriteRes<WriteIDiv8, [ICXPort0, ICXDivider], 25, [1,10], 1>; 161349cc55cSDimitry Andricdefm : X86WriteRes<WriteIDiv16, [ICXPort0,ICXPort1,ICXPort5,ICXPort6,ICXPort06,ICXPort0156], 102, [4,2,4,8,14,34], 66>; 162349cc55cSDimitry Andricdefm : X86WriteRes<WriteIDiv32, [ICXPort0,ICXPort1,ICXPort5,ICXPort6,ICXPort06,ICXPort0156], 102, [4,2,4,8,14,34], 66>; 163349cc55cSDimitry Andricdefm : X86WriteRes<WriteIDiv64, [ICXPort0,ICXPort1,ICXPort5,ICXPort6,ICXPort06,ICXPort0156], 102, [4,2,4,8,14,34], 66>; 164349cc55cSDimitry Andricdefm : X86WriteRes<WriteIDiv8Ld, [ICXPort0,ICXPort5,ICXPort23,ICXPort0156], 28, [2,4,1,1], 8>; 165349cc55cSDimitry Andricdefm : X86WriteRes<WriteIDiv16Ld, [ICXPort0,ICXPort5,ICXPort23,ICXPort0156], 28, [2,4,1,1], 8>; 166349cc55cSDimitry Andricdefm : X86WriteRes<WriteIDiv32Ld, [ICXPort0,ICXPort5,ICXPort23,ICXPort0156], 28, [2,4,1,1], 8>; 167349cc55cSDimitry Andricdefm : X86WriteRes<WriteIDiv64Ld, [ICXPort0,ICXPort5,ICXPort23,ICXPort0156], 28, [2,4,1,1], 8>; 168349cc55cSDimitry Andric 169349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteCRC32, [ICXPort1], 3>; 170349cc55cSDimitry Andric 171349cc55cSDimitry Andricdef : WriteRes<WriteLEA, [ICXPort15]>; // LEA instructions can't fold loads. 172349cc55cSDimitry Andric 173349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteCMOV, [ICXPort06], 1, [1], 1>; // Conditional move. 174349cc55cSDimitry Andricdefm : X86WriteRes<WriteFCMOV, [ICXPort1], 3, [1], 1>; // x87 conditional move. 175349cc55cSDimitry Andricdef : WriteRes<WriteSETCC, [ICXPort06]>; // Setcc. 17606c3fb27SDimitry Andricdef : WriteRes<WriteSETCCStore, [ICXPort06,ICXPort49,ICXPort78]> { 177349cc55cSDimitry Andric let Latency = 2; 178349cc55cSDimitry Andric let NumMicroOps = 3; 179349cc55cSDimitry Andric} 180349cc55cSDimitry Andricdefm : X86WriteRes<WriteLAHFSAHF, [ICXPort06], 1, [1], 1>; 181349cc55cSDimitry Andricdefm : X86WriteRes<WriteBitTest, [ICXPort06], 1, [1], 1>; 182349cc55cSDimitry Andricdefm : X86WriteRes<WriteBitTestImmLd, [ICXPort06,ICXPort23], 6, [1,1], 2>; 183349cc55cSDimitry Andricdefm : X86WriteRes<WriteBitTestRegLd, [ICXPort0156,ICXPort23], 6, [1,1], 2>; 184349cc55cSDimitry Andricdefm : X86WriteRes<WriteBitTestSet, [ICXPort06], 1, [1], 1>; 185349cc55cSDimitry Andricdefm : X86WriteRes<WriteBitTestSetImmLd, [ICXPort06,ICXPort23], 5, [1,1], 3>; 186349cc55cSDimitry Andricdefm : X86WriteRes<WriteBitTestSetRegLd, [ICXPort0156,ICXPort23], 5, [1,1], 2>; 187349cc55cSDimitry Andric 188349cc55cSDimitry Andric// Integer shifts and rotates. 189349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteShift, [ICXPort06], 1>; 190349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteShiftCL, [ICXPort06], 3, [3], 3>; 191349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteRotate, [ICXPort06], 1, [1], 1>; 192349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteRotateCL, [ICXPort06], 3, [3], 3>; 193349cc55cSDimitry Andric 194349cc55cSDimitry Andric// SHLD/SHRD. 195349cc55cSDimitry Andricdefm : X86WriteRes<WriteSHDrri, [ICXPort1], 3, [1], 1>; 196349cc55cSDimitry Andricdefm : X86WriteRes<WriteSHDrrcl,[ICXPort1,ICXPort06,ICXPort0156], 6, [1, 2, 1], 4>; 19706c3fb27SDimitry Andricdefm : X86WriteRes<WriteSHDmri, [ICXPort1,ICXPort23,ICXPort78,ICXPort0156], 9, [1, 1, 1, 1], 4>; 19806c3fb27SDimitry Andricdefm : X86WriteRes<WriteSHDmrcl,[ICXPort1,ICXPort23,ICXPort78,ICXPort06,ICXPort0156], 11, [1, 1, 1, 2, 1], 6>; 199349cc55cSDimitry Andric 200349cc55cSDimitry Andric// Bit counts. 201349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteBSF, [ICXPort1], 3>; 202349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteBSR, [ICXPort1], 3>; 203349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteLZCNT, [ICXPort1], 3>; 204349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteTZCNT, [ICXPort1], 3>; 205349cc55cSDimitry Andricdefm : ICXWriteResPair<WritePOPCNT, [ICXPort1], 3>; 206349cc55cSDimitry Andric 207349cc55cSDimitry Andric// BMI1 BEXTR/BLS, BMI2 BZHI 208349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteBEXTR, [ICXPort06,ICXPort15], 2, [1,1], 2>; 209349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteBLS, [ICXPort15], 1>; 210349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteBZHI, [ICXPort15], 1>; 211349cc55cSDimitry Andric 212349cc55cSDimitry Andric// Loads, stores, and moves, not folded with other operations. 213349cc55cSDimitry Andricdefm : X86WriteRes<WriteLoad, [ICXPort23], 5, [1], 1>; 21406c3fb27SDimitry Andricdefm : X86WriteRes<WriteStore, [ICXPort78, ICXPort49], 1, [1,1], 1>; 21506c3fb27SDimitry Andricdefm : X86WriteRes<WriteStoreNT, [ICXPort78, ICXPort49], 1, [1,1], 2>; 216349cc55cSDimitry Andricdefm : X86WriteRes<WriteMove, [ICXPort0156], 1, [1], 1>; 217349cc55cSDimitry Andric 218349cc55cSDimitry Andric// Model the effect of clobbering the read-write mask operand of the GATHER operation. 219349cc55cSDimitry Andric// Does not cost anything by itself, only has latency, matching that of the WriteLoad, 220349cc55cSDimitry Andricdefm : X86WriteRes<WriteVecMaskedGatherWriteback, [], 5, [], 0>; 221349cc55cSDimitry Andric 222349cc55cSDimitry Andric// Idioms that clear a register, like xorps %xmm0, %xmm0. 223349cc55cSDimitry Andric// These can often bypass execution ports completely. 224349cc55cSDimitry Andricdef : WriteRes<WriteZero, []>; 225349cc55cSDimitry Andric 226349cc55cSDimitry Andric// Branches don't produce values, so they have no latency, but they still 227349cc55cSDimitry Andric// consume resources. Indirect branches can fold loads. 228349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteJump, [ICXPort06], 1>; 229349cc55cSDimitry Andric 230349cc55cSDimitry Andric// Floating point. This covers both scalar and vector operations. 231349cc55cSDimitry Andricdefm : X86WriteRes<WriteFLD0, [ICXPort05], 1, [1], 1>; 232349cc55cSDimitry Andricdefm : X86WriteRes<WriteFLD1, [ICXPort05], 1, [2], 2>; 233349cc55cSDimitry Andricdefm : X86WriteRes<WriteFLDC, [ICXPort05], 1, [2], 2>; 234349cc55cSDimitry Andricdefm : X86WriteRes<WriteFLoad, [ICXPort23], 5, [1], 1>; 235349cc55cSDimitry Andricdefm : X86WriteRes<WriteFLoadX, [ICXPort23], 6, [1], 1>; 236349cc55cSDimitry Andricdefm : X86WriteRes<WriteFLoadY, [ICXPort23], 7, [1], 1>; 237349cc55cSDimitry Andricdefm : X86WriteRes<WriteFMaskedLoad, [ICXPort23,ICXPort015], 7, [1,1], 2>; 238349cc55cSDimitry Andricdefm : X86WriteRes<WriteFMaskedLoadY, [ICXPort23,ICXPort015], 8, [1,1], 2>; 23906c3fb27SDimitry Andricdefm : X86WriteRes<WriteFStore, [ICXPort78,ICXPort49], 1, [1,1], 2>; 24006c3fb27SDimitry Andricdefm : X86WriteRes<WriteFStoreX, [ICXPort78,ICXPort49], 1, [1,1], 2>; 24106c3fb27SDimitry Andricdefm : X86WriteRes<WriteFStoreY, [ICXPort78,ICXPort49], 1, [1,1], 2>; 24206c3fb27SDimitry Andricdefm : X86WriteRes<WriteFStoreNT, [ICXPort78,ICXPort49], 1, [1,1], 2>; 24306c3fb27SDimitry Andricdefm : X86WriteRes<WriteFStoreNTX, [ICXPort78,ICXPort49], 1, [1,1], 2>; 24406c3fb27SDimitry Andricdefm : X86WriteRes<WriteFStoreNTY, [ICXPort78,ICXPort49], 1, [1,1], 2>; 245349cc55cSDimitry Andric 24606c3fb27SDimitry Andricdefm : X86WriteRes<WriteFMaskedStore32, [ICXPort78,ICXPort49,ICXPort0], 2, [1,1,1], 2>; 24706c3fb27SDimitry Andricdefm : X86WriteRes<WriteFMaskedStore32Y, [ICXPort78,ICXPort49,ICXPort0], 2, [1,1,1], 2>; 24806c3fb27SDimitry Andricdefm : X86WriteRes<WriteFMaskedStore64, [ICXPort78,ICXPort49,ICXPort0], 2, [1,1,1], 2>; 24906c3fb27SDimitry Andricdefm : X86WriteRes<WriteFMaskedStore64Y, [ICXPort78,ICXPort49,ICXPort0], 2, [1,1,1], 2>; 250349cc55cSDimitry Andric 251349cc55cSDimitry Andricdefm : X86WriteRes<WriteFMove, [ICXPort015], 1, [1], 1>; 252349cc55cSDimitry Andricdefm : X86WriteRes<WriteFMoveX, [ICXPort015], 1, [1], 1>; 253349cc55cSDimitry Andricdefm : X86WriteRes<WriteFMoveY, [ICXPort015], 1, [1], 1>; 25404eeddc0SDimitry Andricdefm : X86WriteRes<WriteFMoveZ, [ICXPort05], 1, [1], 1>; 255349cc55cSDimitry Andricdefm : X86WriteRes<WriteEMMS, [ICXPort05,ICXPort0156], 10, [9,1], 10>; 256349cc55cSDimitry Andric 257349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFAdd, [ICXPort01], 4, [1], 1, 5>; // Floating point add/sub. 258349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFAddX, [ICXPort01], 4, [1], 1, 6>; 259349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFAddY, [ICXPort01], 4, [1], 1, 7>; 2600fca6ea1SDimitry Andricdefm : ICXWriteResPair<WriteFAddZ, [ICXPort0], 4, [1], 1, 7>; 261349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFAdd64, [ICXPort01], 4, [1], 1, 5>; // Floating point double add/sub. 262349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFAdd64X, [ICXPort01], 4, [1], 1, 6>; 263349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFAdd64Y, [ICXPort01], 4, [1], 1, 7>; 2640fca6ea1SDimitry Andricdefm : ICXWriteResPair<WriteFAdd64Z, [ICXPort0], 4, [1], 1, 7>; 265349cc55cSDimitry Andric 266349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFCmp, [ICXPort01], 4, [1], 1, 5>; // Floating point compare. 267349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFCmpX, [ICXPort01], 4, [1], 1, 6>; 268349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFCmpY, [ICXPort01], 4, [1], 1, 7>; 269349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFCmpZ, [ICXPort05], 4, [1], 1, 7>; 270349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFCmp64, [ICXPort01], 4, [1], 1, 5>; // Floating point double compare. 271349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFCmp64X, [ICXPort01], 4, [1], 1, 6>; 272349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFCmp64Y, [ICXPort01], 4, [1], 1, 7>; 273349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFCmp64Z, [ICXPort05], 4, [1], 1, 7>; 274349cc55cSDimitry Andric 275349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFCom, [ICXPort0], 2>; // Floating point compare to flags (X87). 276349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFComX, [ICXPort0], 2>; // Floating point compare to flags (SSE). 277349cc55cSDimitry Andric 278349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFMul, [ICXPort01], 4, [1], 1, 5>; // Floating point multiplication. 279349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFMulX, [ICXPort01], 4, [1], 1, 6>; 280349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFMulY, [ICXPort01], 4, [1], 1, 7>; 2810fca6ea1SDimitry Andricdefm : ICXWriteResPair<WriteFMulZ, [ICXPort0], 4, [1], 1, 7>; 282349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFMul64, [ICXPort01], 4, [1], 1, 5>; // Floating point double multiplication. 283349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFMul64X, [ICXPort01], 4, [1], 1, 6>; 284349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFMul64Y, [ICXPort01], 4, [1], 1, 7>; 2850fca6ea1SDimitry Andricdefm : ICXWriteResPair<WriteFMul64Z, [ICXPort0], 4, [1], 1, 7>; 286349cc55cSDimitry Andric 287349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFDiv, [ICXPort0,ICXFPDivider], 11, [1,3], 1, 5>; // 10-14 cycles. // Floating point division. 288bdd1243dSDimitry Andricdefm : ICXWriteResPair<WriteFDivX, [ICXPort0,ICXFPDivider], 11, [1,3], 1, 6>; // 10-14 cycles. 289349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFDivY, [ICXPort0,ICXFPDivider], 11, [1,5], 1, 7>; // 10-14 cycles. 290349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFDivZ, [ICXPort0,ICXPort5,ICXFPDivider], 18, [2,1,10], 3, 7>; // 10-14 cycles. 291bdd1243dSDimitry Andricdefm : ICXWriteResPair<WriteFDiv64, [ICXPort0,ICXFPDivider], 14, [1,4], 1, 5>; // 10-14 cycles. // Floating point division. 292bdd1243dSDimitry Andricdefm : ICXWriteResPair<WriteFDiv64X, [ICXPort0,ICXFPDivider], 14, [1,4], 1, 6>; // 10-14 cycles. 293bdd1243dSDimitry Andricdefm : ICXWriteResPair<WriteFDiv64Y, [ICXPort0,ICXFPDivider], 14, [1,8], 1, 7>; // 10-14 cycles. 294349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFDiv64Z, [ICXPort0,ICXPort5,ICXFPDivider], 23, [2,1,16], 3, 7>; // 10-14 cycles. 295349cc55cSDimitry Andric 296349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFSqrt, [ICXPort0,ICXFPDivider], 12, [1,3], 1, 5>; // Floating point square root. 297349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFSqrtX, [ICXPort0,ICXFPDivider], 12, [1,3], 1, 6>; 298349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFSqrtY, [ICXPort0,ICXFPDivider], 12, [1,6], 1, 7>; 299349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFSqrtZ, [ICXPort0,ICXPort5,ICXFPDivider], 20, [2,1,12], 3, 7>; 300349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFSqrt64, [ICXPort0,ICXFPDivider], 18, [1,6], 1, 5>; // Floating point double square root. 301349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFSqrt64X, [ICXPort0,ICXFPDivider], 18, [1,6], 1, 6>; 302349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFSqrt64Y, [ICXPort0,ICXFPDivider], 18, [1,12],1, 7>; 303349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFSqrt64Z, [ICXPort0,ICXPort5,ICXFPDivider], 32, [2,1,24], 3, 7>; 304349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFSqrt80, [ICXPort0,ICXFPDivider], 21, [1,7]>; // Floating point long double square root. 305349cc55cSDimitry Andric 306349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFRcp, [ICXPort0], 4, [1], 1, 5>; // Floating point reciprocal estimate. 307349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFRcpX, [ICXPort0], 4, [1], 1, 6>; 308349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFRcpY, [ICXPort0], 4, [1], 1, 7>; 309349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFRcpZ, [ICXPort0,ICXPort5], 4, [2,1], 3, 7>; 310349cc55cSDimitry Andric 311349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFRsqrt, [ICXPort0], 4, [1], 1, 5>; // Floating point reciprocal square root estimate. 312349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFRsqrtX,[ICXPort0], 4, [1], 1, 6>; 313349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFRsqrtY,[ICXPort0], 4, [1], 1, 7>; 314349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFRsqrtZ,[ICXPort0,ICXPort5], 9, [2,1], 3, 7>; 315349cc55cSDimitry Andric 316349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFMA, [ICXPort01], 4, [1], 1, 5>; // Fused Multiply Add. 317349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFMAX, [ICXPort01], 4, [1], 1, 6>; 318349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFMAY, [ICXPort01], 4, [1], 1, 7>; 3195f757f3fSDimitry Andricdefm : ICXWriteResPair<WriteFMAZ, [ICXPort0], 4, [1], 1, 7>; 320349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteDPPD, [ICXPort5,ICXPort015], 9, [1,2], 3, 6>; // Floating point double dot product. 321349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteDPPS, [ICXPort5,ICXPort015], 13, [1,3], 4, 6>; 322349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteDPPSY,[ICXPort5,ICXPort015], 13, [1,3], 4, 7>; 323349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFSign, [ICXPort0], 1>; // Floating point fabs/fchs. 324349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFRnd, [ICXPort01], 8, [2], 2, 6>; // Floating point rounding. 325349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFRndY, [ICXPort01], 8, [2], 2, 7>; 326349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFRndZ, [ICXPort05], 8, [2], 2, 7>; 327349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFLogic, [ICXPort015], 1, [1], 1, 6>; // Floating point and/or/xor logicals. 328349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFLogicY, [ICXPort015], 1, [1], 1, 7>; 329349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFLogicZ, [ICXPort05], 1, [1], 1, 7>; 330349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFTest, [ICXPort0], 2, [1], 1, 6>; // Floating point TEST instructions. 331349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFTestY, [ICXPort0], 2, [1], 1, 7>; 332349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFTestZ, [ICXPort0], 2, [1], 1, 7>; 3330eae32dcSDimitry Andricdefm : ICXWriteResPair<WriteFShuffle, [ICXPort15], 1, [1], 1, 6>; // Floating point vector shuffles. 3340eae32dcSDimitry Andricdefm : ICXWriteResPair<WriteFShuffleY, [ICXPort15], 1, [1], 1, 7>; 335349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFShuffleZ, [ICXPort5], 1, [1], 1, 7>; 3360eae32dcSDimitry Andricdefm : ICXWriteResPair<WriteFVarShuffle, [ICXPort15], 1, [1], 1, 6>; // Floating point vector variable shuffles. 3370eae32dcSDimitry Andricdefm : ICXWriteResPair<WriteFVarShuffleY, [ICXPort15], 1, [1], 1, 7>; 338349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFVarShuffleZ, [ICXPort5], 1, [1], 1, 7>; 339349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFBlend, [ICXPort015], 1, [1], 1, 6>; // Floating point vector blends. 340349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFBlendY,[ICXPort015], 1, [1], 1, 7>; 341349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFBlendZ,[ICXPort015], 1, [1], 1, 7>; 342349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFVarBlend, [ICXPort015], 2, [2], 2, 6>; // Fp vector variable blends. 343349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFVarBlendY,[ICXPort015], 2, [2], 2, 7>; 344349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFVarBlendZ,[ICXPort015], 2, [2], 2, 7>; 345349cc55cSDimitry Andric 346349cc55cSDimitry Andric// FMA Scheduling helper class. 347349cc55cSDimitry Andric// class FMASC { X86FoldableSchedWrite Sched = WriteFAdd; } 348349cc55cSDimitry Andric 349349cc55cSDimitry Andric// Vector integer operations. 350349cc55cSDimitry Andricdefm : X86WriteRes<WriteVecLoad, [ICXPort23], 5, [1], 1>; 351349cc55cSDimitry Andricdefm : X86WriteRes<WriteVecLoadX, [ICXPort23], 6, [1], 1>; 352349cc55cSDimitry Andricdefm : X86WriteRes<WriteVecLoadY, [ICXPort23], 7, [1], 1>; 353349cc55cSDimitry Andricdefm : X86WriteRes<WriteVecLoadNT, [ICXPort23], 6, [1], 1>; 354349cc55cSDimitry Andricdefm : X86WriteRes<WriteVecLoadNTY, [ICXPort23], 7, [1], 1>; 355349cc55cSDimitry Andricdefm : X86WriteRes<WriteVecMaskedLoad, [ICXPort23,ICXPort015], 7, [1,1], 2>; 356349cc55cSDimitry Andricdefm : X86WriteRes<WriteVecMaskedLoadY, [ICXPort23,ICXPort015], 8, [1,1], 2>; 35706c3fb27SDimitry Andricdefm : X86WriteRes<WriteVecStore, [ICXPort78,ICXPort49], 1, [1,1], 2>; 35806c3fb27SDimitry Andricdefm : X86WriteRes<WriteVecStoreX, [ICXPort78,ICXPort49], 1, [1,1], 2>; 35906c3fb27SDimitry Andricdefm : X86WriteRes<WriteVecStoreY, [ICXPort78,ICXPort49], 1, [1,1], 2>; 36006c3fb27SDimitry Andricdefm : X86WriteRes<WriteVecStoreNT, [ICXPort78,ICXPort49], 1, [1,1], 2>; 36106c3fb27SDimitry Andricdefm : X86WriteRes<WriteVecStoreNTY, [ICXPort78,ICXPort49], 1, [1,1], 2>; 36206c3fb27SDimitry Andricdefm : X86WriteRes<WriteVecMaskedStore32, [ICXPort78,ICXPort49,ICXPort0], 2, [1,1,1], 2>; 36306c3fb27SDimitry Andricdefm : X86WriteRes<WriteVecMaskedStore32Y, [ICXPort78,ICXPort49,ICXPort0], 2, [1,1,1], 2>; 36406c3fb27SDimitry Andricdefm : X86WriteRes<WriteVecMaskedStore64, [ICXPort78,ICXPort49,ICXPort0], 2, [1,1,1], 2>; 36506c3fb27SDimitry Andricdefm : X86WriteRes<WriteVecMaskedStore64Y, [ICXPort78,ICXPort49,ICXPort0], 2, [1,1,1], 2>; 366349cc55cSDimitry Andricdefm : X86WriteRes<WriteVecMove, [ICXPort05], 1, [1], 1>; 367349cc55cSDimitry Andricdefm : X86WriteRes<WriteVecMoveX, [ICXPort015], 1, [1], 1>; 368349cc55cSDimitry Andricdefm : X86WriteRes<WriteVecMoveY, [ICXPort015], 1, [1], 1>; 36904eeddc0SDimitry Andricdefm : X86WriteRes<WriteVecMoveZ, [ICXPort05], 1, [1], 1>; 370349cc55cSDimitry Andricdefm : X86WriteRes<WriteVecMoveToGpr, [ICXPort0], 2, [1], 1>; 371349cc55cSDimitry Andricdefm : X86WriteRes<WriteVecMoveFromGpr, [ICXPort5], 1, [1], 1>; 372349cc55cSDimitry Andric 373349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteVecALU, [ICXPort05], 1, [1], 1, 5>; // Vector integer ALU op, no logicals. 374349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteVecALUX, [ICXPort01], 1, [1], 1, 6>; 375349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteVecALUY, [ICXPort01], 1, [1], 1, 7>; 376349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteVecALUZ, [ICXPort0], 1, [1], 1, 7>; 377349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteVecLogic, [ICXPort05], 1, [1], 1, 5>; // Vector integer and/or/xor. 378349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteVecLogicX,[ICXPort015], 1, [1], 1, 6>; 379349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteVecLogicY,[ICXPort015], 1, [1], 1, 7>; 380349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteVecLogicZ,[ICXPort05], 1, [1], 1, 7>; 381349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteVecTest, [ICXPort0,ICXPort5], 3, [1,1], 2, 6>; // Vector integer TEST instructions. 382349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteVecTestY, [ICXPort0,ICXPort5], 3, [1,1], 2, 7>; 383349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteVecTestZ, [ICXPort0,ICXPort5], 3, [1,1], 2, 7>; 384349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteVecIMul, [ICXPort0], 5, [1], 1, 5>; // Vector integer multiply. 385349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteVecIMulX, [ICXPort01], 5, [1], 1, 6>; 386349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteVecIMulY, [ICXPort01], 5, [1], 1, 7>; 387349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteVecIMulZ, [ICXPort05], 5, [1], 1, 7>; 388349cc55cSDimitry Andricdefm : ICXWriteResPair<WritePMULLD, [ICXPort01], 10, [2], 2, 6>; // Vector PMULLD. 389349cc55cSDimitry Andricdefm : ICXWriteResPair<WritePMULLDY, [ICXPort01], 10, [2], 2, 7>; 390349cc55cSDimitry Andricdefm : ICXWriteResPair<WritePMULLDZ, [ICXPort05], 10, [2], 2, 7>; 391349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteShuffle, [ICXPort5], 1, [1], 1, 5>; // Vector shuffles. 3920eae32dcSDimitry Andricdefm : ICXWriteResPair<WriteShuffleX, [ICXPort15], 1, [1], 1, 6>; 3930eae32dcSDimitry Andricdefm : ICXWriteResPair<WriteShuffleY, [ICXPort15], 1, [1], 1, 7>; 394349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteShuffleZ, [ICXPort5], 1, [1], 1, 7>; 395349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteVarShuffle, [ICXPort5], 1, [1], 1, 5>; // Vector variable shuffles. 3960eae32dcSDimitry Andricdefm : ICXWriteResPair<WriteVarShuffleX, [ICXPort15], 1, [1], 1, 6>; 3970eae32dcSDimitry Andricdefm : ICXWriteResPair<WriteVarShuffleY, [ICXPort15], 1, [1], 1, 7>; 398349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteVarShuffleZ, [ICXPort5], 1, [1], 1, 7>; 3990fca6ea1SDimitry Andricdefm : ICXWriteResPair<WriteBlend, [ICXPort15], 1, [1], 1, 6>; // Vector blends. 4000fca6ea1SDimitry Andricdefm : ICXWriteResPair<WriteBlendY,[ICXPort15], 1, [1], 1, 7>; 4010fca6ea1SDimitry Andricdefm : ICXWriteResPair<WriteBlendZ,[ICXPort15], 1, [1], 1, 7>; 402349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteVarBlend, [ICXPort015], 2, [2], 2, 6>; // Vector variable blends. 403349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteVarBlendY,[ICXPort015], 2, [2], 2, 6>; 404349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteVarBlendZ,[ICXPort05], 2, [1], 1, 6>; 4050fca6ea1SDimitry Andricdefm : ICXWriteResPair<WriteMPSAD, [ICXPort15,ICXPort5], 4, [1,1], 2, 6>; // Vector MPSAD. 4060fca6ea1SDimitry Andricdefm : ICXWriteResPair<WriteMPSADY, [ICXPort15,ICXPort5], 4, [1,1], 2, 7>; 4070fca6ea1SDimitry Andricdefm : ICXWriteResPair<WriteMPSADZ, [ICXPort15,ICXPort5], 4, [1,1], 2, 7>; 408349cc55cSDimitry Andricdefm : ICXWriteResPair<WritePSADBW, [ICXPort5], 3, [1], 1, 5>; // Vector PSADBW. 409349cc55cSDimitry Andricdefm : ICXWriteResPair<WritePSADBWX, [ICXPort5], 3, [1], 1, 6>; 410349cc55cSDimitry Andricdefm : ICXWriteResPair<WritePSADBWY, [ICXPort5], 3, [1], 1, 7>; 411bdd1243dSDimitry Andricdefm : ICXWriteResPair<WritePSADBWZ, [ICXPort5], 3, [1], 1, 7>; // TODO: 512-bit ops require ports 0/1 to be joined. 412349cc55cSDimitry Andricdefm : ICXWriteResPair<WritePHMINPOS, [ICXPort0], 4, [1], 1, 6>; // Vector PHMINPOS. 413349cc55cSDimitry Andric 414349cc55cSDimitry Andric// Vector integer shifts. 415349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteVecShift, [ICXPort0], 1, [1], 1, 5>; 4160fca6ea1SDimitry Andricdefm : X86WriteRes<WriteVecShiftX, [ICXPort01,ICXPort15], 2, [1,1], 2>; 4170fca6ea1SDimitry Andricdefm : X86WriteRes<WriteVecShiftY, [ICXPort01,ICXPort5], 4, [1,1], 2>; 4180fca6ea1SDimitry Andricdefm : X86WriteRes<WriteVecShiftZ, [ICXPort0,ICXPort5], 4, [1,1], 2>; 419349cc55cSDimitry Andricdefm : X86WriteRes<WriteVecShiftXLd, [ICXPort01,ICXPort23], 7, [1,1], 2>; 420349cc55cSDimitry Andricdefm : X86WriteRes<WriteVecShiftYLd, [ICXPort01,ICXPort23], 8, [1,1], 2>; 421349cc55cSDimitry Andricdefm : X86WriteRes<WriteVecShiftZLd, [ICXPort0,ICXPort23], 8, [1,1], 2>; 422349cc55cSDimitry Andric 423349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteVecShiftImm, [ICXPort0], 1, [1], 1, 5>; 424349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteVecShiftImmX, [ICXPort01], 1, [1], 1, 6>; // Vector integer immediate shifts. 425349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteVecShiftImmY, [ICXPort01], 1, [1], 1, 7>; 426349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteVecShiftImmZ, [ICXPort0], 1, [1], 1, 7>; 427349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteVarVecShift, [ICXPort01], 1, [1], 1, 6>; // Variable vector shifts. 428349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteVarVecShiftY, [ICXPort01], 1, [1], 1, 7>; 429349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteVarVecShiftZ, [ICXPort0], 1, [1], 1, 7>; 430349cc55cSDimitry Andric 431349cc55cSDimitry Andric// Vector insert/extract operations. 432349cc55cSDimitry Andricdef : WriteRes<WriteVecInsert, [ICXPort5]> { 433349cc55cSDimitry Andric let Latency = 2; 434349cc55cSDimitry Andric let NumMicroOps = 2; 4355f757f3fSDimitry Andric let ReleaseAtCycles = [2]; 436349cc55cSDimitry Andric} 437349cc55cSDimitry Andricdef : WriteRes<WriteVecInsertLd, [ICXPort5,ICXPort23]> { 438349cc55cSDimitry Andric let Latency = 6; 439349cc55cSDimitry Andric let NumMicroOps = 2; 440349cc55cSDimitry Andric} 441349cc55cSDimitry Andricdef: InstRW<[WriteVecInsertLd], (instregex "(V?)MOV(H|L)(PD|PS)rm")>; 442349cc55cSDimitry Andric 443349cc55cSDimitry Andricdef : WriteRes<WriteVecExtract, [ICXPort0,ICXPort5]> { 444349cc55cSDimitry Andric let Latency = 3; 445349cc55cSDimitry Andric let NumMicroOps = 2; 446349cc55cSDimitry Andric} 44706c3fb27SDimitry Andricdef : WriteRes<WriteVecExtractSt, [ICXPort49,ICXPort5,ICXPort78]> { 448349cc55cSDimitry Andric let Latency = 2; 449349cc55cSDimitry Andric let NumMicroOps = 3; 450349cc55cSDimitry Andric} 451349cc55cSDimitry Andric 452349cc55cSDimitry Andric// Conversion between integer and float. 453349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteCvtSS2I, [ICXPort01], 6, [2], 2>; // Needs more work: DD vs DQ. 454349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteCvtPS2I, [ICXPort01], 3>; 455349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteCvtPS2IY, [ICXPort01], 3>; 456349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteCvtPS2IZ, [ICXPort05], 3>; 457349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteCvtSD2I, [ICXPort01], 6, [2], 2>; 458349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteCvtPD2I, [ICXPort01], 3>; 459349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteCvtPD2IY, [ICXPort01], 3>; 460349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteCvtPD2IZ, [ICXPort05], 3>; 461349cc55cSDimitry Andric 462349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteCvtI2SS, [ICXPort1], 4>; 463349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteCvtI2PS, [ICXPort01], 4>; 464349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteCvtI2PSY, [ICXPort01], 4>; 465349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteCvtI2PSZ, [ICXPort05], 4>; // Needs more work: DD vs DQ. 466349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteCvtI2SD, [ICXPort1], 4>; 467349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteCvtI2PD, [ICXPort01], 4>; 468349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteCvtI2PDY, [ICXPort01], 4>; 469349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteCvtI2PDZ, [ICXPort05], 4>; 470349cc55cSDimitry Andric 471349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteCvtSS2SD, [ICXPort1], 3>; 472349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteCvtPS2PD, [ICXPort1], 3>; 473349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteCvtPS2PDY, [ICXPort5,ICXPort01], 3, [1,1], 2>; 474349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteCvtPS2PDZ, [ICXPort05], 3, [2], 2>; 475bdd1243dSDimitry Andricdefm : ICXWriteResPair<WriteCvtSD2SS, [ICXPort5,ICXPort01], 5, [1,1], 2, 5>; 476bdd1243dSDimitry Andricdefm : ICXWriteResPair<WriteCvtPD2PS, [ICXPort5,ICXPort01], 5, [1,1], 2, 6>; 477bdd1243dSDimitry Andricdefm : ICXWriteResPair<WriteCvtPD2PSY, [ICXPort5,ICXPort01], 7, [1,1], 2, 7>; 478bdd1243dSDimitry Andricdefm : ICXWriteResPair<WriteCvtPD2PSZ, [ICXPort5,ICXPort0], 7, [1,1], 2, 7>; 479349cc55cSDimitry Andric 480349cc55cSDimitry Andricdefm : X86WriteRes<WriteCvtPH2PS, [ICXPort5,ICXPort01], 5, [1,1], 2>; 481349cc55cSDimitry Andricdefm : X86WriteRes<WriteCvtPH2PSY, [ICXPort5,ICXPort01], 7, [1,1], 2>; 482349cc55cSDimitry Andricdefm : X86WriteRes<WriteCvtPH2PSZ, [ICXPort5,ICXPort0], 7, [1,1], 2>; 483349cc55cSDimitry Andricdefm : X86WriteRes<WriteCvtPH2PSLd, [ICXPort23,ICXPort01], 9, [1,1], 2>; 484349cc55cSDimitry Andricdefm : X86WriteRes<WriteCvtPH2PSYLd, [ICXPort23,ICXPort01], 10, [1,1], 2>; 485349cc55cSDimitry Andricdefm : X86WriteRes<WriteCvtPH2PSZLd, [ICXPort23,ICXPort05], 10, [1,1], 2>; 486349cc55cSDimitry Andric 487349cc55cSDimitry Andricdefm : X86WriteRes<WriteCvtPS2PH, [ICXPort5,ICXPort01], 5, [1,1], 2>; 488349cc55cSDimitry Andricdefm : X86WriteRes<WriteCvtPS2PHY, [ICXPort5,ICXPort01], 7, [1,1], 2>; 489349cc55cSDimitry Andricdefm : X86WriteRes<WriteCvtPS2PHZ, [ICXPort5,ICXPort05], 7, [1,1], 2>; 49006c3fb27SDimitry Andricdefm : X86WriteRes<WriteCvtPS2PHSt, [ICXPort49,ICXPort5,ICXPort78,ICXPort01], 6, [1,1,1,1], 4>; 49106c3fb27SDimitry Andricdefm : X86WriteRes<WriteCvtPS2PHYSt, [ICXPort49,ICXPort5,ICXPort78,ICXPort01], 8, [1,1,1,1], 4>; 49206c3fb27SDimitry Andricdefm : X86WriteRes<WriteCvtPS2PHZSt, [ICXPort49,ICXPort5,ICXPort78,ICXPort05], 8, [1,1,1,1], 4>; 493349cc55cSDimitry Andric 494349cc55cSDimitry Andric// Strings instructions. 495349cc55cSDimitry Andric 496349cc55cSDimitry Andric// Packed Compare Implicit Length Strings, Return Mask 497349cc55cSDimitry Andricdef : WriteRes<WritePCmpIStrM, [ICXPort0]> { 498349cc55cSDimitry Andric let Latency = 10; 499349cc55cSDimitry Andric let NumMicroOps = 3; 5005f757f3fSDimitry Andric let ReleaseAtCycles = [3]; 501349cc55cSDimitry Andric} 502349cc55cSDimitry Andricdef : WriteRes<WritePCmpIStrMLd, [ICXPort0, ICXPort23]> { 503349cc55cSDimitry Andric let Latency = 16; 504349cc55cSDimitry Andric let NumMicroOps = 4; 5055f757f3fSDimitry Andric let ReleaseAtCycles = [3,1]; 506349cc55cSDimitry Andric} 507349cc55cSDimitry Andric 508349cc55cSDimitry Andric// Packed Compare Explicit Length Strings, Return Mask 509349cc55cSDimitry Andricdef : WriteRes<WritePCmpEStrM, [ICXPort0, ICXPort5, ICXPort015, ICXPort0156]> { 510349cc55cSDimitry Andric let Latency = 19; 511349cc55cSDimitry Andric let NumMicroOps = 9; 5125f757f3fSDimitry Andric let ReleaseAtCycles = [4,3,1,1]; 513349cc55cSDimitry Andric} 514349cc55cSDimitry Andricdef : WriteRes<WritePCmpEStrMLd, [ICXPort0, ICXPort5, ICXPort23, ICXPort015, ICXPort0156]> { 515349cc55cSDimitry Andric let Latency = 25; 516349cc55cSDimitry Andric let NumMicroOps = 10; 5175f757f3fSDimitry Andric let ReleaseAtCycles = [4,3,1,1,1]; 518349cc55cSDimitry Andric} 519349cc55cSDimitry Andric 520349cc55cSDimitry Andric// Packed Compare Implicit Length Strings, Return Index 521349cc55cSDimitry Andricdef : WriteRes<WritePCmpIStrI, [ICXPort0]> { 522349cc55cSDimitry Andric let Latency = 10; 523349cc55cSDimitry Andric let NumMicroOps = 3; 5245f757f3fSDimitry Andric let ReleaseAtCycles = [3]; 525349cc55cSDimitry Andric} 526349cc55cSDimitry Andricdef : WriteRes<WritePCmpIStrILd, [ICXPort0, ICXPort23]> { 527349cc55cSDimitry Andric let Latency = 16; 528349cc55cSDimitry Andric let NumMicroOps = 4; 5295f757f3fSDimitry Andric let ReleaseAtCycles = [3,1]; 530349cc55cSDimitry Andric} 531349cc55cSDimitry Andric 532349cc55cSDimitry Andric// Packed Compare Explicit Length Strings, Return Index 533349cc55cSDimitry Andricdef : WriteRes<WritePCmpEStrI, [ICXPort0,ICXPort5,ICXPort0156]> { 534349cc55cSDimitry Andric let Latency = 18; 535349cc55cSDimitry Andric let NumMicroOps = 8; 5365f757f3fSDimitry Andric let ReleaseAtCycles = [4,3,1]; 537349cc55cSDimitry Andric} 538349cc55cSDimitry Andricdef : WriteRes<WritePCmpEStrILd, [ICXPort0, ICXPort5, ICXPort23, ICXPort0156]> { 539349cc55cSDimitry Andric let Latency = 24; 540349cc55cSDimitry Andric let NumMicroOps = 9; 5415f757f3fSDimitry Andric let ReleaseAtCycles = [4,3,1,1]; 542349cc55cSDimitry Andric} 543349cc55cSDimitry Andric 544349cc55cSDimitry Andric// MOVMSK Instructions. 545349cc55cSDimitry Andricdef : WriteRes<WriteFMOVMSK, [ICXPort0]> { let Latency = 2; } 546349cc55cSDimitry Andricdef : WriteRes<WriteVecMOVMSK, [ICXPort0]> { let Latency = 2; } 547349cc55cSDimitry Andricdef : WriteRes<WriteVecMOVMSKY, [ICXPort0]> { let Latency = 2; } 548349cc55cSDimitry Andricdef : WriteRes<WriteMMXMOVMSK, [ICXPort0]> { let Latency = 2; } 549349cc55cSDimitry Andric 550349cc55cSDimitry Andric// AES instructions. 551349cc55cSDimitry Andricdef : WriteRes<WriteAESDecEnc, [ICXPort0]> { // Decryption, encryption. 552349cc55cSDimitry Andric let Latency = 4; 553349cc55cSDimitry Andric let NumMicroOps = 1; 5545f757f3fSDimitry Andric let ReleaseAtCycles = [1]; 555349cc55cSDimitry Andric} 556349cc55cSDimitry Andricdef : WriteRes<WriteAESDecEncLd, [ICXPort0, ICXPort23]> { 557349cc55cSDimitry Andric let Latency = 10; 558349cc55cSDimitry Andric let NumMicroOps = 2; 5595f757f3fSDimitry Andric let ReleaseAtCycles = [1,1]; 560349cc55cSDimitry Andric} 561349cc55cSDimitry Andric 562349cc55cSDimitry Andricdef : WriteRes<WriteAESIMC, [ICXPort0]> { // InvMixColumn. 563349cc55cSDimitry Andric let Latency = 8; 564349cc55cSDimitry Andric let NumMicroOps = 2; 5655f757f3fSDimitry Andric let ReleaseAtCycles = [2]; 566349cc55cSDimitry Andric} 567349cc55cSDimitry Andricdef : WriteRes<WriteAESIMCLd, [ICXPort0, ICXPort23]> { 568349cc55cSDimitry Andric let Latency = 14; 569349cc55cSDimitry Andric let NumMicroOps = 3; 5705f757f3fSDimitry Andric let ReleaseAtCycles = [2,1]; 571349cc55cSDimitry Andric} 572349cc55cSDimitry Andric 573349cc55cSDimitry Andricdef : WriteRes<WriteAESKeyGen, [ICXPort0,ICXPort5,ICXPort015]> { // Key Generation. 574349cc55cSDimitry Andric let Latency = 20; 575349cc55cSDimitry Andric let NumMicroOps = 11; 5765f757f3fSDimitry Andric let ReleaseAtCycles = [3,6,2]; 577349cc55cSDimitry Andric} 578349cc55cSDimitry Andricdef : WriteRes<WriteAESKeyGenLd, [ICXPort0,ICXPort5,ICXPort23,ICXPort015]> { 579349cc55cSDimitry Andric let Latency = 25; 580349cc55cSDimitry Andric let NumMicroOps = 11; 5815f757f3fSDimitry Andric let ReleaseAtCycles = [3,6,1,1]; 582349cc55cSDimitry Andric} 583349cc55cSDimitry Andric 584349cc55cSDimitry Andric// Carry-less multiplication instructions. 585349cc55cSDimitry Andricdef : WriteRes<WriteCLMul, [ICXPort5]> { 586349cc55cSDimitry Andric let Latency = 6; 587349cc55cSDimitry Andric let NumMicroOps = 1; 5885f757f3fSDimitry Andric let ReleaseAtCycles = [1]; 589349cc55cSDimitry Andric} 590349cc55cSDimitry Andricdef : WriteRes<WriteCLMulLd, [ICXPort5, ICXPort23]> { 591349cc55cSDimitry Andric let Latency = 12; 592349cc55cSDimitry Andric let NumMicroOps = 2; 5935f757f3fSDimitry Andric let ReleaseAtCycles = [1,1]; 594349cc55cSDimitry Andric} 595349cc55cSDimitry Andric 596349cc55cSDimitry Andric// Catch-all for expensive system instructions. 597349cc55cSDimitry Andricdef : WriteRes<WriteSystem, [ICXPort0156]> { let Latency = 100; } // def WriteSystem : SchedWrite; 598349cc55cSDimitry Andric 599349cc55cSDimitry Andric// AVX2. 600349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFShuffle256, [ICXPort5], 3, [1], 1, 7>; // Fp 256-bit width vector shuffles. 601349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteFVarShuffle256, [ICXPort5], 3, [1], 1, 7>; // Fp 256-bit width vector variable shuffles. 602349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteShuffle256, [ICXPort5], 3, [1], 1, 7>; // 256-bit width vector shuffles. 603349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteVPMOV256, [ICXPort5], 3, [1], 1, 7>; // 256-bit width packed vector width-changing move. 604349cc55cSDimitry Andricdefm : ICXWriteResPair<WriteVarShuffle256, [ICXPort5], 3, [1], 1, 7>; // 256-bit width vector variable shuffles. 605349cc55cSDimitry Andric 606349cc55cSDimitry Andric// Old microcoded instructions that nobody use. 607349cc55cSDimitry Andricdef : WriteRes<WriteMicrocoded, [ICXPort0156]> { let Latency = 100; } // def WriteMicrocoded : SchedWrite; 608349cc55cSDimitry Andric 609349cc55cSDimitry Andric// Fence instructions. 61006c3fb27SDimitry Andricdef : WriteRes<WriteFence, [ICXPort78, ICXPort49]>; 611349cc55cSDimitry Andric 612349cc55cSDimitry Andric// Load/store MXCSR. 6135f757f3fSDimitry Andricdef : WriteRes<WriteLDMXCSR, [ICXPort0,ICXPort23,ICXPort0156]> { let Latency = 7; let NumMicroOps = 3; let ReleaseAtCycles = [1,1,1]; } 6145f757f3fSDimitry Andricdef : WriteRes<WriteSTMXCSR, [ICXPort49,ICXPort5,ICXPort78]> { let Latency = 2; let NumMicroOps = 3; let ReleaseAtCycles = [1,1,1]; } 615349cc55cSDimitry Andric 616349cc55cSDimitry Andric// Nop, not very useful expect it provides a model for nops! 617349cc55cSDimitry Andricdef : WriteRes<WriteNop, []>; 618349cc55cSDimitry Andric 619349cc55cSDimitry Andric//////////////////////////////////////////////////////////////////////////////// 620349cc55cSDimitry Andric// Horizontal add/sub instructions. 621349cc55cSDimitry Andric//////////////////////////////////////////////////////////////////////////////// 622349cc55cSDimitry Andric 6230fca6ea1SDimitry Andricdefm : ICXWriteResPair<WriteFHAdd, [ICXPort5,ICXPort01], 6, [2,1], 3, 6>; 6240fca6ea1SDimitry Andricdefm : ICXWriteResPair<WriteFHAddY, [ICXPort5,ICXPort01], 6, [2,1], 3, 7>; 625349cc55cSDimitry Andricdefm : ICXWriteResPair<WritePHAdd, [ICXPort5,ICXPort05], 3, [2,1], 3, 5>; 6260fca6ea1SDimitry Andricdefm : ICXWriteResPair<WritePHAddX, [ICXPort15,ICXPort015], 3, [2,1], 3, 6>; 6270fca6ea1SDimitry Andricdefm : ICXWriteResPair<WritePHAddY, [ICXPort15,ICXPort015], 3, [2,1], 3, 7>; 628349cc55cSDimitry Andric 629349cc55cSDimitry Andric// Remaining instrs. 630349cc55cSDimitry Andric 631349cc55cSDimitry Andricdef ICXWriteResGroup1 : SchedWriteRes<[ICXPort0]> { 632349cc55cSDimitry Andric let Latency = 1; 633349cc55cSDimitry Andric let NumMicroOps = 1; 6345f757f3fSDimitry Andric let ReleaseAtCycles = [1]; 635349cc55cSDimitry Andric} 636349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup1], (instregex "KAND(B|D|Q|W)rr", 637349cc55cSDimitry Andric "KANDN(B|D|Q|W)rr", 638349cc55cSDimitry Andric "KMOV(B|D|Q|W)kk", 639349cc55cSDimitry Andric "KNOT(B|D|Q|W)rr", 640349cc55cSDimitry Andric "KOR(B|D|Q|W)rr", 641349cc55cSDimitry Andric "KXNOR(B|D|Q|W)rr", 642349cc55cSDimitry Andric "KXOR(B|D|Q|W)rr", 643349cc55cSDimitry Andric "KSET0(B|D|Q|W)", // Same as KXOR 644349cc55cSDimitry Andric "KSET1(B|D|Q|W)", // Same as KXNOR 6450eae32dcSDimitry Andric "MMX_PADDS(B|W)rr", 6460eae32dcSDimitry Andric "MMX_PADDUS(B|W)rr", 6470eae32dcSDimitry Andric "MMX_PAVG(B|W)rr", 6480eae32dcSDimitry Andric "MMX_PCMPEQ(B|D|W)rr", 6490eae32dcSDimitry Andric "MMX_PCMPGT(B|D|W)rr", 6500eae32dcSDimitry Andric "MMX_P(MAX|MIN)SWrr", 6510eae32dcSDimitry Andric "MMX_P(MAX|MIN)UBrr", 6520eae32dcSDimitry Andric "MMX_PSUBS(B|W)rr", 6530eae32dcSDimitry Andric "MMX_PSUBUS(B|W)rr", 654349cc55cSDimitry Andric "VPMOVB2M(Z|Z128|Z256)rr", 655349cc55cSDimitry Andric "VPMOVD2M(Z|Z128|Z256)rr", 656349cc55cSDimitry Andric "VPMOVQ2M(Z|Z128|Z256)rr", 657349cc55cSDimitry Andric "VPMOVW2M(Z|Z128|Z256)rr")>; 658349cc55cSDimitry Andric 659349cc55cSDimitry Andricdef ICXWriteResGroup3 : SchedWriteRes<[ICXPort5]> { 660349cc55cSDimitry Andric let Latency = 1; 661349cc55cSDimitry Andric let NumMicroOps = 1; 6625f757f3fSDimitry Andric let ReleaseAtCycles = [1]; 663349cc55cSDimitry Andric} 664349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup3], (instregex "COM(P?)_FST0r", 665349cc55cSDimitry Andric "KMOV(B|D|Q|W)kr", 6660eae32dcSDimitry Andric "UCOM_F(P?)r", 6670eae32dcSDimitry Andric "VPBROADCAST(D|Q)rr", 6680eae32dcSDimitry Andric "(V?)INSERTPS(Z?)rr", 6690eae32dcSDimitry Andric "(V?)MOV(HL|LH)PS(Z?)rr", 670bdd1243dSDimitry Andric "(V?)MOVDDUP(Y|Z128|Z256)?rr", 671bdd1243dSDimitry Andric "(V?)PALIGNR(Y|Z128|Z256)?rri", 672bdd1243dSDimitry Andric "(V?)PERMIL(PD|PS)(Y|Z128|Z256)?ri", 673bdd1243dSDimitry Andric "(V?)PERMIL(PD|PS)(Y|Z128|Z256)?rr", 674bdd1243dSDimitry Andric "(V?)UNPCK(L|H)(PD|PS)(Y|Z128|Z256)?rr")>; 675349cc55cSDimitry Andric 676349cc55cSDimitry Andricdef ICXWriteResGroup4 : SchedWriteRes<[ICXPort6]> { 677349cc55cSDimitry Andric let Latency = 1; 678349cc55cSDimitry Andric let NumMicroOps = 1; 6795f757f3fSDimitry Andric let ReleaseAtCycles = [1]; 680349cc55cSDimitry Andric} 681349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup4], (instregex "JMP(16|32|64)r")>; 682349cc55cSDimitry Andric 683349cc55cSDimitry Andricdef ICXWriteResGroup6 : SchedWriteRes<[ICXPort05]> { 684349cc55cSDimitry Andric let Latency = 1; 685349cc55cSDimitry Andric let NumMicroOps = 1; 6865f757f3fSDimitry Andric let ReleaseAtCycles = [1]; 687349cc55cSDimitry Andric} 688349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup6], (instrs FINCSTP, FNOP)>; 689349cc55cSDimitry Andric 690349cc55cSDimitry Andricdef ICXWriteResGroup7 : SchedWriteRes<[ICXPort06]> { 691349cc55cSDimitry Andric let Latency = 1; 692349cc55cSDimitry Andric let NumMicroOps = 1; 6935f757f3fSDimitry Andric let ReleaseAtCycles = [1]; 694349cc55cSDimitry Andric} 695349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup7], (instrs CDQ, CQO, CLAC, STAC)>; 696349cc55cSDimitry Andric 697349cc55cSDimitry Andricdef ICXWriteResGroup8 : SchedWriteRes<[ICXPort15]> { 698349cc55cSDimitry Andric let Latency = 1; 699349cc55cSDimitry Andric let NumMicroOps = 1; 7005f757f3fSDimitry Andric let ReleaseAtCycles = [1]; 701349cc55cSDimitry Andric} 702349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup8], (instregex "ANDN(32|64)rr")>; 703349cc55cSDimitry Andric 704349cc55cSDimitry Andricdef ICXWriteResGroup9 : SchedWriteRes<[ICXPort015]> { 705349cc55cSDimitry Andric let Latency = 1; 706349cc55cSDimitry Andric let NumMicroOps = 1; 7075f757f3fSDimitry Andric let ReleaseAtCycles = [1]; 708349cc55cSDimitry Andric} 709349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup9], (instregex "VBLENDMPD(Z128|Z256)rr", 710349cc55cSDimitry Andric "VBLENDMPS(Z128|Z256)rr", 711349cc55cSDimitry Andric "VPADD(B|D|Q|W)(Y|Z|Z128|Z256)rr", 712349cc55cSDimitry Andric "(V?)PADD(B|D|Q|W)rr", 7130eae32dcSDimitry Andric "(V?)MOV(SD|SS)(Z?)rr", 714349cc55cSDimitry Andric "VPBLENDD(Y?)rri", 715349cc55cSDimitry Andric "VPBLENDMB(Z128|Z256)rr", 716349cc55cSDimitry Andric "VPBLENDMD(Z128|Z256)rr", 717349cc55cSDimitry Andric "VPBLENDMQ(Z128|Z256)rr", 718349cc55cSDimitry Andric "VPBLENDMW(Z128|Z256)rr", 719349cc55cSDimitry Andric "VPSUB(B|D|Q|W)(Y|Z|Z128|Z256)rrk", 720349cc55cSDimitry Andric "VPTERNLOGD(Z|Z128|Z256)rri", 721349cc55cSDimitry Andric "VPTERNLOGQ(Z|Z128|Z256)rri")>; 722349cc55cSDimitry Andric 723349cc55cSDimitry Andricdef ICXWriteResGroup10 : SchedWriteRes<[ICXPort0156]> { 724349cc55cSDimitry Andric let Latency = 1; 725349cc55cSDimitry Andric let NumMicroOps = 1; 7265f757f3fSDimitry Andric let ReleaseAtCycles = [1]; 727349cc55cSDimitry Andric} 728bdd1243dSDimitry Andricdef: InstRW<[ICXWriteResGroup10], (instrs SGDT64m, 729349cc55cSDimitry Andric SIDT64m, 730349cc55cSDimitry Andric SMSW16m, 731349cc55cSDimitry Andric STRm, 732349cc55cSDimitry Andric SYSCALL)>; 733349cc55cSDimitry Andric 73406c3fb27SDimitry Andricdef ICXWriteResGroup11 : SchedWriteRes<[ICXPort49,ICXPort78]> { 735349cc55cSDimitry Andric let Latency = 1; 736349cc55cSDimitry Andric let NumMicroOps = 2; 7375f757f3fSDimitry Andric let ReleaseAtCycles = [1,1]; 738349cc55cSDimitry Andric} 739349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup11], (instrs FBSTPm, VMPTRSTm)>; 740349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup11], (instregex "KMOV(B|D|Q|W)mk", 741349cc55cSDimitry Andric "ST_FP(32|64|80)m")>; 742349cc55cSDimitry Andric 743349cc55cSDimitry Andricdef ICXWriteResGroup13 : SchedWriteRes<[ICXPort5]> { 744349cc55cSDimitry Andric let Latency = 2; 745349cc55cSDimitry Andric let NumMicroOps = 2; 7465f757f3fSDimitry Andric let ReleaseAtCycles = [2]; 747349cc55cSDimitry Andric} 748349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup13], (instrs MMX_MOVQ2DQrr)>; 749349cc55cSDimitry Andric 750349cc55cSDimitry Andricdef ICXWriteResGroup14 : SchedWriteRes<[ICXPort05]> { 751349cc55cSDimitry Andric let Latency = 2; 752349cc55cSDimitry Andric let NumMicroOps = 2; 7535f757f3fSDimitry Andric let ReleaseAtCycles = [2]; 754349cc55cSDimitry Andric} 755349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup14], (instrs FDECSTP, 756349cc55cSDimitry Andric MMX_MOVDQ2Qrr)>; 757349cc55cSDimitry Andric 758349cc55cSDimitry Andricdef ICXWriteResGroup17 : SchedWriteRes<[ICXPort0156]> { 759349cc55cSDimitry Andric let Latency = 2; 760349cc55cSDimitry Andric let NumMicroOps = 2; 7615f757f3fSDimitry Andric let ReleaseAtCycles = [2]; 762349cc55cSDimitry Andric} 763349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup17], (instrs LFENCE, 764349cc55cSDimitry Andric WAIT, 765349cc55cSDimitry Andric XGETBV)>; 766349cc55cSDimitry Andric 767349cc55cSDimitry Andricdef ICXWriteResGroup20 : SchedWriteRes<[ICXPort6,ICXPort0156]> { 768349cc55cSDimitry Andric let Latency = 2; 769349cc55cSDimitry Andric let NumMicroOps = 2; 7705f757f3fSDimitry Andric let ReleaseAtCycles = [1,1]; 771349cc55cSDimitry Andric} 772349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup20], (instregex "CLFLUSH")>; 773349cc55cSDimitry Andric 77406c3fb27SDimitry Andricdef ICXWriteResGroup21 : SchedWriteRes<[ICXPort49,ICXPort78]> { 775349cc55cSDimitry Andric let Latency = 2; 776349cc55cSDimitry Andric let NumMicroOps = 2; 7775f757f3fSDimitry Andric let ReleaseAtCycles = [1,1]; 778349cc55cSDimitry Andric} 779349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup21], (instrs SFENCE)>; 780349cc55cSDimitry Andric 781349cc55cSDimitry Andricdef ICXWriteResGroup23 : SchedWriteRes<[ICXPort06,ICXPort0156]> { 782349cc55cSDimitry Andric let Latency = 2; 783349cc55cSDimitry Andric let NumMicroOps = 2; 7845f757f3fSDimitry Andric let ReleaseAtCycles = [1,1]; 785349cc55cSDimitry Andric} 786349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup23], (instrs CWD, 787349cc55cSDimitry Andric JCXZ, JECXZ, JRCXZ, 788349cc55cSDimitry Andric ADC8i8, SBB8i8, 789349cc55cSDimitry Andric ADC16i16, SBB16i16, 790349cc55cSDimitry Andric ADC32i32, SBB32i32, 791349cc55cSDimitry Andric ADC64i32, SBB64i32)>; 792349cc55cSDimitry Andric 79306c3fb27SDimitry Andricdef ICXWriteResGroup25 : SchedWriteRes<[ICXPort49,ICXPort6,ICXPort78]> { 794349cc55cSDimitry Andric let Latency = 2; 795349cc55cSDimitry Andric let NumMicroOps = 3; 7965f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1]; 797349cc55cSDimitry Andric} 798349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup25], (instrs FNSTCW16m)>; 799349cc55cSDimitry Andric 80006c3fb27SDimitry Andricdef ICXWriteResGroup27 : SchedWriteRes<[ICXPort49,ICXPort78,ICXPort15]> { 801349cc55cSDimitry Andric let Latency = 2; 802349cc55cSDimitry Andric let NumMicroOps = 3; 8035f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1]; 804349cc55cSDimitry Andric} 805349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup27], (instregex "MOVBE(16|32|64)mr")>; 806349cc55cSDimitry Andric 80706c3fb27SDimitry Andricdef ICXWriteResGroup28 : SchedWriteRes<[ICXPort49,ICXPort78,ICXPort0156]> { 808349cc55cSDimitry Andric let Latency = 2; 809349cc55cSDimitry Andric let NumMicroOps = 3; 8105f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1]; 811349cc55cSDimitry Andric} 812349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup28], (instrs PUSH16r, PUSH32r, PUSH64r, PUSH64i8, 813349cc55cSDimitry Andric STOSB, STOSL, STOSQ, STOSW)>; 814349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup28], (instregex "PUSH(16|32|64)rmr")>; 815349cc55cSDimitry Andric 81606c3fb27SDimitry Andricdef ICXWriteResGroup29 : SchedWriteRes<[ICXPort49,ICXPort78,ICXPort15]> { 817349cc55cSDimitry Andric let Latency = 2; 818349cc55cSDimitry Andric let NumMicroOps = 5; 8195f757f3fSDimitry Andric let ReleaseAtCycles = [2,2,1]; 820349cc55cSDimitry Andric} 821349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup29], (instregex "VMOVDQU8Zmr(b?)")>; 822349cc55cSDimitry Andric 823349cc55cSDimitry Andricdef ICXWriteResGroup30 : SchedWriteRes<[ICXPort0]> { 824349cc55cSDimitry Andric let Latency = 3; 825349cc55cSDimitry Andric let NumMicroOps = 1; 8265f757f3fSDimitry Andric let ReleaseAtCycles = [1]; 827349cc55cSDimitry Andric} 828349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup30], (instregex "KMOV(B|D|Q|W)rk", 829349cc55cSDimitry Andric "KORTEST(B|D|Q|W)rr", 830349cc55cSDimitry Andric "KTEST(B|D|Q|W)rr")>; 831349cc55cSDimitry Andric 832349cc55cSDimitry Andricdef ICXWriteResGroup31 : SchedWriteRes<[ICXPort1]> { 833349cc55cSDimitry Andric let Latency = 3; 834349cc55cSDimitry Andric let NumMicroOps = 1; 8355f757f3fSDimitry Andric let ReleaseAtCycles = [1]; 836349cc55cSDimitry Andric} 837349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup31], (instregex "PDEP(32|64)rr", 838349cc55cSDimitry Andric "PEXT(32|64)rr")>; 839349cc55cSDimitry Andric 840349cc55cSDimitry Andricdef ICXWriteResGroup32 : SchedWriteRes<[ICXPort5]> { 841349cc55cSDimitry Andric let Latency = 3; 842349cc55cSDimitry Andric let NumMicroOps = 1; 8435f757f3fSDimitry Andric let ReleaseAtCycles = [1]; 844349cc55cSDimitry Andric} 845349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup32], (instregex "(ADD|SUB|SUBR)_(FPrST0|FST0r|FrST0)", 846349cc55cSDimitry Andric "VALIGND(Z|Z128|Z256)rri", 847349cc55cSDimitry Andric "VALIGNQ(Z|Z128|Z256)rri", 848349cc55cSDimitry Andric "VPBROADCAST(B|W)rr", 849bdd1243dSDimitry Andric "(V?)PACK(U|S)S(DW|WB)(Y|Z|Z128|Z256)?rr", 850349cc55cSDimitry Andric "VP(MAX|MIN)(S|U)Q(Z|Z128|Z256)rr")>; 851349cc55cSDimitry Andric 852349cc55cSDimitry Andricdef ICXWriteResGroup33 : SchedWriteRes<[ICXPort5]> { 853349cc55cSDimitry Andric let Latency = 4; 854349cc55cSDimitry Andric let NumMicroOps = 1; 8555f757f3fSDimitry Andric let ReleaseAtCycles = [1]; 856349cc55cSDimitry Andric} 857349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup33], (instregex "KADD(B|D|Q|W)rr", 858349cc55cSDimitry Andric "KSHIFTL(B|D|Q|W)ri", 859349cc55cSDimitry Andric "KSHIFTR(B|D|Q|W)ri", 860349cc55cSDimitry Andric "KUNPCK(BW|DQ|WD)rr", 861349cc55cSDimitry Andric "VCMPPD(Z|Z128|Z256)rri", 862349cc55cSDimitry Andric "VCMPPS(Z|Z128|Z256)rri", 863349cc55cSDimitry Andric "VCMP(SD|SS)Zrr", 864349cc55cSDimitry Andric "VFPCLASS(PD|PS)(Z|Z128|Z256)rr", 865349cc55cSDimitry Andric "VFPCLASS(SD|SS)Zrr", 866349cc55cSDimitry Andric "VPCMPB(Z|Z128|Z256)rri", 867349cc55cSDimitry Andric "VPCMPD(Z|Z128|Z256)rri", 868349cc55cSDimitry Andric "VPCMPEQ(B|D|Q|W)(Z|Z128|Z256)rr", 869349cc55cSDimitry Andric "VPCMPGT(B|D|Q|W)(Z|Z128|Z256)rr", 870349cc55cSDimitry Andric "VPCMPQ(Z|Z128|Z256)rri", 871349cc55cSDimitry Andric "VPCMPU(B|D|Q|W)(Z|Z128|Z256)rri", 872349cc55cSDimitry Andric "VPCMPW(Z|Z128|Z256)rri", 873349cc55cSDimitry Andric "VPTEST(N?)M(B|D|Q|W)(Z|Z128|Z256)rr")>; 874349cc55cSDimitry Andric 875349cc55cSDimitry Andricdef ICXWriteResGroup34 : SchedWriteRes<[ICXPort0,ICXPort0156]> { 876349cc55cSDimitry Andric let Latency = 3; 877349cc55cSDimitry Andric let NumMicroOps = 2; 8785f757f3fSDimitry Andric let ReleaseAtCycles = [1,1]; 879349cc55cSDimitry Andric} 880349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup34], (instrs FNSTSW16r)>; 881349cc55cSDimitry Andric 882349cc55cSDimitry Andricdef ICXWriteResGroup37 : SchedWriteRes<[ICXPort0,ICXPort5]> { 883349cc55cSDimitry Andric let Latency = 3; 884349cc55cSDimitry Andric let NumMicroOps = 3; 8855f757f3fSDimitry Andric let ReleaseAtCycles = [1,2]; 886349cc55cSDimitry Andric} 887349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup37], (instregex "MMX_PH(ADD|SUB)SWrr")>; 888349cc55cSDimitry Andric 8890fca6ea1SDimitry Andricdef ICXWriteResGroup38 : SchedWriteRes<[ICXPort15,ICXPort01]> { 890349cc55cSDimitry Andric let Latency = 3; 891349cc55cSDimitry Andric let NumMicroOps = 3; 8925f757f3fSDimitry Andric let ReleaseAtCycles = [2,1]; 893349cc55cSDimitry Andric} 894349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup38], (instregex "(V?)PH(ADD|SUB)SW(Y?)rr")>; 895349cc55cSDimitry Andric 896349cc55cSDimitry Andricdef ICXWriteResGroup41 : SchedWriteRes<[ICXPort5,ICXPort0156]> { 897349cc55cSDimitry Andric let Latency = 3; 898349cc55cSDimitry Andric let NumMicroOps = 3; 8995f757f3fSDimitry Andric let ReleaseAtCycles = [2,1]; 900349cc55cSDimitry Andric} 9010eae32dcSDimitry Andricdef: InstRW<[ICXWriteResGroup41], (instrs MMX_PACKSSDWrr, 9020eae32dcSDimitry Andric MMX_PACKSSWBrr, 9030eae32dcSDimitry Andric MMX_PACKUSWBrr)>; 904349cc55cSDimitry Andric 905349cc55cSDimitry Andricdef ICXWriteResGroup42 : SchedWriteRes<[ICXPort6,ICXPort0156]> { 906349cc55cSDimitry Andric let Latency = 3; 907349cc55cSDimitry Andric let NumMicroOps = 3; 9085f757f3fSDimitry Andric let ReleaseAtCycles = [1,2]; 909349cc55cSDimitry Andric} 910349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup42], (instregex "CLD")>; 911349cc55cSDimitry Andric 91206c3fb27SDimitry Andricdef ICXWriteResGroup43 : SchedWriteRes<[ICXPort49,ICXPort78]> { 913349cc55cSDimitry Andric let Latency = 3; 914349cc55cSDimitry Andric let NumMicroOps = 3; 9155f757f3fSDimitry Andric let ReleaseAtCycles = [1,2]; 916349cc55cSDimitry Andric} 917349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup43], (instrs MFENCE)>; 918349cc55cSDimitry Andric 919349cc55cSDimitry Andricdef ICXWriteResGroup44 : SchedWriteRes<[ICXPort06,ICXPort0156]> { 92081ad6265SDimitry Andric let Latency = 2; 921349cc55cSDimitry Andric let NumMicroOps = 3; 9225f757f3fSDimitry Andric let ReleaseAtCycles = [1,2]; 923349cc55cSDimitry Andric} 92481ad6265SDimitry Andricdef: InstRW<[ICXWriteResGroup44], (instrs RCL8r1, RCL16r1, RCL32r1, RCL64r1, 92581ad6265SDimitry Andric RCR8r1, RCR16r1, RCR32r1, RCR64r1)>; 92681ad6265SDimitry Andric 92781ad6265SDimitry Andricdef ICXWriteResGroup44b : SchedWriteRes<[ICXPort1,ICXPort06,ICXPort0156]> { 92881ad6265SDimitry Andric let Latency = 5; 92981ad6265SDimitry Andric let NumMicroOps = 7; 9305f757f3fSDimitry Andric let ReleaseAtCycles = [2,3,2]; 93181ad6265SDimitry Andric} 93281ad6265SDimitry Andricdef: InstRW<[ICXWriteResGroup44b], (instrs RCR8ri, RCR16ri, RCR32ri, RCR64ri)>; 93381ad6265SDimitry Andric 93481ad6265SDimitry Andricdef ICXWriteResGroup44c : SchedWriteRes<[ICXPort1,ICXPort06,ICXPort0156]> { 93581ad6265SDimitry Andric let Latency = 6; 93681ad6265SDimitry Andric let NumMicroOps = 7; 9375f757f3fSDimitry Andric let ReleaseAtCycles = [2,3,2]; 93881ad6265SDimitry Andric} 93981ad6265SDimitry Andricdef: InstRW<[ICXWriteResGroup44c], (instrs RCL8ri, RCL16ri, RCL32ri, RCL64ri)>; 940349cc55cSDimitry Andric 94106c3fb27SDimitry Andricdef ICXWriteResGroup45 : SchedWriteRes<[ICXPort0,ICXPort49,ICXPort78]> { 942349cc55cSDimitry Andric let Latency = 3; 943349cc55cSDimitry Andric let NumMicroOps = 3; 9445f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1]; 945349cc55cSDimitry Andric} 946349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup45], (instrs FNSTSWm)>; 947349cc55cSDimitry Andric 94806c3fb27SDimitry Andricdef ICXWriteResGroup47 : SchedWriteRes<[ICXPort49,ICXPort6,ICXPort78,ICXPort0156]> { 949349cc55cSDimitry Andric let Latency = 3; 950349cc55cSDimitry Andric let NumMicroOps = 4; 9515f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1,1]; 952349cc55cSDimitry Andric} 953349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup47], (instregex "CALL(16|32|64)r")>; 954349cc55cSDimitry Andric 95506c3fb27SDimitry Andricdef ICXWriteResGroup48 : SchedWriteRes<[ICXPort49,ICXPort78,ICXPort06,ICXPort0156]> { 956349cc55cSDimitry Andric let Latency = 3; 957349cc55cSDimitry Andric let NumMicroOps = 4; 9585f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1,1]; 959349cc55cSDimitry Andric} 960349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup48], (instrs CALL64pcrel32)>; 961349cc55cSDimitry Andric 962349cc55cSDimitry Andricdef ICXWriteResGroup49 : SchedWriteRes<[ICXPort0]> { 963349cc55cSDimitry Andric let Latency = 4; 964349cc55cSDimitry Andric let NumMicroOps = 1; 9655f757f3fSDimitry Andric let ReleaseAtCycles = [1]; 966349cc55cSDimitry Andric} 967349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup49], (instregex "MUL_(FPrST0|FST0r|FrST0)")>; 968349cc55cSDimitry Andric 969349cc55cSDimitry Andricdef ICXWriteResGroup50 : SchedWriteRes<[ICXPort01]> { 970349cc55cSDimitry Andric let Latency = 4; 971349cc55cSDimitry Andric let NumMicroOps = 1; 9725f757f3fSDimitry Andric let ReleaseAtCycles = [1]; 973349cc55cSDimitry Andric} 974bdd1243dSDimitry Andricdef: InstRW<[ICXWriteResGroup50], (instregex "VCVTPD2QQ(Z128|Z256)rr", 975349cc55cSDimitry Andric "VCVTPD2UQQ(Z128|Z256)rr", 976349cc55cSDimitry Andric "VCVTPS2DQ(Y|Z128|Z256)rr", 977349cc55cSDimitry Andric "(V?)CVTPS2DQrr", 978349cc55cSDimitry Andric "VCVTPS2UDQ(Z128|Z256)rr", 979349cc55cSDimitry Andric "VCVTTPD2QQ(Z128|Z256)rr", 980349cc55cSDimitry Andric "VCVTTPD2UQQ(Z128|Z256)rr", 981349cc55cSDimitry Andric "VCVTTPS2DQ(Z128|Z256)rr", 982349cc55cSDimitry Andric "(V?)CVTTPS2DQrr", 983bdd1243dSDimitry Andric "VCVTTPS2UDQ(Z128|Z256)rr")>; 984349cc55cSDimitry Andric 985349cc55cSDimitry Andricdef ICXWriteResGroup50z : SchedWriteRes<[ICXPort05]> { 986349cc55cSDimitry Andric let Latency = 4; 987349cc55cSDimitry Andric let NumMicroOps = 1; 9885f757f3fSDimitry Andric let ReleaseAtCycles = [1]; 989349cc55cSDimitry Andric} 990bdd1243dSDimitry Andricdef: InstRW<[ICXWriteResGroup50z], (instrs VCVTPD2QQZrr, 991349cc55cSDimitry Andric VCVTPD2UQQZrr, 992349cc55cSDimitry Andric VCVTPS2DQZrr, 993349cc55cSDimitry Andric VCVTPS2UDQZrr, 994349cc55cSDimitry Andric VCVTTPD2QQZrr, 995349cc55cSDimitry Andric VCVTTPD2UQQZrr, 996349cc55cSDimitry Andric VCVTTPS2DQZrr, 997bdd1243dSDimitry Andric VCVTTPS2UDQZrr)>; 998349cc55cSDimitry Andric 999349cc55cSDimitry Andricdef ICXWriteResGroup51 : SchedWriteRes<[ICXPort5]> { 1000349cc55cSDimitry Andric let Latency = 4; 1001349cc55cSDimitry Andric let NumMicroOps = 2; 10025f757f3fSDimitry Andric let ReleaseAtCycles = [2]; 1003349cc55cSDimitry Andric} 1004349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup51], (instregex "VEXPANDPD(Z|Z128|Z256)rr", 1005349cc55cSDimitry Andric "VEXPANDPS(Z|Z128|Z256)rr", 1006349cc55cSDimitry Andric "VPEXPANDD(Z|Z128|Z256)rr", 1007349cc55cSDimitry Andric "VPEXPANDQ(Z|Z128|Z256)rr", 1008349cc55cSDimitry Andric "VPMOVDB(Z|Z128|Z256)rr", 1009349cc55cSDimitry Andric "VPMOVDW(Z|Z128|Z256)rr", 1010349cc55cSDimitry Andric "VPMOVQB(Z|Z128|Z256)rr", 1011349cc55cSDimitry Andric "VPMOVQW(Z|Z128|Z256)rr", 1012349cc55cSDimitry Andric "VPMOVSDB(Z|Z128|Z256)rr", 1013349cc55cSDimitry Andric "VPMOVSDW(Z|Z128|Z256)rr", 1014349cc55cSDimitry Andric "VPMOVSQB(Z|Z128|Z256)rr", 1015349cc55cSDimitry Andric "VPMOVSQD(Z|Z128|Z256)rr", 1016349cc55cSDimitry Andric "VPMOVSQW(Z|Z128|Z256)rr", 1017349cc55cSDimitry Andric "VPMOVSWB(Z|Z128|Z256)rr", 1018349cc55cSDimitry Andric "VPMOVUSDB(Z|Z128|Z256)rr", 1019349cc55cSDimitry Andric "VPMOVUSDW(Z|Z128|Z256)rr", 1020349cc55cSDimitry Andric "VPMOVUSQB(Z|Z128|Z256)rr", 1021349cc55cSDimitry Andric "VPMOVUSQD(Z|Z128|Z256)rr", 1022349cc55cSDimitry Andric "VPMOVUSWB(Z|Z128|Z256)rr", 1023349cc55cSDimitry Andric "VPMOVWB(Z|Z128|Z256)rr")>; 1024349cc55cSDimitry Andric 102506c3fb27SDimitry Andricdef ICXWriteResGroup54 : SchedWriteRes<[ICXPort49,ICXPort5,ICXPort78]> { 1026349cc55cSDimitry Andric let Latency = 4; 1027349cc55cSDimitry Andric let NumMicroOps = 3; 10285f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1]; 1029349cc55cSDimitry Andric} 1030349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup54], (instregex "IST(T?)_FP(16|32|64)m", 1031349cc55cSDimitry Andric "IST_F(16|32)m", 1032349cc55cSDimitry Andric "VPMOVQD(Z|Z128|Z256)mr(b?)")>; 1033349cc55cSDimitry Andric 1034349cc55cSDimitry Andricdef ICXWriteResGroup55 : SchedWriteRes<[ICXPort0156]> { 1035349cc55cSDimitry Andric let Latency = 4; 1036349cc55cSDimitry Andric let NumMicroOps = 4; 10375f757f3fSDimitry Andric let ReleaseAtCycles = [4]; 1038349cc55cSDimitry Andric} 1039349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup55], (instrs FNCLEX)>; 1040349cc55cSDimitry Andric 1041349cc55cSDimitry Andricdef ICXWriteResGroup56 : SchedWriteRes<[]> { 1042349cc55cSDimitry Andric let Latency = 0; 1043349cc55cSDimitry Andric let NumMicroOps = 4; 10445f757f3fSDimitry Andric let ReleaseAtCycles = []; 1045349cc55cSDimitry Andric} 1046349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup56], (instrs VZEROUPPER)>; 1047349cc55cSDimitry Andric 1048349cc55cSDimitry Andricdef ICXWriteResGroup57 : SchedWriteRes<[ICXPort1,ICXPort6,ICXPort0156]> { 1049349cc55cSDimitry Andric let Latency = 4; 1050349cc55cSDimitry Andric let NumMicroOps = 4; 10515f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,2]; 1052349cc55cSDimitry Andric} 1053349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup57], (instregex "LAR(16|32|64)rr")>; 1054349cc55cSDimitry Andric 1055bdd1243dSDimitry Andricdef ICXWriteResGroup61 : SchedWriteRes<[ICXPort5,ICXPort01]> { 1056349cc55cSDimitry Andric let Latency = 5; 1057349cc55cSDimitry Andric let NumMicroOps = 2; 10585f757f3fSDimitry Andric let ReleaseAtCycles = [1,1]; 1059349cc55cSDimitry Andric} 10600eae32dcSDimitry Andricdef: InstRW<[ICXWriteResGroup61], (instregex "MMX_CVT(T?)PD2PIrr", 10610eae32dcSDimitry Andric "MMX_CVT(T?)PS2PIrr", 1062349cc55cSDimitry Andric "VCVTDQ2PDZ128rr", 1063349cc55cSDimitry Andric "VCVTPD2DQZ128rr", 1064349cc55cSDimitry Andric "(V?)CVT(T?)PD2DQrr", 1065349cc55cSDimitry Andric "VCVTPD2UDQZ128rr", 1066349cc55cSDimitry Andric "VCVTPS2PDZ128rr", 1067349cc55cSDimitry Andric "(V?)CVTPS2PDrr", 1068349cc55cSDimitry Andric "VCVTPS2QQZ128rr", 1069349cc55cSDimitry Andric "VCVTPS2UQQZ128rr", 1070349cc55cSDimitry Andric "VCVTQQ2PSZ128rr", 1071349cc55cSDimitry Andric "(V?)CVTSI(64)?2SDrr", 1072349cc55cSDimitry Andric "VCVTSI2SSZrr", 1073349cc55cSDimitry Andric "(V?)CVTSI2SSrr", 1074349cc55cSDimitry Andric "VCVTSI(64)?2SDZrr", 1075349cc55cSDimitry Andric "VCVTSS2SDZrr", 1076349cc55cSDimitry Andric "(V?)CVTSS2SDrr", 1077349cc55cSDimitry Andric "VCVTTPD2DQZ128rr", 1078349cc55cSDimitry Andric "VCVTTPD2UDQZ128rr", 1079349cc55cSDimitry Andric "VCVTTPS2QQZ128rr", 1080349cc55cSDimitry Andric "VCVTTPS2UQQZ128rr", 1081349cc55cSDimitry Andric "VCVTUDQ2PDZ128rr", 1082349cc55cSDimitry Andric "VCVTUQQ2PSZ128rr", 1083349cc55cSDimitry Andric "VCVTUSI2SSZrr", 1084349cc55cSDimitry Andric "VCVTUSI(64)?2SDZrr")>; 1085349cc55cSDimitry Andric 1086349cc55cSDimitry Andricdef ICXWriteResGroup62 : SchedWriteRes<[ICXPort5,ICXPort015]> { 1087349cc55cSDimitry Andric let Latency = 5; 1088349cc55cSDimitry Andric let NumMicroOps = 3; 10895f757f3fSDimitry Andric let ReleaseAtCycles = [2,1]; 1090349cc55cSDimitry Andric} 1091349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup62], (instregex "VPCONFLICTQZ128rr")>; 1092349cc55cSDimitry Andric 1093349cc55cSDimitry Andricdef ICXWriteResGroup63 : SchedWriteRes<[ICXPort1,ICXPort6,ICXPort06]> { 1094349cc55cSDimitry Andric let Latency = 5; 1095349cc55cSDimitry Andric let NumMicroOps = 3; 10965f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1]; 1097349cc55cSDimitry Andric} 1098349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup63], (instregex "STR(16|32|64)r")>; 1099349cc55cSDimitry Andric 110006c3fb27SDimitry Andricdef ICXWriteResGroup65 : SchedWriteRes<[ICXPort49,ICXPort78,ICXPort01]> { 1101349cc55cSDimitry Andric let Latency = 5; 1102349cc55cSDimitry Andric let NumMicroOps = 3; 11035f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1]; 1104349cc55cSDimitry Andric} 1105349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup65], (instregex "VCVTPS2PHZ128mr(b?)", 1106349cc55cSDimitry Andric "VCVTPS2PHZ256mr(b?)", 1107349cc55cSDimitry Andric "VCVTPS2PHZmr(b?)")>; 1108349cc55cSDimitry Andric 110906c3fb27SDimitry Andricdef ICXWriteResGroup66 : SchedWriteRes<[ICXPort49,ICXPort5,ICXPort78]> { 1110349cc55cSDimitry Andric let Latency = 5; 1111349cc55cSDimitry Andric let NumMicroOps = 4; 11125f757f3fSDimitry Andric let ReleaseAtCycles = [1,2,1]; 1113349cc55cSDimitry Andric} 1114349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup66], (instregex "VPMOVDB(Z|Z128|Z256)mr(b?)", 1115349cc55cSDimitry Andric "VPMOVDW(Z|Z128|Z256)mr(b?)", 1116349cc55cSDimitry Andric "VPMOVQB(Z|Z128|Z256)mr(b?)", 1117349cc55cSDimitry Andric "VPMOVQW(Z|Z128|Z256)mr(b?)", 1118349cc55cSDimitry Andric "VPMOVSDB(Z|Z128|Z256)mr(b?)", 1119349cc55cSDimitry Andric "VPMOVSDW(Z|Z128|Z256)mr(b?)", 1120349cc55cSDimitry Andric "VPMOVSQB(Z|Z128|Z256)mr(b?)", 1121349cc55cSDimitry Andric "VPMOVSQD(Z|Z128|Z256)mr(b?)", 1122349cc55cSDimitry Andric "VPMOVSQW(Z|Z128|Z256)mr(b?)", 1123349cc55cSDimitry Andric "VPMOVSWB(Z|Z128|Z256)mr(b?)", 1124349cc55cSDimitry Andric "VPMOVUSDB(Z|Z128|Z256)mr(b?)", 1125349cc55cSDimitry Andric "VPMOVUSDW(Z|Z128|Z256)mr(b?)", 1126349cc55cSDimitry Andric "VPMOVUSQB(Z|Z128|Z256)mr(b?)", 1127349cc55cSDimitry Andric "VPMOVUSQD(Z|Z128|Z256)mr(b?)", 1128349cc55cSDimitry Andric "VPMOVUSQW(Z|Z128|Z256)mr(b?)", 1129349cc55cSDimitry Andric "VPMOVUSWB(Z|Z128|Z256)mr(b?)", 1130349cc55cSDimitry Andric "VPMOVWB(Z|Z128|Z256)mr(b?)")>; 1131349cc55cSDimitry Andric 1132349cc55cSDimitry Andricdef ICXWriteResGroup67 : SchedWriteRes<[ICXPort06,ICXPort0156]> { 1133349cc55cSDimitry Andric let Latency = 5; 1134349cc55cSDimitry Andric let NumMicroOps = 5; 11355f757f3fSDimitry Andric let ReleaseAtCycles = [1,4]; 1136349cc55cSDimitry Andric} 1137349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup67], (instrs XSETBV)>; 1138349cc55cSDimitry Andric 113906c3fb27SDimitry Andricdef ICXWriteResGroup69 : SchedWriteRes<[ICXPort49,ICXPort78,ICXPort0156]> { 1140349cc55cSDimitry Andric let Latency = 5; 1141349cc55cSDimitry Andric let NumMicroOps = 6; 11425f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,4]; 1143349cc55cSDimitry Andric} 1144349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup69], (instregex "PUSHF(16|64)")>; 1145349cc55cSDimitry Andric 1146349cc55cSDimitry Andricdef ICXWriteResGroup71 : SchedWriteRes<[ICXPort23]> { 1147349cc55cSDimitry Andric let Latency = 6; 1148349cc55cSDimitry Andric let NumMicroOps = 1; 11495f757f3fSDimitry Andric let ReleaseAtCycles = [1]; 1150349cc55cSDimitry Andric} 1151349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup71], (instrs VBROADCASTSSrm, 1152349cc55cSDimitry Andric VPBROADCASTDrm, 1153349cc55cSDimitry Andric VPBROADCASTQrm, 1154349cc55cSDimitry Andric VMOVSHDUPrm, 1155349cc55cSDimitry Andric VMOVSLDUPrm, 1156bdd1243dSDimitry Andric VMOVDDUPrm, 1157349cc55cSDimitry Andric MOVSHDUPrm, 1158bdd1243dSDimitry Andric MOVSLDUPrm, 1159bdd1243dSDimitry Andric MOVDDUPrm)>; 1160349cc55cSDimitry Andric 1161349cc55cSDimitry Andricdef ICXWriteResGroup72 : SchedWriteRes<[ICXPort5]> { 1162349cc55cSDimitry Andric let Latency = 6; 1163349cc55cSDimitry Andric let NumMicroOps = 2; 11645f757f3fSDimitry Andric let ReleaseAtCycles = [2]; 1165349cc55cSDimitry Andric} 11660eae32dcSDimitry Andricdef: InstRW<[ICXWriteResGroup72], (instrs MMX_CVTPI2PSrr)>; 1167349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup72], (instregex "VCOMPRESSPD(Z|Z128|Z256)rr", 1168349cc55cSDimitry Andric "VCOMPRESSPS(Z|Z128|Z256)rr", 1169349cc55cSDimitry Andric "VPCOMPRESSD(Z|Z128|Z256)rr", 1170349cc55cSDimitry Andric "VPCOMPRESSQ(Z|Z128|Z256)rr", 1171349cc55cSDimitry Andric "VPERMW(Z|Z128|Z256)rr")>; 1172349cc55cSDimitry Andric 1173349cc55cSDimitry Andricdef ICXWriteResGroup73 : SchedWriteRes<[ICXPort0,ICXPort23]> { 1174349cc55cSDimitry Andric let Latency = 6; 1175349cc55cSDimitry Andric let NumMicroOps = 2; 11765f757f3fSDimitry Andric let ReleaseAtCycles = [1,1]; 1177349cc55cSDimitry Andric} 11780eae32dcSDimitry Andricdef: InstRW<[ICXWriteResGroup73], (instrs MMX_PADDSBrm, 11790eae32dcSDimitry Andric MMX_PADDSWrm, 11800eae32dcSDimitry Andric MMX_PADDUSBrm, 11810eae32dcSDimitry Andric MMX_PADDUSWrm, 11820eae32dcSDimitry Andric MMX_PAVGBrm, 11830eae32dcSDimitry Andric MMX_PAVGWrm, 11840eae32dcSDimitry Andric MMX_PCMPEQBrm, 11850eae32dcSDimitry Andric MMX_PCMPEQDrm, 11860eae32dcSDimitry Andric MMX_PCMPEQWrm, 11870eae32dcSDimitry Andric MMX_PCMPGTBrm, 11880eae32dcSDimitry Andric MMX_PCMPGTDrm, 11890eae32dcSDimitry Andric MMX_PCMPGTWrm, 11900eae32dcSDimitry Andric MMX_PMAXSWrm, 11910eae32dcSDimitry Andric MMX_PMAXUBrm, 11920eae32dcSDimitry Andric MMX_PMINSWrm, 11930eae32dcSDimitry Andric MMX_PMINUBrm, 11940eae32dcSDimitry Andric MMX_PSUBSBrm, 11950eae32dcSDimitry Andric MMX_PSUBSWrm, 11960eae32dcSDimitry Andric MMX_PSUBUSBrm, 11970eae32dcSDimitry Andric MMX_PSUBUSWrm)>; 1198349cc55cSDimitry Andric 1199349cc55cSDimitry Andricdef ICXWriteResGroup76 : SchedWriteRes<[ICXPort6,ICXPort23]> { 1200349cc55cSDimitry Andric let Latency = 6; 1201349cc55cSDimitry Andric let NumMicroOps = 2; 12025f757f3fSDimitry Andric let ReleaseAtCycles = [1,1]; 1203349cc55cSDimitry Andric} 1204349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup76], (instrs FARJMP64m)>; 1205349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup76], (instregex "JMP(16|32|64)m")>; 1206349cc55cSDimitry Andric 1207349cc55cSDimitry Andricdef ICXWriteResGroup79 : SchedWriteRes<[ICXPort23,ICXPort15]> { 1208349cc55cSDimitry Andric let Latency = 6; 1209349cc55cSDimitry Andric let NumMicroOps = 2; 12105f757f3fSDimitry Andric let ReleaseAtCycles = [1,1]; 1211349cc55cSDimitry Andric} 1212349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup79], (instregex "ANDN(32|64)rm", 1213349cc55cSDimitry Andric "MOVBE(16|32|64)rm")>; 1214349cc55cSDimitry Andric 1215349cc55cSDimitry Andricdef ICXWriteResGroup80 : SchedWriteRes<[ICXPort23,ICXPort015]> { 1216349cc55cSDimitry Andric let Latency = 6; 1217349cc55cSDimitry Andric let NumMicroOps = 2; 12185f757f3fSDimitry Andric let ReleaseAtCycles = [1,1]; 1219349cc55cSDimitry Andric} 1220349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup80], (instregex "VMOV(64to|QI2)PQIZrm(b?)")>; 1221349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup80], (instrs VMOVDI2PDIZrm)>; 1222349cc55cSDimitry Andric 1223349cc55cSDimitry Andricdef ICXWriteResGroup81 : SchedWriteRes<[ICXPort23,ICXPort0156]> { 1224349cc55cSDimitry Andric let Latency = 6; 1225349cc55cSDimitry Andric let NumMicroOps = 2; 12265f757f3fSDimitry Andric let ReleaseAtCycles = [1,1]; 1227349cc55cSDimitry Andric} 1228349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup81], (instrs POP16r, POP32r, POP64r)>; 1229349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup81], (instregex "POP(16|32|64)rmr")>; 1230349cc55cSDimitry Andric 1231bdd1243dSDimitry Andricdef ICXWriteResGroup82 : SchedWriteRes<[ICXPort5,ICXPort01]> { 1232349cc55cSDimitry Andric let Latency = 6; 1233349cc55cSDimitry Andric let NumMicroOps = 3; 12345f757f3fSDimitry Andric let ReleaseAtCycles = [2,1]; 1235349cc55cSDimitry Andric} 1236349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup82], (instregex "(V?)CVTSI642SSrr", 1237349cc55cSDimitry Andric "VCVTSI642SSZrr", 1238349cc55cSDimitry Andric "VCVTUSI642SSZrr")>; 1239349cc55cSDimitry Andric 1240349cc55cSDimitry Andricdef ICXWriteResGroup84 : SchedWriteRes<[ICXPort1,ICXPort6,ICXPort06,ICXPort0156]> { 1241349cc55cSDimitry Andric let Latency = 6; 1242349cc55cSDimitry Andric let NumMicroOps = 4; 12435f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1,1]; 1244349cc55cSDimitry Andric} 1245349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup84], (instregex "SLDT(16|32|64)r")>; 1246349cc55cSDimitry Andric 124706c3fb27SDimitry Andricdef ICXWriteResGroup86 : SchedWriteRes<[ICXPort49,ICXPort23,ICXPort78,ICXPort06]> { 1248349cc55cSDimitry Andric let Latency = 6; 1249349cc55cSDimitry Andric let NumMicroOps = 4; 12505f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1,1]; 1251349cc55cSDimitry Andric} 1252349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup86], (instregex "SAR(8|16|32|64)m(1|i)", 1253349cc55cSDimitry Andric "SHL(8|16|32|64)m(1|i)", 1254349cc55cSDimitry Andric "SHR(8|16|32|64)m(1|i)")>; 1255349cc55cSDimitry Andric 125606c3fb27SDimitry Andricdef ICXWriteResGroup87 : SchedWriteRes<[ICXPort49,ICXPort23,ICXPort78,ICXPort0156]> { 1257349cc55cSDimitry Andric let Latency = 6; 1258349cc55cSDimitry Andric let NumMicroOps = 4; 12595f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1,1]; 1260349cc55cSDimitry Andric} 1261349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup87], (instregex "POP(16|32|64)rmm", 1262349cc55cSDimitry Andric "PUSH(16|32|64)rmm")>; 1263349cc55cSDimitry Andric 1264349cc55cSDimitry Andricdef ICXWriteResGroup88 : SchedWriteRes<[ICXPort6,ICXPort0156]> { 1265349cc55cSDimitry Andric let Latency = 6; 1266349cc55cSDimitry Andric let NumMicroOps = 6; 12675f757f3fSDimitry Andric let ReleaseAtCycles = [1,5]; 1268349cc55cSDimitry Andric} 1269349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup88], (instrs STD)>; 1270349cc55cSDimitry Andric 1271349cc55cSDimitry Andricdef ICXWriteResGroup89 : SchedWriteRes<[ICXPort23]> { 1272349cc55cSDimitry Andric let Latency = 7; 1273349cc55cSDimitry Andric let NumMicroOps = 1; 12745f757f3fSDimitry Andric let ReleaseAtCycles = [1]; 1275349cc55cSDimitry Andric} 1276349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup89], (instregex "LD_F(32|64|80)m")>; 12775f757f3fSDimitry Andricdef: InstRW<[ICXWriteResGroup89], (instrs VBROADCASTF128rm, 12785f757f3fSDimitry Andric VBROADCASTI128rm, 1279349cc55cSDimitry Andric VBROADCASTSDYrm, 1280349cc55cSDimitry Andric VBROADCASTSSYrm, 1281349cc55cSDimitry Andric VMOVDDUPYrm, 1282349cc55cSDimitry Andric VMOVSHDUPYrm, 1283349cc55cSDimitry Andric VMOVSLDUPYrm, 1284349cc55cSDimitry Andric VPBROADCASTDYrm, 1285349cc55cSDimitry Andric VPBROADCASTQYrm)>; 1286349cc55cSDimitry Andric 1287349cc55cSDimitry Andricdef ICXWriteResGroup90 : SchedWriteRes<[ICXPort01,ICXPort5]> { 1288349cc55cSDimitry Andric let Latency = 7; 1289349cc55cSDimitry Andric let NumMicroOps = 2; 12905f757f3fSDimitry Andric let ReleaseAtCycles = [1,1]; 1291349cc55cSDimitry Andric} 1292349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup90], (instrs VCVTDQ2PDYrr)>; 1293349cc55cSDimitry Andric 1294349cc55cSDimitry Andricdef ICXWriteResGroup92 : SchedWriteRes<[ICXPort5,ICXPort23]> { 1295349cc55cSDimitry Andric let Latency = 7; 1296349cc55cSDimitry Andric let NumMicroOps = 2; 12975f757f3fSDimitry Andric let ReleaseAtCycles = [1,1]; 1298349cc55cSDimitry Andric} 12990eae32dcSDimitry Andricdef: InstRW<[ICXWriteResGroup92], (instregex "VMOV(SD|SS)Zrm(b?)", 13000eae32dcSDimitry Andric "VPBROADCAST(B|W)(Z128)?rm", 13010eae32dcSDimitry Andric "(V?)INSERTPS(Z?)rm", 13020eae32dcSDimitry Andric "(V?)PALIGNR(Z128)?rmi", 13030eae32dcSDimitry Andric "(V?)PERMIL(PD|PS)(Z128)?m(b?)i", 13040eae32dcSDimitry Andric "(V?)PERMIL(PD|PS)(Z128)?rm", 13050eae32dcSDimitry Andric "(V?)UNPCK(L|H)(PD|PS)(Z128)?rm")>; 1306349cc55cSDimitry Andric 1307bdd1243dSDimitry Andricdef ICXWriteResGroup93 : SchedWriteRes<[ICXPort5,ICXPort01]> { 1308349cc55cSDimitry Andric let Latency = 7; 1309349cc55cSDimitry Andric let NumMicroOps = 2; 13105f757f3fSDimitry Andric let ReleaseAtCycles = [1,1]; 1311349cc55cSDimitry Andric} 1312349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup93], (instregex "VCVTDQ2PDZ256rr", 1313349cc55cSDimitry Andric "VCVTPD2DQ(Y|Z256)rr", 1314349cc55cSDimitry Andric "VCVTPD2UDQZ256rr", 1315349cc55cSDimitry Andric "VCVTPS2PD(Y|Z256)rr", 1316349cc55cSDimitry Andric "VCVTPS2QQZ256rr", 1317349cc55cSDimitry Andric "VCVTPS2UQQZ256rr", 1318349cc55cSDimitry Andric "VCVTQQ2PSZ256rr", 1319349cc55cSDimitry Andric "VCVTTPD2DQ(Y|Z256)rr", 1320349cc55cSDimitry Andric "VCVTTPD2UDQZ256rr", 1321349cc55cSDimitry Andric "VCVTTPS2QQZ256rr", 1322349cc55cSDimitry Andric "VCVTTPS2UQQZ256rr", 1323349cc55cSDimitry Andric "VCVTUDQ2PDZ256rr", 1324349cc55cSDimitry Andric "VCVTUQQ2PSZ256rr")>; 1325349cc55cSDimitry Andric 1326349cc55cSDimitry Andricdef ICXWriteResGroup93z : SchedWriteRes<[ICXPort5,ICXPort05]> { 1327349cc55cSDimitry Andric let Latency = 7; 1328349cc55cSDimitry Andric let NumMicroOps = 2; 13295f757f3fSDimitry Andric let ReleaseAtCycles = [1,1]; 1330349cc55cSDimitry Andric} 1331349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup93z], (instrs VCVTDQ2PDZrr, 1332349cc55cSDimitry Andric VCVTPD2DQZrr, 1333349cc55cSDimitry Andric VCVTPD2UDQZrr, 1334349cc55cSDimitry Andric VCVTPS2PDZrr, 1335349cc55cSDimitry Andric VCVTPS2QQZrr, 1336349cc55cSDimitry Andric VCVTPS2UQQZrr, 1337349cc55cSDimitry Andric VCVTQQ2PSZrr, 1338349cc55cSDimitry Andric VCVTTPD2DQZrr, 1339349cc55cSDimitry Andric VCVTTPD2UDQZrr, 1340349cc55cSDimitry Andric VCVTTPS2QQZrr, 1341349cc55cSDimitry Andric VCVTTPS2UQQZrr, 1342349cc55cSDimitry Andric VCVTUDQ2PDZrr, 1343349cc55cSDimitry Andric VCVTUQQ2PSZrr)>; 1344349cc55cSDimitry Andric 1345349cc55cSDimitry Andricdef ICXWriteResGroup95 : SchedWriteRes<[ICXPort23,ICXPort015]> { 1346349cc55cSDimitry Andric let Latency = 7; 1347349cc55cSDimitry Andric let NumMicroOps = 2; 13485f757f3fSDimitry Andric let ReleaseAtCycles = [1,1]; 1349349cc55cSDimitry Andric} 1350349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup95], (instrs VMOVNTDQAZ128rm, 1351349cc55cSDimitry Andric VPBLENDDrmi)>; 1352349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup95, ReadAfterVecXLd], 1353349cc55cSDimitry Andric (instregex "VBLENDMPDZ128rm(b?)", 1354349cc55cSDimitry Andric "VBLENDMPSZ128rm(b?)", 1355349cc55cSDimitry Andric "VBROADCASTI32X2Z128rm(b?)", 1356349cc55cSDimitry Andric "VBROADCASTSSZ128rm(b?)", 1357349cc55cSDimitry Andric "VINSERT(F|I)128rm", 1358349cc55cSDimitry Andric "VMOVAPDZ128rm(b?)", 1359349cc55cSDimitry Andric "VMOVAPSZ128rm(b?)", 1360349cc55cSDimitry Andric "VMOVDDUPZ128rm(b?)", 1361349cc55cSDimitry Andric "VMOVDQA32Z128rm(b?)", 1362349cc55cSDimitry Andric "VMOVDQA64Z128rm(b?)", 1363349cc55cSDimitry Andric "VMOVDQU16Z128rm(b?)", 1364349cc55cSDimitry Andric "VMOVDQU32Z128rm(b?)", 1365349cc55cSDimitry Andric "VMOVDQU64Z128rm(b?)", 1366349cc55cSDimitry Andric "VMOVDQU8Z128rm(b?)", 1367349cc55cSDimitry Andric "VMOVSHDUPZ128rm(b?)", 1368349cc55cSDimitry Andric "VMOVSLDUPZ128rm(b?)", 1369349cc55cSDimitry Andric "VMOVUPDZ128rm(b?)", 1370349cc55cSDimitry Andric "VMOVUPSZ128rm(b?)", 1371349cc55cSDimitry Andric "VPADD(B|D|Q|W)Z128rm(b?)", 1372349cc55cSDimitry Andric "(V?)PADD(B|D|Q|W)rm", 1373349cc55cSDimitry Andric "VPBLENDM(B|D|Q|W)Z128rm(b?)", 1374349cc55cSDimitry Andric "VPBROADCASTDZ128rm(b?)", 1375349cc55cSDimitry Andric "VPBROADCASTQZ128rm(b?)", 1376349cc55cSDimitry Andric "VPSUB(B|D|Q|W)Z128rm(b?)", 1377349cc55cSDimitry Andric "(V?)PSUB(B|D|Q|W)rm", 1378349cc55cSDimitry Andric "VPTERNLOGDZ128rm(b?)i", 1379349cc55cSDimitry Andric "VPTERNLOGQZ128rm(b?)i")>; 1380349cc55cSDimitry Andric 1381349cc55cSDimitry Andricdef ICXWriteResGroup96 : SchedWriteRes<[ICXPort5,ICXPort23]> { 1382349cc55cSDimitry Andric let Latency = 7; 1383349cc55cSDimitry Andric let NumMicroOps = 3; 13845f757f3fSDimitry Andric let ReleaseAtCycles = [2,1]; 1385349cc55cSDimitry Andric} 13860eae32dcSDimitry Andricdef: InstRW<[ICXWriteResGroup96], (instrs MMX_PACKSSDWrm, 13870eae32dcSDimitry Andric MMX_PACKSSWBrm, 13880eae32dcSDimitry Andric MMX_PACKUSWBrm)>; 1389349cc55cSDimitry Andric 1390349cc55cSDimitry Andricdef ICXWriteResGroup97 : SchedWriteRes<[ICXPort5,ICXPort015]> { 1391349cc55cSDimitry Andric let Latency = 7; 1392349cc55cSDimitry Andric let NumMicroOps = 3; 13935f757f3fSDimitry Andric let ReleaseAtCycles = [2,1]; 1394349cc55cSDimitry Andric} 13955f757f3fSDimitry Andricdef: InstRW<[ICXWriteResGroup97], (instregex "VPERMI2WZ128rr", 13965f757f3fSDimitry Andric "VPERMI2WZ256rr", 13975f757f3fSDimitry Andric "VPERMI2WZrr", 13985f757f3fSDimitry Andric "VPERMT2WZ128rr", 13995f757f3fSDimitry Andric "VPERMT2WZ256rr", 14005f757f3fSDimitry Andric "VPERMT2WZrr")>; 1401349cc55cSDimitry Andric 1402349cc55cSDimitry Andricdef ICXWriteResGroup99 : SchedWriteRes<[ICXPort23,ICXPort0156]> { 1403349cc55cSDimitry Andric let Latency = 7; 1404349cc55cSDimitry Andric let NumMicroOps = 3; 14055f757f3fSDimitry Andric let ReleaseAtCycles = [1,2]; 1406349cc55cSDimitry Andric} 1407349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup99], (instrs LEAVE, LEAVE64, 1408349cc55cSDimitry Andric SCASB, SCASL, SCASQ, SCASW)>; 1409349cc55cSDimitry Andric 1410bdd1243dSDimitry Andricdef ICXWriteResGroup100 : SchedWriteRes<[ICXPort0,ICXPort5,ICXPort01]> { 1411349cc55cSDimitry Andric let Latency = 7; 1412349cc55cSDimitry Andric let NumMicroOps = 3; 14135f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1]; 1414349cc55cSDimitry Andric} 1415bdd1243dSDimitry Andricdef: InstRW<[ICXWriteResGroup100], (instregex "(V?)CVT(T?)SS2SI64(Z?)rr", 1416bdd1243dSDimitry Andric "VCVT(T?)SS2USI64Zrr")>; 1417349cc55cSDimitry Andric 1418349cc55cSDimitry Andricdef ICXWriteResGroup101 : SchedWriteRes<[ICXPort0,ICXPort23,ICXPort05]> { 1419349cc55cSDimitry Andric let Latency = 7; 1420349cc55cSDimitry Andric let NumMicroOps = 3; 14215f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1]; 1422349cc55cSDimitry Andric} 1423349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup101], (instrs FLDCW16m)>; 1424349cc55cSDimitry Andric 1425349cc55cSDimitry Andricdef ICXWriteResGroup103 : SchedWriteRes<[ICXPort5,ICXPort23,ICXPort0156]> { 1426349cc55cSDimitry Andric let Latency = 7; 1427349cc55cSDimitry Andric let NumMicroOps = 3; 14285f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1]; 1429349cc55cSDimitry Andric} 1430349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup103], (instregex "KMOV(B|D|Q|W)km")>; 1431349cc55cSDimitry Andric 1432349cc55cSDimitry Andricdef ICXWriteResGroup104 : SchedWriteRes<[ICXPort6,ICXPort23,ICXPort0156]> { 1433349cc55cSDimitry Andric let Latency = 7; 1434349cc55cSDimitry Andric let NumMicroOps = 3; 14355f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1]; 1436349cc55cSDimitry Andric} 1437349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup104], (instrs LRET64, RET64)>; 1438349cc55cSDimitry Andric 143906c3fb27SDimitry Andricdef ICXWriteResGroup106 : SchedWriteRes<[ICXPort49,ICXPort5,ICXPort78]> { 1440349cc55cSDimitry Andric let Latency = 7; 1441349cc55cSDimitry Andric let NumMicroOps = 4; 14425f757f3fSDimitry Andric let ReleaseAtCycles = [1,2,1]; 1443349cc55cSDimitry Andric} 1444349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup106], (instregex "VCOMPRESSPD(Z|Z128|Z256)mr(b?)", 1445349cc55cSDimitry Andric "VCOMPRESSPS(Z|Z128|Z256)mr(b?)", 1446349cc55cSDimitry Andric "VPCOMPRESSD(Z|Z128|Z256)mr(b?)", 1447349cc55cSDimitry Andric "VPCOMPRESSQ(Z|Z128|Z256)mr(b?)")>; 1448349cc55cSDimitry Andric 144906c3fb27SDimitry Andricdef ICXWriteResGroup107 : SchedWriteRes<[ICXPort49,ICXPort23,ICXPort78,ICXPort06]> { 1450349cc55cSDimitry Andric let Latency = 7; 1451349cc55cSDimitry Andric let NumMicroOps = 5; 14525f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1,2]; 1453349cc55cSDimitry Andric} 1454349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup107], (instregex "ROL(8|16|32|64)m(1|i)", 1455349cc55cSDimitry Andric "ROR(8|16|32|64)m(1|i)")>; 1456349cc55cSDimitry Andric 1457349cc55cSDimitry Andricdef ICXWriteResGroup107_1 : SchedWriteRes<[ICXPort06]> { 1458349cc55cSDimitry Andric let Latency = 2; 1459349cc55cSDimitry Andric let NumMicroOps = 2; 14605f757f3fSDimitry Andric let ReleaseAtCycles = [2]; 1461349cc55cSDimitry Andric} 1462349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup107_1], (instrs ROL8r1, ROL16r1, ROL32r1, ROL64r1, 1463349cc55cSDimitry Andric ROR8r1, ROR16r1, ROR32r1, ROR64r1)>; 1464349cc55cSDimitry Andric 146506c3fb27SDimitry Andricdef ICXWriteResGroup108 : SchedWriteRes<[ICXPort49,ICXPort23,ICXPort78,ICXPort0156]> { 1466349cc55cSDimitry Andric let Latency = 7; 1467349cc55cSDimitry Andric let NumMicroOps = 5; 14685f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1,2]; 1469349cc55cSDimitry Andric} 1470349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup108], (instregex "XADD(8|16|32|64)rm")>; 1471349cc55cSDimitry Andric 147206c3fb27SDimitry Andricdef ICXWriteResGroup109 : SchedWriteRes<[ICXPort49,ICXPort6,ICXPort23,ICXPort78,ICXPort0156]> { 1473349cc55cSDimitry Andric let Latency = 7; 1474349cc55cSDimitry Andric let NumMicroOps = 5; 14755f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1,1,1]; 1476349cc55cSDimitry Andric} 1477349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup109], (instregex "CALL(16|32|64)m")>; 1478349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup109], (instrs FARCALL64m)>; 1479349cc55cSDimitry Andric 148006c3fb27SDimitry Andricdef ICXWriteResGroup110 : SchedWriteRes<[ICXPort0,ICXPort49,ICXPort78,ICXPort0156]> { 1481349cc55cSDimitry Andric let Latency = 7; 1482349cc55cSDimitry Andric let NumMicroOps = 7; 14835f757f3fSDimitry Andric let ReleaseAtCycles = [1,2,2,2]; 1484349cc55cSDimitry Andric} 1485349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup110], (instrs VPSCATTERDQZ128mr, 1486349cc55cSDimitry Andric VPSCATTERQQZ128mr, 1487349cc55cSDimitry Andric VSCATTERDPDZ128mr, 1488349cc55cSDimitry Andric VSCATTERQPDZ128mr)>; 1489349cc55cSDimitry Andric 1490349cc55cSDimitry Andricdef ICXWriteResGroup111 : SchedWriteRes<[ICXPort6,ICXPort06,ICXPort15,ICXPort0156]> { 1491349cc55cSDimitry Andric let Latency = 7; 1492349cc55cSDimitry Andric let NumMicroOps = 7; 14935f757f3fSDimitry Andric let ReleaseAtCycles = [1,3,1,2]; 1494349cc55cSDimitry Andric} 1495349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup111], (instrs LOOP)>; 1496349cc55cSDimitry Andric 149706c3fb27SDimitry Andricdef ICXWriteResGroup112 : SchedWriteRes<[ICXPort0,ICXPort49,ICXPort78,ICXPort0156]> { 1498349cc55cSDimitry Andric let Latency = 7; 1499349cc55cSDimitry Andric let NumMicroOps = 11; 15005f757f3fSDimitry Andric let ReleaseAtCycles = [1,4,4,2]; 1501349cc55cSDimitry Andric} 1502349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup112], (instrs VPSCATTERDQZ256mr, 1503349cc55cSDimitry Andric VPSCATTERQQZ256mr, 1504349cc55cSDimitry Andric VSCATTERDPDZ256mr, 1505349cc55cSDimitry Andric VSCATTERQPDZ256mr)>; 1506349cc55cSDimitry Andric 150706c3fb27SDimitry Andricdef ICXWriteResGroup113 : SchedWriteRes<[ICXPort0,ICXPort49,ICXPort78,ICXPort0156]> { 1508349cc55cSDimitry Andric let Latency = 7; 1509349cc55cSDimitry Andric let NumMicroOps = 19; 15105f757f3fSDimitry Andric let ReleaseAtCycles = [1,8,8,2]; 1511349cc55cSDimitry Andric} 1512349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup113], (instrs VPSCATTERDQZmr, 1513*6c4b055cSDimitry Andric VPSCATTERQDZmr, 1514349cc55cSDimitry Andric VPSCATTERQQZmr, 1515349cc55cSDimitry Andric VSCATTERDPDZmr, 1516*6c4b055cSDimitry Andric VSCATTERQPSZmr, 1517349cc55cSDimitry Andric VSCATTERQPDZmr)>; 1518349cc55cSDimitry Andric 151906c3fb27SDimitry Andricdef ICXWriteResGroup114 : SchedWriteRes<[ICXPort0,ICXPort49,ICXPort5,ICXPort78,ICXPort0156]> { 1520349cc55cSDimitry Andric let Latency = 7; 1521349cc55cSDimitry Andric let NumMicroOps = 36; 15225f757f3fSDimitry Andric let ReleaseAtCycles = [1,16,1,16,2]; 1523349cc55cSDimitry Andric} 1524349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup114], (instrs VSCATTERDPSZmr)>; 1525349cc55cSDimitry Andric 1526349cc55cSDimitry Andricdef ICXWriteResGroup118 : SchedWriteRes<[ICXPort1,ICXPort23]> { 1527349cc55cSDimitry Andric let Latency = 8; 1528349cc55cSDimitry Andric let NumMicroOps = 2; 15295f757f3fSDimitry Andric let ReleaseAtCycles = [1,1]; 1530349cc55cSDimitry Andric} 1531349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup118], (instregex "PDEP(32|64)rm", 1532349cc55cSDimitry Andric "PEXT(32|64)rm")>; 1533349cc55cSDimitry Andric 1534349cc55cSDimitry Andricdef ICXWriteResGroup119 : SchedWriteRes<[ICXPort5,ICXPort23]> { 1535349cc55cSDimitry Andric let Latency = 8; 1536349cc55cSDimitry Andric let NumMicroOps = 2; 15375f757f3fSDimitry Andric let ReleaseAtCycles = [1,1]; 1538349cc55cSDimitry Andric} 1539349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup119], (instregex "FCOM(P?)(32|64)m", 1540349cc55cSDimitry Andric "VPBROADCASTB(Z|Z256)rm(b?)", 15410eae32dcSDimitry Andric "VPBROADCASTW(Z|Z256)rm(b?)", 1542bdd1243dSDimitry Andric "(V?)PALIGNR(Y|Z256)rmi", 1543bdd1243dSDimitry Andric "(V?)PERMIL(PD|PS)(Y|Z256)m(b?)i", 1544bdd1243dSDimitry Andric "(V?)PERMIL(PD|PS)(Y|Z256)rm", 1545bdd1243dSDimitry Andric "(V?)UNPCK(L|H)(PD|PS)(Y|Z256)rm")>; 1546349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup119], (instrs VPBROADCASTBYrm, 1547349cc55cSDimitry Andric VPBROADCASTWYrm, 1548349cc55cSDimitry Andric VPMOVSXBDYrm, 1549349cc55cSDimitry Andric VPMOVSXBQYrm, 1550349cc55cSDimitry Andric VPMOVSXWQYrm)>; 1551349cc55cSDimitry Andric 1552349cc55cSDimitry Andricdef ICXWriteResGroup121 : SchedWriteRes<[ICXPort23,ICXPort015]> { 1553349cc55cSDimitry Andric let Latency = 8; 1554349cc55cSDimitry Andric let NumMicroOps = 2; 15555f757f3fSDimitry Andric let ReleaseAtCycles = [1,1]; 1556349cc55cSDimitry Andric} 1557349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup121], (instrs VMOVNTDQAZ256rm, 1558349cc55cSDimitry Andric VPBLENDDYrmi)>; 1559349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup121, ReadAfterVecYLd], 1560349cc55cSDimitry Andric (instregex "VBLENDMPD(Z|Z256)rm(b?)", 1561349cc55cSDimitry Andric "VBLENDMPS(Z|Z256)rm(b?)", 1562349cc55cSDimitry Andric "VBROADCASTF32X2Z256rm(b?)", 1563349cc55cSDimitry Andric "VBROADCASTF32X2Zrm(b?)", 1564349cc55cSDimitry Andric "VBROADCASTF32X4Z256rm(b?)", 1565349cc55cSDimitry Andric "VBROADCASTF32X4rm(b?)", 1566349cc55cSDimitry Andric "VBROADCASTF32X8rm(b?)", 1567349cc55cSDimitry Andric "VBROADCASTF64X2Z128rm(b?)", 1568349cc55cSDimitry Andric "VBROADCASTF64X2rm(b?)", 1569349cc55cSDimitry Andric "VBROADCASTF64X4rm(b?)", 1570349cc55cSDimitry Andric "VBROADCASTI32X2Z256rm(b?)", 1571349cc55cSDimitry Andric "VBROADCASTI32X2Zrm(b?)", 1572349cc55cSDimitry Andric "VBROADCASTI32X4Z256rm(b?)", 1573349cc55cSDimitry Andric "VBROADCASTI32X4rm(b?)", 1574349cc55cSDimitry Andric "VBROADCASTI32X8rm(b?)", 1575349cc55cSDimitry Andric "VBROADCASTI64X2Z128rm(b?)", 1576349cc55cSDimitry Andric "VBROADCASTI64X2rm(b?)", 1577349cc55cSDimitry Andric "VBROADCASTI64X4rm(b?)", 1578349cc55cSDimitry Andric "VBROADCASTSD(Z|Z256)rm(b?)", 1579349cc55cSDimitry Andric "VBROADCASTSS(Z|Z256)rm(b?)", 1580349cc55cSDimitry Andric "VINSERTF32x4(Z|Z256)rm(b?)", 1581349cc55cSDimitry Andric "VINSERTF32x8Zrm(b?)", 1582349cc55cSDimitry Andric "VINSERTF64x2(Z|Z256)rm(b?)", 1583349cc55cSDimitry Andric "VINSERTF64x4Zrm(b?)", 1584349cc55cSDimitry Andric "VINSERTI32x4(Z|Z256)rm(b?)", 1585349cc55cSDimitry Andric "VINSERTI32x8Zrm(b?)", 1586349cc55cSDimitry Andric "VINSERTI64x2(Z|Z256)rm(b?)", 1587349cc55cSDimitry Andric "VINSERTI64x4Zrm(b?)", 1588349cc55cSDimitry Andric "VMOVAPD(Z|Z256)rm(b?)", 1589349cc55cSDimitry Andric "VMOVAPS(Z|Z256)rm(b?)", 1590349cc55cSDimitry Andric "VMOVDDUP(Z|Z256)rm(b?)", 1591349cc55cSDimitry Andric "VMOVDQA32(Z|Z256)rm(b?)", 1592349cc55cSDimitry Andric "VMOVDQA64(Z|Z256)rm(b?)", 1593349cc55cSDimitry Andric "VMOVDQU16(Z|Z256)rm(b?)", 1594349cc55cSDimitry Andric "VMOVDQU32(Z|Z256)rm(b?)", 1595349cc55cSDimitry Andric "VMOVDQU64(Z|Z256)rm(b?)", 1596349cc55cSDimitry Andric "VMOVDQU8(Z|Z256)rm(b?)", 1597349cc55cSDimitry Andric "VMOVSHDUP(Z|Z256)rm(b?)", 1598349cc55cSDimitry Andric "VMOVSLDUP(Z|Z256)rm(b?)", 1599349cc55cSDimitry Andric "VMOVUPD(Z|Z256)rm(b?)", 1600349cc55cSDimitry Andric "VMOVUPS(Z|Z256)rm(b?)", 1601349cc55cSDimitry Andric "VPADD(B|D|Q|W)Yrm", 1602349cc55cSDimitry Andric "VPADD(B|D|Q|W)(Z|Z256)rm(b?)", 1603349cc55cSDimitry Andric "VPBLENDM(B|D|Q|W)(Z|Z256)rm(b?)", 1604349cc55cSDimitry Andric "VPBROADCASTD(Z|Z256)rm(b?)", 1605349cc55cSDimitry Andric "VPBROADCASTQ(Z|Z256)rm(b?)", 1606349cc55cSDimitry Andric "VPSUB(B|D|Q|W)Yrm", 1607349cc55cSDimitry Andric "VPSUB(B|D|Q|W)(Z|Z256)rm(b?)", 1608349cc55cSDimitry Andric "VPTERNLOGD(Z|Z256)rm(b?)i", 1609349cc55cSDimitry Andric "VPTERNLOGQ(Z|Z256)rm(b?)i")>; 1610349cc55cSDimitry Andric 1611349cc55cSDimitry Andricdef ICXWriteResGroup123 : SchedWriteRes<[ICXPort0,ICXPort5,ICXPort23]> { 1612349cc55cSDimitry Andric let Latency = 8; 1613349cc55cSDimitry Andric let NumMicroOps = 4; 16145f757f3fSDimitry Andric let ReleaseAtCycles = [1,2,1]; 1615349cc55cSDimitry Andric} 1616349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup123], (instregex "MMX_PH(ADD|SUB)SWrm")>; 1617349cc55cSDimitry Andric 161806c3fb27SDimitry Andricdef ICXWriteResGroup127 : SchedWriteRes<[ICXPort23,ICXPort78,ICXPort06,ICXPort0156]> { 1619349cc55cSDimitry Andric let Latency = 8; 1620349cc55cSDimitry Andric let NumMicroOps = 5; 16215f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1,2]; 1622349cc55cSDimitry Andric} 1623349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup127], (instregex "RCL(8|16|32|64)m(1|i)", 1624349cc55cSDimitry Andric "RCR(8|16|32|64)m(1|i)")>; 1625349cc55cSDimitry Andric 162606c3fb27SDimitry Andricdef ICXWriteResGroup128 : SchedWriteRes<[ICXPort49,ICXPort23,ICXPort78,ICXPort06]> { 1627349cc55cSDimitry Andric let Latency = 8; 1628349cc55cSDimitry Andric let NumMicroOps = 6; 16295f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1,3]; 1630349cc55cSDimitry Andric} 1631349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup128], (instregex "ROL(8|16|32|64)mCL", 1632349cc55cSDimitry Andric "ROR(8|16|32|64)mCL", 1633349cc55cSDimitry Andric "SAR(8|16|32|64)mCL", 1634349cc55cSDimitry Andric "SHL(8|16|32|64)mCL", 1635349cc55cSDimitry Andric "SHR(8|16|32|64)mCL")>; 1636349cc55cSDimitry Andric 163706c3fb27SDimitry Andricdef ICXWriteResGroup130 : SchedWriteRes<[ICXPort49,ICXPort23,ICXPort78,ICXPort06,ICXPort0156]> { 1638349cc55cSDimitry Andric let Latency = 8; 1639349cc55cSDimitry Andric let NumMicroOps = 6; 16405f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1,2,1]; 1641349cc55cSDimitry Andric} 1642349cc55cSDimitry Andricdef: SchedAlias<WriteADCRMW, ICXWriteResGroup130>; 1643349cc55cSDimitry Andric 164406c3fb27SDimitry Andricdef ICXWriteResGroup131 : SchedWriteRes<[ICXPort0,ICXPort49,ICXPort5,ICXPort78,ICXPort0156]> { 1645349cc55cSDimitry Andric let Latency = 8; 1646349cc55cSDimitry Andric let NumMicroOps = 8; 16475f757f3fSDimitry Andric let ReleaseAtCycles = [1,2,1,2,2]; 1648349cc55cSDimitry Andric} 1649349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup131], (instrs VPSCATTERQDZ128mr, 1650349cc55cSDimitry Andric VPSCATTERQDZ256mr, 1651349cc55cSDimitry Andric VSCATTERQPSZ128mr, 1652349cc55cSDimitry Andric VSCATTERQPSZ256mr)>; 1653349cc55cSDimitry Andric 165406c3fb27SDimitry Andricdef ICXWriteResGroup132 : SchedWriteRes<[ICXPort0,ICXPort49,ICXPort5,ICXPort78,ICXPort0156]> { 1655349cc55cSDimitry Andric let Latency = 8; 1656349cc55cSDimitry Andric let NumMicroOps = 12; 16575f757f3fSDimitry Andric let ReleaseAtCycles = [1,4,1,4,2]; 1658349cc55cSDimitry Andric} 1659349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup132], (instrs VPSCATTERDDZ128mr, 1660349cc55cSDimitry Andric VSCATTERDPSZ128mr)>; 1661349cc55cSDimitry Andric 166206c3fb27SDimitry Andricdef ICXWriteResGroup133 : SchedWriteRes<[ICXPort0,ICXPort49,ICXPort5,ICXPort78,ICXPort0156]> { 1663349cc55cSDimitry Andric let Latency = 8; 1664349cc55cSDimitry Andric let NumMicroOps = 20; 16655f757f3fSDimitry Andric let ReleaseAtCycles = [1,8,1,8,2]; 1666349cc55cSDimitry Andric} 1667349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup133], (instrs VPSCATTERDDZ256mr, 1668349cc55cSDimitry Andric VSCATTERDPSZ256mr)>; 1669349cc55cSDimitry Andric 167006c3fb27SDimitry Andricdef ICXWriteResGroup134 : SchedWriteRes<[ICXPort0,ICXPort49,ICXPort5,ICXPort78,ICXPort0156]> { 1671349cc55cSDimitry Andric let Latency = 8; 1672349cc55cSDimitry Andric let NumMicroOps = 36; 16735f757f3fSDimitry Andric let ReleaseAtCycles = [1,16,1,16,2]; 1674349cc55cSDimitry Andric} 1675349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup134], (instrs VPSCATTERDDZmr)>; 1676349cc55cSDimitry Andric 1677349cc55cSDimitry Andricdef ICXWriteResGroup135 : SchedWriteRes<[ICXPort0,ICXPort23]> { 1678349cc55cSDimitry Andric let Latency = 9; 1679349cc55cSDimitry Andric let NumMicroOps = 2; 16805f757f3fSDimitry Andric let ReleaseAtCycles = [1,1]; 1681349cc55cSDimitry Andric} 16820eae32dcSDimitry Andricdef: InstRW<[ICXWriteResGroup135], (instrs MMX_CVTPI2PSrm)>; 1683349cc55cSDimitry Andric 1684349cc55cSDimitry Andricdef ICXWriteResGroup136 : SchedWriteRes<[ICXPort5,ICXPort23]> { 1685349cc55cSDimitry Andric let Latency = 9; 1686349cc55cSDimitry Andric let NumMicroOps = 2; 16875f757f3fSDimitry Andric let ReleaseAtCycles = [1,1]; 1688349cc55cSDimitry Andric} 1689349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup136], (instrs VPMOVSXBWYrm, 1690349cc55cSDimitry Andric VPMOVSXDQYrm, 1691349cc55cSDimitry Andric VPMOVSXWDYrm, 1692349cc55cSDimitry Andric VPMOVZXWDYrm)>; 1693349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup136], (instregex "VALIGN(D|Q)Z128rm(b?)i", 1694349cc55cSDimitry Andric "VFPCLASSSDZrm(b?)", 1695349cc55cSDimitry Andric "VFPCLASSSSZrm(b?)", 1696349cc55cSDimitry Andric "(V?)PCMPGTQrm", 16975f757f3fSDimitry Andric "VPERMI2DZ128rm(b?)", 16985f757f3fSDimitry Andric "VPERMI2PDZ128rm(b?)", 16995f757f3fSDimitry Andric "VPERMI2PSZ128rm(b?)", 17005f757f3fSDimitry Andric "VPERMI2QZ128rm(b?)", 17015f757f3fSDimitry Andric "VPERMT2DZ128rm(b?)", 17025f757f3fSDimitry Andric "VPERMT2PDZ128rm(b?)", 17035f757f3fSDimitry Andric "VPERMT2PSZ128rm(b?)", 17045f757f3fSDimitry Andric "VPERMT2QZ128rm(b?)", 1705349cc55cSDimitry Andric "VPMAXSQZ128rm(b?)", 1706349cc55cSDimitry Andric "VPMAXUQZ128rm(b?)", 1707349cc55cSDimitry Andric "VPMINSQZ128rm(b?)", 17080eae32dcSDimitry Andric "VPMINUQZ128rm(b?)")>; 1709349cc55cSDimitry Andric 1710349cc55cSDimitry Andricdef ICXWriteResGroup136_2 : SchedWriteRes<[ICXPort5,ICXPort23]> { 1711349cc55cSDimitry Andric let Latency = 10; 1712349cc55cSDimitry Andric let NumMicroOps = 2; 17135f757f3fSDimitry Andric let ReleaseAtCycles = [1,1]; 1714349cc55cSDimitry Andric} 1715349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup136_2], (instregex "VCMP(PD|PS)Z128rm(b?)i", 1716349cc55cSDimitry Andric "VCMP(SD|SS)Zrm", 1717349cc55cSDimitry Andric "VFPCLASSPDZ128rm(b?)", 1718349cc55cSDimitry Andric "VFPCLASSPSZ128rm(b?)", 1719349cc55cSDimitry Andric "VPCMPBZ128rmi(b?)", 1720349cc55cSDimitry Andric "VPCMPDZ128rmi(b?)", 1721349cc55cSDimitry Andric "VPCMPEQ(B|D|Q|W)Z128rm(b?)", 1722349cc55cSDimitry Andric "VPCMPGT(B|D|Q|W)Z128rm(b?)", 1723349cc55cSDimitry Andric "VPCMPQZ128rmi(b?)", 1724349cc55cSDimitry Andric "VPCMPU(B|D|Q|W)Z128rmi(b?)", 1725349cc55cSDimitry Andric "VPCMPWZ128rmi(b?)", 1726bdd1243dSDimitry Andric "(V?)PACK(U|S)S(DW|WB)(Z128)?rm", 1727349cc55cSDimitry Andric "VPTESTMBZ128rm(b?)", 1728349cc55cSDimitry Andric "VPTESTMDZ128rm(b?)", 1729349cc55cSDimitry Andric "VPTESTMQZ128rm(b?)", 1730349cc55cSDimitry Andric "VPTESTMWZ128rm(b?)", 1731349cc55cSDimitry Andric "VPTESTNMBZ128rm(b?)", 1732349cc55cSDimitry Andric "VPTESTNMDZ128rm(b?)", 1733349cc55cSDimitry Andric "VPTESTNMQZ128rm(b?)", 1734349cc55cSDimitry Andric "VPTESTNMWZ128rm(b?)")>; 1735349cc55cSDimitry Andric 1736bdd1243dSDimitry Andricdef ICXWriteResGroup137 : SchedWriteRes<[ICXPort23,ICXPort01]> { 1737349cc55cSDimitry Andric let Latency = 9; 1738349cc55cSDimitry Andric let NumMicroOps = 2; 17395f757f3fSDimitry Andric let ReleaseAtCycles = [1,1]; 1740349cc55cSDimitry Andric} 17410eae32dcSDimitry Andricdef: InstRW<[ICXWriteResGroup137], (instregex "MMX_CVT(T?)PS2PIrm", 1742349cc55cSDimitry Andric "(V?)CVTPS2PDrm")>; 1743349cc55cSDimitry Andric 17440fca6ea1SDimitry Andricdef ICXWriteResGroup143 : SchedWriteRes<[ICXPort15,ICXPort01,ICXPort23]> { 1745349cc55cSDimitry Andric let Latency = 9; 1746349cc55cSDimitry Andric let NumMicroOps = 4; 17475f757f3fSDimitry Andric let ReleaseAtCycles = [2,1,1]; 1748349cc55cSDimitry Andric} 17490fca6ea1SDimitry Andricdef: InstRW<[ICXWriteResGroup143], (instrs PHADDSWrm, VPHADDSWrm, 17500fca6ea1SDimitry Andric PHSUBSWrm, VPHSUBSWrm)>; 1751349cc55cSDimitry Andric 1752349cc55cSDimitry Andricdef ICXWriteResGroup146 : SchedWriteRes<[ICXPort1,ICXPort6,ICXPort23,ICXPort0156]> { 1753349cc55cSDimitry Andric let Latency = 9; 1754349cc55cSDimitry Andric let NumMicroOps = 5; 17555f757f3fSDimitry Andric let ReleaseAtCycles = [1,2,1,1]; 1756349cc55cSDimitry Andric} 1757349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup146], (instregex "LAR(16|32|64)rm", 1758349cc55cSDimitry Andric "LSL(16|32|64)rm")>; 1759349cc55cSDimitry Andric 1760349cc55cSDimitry Andricdef ICXWriteResGroup148 : SchedWriteRes<[ICXPort5,ICXPort23]> { 1761349cc55cSDimitry Andric let Latency = 10; 1762349cc55cSDimitry Andric let NumMicroOps = 2; 17635f757f3fSDimitry Andric let ReleaseAtCycles = [1,1]; 1764349cc55cSDimitry Andric} 1765349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup148], (instrs VPCMPGTQYrm)>; 1766349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup148], (instregex "(ADD|SUB|SUBR)_F(32|64)m", 1767349cc55cSDimitry Andric "ILD_F(16|32|64)m", 1768349cc55cSDimitry Andric "VALIGND(Z|Z256)rm(b?)i", 1769349cc55cSDimitry Andric "VALIGNQ(Z|Z256)rm(b?)i", 1770349cc55cSDimitry Andric "VPMAXSQ(Z|Z256)rm(b?)", 1771349cc55cSDimitry Andric "VPMAXUQ(Z|Z256)rm(b?)", 1772349cc55cSDimitry Andric "VPMINSQ(Z|Z256)rm(b?)", 1773349cc55cSDimitry Andric "VPMINUQ(Z|Z256)rm(b?)")>; 1774349cc55cSDimitry Andric 1775349cc55cSDimitry Andricdef ICXWriteResGroup148_2 : SchedWriteRes<[ICXPort5,ICXPort23]> { 1776349cc55cSDimitry Andric let Latency = 11; 1777349cc55cSDimitry Andric let NumMicroOps = 2; 17785f757f3fSDimitry Andric let ReleaseAtCycles = [1,1]; 1779349cc55cSDimitry Andric} 1780349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup148_2], (instregex "VCMPPD(Z|Z256)rm(b?)i", 1781349cc55cSDimitry Andric "VCMPPS(Z|Z256)rm(b?)i", 1782349cc55cSDimitry Andric "VFPCLASSPD(Z|Z256)rm(b?)", 1783349cc55cSDimitry Andric "VFPCLASSPS(Z|Z256)rm(b?)", 1784349cc55cSDimitry Andric "VPCMPB(Z|Z256)rmi(b?)", 1785349cc55cSDimitry Andric "VPCMPD(Z|Z256)rmi(b?)", 1786349cc55cSDimitry Andric "VPCMPEQB(Z|Z256)rm(b?)", 1787349cc55cSDimitry Andric "VPCMPEQD(Z|Z256)rm(b?)", 1788349cc55cSDimitry Andric "VPCMPEQQ(Z|Z256)rm(b?)", 1789349cc55cSDimitry Andric "VPCMPEQW(Z|Z256)rm(b?)", 1790349cc55cSDimitry Andric "VPCMPGTB(Z|Z256)rm(b?)", 1791349cc55cSDimitry Andric "VPCMPGTD(Z|Z256)rm(b?)", 1792349cc55cSDimitry Andric "VPCMPGTQ(Z|Z256)rm(b?)", 1793349cc55cSDimitry Andric "VPCMPGTW(Z|Z256)rm(b?)", 1794349cc55cSDimitry Andric "VPCMPQ(Z|Z256)rmi(b?)", 1795349cc55cSDimitry Andric "VPCMPU(B|D|Q|W)Z256rmi(b?)", 1796349cc55cSDimitry Andric "VPCMPU(B|D|Q|W)Zrmi(b?)", 1797349cc55cSDimitry Andric "VPCMPW(Z|Z256)rmi(b?)", 1798bdd1243dSDimitry Andric "(V?)PACK(U|S)S(DW|WB)(Y|Z|Z256)rm", 1799349cc55cSDimitry Andric "VPTESTM(B|D|Q|W)Z256rm(b?)", 1800349cc55cSDimitry Andric "VPTESTM(B|D|Q|W)Zrm(b?)", 1801349cc55cSDimitry Andric "VPTESTNM(B|D|Q|W)Z256rm(b?)", 1802349cc55cSDimitry Andric "VPTESTNM(B|D|Q|W)Zrm(b?)")>; 1803349cc55cSDimitry Andric 1804bdd1243dSDimitry Andricdef ICXWriteResGroup149 : SchedWriteRes<[ICXPort23,ICXPort01]> { 1805349cc55cSDimitry Andric let Latency = 10; 1806349cc55cSDimitry Andric let NumMicroOps = 2; 18075f757f3fSDimitry Andric let ReleaseAtCycles = [1,1]; 1808349cc55cSDimitry Andric} 1809349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup149], (instregex "VCVTDQ2PDZ128rm(b?)", 1810349cc55cSDimitry Andric "VCVTDQ2PSZ128rm(b?)", 1811349cc55cSDimitry Andric "(V?)CVTDQ2PSrm", 1812349cc55cSDimitry Andric "VCVTPD2QQZ128rm(b?)", 1813349cc55cSDimitry Andric "VCVTPD2UQQZ128rm(b?)", 1814349cc55cSDimitry Andric "VCVTPH2PSZ128rm(b?)", 1815349cc55cSDimitry Andric "VCVTPS2DQZ128rm(b?)", 1816349cc55cSDimitry Andric "(V?)CVTPS2DQrm", 1817349cc55cSDimitry Andric "VCVTPS2PDZ128rm(b?)", 1818349cc55cSDimitry Andric "VCVTPS2QQZ128rm(b?)", 1819349cc55cSDimitry Andric "VCVTPS2UDQZ128rm(b?)", 1820349cc55cSDimitry Andric "VCVTPS2UQQZ128rm(b?)", 1821349cc55cSDimitry Andric "VCVTQQ2PDZ128rm(b?)", 1822349cc55cSDimitry Andric "VCVTQQ2PSZ128rm(b?)", 1823349cc55cSDimitry Andric "VCVTSS2SDZrm", 1824349cc55cSDimitry Andric "(V?)CVTSS2SDrm", 1825349cc55cSDimitry Andric "VCVTTPD2QQZ128rm(b?)", 1826349cc55cSDimitry Andric "VCVTTPD2UQQZ128rm(b?)", 1827349cc55cSDimitry Andric "VCVTTPS2DQZ128rm(b?)", 1828349cc55cSDimitry Andric "(V?)CVTTPS2DQrm", 1829349cc55cSDimitry Andric "VCVTTPS2QQZ128rm(b?)", 1830349cc55cSDimitry Andric "VCVTTPS2UDQZ128rm(b?)", 1831349cc55cSDimitry Andric "VCVTTPS2UQQZ128rm(b?)", 1832349cc55cSDimitry Andric "VCVTUDQ2PDZ128rm(b?)", 1833349cc55cSDimitry Andric "VCVTUDQ2PSZ128rm(b?)", 1834349cc55cSDimitry Andric "VCVTUQQ2PDZ128rm(b?)", 1835349cc55cSDimitry Andric "VCVTUQQ2PSZ128rm(b?)")>; 1836349cc55cSDimitry Andric 1837349cc55cSDimitry Andricdef ICXWriteResGroup151 : SchedWriteRes<[ICXPort5,ICXPort23]> { 1838349cc55cSDimitry Andric let Latency = 10; 1839349cc55cSDimitry Andric let NumMicroOps = 3; 18405f757f3fSDimitry Andric let ReleaseAtCycles = [2,1]; 1841349cc55cSDimitry Andric} 1842349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup151], (instregex "VEXPANDPDZ128rm(b?)", 1843349cc55cSDimitry Andric "VEXPANDPSZ128rm(b?)", 1844349cc55cSDimitry Andric "VPEXPANDDZ128rm(b?)", 1845349cc55cSDimitry Andric "VPEXPANDQZ128rm(b?)")>; 1846349cc55cSDimitry Andric 18470fca6ea1SDimitry Andricdef ICXWriteResGroup154 : SchedWriteRes<[ICXPort15,ICXPort01,ICXPort23]> { 1848349cc55cSDimitry Andric let Latency = 10; 1849349cc55cSDimitry Andric let NumMicroOps = 4; 18505f757f3fSDimitry Andric let ReleaseAtCycles = [2,1,1]; 1851349cc55cSDimitry Andric} 1852349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup154], (instrs VPHADDSWYrm, 1853349cc55cSDimitry Andric VPHSUBSWYrm)>; 1854349cc55cSDimitry Andric 185506c3fb27SDimitry Andricdef ICXWriteResGroup157 : SchedWriteRes<[ICXPort49,ICXPort6,ICXPort23,ICXPort78,ICXPort06,ICXPort0156]> { 1856349cc55cSDimitry Andric let Latency = 10; 1857349cc55cSDimitry Andric let NumMicroOps = 8; 18585f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1,1,1,3]; 1859349cc55cSDimitry Andric} 1860349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup157], (instregex "XCHG(8|16|32|64)rm")>; 1861349cc55cSDimitry Andric 1862349cc55cSDimitry Andricdef ICXWriteResGroup160 : SchedWriteRes<[ICXPort0,ICXPort23]> { 1863349cc55cSDimitry Andric let Latency = 11; 1864349cc55cSDimitry Andric let NumMicroOps = 2; 18655f757f3fSDimitry Andric let ReleaseAtCycles = [1,1]; 1866349cc55cSDimitry Andric} 1867349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup160], (instregex "MUL_F(32|64)m")>; 1868349cc55cSDimitry Andric 1869bdd1243dSDimitry Andricdef ICXWriteResGroup161 : SchedWriteRes<[ICXPort23,ICXPort01]> { 1870349cc55cSDimitry Andric let Latency = 11; 1871349cc55cSDimitry Andric let NumMicroOps = 2; 18725f757f3fSDimitry Andric let ReleaseAtCycles = [1,1]; 1873349cc55cSDimitry Andric} 1874349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup161], (instrs VCVTDQ2PSYrm, 1875349cc55cSDimitry Andric VCVTPS2PDYrm)>; 1876349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup161], (instregex "VCVTDQ2(PD|PS)(Z|Z256)rm(b?)", 1877349cc55cSDimitry Andric "VCVTPH2PS(Z|Z256)rm(b?)", 1878349cc55cSDimitry Andric "VCVTPS2PD(Z|Z256)rm(b?)", 1879349cc55cSDimitry Andric "VCVTQQ2PD(Z|Z256)rm(b?)", 1880349cc55cSDimitry Andric "VCVTQQ2PSZ256rm(b?)", 1881349cc55cSDimitry Andric "VCVT(T?)PD2QQ(Z|Z256)rm(b?)", 1882349cc55cSDimitry Andric "VCVT(T?)PD2UQQ(Z|Z256)rm(b?)", 1883349cc55cSDimitry Andric "VCVT(T?)PS2DQYrm", 1884349cc55cSDimitry Andric "VCVT(T?)PS2DQ(Z|Z256)rm(b?)", 1885349cc55cSDimitry Andric "VCVT(T?)PS2QQZ256rm(b?)", 1886349cc55cSDimitry Andric "VCVT(T?)PS2UDQ(Z|Z256)rm(b?)", 1887349cc55cSDimitry Andric "VCVT(T?)PS2UQQZ256rm(b?)", 1888349cc55cSDimitry Andric "VCVTUDQ2(PD|PS)(Z|Z256)rm(b?)", 1889349cc55cSDimitry Andric "VCVTUQQ2PD(Z|Z256)rm(b?)", 1890349cc55cSDimitry Andric "VCVTUQQ2PSZ256rm(b?)")>; 1891349cc55cSDimitry Andric 1892349cc55cSDimitry Andricdef ICXWriteResGroup162 : SchedWriteRes<[ICXPort5,ICXPort23]> { 1893349cc55cSDimitry Andric let Latency = 11; 1894349cc55cSDimitry Andric let NumMicroOps = 3; 18955f757f3fSDimitry Andric let ReleaseAtCycles = [2,1]; 1896349cc55cSDimitry Andric} 1897349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup162], (instregex "FICOM(P?)(16|32)m", 1898349cc55cSDimitry Andric "VEXPANDPD(Z|Z256)rm(b?)", 1899349cc55cSDimitry Andric "VEXPANDPS(Z|Z256)rm(b?)", 1900349cc55cSDimitry Andric "VPEXPANDD(Z|Z256)rm(b?)", 1901349cc55cSDimitry Andric "VPEXPANDQ(Z|Z256)rm(b?)")>; 1902349cc55cSDimitry Andric 1903349cc55cSDimitry Andricdef ICXWriteResGroup164 : SchedWriteRes<[ICXPort0,ICXPort5,ICXPort23]> { 1904349cc55cSDimitry Andric let Latency = 11; 1905349cc55cSDimitry Andric let NumMicroOps = 3; 19065f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1]; 1907349cc55cSDimitry Andric} 1908349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup164], (instregex "(V?)CVTDQ2PDrm")>; 1909349cc55cSDimitry Andric 1910bdd1243dSDimitry Andricdef ICXWriteResGroup166 : SchedWriteRes<[ICXPort5,ICXPort23,ICXPort01]> { 1911349cc55cSDimitry Andric let Latency = 11; 1912349cc55cSDimitry Andric let NumMicroOps = 3; 19135f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1]; 1914349cc55cSDimitry Andric} 1915bdd1243dSDimitry Andricdef: InstRW<[ICXWriteResGroup166], (instrs CVTPD2DQrm, 1916349cc55cSDimitry Andric CVTTPD2DQrm, 19170eae32dcSDimitry Andric MMX_CVTPD2PIrm, 19180eae32dcSDimitry Andric MMX_CVTTPD2PIrm)>; 1919349cc55cSDimitry Andric 1920349cc55cSDimitry Andricdef ICXWriteResGroup167 : SchedWriteRes<[ICXPort5,ICXPort23,ICXPort015]> { 1921349cc55cSDimitry Andric let Latency = 11; 1922349cc55cSDimitry Andric let NumMicroOps = 4; 19235f757f3fSDimitry Andric let ReleaseAtCycles = [2,1,1]; 1924349cc55cSDimitry Andric} 1925349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup167], (instregex "VPCONFLICTQZ128rm(b?)")>; 1926349cc55cSDimitry Andric 1927349cc55cSDimitry Andricdef ICXWriteResGroup169 : SchedWriteRes<[ICXPort1,ICXPort06,ICXPort0156]> { 1928349cc55cSDimitry Andric let Latency = 11; 1929349cc55cSDimitry Andric let NumMicroOps = 7; 19305f757f3fSDimitry Andric let ReleaseAtCycles = [2,3,2]; 1931349cc55cSDimitry Andric} 1932349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup169], (instregex "RCL(16|32|64)rCL", 1933349cc55cSDimitry Andric "RCR(16|32|64)rCL")>; 1934349cc55cSDimitry Andric 1935349cc55cSDimitry Andricdef ICXWriteResGroup170 : SchedWriteRes<[ICXPort1,ICXPort06,ICXPort15,ICXPort0156]> { 1936349cc55cSDimitry Andric let Latency = 11; 1937349cc55cSDimitry Andric let NumMicroOps = 9; 19385f757f3fSDimitry Andric let ReleaseAtCycles = [1,5,1,2]; 1939349cc55cSDimitry Andric} 1940349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup170], (instrs RCL8rCL)>; 1941349cc55cSDimitry Andric 1942349cc55cSDimitry Andricdef ICXWriteResGroup171 : SchedWriteRes<[ICXPort06,ICXPort0156]> { 1943349cc55cSDimitry Andric let Latency = 11; 1944349cc55cSDimitry Andric let NumMicroOps = 11; 19455f757f3fSDimitry Andric let ReleaseAtCycles = [2,9]; 1946349cc55cSDimitry Andric} 1947349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup171], (instrs LOOPE, LOOPNE)>; 1948349cc55cSDimitry Andric 1949349cc55cSDimitry Andricdef ICXWriteResGroup174 : SchedWriteRes<[ICXPort01]> { 1950349cc55cSDimitry Andric let Latency = 15; 1951349cc55cSDimitry Andric let NumMicroOps = 3; 19525f757f3fSDimitry Andric let ReleaseAtCycles = [3]; 1953349cc55cSDimitry Andric} 1954349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup174], (instregex "VPMULLQ(Z128|Z256)rr")>; 1955349cc55cSDimitry Andric 1956bdd1243dSDimitry Andricdef ICXWriteResGroup174z : SchedWriteRes<[ICXPort0]> { 1957349cc55cSDimitry Andric let Latency = 15; 1958349cc55cSDimitry Andric let NumMicroOps = 3; 19595f757f3fSDimitry Andric let ReleaseAtCycles = [3]; 1960349cc55cSDimitry Andric} 1961349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup174z], (instregex "VPMULLQZrr")>; 1962349cc55cSDimitry Andric 1963349cc55cSDimitry Andricdef ICXWriteResGroup175 : SchedWriteRes<[ICXPort5,ICXPort23]> { 1964349cc55cSDimitry Andric let Latency = 12; 1965349cc55cSDimitry Andric let NumMicroOps = 3; 19665f757f3fSDimitry Andric let ReleaseAtCycles = [2,1]; 1967349cc55cSDimitry Andric} 1968349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup175], (instregex "VPERMWZ128rm(b?)")>; 1969349cc55cSDimitry Andric 1970bdd1243dSDimitry Andricdef ICXWriteResGroup176 : SchedWriteRes<[ICXPort0,ICXPort23,ICXPort01]> { 1971349cc55cSDimitry Andric let Latency = 12; 1972349cc55cSDimitry Andric let NumMicroOps = 3; 19735f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1]; 1974349cc55cSDimitry Andric} 1975349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup176], (instregex "VCVT(T?)SD2USIZrm(b?)", 1976349cc55cSDimitry Andric "VCVT(T?)SS2USI64Zrm(b?)")>; 1977349cc55cSDimitry Andric 1978bdd1243dSDimitry Andricdef ICXWriteResGroup177 : SchedWriteRes<[ICXPort5,ICXPort23,ICXPort01]> { 1979349cc55cSDimitry Andric let Latency = 12; 1980349cc55cSDimitry Andric let NumMicroOps = 3; 19815f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1]; 1982349cc55cSDimitry Andric} 1983349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup177], (instregex "VCVT(T?)PS2QQZrm(b?)", 1984349cc55cSDimitry Andric "VCVT(T?)PS2UQQZrm(b?)")>; 1985349cc55cSDimitry Andric 1986349cc55cSDimitry Andricdef ICXWriteResGroup180 : SchedWriteRes<[ICXPort5,ICXPort23]> { 1987349cc55cSDimitry Andric let Latency = 13; 1988349cc55cSDimitry Andric let NumMicroOps = 3; 19895f757f3fSDimitry Andric let ReleaseAtCycles = [2,1]; 1990349cc55cSDimitry Andric} 1991349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup180], (instregex "(ADD|SUB|SUBR)_FI(16|32)m", 1992349cc55cSDimitry Andric "VPERMWZ256rm(b?)", 1993349cc55cSDimitry Andric "VPERMWZrm(b?)")>; 1994349cc55cSDimitry Andric 1995349cc55cSDimitry Andricdef ICXWriteResGroup181 : SchedWriteRes<[ICXPort0,ICXPort5,ICXPort23]> { 1996349cc55cSDimitry Andric let Latency = 13; 1997349cc55cSDimitry Andric let NumMicroOps = 3; 19985f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1]; 1999349cc55cSDimitry Andric} 2000349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup181], (instrs VCVTDQ2PDYrm)>; 2001349cc55cSDimitry Andric 2002349cc55cSDimitry Andricdef ICXWriteResGroup183 : SchedWriteRes<[ICXPort5,ICXPort23,ICXPort015]> { 2003349cc55cSDimitry Andric let Latency = 13; 2004349cc55cSDimitry Andric let NumMicroOps = 4; 20055f757f3fSDimitry Andric let ReleaseAtCycles = [2,1,1]; 2006349cc55cSDimitry Andric} 20075f757f3fSDimitry Andricdef: InstRW<[ICXWriteResGroup183], (instregex "VPERMI2WZ128rm(b?)", 20085f757f3fSDimitry Andric "VPERMT2WZ128rm(b?)")>; 2009349cc55cSDimitry Andric 2010349cc55cSDimitry Andricdef ICXWriteResGroup187 : SchedWriteRes<[ICXPort0,ICXPort5,ICXPort23]> { 2011349cc55cSDimitry Andric let Latency = 14; 2012349cc55cSDimitry Andric let NumMicroOps = 3; 20135f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1]; 2014349cc55cSDimitry Andric} 2015349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup187], (instregex "MUL_FI(16|32)m")>; 2016349cc55cSDimitry Andric 2017bdd1243dSDimitry Andricdef ICXWriteResGroup188 : SchedWriteRes<[ICXPort5,ICXPort23,ICXPort01]> { 2018349cc55cSDimitry Andric let Latency = 14; 2019349cc55cSDimitry Andric let NumMicroOps = 3; 20205f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1]; 2021349cc55cSDimitry Andric} 2022349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup188], (instregex "VCVTPD2DQZrm(b?)", 2023349cc55cSDimitry Andric "VCVTPD2UDQZrm(b?)", 2024349cc55cSDimitry Andric "VCVTQQ2PSZrm(b?)", 2025349cc55cSDimitry Andric "VCVTTPD2DQZrm(b?)", 2026349cc55cSDimitry Andric "VCVTTPD2UDQZrm(b?)", 2027349cc55cSDimitry Andric "VCVTUQQ2PSZrm(b?)")>; 2028349cc55cSDimitry Andric 2029349cc55cSDimitry Andricdef ICXWriteResGroup189 : SchedWriteRes<[ICXPort5,ICXPort23,ICXPort015]> { 2030349cc55cSDimitry Andric let Latency = 14; 2031349cc55cSDimitry Andric let NumMicroOps = 4; 20325f757f3fSDimitry Andric let ReleaseAtCycles = [2,1,1]; 2033349cc55cSDimitry Andric} 20345f757f3fSDimitry Andricdef: InstRW<[ICXWriteResGroup189], (instregex "VPERMI2WZ256rm(b?)", 20355f757f3fSDimitry Andric "VPERMI2WZrm(b?)", 20365f757f3fSDimitry Andric "VPERMT2WZ256rm(b?)", 20375f757f3fSDimitry Andric "VPERMT2WZrm(b?)")>; 2038349cc55cSDimitry Andric 2039349cc55cSDimitry Andricdef ICXWriteResGroup190 : SchedWriteRes<[ICXPort1,ICXPort06,ICXPort15,ICXPort0156]> { 2040349cc55cSDimitry Andric let Latency = 14; 2041349cc55cSDimitry Andric let NumMicroOps = 10; 20425f757f3fSDimitry Andric let ReleaseAtCycles = [2,4,1,3]; 2043349cc55cSDimitry Andric} 2044349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup190], (instrs RCR8rCL)>; 2045349cc55cSDimitry Andric 2046349cc55cSDimitry Andricdef ICXWriteResGroup191 : SchedWriteRes<[ICXPort0]> { 2047349cc55cSDimitry Andric let Latency = 15; 2048349cc55cSDimitry Andric let NumMicroOps = 1; 20495f757f3fSDimitry Andric let ReleaseAtCycles = [1]; 2050349cc55cSDimitry Andric} 2051349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup191], (instregex "DIVR_(FPrST0|FST0r|FrST0)")>; 2052349cc55cSDimitry Andric 2053349cc55cSDimitry Andricdef ICXWriteResGroup194 : SchedWriteRes<[ICXPort1,ICXPort5,ICXPort01,ICXPort23,ICXPort015]> { 2054349cc55cSDimitry Andric let Latency = 15; 2055349cc55cSDimitry Andric let NumMicroOps = 8; 20565f757f3fSDimitry Andric let ReleaseAtCycles = [1,2,2,1,2]; 2057349cc55cSDimitry Andric} 2058349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup194], (instregex "VPCONFLICTDZ128rm(b?)")>; 2059349cc55cSDimitry Andric 206006c3fb27SDimitry Andricdef ICXWriteResGroup195 : SchedWriteRes<[ICXPort1,ICXPort23,ICXPort78,ICXPort06,ICXPort15,ICXPort0156]> { 2061349cc55cSDimitry Andric let Latency = 15; 2062349cc55cSDimitry Andric let NumMicroOps = 10; 20635f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1,5,1,1]; 2064349cc55cSDimitry Andric} 2065349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup195], (instregex "RCL(8|16|32|64)mCL")>; 2066349cc55cSDimitry Andric 206706c3fb27SDimitry Andricdef ICXWriteResGroup199 : SchedWriteRes<[ICXPort49,ICXPort23,ICXPort78,ICXPort06,ICXPort15,ICXPort0156]> { 2068349cc55cSDimitry Andric let Latency = 16; 2069349cc55cSDimitry Andric let NumMicroOps = 14; 20705f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1,4,2,5]; 2071349cc55cSDimitry Andric} 2072349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup199], (instrs CMPXCHG8B)>; 2073349cc55cSDimitry Andric 2074349cc55cSDimitry Andricdef ICXWriteResGroup200 : SchedWriteRes<[ICXPort1, ICXPort05, ICXPort6]> { 2075349cc55cSDimitry Andric let Latency = 12; 2076349cc55cSDimitry Andric let NumMicroOps = 34; 20775f757f3fSDimitry Andric let ReleaseAtCycles = [1, 4, 5]; 2078349cc55cSDimitry Andric} 2079349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup200], (instrs VZEROALL)>; 2080349cc55cSDimitry Andric 2081349cc55cSDimitry Andricdef ICXWriteResGroup202 : SchedWriteRes<[ICXPort0,ICXPort1,ICXPort5,ICXPort6,ICXPort05,ICXPort0156]> { 2082349cc55cSDimitry Andric let Latency = 17; 2083349cc55cSDimitry Andric let NumMicroOps = 15; 20845f757f3fSDimitry Andric let ReleaseAtCycles = [2,1,2,4,2,4]; 2085349cc55cSDimitry Andric} 2086349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup202], (instrs XCH_F)>; 2087349cc55cSDimitry Andric 2088349cc55cSDimitry Andricdef ICXWriteResGroup205 : SchedWriteRes<[ICXPort23,ICXPort01]> { 2089349cc55cSDimitry Andric let Latency = 21; 2090349cc55cSDimitry Andric let NumMicroOps = 4; 20915f757f3fSDimitry Andric let ReleaseAtCycles = [1,3]; 2092349cc55cSDimitry Andric} 2093349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup205], (instregex "VPMULLQZ128rm(b?)")>; 2094349cc55cSDimitry Andric 2095349cc55cSDimitry Andricdef ICXWriteResGroup207 : SchedWriteRes<[ICXPort5,ICXPort6,ICXPort06,ICXPort0156]> { 2096349cc55cSDimitry Andric let Latency = 18; 2097349cc55cSDimitry Andric let NumMicroOps = 8; 20985f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1,5]; 2099349cc55cSDimitry Andric} 2100349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup207], (instrs CPUID, RDTSC)>; 2101349cc55cSDimitry Andric 210206c3fb27SDimitry Andricdef ICXWriteResGroup208 : SchedWriteRes<[ICXPort1,ICXPort23,ICXPort78,ICXPort06,ICXPort15,ICXPort0156]> { 2103349cc55cSDimitry Andric let Latency = 18; 2104349cc55cSDimitry Andric let NumMicroOps = 11; 21055f757f3fSDimitry Andric let ReleaseAtCycles = [2,1,1,4,1,2]; 2106349cc55cSDimitry Andric} 2107349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup208], (instregex "RCR(8|16|32|64)mCL")>; 2108349cc55cSDimitry Andric 2109349cc55cSDimitry Andricdef ICXWriteResGroup211 : SchedWriteRes<[ICXPort23,ICXPort01]> { 2110349cc55cSDimitry Andric let Latency = 22; 2111349cc55cSDimitry Andric let NumMicroOps = 4; 21125f757f3fSDimitry Andric let ReleaseAtCycles = [1,3]; 2113349cc55cSDimitry Andric} 2114349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup211], (instregex "VPMULLQZ256rm(b?)")>; 2115349cc55cSDimitry Andric 2116bdd1243dSDimitry Andricdef ICXWriteResGroup211_1 : SchedWriteRes<[ICXPort23,ICXPort0]> { 2117349cc55cSDimitry Andric let Latency = 22; 2118349cc55cSDimitry Andric let NumMicroOps = 4; 21195f757f3fSDimitry Andric let ReleaseAtCycles = [1,3]; 2120349cc55cSDimitry Andric} 2121349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup211_1], (instregex "VPMULLQZrm(b?)")>; 2122349cc55cSDimitry Andric 2123349cc55cSDimitry Andricdef ICXWriteResGroup215 : SchedWriteRes<[ICXPort0]> { 2124349cc55cSDimitry Andric let Latency = 20; 2125349cc55cSDimitry Andric let NumMicroOps = 1; 21265f757f3fSDimitry Andric let ReleaseAtCycles = [1]; 2127349cc55cSDimitry Andric} 2128349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup215], (instregex "DIV_(FPrST0|FST0r|FrST0)")>; 2129349cc55cSDimitry Andric 2130349cc55cSDimitry Andricdef ICXWriteGatherEVEX2 : SchedWriteRes<[ICXPort0,ICXPort23,ICXPort015,ICXPort0156]> { 2131349cc55cSDimitry Andric let Latency = 17; 2132349cc55cSDimitry Andric let NumMicroOps = 5; // 2 uops perform multiple loads 21335f757f3fSDimitry Andric let ReleaseAtCycles = [1,2,1,1]; 2134349cc55cSDimitry Andric} 2135349cc55cSDimitry Andricdef: InstRW<[ICXWriteGatherEVEX2], (instrs VGATHERQPSZ128rm, VPGATHERQDZ128rm, 2136349cc55cSDimitry Andric VGATHERDPDZ128rm, VPGATHERDQZ128rm, 2137349cc55cSDimitry Andric VGATHERQPDZ128rm, VPGATHERQQZ128rm)>; 2138349cc55cSDimitry Andric 2139349cc55cSDimitry Andricdef ICXWriteGatherEVEX4 : SchedWriteRes<[ICXPort0,ICXPort23,ICXPort015,ICXPort0156]> { 2140349cc55cSDimitry Andric let Latency = 19; 2141349cc55cSDimitry Andric let NumMicroOps = 5; // 2 uops perform multiple loads 21425f757f3fSDimitry Andric let ReleaseAtCycles = [1,4,1,1]; 2143349cc55cSDimitry Andric} 2144349cc55cSDimitry Andricdef: InstRW<[ICXWriteGatherEVEX4], (instrs VGATHERQPSZ256rm, VPGATHERQDZ256rm, 2145349cc55cSDimitry Andric VGATHERQPDZ256rm, VPGATHERQQZ256rm, 2146349cc55cSDimitry Andric VGATHERDPSZ128rm, VPGATHERDDZ128rm, 2147349cc55cSDimitry Andric VGATHERDPDZ256rm, VPGATHERDQZ256rm)>; 2148349cc55cSDimitry Andric 2149349cc55cSDimitry Andricdef ICXWriteGatherEVEX8 : SchedWriteRes<[ICXPort0,ICXPort23,ICXPort015,ICXPort0156]> { 2150349cc55cSDimitry Andric let Latency = 21; 2151349cc55cSDimitry Andric let NumMicroOps = 5; // 2 uops perform multiple loads 21525f757f3fSDimitry Andric let ReleaseAtCycles = [1,8,1,1]; 2153349cc55cSDimitry Andric} 2154349cc55cSDimitry Andricdef: InstRW<[ICXWriteGatherEVEX8], (instrs VGATHERDPSZ256rm, VPGATHERDDZ256rm, 2155349cc55cSDimitry Andric VGATHERDPDZrm, VPGATHERDQZrm, 2156349cc55cSDimitry Andric VGATHERQPDZrm, VPGATHERQQZrm, 2157349cc55cSDimitry Andric VGATHERQPSZrm, VPGATHERQDZrm)>; 2158349cc55cSDimitry Andric 2159349cc55cSDimitry Andricdef ICXWriteGatherEVEX16 : SchedWriteRes<[ICXPort0,ICXPort23,ICXPort015,ICXPort0156]> { 2160349cc55cSDimitry Andric let Latency = 25; 2161349cc55cSDimitry Andric let NumMicroOps = 5; // 2 uops perform multiple loads 21625f757f3fSDimitry Andric let ReleaseAtCycles = [1,16,1,1]; 2163349cc55cSDimitry Andric} 2164349cc55cSDimitry Andricdef: InstRW<[ICXWriteGatherEVEX16], (instrs VGATHERDPSZrm, VPGATHERDDZrm)>; 2165349cc55cSDimitry Andric 216606c3fb27SDimitry Andricdef ICXWriteResGroup219 : SchedWriteRes<[ICXPort49,ICXPort5,ICXPort6,ICXPort23,ICXPort78,ICXPort06,ICXPort0156]> { 2167349cc55cSDimitry Andric let Latency = 20; 2168349cc55cSDimitry Andric let NumMicroOps = 8; 21695f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1,1,1,1,2]; 2170349cc55cSDimitry Andric} 2171349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup219], (instrs INSB, INSL, INSW)>; 2172349cc55cSDimitry Andric 2173349cc55cSDimitry Andricdef ICXWriteResGroup220 : SchedWriteRes<[ICXPort5,ICXPort6,ICXPort0156]> { 2174349cc55cSDimitry Andric let Latency = 20; 2175349cc55cSDimitry Andric let NumMicroOps = 10; 21765f757f3fSDimitry Andric let ReleaseAtCycles = [1,2,7]; 2177349cc55cSDimitry Andric} 2178349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup220], (instrs MWAITrr)>; 2179349cc55cSDimitry Andric 2180349cc55cSDimitry Andricdef ICXWriteResGroup223 : SchedWriteRes<[ICXPort0,ICXPort23]> { 2181349cc55cSDimitry Andric let Latency = 22; 2182349cc55cSDimitry Andric let NumMicroOps = 2; 21835f757f3fSDimitry Andric let ReleaseAtCycles = [1,1]; 2184349cc55cSDimitry Andric} 2185349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup223], (instregex "DIV_F(32|64)m")>; 2186349cc55cSDimitry Andric 2187349cc55cSDimitry Andricdef ICXWriteResGroupVEX2 : SchedWriteRes<[ICXPort0, ICXPort23, ICXPort5, ICXPort015]> { 2188349cc55cSDimitry Andric let Latency = 18; 2189349cc55cSDimitry Andric let NumMicroOps = 5; // 2 uops perform multiple loads 21905f757f3fSDimitry Andric let ReleaseAtCycles = [1,2,1,1]; 2191349cc55cSDimitry Andric} 2192349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroupVEX2], (instrs VGATHERDPDrm, VPGATHERDQrm, 2193349cc55cSDimitry Andric VGATHERQPDrm, VPGATHERQQrm, 2194349cc55cSDimitry Andric VGATHERQPSrm, VPGATHERQDrm)>; 2195349cc55cSDimitry Andric 2196349cc55cSDimitry Andricdef ICXWriteResGroupVEX4 : SchedWriteRes<[ICXPort0, ICXPort23, ICXPort5, ICXPort015]> { 2197349cc55cSDimitry Andric let Latency = 20; 2198349cc55cSDimitry Andric let NumMicroOps = 5; // 2 uops peform multiple loads 21995f757f3fSDimitry Andric let ReleaseAtCycles = [1,4,1,1]; 2200349cc55cSDimitry Andric} 2201349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroupVEX4], (instrs VGATHERDPDYrm, VPGATHERDQYrm, 2202349cc55cSDimitry Andric VGATHERDPSrm, VPGATHERDDrm, 2203349cc55cSDimitry Andric VGATHERQPDYrm, VPGATHERQQYrm, 2204349cc55cSDimitry Andric VGATHERQPSYrm, VPGATHERQDYrm)>; 2205349cc55cSDimitry Andric 2206349cc55cSDimitry Andricdef ICXWriteResGroupVEX8 : SchedWriteRes<[ICXPort0, ICXPort23, ICXPort5, ICXPort015]> { 2207349cc55cSDimitry Andric let Latency = 22; 2208349cc55cSDimitry Andric let NumMicroOps = 5; // 2 uops perform multiple loads 22095f757f3fSDimitry Andric let ReleaseAtCycles = [1,8,1,1]; 2210349cc55cSDimitry Andric} 2211349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroupVEX8], (instrs VGATHERDPSYrm, VPGATHERDDYrm)>; 2212349cc55cSDimitry Andric 2213349cc55cSDimitry Andricdef ICXWriteResGroup225 : SchedWriteRes<[ICXPort5,ICXPort01,ICXPort015]> { 2214349cc55cSDimitry Andric let Latency = 22; 2215349cc55cSDimitry Andric let NumMicroOps = 14; 22165f757f3fSDimitry Andric let ReleaseAtCycles = [5,5,4]; 2217349cc55cSDimitry Andric} 2218349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup225], (instregex "VPCONFLICTDZ128rr", 2219349cc55cSDimitry Andric "VPCONFLICTQZ256rr")>; 2220349cc55cSDimitry Andric 222106c3fb27SDimitry Andricdef ICXWriteResGroup228 : SchedWriteRes<[ICXPort0,ICXPort49,ICXPort5,ICXPort23,ICXPort78,ICXPort06,ICXPort0156]> { 2222349cc55cSDimitry Andric let Latency = 23; 2223349cc55cSDimitry Andric let NumMicroOps = 19; 22245f757f3fSDimitry Andric let ReleaseAtCycles = [2,1,4,1,1,4,6]; 2225349cc55cSDimitry Andric} 2226349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup228], (instrs CMPXCHG16B)>; 2227349cc55cSDimitry Andric 2228349cc55cSDimitry Andricdef ICXWriteResGroup233 : SchedWriteRes<[ICXPort0,ICXPort5,ICXPort23]> { 2229349cc55cSDimitry Andric let Latency = 25; 2230349cc55cSDimitry Andric let NumMicroOps = 3; 22315f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1]; 2232349cc55cSDimitry Andric} 2233349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup233], (instregex "DIV_FI(16|32)m")>; 2234349cc55cSDimitry Andric 2235349cc55cSDimitry Andricdef ICXWriteResGroup239 : SchedWriteRes<[ICXPort0,ICXPort23]> { 2236349cc55cSDimitry Andric let Latency = 27; 2237349cc55cSDimitry Andric let NumMicroOps = 2; 22385f757f3fSDimitry Andric let ReleaseAtCycles = [1,1]; 2239349cc55cSDimitry Andric} 2240349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup239], (instregex "DIVR_F(32|64)m")>; 2241349cc55cSDimitry Andric 2242349cc55cSDimitry Andricdef ICXWriteResGroup242 : SchedWriteRes<[ICXPort5,ICXPort01,ICXPort23,ICXPort015]> { 2243349cc55cSDimitry Andric let Latency = 29; 2244349cc55cSDimitry Andric let NumMicroOps = 15; 22455f757f3fSDimitry Andric let ReleaseAtCycles = [5,5,1,4]; 2246349cc55cSDimitry Andric} 2247349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup242], (instregex "VPCONFLICTQZ256rm(b?)")>; 2248349cc55cSDimitry Andric 2249349cc55cSDimitry Andricdef ICXWriteResGroup243 : SchedWriteRes<[ICXPort0,ICXPort5,ICXPort23]> { 2250349cc55cSDimitry Andric let Latency = 30; 2251349cc55cSDimitry Andric let NumMicroOps = 3; 22525f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1]; 2253349cc55cSDimitry Andric} 2254349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup243], (instregex "DIVR_FI(16|32)m")>; 2255349cc55cSDimitry Andric 2256349cc55cSDimitry Andricdef ICXWriteResGroup247 : SchedWriteRes<[ICXPort5,ICXPort6,ICXPort23,ICXPort06,ICXPort0156]> { 2257349cc55cSDimitry Andric let Latency = 35; 2258349cc55cSDimitry Andric let NumMicroOps = 23; 22595f757f3fSDimitry Andric let ReleaseAtCycles = [1,5,3,4,10]; 2260349cc55cSDimitry Andric} 2261349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup247], (instregex "IN(8|16|32)ri", 2262349cc55cSDimitry Andric "IN(8|16|32)rr")>; 2263349cc55cSDimitry Andric 226406c3fb27SDimitry Andricdef ICXWriteResGroup248 : SchedWriteRes<[ICXPort5,ICXPort6,ICXPort23,ICXPort78,ICXPort06,ICXPort0156]> { 2265349cc55cSDimitry Andric let Latency = 35; 2266349cc55cSDimitry Andric let NumMicroOps = 23; 22675f757f3fSDimitry Andric let ReleaseAtCycles = [1,5,2,1,4,10]; 2268349cc55cSDimitry Andric} 2269349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup248], (instregex "OUT(8|16|32)ir", 2270349cc55cSDimitry Andric "OUT(8|16|32)rr")>; 2271349cc55cSDimitry Andric 2272349cc55cSDimitry Andricdef ICXWriteResGroup249 : SchedWriteRes<[ICXPort5,ICXPort01,ICXPort015]> { 2273349cc55cSDimitry Andric let Latency = 37; 2274349cc55cSDimitry Andric let NumMicroOps = 21; 22755f757f3fSDimitry Andric let ReleaseAtCycles = [9,7,5]; 2276349cc55cSDimitry Andric} 2277349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup249], (instregex "VPCONFLICTDZ256rr", 2278349cc55cSDimitry Andric "VPCONFLICTQZrr")>; 2279349cc55cSDimitry Andric 2280349cc55cSDimitry Andricdef ICXWriteResGroup250 : SchedWriteRes<[ICXPort1,ICXPort6,ICXPort23,ICXPort0156]> { 2281349cc55cSDimitry Andric let Latency = 37; 2282349cc55cSDimitry Andric let NumMicroOps = 31; 22835f757f3fSDimitry Andric let ReleaseAtCycles = [1,8,1,21]; 2284349cc55cSDimitry Andric} 2285349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup250], (instregex "XRSTOR(64)?")>; 2286349cc55cSDimitry Andric 228706c3fb27SDimitry Andricdef ICXWriteResGroup252 : SchedWriteRes<[ICXPort1,ICXPort49,ICXPort5,ICXPort6,ICXPort23,ICXPort78,ICXPort15,ICXPort0156]> { 2288349cc55cSDimitry Andric let Latency = 40; 2289349cc55cSDimitry Andric let NumMicroOps = 18; 22905f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,2,3,1,1,1,8]; 2291349cc55cSDimitry Andric} 2292349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup252], (instrs VMCLEARm)>; 2293349cc55cSDimitry Andric 229406c3fb27SDimitry Andricdef ICXWriteResGroup253 : SchedWriteRes<[ICXPort49,ICXPort6,ICXPort23,ICXPort78,ICXPort0156]> { 2295349cc55cSDimitry Andric let Latency = 41; 2296349cc55cSDimitry Andric let NumMicroOps = 39; 22975f757f3fSDimitry Andric let ReleaseAtCycles = [1,10,1,1,26]; 2298349cc55cSDimitry Andric} 2299349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup253], (instrs XSAVE64)>; 2300349cc55cSDimitry Andric 2301349cc55cSDimitry Andricdef ICXWriteResGroup254 : SchedWriteRes<[ICXPort5,ICXPort0156]> { 2302349cc55cSDimitry Andric let Latency = 42; 2303349cc55cSDimitry Andric let NumMicroOps = 22; 23045f757f3fSDimitry Andric let ReleaseAtCycles = [2,20]; 2305349cc55cSDimitry Andric} 2306349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup254], (instrs RDTSCP)>; 2307349cc55cSDimitry Andric 230806c3fb27SDimitry Andricdef ICXWriteResGroup255 : SchedWriteRes<[ICXPort49,ICXPort6,ICXPort23,ICXPort78,ICXPort0156]> { 2309349cc55cSDimitry Andric let Latency = 42; 2310349cc55cSDimitry Andric let NumMicroOps = 40; 23115f757f3fSDimitry Andric let ReleaseAtCycles = [1,11,1,1,26]; 2312349cc55cSDimitry Andric} 2313349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup255], (instrs XSAVE)>; 2314349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup255], (instregex "XSAVEC", "XSAVES", "XSAVEOPT")>; 2315349cc55cSDimitry Andric 2316349cc55cSDimitry Andricdef ICXWriteResGroup256 : SchedWriteRes<[ICXPort5,ICXPort01,ICXPort23,ICXPort015]> { 2317349cc55cSDimitry Andric let Latency = 44; 2318349cc55cSDimitry Andric let NumMicroOps = 22; 23195f757f3fSDimitry Andric let ReleaseAtCycles = [9,7,1,5]; 2320349cc55cSDimitry Andric} 2321349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup256], (instregex "VPCONFLICTDZ256rm(b?)", 2322349cc55cSDimitry Andric "VPCONFLICTQZrm(b?)")>; 2323349cc55cSDimitry Andric 2324349cc55cSDimitry Andricdef ICXWriteResGroup258 : SchedWriteRes<[ICXPort0,ICXPort23,ICXPort05,ICXPort06,ICXPort0156]> { 2325349cc55cSDimitry Andric let Latency = 62; 2326349cc55cSDimitry Andric let NumMicroOps = 64; 23275f757f3fSDimitry Andric let ReleaseAtCycles = [2,8,5,10,39]; 2328349cc55cSDimitry Andric} 2329349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup258], (instrs FLDENVm)>; 2330349cc55cSDimitry Andric 2331349cc55cSDimitry Andricdef ICXWriteResGroup259 : SchedWriteRes<[ICXPort0,ICXPort6,ICXPort23,ICXPort05,ICXPort06,ICXPort15,ICXPort0156]> { 2332349cc55cSDimitry Andric let Latency = 63; 2333349cc55cSDimitry Andric let NumMicroOps = 88; 23345f757f3fSDimitry Andric let ReleaseAtCycles = [4,4,31,1,2,1,45]; 2335349cc55cSDimitry Andric} 2336349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup259], (instrs FXRSTOR64)>; 2337349cc55cSDimitry Andric 2338349cc55cSDimitry Andricdef ICXWriteResGroup260 : SchedWriteRes<[ICXPort0,ICXPort6,ICXPort23,ICXPort05,ICXPort06,ICXPort15,ICXPort0156]> { 2339349cc55cSDimitry Andric let Latency = 63; 2340349cc55cSDimitry Andric let NumMicroOps = 90; 23415f757f3fSDimitry Andric let ReleaseAtCycles = [4,2,33,1,2,1,47]; 2342349cc55cSDimitry Andric} 2343349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup260], (instrs FXRSTOR)>; 2344349cc55cSDimitry Andric 2345349cc55cSDimitry Andricdef ICXWriteResGroup261 : SchedWriteRes<[ICXPort5,ICXPort01,ICXPort015]> { 2346349cc55cSDimitry Andric let Latency = 67; 2347349cc55cSDimitry Andric let NumMicroOps = 35; 23485f757f3fSDimitry Andric let ReleaseAtCycles = [17,11,7]; 2349349cc55cSDimitry Andric} 2350349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup261], (instregex "VPCONFLICTDZrr")>; 2351349cc55cSDimitry Andric 2352349cc55cSDimitry Andricdef ICXWriteResGroup262 : SchedWriteRes<[ICXPort5,ICXPort01,ICXPort23,ICXPort015]> { 2353349cc55cSDimitry Andric let Latency = 74; 2354349cc55cSDimitry Andric let NumMicroOps = 36; 23555f757f3fSDimitry Andric let ReleaseAtCycles = [17,11,1,7]; 2356349cc55cSDimitry Andric} 2357349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup262], (instregex "VPCONFLICTDZrm(b?)")>; 2358349cc55cSDimitry Andric 2359349cc55cSDimitry Andricdef ICXWriteResGroup263 : SchedWriteRes<[ICXPort5,ICXPort05,ICXPort0156]> { 2360349cc55cSDimitry Andric let Latency = 75; 2361349cc55cSDimitry Andric let NumMicroOps = 15; 23625f757f3fSDimitry Andric let ReleaseAtCycles = [6,3,6]; 2363349cc55cSDimitry Andric} 2364349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup263], (instrs FNINIT)>; 2365349cc55cSDimitry Andric 236606c3fb27SDimitry Andricdef ICXWriteResGroup266 : SchedWriteRes<[ICXPort0,ICXPort1,ICXPort49,ICXPort5,ICXPort6,ICXPort78,ICXPort06,ICXPort0156]> { 2367349cc55cSDimitry Andric let Latency = 106; 2368349cc55cSDimitry Andric let NumMicroOps = 100; 23695f757f3fSDimitry Andric let ReleaseAtCycles = [9,1,11,16,1,11,21,30]; 2370349cc55cSDimitry Andric} 2371349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup266], (instrs FSTENVm)>; 2372349cc55cSDimitry Andric 2373349cc55cSDimitry Andricdef ICXWriteResGroup267 : SchedWriteRes<[ICXPort6,ICXPort0156]> { 2374349cc55cSDimitry Andric let Latency = 140; 2375349cc55cSDimitry Andric let NumMicroOps = 4; 23765f757f3fSDimitry Andric let ReleaseAtCycles = [1,3]; 2377349cc55cSDimitry Andric} 2378349cc55cSDimitry Andricdef: InstRW<[ICXWriteResGroup267], (instrs PAUSE)>; 2379349cc55cSDimitry Andric 2380349cc55cSDimitry Andricdef: InstRW<[WriteZero], (instrs CLC)>; 2381349cc55cSDimitry Andric 2382349cc55cSDimitry Andric 2383349cc55cSDimitry Andric// Instruction variants handled by the renamer. These might not need execution 2384349cc55cSDimitry Andric// ports in certain conditions. 2385349cc55cSDimitry Andric// See Agner's Fog "The microarchitecture of Intel, AMD and VIA CPUs", 2386349cc55cSDimitry Andric// section "Skylake Pipeline" > "Register allocation and renaming". 2387349cc55cSDimitry Andric// These can be investigated with llvm-exegesis, e.g. 2388349cc55cSDimitry Andric// echo 'pxor %mm0, %mm0' | /tmp/llvm-exegesis -mode=uops -snippets-file=- 2389349cc55cSDimitry Andric// echo 'vxorpd %xmm0, %xmm0, %xmm1' | /tmp/llvm-exegesis -mode=uops -snippets-file=- 2390349cc55cSDimitry Andric 2391349cc55cSDimitry Andricdef ICXWriteZeroLatency : SchedWriteRes<[]> { 2392349cc55cSDimitry Andric let Latency = 0; 2393349cc55cSDimitry Andric} 2394349cc55cSDimitry Andric 2395349cc55cSDimitry Andricdef ICXWriteZeroIdiom : SchedWriteVariant<[ 2396349cc55cSDimitry Andric SchedVar<MCSchedPredicate<ZeroIdiomPredicate>, [ICXWriteZeroLatency]>, 2397349cc55cSDimitry Andric SchedVar<NoSchedPred, [WriteALU]> 2398349cc55cSDimitry Andric]>; 2399349cc55cSDimitry Andricdef : InstRW<[ICXWriteZeroIdiom], (instrs SUB32rr, SUB64rr, 2400349cc55cSDimitry Andric XOR32rr, XOR64rr)>; 2401349cc55cSDimitry Andric 2402349cc55cSDimitry Andricdef ICXWriteFZeroIdiom : SchedWriteVariant<[ 2403349cc55cSDimitry Andric SchedVar<MCSchedPredicate<ZeroIdiomPredicate>, [ICXWriteZeroLatency]>, 2404349cc55cSDimitry Andric SchedVar<NoSchedPred, [WriteFLogic]> 2405349cc55cSDimitry Andric]>; 2406349cc55cSDimitry Andricdef : InstRW<[ICXWriteFZeroIdiom], (instrs XORPSrr, VXORPSrr, 2407349cc55cSDimitry Andric XORPDrr, VXORPDrr, 2408349cc55cSDimitry Andric VXORPSZ128rr, 2409349cc55cSDimitry Andric VXORPDZ128rr)>; 2410349cc55cSDimitry Andric 2411349cc55cSDimitry Andricdef ICXWriteFZeroIdiomY : SchedWriteVariant<[ 2412349cc55cSDimitry Andric SchedVar<MCSchedPredicate<ZeroIdiomPredicate>, [ICXWriteZeroLatency]>, 2413349cc55cSDimitry Andric SchedVar<NoSchedPred, [WriteFLogicY]> 2414349cc55cSDimitry Andric]>; 2415349cc55cSDimitry Andricdef : InstRW<[ICXWriteFZeroIdiomY], (instrs VXORPSYrr, VXORPDYrr, 2416349cc55cSDimitry Andric VXORPSZ256rr, VXORPDZ256rr)>; 2417349cc55cSDimitry Andric 2418349cc55cSDimitry Andricdef ICXWriteFZeroIdiomZ : SchedWriteVariant<[ 2419349cc55cSDimitry Andric SchedVar<MCSchedPredicate<ZeroIdiomPredicate>, [ICXWriteZeroLatency]>, 2420349cc55cSDimitry Andric SchedVar<NoSchedPred, [WriteFLogicZ]> 2421349cc55cSDimitry Andric]>; 2422349cc55cSDimitry Andricdef : InstRW<[ICXWriteFZeroIdiomZ], (instrs VXORPSZrr, VXORPDZrr)>; 2423349cc55cSDimitry Andric 2424349cc55cSDimitry Andricdef ICXWriteVZeroIdiomLogicX : SchedWriteVariant<[ 2425349cc55cSDimitry Andric SchedVar<MCSchedPredicate<ZeroIdiomPredicate>, [ICXWriteZeroLatency]>, 2426349cc55cSDimitry Andric SchedVar<NoSchedPred, [WriteVecLogicX]> 2427349cc55cSDimitry Andric]>; 2428349cc55cSDimitry Andricdef : InstRW<[ICXWriteVZeroIdiomLogicX], (instrs PXORrr, VPXORrr, 2429349cc55cSDimitry Andric VPXORDZ128rr, VPXORQZ128rr)>; 2430349cc55cSDimitry Andric 2431349cc55cSDimitry Andricdef ICXWriteVZeroIdiomLogicY : SchedWriteVariant<[ 2432349cc55cSDimitry Andric SchedVar<MCSchedPredicate<ZeroIdiomPredicate>, [ICXWriteZeroLatency]>, 2433349cc55cSDimitry Andric SchedVar<NoSchedPred, [WriteVecLogicY]> 2434349cc55cSDimitry Andric]>; 2435349cc55cSDimitry Andricdef : InstRW<[ICXWriteVZeroIdiomLogicY], (instrs VPXORYrr, 2436349cc55cSDimitry Andric VPXORDZ256rr, VPXORQZ256rr)>; 2437349cc55cSDimitry Andric 2438349cc55cSDimitry Andricdef ICXWriteVZeroIdiomLogicZ : SchedWriteVariant<[ 2439349cc55cSDimitry Andric SchedVar<MCSchedPredicate<ZeroIdiomPredicate>, [ICXWriteZeroLatency]>, 2440349cc55cSDimitry Andric SchedVar<NoSchedPred, [WriteVecLogicZ]> 2441349cc55cSDimitry Andric]>; 2442349cc55cSDimitry Andricdef : InstRW<[ICXWriteVZeroIdiomLogicZ], (instrs VPXORDZrr, VPXORQZrr)>; 2443349cc55cSDimitry Andric 2444349cc55cSDimitry Andricdef ICXWriteVZeroIdiomALUX : SchedWriteVariant<[ 2445349cc55cSDimitry Andric SchedVar<MCSchedPredicate<ZeroIdiomPredicate>, [ICXWriteZeroLatency]>, 2446349cc55cSDimitry Andric SchedVar<NoSchedPred, [WriteVecALUX]> 2447349cc55cSDimitry Andric]>; 2448349cc55cSDimitry Andricdef : InstRW<[ICXWriteVZeroIdiomALUX], (instrs PCMPGTBrr, VPCMPGTBrr, 2449349cc55cSDimitry Andric PCMPGTDrr, VPCMPGTDrr, 2450349cc55cSDimitry Andric PCMPGTWrr, VPCMPGTWrr)>; 2451349cc55cSDimitry Andric 2452349cc55cSDimitry Andricdef ICXWriteVZeroIdiomALUY : SchedWriteVariant<[ 2453349cc55cSDimitry Andric SchedVar<MCSchedPredicate<ZeroIdiomPredicate>, [ICXWriteZeroLatency]>, 2454349cc55cSDimitry Andric SchedVar<NoSchedPred, [WriteVecALUY]> 2455349cc55cSDimitry Andric]>; 2456349cc55cSDimitry Andricdef : InstRW<[ICXWriteVZeroIdiomALUY], (instrs VPCMPGTBYrr, 2457349cc55cSDimitry Andric VPCMPGTDYrr, 2458349cc55cSDimitry Andric VPCMPGTWYrr)>; 2459349cc55cSDimitry Andric 2460349cc55cSDimitry Andricdef ICXWritePSUB : SchedWriteRes<[ICXPort015]> { 2461349cc55cSDimitry Andric let Latency = 1; 2462349cc55cSDimitry Andric let NumMicroOps = 1; 24635f757f3fSDimitry Andric let ReleaseAtCycles = [1]; 2464349cc55cSDimitry Andric} 2465349cc55cSDimitry Andric 2466349cc55cSDimitry Andricdef ICXWriteVZeroIdiomPSUB : SchedWriteVariant<[ 2467349cc55cSDimitry Andric SchedVar<MCSchedPredicate<ZeroIdiomPredicate>, [ICXWriteZeroLatency]>, 2468349cc55cSDimitry Andric SchedVar<NoSchedPred, [ICXWritePSUB]> 2469349cc55cSDimitry Andric]>; 2470349cc55cSDimitry Andric 2471349cc55cSDimitry Andricdef : InstRW<[ICXWriteVZeroIdiomPSUB], (instrs PSUBBrr, VPSUBBrr, VPSUBBZ128rr, 2472349cc55cSDimitry Andric PSUBDrr, VPSUBDrr, VPSUBDZ128rr, 2473349cc55cSDimitry Andric PSUBQrr, VPSUBQrr, VPSUBQZ128rr, 2474349cc55cSDimitry Andric PSUBWrr, VPSUBWrr, VPSUBWZ128rr, 2475349cc55cSDimitry Andric VPSUBBYrr, VPSUBBZ256rr, 2476349cc55cSDimitry Andric VPSUBDYrr, VPSUBDZ256rr, 2477349cc55cSDimitry Andric VPSUBQYrr, VPSUBQZ256rr, 2478349cc55cSDimitry Andric VPSUBWYrr, VPSUBWZ256rr, 2479349cc55cSDimitry Andric VPSUBBZrr, 2480349cc55cSDimitry Andric VPSUBDZrr, 2481349cc55cSDimitry Andric VPSUBQZrr, 2482349cc55cSDimitry Andric VPSUBWZrr)>; 2483349cc55cSDimitry Andricdef ICXWritePCMPGTQ : SchedWriteRes<[ICXPort5]> { 2484349cc55cSDimitry Andric let Latency = 3; 2485349cc55cSDimitry Andric let NumMicroOps = 1; 24865f757f3fSDimitry Andric let ReleaseAtCycles = [1]; 2487349cc55cSDimitry Andric} 2488349cc55cSDimitry Andric 2489349cc55cSDimitry Andricdef ICXWriteVZeroIdiomPCMPGTQ : SchedWriteVariant<[ 2490349cc55cSDimitry Andric SchedVar<MCSchedPredicate<ZeroIdiomPredicate>, [ICXWriteZeroLatency]>, 2491349cc55cSDimitry Andric SchedVar<NoSchedPred, [ICXWritePCMPGTQ]> 2492349cc55cSDimitry Andric]>; 2493349cc55cSDimitry Andricdef : InstRW<[ICXWriteVZeroIdiomPCMPGTQ], (instrs PCMPGTQrr, VPCMPGTQrr, 2494349cc55cSDimitry Andric VPCMPGTQYrr)>; 2495349cc55cSDimitry Andric 2496349cc55cSDimitry Andric 2497349cc55cSDimitry Andric// CMOVs that use both Z and C flag require an extra uop. 2498349cc55cSDimitry Andricdef ICXWriteCMOVA_CMOVBErr : SchedWriteRes<[ICXPort06]> { 2499349cc55cSDimitry Andric let Latency = 2; 25005f757f3fSDimitry Andric let ReleaseAtCycles = [2]; 2501349cc55cSDimitry Andric let NumMicroOps = 2; 2502349cc55cSDimitry Andric} 2503349cc55cSDimitry Andric 2504349cc55cSDimitry Andricdef ICXWriteCMOVA_CMOVBErm : SchedWriteRes<[ICXPort23,ICXPort06]> { 2505349cc55cSDimitry Andric let Latency = 7; 25065f757f3fSDimitry Andric let ReleaseAtCycles = [1,2]; 2507349cc55cSDimitry Andric let NumMicroOps = 3; 2508349cc55cSDimitry Andric} 2509349cc55cSDimitry Andric 2510349cc55cSDimitry Andricdef ICXCMOVA_CMOVBErr : SchedWriteVariant<[ 2511349cc55cSDimitry Andric SchedVar<MCSchedPredicate<IsCMOVArr_Or_CMOVBErr>, [ICXWriteCMOVA_CMOVBErr]>, 2512349cc55cSDimitry Andric SchedVar<NoSchedPred, [WriteCMOV]> 2513349cc55cSDimitry Andric]>; 2514349cc55cSDimitry Andric 2515349cc55cSDimitry Andricdef ICXCMOVA_CMOVBErm : SchedWriteVariant<[ 2516349cc55cSDimitry Andric SchedVar<MCSchedPredicate<IsCMOVArm_Or_CMOVBErm>, [ICXWriteCMOVA_CMOVBErm]>, 2517349cc55cSDimitry Andric SchedVar<NoSchedPred, [WriteCMOV.Folded]> 2518349cc55cSDimitry Andric]>; 2519349cc55cSDimitry Andric 2520349cc55cSDimitry Andricdef : InstRW<[ICXCMOVA_CMOVBErr], (instrs CMOV16rr, CMOV32rr, CMOV64rr)>; 2521349cc55cSDimitry Andricdef : InstRW<[ICXCMOVA_CMOVBErm], (instrs CMOV16rm, CMOV32rm, CMOV64rm)>; 2522349cc55cSDimitry Andric 2523349cc55cSDimitry Andric// SETCCs that use both Z and C flag require an extra uop. 2524349cc55cSDimitry Andricdef ICXWriteSETA_SETBEr : SchedWriteRes<[ICXPort06]> { 2525349cc55cSDimitry Andric let Latency = 2; 25265f757f3fSDimitry Andric let ReleaseAtCycles = [2]; 2527349cc55cSDimitry Andric let NumMicroOps = 2; 2528349cc55cSDimitry Andric} 2529349cc55cSDimitry Andric 253006c3fb27SDimitry Andricdef ICXWriteSETA_SETBEm : SchedWriteRes<[ICXPort49,ICXPort78,ICXPort06]> { 2531349cc55cSDimitry Andric let Latency = 3; 25325f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,2]; 2533349cc55cSDimitry Andric let NumMicroOps = 4; 2534349cc55cSDimitry Andric} 2535349cc55cSDimitry Andric 2536349cc55cSDimitry Andricdef ICXSETA_SETBErr : SchedWriteVariant<[ 2537349cc55cSDimitry Andric SchedVar<MCSchedPredicate<IsSETAr_Or_SETBEr>, [ICXWriteSETA_SETBEr]>, 2538349cc55cSDimitry Andric SchedVar<NoSchedPred, [WriteSETCC]> 2539349cc55cSDimitry Andric]>; 2540349cc55cSDimitry Andric 2541349cc55cSDimitry Andricdef ICXSETA_SETBErm : SchedWriteVariant<[ 2542349cc55cSDimitry Andric SchedVar<MCSchedPredicate<IsSETAm_Or_SETBEm>, [ICXWriteSETA_SETBEm]>, 2543349cc55cSDimitry Andric SchedVar<NoSchedPred, [WriteSETCCStore]> 2544349cc55cSDimitry Andric]>; 2545349cc55cSDimitry Andric 2546349cc55cSDimitry Andricdef : InstRW<[ICXSETA_SETBErr], (instrs SETCCr)>; 2547349cc55cSDimitry Andricdef : InstRW<[ICXSETA_SETBErm], (instrs SETCCm)>; 2548349cc55cSDimitry Andric 254904eeddc0SDimitry Andric/////////////////////////////////////////////////////////////////////////////// 255004eeddc0SDimitry Andric// Dependency breaking instructions. 255104eeddc0SDimitry Andric/////////////////////////////////////////////////////////////////////////////// 255204eeddc0SDimitry Andric 255304eeddc0SDimitry Andricdef : IsZeroIdiomFunction<[ 255404eeddc0SDimitry Andric // GPR Zero-idioms. 255504eeddc0SDimitry Andric DepBreakingClass<[ SUB32rr, SUB64rr, XOR32rr, XOR64rr ], ZeroIdiomPredicate>, 255604eeddc0SDimitry Andric 255704eeddc0SDimitry Andric // SSE Zero-idioms. 255804eeddc0SDimitry Andric DepBreakingClass<[ 255904eeddc0SDimitry Andric // fp variants. 256004eeddc0SDimitry Andric XORPSrr, XORPDrr, 256104eeddc0SDimitry Andric 256204eeddc0SDimitry Andric // int variants. 256304eeddc0SDimitry Andric PXORrr, 256404eeddc0SDimitry Andric PSUBBrr, PSUBWrr, PSUBDrr, PSUBQrr, 256504eeddc0SDimitry Andric PCMPGTBrr, PCMPGTDrr, PCMPGTQrr, PCMPGTWrr 256604eeddc0SDimitry Andric ], ZeroIdiomPredicate>, 256704eeddc0SDimitry Andric 256804eeddc0SDimitry Andric // AVX Zero-idioms. 256904eeddc0SDimitry Andric DepBreakingClass<[ 257004eeddc0SDimitry Andric // xmm fp variants. 257104eeddc0SDimitry Andric VXORPSrr, VXORPDrr, 257204eeddc0SDimitry Andric 257304eeddc0SDimitry Andric // xmm int variants. 257404eeddc0SDimitry Andric VPXORrr, 257504eeddc0SDimitry Andric VPSUBBrr, VPSUBWrr, VPSUBDrr, VPSUBQrr, 257604eeddc0SDimitry Andric VPCMPGTBrr, VPCMPGTWrr, VPCMPGTDrr, VPCMPGTQrr, 257704eeddc0SDimitry Andric 257804eeddc0SDimitry Andric // ymm variants. 257904eeddc0SDimitry Andric VXORPSYrr, VXORPDYrr, VPXORYrr, 258004eeddc0SDimitry Andric VPSUBBYrr, VPSUBWYrr, VPSUBDYrr, VPSUBQYrr, 258104eeddc0SDimitry Andric VPCMPGTBYrr, VPCMPGTWYrr, VPCMPGTDYrr, VPCMPGTQYrr, 258204eeddc0SDimitry Andric 258304eeddc0SDimitry Andric // zmm variants. 258404eeddc0SDimitry Andric VXORPSZrr, VXORPDZrr, VPXORDZrr, VPXORQZrr, 258504eeddc0SDimitry Andric VXORPSZ128rr, VXORPDZ128rr, VPXORDZ128rr, VPXORQZ128rr, 258604eeddc0SDimitry Andric VXORPSZ256rr, VXORPDZ256rr, VPXORDZ256rr, VPXORQZ256rr, 258704eeddc0SDimitry Andric VPSUBBZrr, VPSUBWZrr, VPSUBDZrr, VPSUBQZrr, 258804eeddc0SDimitry Andric VPSUBBZ128rr, VPSUBWZ128rr, VPSUBDZ128rr, VPSUBQZ128rr, 258904eeddc0SDimitry Andric VPSUBBZ256rr, VPSUBWZ256rr, VPSUBDZ256rr, VPSUBQZ256rr, 259004eeddc0SDimitry Andric ], ZeroIdiomPredicate>, 259104eeddc0SDimitry Andric]>; 259204eeddc0SDimitry Andric 2593349cc55cSDimitry Andric} // SchedModel 2594