xref: /openbsd-src/gnu/llvm/llvm/lib/Target/X86/X86SchedBroadwell.td (revision d415bd752c734aee168c4ee86ff32e8cc249eb16)
109467b48Spatrick//=- X86SchedBroadwell.td - X86 Broadwell Scheduling ---------*- tablegen -*-=//
209467b48Spatrick//
309467b48Spatrick// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
409467b48Spatrick// See https://llvm.org/LICENSE.txt for license information.
509467b48Spatrick// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
609467b48Spatrick//
709467b48Spatrick//===----------------------------------------------------------------------===//
809467b48Spatrick//
909467b48Spatrick// This file defines the machine model for Broadwell to support instruction
1009467b48Spatrick// scheduling and other instruction cost heuristics.
1109467b48Spatrick//
1209467b48Spatrick//===----------------------------------------------------------------------===//
1309467b48Spatrick
1409467b48Spatrickdef BroadwellModel : SchedMachineModel {
1509467b48Spatrick  // All x86 instructions are modeled as a single micro-op, and BW can decode 4
1609467b48Spatrick  // instructions per cycle.
1709467b48Spatrick  let IssueWidth = 4;
1809467b48Spatrick  let MicroOpBufferSize = 192; // Based on the reorder buffer.
1909467b48Spatrick  let LoadLatency = 5;
2009467b48Spatrick  let MispredictPenalty = 16;
2109467b48Spatrick
2209467b48Spatrick  // Based on the LSD (loop-stream detector) queue size and benchmarking data.
2309467b48Spatrick  let LoopMicroOpBufferSize = 50;
2409467b48Spatrick
2509467b48Spatrick  // This flag is set to allow the scheduler to assign a default model to
2609467b48Spatrick  // unrecognized opcodes.
2709467b48Spatrick  let CompleteModel = 0;
2809467b48Spatrick}
2909467b48Spatrick
3009467b48Spatricklet SchedModel = BroadwellModel in {
3109467b48Spatrick
3209467b48Spatrick// Broadwell can issue micro-ops to 8 different ports in one cycle.
3309467b48Spatrick
3409467b48Spatrick// Ports 0, 1, 5, and 6 handle all computation.
3509467b48Spatrick// Port 4 gets the data half of stores. Store data can be available later than
3609467b48Spatrick// the store address, but since we don't model the latency of stores, we can
3709467b48Spatrick// ignore that.
3809467b48Spatrick// Ports 2 and 3 are identical. They handle loads and the address half of
3909467b48Spatrick// stores. Port 7 can handle address calculations.
4009467b48Spatrickdef BWPort0 : ProcResource<1>;
4109467b48Spatrickdef BWPort1 : ProcResource<1>;
4209467b48Spatrickdef BWPort2 : ProcResource<1>;
4309467b48Spatrickdef BWPort3 : ProcResource<1>;
4409467b48Spatrickdef BWPort4 : ProcResource<1>;
4509467b48Spatrickdef BWPort5 : ProcResource<1>;
4609467b48Spatrickdef BWPort6 : ProcResource<1>;
4709467b48Spatrickdef BWPort7 : ProcResource<1>;
4809467b48Spatrick
4909467b48Spatrick// Many micro-ops are capable of issuing on multiple ports.
5009467b48Spatrickdef BWPort01  : ProcResGroup<[BWPort0, BWPort1]>;
5109467b48Spatrickdef BWPort23  : ProcResGroup<[BWPort2, BWPort3]>;
5209467b48Spatrickdef BWPort237 : ProcResGroup<[BWPort2, BWPort3, BWPort7]>;
5309467b48Spatrickdef BWPort04  : ProcResGroup<[BWPort0, BWPort4]>;
5409467b48Spatrickdef BWPort05  : ProcResGroup<[BWPort0, BWPort5]>;
5509467b48Spatrickdef BWPort06  : ProcResGroup<[BWPort0, BWPort6]>;
5609467b48Spatrickdef BWPort15  : ProcResGroup<[BWPort1, BWPort5]>;
5709467b48Spatrickdef BWPort16  : ProcResGroup<[BWPort1, BWPort6]>;
5809467b48Spatrickdef BWPort56  : ProcResGroup<[BWPort5, BWPort6]>;
5909467b48Spatrickdef BWPort015 : ProcResGroup<[BWPort0, BWPort1, BWPort5]>;
6009467b48Spatrickdef BWPort056 : ProcResGroup<[BWPort0, BWPort5, BWPort6]>;
6109467b48Spatrickdef BWPort0156: ProcResGroup<[BWPort0, BWPort1, BWPort5, BWPort6]>;
6209467b48Spatrick
6309467b48Spatrick// 60 Entry Unified Scheduler
6409467b48Spatrickdef BWPortAny : ProcResGroup<[BWPort0, BWPort1, BWPort2, BWPort3, BWPort4,
6509467b48Spatrick                              BWPort5, BWPort6, BWPort7]> {
6609467b48Spatrick  let BufferSize=60;
6709467b48Spatrick}
6809467b48Spatrick
6909467b48Spatrick// Integer division issued on port 0.
7009467b48Spatrickdef BWDivider : ProcResource<1>;
7109467b48Spatrick// FP division and sqrt on port 0.
7209467b48Spatrickdef BWFPDivider : ProcResource<1>;
7309467b48Spatrick
7409467b48Spatrick// Integer loads are 5 cycles, so ReadAfterLd registers needn't be available until 5
7509467b48Spatrick// cycles after the memory operand.
7609467b48Spatrickdef : ReadAdvance<ReadAfterLd, 5>;
7709467b48Spatrick
7809467b48Spatrick// Vector loads are 5/5/6 cycles, so ReadAfterVec*Ld registers needn't be available
7909467b48Spatrick// until 5/5/6 cycles after the memory operand.
8009467b48Spatrickdef : ReadAdvance<ReadAfterVecLd, 5>;
8109467b48Spatrickdef : ReadAdvance<ReadAfterVecXLd, 5>;
8209467b48Spatrickdef : ReadAdvance<ReadAfterVecYLd, 6>;
8309467b48Spatrick
8409467b48Spatrickdef : ReadAdvance<ReadInt2Fpu, 0>;
8509467b48Spatrick
8609467b48Spatrick// Many SchedWrites are defined in pairs with and without a folded load.
8709467b48Spatrick// Instructions with folded loads are usually micro-fused, so they only appear
8809467b48Spatrick// as two micro-ops when queued in the reservation station.
8909467b48Spatrick// This multiclass defines the resource usage for variants with and without
9009467b48Spatrick// folded loads.
9109467b48Spatrickmulticlass BWWriteResPair<X86FoldableSchedWrite SchedRW,
9209467b48Spatrick                          list<ProcResourceKind> ExePorts,
9309467b48Spatrick                          int Lat, list<int> Res = [1], int UOps = 1,
94*d415bd75Srobert                          int LoadLat = 5, int LoadUOps = 1> {
9509467b48Spatrick  // Register variant is using a single cycle on ExePort.
9609467b48Spatrick  def : WriteRes<SchedRW, ExePorts> {
9709467b48Spatrick    let Latency = Lat;
9809467b48Spatrick    let ResourceCycles = Res;
9909467b48Spatrick    let NumMicroOps = UOps;
10009467b48Spatrick  }
10109467b48Spatrick
10209467b48Spatrick  // Memory variant also uses a cycle on port 2/3 and adds LoadLat cycles to
10309467b48Spatrick  // the latency (default = 5).
10409467b48Spatrick  def : WriteRes<SchedRW.Folded, !listconcat([BWPort23], ExePorts)> {
10509467b48Spatrick    let Latency = !add(Lat, LoadLat);
10609467b48Spatrick    let ResourceCycles = !listconcat([1], Res);
107*d415bd75Srobert    let NumMicroOps = !add(UOps, LoadUOps);
10809467b48Spatrick  }
10909467b48Spatrick}
11009467b48Spatrick
11109467b48Spatrick// A folded store needs a cycle on port 4 for the store data, and an extra port
11209467b48Spatrick// 2/3/7 cycle to recompute the address.
11309467b48Spatrickdef : WriteRes<WriteRMW, [BWPort237,BWPort4]>;
11409467b48Spatrick
115*d415bd75Srobert// Loads, stores, and moves, not folded with other operations.
116*d415bd75Srobert// Store_addr on 237.
117*d415bd75Srobert// Store_data on 4.
118*d415bd75Srobertdefm : X86WriteRes<WriteStore,   [BWPort237, BWPort4], 1, [1,1], 1>;
119*d415bd75Srobertdefm : X86WriteRes<WriteStoreNT, [BWPort237, BWPort4], 1, [1,1], 2>;
120*d415bd75Srobertdefm : X86WriteRes<WriteLoad,    [BWPort23], 5, [1], 1>;
121*d415bd75Srobertdefm : X86WriteRes<WriteMove,    [BWPort0156], 1, [1], 1>;
122*d415bd75Srobert
123*d415bd75Srobert// Treat misc copies as a move.
124*d415bd75Srobertdef  : InstRW<[WriteMove], (instrs COPY)>;
125*d415bd75Srobert
126*d415bd75Srobert// Idioms that clear a register, like xorps %xmm0, %xmm0.
127*d415bd75Srobert// These can often bypass execution ports completely.
128*d415bd75Srobertdef  : WriteRes<WriteZero,       []>;
129*d415bd75Srobert
130*d415bd75Srobert// Model the effect of clobbering the read-write mask operand of the GATHER operation.
131*d415bd75Srobert// Does not cost anything by itself, only has latency, matching that of the WriteLoad,
132*d415bd75Srobertdefm : X86WriteRes<WriteVecMaskedGatherWriteback, [], 5, [], 0>;
133*d415bd75Srobert
13409467b48Spatrick// Arithmetic.
13509467b48Spatrickdefm : BWWriteResPair<WriteALU,    [BWPort0156], 1>; // Simple integer ALU op.
13609467b48Spatrickdefm : BWWriteResPair<WriteADC,    [BWPort06], 1>; // Integer ALU + flags op.
13709467b48Spatrick
13809467b48Spatrick// Integer multiplication.
13909467b48Spatrickdefm : BWWriteResPair<WriteIMul8,     [BWPort1],   3>;
14009467b48Spatrickdefm : BWWriteResPair<WriteIMul16,    [BWPort1,BWPort06,BWPort0156], 4, [1,1,2], 4>;
14109467b48Spatrickdefm : X86WriteRes<WriteIMul16Imm,    [BWPort1,BWPort0156], 4, [1,1], 2>;
14209467b48Spatrickdefm : X86WriteRes<WriteIMul16ImmLd,  [BWPort1,BWPort0156,BWPort23], 8, [1,1,1], 3>;
14309467b48Spatrickdefm : BWWriteResPair<WriteIMul16Reg, [BWPort1],   3>;
14409467b48Spatrickdefm : BWWriteResPair<WriteIMul32,    [BWPort1,BWPort06,BWPort0156], 4, [1,1,1], 3>;
145*d415bd75Srobertdefm : BWWriteResPair<WriteMULX32,    [BWPort1,BWPort06,BWPort0156], 3, [1,1,1], 3>;
14609467b48Spatrickdefm : BWWriteResPair<WriteIMul32Imm, [BWPort1],   3>;
14709467b48Spatrickdefm : BWWriteResPair<WriteIMul32Reg, [BWPort1],   3>;
14809467b48Spatrickdefm : BWWriteResPair<WriteIMul64,    [BWPort1,BWPort5], 4, [1,1], 2>;
149*d415bd75Srobertdefm : BWWriteResPair<WriteMULX64,    [BWPort1,BWPort5], 3, [1,1], 2>;
15009467b48Spatrickdefm : BWWriteResPair<WriteIMul64Imm, [BWPort1],   3>;
15109467b48Spatrickdefm : BWWriteResPair<WriteIMul64Reg, [BWPort1],   3>;
152*d415bd75Srobertdef BWWriteIMulH : WriteRes<WriteIMulH, []> { let Latency = 4; }
153*d415bd75Srobertdef  : WriteRes<WriteIMulHLd, []> {
154*d415bd75Srobert  let Latency = !add(BWWriteIMulH.Latency, BroadwellModel.LoadLatency);
155*d415bd75Srobert}
156*d415bd75Srobert
157*d415bd75Srobertdefm : X86WriteRes<WriteBSWAP32,   [BWPort15], 1, [1], 1>;
158*d415bd75Srobertdefm : X86WriteRes<WriteBSWAP64,   [BWPort06, BWPort15], 2, [1, 1], 2>;
159*d415bd75Srobertdefm : X86WriteRes<WriteCMPXCHG,[BWPort06, BWPort0156], 5, [2, 3], 5>;
160*d415bd75Srobertdefm : X86WriteRes<WriteCMPXCHGRMW,[BWPort23, BWPort06, BWPort0156, BWPort237, BWPort4], 8, [1, 2, 1, 1, 1], 6>;
161*d415bd75Srobertdefm : X86WriteRes<WriteXCHG,      [BWPort0156], 2, [3], 3>;
162*d415bd75Srobert
163*d415bd75Srobert// Integer shifts and rotates.
164*d415bd75Srobertdefm : BWWriteResPair<WriteShift,    [BWPort06],  1>;
165*d415bd75Srobertdefm : BWWriteResPair<WriteShiftCL,  [BWPort06,BWPort0156],  3, [2,1], 3>;
166*d415bd75Srobertdefm : BWWriteResPair<WriteRotate,   [BWPort06],  1, [1], 1>;
167*d415bd75Srobertdefm : BWWriteResPair<WriteRotateCL, [BWPort06,BWPort0156],  3, [2,1], 3>;
168*d415bd75Srobert
169*d415bd75Srobert// SHLD/SHRD.
170*d415bd75Srobertdefm : X86WriteRes<WriteSHDrri, [BWPort1], 3, [1], 1>;
171*d415bd75Srobertdefm : X86WriteRes<WriteSHDrrcl,[BWPort1,BWPort06,BWPort0156], 6, [1, 1, 2], 4>;
172*d415bd75Srobertdefm : X86WriteRes<WriteSHDmri, [BWPort1,BWPort23,BWPort237,BWPort0156], 9, [1, 1, 1, 1], 4>;
173*d415bd75Srobertdefm : X86WriteRes<WriteSHDmrcl,[BWPort1,BWPort23,BWPort237,BWPort06,BWPort0156], 11, [1, 1, 1, 1, 2], 6>;
174*d415bd75Srobert
175*d415bd75Srobert// Branches don't produce values, so they have no latency, but they still
176*d415bd75Srobert// consume resources. Indirect branches can fold loads.
177*d415bd75Srobertdefm : BWWriteResPair<WriteJump,  [BWPort06],   1>;
178*d415bd75Srobert
179*d415bd75Srobertdefm : BWWriteResPair<WriteCRC32, [BWPort1],   3>;
180*d415bd75Srobert
181*d415bd75Srobertdefm : BWWriteResPair<WriteCMOV,  [BWPort06], 1>; // Conditional move.
182*d415bd75Srobertdefm : X86WriteRes<WriteFCMOV, [BWPort1], 3, [1], 1>; // x87 conditional move.
183*d415bd75Srobert
184*d415bd75Srobertdef  : WriteRes<WriteSETCC, [BWPort06]>; // Setcc.
185*d415bd75Srobertdef  : WriteRes<WriteSETCCStore, [BWPort06,BWPort4,BWPort237]> {
186*d415bd75Srobert  let Latency = 2;
187*d415bd75Srobert  let NumMicroOps = 3;
188*d415bd75Srobert}
189*d415bd75Srobert
190*d415bd75Srobertdefm : X86WriteRes<WriteLAHFSAHF,        [BWPort06], 1, [1], 1>;
191*d415bd75Srobertdefm : X86WriteRes<WriteBitTest,         [BWPort06], 1, [1], 1>; // Bit Test instrs
192*d415bd75Srobertdefm : X86WriteRes<WriteBitTestImmLd,    [BWPort06,BWPort23], 6, [1,1], 2>;
193*d415bd75Srobertdefm : X86WriteRes<WriteBitTestRegLd,    [BWPort0156,BWPort23], 6, [1,1], 2>;
194*d415bd75Srobertdefm : X86WriteRes<WriteBitTestSet,      [BWPort06], 1, [1], 1>; // Bit Test + Set instrs
195*d415bd75Srobertdefm : X86WriteRes<WriteBitTestSetImmLd, [BWPort06,BWPort23], 5, [1,1], 3>;
196*d415bd75Srobertdefm : X86WriteRes<WriteBitTestSetRegLd, [BWPort0156,BWPort23], 5, [1,1], 2>;
197*d415bd75Srobert
198*d415bd75Srobert// This is for simple LEAs with one or two input operands.
199*d415bd75Srobert// The complex ones can only execute on port 1, and they require two cycles on
200*d415bd75Srobert// the port to read all inputs. We don't model that.
201*d415bd75Srobertdef : WriteRes<WriteLEA, [BWPort15]>;
202*d415bd75Srobert
203*d415bd75Srobert// Bit counts.
204*d415bd75Srobertdefm : BWWriteResPair<WriteBSF, [BWPort1], 3>;
205*d415bd75Srobertdefm : BWWriteResPair<WriteBSR, [BWPort1], 3>;
206*d415bd75Srobertdefm : BWWriteResPair<WriteLZCNT,          [BWPort1], 3>;
207*d415bd75Srobertdefm : BWWriteResPair<WriteTZCNT,          [BWPort1], 3>;
208*d415bd75Srobertdefm : BWWriteResPair<WritePOPCNT,         [BWPort1], 3>;
209*d415bd75Srobert
210*d415bd75Srobert// BMI1 BEXTR/BLS, BMI2 BZHI
211*d415bd75Srobertdefm : BWWriteResPair<WriteBEXTR, [BWPort06,BWPort15], 2, [1,1], 2>;
212*d415bd75Srobertdefm : BWWriteResPair<WriteBLS,   [BWPort15], 1>;
213*d415bd75Srobertdefm : BWWriteResPair<WriteBZHI,  [BWPort15], 1>;
21409467b48Spatrick
21509467b48Spatrick// TODO: Why isn't the BWDivider used consistently?
21609467b48Spatrickdefm : X86WriteRes<WriteDiv8,     [BWPort0, BWDivider], 25, [1, 10], 1>;
21709467b48Spatrickdefm : X86WriteRes<WriteDiv16,    [BWPort0,BWPort1,BWPort5,BWPort6,BWPort01,BWPort0156], 80, [7,7,3,3,1,11], 32>;
21809467b48Spatrickdefm : X86WriteRes<WriteDiv32,    [BWPort0,BWPort1,BWPort5,BWPort6,BWPort01,BWPort0156], 80, [7,7,3,3,1,11], 32>;
21909467b48Spatrickdefm : X86WriteRes<WriteDiv64,    [BWPort0,BWPort1,BWPort5,BWPort6,BWPort01,BWPort0156], 80, [7,7,3,3,1,11], 32>;
22009467b48Spatrickdefm : X86WriteRes<WriteDiv8Ld,   [BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156], 34, [2,2,2,1,1], 8>;
22109467b48Spatrickdefm : X86WriteRes<WriteDiv16Ld,  [BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156], 34, [2,2,2,1,1], 8>;
22209467b48Spatrickdefm : X86WriteRes<WriteDiv32Ld,  [BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156], 34, [2,2,2,1,1], 8>;
22309467b48Spatrickdefm : X86WriteRes<WriteDiv64Ld,  [BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156], 34, [2,2,2,1,1], 8>;
22409467b48Spatrick
22509467b48Spatrickdefm : X86WriteRes<WriteIDiv8,    [BWPort0, BWDivider], 25, [1,10], 1>;
22609467b48Spatrickdefm : X86WriteRes<WriteIDiv16,   [BWPort0, BWDivider], 25, [1,10], 1>;
22709467b48Spatrickdefm : X86WriteRes<WriteIDiv32,   [BWPort0, BWDivider], 25, [1,10], 1>;
22809467b48Spatrickdefm : X86WriteRes<WriteIDiv64,   [BWPort0, BWDivider], 25, [1,10], 1>;
22909467b48Spatrickdefm : X86WriteRes<WriteIDiv8Ld,  [BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156], 35, [2,2,2,1,1], 8>;
23009467b48Spatrickdefm : X86WriteRes<WriteIDiv16Ld, [BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156], 35, [2,2,2,1,1], 8>;
23109467b48Spatrickdefm : X86WriteRes<WriteIDiv32Ld, [BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156], 35, [2,2,2,1,1], 8>;
23209467b48Spatrickdefm : X86WriteRes<WriteIDiv64Ld, [BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156], 35, [2,2,2,1,1], 8>;
23309467b48Spatrick
23409467b48Spatrick// Floating point. This covers both scalar and vector operations.
23509467b48Spatrickdefm : X86WriteRes<WriteFLD0,          [BWPort01], 1, [1], 1>;
23609467b48Spatrickdefm : X86WriteRes<WriteFLD1,          [BWPort01], 1, [2], 2>;
23709467b48Spatrickdefm : X86WriteRes<WriteFLDC,          [BWPort01], 1, [2], 2>;
23809467b48Spatrickdefm : X86WriteRes<WriteFLoad,         [BWPort23], 5, [1], 1>;
23909467b48Spatrickdefm : X86WriteRes<WriteFLoadX,        [BWPort23], 5, [1], 1>;
24009467b48Spatrickdefm : X86WriteRes<WriteFLoadY,        [BWPort23], 6, [1], 1>;
24109467b48Spatrickdefm : X86WriteRes<WriteFMaskedLoad,   [BWPort23,BWPort5], 7, [1,2], 3>;
24209467b48Spatrickdefm : X86WriteRes<WriteFMaskedLoadY,  [BWPort23,BWPort5], 8, [1,2], 3>;
24309467b48Spatrickdefm : X86WriteRes<WriteFStore,        [BWPort237,BWPort4], 1, [1,1], 2>;
24409467b48Spatrickdefm : X86WriteRes<WriteFStoreX,       [BWPort237,BWPort4], 1, [1,1], 2>;
24509467b48Spatrickdefm : X86WriteRes<WriteFStoreY,       [BWPort237,BWPort4], 1, [1,1], 2>;
24609467b48Spatrickdefm : X86WriteRes<WriteFStoreNT,      [BWPort237,BWPort4], 1, [1,1], 2>;
24709467b48Spatrickdefm : X86WriteRes<WriteFStoreNTX,     [BWPort237,BWPort4], 1, [1,1], 2>;
24809467b48Spatrickdefm : X86WriteRes<WriteFStoreNTY,     [BWPort237,BWPort4], 1, [1,1], 2>;
24909467b48Spatrick
25009467b48Spatrickdefm : X86WriteRes<WriteFMaskedStore32,  [BWPort0,BWPort4,BWPort237,BWPort15], 5, [1,1,1,1], 4>;
25109467b48Spatrickdefm : X86WriteRes<WriteFMaskedStore32Y, [BWPort0,BWPort4,BWPort237,BWPort15], 5, [1,1,1,1], 4>;
25209467b48Spatrickdefm : X86WriteRes<WriteFMaskedStore64,  [BWPort0,BWPort4,BWPort237,BWPort15], 5, [1,1,1,1], 4>;
25309467b48Spatrickdefm : X86WriteRes<WriteFMaskedStore64Y, [BWPort0,BWPort4,BWPort237,BWPort15], 5, [1,1,1,1], 4>;
25409467b48Spatrick
25509467b48Spatrickdefm : X86WriteRes<WriteFMove,         [BWPort5], 1, [1], 1>;
25609467b48Spatrickdefm : X86WriteRes<WriteFMoveX,        [BWPort5], 1, [1], 1>;
25709467b48Spatrickdefm : X86WriteRes<WriteFMoveY,        [BWPort5], 1, [1], 1>;
258*d415bd75Srobertdefm : X86WriteResUnsupported<WriteFMoveZ>;
259*d415bd75Srobertdefm : X86WriteRes<WriteEMMS,          [BWPort01,BWPort15,BWPort015,BWPort0156], 31, [8,1,21,1], 31>;
26009467b48Spatrick
26109467b48Spatrickdefm : BWWriteResPair<WriteFAdd,    [BWPort1],  3, [1], 1, 5>; // Floating point add/sub.
26209467b48Spatrickdefm : BWWriteResPair<WriteFAddX,   [BWPort1],  3, [1], 1, 5>; // Floating point add/sub (XMM).
26309467b48Spatrickdefm : BWWriteResPair<WriteFAddY,   [BWPort1],  3, [1], 1, 6>; // Floating point add/sub (YMM/ZMM).
26409467b48Spatrickdefm : X86WriteResPairUnsupported<WriteFAddZ>;
26509467b48Spatrickdefm : BWWriteResPair<WriteFAdd64,  [BWPort1],  3, [1], 1, 5>; // Floating point double add/sub.
26609467b48Spatrickdefm : BWWriteResPair<WriteFAdd64X, [BWPort1],  3, [1], 1, 5>; // Floating point double add/sub (XMM).
26709467b48Spatrickdefm : BWWriteResPair<WriteFAdd64Y, [BWPort1],  3, [1], 1, 6>; // Floating point double add/sub (YMM/ZMM).
26809467b48Spatrickdefm : X86WriteResPairUnsupported<WriteFAdd64Z>;
26909467b48Spatrick
27009467b48Spatrickdefm : BWWriteResPair<WriteFCmp,    [BWPort1],  3, [1], 1, 5>; // Floating point compare.
27109467b48Spatrickdefm : BWWriteResPair<WriteFCmpX,   [BWPort1],  3, [1], 1, 5>; // Floating point compare (XMM).
27209467b48Spatrickdefm : BWWriteResPair<WriteFCmpY,   [BWPort1],  3, [1], 1, 6>; // Floating point compare (YMM/ZMM).
27309467b48Spatrickdefm : X86WriteResPairUnsupported<WriteFCmpZ>;
27409467b48Spatrickdefm : BWWriteResPair<WriteFCmp64,  [BWPort1],  3, [1], 1, 5>; // Floating point double compare.
27509467b48Spatrickdefm : BWWriteResPair<WriteFCmp64X, [BWPort1],  3, [1], 1, 5>; // Floating point double compare (XMM).
27609467b48Spatrickdefm : BWWriteResPair<WriteFCmp64Y, [BWPort1],  3, [1], 1, 6>; // Floating point double compare (YMM/ZMM).
27709467b48Spatrickdefm : X86WriteResPairUnsupported<WriteFCmp64Z>;
27809467b48Spatrick
279097a140dSpatrickdefm : BWWriteResPair<WriteFCom,    [BWPort1],  3>; // Floating point compare to flags (X87).
280097a140dSpatrickdefm : BWWriteResPair<WriteFComX,   [BWPort1],  3>; // Floating point compare to flags (SSE).
28109467b48Spatrick
28209467b48Spatrickdefm : BWWriteResPair<WriteFMul,    [BWPort01], 3, [1], 1, 5>; // Floating point multiplication.
28309467b48Spatrickdefm : BWWriteResPair<WriteFMulX,   [BWPort01], 3, [1], 1, 5>; // Floating point multiplication (XMM).
28409467b48Spatrickdefm : BWWriteResPair<WriteFMulY,   [BWPort01], 3, [1], 1, 6>; // Floating point multiplication (YMM/ZMM).
28509467b48Spatrickdefm : X86WriteResPairUnsupported<WriteFMulZ>;
28609467b48Spatrickdefm : BWWriteResPair<WriteFMul64,  [BWPort01], 3, [1], 1, 5>; // Floating point double multiplication.
28709467b48Spatrickdefm : BWWriteResPair<WriteFMul64X, [BWPort01], 3, [1], 1, 5>; // Floating point double multiplication (XMM).
28809467b48Spatrickdefm : BWWriteResPair<WriteFMul64Y, [BWPort01], 3, [1], 1, 6>; // Floating point double multiplication (YMM/ZMM).
28909467b48Spatrickdefm : X86WriteResPairUnsupported<WriteFMul64Z>;
29009467b48Spatrick
29109467b48Spatrick//defm : BWWriteResPair<WriteFDiv,     [BWPort0,BWFPDivider], 11, [1,3], 1, 5>; // Floating point division.
29209467b48Spatrickdefm : BWWriteResPair<WriteFDivX,    [BWPort0,BWFPDivider], 11, [1,5], 1, 5>; // Floating point division (XMM).
29309467b48Spatrickdefm : BWWriteResPair<WriteFDivY,    [BWPort0,BWPort015,BWFPDivider], 17, [2,1,10], 3, 6>; // Floating point division (YMM).
29409467b48Spatrickdefm : X86WriteResPairUnsupported<WriteFDivZ>;
29509467b48Spatrick//defm : BWWriteResPair<WriteFDiv64,   [BWPort0,BWFPDivider], 14, [1,8], 1, 5>; // Floating point division.
29609467b48Spatrickdefm : BWWriteResPair<WriteFDiv64X,  [BWPort0,BWFPDivider], 14, [1,8], 1, 5>; // Floating point division (XMM).
29709467b48Spatrickdefm : BWWriteResPair<WriteFDiv64Y,  [BWPort0,BWPort015,BWFPDivider], 23, [2,1,16], 3, 6>; // Floating point division (YMM).
29809467b48Spatrickdefm : X86WriteResPairUnsupported<WriteFDiv64Z>;
29909467b48Spatrick
300*d415bd75Srobertdefm : BWWriteResPair<WriteFRcp,   [BWPort0],  5, [1], 1, 5>; // Floating point reciprocal estimate.
301*d415bd75Srobertdefm : BWWriteResPair<WriteFRcpX,  [BWPort0],  5, [1], 1, 5>; // Floating point reciprocal estimate (XMM).
302*d415bd75Srobertdefm : BWWriteResPair<WriteFRcpY,  [BWPort0,BWPort015], 11, [2,1], 3, 6>; // Floating point reciprocal estimate (YMM/ZMM).
303*d415bd75Srobertdefm : X86WriteResPairUnsupported<WriteFRcpZ>;
304*d415bd75Srobert
305*d415bd75Srobertdefm : BWWriteResPair<WriteFRsqrt, [BWPort0],  5, [1], 1, 5>; // Floating point reciprocal square root estimate.
306*d415bd75Srobertdefm : BWWriteResPair<WriteFRsqrtX,[BWPort0],  5, [1], 1, 5>; // Floating point reciprocal square root estimate (XMM).
307*d415bd75Srobertdefm : BWWriteResPair<WriteFRsqrtY,[BWPort0,BWPort015], 11, [2,1], 3, 6>; // Floating point reciprocal square root estimate (YMM/ZMM).
308*d415bd75Srobertdefm : X86WriteResPairUnsupported<WriteFRsqrtZ>;
309*d415bd75Srobert
31009467b48Spatrickdefm : X86WriteRes<WriteFSqrt,       [BWPort0,BWFPDivider], 11, [1,4], 1>; // Floating point square root.
31109467b48Spatrickdefm : X86WriteRes<WriteFSqrtLd,     [BWPort0,BWPort23,BWFPDivider], 16, [1,1,7], 2>;
31209467b48Spatrickdefm : BWWriteResPair<WriteFSqrtX,   [BWPort0,BWFPDivider], 11, [1,7], 1, 5>; // Floating point square root (XMM).
31309467b48Spatrickdefm : BWWriteResPair<WriteFSqrtY,   [BWPort0,BWPort015,BWFPDivider], 21, [2,1,14], 3, 6>; // Floating point square root (YMM).
31409467b48Spatrickdefm : X86WriteResPairUnsupported<WriteFSqrtZ>;
31509467b48Spatrickdefm : X86WriteRes<WriteFSqrt64,     [BWPort0,BWFPDivider], 16, [1,8], 1>; // Floating point double square root.
31609467b48Spatrickdefm : X86WriteRes<WriteFSqrt64Ld,   [BWPort0,BWPort23,BWFPDivider], 21, [1,1,14], 2>;
31709467b48Spatrickdefm : BWWriteResPair<WriteFSqrt64X, [BWPort0,BWFPDivider], 16, [1,14],1, 5>; // Floating point double square root (XMM).
31809467b48Spatrickdefm : BWWriteResPair<WriteFSqrt64Y, [BWPort0,BWPort015,BWFPDivider], 29, [2,1,28], 3, 6>; // Floating point double square root (YMM).
31909467b48Spatrickdefm : X86WriteResPairUnsupported<WriteFSqrt64Z>;
32009467b48Spatrickdefm : BWWriteResPair<WriteFSqrt80,  [BWPort0,BWFPDivider], 23, [1,9]>; // Floating point long double square root.
32109467b48Spatrick
32209467b48Spatrickdefm : BWWriteResPair<WriteFMA,    [BWPort01], 5, [1], 1, 5>; // Fused Multiply Add.
32309467b48Spatrickdefm : BWWriteResPair<WriteFMAX,   [BWPort01], 5, [1], 1, 5>; // Fused Multiply Add (XMM).
32409467b48Spatrickdefm : BWWriteResPair<WriteFMAY,   [BWPort01], 5, [1], 1, 6>; // Fused Multiply Add (YMM/ZMM).
32509467b48Spatrickdefm : X86WriteResPairUnsupported<WriteFMAZ>;
32609467b48Spatrickdefm : BWWriteResPair<WriteDPPD,   [BWPort0,BWPort1,BWPort5],  9, [1,1,1], 3, 5>; // Floating point double dot product.
32709467b48Spatrickdefm : BWWriteResPair<WriteDPPS,   [BWPort0,BWPort1,BWPort5], 14, [2,1,1], 4, 5>; // Floating point single dot product.
32809467b48Spatrickdefm : BWWriteResPair<WriteDPPSY,  [BWPort0,BWPort1,BWPort5], 14, [2,1,1], 4, 6>; // Floating point single dot product (YMM).
32909467b48Spatrickdefm : BWWriteResPair<WriteFSign,     [BWPort5], 1>; // Floating point fabs/fchs.
33009467b48Spatrickdefm : X86WriteRes<WriteFRnd,            [BWPort23],  6, [1],   1>; // Floating point rounding.
33109467b48Spatrickdefm : X86WriteRes<WriteFRndY,           [BWPort23],  6, [1],   1>; // Floating point rounding (YMM/ZMM).
33209467b48Spatrickdefm : X86WriteResPairUnsupported<WriteFRndZ>;
33309467b48Spatrickdefm : X86WriteRes<WriteFRndLd,  [BWPort1,BWPort23], 11, [2,1], 3>;
33409467b48Spatrickdefm : X86WriteRes<WriteFRndYLd, [BWPort1,BWPort23], 12, [2,1], 3>;
33509467b48Spatrickdefm : BWWriteResPair<WriteFLogic,    [BWPort5], 1, [1], 1, 5>; // Floating point and/or/xor logicals.
33609467b48Spatrickdefm : BWWriteResPair<WriteFLogicY,   [BWPort5], 1, [1], 1, 6>; // Floating point and/or/xor logicals (YMM/ZMM).
33709467b48Spatrickdefm : X86WriteResPairUnsupported<WriteFLogicZ>;
33809467b48Spatrickdefm : BWWriteResPair<WriteFTest,     [BWPort0], 1, [1], 1, 5>; // Floating point TEST instructions.
33909467b48Spatrickdefm : BWWriteResPair<WriteFTestY,    [BWPort0], 1, [1], 1, 6>; // Floating point TEST instructions (YMM/ZMM).
34009467b48Spatrickdefm : X86WriteResPairUnsupported<WriteFTestZ>;
34109467b48Spatrickdefm : BWWriteResPair<WriteFShuffle,  [BWPort5], 1, [1], 1, 5>; // Floating point vector shuffles.
34209467b48Spatrickdefm : BWWriteResPair<WriteFShuffleY, [BWPort5], 1, [1], 1, 6>; // Floating point vector shuffles (YMM/ZMM).
34309467b48Spatrickdefm : X86WriteResPairUnsupported<WriteFShuffleZ>;
34409467b48Spatrickdefm : BWWriteResPair<WriteFVarShuffle,  [BWPort5], 1, [1], 1, 5>; // Floating point vector variable shuffles.
34509467b48Spatrickdefm : BWWriteResPair<WriteFVarShuffleY, [BWPort5], 1, [1], 1, 6>; // Floating point vector variable shuffles.
34609467b48Spatrickdefm : X86WriteResPairUnsupported<WriteFVarShuffleZ>;
34709467b48Spatrickdefm : BWWriteResPair<WriteFBlend,  [BWPort015], 1, [1], 1, 5>; // Floating point vector blends.
34809467b48Spatrickdefm : BWWriteResPair<WriteFBlendY, [BWPort015], 1, [1], 1, 6>; // Floating point vector blends.
34909467b48Spatrickdefm : X86WriteResPairUnsupported<WriteFBlendZ>;
350*d415bd75Srobertdefm : BWWriteResPair<WriteFShuffle256, [BWPort5], 3, [1], 1, 6>; // Fp 256-bit width vector shuffles.
351*d415bd75Srobertdefm : BWWriteResPair<WriteFVarShuffle256, [BWPort5], 3, [1], 1, 6>; // Fp 256-bit width vector variable shuffles.
35209467b48Spatrickdefm : BWWriteResPair<WriteFVarBlend,  [BWPort5], 2, [2], 2, 5>; // Fp vector variable blends.
35309467b48Spatrickdefm : BWWriteResPair<WriteFVarBlendY, [BWPort5], 2, [2], 2, 6>; // Fp vector variable blends.
35409467b48Spatrickdefm : X86WriteResPairUnsupported<WriteFVarBlendZ>;
35509467b48Spatrick
35609467b48Spatrick// FMA Scheduling helper class.
35709467b48Spatrick// class FMASC { X86FoldableSchedWrite Sched = WriteFAdd; }
35809467b48Spatrick
359*d415bd75Srobert// Conversion between integer and float.
360*d415bd75Srobertdefm : BWWriteResPair<WriteCvtSS2I,   [BWPort1,BWPort0], 4, [1,1], 2, 5>;
361*d415bd75Srobertdefm : BWWriteResPair<WriteCvtPS2I,   [BWPort1], 3, [1], 1, 5>;
362*d415bd75Srobertdefm : BWWriteResPair<WriteCvtPS2IY,  [BWPort1], 3, [1], 1, 6>;
363*d415bd75Srobertdefm : X86WriteResPairUnsupported<WriteCvtPS2IZ>;
364*d415bd75Srobertdefm : BWWriteResPair<WriteCvtSD2I,   [BWPort1,BWPort0], 4, [1,1], 2, 5>;
365*d415bd75Srobertdefm : BWWriteResPair<WriteCvtPD2I,   [BWPort1,BWPort5], 4, [1,1], 2, 5>;
366*d415bd75Srobertdefm : BWWriteResPair<WriteCvtPD2IY,  [BWPort1,BWPort5], 6, [1,1], 2, 6>;
367*d415bd75Srobertdefm : X86WriteResPairUnsupported<WriteCvtPD2IZ>;
368*d415bd75Srobert
369*d415bd75Srobertdefm : X86WriteRes<WriteCvtI2SS,      [BWPort1,BWPort5], 4, [1,1], 2>;
370*d415bd75Srobertdefm : X86WriteRes<WriteCvtI2SSLd,   [BWPort1,BWPort23], 9, [1,1], 2>;
371*d415bd75Srobertdefm : BWWriteResPair<WriteCvtI2PS,   [BWPort1], 3>;
372*d415bd75Srobertdefm : BWWriteResPair<WriteCvtI2PSY,  [BWPort1], 3, [1], 1, 6>;
373*d415bd75Srobertdefm : X86WriteResPairUnsupported<WriteCvtI2PSZ>;
374*d415bd75Srobertdefm : X86WriteRes<WriteCvtI2SD,      [BWPort1,BWPort5], 4, [1,1], 2>;
375*d415bd75Srobertdefm : X86WriteRes<WriteCvtI2SDLd,   [BWPort1,BWPort23], 9, [1,1], 2>;
376*d415bd75Srobertdefm : BWWriteResPair<WriteCvtI2PD,   [BWPort1,BWPort5], 4, [1,1], 2, 5>;
377*d415bd75Srobertdefm : BWWriteResPair<WriteCvtI2PDY,  [BWPort1,BWPort5], 6, [1,1], 2, 5>;
378*d415bd75Srobertdefm : X86WriteResPairUnsupported<WriteCvtI2PDZ>;
379*d415bd75Srobert
380*d415bd75Srobertdefm : X86WriteRes<WriteCvtSS2SD,     [BWPort0,BWPort5], 2, [1,1], 2>;
381*d415bd75Srobertdefm : X86WriteRes<WriteCvtSS2SDLd,  [BWPort0,BWPort23], 6, [1,1], 2>;
382*d415bd75Srobertdefm : X86WriteRes<WriteCvtPS2PD,     [BWPort0,BWPort5], 2, [1,1], 2>;
383*d415bd75Srobertdefm : X86WriteRes<WriteCvtPS2PDLd,  [BWPort0,BWPort23], 6, [1,1], 2>;
384*d415bd75Srobertdefm : BWWriteResPair<WriteCvtPS2PDY, [BWPort0,BWPort5], 4, [1,1], 2, 5>;
385*d415bd75Srobertdefm : X86WriteResPairUnsupported<WriteCvtPS2PDZ>;
386*d415bd75Srobertdefm : BWWriteResPair<WriteCvtSD2SS,  [BWPort1,BWPort5], 4, [1,1], 2, 5>;
387*d415bd75Srobertdefm : BWWriteResPair<WriteCvtPD2PS,  [BWPort1,BWPort5], 4, [1,1], 2, 5>;
388*d415bd75Srobertdefm : BWWriteResPair<WriteCvtPD2PSY, [BWPort1,BWPort5], 6, [1,1], 2, 6>;
389*d415bd75Srobertdefm : X86WriteResPairUnsupported<WriteCvtPD2PSZ>;
390*d415bd75Srobert
391*d415bd75Srobertdefm : X86WriteRes<WriteCvtPH2PS,     [BWPort0,BWPort5], 2, [1,1], 2>;
392*d415bd75Srobertdefm : X86WriteRes<WriteCvtPH2PSY,    [BWPort0,BWPort5], 2, [1,1], 2>;
393*d415bd75Srobertdefm : X86WriteResUnsupported<WriteCvtPH2PSZ>;
394*d415bd75Srobertdefm : X86WriteRes<WriteCvtPH2PSLd,  [BWPort0,BWPort23], 6, [1,1], 2>;
395*d415bd75Srobertdefm : X86WriteRes<WriteCvtPH2PSYLd, [BWPort0,BWPort23], 6, [1,1], 2>;
396*d415bd75Srobertdefm : X86WriteResUnsupported<WriteCvtPH2PSZLd>;
397*d415bd75Srobert
398*d415bd75Srobertdefm : X86WriteRes<WriteCvtPS2PH,    [BWPort1,BWPort5], 4, [1,1], 2>;
399*d415bd75Srobertdefm : X86WriteRes<WriteCvtPS2PHY,   [BWPort1,BWPort5], 6, [1,1], 2>;
400*d415bd75Srobertdefm : X86WriteResUnsupported<WriteCvtPS2PHZ>;
401*d415bd75Srobertdefm : X86WriteRes<WriteCvtPS2PHSt,  [BWPort1,BWPort4,BWPort237], 5, [1,1,1], 3>;
402*d415bd75Srobertdefm : X86WriteRes<WriteCvtPS2PHYSt, [BWPort1,BWPort4,BWPort237], 7, [1,1,1], 3>;
403*d415bd75Srobertdefm : X86WriteResUnsupported<WriteCvtPS2PHZSt>;
404*d415bd75Srobert
40509467b48Spatrick// Vector integer operations.
40609467b48Spatrickdefm : X86WriteRes<WriteVecLoad,         [BWPort23], 5, [1], 1>;
40709467b48Spatrickdefm : X86WriteRes<WriteVecLoadX,        [BWPort23], 5, [1], 1>;
40809467b48Spatrickdefm : X86WriteRes<WriteVecLoadY,        [BWPort23], 6, [1], 1>;
40909467b48Spatrickdefm : X86WriteRes<WriteVecLoadNT,       [BWPort23], 5, [1], 1>;
41009467b48Spatrickdefm : X86WriteRes<WriteVecLoadNTY,      [BWPort23], 6, [1], 1>;
41109467b48Spatrickdefm : X86WriteRes<WriteVecMaskedLoad,   [BWPort23,BWPort5], 7, [1,2], 3>;
41209467b48Spatrickdefm : X86WriteRes<WriteVecMaskedLoadY,  [BWPort23,BWPort5], 8, [1,2], 3>;
41309467b48Spatrickdefm : X86WriteRes<WriteVecStore,        [BWPort237,BWPort4], 1, [1,1], 2>;
41409467b48Spatrickdefm : X86WriteRes<WriteVecStoreX,       [BWPort237,BWPort4], 1, [1,1], 2>;
41509467b48Spatrickdefm : X86WriteRes<WriteVecStoreY,       [BWPort237,BWPort4], 1, [1,1], 2>;
41609467b48Spatrickdefm : X86WriteRes<WriteVecStoreNT,      [BWPort237,BWPort4], 1, [1,1], 2>;
41709467b48Spatrickdefm : X86WriteRes<WriteVecStoreNTY,     [BWPort237,BWPort4], 1, [1,1], 2>;
418097a140dSpatrickdefm : X86WriteRes<WriteVecMaskedStore32,  [BWPort0,BWPort4,BWPort237,BWPort15], 5, [1,1,1,1], 4>;
419097a140dSpatrickdefm : X86WriteRes<WriteVecMaskedStore32Y, [BWPort0,BWPort4,BWPort237,BWPort15], 5, [1,1,1,1], 4>;
420097a140dSpatrickdefm : X86WriteRes<WriteVecMaskedStore64,  [BWPort0,BWPort4,BWPort237,BWPort15], 5, [1,1,1,1], 4>;
421097a140dSpatrickdefm : X86WriteRes<WriteVecMaskedStore64Y, [BWPort0,BWPort4,BWPort237,BWPort15], 5, [1,1,1,1], 4>;
42209467b48Spatrickdefm : X86WriteRes<WriteVecMove,         [BWPort015], 1, [1], 1>;
42309467b48Spatrickdefm : X86WriteRes<WriteVecMoveX,        [BWPort015], 1, [1], 1>;
42409467b48Spatrickdefm : X86WriteRes<WriteVecMoveY,        [BWPort015], 1, [1], 1>;
425*d415bd75Srobertdefm : X86WriteResUnsupported<WriteVecMoveZ>;
42609467b48Spatrickdefm : X86WriteRes<WriteVecMoveToGpr,    [BWPort0], 1, [1], 1>;
42709467b48Spatrickdefm : X86WriteRes<WriteVecMoveFromGpr,  [BWPort5], 1, [1], 1>;
42809467b48Spatrick
42909467b48Spatrickdefm : BWWriteResPair<WriteVecLogic, [BWPort015], 1, [1], 1, 5>; // Vector integer and/or/xor.
43009467b48Spatrickdefm : BWWriteResPair<WriteVecLogicX,[BWPort015], 1, [1], 1, 5>; // Vector integer and/or/xor.
43109467b48Spatrickdefm : BWWriteResPair<WriteVecLogicY,[BWPort015], 1, [1], 1, 6>; // Vector integer and/or/xor (YMM/ZMM).
43209467b48Spatrickdefm : X86WriteResPairUnsupported<WriteVecLogicZ>;
43309467b48Spatrickdefm : BWWriteResPair<WriteVecTest,  [BWPort0,BWPort5], 2, [1,1], 2, 5>; // Vector integer TEST instructions.
43409467b48Spatrickdefm : BWWriteResPair<WriteVecTestY, [BWPort0,BWPort5], 4, [1,1], 2, 6>; // Vector integer TEST instructions (YMM/ZMM).
43509467b48Spatrickdefm : X86WriteResPairUnsupported<WriteVecTestZ>;
436*d415bd75Srobertdefm : BWWriteResPair<WriteVecALU,   [BWPort15], 1, [1], 1, 5>; // Vector integer ALU op, no logicals.
437*d415bd75Srobertdefm : BWWriteResPair<WriteVecALUX,  [BWPort15], 1, [1], 1, 5>; // Vector integer ALU op, no logicals.
438*d415bd75Srobertdefm : BWWriteResPair<WriteVecALUY,  [BWPort15], 1, [1], 1, 6>; // Vector integer ALU op, no logicals (YMM/ZMM).
439*d415bd75Srobertdefm : X86WriteResPairUnsupported<WriteVecALUZ>;
44009467b48Spatrickdefm : BWWriteResPair<WriteVecIMul,  [BWPort0],  5, [1], 1, 5>; // Vector integer multiply.
44109467b48Spatrickdefm : BWWriteResPair<WriteVecIMulX, [BWPort0],  5, [1], 1, 5>; // Vector integer multiply.
44209467b48Spatrickdefm : BWWriteResPair<WriteVecIMulY, [BWPort0],  5, [1], 1, 6>; // Vector integer multiply.
44309467b48Spatrickdefm : X86WriteResPairUnsupported<WriteVecIMulZ>;
44409467b48Spatrickdefm : BWWriteResPair<WritePMULLD,   [BWPort0], 10, [2], 2, 5>; // Vector PMULLD.
44509467b48Spatrickdefm : BWWriteResPair<WritePMULLDY,  [BWPort0], 10, [2], 2, 6>; // Vector PMULLD (YMM/ZMM).
44609467b48Spatrickdefm : X86WriteResPairUnsupported<WritePMULLDZ>;
44709467b48Spatrickdefm : BWWriteResPair<WriteShuffle,  [BWPort5], 1, [1], 1, 5>; // Vector shuffles.
44809467b48Spatrickdefm : BWWriteResPair<WriteShuffleX, [BWPort5], 1, [1], 1, 5>; // Vector shuffles.
44909467b48Spatrickdefm : BWWriteResPair<WriteShuffleY, [BWPort5], 1, [1], 1, 6>; // Vector shuffles (YMM/ZMM).
45009467b48Spatrickdefm : X86WriteResPairUnsupported<WriteShuffleZ>;
45109467b48Spatrickdefm : BWWriteResPair<WriteVarShuffle, [BWPort5], 1, [1], 1, 5>; // Vector variable shuffles.
45209467b48Spatrickdefm : BWWriteResPair<WriteVarShuffleX,[BWPort5], 1, [1], 1, 5>; // Vector variable shuffles.
45309467b48Spatrickdefm : BWWriteResPair<WriteVarShuffleY,[BWPort5], 1, [1], 1, 6>; // Vector variable shuffles (YMM/ZMM).
45409467b48Spatrickdefm : X86WriteResPairUnsupported<WriteVarShuffleZ>;
45509467b48Spatrickdefm : BWWriteResPair<WriteBlend,  [BWPort5], 1, [1], 1, 5>; // Vector blends.
45609467b48Spatrickdefm : BWWriteResPair<WriteBlendY, [BWPort5], 1, [1], 1, 6>; // Vector blends (YMM/ZMM).
45709467b48Spatrickdefm : X86WriteResPairUnsupported<WriteBlendZ>;
458*d415bd75Srobertdefm : BWWriteResPair<WriteShuffle256, [BWPort5], 3, [1], 1, 6>;  // 256-bit width vector shuffles.
459*d415bd75Srobertdefm : BWWriteResPair<WriteVPMOV256, [BWPort5], 3, [1], 1, 6>;  // 256-bit width packed vector width-changing move.
460*d415bd75Srobertdefm : BWWriteResPair<WriteVarShuffle256, [BWPort5], 3, [1], 1, 6>;  // 256-bit width vector variable shuffles.
46109467b48Spatrickdefm : BWWriteResPair<WriteVarBlend,  [BWPort5], 2, [2], 2, 5>; // Vector variable blends.
46209467b48Spatrickdefm : BWWriteResPair<WriteVarBlendY, [BWPort5], 2, [2], 2, 6>; // Vector variable blends (YMM/ZMM).
46309467b48Spatrickdefm : X86WriteResPairUnsupported<WriteVarBlendZ>;
46409467b48Spatrickdefm : BWWriteResPair<WriteMPSAD,  [BWPort0, BWPort5], 7, [1, 2], 3, 5>; // Vector MPSAD.
46509467b48Spatrickdefm : BWWriteResPair<WriteMPSADY, [BWPort0, BWPort5], 7, [1, 2], 3, 6>; // Vector MPSAD.
46609467b48Spatrickdefm : X86WriteResPairUnsupported<WriteMPSADZ>;
46709467b48Spatrickdefm : BWWriteResPair<WritePSADBW,   [BWPort0], 5, [1], 1, 5>; // Vector PSADBW.
46809467b48Spatrickdefm : BWWriteResPair<WritePSADBWX,  [BWPort0], 5, [1], 1, 5>; // Vector PSADBW.
46909467b48Spatrickdefm : BWWriteResPair<WritePSADBWY,  [BWPort0], 5, [1], 1, 6>; // Vector PSADBW (YMM/ZMM).
47009467b48Spatrickdefm : X86WriteResPairUnsupported<WritePSADBWZ>;
47109467b48Spatrickdefm : BWWriteResPair<WritePHMINPOS, [BWPort0], 5>; // Vector PHMINPOS.
47209467b48Spatrick
47309467b48Spatrick// Vector integer shifts.
47409467b48Spatrickdefm : BWWriteResPair<WriteVecShift,     [BWPort0], 1, [1], 1, 5>;
47509467b48Spatrickdefm : BWWriteResPair<WriteVecShiftX,    [BWPort0,BWPort5],  2, [1,1], 2, 5>;
47609467b48Spatrickdefm : X86WriteRes<WriteVecShiftY,       [BWPort0,BWPort5],  4, [1,1], 2>;
47709467b48Spatrickdefm : X86WriteRes<WriteVecShiftYLd,     [BWPort0,BWPort23], 7, [1,1], 2>;
47809467b48Spatrickdefm : X86WriteResPairUnsupported<WriteVecShiftZ>;
47909467b48Spatrick
48009467b48Spatrickdefm : BWWriteResPair<WriteVecShiftImm,  [BWPort0],  1, [1], 1, 5>;
48109467b48Spatrickdefm : BWWriteResPair<WriteVecShiftImmX, [BWPort0],  1, [1], 1, 5>; // Vector integer immediate shifts (XMM).
48209467b48Spatrickdefm : BWWriteResPair<WriteVecShiftImmY, [BWPort0],  1, [1], 1, 6>; // Vector integer immediate shifts (YMM/ZMM).
48309467b48Spatrickdefm : X86WriteResPairUnsupported<WriteVecShiftImmZ>;
48409467b48Spatrickdefm : BWWriteResPair<WriteVarVecShift,  [BWPort0, BWPort5], 3, [2,1], 3, 5>; // Variable vector shifts.
48509467b48Spatrickdefm : BWWriteResPair<WriteVarVecShiftY, [BWPort0, BWPort5], 3, [2,1], 3, 6>; // Variable vector shifts (YMM/ZMM).
48609467b48Spatrickdefm : X86WriteResPairUnsupported<WriteVarVecShiftZ>;
48709467b48Spatrick
48809467b48Spatrick// Vector insert/extract operations.
48909467b48Spatrickdef : WriteRes<WriteVecInsert, [BWPort5]> {
49009467b48Spatrick  let Latency = 2;
49109467b48Spatrick  let NumMicroOps = 2;
49209467b48Spatrick  let ResourceCycles = [2];
49309467b48Spatrick}
49409467b48Spatrickdef : WriteRes<WriteVecInsertLd, [BWPort5,BWPort23]> {
49509467b48Spatrick  let Latency = 6;
49609467b48Spatrick  let NumMicroOps = 2;
49709467b48Spatrick}
49809467b48Spatrick
49909467b48Spatrickdef : WriteRes<WriteVecExtract, [BWPort0,BWPort5]> {
50009467b48Spatrick  let Latency = 2;
50109467b48Spatrick  let NumMicroOps = 2;
50209467b48Spatrick}
50309467b48Spatrickdef : WriteRes<WriteVecExtractSt, [BWPort4,BWPort5,BWPort237]> {
50409467b48Spatrick  let Latency = 2;
50509467b48Spatrick  let NumMicroOps = 3;
50609467b48Spatrick}
50709467b48Spatrick
508*d415bd75Srobert// String instructions.
50909467b48Spatrick
51009467b48Spatrick// Packed Compare Implicit Length Strings, Return Mask
51109467b48Spatrickdef : WriteRes<WritePCmpIStrM, [BWPort0]> {
51209467b48Spatrick  let Latency = 11;
51309467b48Spatrick  let NumMicroOps = 3;
51409467b48Spatrick  let ResourceCycles = [3];
51509467b48Spatrick}
51609467b48Spatrickdef : WriteRes<WritePCmpIStrMLd, [BWPort0, BWPort23]> {
51709467b48Spatrick  let Latency = 16;
51809467b48Spatrick  let NumMicroOps = 4;
51909467b48Spatrick  let ResourceCycles = [3,1];
52009467b48Spatrick}
52109467b48Spatrick
52209467b48Spatrick// Packed Compare Explicit Length Strings, Return Mask
52309467b48Spatrickdef : WriteRes<WritePCmpEStrM, [BWPort0, BWPort5, BWPort015, BWPort0156]> {
52409467b48Spatrick  let Latency = 19;
52509467b48Spatrick  let NumMicroOps = 9;
52609467b48Spatrick  let ResourceCycles = [4,3,1,1];
52709467b48Spatrick}
52809467b48Spatrickdef : WriteRes<WritePCmpEStrMLd, [BWPort0, BWPort5, BWPort23, BWPort015, BWPort0156]> {
52909467b48Spatrick  let Latency = 24;
53009467b48Spatrick  let NumMicroOps = 10;
53109467b48Spatrick  let ResourceCycles = [4,3,1,1,1];
53209467b48Spatrick}
53309467b48Spatrick
53409467b48Spatrick// Packed Compare Implicit Length Strings, Return Index
53509467b48Spatrickdef : WriteRes<WritePCmpIStrI, [BWPort0]> {
53609467b48Spatrick  let Latency = 11;
53709467b48Spatrick  let NumMicroOps = 3;
53809467b48Spatrick  let ResourceCycles = [3];
53909467b48Spatrick}
54009467b48Spatrickdef : WriteRes<WritePCmpIStrILd, [BWPort0, BWPort23]> {
54109467b48Spatrick  let Latency = 16;
54209467b48Spatrick  let NumMicroOps = 4;
54309467b48Spatrick  let ResourceCycles = [3,1];
54409467b48Spatrick}
54509467b48Spatrick
54609467b48Spatrick// Packed Compare Explicit Length Strings, Return Index
54709467b48Spatrickdef : WriteRes<WritePCmpEStrI, [BWPort0, BWPort5, BWPort0156]> {
54809467b48Spatrick  let Latency = 18;
54909467b48Spatrick  let NumMicroOps = 8;
55009467b48Spatrick  let ResourceCycles = [4,3,1];
55109467b48Spatrick}
55209467b48Spatrickdef : WriteRes<WritePCmpEStrILd, [BWPort0, BWPort5, BWPort23, BWPort0156]> {
55309467b48Spatrick  let Latency = 23;
55409467b48Spatrick  let NumMicroOps = 9;
55509467b48Spatrick  let ResourceCycles = [4,3,1,1];
55609467b48Spatrick}
55709467b48Spatrick
55809467b48Spatrick// MOVMSK Instructions.
55909467b48Spatrickdef : WriteRes<WriteFMOVMSK,    [BWPort0]> { let Latency = 3; }
56009467b48Spatrickdef : WriteRes<WriteVecMOVMSK,  [BWPort0]> { let Latency = 3; }
56109467b48Spatrickdef : WriteRes<WriteVecMOVMSKY, [BWPort0]> { let Latency = 3; }
56209467b48Spatrickdef : WriteRes<WriteMMXMOVMSK,  [BWPort0]> { let Latency = 1; }
56309467b48Spatrick
564*d415bd75Srobert// AES Instructions.
56509467b48Spatrickdef : WriteRes<WriteAESDecEnc, [BWPort5]> { // Decryption, encryption.
56609467b48Spatrick  let Latency = 7;
56709467b48Spatrick  let NumMicroOps = 1;
56809467b48Spatrick  let ResourceCycles = [1];
56909467b48Spatrick}
57009467b48Spatrickdef : WriteRes<WriteAESDecEncLd, [BWPort5, BWPort23]> {
57109467b48Spatrick  let Latency = 12;
57209467b48Spatrick  let NumMicroOps = 2;
57309467b48Spatrick  let ResourceCycles = [1,1];
57409467b48Spatrick}
57509467b48Spatrick
57609467b48Spatrickdef : WriteRes<WriteAESIMC, [BWPort5]> { // InvMixColumn.
57709467b48Spatrick  let Latency = 14;
57809467b48Spatrick  let NumMicroOps = 2;
57909467b48Spatrick  let ResourceCycles = [2];
58009467b48Spatrick}
58109467b48Spatrickdef : WriteRes<WriteAESIMCLd, [BWPort5, BWPort23]> {
58209467b48Spatrick  let Latency = 19;
58309467b48Spatrick  let NumMicroOps = 3;
58409467b48Spatrick  let ResourceCycles = [2,1];
58509467b48Spatrick}
58609467b48Spatrick
58709467b48Spatrickdef : WriteRes<WriteAESKeyGen, [BWPort0, BWPort5, BWPort015]> { // Key Generation.
58809467b48Spatrick  let Latency = 29;
58909467b48Spatrick  let NumMicroOps = 11;
59009467b48Spatrick  let ResourceCycles = [2,7,2];
59109467b48Spatrick}
59209467b48Spatrickdef : WriteRes<WriteAESKeyGenLd, [BWPort0, BWPort5, BWPort23, BWPort015]> {
59309467b48Spatrick  let Latency = 33;
59409467b48Spatrick  let NumMicroOps = 11;
59509467b48Spatrick  let ResourceCycles = [2,7,1,1];
59609467b48Spatrick}
59709467b48Spatrick
59809467b48Spatrick// Carry-less multiplication instructions.
59909467b48Spatrickdefm : BWWriteResPair<WriteCLMul,  [BWPort0], 5>;
60009467b48Spatrick// Load/store MXCSR.
60109467b48Spatrickdef : WriteRes<WriteLDMXCSR, [BWPort0,BWPort23,BWPort0156]> { let Latency = 7; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
60209467b48Spatrickdef : WriteRes<WriteSTMXCSR, [BWPort4,BWPort5,BWPort237]> { let Latency = 2; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
60309467b48Spatrick
604*d415bd75Srobert// Catch-all for expensive system instructions.
605*d415bd75Srobertdef : WriteRes<WriteSystem,     [BWPort0156]> { let Latency = 100; }
606*d415bd75Srobert
607*d415bd75Srobert// Old microcoded instructions that nobody use.
608*d415bd75Srobertdef : WriteRes<WriteMicrocoded, [BWPort0156]> { let Latency = 100; }
609*d415bd75Srobert
610*d415bd75Srobert// Fence instructions.
611*d415bd75Srobertdef : WriteRes<WriteFence,  [BWPort23, BWPort4]>;
612*d415bd75Srobert
61309467b48Spatrick// Nop, not very useful expect it provides a model for nops!
61409467b48Spatrickdef : WriteRes<WriteNop, []>;
61509467b48Spatrick
61609467b48Spatrick////////////////////////////////////////////////////////////////////////////////
61709467b48Spatrick// Horizontal add/sub  instructions.
61809467b48Spatrick////////////////////////////////////////////////////////////////////////////////
61909467b48Spatrick
62009467b48Spatrickdefm : BWWriteResPair<WriteFHAdd,   [BWPort1,BWPort5], 5, [1,2], 3, 5>;
62109467b48Spatrickdefm : BWWriteResPair<WriteFHAddY,  [BWPort1,BWPort5], 5, [1,2], 3, 6>;
62209467b48Spatrickdefm : BWWriteResPair<WritePHAdd,  [BWPort5,BWPort15], 3, [2,1], 3, 5>;
62309467b48Spatrickdefm : BWWriteResPair<WritePHAddX, [BWPort5,BWPort15], 3, [2,1], 3, 5>;
62409467b48Spatrickdefm : BWWriteResPair<WritePHAddY, [BWPort5,BWPort15], 3, [2,1], 3, 6>;
62509467b48Spatrick
62609467b48Spatrick// Remaining instrs.
62709467b48Spatrick
62809467b48Spatrickdef BWWriteResGroup1 : SchedWriteRes<[BWPort0]> {
62909467b48Spatrick  let Latency = 1;
63009467b48Spatrick  let NumMicroOps = 1;
63109467b48Spatrick  let ResourceCycles = [1];
63209467b48Spatrick}
63309467b48Spatrickdef: InstRW<[BWWriteResGroup1], (instregex "VPSLLVQ(Y?)rr",
63409467b48Spatrick                                           "VPSRLVQ(Y?)rr")>;
63509467b48Spatrick
63609467b48Spatrickdef BWWriteResGroup2 : SchedWriteRes<[BWPort1]> {
63709467b48Spatrick  let Latency = 1;
63809467b48Spatrick  let NumMicroOps = 1;
63909467b48Spatrick  let ResourceCycles = [1];
64009467b48Spatrick}
64109467b48Spatrickdef: InstRW<[BWWriteResGroup2], (instregex "COM(P?)_FST0r",
64209467b48Spatrick                                           "UCOM_F(P?)r")>;
64309467b48Spatrick
64409467b48Spatrickdef BWWriteResGroup3 : SchedWriteRes<[BWPort5]> {
64509467b48Spatrick  let Latency = 1;
64609467b48Spatrick  let NumMicroOps = 1;
64709467b48Spatrick  let ResourceCycles = [1];
64809467b48Spatrick}
64909467b48Spatrickdef: InstRW<[BWWriteResGroup3], (instrs MMX_MOVQ2DQrr)>;
65009467b48Spatrick
65109467b48Spatrickdef BWWriteResGroup4 : SchedWriteRes<[BWPort6]> {
65209467b48Spatrick  let Latency = 1;
65309467b48Spatrick  let NumMicroOps = 1;
65409467b48Spatrick  let ResourceCycles = [1];
65509467b48Spatrick}
65609467b48Spatrickdef: InstRW<[BWWriteResGroup4], (instregex "JMP(16|32|64)r")>;
65709467b48Spatrick
65809467b48Spatrickdef BWWriteResGroup5 : SchedWriteRes<[BWPort01]> {
65909467b48Spatrick  let Latency = 1;
66009467b48Spatrick  let NumMicroOps = 1;
66109467b48Spatrick  let ResourceCycles = [1];
66209467b48Spatrick}
66309467b48Spatrickdef: InstRW<[BWWriteResGroup5], (instrs FINCSTP, FNOP)>;
66409467b48Spatrick
66509467b48Spatrickdef BWWriteResGroup6 : SchedWriteRes<[BWPort06]> {
66609467b48Spatrick  let Latency = 1;
66709467b48Spatrick  let NumMicroOps = 1;
66809467b48Spatrick  let ResourceCycles = [1];
66909467b48Spatrick}
67009467b48Spatrickdef: InstRW<[BWWriteResGroup6], (instrs CDQ, CQO)>;
67109467b48Spatrick
67209467b48Spatrickdef BWWriteResGroup7 : SchedWriteRes<[BWPort15]> {
67309467b48Spatrick  let Latency = 1;
67409467b48Spatrick  let NumMicroOps = 1;
67509467b48Spatrick  let ResourceCycles = [1];
67609467b48Spatrick}
67709467b48Spatrickdef: InstRW<[BWWriteResGroup7], (instregex "ANDN(32|64)rr")>;
67809467b48Spatrick
67909467b48Spatrickdef BWWriteResGroup8 : SchedWriteRes<[BWPort015]> {
68009467b48Spatrick  let Latency = 1;
68109467b48Spatrick  let NumMicroOps = 1;
68209467b48Spatrick  let ResourceCycles = [1];
68309467b48Spatrick}
68409467b48Spatrickdef: InstRW<[BWWriteResGroup8], (instregex "VPBLENDD(Y?)rri")>;
68509467b48Spatrick
68609467b48Spatrickdef BWWriteResGroup9 : SchedWriteRes<[BWPort0156]> {
68709467b48Spatrick  let Latency = 1;
68809467b48Spatrick  let NumMicroOps = 1;
68909467b48Spatrick  let ResourceCycles = [1];
69009467b48Spatrick}
69109467b48Spatrickdef: InstRW<[BWWriteResGroup9], (instrs SGDT64m,
69209467b48Spatrick                                        SIDT64m,
69309467b48Spatrick                                        SMSW16m,
69409467b48Spatrick                                        STRm,
69509467b48Spatrick                                        SYSCALL)>;
69609467b48Spatrick
69709467b48Spatrickdef BWWriteResGroup10 : SchedWriteRes<[BWPort4,BWPort237]> {
69809467b48Spatrick  let Latency = 1;
69909467b48Spatrick  let NumMicroOps = 2;
70009467b48Spatrick  let ResourceCycles = [1,1];
70109467b48Spatrick}
70209467b48Spatrickdef: InstRW<[BWWriteResGroup10], (instrs FBSTPm)>;
70309467b48Spatrickdef: InstRW<[BWWriteResGroup10], (instregex "ST_FP(32|64|80)m")>;
70409467b48Spatrick
70509467b48Spatrickdef BWWriteResGroup12 : SchedWriteRes<[BWPort01]> {
70609467b48Spatrick  let Latency = 2;
70709467b48Spatrick  let NumMicroOps = 2;
70809467b48Spatrick  let ResourceCycles = [2];
70909467b48Spatrick}
71009467b48Spatrickdef: InstRW<[BWWriteResGroup12], (instrs FDECSTP)>;
71109467b48Spatrick
71209467b48Spatrickdef BWWriteResGroup14 : SchedWriteRes<[BWPort0156]> {
71309467b48Spatrick  let Latency = 2;
71409467b48Spatrick  let NumMicroOps = 2;
71509467b48Spatrick  let ResourceCycles = [2];
71609467b48Spatrick}
71709467b48Spatrickdef: InstRW<[BWWriteResGroup14], (instrs LFENCE,
71809467b48Spatrick                                         MFENCE,
71909467b48Spatrick                                         WAIT,
72009467b48Spatrick                                         XGETBV)>;
72109467b48Spatrick
72209467b48Spatrickdef BWWriteResGroup16 : SchedWriteRes<[BWPort6,BWPort0156]> {
72309467b48Spatrick  let Latency = 2;
72409467b48Spatrick  let NumMicroOps = 2;
72509467b48Spatrick  let ResourceCycles = [1,1];
72609467b48Spatrick}
72709467b48Spatrickdef: InstRW<[BWWriteResGroup16], (instregex "CLFLUSH")>;
72809467b48Spatrick
72909467b48Spatrickdef BWWriteResGroup17 : SchedWriteRes<[BWPort01,BWPort015]> {
73009467b48Spatrick  let Latency = 2;
73109467b48Spatrick  let NumMicroOps = 2;
73209467b48Spatrick  let ResourceCycles = [1,1];
73309467b48Spatrick}
73409467b48Spatrickdef: InstRW<[BWWriteResGroup17], (instrs MMX_MOVDQ2Qrr)>;
73509467b48Spatrick
73609467b48Spatrickdef BWWriteResGroup18 : SchedWriteRes<[BWPort237,BWPort0156]> {
73709467b48Spatrick  let Latency = 2;
73809467b48Spatrick  let NumMicroOps = 2;
73909467b48Spatrick  let ResourceCycles = [1,1];
74009467b48Spatrick}
74109467b48Spatrickdef: InstRW<[BWWriteResGroup18], (instrs SFENCE)>;
74209467b48Spatrick
74309467b48Spatrickdef BWWriteResGroup20 : SchedWriteRes<[BWPort06,BWPort0156]> {
74409467b48Spatrick  let Latency = 2;
74509467b48Spatrick  let NumMicroOps = 2;
74609467b48Spatrick  let ResourceCycles = [1,1];
74709467b48Spatrick}
74809467b48Spatrickdef: InstRW<[BWWriteResGroup20], (instrs CWD,
74909467b48Spatrick                                         JCXZ, JECXZ, JRCXZ,
75009467b48Spatrick                                         ADC8i8, SBB8i8,
75109467b48Spatrick                                         ADC16i16, SBB16i16,
75209467b48Spatrick                                         ADC32i32, SBB32i32,
75309467b48Spatrick                                         ADC64i32, SBB64i32)>;
75409467b48Spatrick
75509467b48Spatrickdef BWWriteResGroup22 : SchedWriteRes<[BWPort4,BWPort6,BWPort237]> {
75609467b48Spatrick  let Latency = 2;
75709467b48Spatrick  let NumMicroOps = 3;
75809467b48Spatrick  let ResourceCycles = [1,1,1];
75909467b48Spatrick}
76009467b48Spatrickdef: InstRW<[BWWriteResGroup22], (instrs FNSTCW16m)>;
76109467b48Spatrick
76209467b48Spatrickdef BWWriteResGroup24 : SchedWriteRes<[BWPort4,BWPort237,BWPort15]> {
76309467b48Spatrick  let Latency = 2;
76409467b48Spatrick  let NumMicroOps = 3;
76509467b48Spatrick  let ResourceCycles = [1,1,1];
76609467b48Spatrick}
76709467b48Spatrickdef: InstRW<[BWWriteResGroup24], (instregex "MOVBE(16|32|64)mr")>;
76809467b48Spatrick
76909467b48Spatrickdef BWWriteResGroup25 : SchedWriteRes<[BWPort4,BWPort237,BWPort0156]> {
77009467b48Spatrick  let Latency = 2;
77109467b48Spatrick  let NumMicroOps = 3;
77209467b48Spatrick  let ResourceCycles = [1,1,1];
77309467b48Spatrick}
77409467b48Spatrickdef: InstRW<[BWWriteResGroup25], (instrs PUSH16r, PUSH32r, PUSH64r, PUSH64i8,
77509467b48Spatrick                                         STOSB, STOSL, STOSQ, STOSW)>;
77609467b48Spatrickdef: InstRW<[BWWriteResGroup25], (instregex "PUSH(16|32|64)rmr")>;
77709467b48Spatrick
77809467b48Spatrickdef BWWriteResGroup27 : SchedWriteRes<[BWPort1]> {
77909467b48Spatrick  let Latency = 3;
78009467b48Spatrick  let NumMicroOps = 1;
78109467b48Spatrick  let ResourceCycles = [1];
78209467b48Spatrick}
783*d415bd75Srobertdef: InstRW<[BWWriteResGroup27], (instregex "P(DEP|EXT)(32|64)rr")>;
78409467b48Spatrick
78509467b48Spatrickdef BWWriteResGroup28 : SchedWriteRes<[BWPort5]> {
78609467b48Spatrick  let Latency = 3;
78709467b48Spatrick  let NumMicroOps = 1;
78809467b48Spatrick  let ResourceCycles = [1];
78909467b48Spatrick}
79009467b48Spatrickdef: InstRW<[BWWriteResGroup28], (instrs VPBROADCASTBrr,
79109467b48Spatrick                                         VPBROADCASTWrr)>;
79209467b48Spatrick
79309467b48Spatrickdef BWWriteResGroup33 : SchedWriteRes<[BWPort5,BWPort0156]> {
79409467b48Spatrick  let Latency = 3;
79509467b48Spatrick  let NumMicroOps = 3;
79609467b48Spatrick  let ResourceCycles = [2,1];
79709467b48Spatrick}
798*d415bd75Srobertdef: InstRW<[BWWriteResGroup33], (instrs MMX_PACKSSDWrr,
799*d415bd75Srobert                                         MMX_PACKSSWBrr,
800*d415bd75Srobert                                         MMX_PACKUSWBrr)>;
80109467b48Spatrick
80209467b48Spatrickdef BWWriteResGroup34 : SchedWriteRes<[BWPort6,BWPort0156]> {
80309467b48Spatrick  let Latency = 3;
80409467b48Spatrick  let NumMicroOps = 3;
80509467b48Spatrick  let ResourceCycles = [1,2];
80609467b48Spatrick}
80709467b48Spatrickdef: InstRW<[BWWriteResGroup34], (instregex "CLD")>;
80809467b48Spatrick
80909467b48Spatrickdef BWWriteResGroup35 : SchedWriteRes<[BWPort06,BWPort0156]> {
810*d415bd75Srobert  let Latency = 2;
81109467b48Spatrick  let NumMicroOps = 3;
81209467b48Spatrick  let ResourceCycles = [1,2];
81309467b48Spatrick}
814*d415bd75Srobertdef: InstRW<[BWWriteResGroup35], (instrs RCL8r1, RCL16r1, RCL32r1, RCL64r1,
815*d415bd75Srobert                                         RCR8r1, RCR16r1, RCR32r1, RCR64r1)>;
816*d415bd75Srobert
817*d415bd75Srobertdef BWWriteResGroup36 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
818*d415bd75Srobert  let Latency = 5;
819*d415bd75Srobert  let NumMicroOps = 8;
820*d415bd75Srobert  let ResourceCycles = [2,4,2];
821*d415bd75Srobert}
822*d415bd75Srobertdef: InstRW<[BWWriteResGroup36], (instrs RCR8ri, RCR16ri, RCR32ri, RCR64ri)>;
823*d415bd75Srobert
824*d415bd75Srobertdef BWWriteResGroup36b : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
825*d415bd75Srobert  let Latency = 6;
826*d415bd75Srobert  let NumMicroOps = 8;
827*d415bd75Srobert  let ResourceCycles = [2,4,2];
828*d415bd75Srobert}
829*d415bd75Srobertdef: InstRW<[BWWriteResGroup36b], (instrs RCL8ri, RCL16ri, RCL32ri, RCL64ri)>;
83009467b48Spatrick
83109467b48Spatrickdef BWWriteResGroup37 : SchedWriteRes<[BWPort4,BWPort6,BWPort237,BWPort0156]> {
83209467b48Spatrick  let Latency = 3;
83309467b48Spatrick  let NumMicroOps = 4;
83409467b48Spatrick  let ResourceCycles = [1,1,1,1];
83509467b48Spatrick}
83609467b48Spatrickdef: InstRW<[BWWriteResGroup37], (instregex "CALL(16|32|64)r")>;
83709467b48Spatrick
83809467b48Spatrickdef BWWriteResGroup38 : SchedWriteRes<[BWPort4,BWPort237,BWPort06,BWPort0156]> {
83909467b48Spatrick  let Latency = 3;
84009467b48Spatrick  let NumMicroOps = 4;
84109467b48Spatrick  let ResourceCycles = [1,1,1,1];
84209467b48Spatrick}
84309467b48Spatrickdef: InstRW<[BWWriteResGroup38], (instrs CALL64pcrel32)>;
84409467b48Spatrick
84509467b48Spatrick
84609467b48Spatrickdef BWWriteResGroup41 : SchedWriteRes<[BWPort0,BWPort0156]> {
84709467b48Spatrick  let Latency = 4;
84809467b48Spatrick  let NumMicroOps = 2;
84909467b48Spatrick  let ResourceCycles = [1,1];
85009467b48Spatrick}
85109467b48Spatrickdef: InstRW<[BWWriteResGroup41], (instrs FNSTSW16r)>;
85209467b48Spatrick
85309467b48Spatrickdef BWWriteResGroup42 : SchedWriteRes<[BWPort1,BWPort5]> {
85409467b48Spatrick  let Latency = 4;
85509467b48Spatrick  let NumMicroOps = 2;
85609467b48Spatrick  let ResourceCycles = [1,1];
85709467b48Spatrick}
858*d415bd75Srobertdef: InstRW<[BWWriteResGroup42], (instregex "MMX_CVT(T?)PS2PIrr")>;
85909467b48Spatrick
86009467b48Spatrickdef BWWriteResGroup43 : SchedWriteRes<[BWPort0,BWPort4,BWPort237]> {
86109467b48Spatrick  let Latency = 4;
86209467b48Spatrick  let NumMicroOps = 3;
86309467b48Spatrick  let ResourceCycles = [1,1,1];
86409467b48Spatrick}
86509467b48Spatrickdef: InstRW<[BWWriteResGroup43], (instrs FNSTSWm)>;
86609467b48Spatrick
86709467b48Spatrickdef BWWriteResGroup44 : SchedWriteRes<[BWPort1,BWPort4,BWPort237]> {
86809467b48Spatrick  let Latency = 4;
86909467b48Spatrick  let NumMicroOps = 3;
87009467b48Spatrick  let ResourceCycles = [1,1,1];
87109467b48Spatrick}
87209467b48Spatrickdef: InstRW<[BWWriteResGroup44], (instregex "IST(T?)_FP(16|32|64)m",
87309467b48Spatrick                                            "IST_F(16|32)m")>;
87409467b48Spatrick
87509467b48Spatrickdef BWWriteResGroup45 : SchedWriteRes<[BWPort0156]> {
87609467b48Spatrick  let Latency = 4;
87709467b48Spatrick  let NumMicroOps = 4;
87809467b48Spatrick  let ResourceCycles = [4];
87909467b48Spatrick}
88009467b48Spatrickdef: InstRW<[BWWriteResGroup45], (instrs FNCLEX)>;
88109467b48Spatrick
88209467b48Spatrickdef BWWriteResGroup46 : SchedWriteRes<[]> {
88309467b48Spatrick  let Latency = 0;
88409467b48Spatrick  let NumMicroOps = 4;
88509467b48Spatrick  let ResourceCycles = [];
88609467b48Spatrick}
88709467b48Spatrickdef: InstRW<[BWWriteResGroup46], (instrs VZEROUPPER)>;
88809467b48Spatrick
88909467b48Spatrickdef BWWriteResGroup47 : SchedWriteRes<[BWPort0]> {
89009467b48Spatrick  let Latency = 5;
89109467b48Spatrick  let NumMicroOps = 1;
89209467b48Spatrick  let ResourceCycles = [1];
89309467b48Spatrick}
89409467b48Spatrickdef: InstRW<[BWWriteResGroup47], (instregex "MUL_(FPrST0|FST0r|FrST0)")>;
89509467b48Spatrick
89609467b48Spatrickdef BWWriteResGroup49 : SchedWriteRes<[BWPort23]> {
89709467b48Spatrick  let Latency = 5;
89809467b48Spatrick  let NumMicroOps = 1;
89909467b48Spatrick  let ResourceCycles = [1];
90009467b48Spatrick}
90109467b48Spatrickdef: InstRW<[BWWriteResGroup49], (instrs VBROADCASTSSrm,
90209467b48Spatrick                                         VMOVDDUPrm, MOVDDUPrm,
90309467b48Spatrick                                         VMOVSHDUPrm, MOVSHDUPrm,
90409467b48Spatrick                                         VMOVSLDUPrm, MOVSLDUPrm,
90509467b48Spatrick                                         VPBROADCASTDrm,
90609467b48Spatrick                                         VPBROADCASTQrm)>;
90709467b48Spatrick
90809467b48Spatrickdef BWWriteResGroup50 : SchedWriteRes<[BWPort1,BWPort5]> {
90909467b48Spatrick  let Latency = 5;
91009467b48Spatrick  let NumMicroOps = 3;
91109467b48Spatrick  let ResourceCycles = [1,2];
91209467b48Spatrick}
91309467b48Spatrickdef: InstRW<[BWWriteResGroup50], (instregex "(V?)CVTSI642SSrr")>;
91409467b48Spatrick
91509467b48Spatrickdef BWWriteResGroup51 : SchedWriteRes<[BWPort1,BWPort6,BWPort06]> {
91609467b48Spatrick  let Latency = 5;
91709467b48Spatrick  let NumMicroOps = 3;
91809467b48Spatrick  let ResourceCycles = [1,1,1];
91909467b48Spatrick}
92009467b48Spatrickdef: InstRW<[BWWriteResGroup51], (instregex "STR(16|32|64)r")>;
92109467b48Spatrick
92209467b48Spatrickdef BWWriteResGroup54 : SchedWriteRes<[BWPort6,BWPort0156]> {
92309467b48Spatrick  let Latency = 5;
92409467b48Spatrick  let NumMicroOps = 5;
92509467b48Spatrick  let ResourceCycles = [1,4];
92609467b48Spatrick}
92709467b48Spatrickdef: InstRW<[BWWriteResGroup54], (instrs PAUSE)>;
92809467b48Spatrick
92909467b48Spatrickdef BWWriteResGroup55 : SchedWriteRes<[BWPort06,BWPort0156]> {
93009467b48Spatrick  let Latency = 5;
93109467b48Spatrick  let NumMicroOps = 5;
93209467b48Spatrick  let ResourceCycles = [1,4];
93309467b48Spatrick}
93409467b48Spatrickdef: InstRW<[BWWriteResGroup55], (instrs XSETBV)>;
93509467b48Spatrick
93609467b48Spatrickdef BWWriteResGroup57 : SchedWriteRes<[BWPort4,BWPort237,BWPort0156]> {
93709467b48Spatrick  let Latency = 5;
93809467b48Spatrick  let NumMicroOps = 6;
93909467b48Spatrick  let ResourceCycles = [1,1,4];
94009467b48Spatrick}
94109467b48Spatrickdef: InstRW<[BWWriteResGroup57], (instregex "PUSHF(16|64)")>;
94209467b48Spatrick
94309467b48Spatrickdef BWWriteResGroup58 : SchedWriteRes<[BWPort23]> {
94409467b48Spatrick  let Latency = 6;
94509467b48Spatrick  let NumMicroOps = 1;
94609467b48Spatrick  let ResourceCycles = [1];
94709467b48Spatrick}
94809467b48Spatrickdef: InstRW<[BWWriteResGroup58], (instregex "LD_F(32|64|80)m")>;
94909467b48Spatrickdef: InstRW<[BWWriteResGroup58], (instrs VBROADCASTF128,
95009467b48Spatrick                                         VBROADCASTI128,
95109467b48Spatrick                                         VBROADCASTSDYrm,
95209467b48Spatrick                                         VBROADCASTSSYrm,
95309467b48Spatrick                                         VMOVDDUPYrm,
95409467b48Spatrick                                         VMOVSHDUPYrm,
95509467b48Spatrick                                         VMOVSLDUPYrm,
95609467b48Spatrick                                         VPBROADCASTDYrm,
95709467b48Spatrick                                         VPBROADCASTQYrm)>;
95809467b48Spatrick
95909467b48Spatrickdef BWWriteResGroup59 : SchedWriteRes<[BWPort0,BWPort23]> {
96009467b48Spatrick  let Latency = 6;
96109467b48Spatrick  let NumMicroOps = 2;
96209467b48Spatrick  let ResourceCycles = [1,1];
96309467b48Spatrick}
964*d415bd75Srobertdef: InstRW<[BWWriteResGroup59], (instrs VPSLLVQrm, VPSRLVQrm)>;
96509467b48Spatrick
96609467b48Spatrickdef BWWriteResGroup62 : SchedWriteRes<[BWPort6,BWPort23]> {
96709467b48Spatrick  let Latency = 6;
96809467b48Spatrick  let NumMicroOps = 2;
96909467b48Spatrick  let ResourceCycles = [1,1];
97009467b48Spatrick}
971097a140dSpatrickdef: InstRW<[BWWriteResGroup62], (instrs FARJMP64m)>;
97209467b48Spatrickdef: InstRW<[BWWriteResGroup62], (instregex "JMP(16|32|64)m")>;
97309467b48Spatrick
97409467b48Spatrickdef BWWriteResGroup64 : SchedWriteRes<[BWPort23,BWPort15]> {
97509467b48Spatrick  let Latency = 6;
97609467b48Spatrick  let NumMicroOps = 2;
97709467b48Spatrick  let ResourceCycles = [1,1];
97809467b48Spatrick}
97909467b48Spatrickdef: InstRW<[BWWriteResGroup64], (instregex "ANDN(32|64)rm",
98009467b48Spatrick                                            "MOVBE(16|32|64)rm")>;
98109467b48Spatrick
98209467b48Spatrickdef BWWriteResGroup65 : SchedWriteRes<[BWPort23,BWPort015]> {
98309467b48Spatrick  let Latency = 6;
98409467b48Spatrick  let NumMicroOps = 2;
98509467b48Spatrick  let ResourceCycles = [1,1];
98609467b48Spatrick}
98709467b48Spatrickdef: InstRW<[BWWriteResGroup65], (instrs VINSERTF128rm,
98809467b48Spatrick                                         VINSERTI128rm,
98909467b48Spatrick                                         VPBLENDDrmi)>;
99009467b48Spatrick
99109467b48Spatrickdef BWWriteResGroup66 : SchedWriteRes<[BWPort23,BWPort0156]> {
99209467b48Spatrick  let Latency = 6;
99309467b48Spatrick  let NumMicroOps = 2;
99409467b48Spatrick  let ResourceCycles = [1,1];
99509467b48Spatrick}
99609467b48Spatrickdef: InstRW<[BWWriteResGroup66], (instrs POP16r, POP32r, POP64r)>;
99709467b48Spatrickdef: InstRW<[BWWriteResGroup66], (instregex "POP(16|32|64)rmr")>;
99809467b48Spatrick
99909467b48Spatrickdef BWWriteResGroup68 : SchedWriteRes<[BWPort1,BWPort6,BWPort06,BWPort0156]> {
100009467b48Spatrick  let Latency = 6;
100109467b48Spatrick  let NumMicroOps = 4;
100209467b48Spatrick  let ResourceCycles = [1,1,1,1];
100309467b48Spatrick}
100409467b48Spatrickdef: InstRW<[BWWriteResGroup68], (instregex "SLDT(16|32|64)r")>;
100509467b48Spatrick
100609467b48Spatrickdef BWWriteResGroup69 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06]> {
100709467b48Spatrick  let Latency = 6;
100809467b48Spatrick  let NumMicroOps = 4;
100909467b48Spatrick  let ResourceCycles = [1,1,1,1];
101009467b48Spatrick}
101109467b48Spatrickdef: InstRW<[BWWriteResGroup69], (instregex "SAR(8|16|32|64)m(1|i)",
101209467b48Spatrick                                            "SHL(8|16|32|64)m(1|i)",
101309467b48Spatrick                                            "SHR(8|16|32|64)m(1|i)")>;
101409467b48Spatrick
101509467b48Spatrickdef BWWriteResGroup70 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
101609467b48Spatrick  let Latency = 6;
101709467b48Spatrick  let NumMicroOps = 4;
101809467b48Spatrick  let ResourceCycles = [1,1,1,1];
101909467b48Spatrick}
102009467b48Spatrickdef: InstRW<[BWWriteResGroup70], (instregex "POP(16|32|64)rmm",
102109467b48Spatrick                                            "PUSH(16|32|64)rmm")>;
102209467b48Spatrick
102309467b48Spatrickdef BWWriteResGroup71 : SchedWriteRes<[BWPort6,BWPort0156]> {
102409467b48Spatrick  let Latency = 6;
102509467b48Spatrick  let NumMicroOps = 6;
102609467b48Spatrick  let ResourceCycles = [1,5];
102709467b48Spatrick}
102809467b48Spatrickdef: InstRW<[BWWriteResGroup71], (instrs STD)>;
102909467b48Spatrick
103009467b48Spatrickdef BWWriteResGroup73 : SchedWriteRes<[BWPort0,BWPort23]> {
103109467b48Spatrick  let Latency = 7;
103209467b48Spatrick  let NumMicroOps = 2;
103309467b48Spatrick  let ResourceCycles = [1,1];
103409467b48Spatrick}
103509467b48Spatrickdef: InstRW<[BWWriteResGroup73], (instrs VPSLLVQYrm,
103609467b48Spatrick                                         VPSRLVQYrm)>;
103709467b48Spatrick
103809467b48Spatrickdef BWWriteResGroup74 : SchedWriteRes<[BWPort1,BWPort23]> {
103909467b48Spatrick  let Latency = 7;
104009467b48Spatrick  let NumMicroOps = 2;
104109467b48Spatrick  let ResourceCycles = [1,1];
104209467b48Spatrick}
104309467b48Spatrickdef: InstRW<[BWWriteResGroup74], (instregex "FCOM(P?)(32|64)m")>;
104409467b48Spatrick
104509467b48Spatrickdef BWWriteResGroup77 : SchedWriteRes<[BWPort23,BWPort015]> {
104609467b48Spatrick  let Latency = 7;
104709467b48Spatrick  let NumMicroOps = 2;
104809467b48Spatrick  let ResourceCycles = [1,1];
104909467b48Spatrick}
105009467b48Spatrickdef: InstRW<[BWWriteResGroup77], (instrs VPBLENDDYrmi)>;
105109467b48Spatrick
105209467b48Spatrickdef BWWriteResGroup79 : SchedWriteRes<[BWPort5,BWPort23]> {
105309467b48Spatrick  let Latency = 7;
105409467b48Spatrick  let NumMicroOps = 3;
105509467b48Spatrick  let ResourceCycles = [2,1];
105609467b48Spatrick}
1057*d415bd75Srobertdef: InstRW<[BWWriteResGroup79], (instrs MMX_PACKSSDWrm,
1058*d415bd75Srobert                                         MMX_PACKSSWBrm,
1059*d415bd75Srobert                                         MMX_PACKUSWBrm)>;
106009467b48Spatrick
106109467b48Spatrickdef BWWriteResGroup80 : SchedWriteRes<[BWPort23,BWPort0156]> {
106209467b48Spatrick  let Latency = 7;
106309467b48Spatrick  let NumMicroOps = 3;
106409467b48Spatrick  let ResourceCycles = [1,2];
106509467b48Spatrick}
106609467b48Spatrickdef: InstRW<[BWWriteResGroup80], (instrs LEAVE, LEAVE64,
106709467b48Spatrick                                         SCASB, SCASL, SCASQ, SCASW)>;
106809467b48Spatrick
106909467b48Spatrickdef BWWriteResGroup82 : SchedWriteRes<[BWPort0,BWPort01,BWPort23]> {
107009467b48Spatrick  let Latency = 7;
107109467b48Spatrick  let NumMicroOps = 3;
107209467b48Spatrick  let ResourceCycles = [1,1,1];
107309467b48Spatrick}
107409467b48Spatrickdef: InstRW<[BWWriteResGroup82], (instrs FLDCW16m)>;
107509467b48Spatrick
107609467b48Spatrickdef BWWriteResGroup84 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
107709467b48Spatrick  let Latency = 7;
107809467b48Spatrick  let NumMicroOps = 3;
107909467b48Spatrick  let ResourceCycles = [1,1,1];
108009467b48Spatrick}
1081*d415bd75Srobertdef: InstRW<[BWWriteResGroup84], (instrs LRET64, RET64)>;
108209467b48Spatrick
108309467b48Spatrickdef BWWriteResGroup87 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06]> {
108409467b48Spatrick  let Latency = 7;
108509467b48Spatrick  let NumMicroOps = 5;
108609467b48Spatrick  let ResourceCycles = [1,1,1,2];
108709467b48Spatrick}
108809467b48Spatrickdef: InstRW<[BWWriteResGroup87], (instregex "ROL(8|16|32|64)m(1|i)",
108909467b48Spatrick                                            "ROR(8|16|32|64)m(1|i)")>;
109009467b48Spatrick
109109467b48Spatrickdef BWWriteResGroup87_1 : SchedWriteRes<[BWPort06]> {
109209467b48Spatrick  let Latency = 2;
109309467b48Spatrick  let NumMicroOps = 2;
109409467b48Spatrick  let ResourceCycles = [2];
109509467b48Spatrick}
109609467b48Spatrickdef: InstRW<[BWWriteResGroup87_1], (instrs ROL8r1, ROL16r1, ROL32r1, ROL64r1,
109709467b48Spatrick                                           ROR8r1, ROR16r1, ROR32r1, ROR64r1)>;
109809467b48Spatrick
109909467b48Spatrickdef BWWriteResGroup88 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
110009467b48Spatrick  let Latency = 7;
110109467b48Spatrick  let NumMicroOps = 5;
110209467b48Spatrick  let ResourceCycles = [1,1,1,2];
110309467b48Spatrick}
110409467b48Spatrickdef: InstRW<[BWWriteResGroup88], (instregex "XADD(8|16|32|64)rm")>;
110509467b48Spatrick
110609467b48Spatrickdef BWWriteResGroup89 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
110709467b48Spatrick  let Latency = 7;
110809467b48Spatrick  let NumMicroOps = 5;
110909467b48Spatrick  let ResourceCycles = [1,1,1,1,1];
111009467b48Spatrick}
111109467b48Spatrickdef: InstRW<[BWWriteResGroup89], (instregex "CALL(16|32|64)m")>;
1112097a140dSpatrickdef: InstRW<[BWWriteResGroup89], (instrs FARCALL64m)>;
111309467b48Spatrick
111409467b48Spatrickdef BWWriteResGroup90 : SchedWriteRes<[BWPort6,BWPort06,BWPort15,BWPort0156]> {
111509467b48Spatrick  let Latency = 7;
111609467b48Spatrick  let NumMicroOps = 7;
111709467b48Spatrick  let ResourceCycles = [2,2,1,2];
111809467b48Spatrick}
111909467b48Spatrickdef: InstRW<[BWWriteResGroup90], (instrs LOOP)>;
112009467b48Spatrick
112109467b48Spatrickdef BWWriteResGroup91 : SchedWriteRes<[BWPort1,BWPort23]> {
112209467b48Spatrick  let Latency = 8;
112309467b48Spatrick  let NumMicroOps = 2;
112409467b48Spatrick  let ResourceCycles = [1,1];
112509467b48Spatrick}
112609467b48Spatrickdef: InstRW<[BWWriteResGroup91], (instregex "P(DEP|EXT)(32|64)rm")>;
112709467b48Spatrick
112809467b48Spatrickdef BWWriteResGroup92 : SchedWriteRes<[BWPort5,BWPort23]> {
112909467b48Spatrick  let Latency = 8;
113009467b48Spatrick  let NumMicroOps = 2;
113109467b48Spatrick  let ResourceCycles = [1,1];
113209467b48Spatrick}
113309467b48Spatrickdef: InstRW<[BWWriteResGroup92], (instrs VPMOVSXBDYrm,
113409467b48Spatrick                                         VPMOVSXBQYrm,
113509467b48Spatrick                                         VPMOVSXBWYrm,
113609467b48Spatrick                                         VPMOVSXDQYrm,
113709467b48Spatrick                                         VPMOVSXWDYrm,
113809467b48Spatrick                                         VPMOVSXWQYrm,
113909467b48Spatrick                                         VPMOVZXWDYrm)>;
114009467b48Spatrick
114109467b48Spatrickdef BWWriteResGroup97 : SchedWriteRes<[BWPort23,BWPort237,BWPort06,BWPort0156]> {
114209467b48Spatrick  let Latency = 8;
114309467b48Spatrick  let NumMicroOps = 5;
114409467b48Spatrick  let ResourceCycles = [1,1,1,2];
114509467b48Spatrick}
114609467b48Spatrickdef: InstRW<[BWWriteResGroup97], (instregex "RCL(8|16|32|64)m(1|i)",
114709467b48Spatrick                                            "RCR(8|16|32|64)m(1|i)")>;
114809467b48Spatrick
114909467b48Spatrickdef BWWriteResGroup99 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
115009467b48Spatrick  let Latency = 8;
115109467b48Spatrick  let NumMicroOps = 6;
115209467b48Spatrick  let ResourceCycles = [1,1,1,3];
115309467b48Spatrick}
115409467b48Spatrickdef: InstRW<[BWWriteResGroup99], (instregex "XCHG(8|16|32|64)rm")>;
115509467b48Spatrick
115609467b48Spatrickdef BWWriteResGroup100 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06,BWPort0156]> {
115709467b48Spatrick  let Latency = 8;
115809467b48Spatrick  let NumMicroOps = 6;
115909467b48Spatrick  let ResourceCycles = [1,1,1,2,1];
116009467b48Spatrick}
116109467b48Spatrickdef : SchedAlias<WriteADCRMW, BWWriteResGroup100>;
116209467b48Spatrickdef: InstRW<[BWWriteResGroup100], (instregex "ROL(8|16|32|64)mCL",
116309467b48Spatrick                                             "ROR(8|16|32|64)mCL",
116409467b48Spatrick                                             "SAR(8|16|32|64)mCL",
116509467b48Spatrick                                             "SHL(8|16|32|64)mCL",
116609467b48Spatrick                                             "SHR(8|16|32|64)mCL")>;
116709467b48Spatrick
116809467b48Spatrickdef BWWriteResGroup101 : SchedWriteRes<[BWPort1,BWPort23]> {
116909467b48Spatrick  let Latency = 9;
117009467b48Spatrick  let NumMicroOps = 2;
117109467b48Spatrick  let ResourceCycles = [1,1];
117209467b48Spatrick}
117309467b48Spatrickdef: InstRW<[BWWriteResGroup101], (instregex "(ADD|SUB|SUBR)_F(32|64)m",
117409467b48Spatrick                                             "ILD_F(16|32|64)m")>;
117509467b48Spatrick
117609467b48Spatrickdef BWWriteResGroup108 : SchedWriteRes<[BWPort5,BWPort23,BWPort015]> {
117709467b48Spatrick  let Latency = 9;
117809467b48Spatrick  let NumMicroOps = 3;
117909467b48Spatrick  let ResourceCycles = [1,1,1];
118009467b48Spatrick}
118109467b48Spatrickdef: InstRW<[BWWriteResGroup108], (instregex "VPBROADCASTB(Y?)rm",
118209467b48Spatrick                                             "VPBROADCASTW(Y?)rm")>;
118309467b48Spatrick
118409467b48Spatrickdef BWWriteResGroup112 : SchedWriteRes<[BWPort23,BWPort06,BWPort0156]> {
118509467b48Spatrick  let Latency = 9;
118609467b48Spatrick  let NumMicroOps = 5;
118709467b48Spatrick  let ResourceCycles = [1,1,3];
118809467b48Spatrick}
118909467b48Spatrickdef: InstRW<[BWWriteResGroup112], (instrs RDRAND16r, RDRAND32r, RDRAND64r)>;
119009467b48Spatrick
119109467b48Spatrickdef BWWriteResGroup113 : SchedWriteRes<[BWPort1,BWPort6,BWPort23,BWPort0156]> {
119209467b48Spatrick  let Latency = 9;
119309467b48Spatrick  let NumMicroOps = 5;
119409467b48Spatrick  let ResourceCycles = [1,2,1,1];
119509467b48Spatrick}
119609467b48Spatrickdef: InstRW<[BWWriteResGroup113], (instregex "LAR(16|32|64)rm",
119709467b48Spatrick                                             "LSL(16|32|64)rm")>;
119809467b48Spatrick
119909467b48Spatrickdef BWWriteResGroup115 : SchedWriteRes<[BWPort0,BWPort23]> {
120009467b48Spatrick  let Latency = 10;
120109467b48Spatrick  let NumMicroOps = 2;
120209467b48Spatrick  let ResourceCycles = [1,1];
120309467b48Spatrick}
120409467b48Spatrickdef: InstRW<[BWWriteResGroup115], (instregex "(V?)PCMPGTQrm")>;
120509467b48Spatrick
120609467b48Spatrickdef BWWriteResGroup117 : SchedWriteRes<[BWPort1,BWPort23]> {
120709467b48Spatrick  let Latency = 10;
120809467b48Spatrick  let NumMicroOps = 3;
120909467b48Spatrick  let ResourceCycles = [2,1];
121009467b48Spatrick}
121109467b48Spatrickdef: InstRW<[BWWriteResGroup117], (instregex "FICOM(P?)(16|32)m")>;
121209467b48Spatrick
121309467b48Spatrickdef BWWriteResGroup122_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
121409467b48Spatrick  let Latency = 11;
121509467b48Spatrick  let NumMicroOps = 1;
121609467b48Spatrick  let ResourceCycles = [1,3]; // Really 2.5 cycle throughput
121709467b48Spatrick}
121809467b48Spatrickdef : SchedAlias<WriteFDiv, BWWriteResGroup122_1>; // TODO - convert to ZnWriteResFpuPair
121909467b48Spatrick
122009467b48Spatrickdef BWWriteResGroup123 : SchedWriteRes<[BWPort0,BWPort23]> {
122109467b48Spatrick  let Latency = 11;
122209467b48Spatrick  let NumMicroOps = 2;
122309467b48Spatrick  let ResourceCycles = [1,1];
122409467b48Spatrick}
122509467b48Spatrickdef: InstRW<[BWWriteResGroup123], (instregex "MUL_F(32|64)m")>;
122609467b48Spatrickdef: InstRW<[BWWriteResGroup123], (instrs VPCMPGTQYrm)>;
122709467b48Spatrick
122809467b48Spatrickdef BWWriteResGroup131 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
122909467b48Spatrick  let Latency = 11;
123009467b48Spatrick  let NumMicroOps = 7;
123109467b48Spatrick  let ResourceCycles = [2,2,3];
123209467b48Spatrick}
123309467b48Spatrickdef: InstRW<[BWWriteResGroup131], (instregex "RCL(16|32|64)rCL",
123409467b48Spatrick                                             "RCR(16|32|64)rCL")>;
123509467b48Spatrick
123609467b48Spatrickdef BWWriteResGroup132 : SchedWriteRes<[BWPort1,BWPort06,BWPort15,BWPort0156]> {
123709467b48Spatrick  let Latency = 11;
123809467b48Spatrick  let NumMicroOps = 9;
123909467b48Spatrick  let ResourceCycles = [1,4,1,3];
124009467b48Spatrick}
124109467b48Spatrickdef: InstRW<[BWWriteResGroup132], (instrs RCL8rCL)>;
124209467b48Spatrick
124309467b48Spatrickdef BWWriteResGroup133 : SchedWriteRes<[BWPort06,BWPort0156]> {
124409467b48Spatrick  let Latency = 11;
124509467b48Spatrick  let NumMicroOps = 11;
124609467b48Spatrick  let ResourceCycles = [2,9];
124709467b48Spatrick}
124809467b48Spatrickdef: InstRW<[BWWriteResGroup133], (instrs LOOPE)>;
124909467b48Spatrickdef: InstRW<[BWWriteResGroup133], (instrs LOOPNE)>;
125009467b48Spatrick
125109467b48Spatrickdef BWWriteResGroup135 : SchedWriteRes<[BWPort1,BWPort23]> {
125209467b48Spatrick  let Latency = 12;
125309467b48Spatrick  let NumMicroOps = 3;
125409467b48Spatrick  let ResourceCycles = [2,1];
125509467b48Spatrick}
125609467b48Spatrickdef: InstRW<[BWWriteResGroup135], (instregex "(ADD|SUB|SUBR)_FI(16|32)m")>;
125709467b48Spatrick
125809467b48Spatrickdef BWWriteResGroup139_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
125909467b48Spatrick  let Latency = 14;
126009467b48Spatrick  let NumMicroOps = 1;
126109467b48Spatrick  let ResourceCycles = [1,4];
126209467b48Spatrick}
126309467b48Spatrickdef : SchedAlias<WriteFDiv64, BWWriteResGroup139_1>; // TODO - convert to ZnWriteResFpuPair
126409467b48Spatrick
126509467b48Spatrickdef BWWriteResGroup141 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
126609467b48Spatrick  let Latency = 14;
126709467b48Spatrick  let NumMicroOps = 3;
126809467b48Spatrick  let ResourceCycles = [1,1,1];
126909467b48Spatrick}
127009467b48Spatrickdef: InstRW<[BWWriteResGroup141], (instregex "MUL_FI(16|32)m")>;
127109467b48Spatrick
127209467b48Spatrickdef BWWriteResGroup144 : SchedWriteRes<[BWPort1,BWPort6,BWPort23,BWPort0156]> {
127309467b48Spatrick  let Latency = 14;
127409467b48Spatrick  let NumMicroOps = 8;
127509467b48Spatrick  let ResourceCycles = [2,2,1,3];
127609467b48Spatrick}
127709467b48Spatrickdef: InstRW<[BWWriteResGroup144], (instregex "LAR(16|32|64)rr")>;
127809467b48Spatrick
127909467b48Spatrickdef BWWriteResGroup145 : SchedWriteRes<[BWPort1,BWPort06,BWPort15,BWPort0156]> {
128009467b48Spatrick  let Latency = 14;
128109467b48Spatrick  let NumMicroOps = 10;
128209467b48Spatrick  let ResourceCycles = [2,3,1,4];
128309467b48Spatrick}
128409467b48Spatrickdef: InstRW<[BWWriteResGroup145], (instrs RCR8rCL)>;
128509467b48Spatrick
128609467b48Spatrickdef BWWriteResGroup146 : SchedWriteRes<[BWPort0,BWPort1,BWPort6,BWPort0156]> {
128709467b48Spatrick  let Latency = 14;
128809467b48Spatrick  let NumMicroOps = 12;
128909467b48Spatrick  let ResourceCycles = [2,1,4,5];
129009467b48Spatrick}
129109467b48Spatrickdef: InstRW<[BWWriteResGroup146], (instrs XCH_F)>;
129209467b48Spatrick
129309467b48Spatrickdef BWWriteResGroup147 : SchedWriteRes<[BWPort0]> {
129409467b48Spatrick  let Latency = 15;
129509467b48Spatrick  let NumMicroOps = 1;
129609467b48Spatrick  let ResourceCycles = [1];
129709467b48Spatrick}
129809467b48Spatrickdef: InstRW<[BWWriteResGroup147], (instregex "DIVR_(FPrST0|FST0r|FrST0)")>;
129909467b48Spatrick
130009467b48Spatrickdef BWWriteResGroup149 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
130109467b48Spatrick  let Latency = 15;
130209467b48Spatrick  let NumMicroOps = 10;
130309467b48Spatrick  let ResourceCycles = [1,1,1,4,1,2];
130409467b48Spatrick}
130509467b48Spatrickdef: InstRW<[BWWriteResGroup149], (instregex "RCL(8|16|32|64)mCL")>;
130609467b48Spatrick
130709467b48Spatrickdef BWWriteResGroup150 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
130809467b48Spatrick  let Latency = 16;
130909467b48Spatrick  let NumMicroOps = 2;
131009467b48Spatrick  let ResourceCycles = [1,1,5];
131109467b48Spatrick}
131209467b48Spatrickdef : SchedAlias<WriteFDivLd, BWWriteResGroup150>; // TODO - convert to ZnWriteResFpuPair
131309467b48Spatrick
131409467b48Spatrickdef BWWriteResGroup153 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
131509467b48Spatrick  let Latency = 16;
131609467b48Spatrick  let NumMicroOps = 14;
131709467b48Spatrick  let ResourceCycles = [1,1,1,4,2,5];
131809467b48Spatrick}
131909467b48Spatrickdef: InstRW<[BWWriteResGroup153], (instrs CMPXCHG8B)>;
132009467b48Spatrick
132109467b48Spatrickdef BWWriteResGroup154 : SchedWriteRes<[BWPort5,BWPort6]> {
132209467b48Spatrick  let Latency = 8;
132309467b48Spatrick  let NumMicroOps = 20;
132409467b48Spatrick  let ResourceCycles = [1,1];
132509467b48Spatrick}
132609467b48Spatrickdef: InstRW<[BWWriteResGroup154], (instrs VZEROALL)>;
132709467b48Spatrick
132809467b48Spatrickdef BWWriteResGroup159 : SchedWriteRes<[BWPort5,BWPort6,BWPort06,BWPort0156]> {
132909467b48Spatrick  let Latency = 18;
133009467b48Spatrick  let NumMicroOps = 8;
133109467b48Spatrick  let ResourceCycles = [1,1,1,5];
133209467b48Spatrick}
133309467b48Spatrickdef: InstRW<[BWWriteResGroup159], (instrs CPUID)>;
133409467b48Spatrickdef: InstRW<[BWWriteResGroup159], (instrs RDTSC)>;
133509467b48Spatrick
133609467b48Spatrickdef BWWriteResGroup160 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
133709467b48Spatrick  let Latency = 18;
133809467b48Spatrick  let NumMicroOps = 11;
133909467b48Spatrick  let ResourceCycles = [2,1,1,3,1,3];
134009467b48Spatrick}
134109467b48Spatrickdef: InstRW<[BWWriteResGroup160], (instregex "RCR(8|16|32|64)mCL")>;
134209467b48Spatrick
134309467b48Spatrickdef BWWriteResGroup161 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
134409467b48Spatrick  let Latency = 19;
134509467b48Spatrick  let NumMicroOps = 2;
134609467b48Spatrick  let ResourceCycles = [1,1,8];
134709467b48Spatrick}
134809467b48Spatrickdef : SchedAlias<WriteFDiv64Ld, BWWriteResGroup161>; // TODO - convert to ZnWriteResFpuPair
134909467b48Spatrick
135009467b48Spatrickdef BWWriteResGroup165 : SchedWriteRes<[BWPort0]> {
135109467b48Spatrick  let Latency = 20;
135209467b48Spatrick  let NumMicroOps = 1;
135309467b48Spatrick  let ResourceCycles = [1];
135409467b48Spatrick}
135509467b48Spatrickdef: InstRW<[BWWriteResGroup165], (instregex "DIV_(FPrST0|FST0r|FrST0)")>;
135609467b48Spatrick
135709467b48Spatrickdef BWWriteResGroup167 : SchedWriteRes<[BWPort4,BWPort5,BWPort6,BWPort23,BWPort237,BWPort06,BWPort0156]> {
135809467b48Spatrick  let Latency = 20;
135909467b48Spatrick  let NumMicroOps = 8;
136009467b48Spatrick  let ResourceCycles = [1,1,1,1,1,1,2];
136109467b48Spatrick}
136209467b48Spatrickdef: InstRW<[BWWriteResGroup167], (instrs INSB, INSL, INSW)>;
136309467b48Spatrick
136409467b48Spatrickdef BWWriteResGroup169 : SchedWriteRes<[BWPort0,BWPort23]> {
136509467b48Spatrick  let Latency = 21;
136609467b48Spatrick  let NumMicroOps = 2;
136709467b48Spatrick  let ResourceCycles = [1,1];
136809467b48Spatrick}
136909467b48Spatrickdef: InstRW<[BWWriteResGroup169], (instregex "DIV_F(32|64)m")>;
137009467b48Spatrick
137109467b48Spatrickdef BWWriteResGroup171 : SchedWriteRes<[BWPort0,BWPort4,BWPort5,BWPort23,BWPort237,BWPort06,BWPort0156]> {
137209467b48Spatrick  let Latency = 21;
137309467b48Spatrick  let NumMicroOps = 19;
137409467b48Spatrick  let ResourceCycles = [2,1,4,1,1,4,6];
137509467b48Spatrick}
137609467b48Spatrickdef: InstRW<[BWWriteResGroup171], (instrs CMPXCHG16B)>;
137709467b48Spatrick
137809467b48Spatrickdef BWWriteResGroup172 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
137909467b48Spatrick  let Latency = 22;
138009467b48Spatrick  let NumMicroOps = 18;
138109467b48Spatrick  let ResourceCycles = [1,1,16];
138209467b48Spatrick}
138309467b48Spatrickdef: InstRW<[BWWriteResGroup172], (instrs POPF64)>;
138409467b48Spatrick
138509467b48Spatrickdef BWWriteResGroup176 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
138609467b48Spatrick  let Latency = 23;
138709467b48Spatrick  let NumMicroOps = 19;
138809467b48Spatrick  let ResourceCycles = [3,1,15];
138909467b48Spatrick}
139009467b48Spatrickdef: InstRW<[BWWriteResGroup176], (instregex "XRSTOR(64)?")>;
139109467b48Spatrick
139209467b48Spatrickdef BWWriteResGroup177 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
139309467b48Spatrick  let Latency = 24;
139409467b48Spatrick  let NumMicroOps = 3;
139509467b48Spatrick  let ResourceCycles = [1,1,1];
139609467b48Spatrick}
139709467b48Spatrickdef: InstRW<[BWWriteResGroup177], (instregex "DIV_FI(16|32)m")>;
139809467b48Spatrick
139909467b48Spatrickdef BWWriteResGroup180 : SchedWriteRes<[BWPort0,BWPort23]> {
140009467b48Spatrick  let Latency = 26;
140109467b48Spatrick  let NumMicroOps = 2;
140209467b48Spatrick  let ResourceCycles = [1,1];
140309467b48Spatrick}
140409467b48Spatrickdef: InstRW<[BWWriteResGroup180], (instregex "DIVR_F(32|64)m")>;
140509467b48Spatrick
140609467b48Spatrickdef BWWriteResGroup182 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
140709467b48Spatrick  let Latency = 29;
140809467b48Spatrick  let NumMicroOps = 3;
140909467b48Spatrick  let ResourceCycles = [1,1,1];
141009467b48Spatrick}
141109467b48Spatrickdef: InstRW<[BWWriteResGroup182], (instregex "DIVR_FI(16|32)m")>;
141209467b48Spatrick
141309467b48Spatrickdef BWWriteResGroup183_1 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1414097a140dSpatrick  let Latency = 17;
141509467b48Spatrick  let NumMicroOps = 7;
141609467b48Spatrick  let ResourceCycles = [1,3,2,1];
141709467b48Spatrick}
1418097a140dSpatrickdef: InstRW<[BWWriteResGroup183_1], (instrs VGATHERDPDrm, VPGATHERDQrm,
1419097a140dSpatrick                                            VGATHERQPDrm, VPGATHERQQrm)>;
142009467b48Spatrick
142109467b48Spatrickdef BWWriteResGroup183_2 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1422097a140dSpatrick  let Latency = 18;
142309467b48Spatrick  let NumMicroOps = 9;
142409467b48Spatrick  let ResourceCycles = [1,3,4,1];
142509467b48Spatrick}
1426097a140dSpatrickdef: InstRW<[BWWriteResGroup183_2], (instrs VGATHERDPDYrm, VPGATHERDQYrm,
1427097a140dSpatrick                                            VGATHERQPDYrm, VPGATHERQQYrm)>;
142809467b48Spatrick
142909467b48Spatrickdef BWWriteResGroup183_3 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1430097a140dSpatrick  let Latency = 19;
143109467b48Spatrick  let NumMicroOps = 9;
143209467b48Spatrick  let ResourceCycles = [1,5,2,1];
143309467b48Spatrick}
1434097a140dSpatrickdef: InstRW<[BWWriteResGroup183_3], (instrs VGATHERQPSrm, VPGATHERQDrm)>;
143509467b48Spatrick
143609467b48Spatrickdef BWWriteResGroup183_4 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1437097a140dSpatrick  let Latency = 19;
1438097a140dSpatrick  let NumMicroOps = 10;
1439097a140dSpatrick  let ResourceCycles = [1,4,4,1];
144009467b48Spatrick}
1441097a140dSpatrickdef: InstRW<[BWWriteResGroup183_4], (instrs VGATHERDPSrm, VPGATHERDDrm,
1442097a140dSpatrick                                            VGATHERQPSYrm, VPGATHERQDYrm)>;
144309467b48Spatrick
144409467b48Spatrickdef BWWriteResGroup183_5 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1445097a140dSpatrick  let Latency = 21;
144609467b48Spatrick  let NumMicroOps = 14;
144709467b48Spatrick  let ResourceCycles = [1,4,8,1];
144809467b48Spatrick}
1449097a140dSpatrickdef: InstRW<[BWWriteResGroup183_5], (instrs VGATHERDPSYrm, VPGATHERDDYrm)>;
145009467b48Spatrick
145109467b48Spatrickdef BWWriteResGroup185 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
145209467b48Spatrick  let Latency = 29;
145309467b48Spatrick  let NumMicroOps = 27;
145409467b48Spatrick  let ResourceCycles = [1,5,1,1,19];
145509467b48Spatrick}
145609467b48Spatrickdef: InstRW<[BWWriteResGroup185], (instrs XSAVE64)>;
145709467b48Spatrick
145809467b48Spatrickdef BWWriteResGroup186 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
145909467b48Spatrick  let Latency = 30;
146009467b48Spatrick  let NumMicroOps = 28;
146109467b48Spatrick  let ResourceCycles = [1,6,1,1,19];
146209467b48Spatrick}
146309467b48Spatrickdef: InstRW<[BWWriteResGroup186], (instrs XSAVE)>;
146409467b48Spatrickdef: InstRW<[BWWriteResGroup186], (instregex "XSAVEC", "XSAVES", "XSAVEOPT")>;
146509467b48Spatrick
146609467b48Spatrickdef BWWriteResGroup191 : SchedWriteRes<[BWPort5,BWPort6,BWPort23,BWPort06,BWPort0156]> {
146709467b48Spatrick  let Latency = 34;
146809467b48Spatrick  let NumMicroOps = 23;
146909467b48Spatrick  let ResourceCycles = [1,5,3,4,10];
147009467b48Spatrick}
147109467b48Spatrickdef: InstRW<[BWWriteResGroup191], (instregex "IN(8|16|32)ri",
147209467b48Spatrick                                             "IN(8|16|32)rr")>;
147309467b48Spatrick
147409467b48Spatrickdef BWWriteResGroup194 : SchedWriteRes<[BWPort5,BWPort6,BWPort23,BWPort237,BWPort06,BWPort0156]> {
147509467b48Spatrick  let Latency = 35;
147609467b48Spatrick  let NumMicroOps = 23;
147709467b48Spatrick  let ResourceCycles = [1,5,2,1,4,10];
147809467b48Spatrick}
147909467b48Spatrickdef: InstRW<[BWWriteResGroup194], (instregex "OUT(8|16|32)ir",
148009467b48Spatrick                                             "OUT(8|16|32)rr")>;
148109467b48Spatrick
148209467b48Spatrickdef BWWriteResGroup196 : SchedWriteRes<[BWPort5,BWPort0156]> {
148309467b48Spatrick  let Latency = 42;
148409467b48Spatrick  let NumMicroOps = 22;
148509467b48Spatrick  let ResourceCycles = [2,20];
148609467b48Spatrick}
148709467b48Spatrickdef: InstRW<[BWWriteResGroup196], (instrs RDTSCP)>;
148809467b48Spatrick
148909467b48Spatrickdef BWWriteResGroup197 : SchedWriteRes<[BWPort0,BWPort01,BWPort23,BWPort05,BWPort06,BWPort015,BWPort0156]> {
149009467b48Spatrick  let Latency = 60;
149109467b48Spatrick  let NumMicroOps = 64;
149209467b48Spatrick  let ResourceCycles = [2,2,8,1,10,2,39];
149309467b48Spatrick}
149409467b48Spatrickdef: InstRW<[BWWriteResGroup197], (instrs FLDENVm)>;
149509467b48Spatrick
149609467b48Spatrickdef BWWriteResGroup198 : SchedWriteRes<[BWPort0,BWPort6,BWPort23,BWPort05,BWPort06,BWPort15,BWPort0156]> {
149709467b48Spatrick  let Latency = 63;
149809467b48Spatrick  let NumMicroOps = 88;
149909467b48Spatrick  let ResourceCycles = [4,4,31,1,2,1,45];
150009467b48Spatrick}
150109467b48Spatrickdef: InstRW<[BWWriteResGroup198], (instrs FXRSTOR64)>;
150209467b48Spatrick
150309467b48Spatrickdef BWWriteResGroup199 : SchedWriteRes<[BWPort0,BWPort6,BWPort23,BWPort05,BWPort06,BWPort15,BWPort0156]> {
150409467b48Spatrick  let Latency = 63;
150509467b48Spatrick  let NumMicroOps = 90;
150609467b48Spatrick  let ResourceCycles = [4,2,33,1,2,1,47];
150709467b48Spatrick}
150809467b48Spatrickdef: InstRW<[BWWriteResGroup199], (instrs FXRSTOR)>;
150909467b48Spatrick
151009467b48Spatrickdef BWWriteResGroup200 : SchedWriteRes<[BWPort5,BWPort01,BWPort0156]> {
151109467b48Spatrick  let Latency = 75;
151209467b48Spatrick  let NumMicroOps = 15;
151309467b48Spatrick  let ResourceCycles = [6,3,6];
151409467b48Spatrick}
151509467b48Spatrickdef: InstRW<[BWWriteResGroup200], (instrs FNINIT)>;
151609467b48Spatrick
151709467b48Spatrickdef BWWriteResGroup202 : SchedWriteRes<[BWPort0,BWPort1,BWPort4,BWPort5,BWPort6,BWPort237,BWPort06,BWPort0156]> {
151809467b48Spatrick  let Latency = 115;
151909467b48Spatrick  let NumMicroOps = 100;
152009467b48Spatrick  let ResourceCycles = [9,9,11,8,1,11,21,30];
152109467b48Spatrick}
152209467b48Spatrickdef: InstRW<[BWWriteResGroup202], (instrs FSTENVm)>;
152309467b48Spatrick
152409467b48Spatrickdef: InstRW<[WriteZero], (instrs CLC)>;
152509467b48Spatrick
152609467b48Spatrick
1527097a140dSpatrick// Instruction variants handled by the renamer. These might not need execution
152809467b48Spatrick// ports in certain conditions.
152909467b48Spatrick// See Agner's Fog "The microarchitecture of Intel, AMD and VIA CPUs",
153009467b48Spatrick// section "Haswell and Broadwell Pipeline" > "Register allocation and
153109467b48Spatrick// renaming".
153209467b48Spatrick// These can be investigated with llvm-exegesis, e.g.
153309467b48Spatrick// echo 'pxor %mm0, %mm0' | /tmp/llvm-exegesis -mode=uops -snippets-file=-
153409467b48Spatrick// echo 'vxorpd %xmm0, %xmm0, %xmm1' | /tmp/llvm-exegesis -mode=uops -snippets-file=-
153509467b48Spatrick
153609467b48Spatrickdef BWWriteZeroLatency : SchedWriteRes<[]> {
153709467b48Spatrick  let Latency = 0;
153809467b48Spatrick}
153909467b48Spatrick
154009467b48Spatrickdef BWWriteZeroIdiom : SchedWriteVariant<[
154109467b48Spatrick    SchedVar<MCSchedPredicate<ZeroIdiomPredicate>, [BWWriteZeroLatency]>,
154209467b48Spatrick    SchedVar<NoSchedPred,                          [WriteALU]>
154309467b48Spatrick]>;
154409467b48Spatrickdef : InstRW<[BWWriteZeroIdiom], (instrs SUB32rr, SUB64rr,
154509467b48Spatrick                                         XOR32rr, XOR64rr)>;
154609467b48Spatrick
154709467b48Spatrickdef BWWriteFZeroIdiom : SchedWriteVariant<[
154809467b48Spatrick    SchedVar<MCSchedPredicate<ZeroIdiomPredicate>, [BWWriteZeroLatency]>,
154909467b48Spatrick    SchedVar<NoSchedPred,                          [WriteFLogic]>
155009467b48Spatrick]>;
155109467b48Spatrickdef : InstRW<[BWWriteFZeroIdiom], (instrs XORPSrr, VXORPSrr, XORPDrr,
155209467b48Spatrick                                          VXORPDrr)>;
155309467b48Spatrick
155409467b48Spatrickdef BWWriteFZeroIdiomY : SchedWriteVariant<[
155509467b48Spatrick    SchedVar<MCSchedPredicate<ZeroIdiomPredicate>, [BWWriteZeroLatency]>,
155609467b48Spatrick    SchedVar<NoSchedPred,                          [WriteFLogicY]>
155709467b48Spatrick]>;
155809467b48Spatrickdef : InstRW<[BWWriteFZeroIdiomY], (instrs VXORPSYrr, VXORPDYrr)>;
155909467b48Spatrick
156009467b48Spatrickdef BWWriteVZeroIdiomLogicX : SchedWriteVariant<[
156109467b48Spatrick    SchedVar<MCSchedPredicate<ZeroIdiomPredicate>, [BWWriteZeroLatency]>,
156209467b48Spatrick    SchedVar<NoSchedPred,                          [WriteVecLogicX]>
156309467b48Spatrick]>;
156409467b48Spatrickdef : InstRW<[BWWriteVZeroIdiomLogicX], (instrs PXORrr, VPXORrr)>;
156509467b48Spatrick
156609467b48Spatrickdef BWWriteVZeroIdiomLogicY : SchedWriteVariant<[
156709467b48Spatrick    SchedVar<MCSchedPredicate<ZeroIdiomPredicate>, [BWWriteZeroLatency]>,
156809467b48Spatrick    SchedVar<NoSchedPred,                          [WriteVecLogicY]>
156909467b48Spatrick]>;
157009467b48Spatrickdef : InstRW<[BWWriteVZeroIdiomLogicY], (instrs VPXORYrr)>;
157109467b48Spatrick
157209467b48Spatrickdef BWWriteVZeroIdiomALUX : SchedWriteVariant<[
157309467b48Spatrick    SchedVar<MCSchedPredicate<ZeroIdiomPredicate>, [BWWriteZeroLatency]>,
157409467b48Spatrick    SchedVar<NoSchedPred,                          [WriteVecALUX]>
157509467b48Spatrick]>;
157609467b48Spatrickdef : InstRW<[BWWriteVZeroIdiomALUX], (instrs PSUBBrr, VPSUBBrr,
157709467b48Spatrick                                              PSUBDrr, VPSUBDrr,
157809467b48Spatrick                                              PSUBQrr, VPSUBQrr,
157909467b48Spatrick                                              PSUBWrr, VPSUBWrr,
158009467b48Spatrick                                              PCMPGTBrr, VPCMPGTBrr,
158109467b48Spatrick                                              PCMPGTDrr, VPCMPGTDrr,
158209467b48Spatrick                                              PCMPGTWrr, VPCMPGTWrr)>;
158309467b48Spatrick
158409467b48Spatrickdef BWWriteVZeroIdiomALUY : SchedWriteVariant<[
158509467b48Spatrick    SchedVar<MCSchedPredicate<ZeroIdiomPredicate>, [BWWriteZeroLatency]>,
158609467b48Spatrick    SchedVar<NoSchedPred,                          [WriteVecALUY]>
158709467b48Spatrick]>;
158809467b48Spatrickdef : InstRW<[BWWriteVZeroIdiomALUY], (instrs VPSUBBYrr,
158909467b48Spatrick                                              VPSUBDYrr,
159009467b48Spatrick                                              VPSUBQYrr,
159109467b48Spatrick                                              VPSUBWYrr,
159209467b48Spatrick                                              VPCMPGTBYrr,
159309467b48Spatrick                                              VPCMPGTDYrr,
159409467b48Spatrick                                              VPCMPGTWYrr)>;
159509467b48Spatrick
159609467b48Spatrickdef BWWritePCMPGTQ : SchedWriteRes<[BWPort0]> {
159709467b48Spatrick  let Latency = 5;
159809467b48Spatrick  let NumMicroOps = 1;
159909467b48Spatrick  let ResourceCycles = [1];
160009467b48Spatrick}
160109467b48Spatrick
160209467b48Spatrickdef BWWriteVZeroIdiomPCMPGTQ : SchedWriteVariant<[
160309467b48Spatrick    SchedVar<MCSchedPredicate<ZeroIdiomPredicate>, [BWWriteZeroLatency]>,
160409467b48Spatrick    SchedVar<NoSchedPred,                          [BWWritePCMPGTQ]>
160509467b48Spatrick]>;
160609467b48Spatrickdef : InstRW<[BWWriteVZeroIdiomPCMPGTQ], (instrs PCMPGTQrr, VPCMPGTQrr,
160709467b48Spatrick                                                 VPCMPGTQYrr)>;
160809467b48Spatrick
160909467b48Spatrick
161009467b48Spatrick// CMOVs that use both Z and C flag require an extra uop.
161109467b48Spatrickdef BWWriteCMOVA_CMOVBErr : SchedWriteRes<[BWPort06,BWPort0156]> {
161209467b48Spatrick  let Latency = 2;
161309467b48Spatrick  let ResourceCycles = [1,1];
161409467b48Spatrick  let NumMicroOps = 2;
161509467b48Spatrick}
161609467b48Spatrick
161709467b48Spatrickdef BWWriteCMOVA_CMOVBErm : SchedWriteRes<[BWPort23,BWPort06,BWPort0156]> {
161809467b48Spatrick  let Latency = 7;
161909467b48Spatrick  let ResourceCycles = [1,1,1];
162009467b48Spatrick  let NumMicroOps = 3;
162109467b48Spatrick}
162209467b48Spatrick
162309467b48Spatrickdef BWCMOVA_CMOVBErr :  SchedWriteVariant<[
162409467b48Spatrick  SchedVar<MCSchedPredicate<IsCMOVArr_Or_CMOVBErr>, [BWWriteCMOVA_CMOVBErr]>,
162509467b48Spatrick  SchedVar<NoSchedPred,                             [WriteCMOV]>
162609467b48Spatrick]>;
162709467b48Spatrick
162809467b48Spatrickdef BWCMOVA_CMOVBErm :  SchedWriteVariant<[
162909467b48Spatrick  SchedVar<MCSchedPredicate<IsCMOVArm_Or_CMOVBErm>, [BWWriteCMOVA_CMOVBErm]>,
163009467b48Spatrick  SchedVar<NoSchedPred,                             [WriteCMOV.Folded]>
163109467b48Spatrick]>;
163209467b48Spatrick
163309467b48Spatrickdef : InstRW<[BWCMOVA_CMOVBErr], (instrs CMOV16rr, CMOV32rr, CMOV64rr)>;
163409467b48Spatrickdef : InstRW<[BWCMOVA_CMOVBErm], (instrs CMOV16rm, CMOV32rm, CMOV64rm)>;
163509467b48Spatrick
163609467b48Spatrick// SETCCs that use both Z and C flag require an extra uop.
163709467b48Spatrickdef BWWriteSETA_SETBEr : SchedWriteRes<[BWPort06,BWPort0156]> {
163809467b48Spatrick  let Latency = 2;
163909467b48Spatrick  let ResourceCycles = [1,1];
164009467b48Spatrick  let NumMicroOps = 2;
164109467b48Spatrick}
164209467b48Spatrick
164309467b48Spatrickdef BWWriteSETA_SETBEm : SchedWriteRes<[BWPort4,BWPort237,BWPort06,BWPort0156]> {
164409467b48Spatrick  let Latency = 3;
164509467b48Spatrick  let ResourceCycles = [1,1,1,1];
164609467b48Spatrick  let NumMicroOps = 4;
164709467b48Spatrick}
164809467b48Spatrick
164909467b48Spatrickdef BWSETA_SETBErr :  SchedWriteVariant<[
165009467b48Spatrick  SchedVar<MCSchedPredicate<IsSETAr_Or_SETBEr>, [BWWriteSETA_SETBEr]>,
165109467b48Spatrick  SchedVar<NoSchedPred,                         [WriteSETCC]>
165209467b48Spatrick]>;
165309467b48Spatrick
165409467b48Spatrickdef BWSETA_SETBErm :  SchedWriteVariant<[
165509467b48Spatrick  SchedVar<MCSchedPredicate<IsSETAm_Or_SETBEm>, [BWWriteSETA_SETBEm]>,
165609467b48Spatrick  SchedVar<NoSchedPred,                         [WriteSETCCStore]>
165709467b48Spatrick]>;
165809467b48Spatrick
165909467b48Spatrickdef : InstRW<[BWSETA_SETBErr], (instrs SETCCr)>;
166009467b48Spatrickdef : InstRW<[BWSETA_SETBErm], (instrs SETCCm)>;
166109467b48Spatrick
1662*d415bd75Srobert///////////////////////////////////////////////////////////////////////////////
1663*d415bd75Srobert// Dependency breaking instructions.
1664*d415bd75Srobert///////////////////////////////////////////////////////////////////////////////
1665*d415bd75Srobert
1666*d415bd75Srobertdef : IsZeroIdiomFunction<[
1667*d415bd75Srobert  // GPR Zero-idioms.
1668*d415bd75Srobert  DepBreakingClass<[ SUB32rr, SUB64rr, XOR32rr, XOR64rr ], ZeroIdiomPredicate>,
1669*d415bd75Srobert
1670*d415bd75Srobert  // SSE Zero-idioms.
1671*d415bd75Srobert  DepBreakingClass<[
1672*d415bd75Srobert    // fp variants.
1673*d415bd75Srobert    XORPSrr, XORPDrr,
1674*d415bd75Srobert
1675*d415bd75Srobert    // int variants.
1676*d415bd75Srobert    PXORrr,
1677*d415bd75Srobert    PSUBBrr, PSUBWrr, PSUBDrr, PSUBQrr,
1678*d415bd75Srobert    PCMPGTBrr, PCMPGTDrr, PCMPGTQrr, PCMPGTWrr
1679*d415bd75Srobert  ], ZeroIdiomPredicate>,
1680*d415bd75Srobert
1681*d415bd75Srobert  // AVX Zero-idioms.
1682*d415bd75Srobert  DepBreakingClass<[
1683*d415bd75Srobert    // xmm fp variants.
1684*d415bd75Srobert    VXORPSrr, VXORPDrr,
1685*d415bd75Srobert
1686*d415bd75Srobert    // xmm int variants.
1687*d415bd75Srobert    VPXORrr,
1688*d415bd75Srobert    VPSUBBrr, VPSUBWrr, VPSUBDrr, VPSUBQrr,
1689*d415bd75Srobert    VPCMPGTBrr, VPCMPGTWrr, VPCMPGTDrr, VPCMPGTQrr,
1690*d415bd75Srobert
1691*d415bd75Srobert    // ymm variants.
1692*d415bd75Srobert    VXORPSYrr, VXORPDYrr, VPXORYrr,
1693*d415bd75Srobert    VPSUBBYrr, VPSUBWYrr, VPSUBDYrr, VPSUBQYrr,
1694*d415bd75Srobert    VPCMPGTBYrr, VPCMPGTWYrr, VPCMPGTDYrr, VPCMPGTQYrr
1695*d415bd75Srobert  ], ZeroIdiomPredicate>,
1696*d415bd75Srobert]>;
1697*d415bd75Srobert
169809467b48Spatrick} // SchedModel
1699