[AMDGPU] Check for immediate SrcC in mfma in AsmParser
[llvm-core.git] / lib / Target / PowerPC / P9InstrResources.td
blob48c04996fb0b0d9332cb268244f3bae03c39486b
1 //===- P9InstrResources.td - P9 Instruction Resource Defs  -*- tablegen -*-==//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file defines the resources required by P9 instructions. This is part of
10 // the P9 processor model used for instruction scheduling. This file should
11 // contain all the instructions that may be used on Power 9. This is not
12 // just instructions that are new on Power 9 but also instructions that were
13 // available on earlier architectures and are still used in Power 9.
15 // The makeup of the P9 CPU is modeled as follows:
16 //   - Each CPU is made up of two superslices.
17 //   - Each superslice is made up of two slices. Therefore, there are 4 slices
18 //   for each CPU.
19 //   - Up to 6 instructions can be dispatched to each CPU. Three per superslice.
20 //   - Each CPU has:
21 //     - One CY (Crypto) unit P9_CY_*
22 //     - One DFU (Decimal Floating Point and Quad Precision) unit P9_DFU_*
23 //     - Two PM (Permute) units. One on each superslice. P9_PM_*
24 //     - Two DIV (Fixed Point Divide) units. One on each superslize. P9_DIV_*
25 //     - Four ALU (Fixed Point Arithmetic) units. One on each slice. P9_ALU_*
26 //     - Four DP (Floating Point) units. One on each slice. P9_DP_*
27 //       This also includes fixed point multiply add.
28 //     - Four AGEN (Address Generation) units. One for each slice. P9_AGEN_*
29 //     - Four Load/Store Queues. P9_LS_*
30 //   - Each set of instructions will require a number of these resources.
31 //===----------------------------------------------------------------------===//
33 // Two cycle ALU vector operation that uses an entire superslice.
34 // Uses both ALU units (the even ALUE and odd ALUO units), two pipelines
35 // (EXECE, EXECO) and 1 dispatch (DISP) to the given superslice.
36 def : InstRW<[P9_ALUE_2C, P9_ALUO_2C, IP_EXECE_1C, IP_EXECO_1C, DISP_1C],
37       (instrs
38     (instregex "VADDU(B|H|W|D)M$"),
39     (instregex "VAND(C)?$"),
40     (instregex "VEXTS(B|H|W)2(D|W)(s)?$"),
41     (instregex "V_SET0(B|H)?$"),
42     (instregex "VS(R|L)(B|H|W|D)$"),
43     (instregex "VSUBU(B|H|W|D)M$"),
44     (instregex "VPOPCNT(B|H)$"),
45     (instregex "VRL(B|H|W|D)$"),
46     (instregex "VSRA(B|H|W|D)$"),
47     (instregex "XV(N)?ABS(D|S)P$"),
48     (instregex "XVCPSGN(D|S)P$"),
49     (instregex "XV(I|X)EXP(D|S)P$"),
50     (instregex "VRL(D|W)(MI|NM)$"),
51     (instregex "VMRG(E|O)W$"),
52     MTVSRDD,
53     VEQV,
54     VNAND,
55     VNEGD,
56     VNEGW,
57     VNOR,
58     VOR,
59     VORC,
60     VSEL,
61     VXOR,
62     XVNEGDP,
63     XVNEGSP,
64     XXLAND,
65     XXLANDC,
66     XXLEQV,
67     XXLEQVOnes,
68     XXLNAND,
69     XXLNOR,
70     XXLOR,
71     XXLORf,
72     XXLORC,
73     XXLXOR,
74     XXLXORdpz,
75     XXLXORspz,
76     XXLXORz,
77     XXSEL,
78     XSABSQP,
79     XSCPSGNQP,
80     XSIEXPQP,
81     XSNABSQP,
82     XSNEGQP,
83     XSXEXPQP
84 )>;
86 // Restricted Dispatch ALU operation for 3 cycles. The operation runs on a
87 // single slice. However, since it is Restricted, it requires all 3 dispatches
88 // (DISP) for that superslice.
89 def : InstRW<[P9_ALU_3C, IP_EXEC_1C, DISP_3SLOTS_1C],
90       (instrs
91     (instregex "TABORT(D|W)C(I)?$"),
92     (instregex "MTFSB(0|1)$"),
93     (instregex "MFFSC(D)?RN(I)?$"),
94     (instregex "CMPRB(8)?$"),
95     (instregex "TD(I)?$"),
96     (instregex "TW(I)?$"),
97     (instregex "FCMPU(S|D)$"),
98     (instregex "XSTSTDC(S|D)P$"),
99     FTDIV,
100     FTSQRT,
101     CMPEQB
104 // Standard Dispatch ALU operation for 3 cycles. Only one slice used.
105 def : InstRW<[P9_ALU_3C, IP_EXEC_1C, DISP_1C],
106       (instrs
107     (instregex "XSMAX(C|J)?DP$"),
108     (instregex "XSMIN(C|J)?DP$"),
109     (instregex "XSCMP(EQ|EXP|GE|GT|O|U)DP$"),
110     (instregex "CNT(L|T)Z(D|W)(8)?(o)?$"),
111     (instregex "POPCNT(D|W)$"),
112     (instregex "CMPB(8)?$"),
113     (instregex "SETB(8)?$"),
114     XSTDIVDP,
115     XSTSQRTDP,
116     XSXSIGDP,
117     XSCVSPDPN,
118     BPERMD
121 // Standard Dispatch ALU operation for 2 cycles. Only one slice used.
122 def : InstRW<[P9_ALU_2C, IP_EXEC_1C, DISP_1C],
123       (instrs
124     (instregex "S(L|R)D$"),
125     (instregex "SRAD(I)?$"),
126     (instregex "EXTSWSLI_32_64$"),
127     (instregex "MFV(S)?RD$"),
128     (instregex "MTVSRD$"),
129     (instregex "MTVSRW(A|Z)$"),
130     (instregex "CMP(WI|LWI|W|LW)(8)?$"),
131     (instregex "CMP(L)?D(I)?$"),
132     (instregex "SUBF(I)?C(8)?$"),
133     (instregex "ANDI(S)?o(8)?$"),
134     (instregex "ADDC(8)?$"),
135     (instregex "ADDIC(8)?(o)?$"),
136     (instregex "ADD(8|4)(o)?$"),
137     (instregex "ADD(E|ME|ZE)(8)?(o)?$"),
138     (instregex "SUBF(E|ME|ZE)?(8)?(o)?$"),
139     (instregex "NEG(8)?(o)?$"),
140     (instregex "POPCNTB$"),
141     (instregex "ADD(I|IS)?(8)?$"),
142     (instregex "LI(S)?(8)?$"),
143     (instregex "(X)?OR(I|IS)?(8)?(o)?$"),
144     (instregex "NAND(8)?(o)?$"),
145     (instregex "AND(C)?(8)?(o)?$"),
146     (instregex "NOR(8)?(o)?$"),
147     (instregex "OR(C)?(8)?(o)?$"),
148     (instregex "EQV(8)?(o)?$"),
149     (instregex "EXTS(B|H|W)(8)?(_32)?(_64)?(o)?$"),
150     (instregex "ADD(4|8)(TLS)?(_)?$"),
151     (instregex "NEG(8)?$"),
152     (instregex "ADDI(S)?toc(HA|L)(8)?$"),
153     COPY,
154     MCRF,
155     MCRXRX,
156     XSNABSDP,
157     XSXEXPDP,
158     XSABSDP,
159     XSNEGDP,
160     XSCPSGNDP,
161     MFVSRWZ,
162     EXTSWSLI,
163     SRADI_32,
164     RLDIC,
165     RFEBB,
166     LA,
167     TBEGIN,
168     TRECHKPT,
169     NOP,
170     WAIT
173 // Restricted Dispatch ALU operation for 2 cycles. The operation runs on a
174 // single slice. However, since it is Restricted, it requires all 3 dispatches
175 // (DISP) for that superslice.
176 def : InstRW<[P9_ALU_2C, IP_EXEC_1C, DISP_3SLOTS_1C],
177       (instrs
178     (instregex "RLDC(L|R)$"),
179     (instregex "RLWIMI(8)?$"),
180     (instregex "RLDIC(L|R)(_32)?(_64)?$"),
181     (instregex "M(F|T)OCRF(8)?$"),
182     (instregex "CR(6)?(UN)?SET$"),
183     (instregex "CR(N)?(OR|AND)(C)?$"),
184     (instregex "S(L|R)W(8)?$"),
185     (instregex "RLW(INM|NM)(8)?$"),
186     (instregex "F(N)?ABS(D|S)$"),
187     (instregex "FNEG(D|S)$"),
188     (instregex "FCPSGN(D|S)$"),
189     (instregex "SRAW(I)?$"),
190     (instregex "ISEL(8)?$"),
191     RLDIMI,
192     XSIEXPDP,
193     FMR,
194     CREQV,
195     CRXOR,
196     TRECLAIM,
197     TSR,
198     TABORT
201 // Three cycle ALU vector operation that uses an entire superslice.
202 // Uses both ALU units (the even ALUE and odd ALUO units), two pipelines
203 // (EXECE, EXECO) and 1 dispatch (DISP) to the given superslice.
204 def : InstRW<[P9_ALUE_3C, P9_ALUO_3C, IP_EXECE_1C, IP_EXECO_1C, DISP_1C],
205       (instrs
206     (instregex "M(T|F)VSCR$"),
207     (instregex "VCMPNEZ(B|H|W)$"),
208     (instregex "VCMPEQU(B|H|W|D)$"),
209     (instregex "VCMPNE(B|H|W)$"),
210     (instregex "VABSDU(B|H|W)$"),
211     (instregex "VADDU(B|H|W)S$"),
212     (instregex "VAVG(S|U)(B|H|W)$"),
213     (instregex "VCMP(EQ|GE|GT)FP(o)?$"),
214     (instregex "VCMPBFP(o)?$"),
215     (instregex "VC(L|T)Z(B|H|W|D)$"),
216     (instregex "VADDS(B|H|W)S$"),
217     (instregex "V(MIN|MAX)FP$"),
218     (instregex "V(MIN|MAX)(S|U)(B|H|W|D)$"),
219     VBPERMD,
220     VADDCUW,
221     VPOPCNTW,
222     VPOPCNTD,
223     VPRTYBD,
224     VPRTYBW,
225     VSHASIGMAD,
226     VSHASIGMAW,
227     VSUBSBS,
228     VSUBSHS,
229     VSUBSWS,
230     VSUBUBS,
231     VSUBUHS,
232     VSUBUWS,
233     VSUBCUW,
234     VCMPGTSB,
235     VCMPGTSBo,
236     VCMPGTSD,
237     VCMPGTSDo,
238     VCMPGTSH,
239     VCMPGTSHo,
240     VCMPGTSW,
241     VCMPGTSWo,
242     VCMPGTUB,
243     VCMPGTUBo,
244     VCMPGTUD,
245     VCMPGTUDo,
246     VCMPGTUH,
247     VCMPGTUHo,
248     VCMPGTUW,
249     VCMPGTUWo,
250     VCMPNEBo,
251     VCMPNEHo,
252     VCMPNEWo,
253     VCMPNEZBo,
254     VCMPNEZHo,
255     VCMPNEZWo,
256     VCMPEQUBo,
257     VCMPEQUDo,
258     VCMPEQUHo,
259     VCMPEQUWo,
260     XVCMPEQDP,
261     XVCMPEQDPo,
262     XVCMPEQSP,
263     XVCMPEQSPo,
264     XVCMPGEDP,
265     XVCMPGEDPo,
266     XVCMPGESP,
267     XVCMPGESPo,
268     XVCMPGTDP,
269     XVCMPGTDPo,
270     XVCMPGTSP,
271     XVCMPGTSPo,
272     XVMAXDP,
273     XVMAXSP,
274     XVMINDP,
275     XVMINSP,
276     XVTDIVDP,
277     XVTDIVSP,
278     XVTSQRTDP,
279     XVTSQRTSP,
280     XVTSTDCDP,
281     XVTSTDCSP,
282     XVXSIGDP,
283     XVXSIGSP
286 // 7 cycle DP vector operation that uses an entire superslice.
287 // Uses both DP units (the even DPE and odd DPO units), two pipelines (EXECE,
288 // EXECO) and all three dispatches (DISP) to the given superslice.
289 def : InstRW<[P9_DPE_7C, P9_DPO_7C, IP_EXECE_1C, IP_EXECO_1C, DISP_1C],
290       (instrs
291     VADDFP,
292     VCTSXS,
293     VCTSXS_0,
294     VCTUXS,
295     VCTUXS_0,
296     VEXPTEFP,
297     VLOGEFP,
298     VMADDFP,
299     VMHADDSHS,
300     VNMSUBFP,
301     VREFP,
302     VRFIM,
303     VRFIN,
304     VRFIP,
305     VRFIZ,
306     VRSQRTEFP,
307     VSUBFP,
308     XVADDDP,
309     XVADDSP,
310     XVCVDPSP,
311     XVCVDPSXDS,
312     XVCVDPSXWS,
313     XVCVDPUXDS,
314     XVCVDPUXWS,
315     XVCVHPSP,
316     XVCVSPDP,
317     XVCVSPHP,
318     XVCVSPSXDS,
319     XVCVSPSXWS,
320     XVCVSPUXDS,
321     XVCVSPUXWS,
322     XVCVSXDDP,
323     XVCVSXDSP,
324     XVCVSXWDP,
325     XVCVSXWSP,
326     XVCVUXDDP,
327     XVCVUXDSP,
328     XVCVUXWDP,
329     XVCVUXWSP,
330     XVMADDADP,
331     XVMADDASP,
332     XVMADDMDP,
333     XVMADDMSP,
334     XVMSUBADP,
335     XVMSUBASP,
336     XVMSUBMDP,
337     XVMSUBMSP,
338     XVMULDP,
339     XVMULSP,
340     XVNMADDADP,
341     XVNMADDASP,
342     XVNMADDMDP,
343     XVNMADDMSP,
344     XVNMSUBADP,
345     XVNMSUBASP,
346     XVNMSUBMDP,
347     XVNMSUBMSP,
348     XVRDPI,
349     XVRDPIC,
350     XVRDPIM,
351     XVRDPIP,
352     XVRDPIZ,
353     XVREDP,
354     XVRESP,
355     XVRSPI,
356     XVRSPIC,
357     XVRSPIM,
358     XVRSPIP,
359     XVRSPIZ,
360     XVRSQRTEDP,
361     XVRSQRTESP,
362     XVSUBDP,
363     XVSUBSP,
364     VCFSX,
365     VCFSX_0,
366     VCFUX,
367     VCFUX_0,
368     VMHRADDSHS,
369     VMLADDUHM,
370     VMSUMMBM,
371     VMSUMSHM,
372     VMSUMSHS,
373     VMSUMUBM,
374     VMSUMUHM,
375     VMSUMUHS,
376     VMULESB,
377     VMULESH,
378     VMULESW,
379     VMULEUB,
380     VMULEUH,
381     VMULEUW,
382     VMULOSB,
383     VMULOSH,
384     VMULOSW,
385     VMULOUB,
386     VMULOUH,
387     VMULOUW,
388     VMULUWM,
389     VSUM2SWS,
390     VSUM4SBS,
391     VSUM4SHS,
392     VSUM4UBS,
393     VSUMSWS
396 // 5 cycle Restricted DP operation. One DP unit, one EXEC pipeline and all three
397 // dispatch units for the superslice.
398 def : InstRW<[P9_DP_5C, IP_EXEC_1C, DISP_3SLOTS_1C],
399       (instrs
400     (instregex "MADD(HD|HDU|LD|LD8)$"),
401     (instregex "MUL(HD|HW|LD|LI|LI8|LW)(U)?$")
404 // 7 cycle Restricted DP operation. One DP unit, one EXEC pipeline and all three
405 // dispatch units for the superslice.
406 def : InstRW<[P9_DP_7C, IP_EXEC_1C, DISP_3SLOTS_1C],
407       (instrs
408     FRSP,
409     (instregex "FRI(N|P|Z|M)(D|S)$"),
410     (instregex "FRE(S)?$"),
411     (instregex "FADD(S)?$"),
412     (instregex "FMSUB(S)?$"),
413     (instregex "FMADD(S)?$"),
414     (instregex "FSUB(S)?$"),
415     (instregex "FCFID(U)?(S)?$"),
416     (instregex "FCTID(U)?(Z)?$"),
417     (instregex "FCTIW(U)?(Z)?$"),
418     (instregex "FRSQRTE(S)?$"),
419     FNMADDS,
420     FNMADD,
421     FNMSUBS,
422     FNMSUB,
423     FSELD,
424     FSELS,
425     FMULS,
426     FMUL,
427     XSMADDADP,
428     XSMADDASP,
429     XSMADDMDP,
430     XSMADDMSP,
431     XSMSUBADP,
432     XSMSUBASP,
433     XSMSUBMDP,
434     XSMSUBMSP,
435     XSMULDP,
436     XSMULSP,
437     XSNMADDADP,
438     XSNMADDASP,
439     XSNMADDMDP,
440     XSNMADDMSP,
441     XSNMSUBADP,
442     XSNMSUBASP,
443     XSNMSUBMDP,
444     XSNMSUBMSP
447 // 7 cycle Restricted DP operation and one 3 cycle ALU operation.
448 // These operations can be done in parallel. The DP is restricted so we need a
449 // full 4 dispatches.
450 def : InstRW<[P9_DP_7C, P9_ALU_3C, IP_EXEC_1C, IP_EXEC_1C,
451               DISP_3SLOTS_1C, DISP_1C],
452       (instrs
453     (instregex "FSEL(D|S)o$")
456 // 5 Cycle Restricted DP operation and one 2 cycle ALU operation.
457 def : InstRW<[P9_DPOpAndALUOp_7C, IP_EXEC_1C, IP_EXEC_1C,
458               DISP_3SLOTS_1C, DISP_1C],
459       (instrs
460     (instregex "MUL(H|L)(D|W)(U)?o$")
463 // 7 cycle Restricted DP operation and one 3 cycle ALU operation.
464 // These operations must be done sequentially.The DP is restricted so we need a
465 // full 4 dispatches.
466 def : InstRW<[P9_DPOpAndALU2Op_10C, IP_EXEC_1C, IP_EXEC_1C,
467               DISP_3SLOTS_1C, DISP_1C],
468       (instrs
469     (instregex "FRI(N|P|Z|M)(D|S)o$"),
470     (instregex "FRE(S)?o$"),
471     (instregex "FADD(S)?o$"),
472     (instregex "FSUB(S)?o$"),
473     (instregex "F(N)?MSUB(S)?o$"),
474     (instregex "F(N)?MADD(S)?o$"),
475     (instregex "FCFID(U)?(S)?o$"),
476     (instregex "FCTID(U)?(Z)?o$"),
477     (instregex "FCTIW(U)?(Z)?o$"),
478     (instregex "FMUL(S)?o$"),
479     (instregex "FRSQRTE(S)?o$"),
480     FRSPo
483 // 7 cycle DP operation. One DP unit, one EXEC pipeline and 1 dispatch units.
484 def : InstRW<[P9_DP_7C, IP_EXEC_1C, DISP_1C],
485       (instrs
486     XSADDDP,
487     XSADDSP,
488     XSCVDPHP,
489     XSCVDPSP,
490     XSCVDPSXDS,
491     XSCVDPSXDSs,
492     XSCVDPSXWS,
493     XSCVDPUXDS,
494     XSCVDPUXDSs,
495     XSCVDPUXWS,
496     XSCVDPSXWSs,
497     XSCVDPUXWSs,
498     XSCVHPDP,
499     XSCVSPDP,
500     XSCVSXDDP,
501     XSCVSXDSP,
502     XSCVUXDDP,
503     XSCVUXDSP,
504     XSRDPI,
505     XSRDPIC,
506     XSRDPIM,
507     XSRDPIP,
508     XSRDPIZ,
509     XSREDP,
510     XSRESP,
511     XSRSQRTEDP,
512     XSRSQRTESP,
513     XSSUBDP,
514     XSSUBSP,
515     XSCVDPSPN,
516     XSRSP
519 // Three Cycle PM operation. Only one PM unit per superslice so we use the whole
520 // superslice. That includes both exec pipelines (EXECO, EXECE) and one
521 // dispatch.
522 def : InstRW<[P9_PM_3C, IP_EXECO_1C, IP_EXECE_1C, DISP_1C],
523       (instrs
524     (instregex "LVS(L|R)$"),
525     (instregex "VSPLTIS(W|H|B)$"),
526     (instregex "VSPLT(W|H|B)(s)?$"),
527     (instregex "V_SETALLONES(B|H)?$"),
528     (instregex "VEXTRACTU(B|H|W)$"),
529     (instregex "VINSERT(B|H|W|D)$"),
530     MFVSRLD,
531     MTVSRWS,
532     VBPERMQ,
533     VCLZLSBB,
534     VCTZLSBB,
535     VEXTRACTD,
536     VEXTUBLX,
537     VEXTUBRX,
538     VEXTUHLX,
539     VEXTUHRX,
540     VEXTUWLX,
541     VEXTUWRX,
542     VGBBD,
543     VMRGHB,
544     VMRGHH,
545     VMRGHW,
546     VMRGLB,
547     VMRGLH,
548     VMRGLW,
549     VPERM,
550     VPERMR,
551     VPERMXOR,
552     VPKPX,
553     VPKSDSS,
554     VPKSDUS,
555     VPKSHSS,
556     VPKSHUS,
557     VPKSWSS,
558     VPKSWUS,
559     VPKUDUM,
560     VPKUDUS,
561     VPKUHUM,
562     VPKUHUS,
563     VPKUWUM,
564     VPKUWUS,
565     VPRTYBQ,
566     VSL,
567     VSLDOI,
568     VSLO,
569     VSLV,
570     VSR,
571     VSRO,
572     VSRV,
573     VUPKHPX,
574     VUPKHSB,
575     VUPKHSH,
576     VUPKHSW,
577     VUPKLPX,
578     VUPKLSB,
579     VUPKLSH,
580     VUPKLSW,
581     XXBRD,
582     XXBRH,
583     XXBRQ,
584     XXBRW,
585     XXEXTRACTUW,
586     XXINSERTW,
587     XXMRGHW,
588     XXMRGLW,
589     XXPERM,
590     XXPERMR,
591     XXSLDWI,
592     XXSLDWIs,
593     XXSPLTIB,
594     XXSPLTW,
595     XXSPLTWs,
596     XXPERMDI,
597     XXPERMDIs,
598     VADDCUQ,
599     VADDECUQ,
600     VADDEUQM,
601     VADDUQM,
602     VMUL10CUQ,
603     VMUL10ECUQ,
604     VMUL10EUQ,
605     VMUL10UQ,
606     VSUBCUQ,
607     VSUBECUQ,
608     VSUBEUQM,
609     VSUBUQM,
610     XSCMPEXPQP,
611     XSCMPOQP,
612     XSCMPUQP,
613     XSTSTDCQP,
614     XSXSIGQP,
615     BCDCFNo,
616     BCDCFZo,
617     BCDCPSGNo,
618     BCDCTNo,
619     BCDCTZo,
620     BCDSETSGNo,
621     BCDSo,
622     BCDTRUNCo,
623     BCDUSo,
624     BCDUTRUNCo
627 // 12 Cycle DFU operation. Only one DFU unit per CPU so we use a whole
628 // superslice. That includes both exec pipelines (EXECO, EXECE) and one
629 // dispatch.
630 def : InstRW<[P9_DFU_12C, IP_EXECE_1C, IP_EXECO_1C, DISP_1C],
631       (instrs
632     BCDSRo,
633     XSADDQP,
634     XSADDQPO,
635     XSCVDPQP,
636     XSCVQPDP,
637     XSCVQPDPO,
638     XSCVQPSDZ,
639     XSCVQPSWZ,
640     XSCVQPUDZ,
641     XSCVQPUWZ,
642     XSCVSDQP,
643     XSCVUDQP,
644     XSRQPI,
645     XSRQPIX,
646     XSRQPXP,
647     XSSUBQP,
648     XSSUBQPO
651 // 23 Cycle DFU operation. Only one DFU unit per CPU so we use a whole
652 // superslice. That includes both exec pipelines (EXECO, EXECE) and one
653 // dispatch.
654 def : InstRW<[P9_DFU_23C, IP_EXECE_1C, IP_EXECO_1C, DISP_1C],
655       (instrs
656     BCDCTSQo
659 // 24 Cycle DFU operation. Only one DFU unit per CPU so we use a whole
660 // superslice. That includes both exec pipelines (EXECO, EXECE) and one
661 // dispatch.
662 def : InstRW<[P9_DFU_24C, IP_EXECE_1C, IP_EXECO_1C, DISP_1C],
663       (instrs
664     XSMADDQP,
665     XSMADDQPO,
666     XSMSUBQP,
667     XSMSUBQPO,
668     XSMULQP,
669     XSMULQPO,
670     XSNMADDQP,
671     XSNMADDQPO,
672     XSNMSUBQP,
673     XSNMSUBQPO
676 // 37 Cycle DFU operation. Only one DFU unit per CPU so we use a whole
677 // superslice. That includes both exec pipelines (EXECO, EXECE) and one
678 // dispatch.
679 def : InstRW<[P9_DFU_37C, IP_EXECE_1C, IP_EXECO_1C, DISP_1C],
680       (instrs
681     BCDCFSQo
684 // 58 Cycle DFU operation. Only one DFU unit per CPU so we use a whole
685 // superslice. That includes both exec pipelines (EXECO, EXECE) and one
686 // dispatch.
687 def : InstRW<[P9_DFU_58C, IP_EXECE_1C, IP_EXECO_1C, DISP_1C],
688       (instrs
689     XSDIVQP,
690     XSDIVQPO
693 // 76 Cycle DFU operation. Only one DFU unit per CPU so we use a whole
694 // superslice. That includes both exec pipelines (EXECO, EXECE) and all three
695 // dispatches.
696 def : InstRW<[P9_DFU_76C, IP_EXECE_1C, IP_EXECO_1C, DISP_1C],
697       (instrs
698     XSSQRTQP,
699     XSSQRTQPO
702 // 6 Cycle Load uses a single slice.
703 def : InstRW<[P9_LS_6C, IP_AGEN_1C, DISP_1C],
704       (instrs
705     (instregex "LXVL(L)?")
708 // 5 Cycle Load uses a single slice.
709 def : InstRW<[P9_LS_5C, IP_AGEN_1C, DISP_1C],
710       (instrs
711     (instregex "LVE(B|H|W)X$"),
712     (instregex "LVX(L)?"),
713     (instregex "LXSI(B|H)ZX$"),
714     LXSDX,
715     LXVB16X,
716     LXVD2X,
717     LXVWSX,
718     LXSIWZX,
719     LXV,
720     LXVX,
721     LXSD,
722     DFLOADf64,
723     XFLOADf64,
724     LIWZX
727 // 4 Cycle Load uses a single slice.
728 def : InstRW<[P9_LS_4C, IP_AGEN_1C, DISP_1C],
729       (instrs
730     (instregex "DCB(F|T|ST)(EP)?$"),
731     (instregex "DCBZ(L)?(EP)?$"),
732     (instregex "DCBTST(EP)?$"),
733     (instregex "CP_COPY(8)?$"),
734     (instregex "CP_PASTE(8)?$"),
735     (instregex "ICBI(EP)?$"),
736     (instregex "ICBT(LS)?$"),
737     (instregex "LBARX(L)?$"),
738     (instregex "LBZ(CIX|8|X|X8|XTLS|XTLS_32)?(_)?$"),
739     (instregex "LD(ARX|ARXL|BRX|CIX|X|XTLS)?(_)?$"),
740     (instregex "LH(A|B)RX(L)?(8)?$"),
741     (instregex "LHZ(8|CIX|X|X8|XTLS|XTLS_32)?(_)?$"),
742     (instregex "LWARX(L)?$"),
743     (instregex "LWBRX(8)?$"),
744     (instregex "LWZ(8|CIX|X|X8|XTLS|XTLS_32)?(_)?$"),
745     CP_ABORT,
746     DARN,
747     EnforceIEIO,
748     ISYNC,
749     MSGSYNC,
750     TLBSYNC,
751     SYNC,
752     LMW,
753     LSWI
756 // 4 Cycle Restricted load uses a single slice but the dispatch for the whole
757 // superslice.
758 def : InstRW<[P9_LS_4C, IP_AGEN_1C, DISP_3SLOTS_1C],
759       (instrs
760     LFIWZX,
761     LFDX,
762     LFD
765 // Cracked Load Instructions.
766 // Load instructions that can be done in parallel.
767 def : InstRW<[P9_LS_4C, P9_LS_4C, IP_AGEN_1C, IP_AGEN_1C,
768               DISP_PAIR_1C],
769       (instrs
770     SLBIA,
771     SLBIE,
772     SLBMFEE,
773     SLBMFEV,
774     SLBMTE,
775     TLBIEL
778 // Cracked Load Instruction.
779 // Requires Load and ALU pieces totaling 6 cycles. The Load and ALU
780 // operations can be run in parallel.
781 def : InstRW<[P9_LS_4C, P9_ALU_2C, IP_EXEC_1C, IP_AGEN_1C,
782               DISP_PAIR_1C, DISP_PAIR_1C],
783       (instrs
784     (instregex "L(W|H)ZU(X)?(8)?$")
787 // Cracked TEND Instruction.
788 // Requires Load and ALU pieces totaling 6 cycles. The Load and ALU
789 // operations can be run in parallel.
790 def : InstRW<[P9_LS_4C, P9_ALU_2C, IP_EXEC_1C, IP_AGEN_1C,
791               DISP_1C, DISP_1C],
792       (instrs
793     TEND
797 // Cracked Store Instruction
798 // Consecutive Store and ALU instructions. The store is restricted and requires
799 // three dispatches.
800 def : InstRW<[P9_StoreAndALUOp_3C, IP_EXEC_1C, IP_EXEC_1C, IP_AGEN_1C,
801               DISP_3SLOTS_1C, DISP_1C],
802       (instrs
803     (instregex "ST(B|H|W|D)CX$")
806 // Cracked Load Instruction.
807 // Two consecutive load operations for a total of 8 cycles.
808 def : InstRW<[P9_LoadAndLoadOp_8C, IP_AGEN_1C, IP_AGEN_1C,
809               DISP_1C, DISP_1C],
810       (instrs
811     LDMX
814 // Cracked Load instruction.
815 // Requires consecutive Load and ALU pieces totaling 6 cycles. The Load and ALU
816 // operations cannot be done at the same time and so their latencies are added.
817 def : InstRW<[P9_LoadAndALUOp_6C, IP_EXEC_1C, IP_AGEN_1C,
818               DISP_1C, DISP_1C],
819       (instrs
820     (instregex "LHA(X)?(8)?$"),
821     (instregex "CP_PASTE(8)?o$"),
822     (instregex "LWA(X)?(_32)?$"),
823     TCHECK
826 // Cracked Restricted Load instruction.
827 // Requires consecutive Load and ALU pieces totaling 6 cycles. The Load and ALU
828 // operations cannot be done at the same time and so their latencies are added.
829 // Full 6 dispatches are required as this is both cracked and restricted.
830 def : InstRW<[P9_LoadAndALUOp_6C, IP_EXEC_1C, IP_AGEN_1C,
831               DISP_3SLOTS_1C, DISP_3SLOTS_1C],
832       (instrs
833     LFIWAX
836 // Cracked Load instruction.
837 // Requires consecutive Load and ALU pieces totaling 7 cycles. The Load and ALU
838 // operations cannot be done at the same time and so their latencies are added.
839 // Full 4 dispatches are required as this is a cracked instruction.
840 def : InstRW<[P9_LoadAndALUOp_7C, IP_AGEN_1C, IP_EXEC_1C, DISP_1C, DISP_1C],
841       (instrs
842     LXSIWAX,
843     LIWAX
846 // Cracked Load instruction.
847 // Requires consecutive Load (4 cycles) and ALU (3 cycles) pieces totaling 7
848 // cycles. The Load and ALU operations cannot be done at the same time and so
849 // their latencies are added.
850 // Full 6 dispatches are required as this is a restricted instruction.
851 def : InstRW<[P9_LoadAndALU2Op_7C, IP_AGEN_1C, IP_EXEC_1C,
852               DISP_3SLOTS_1C, DISP_3SLOTS_1C],
853       (instrs
854     LFSX,
855     LFS
858 // Cracked Load instruction.
859 // Requires consecutive Load and ALU pieces totaling 8 cycles. The Load and ALU
860 // operations cannot be done at the same time and so their latencies are added.
861 // Full 4 dispatches are required as this is a cracked instruction.
862 def : InstRW<[P9_LoadAndALU2Op_8C, IP_AGEN_1C, IP_EXEC_1C, DISP_1C, DISP_1C],
863       (instrs
864     LXSSP,
865     LXSSPX,
866     XFLOADf32,
867     DFLOADf32
870 // Cracked 3-Way Load Instruction
871 // Load with two ALU operations that depend on each other
872 def : InstRW<[P9_LoadAndALUOp_6C, P9_ALU_2C, IP_AGEN_1C, IP_EXEC_1C, IP_EXEC_1C,
873               DISP_PAIR_1C, DISP_PAIR_1C, DISP_1C],
874       (instrs
875     (instregex "LHAU(X)?(8)?$"),
876     LWAUX
879 // Cracked Load that requires the PM resource.
880 // Since the Load and the PM cannot be done at the same time the latencies are
881 // added. Requires 8 cycles. Since the PM requires the full superslice we need
882 // both EXECE, EXECO pipelines as well as 1 dispatch for the PM. The Load
883 // requires the remaining 1 dispatch.
884 def : InstRW<[P9_LoadAndPMOp_8C, IP_AGEN_1C, IP_EXECE_1C, IP_EXECO_1C,
885               DISP_1C, DISP_1C],
886       (instrs
887     LXVH8X,
888     LXVDSX,
889     LXVW4X
892 // Single slice Restricted store operation. The restricted operation requires
893 // all three dispatches for the superslice.
894 def : InstRW<[P9_LS_1C, IP_EXEC_1C, IP_AGEN_1C, DISP_3SLOTS_1C],
895       (instrs
896     (instregex "STF(S|D|IWX|SX|DX)$"),
897     (instregex "STXS(D|DX|SPX|IWX|IBX|IHX|SP)(v)?$"),
898     (instregex "STW(8)?$"),
899     (instregex "(D|X)FSTORE(f32|f64)$"),
900     (instregex "ST(W|H|D)BRX$"),
901     (instregex "ST(B|H|D)(8)?$"),
902     (instregex "ST(B|W|H|D)(CI)?X(TLS|TLS_32)?(8)?(_)?$"),
903     STIWX,
904     SLBIEG,
905     STMW,
906     STSWI,
907     TLBIE
910 // Vector Store Instruction
911 // Requires the whole superslice and therefore requires one dispatch
912 // as well as both the Even and Odd exec pipelines.
913 def : InstRW<[P9_LS_1C, IP_EXECE_1C, IP_EXECO_1C, IP_AGEN_1C, DISP_1C],
914       (instrs
915     (instregex "STVE(B|H|W)X$"),
916     (instregex "STVX(L)?$"),
917     (instregex "STXV(B16X|H8X|W4X|D2X|L|LL|X)?$")
920 // 5 Cycle DIV operation. Only one DIV unit per superslice so we use the whole
921 // superslice. That includes both exec pipelines (EXECO, EXECE) and two
922 // dispatches.
923 def : InstRW<[P9_DIV_5C, IP_EXECE_1C, IP_EXECO_1C, DISP_EVEN_1C],
924       (instrs
925     (instregex "MTCTR(8)?(loop)?$"),
926     (instregex "MTLR(8)?$")
929 // 12 Cycle DIV operation. Only one DIV unit per superslice so we use the whole
930 // superslice. That includes both exec pipelines (EXECO, EXECE) and two
931 // dispatches.
932 def : InstRW<[P9_DIV_12C, IP_EXECE_1C, IP_EXECO_1C, DISP_EVEN_1C],
933       (instrs
934     (instregex "M(T|F)VRSAVE(v)?$"),
935     (instregex "M(T|F)PMR$"),
936     (instregex "M(T|F)TB(8)?$"),
937     (instregex "MF(SPR|CTR|LR)(8)?$"),
938     (instregex "M(T|F)MSR(D)?$"),
939     (instregex "MTSPR(8)?$")
942 // 16 Cycle DIV operation. Only one DIV unit per superslice so we use the whole
943 // superslice. That includes both exec pipelines (EXECO, EXECE) and two
944 // dispatches.
945 def : InstRW<[P9_DIV_16C_8, IP_EXECO_1C, IP_EXECE_1C, DISP_EVEN_1C],
946       (instrs
947     DIVW,
948     DIVWU,
949     MODSW
952 // 24 Cycle DIV operation. Only one DIV unit per superslice so we use the whole
953 // superslice. That includes both exec pipelines (EXECO, EXECE) and two
954 // dispatches.
955 def : InstRW<[P9_DIV_24C_8, IP_EXECO_1C, IP_EXECE_1C, DISP_EVEN_1C],
956       (instrs
957     DIVWE,
958     DIVD,
959     DIVWEU,
960     DIVDU,
961     MODSD,
962     MODUD,
963     MODUW
966 // 40 Cycle DIV operation. Only one DIV unit per superslice so we use the whole
967 // superslice. That includes both exec pipelines (EXECO, EXECE) and all three
968 // dispatches.
969 def : InstRW<[P9_DIV_40C_8, IP_EXECO_1C, IP_EXECE_1C, DISP_EVEN_1C],
970       (instrs
971     DIVDE,
972     DIVDEU
975 // Cracked DIV and ALU operation. Requires one full slice for the ALU operation
976 // and one full superslice for the DIV operation since there is only one DIV per
977 // superslice. Latency of DIV plus ALU is 26.
978 def : InstRW<[P9_IntDivAndALUOp_18C_8, IP_EXECE_1C, IP_EXECO_1C, IP_EXEC_1C,
979               DISP_EVEN_1C, DISP_1C],
980       (instrs
981     (instregex "DIVW(U)?(O)?o$")
984 // Cracked DIV and ALU operation. Requires one full slice for the ALU operation
985 // and one full superslice for the DIV operation since there is only one DIV per
986 // superslice. Latency of DIV plus ALU is 26.
987 def : InstRW<[P9_IntDivAndALUOp_26C_8, IP_EXECE_1C, IP_EXECO_1C, IP_EXEC_1C,
988               DISP_EVEN_1C, DISP_1C],
989       (instrs
990     DIVDo,
991     DIVDUo,
992     DIVWEo,
993     DIVWEUo
996 // Cracked DIV and ALU operation. Requires one full slice for the ALU operation
997 // and one full superslice for the DIV operation since there is only one DIV per
998 // superslice. Latency of DIV plus ALU is 42.
999 def : InstRW<[P9_IntDivAndALUOp_42C_8, IP_EXECE_1C, IP_EXECO_1C, IP_EXEC_1C,
1000               DISP_EVEN_1C, DISP_1C],
1001       (instrs
1002     DIVDEo,
1003     DIVDEUo
1006 // CR access instructions in _BrMCR, IIC_BrMCRX.
1008 // Cracked, restricted, ALU operations.
1009 // Here the two ALU ops can actually be done in parallel and therefore the
1010 // latencies are not added together. Otherwise this is like having two
1011 // instructions running together on two pipelines and 6 dispatches. ALU ops are
1012 // 2 cycles each.
1013 def : InstRW<[P9_ALU_2C, P9_ALU_2C, IP_EXEC_1C, IP_EXEC_1C,
1014               DISP_3SLOTS_1C, DISP_3SLOTS_1C],
1015       (instrs
1016     MTCRF,
1017     MTCRF8
1020 // Cracked ALU operations.
1021 // Here the two ALU ops can actually be done in parallel and therefore the
1022 // latencies are not added together. Otherwise this is like having two
1023 // instructions running together on two pipelines and 2 dispatches. ALU ops are
1024 // 2 cycles each.
1025 def : InstRW<[P9_ALU_2C, P9_ALU_2C, IP_EXEC_1C, IP_EXEC_1C,
1026               DISP_1C, DISP_1C],
1027       (instrs
1028     (instregex "ADDC(8)?o$"),
1029     (instregex "SUBFC(8)?o$")
1032 // Cracked ALU operations.
1033 // Two ALU ops can be done in parallel.
1034 // One is three cycle ALU the ohter is a two cycle ALU.
1035 // One of the ALU ops is restricted the other is not so we have a total of
1036 // 5 dispatches.
1037 def : InstRW<[P9_ALU_2C, P9_ALU_3C, IP_EXEC_1C, IP_EXEC_1C,
1038               DISP_3SLOTS_1C, DISP_1C],
1039       (instrs
1040     (instregex "F(N)?ABS(D|S)o$"),
1041     (instregex "FCPSGN(D|S)o$"),
1042     (instregex "FNEG(D|S)o$"),
1043     FMRo
1046 // Cracked ALU operations.
1047 // Here the two ALU ops can actually be done in parallel and therefore the
1048 // latencies are not added together. Otherwise this is like having two
1049 // instructions running together on two pipelines and 2 dispatches.
1050 // ALU ops are 3 cycles each.
1051 def : InstRW<[P9_ALU_3C, P9_ALU_3C, IP_EXEC_1C, IP_EXEC_1C,
1052               DISP_1C, DISP_1C],
1053       (instrs
1054     MCRFS
1057 // Cracked Restricted ALU operations.
1058 // Here the two ALU ops can actually be done in parallel and therefore the
1059 // latencies are not added together. Otherwise this is like having two
1060 // instructions running together on two pipelines and 6 dispatches.
1061 // ALU ops are 3 cycles each.
1062 def : InstRW<[P9_ALU_3C, P9_ALU_3C, IP_EXEC_1C, IP_EXEC_1C,
1063               DISP_3SLOTS_1C, DISP_3SLOTS_1C],
1064       (instrs
1065     (instregex "MTFSF(b|o)?$"),
1066     (instregex "MTFSFI(o)?$")
1069 // Cracked instruction made of two ALU ops.
1070 // The two ops cannot be done in parallel.
1071 // One of the ALU ops is restricted and takes 3 dispatches.
1072 def : InstRW<[P9_ALUOpAndALUOp_4C, IP_EXEC_1C, IP_EXEC_1C,
1073               DISP_3SLOTS_1C, DISP_1C],
1074       (instrs
1075     (instregex "RLD(I)?C(R|L)o$"),
1076     (instregex "RLW(IMI|INM|NM)(8)?o$"),
1077     (instregex "SLW(8)?o$"),
1078     (instregex "SRAW(I)?o$"),
1079     (instregex "SRW(8)?o$"),
1080     RLDICL_32o,
1081     RLDIMIo
1084 // Cracked instruction made of two ALU ops.
1085 // The two ops cannot be done in parallel.
1086 // Both of the ALU ops are restricted and take 3 dispatches.
1087 def : InstRW<[P9_ALU2OpAndALU2Op_6C, IP_EXEC_1C, IP_EXEC_1C,
1088               DISP_3SLOTS_1C, DISP_3SLOTS_1C],
1089       (instrs
1090     (instregex "MFFS(L|CE|o)?$")
1093 // Cracked ALU instruction composed of three consecutive 2 cycle loads for a
1094 // total of 6 cycles. All of the ALU operations are also restricted so each
1095 // takes 3 dispatches for a total of 9.
1096 def : InstRW<[P9_ALUOpAndALUOpAndALUOp_6C, IP_EXEC_1C, IP_EXEC_1C, IP_EXEC_1C,
1097               DISP_3SLOTS_1C, DISP_3SLOTS_1C, DISP_3SLOTS_1C],
1098       (instrs
1099     (instregex "MFCR(8)?$")
1102 // Cracked instruction made of two ALU ops.
1103 // The two ops cannot be done in parallel.
1104 def : InstRW<[P9_ALUOpAndALUOp_4C, IP_EXEC_1C, IP_EXEC_1C, DISP_1C, DISP_1C],
1105       (instrs
1106     (instregex "EXTSWSLI_32_64o$"),
1107     (instregex "SRAD(I)?o$"),
1108     EXTSWSLIo,
1109     SLDo,
1110     SRDo,
1111     RLDICo
1114 // 33 Cycle DP Instruction Restricted. Takes one slice and 3 dispatches.
1115 def : InstRW<[P9_DP_33C_8, IP_EXEC_1C, DISP_3SLOTS_1C],
1116       (instrs
1117     FDIV
1120 // 33 Cycle DP Instruction Restricted and Cracked with 3 Cycle ALU.
1121 def : InstRW<[P9_DPOpAndALU2Op_36C_8, IP_EXEC_1C, IP_EXEC_1C,
1122               DISP_3SLOTS_1C, DISP_1C],
1123       (instrs
1124     FDIVo
1127 // 36 Cycle DP Instruction.
1128 // Instruction can be done on a single slice.
1129 def : InstRW<[P9_DP_36C_10, IP_EXEC_1C, DISP_1C],
1130       (instrs
1131     XSSQRTDP
1134 // 36 Cycle DP Instruction Restricted. Takes one slice and 3 dispatches.
1135 def : InstRW<[P9_DP_36C_10, IP_EXEC_1C, DISP_3SLOTS_1C],
1136       (instrs
1137     FSQRT
1140 // 36 Cycle DP Vector Instruction.
1141 def : InstRW<[P9_DPE_36C_10, P9_DPO_36C_10, IP_EXECE_1C, IP_EXECO_1C,
1142               DISP_1C],
1143       (instrs
1144     XVSQRTDP
1147 // 27 Cycle DP Vector Instruction.
1148 def : InstRW<[P9_DPE_27C_10, P9_DPO_27C_10, IP_EXECE_1C, IP_EXECO_1C,
1149               DISP_1C],
1150       (instrs
1151     XVSQRTSP
1154 // 36 Cycle DP Instruction Restricted and Cracked with 3 Cycle ALU.
1155 def : InstRW<[P9_DPOpAndALU2Op_39C_10, IP_EXEC_1C, IP_EXEC_1C,
1156               DISP_3SLOTS_1C, DISP_1C],
1157       (instrs
1158     FSQRTo
1161 // 26 Cycle DP Instruction.
1162 def : InstRW<[P9_DP_26C_5, IP_EXEC_1C, DISP_1C],
1163       (instrs
1164     XSSQRTSP
1167 // 26 Cycle DP Instruction Restricted. Takes one slice and 3 dispatches.
1168 def : InstRW<[P9_DP_26C_5, IP_EXEC_1C, DISP_3SLOTS_1C],
1169       (instrs
1170     FSQRTS
1173 // 26 Cycle DP Instruction Restricted and Cracked with 3 Cycle ALU.
1174 def : InstRW<[P9_DPOpAndALU2Op_29C_5, IP_EXEC_1C, IP_EXEC_1C,
1175               DISP_3SLOTS_1C, DISP_1C],
1176       (instrs
1177     FSQRTSo
1180 // 33 Cycle DP Instruction. Takes one slice and 1 dispatch.
1181 def : InstRW<[P9_DP_33C_8, IP_EXEC_1C, DISP_1C],
1182       (instrs
1183     XSDIVDP
1186 // 22 Cycle DP Instruction Restricted. Takes one slice and 3 dispatches.
1187 def : InstRW<[P9_DP_22C_5, IP_EXEC_1C, DISP_3SLOTS_1C],
1188       (instrs
1189     FDIVS
1192 // 22 Cycle DP Instruction Restricted and Cracked with 2 Cycle ALU.
1193 def : InstRW<[P9_DPOpAndALU2Op_25C_5, IP_EXEC_1C, IP_EXEC_1C,
1194               DISP_3SLOTS_1C, DISP_1C],
1195       (instrs
1196     FDIVSo
1199 // 22 Cycle DP Instruction. Takes one slice and 1 dispatch.
1200 def : InstRW<[P9_DP_22C_5, IP_EXEC_1C, DISP_1C],
1201       (instrs
1202     XSDIVSP
1205 // 24 Cycle DP Vector Instruction. Takes one full superslice.
1206 // Includes both EXECE, EXECO pipelines and 1 dispatch for the given
1207 // superslice.
1208 def : InstRW<[P9_DPE_24C_8, P9_DPO_24C_8, IP_EXECE_1C, IP_EXECO_1C,
1209               DISP_1C],
1210       (instrs
1211     XVDIVSP
1214 // 33 Cycle DP Vector Instruction. Takes one full superslice.
1215 // Includes both EXECE, EXECO pipelines and 1 dispatch for the given
1216 // superslice.
1217 def : InstRW<[P9_DPE_33C_8, P9_DPO_33C_8, IP_EXECE_1C, IP_EXECO_1C,
1218               DISP_1C],
1219       (instrs
1220     XVDIVDP
1223 // Instruction cracked into three pieces. One Load and two ALU operations.
1224 // The Load and one of the ALU ops cannot be run at the same time and so the
1225 // latencies are added together for 6 cycles. The remainaing ALU is 2 cycles.
1226 // Both the load and the ALU that depends on it are restricted and so they take
1227 // a total of 7 dispatches. The final 2 dispatches come from the second ALU op.
1228 // The two EXEC pipelines are for the 2 ALUs while the AGEN is for the load.
1229 def : InstRW<[P9_LoadAndALU2Op_7C, P9_ALU_2C,
1230               IP_AGEN_1C, IP_EXEC_1C, IP_EXEC_1C,
1231               DISP_3SLOTS_1C, DISP_3SLOTS_1C, DISP_1C],
1232       (instrs
1233     (instregex "LF(SU|SUX)$")
1236 // Cracked instruction made up of a Store and an ALU. The ALU does not depend on
1237 // the store and so it can be run at the same time as the store. The store is
1238 // also restricted.
1239 def : InstRW<[P9_LS_1C, P9_ALU_2C, IP_AGEN_1C, IP_EXEC_1C, IP_EXEC_1C,
1240               DISP_3SLOTS_1C, DISP_1C],
1241       (instrs
1242     (instregex "STF(S|D)U(X)?$"),
1243     (instregex "ST(B|H|W|D)U(X)?(8)?$")
1246 // Cracked instruction made up of a Load and an ALU. The ALU does not depend on
1247 // the load and so it can be run at the same time as the load.
1248 def : InstRW<[P9_LS_4C, P9_ALU_2C, IP_AGEN_1C, IP_EXEC_1C,
1249               DISP_PAIR_1C, DISP_PAIR_1C],
1250       (instrs
1251     (instregex "LBZU(X)?(8)?$"),
1252     (instregex "LDU(X)?$")
1255 // Cracked instruction made up of a Load and an ALU. The ALU does not depend on
1256 // the load and so it can be run at the same time as the load. The load is also
1257 // restricted. 3 dispatches are from the restricted load while the other two
1258 // are from the ALU. The AGEN pipeline is from the load and the EXEC pipeline
1259 // is required for the ALU.
1260 def : InstRW<[P9_LS_4C, P9_ALU_2C, IP_AGEN_1C, IP_EXEC_1C,
1261               DISP_3SLOTS_1C, DISP_1C],
1262       (instrs
1263     (instregex "LF(DU|DUX)$")
1266 // Crypto Instructions
1268 // 6 Cycle CY operation. Only one CY unit per CPU so we use a whole
1269 // superslice. That includes both exec pipelines (EXECO, EXECE) and one
1270 // dispatch.
1271 def : InstRW<[P9_CY_6C, IP_EXECO_1C, IP_EXECE_1C, DISP_1C],
1272       (instrs
1273     (instregex "VPMSUM(B|H|W|D)$"),
1274     (instregex "V(N)?CIPHER(LAST)?$"),
1275     VSBOX
1278 // Branch Instructions
1280 // Two Cycle Branch
1281 def : InstRW<[P9_BR_2C, DISP_BR_1C],
1282       (instrs
1283   (instregex "BCCCTR(L)?(8)?$"),
1284   (instregex "BCCL(A|R|RL)?$"),
1285   (instregex "BCCTR(L)?(8)?(n)?$"),
1286   (instregex "BD(N)?Z(8|A|Am|Ap|m|p)?$"),
1287   (instregex "BD(N)?ZL(A|Am|Ap|R|R8|RL|RLm|RLp|Rm|Rp|m|p)?$"),
1288   (instregex "BL(_TLS|_NOP)?$"),
1289   (instregex "BL8(_TLS|_NOP|_NOP_TLS|_TLS_)?$"),
1290   (instregex "BLA(8|8_NOP)?$"),
1291   (instregex "BLR(8|L)?$"),
1292   (instregex "TAILB(A)?(8)?$"),
1293   (instregex "TAILBCTR(8)?$"),
1294   (instregex "gBC(A|Aat|CTR|CTRL|L|LA|LAat|LR|LRL|Lat|at)?$"),
1295   (instregex "BCLR(L)?(n)?$"),
1296   (instregex "BCTR(L)?(8)?$"),
1297   B,
1298   BA,
1299   BC,
1300   BCC,
1301   BCCA,
1302   BCL,
1303   BCLalways,
1304   BCLn,
1305   BCTRL8_LDinto_toc,
1306   BCn,
1307   CTRL_DEP
1310 // Five Cycle Branch with a 2 Cycle ALU Op
1311 // Operations must be done consecutively and not in parallel.
1312 def : InstRW<[P9_BROpAndALUOp_7C, IP_EXEC_1C, DISP_BR_1C, DISP_1C],
1313       (instrs
1314     ADDPCIS
1317 // Special Extracted Instructions For Atomics
1319 // Atomic Load
1320 def : InstRW<[P9_LS_1C, P9_LS_1C, P9_LS_4C, P9_LS_4C, P9_LS_4C,
1321               IP_EXEC_1C, IP_EXEC_1C, IP_AGEN_1C, IP_AGEN_1C, IP_AGEN_1C,
1322               IP_AGEN_1C, IP_AGEN_1C, DISP_1C, DISP_3SLOTS_1C, 
1323               DISP_3SLOTS_1C, DISP_1C, DISP_1C, DISP_1C],
1324       (instrs
1325     (instregex "L(D|W)AT$")
1328 // Atomic Store
1329 def : InstRW<[P9_LS_1C, P9_LS_4C, P9_LS_4C, IP_EXEC_1C, IP_AGEN_1C, IP_AGEN_1C,
1330               IP_AGEN_1C, DISP_1C, DISP_3SLOTS_1C, DISP_1C],
1331       (instrs
1332     (instregex "ST(D|W)AT$")
1335 // Signal Processing Engine (SPE) Instructions
1336 // These instructions are not supported on Power 9
1337 def : InstRW<[],
1338     (instrs
1339   BRINC,
1340   EVABS,
1341   EVEQV,
1342   EVMRA,
1343   EVNAND,
1344   EVNEG,
1345   (instregex "EVADD(I)?W$"),
1346   (instregex "EVADD(SM|SS|UM|US)IAAW$"),
1347   (instregex "EVAND(C)?$"),
1348   (instregex "EVCMP(EQ|GTS|GTU|LTS|LTU)$"),
1349   (instregex "EVCNTL(S|Z)W$"),
1350   (instregex "EVDIVW(S|U)$"),
1351   (instregex "EVEXTS(B|H)$"),
1352   (instregex "EVLD(H|W|D)(X)?$"),
1353   (instregex "EVLHH(E|OS|OU)SPLAT(X)?$"),
1354   (instregex "EVLWHE(X)?$"),
1355   (instregex "EVLWHO(S|U)(X)?$"),
1356   (instregex "EVLW(H|W)SPLAT(X)?$"),
1357   (instregex "EVMERGE(HI|LO|HILO|LOHI)$"),
1358   (instregex "EVMHEG(S|U)M(F|I)A(A|N)$"),
1359   (instregex "EVMHES(M|S)(F|I)(A|AA|AAW|ANW)?$"),
1360   (instregex "EVMHEU(M|S)I(A|AA|AAW|ANW)?$"),
1361   (instregex "EVMHOG(U|S)M(F|I)A(A|N)$"),
1362   (instregex "EVMHOS(M|S)(F|I)(A|AA|AAW|ANW)?$"),
1363   (instregex "EVMHOU(M|S)I(A|AA|ANW|AAW)?$"),
1364   (instregex "EVMWHS(M|S)(F|FA|I|IA)$"),
1365   (instregex "EVMWHUMI(A)?$"),
1366   (instregex "EVMWLS(M|S)IA(A|N)W$"),
1367   (instregex "EVMWLU(M|S)I(A|AA|AAW|ANW)?$"),
1368   (instregex "EVMWSM(F|I)(A|AA|AN)?$"),
1369   (instregex "EVMWSSF(A|AA|AN)?$"),
1370   (instregex "EVMWUMI(A|AA|AN)?$"),
1371   (instregex "EV(N|X)?OR(C)?$"),
1372   (instregex "EVR(LW|LWI|NDW)$"),
1373   (instregex "EVSLW(I)?$"),
1374   (instregex "EVSPLAT(F)?I$"),
1375   (instregex "EVSRW(I)?(S|U)$"),
1376   (instregex "EVST(DD|DH|DW|WHE|WHO|WWE|WWO)(X)?$"),
1377   (instregex "EVSUBF(S|U)(M|S)IAAW$"),
1378   (instregex "EVSUB(I)?FW$")
1379 )> { let Unsupported = 1; }
1381 // General Instructions without scheduling support.
1382 def : InstRW<[],
1383     (instrs
1384   (instregex "(H)?RFI(D)?$"),
1385   (instregex "DSS(ALL)?$"),
1386   (instregex "DST(ST)?(T)?(64)?$"),
1387   (instregex "ICBL(C|Q)$"),
1388   (instregex "L(W|H|B)EPX$"),
1389   (instregex "ST(W|H|B)EPX$"),
1390   (instregex "(L|ST)FDEPX$"),
1391   (instregex "M(T|F)SR(IN)?$"),
1392   (instregex "M(T|F)DCR$"),
1393   (instregex "NOP_GT_PWR(6|7)$"),
1394   (instregex "TLB(IA|IVAX|SX|SX2|SX2D|LD|LI|RE|RE2|WE|WE2)$"),
1395   (instregex "WRTEE(I)?$"),
1396   ATTN,
1397   CLRBHRB,
1398   MFBHRBE,
1399   MBAR,
1400   MSYNC,
1401   SLBSYNC,
1402   SLBFEEo,
1403   NAP,
1404   STOP,
1405   TRAP,
1406   RFCI,
1407   RFDI,
1408   RFMCI,
1409   SC,
1410   DCBA,
1411   DCBI,
1412   DCCCI,
1413   ICCCI
1414 )> { let Unsupported = 1; }