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