1 //===- PowerPCInstrFormats.td - PowerPC Instruction Formats --*- tablegen -*-=//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 //===----------------------------------------------------------------------===//
12 // PowerPC instruction formats
14 class I<bits<6> opcode, dag OOL, dag IOL, string asmstr, InstrItinClass itin>
17 field bits<32> SoftFail = 0;
20 bit PPC64 = 0; // Default value, override with isPPC64
22 let Namespace = "PPC";
23 let Inst{0-5} = opcode;
24 let OutOperandList = OOL;
25 let InOperandList = IOL;
26 let AsmString = asmstr;
29 bits<1> PPC970_First = 0;
30 bits<1> PPC970_Single = 0;
31 bits<1> PPC970_Cracked = 0;
32 bits<3> PPC970_Unit = 0;
34 /// These fields correspond to the fields in PPCInstrInfo.h. Any changes to
35 /// these must be reflected there! See comments there for what these are.
36 let TSFlags{0} = PPC970_First;
37 let TSFlags{1} = PPC970_Single;
38 let TSFlags{2} = PPC970_Cracked;
39 let TSFlags{5-3} = PPC970_Unit;
41 /// Indicate that the VSX instruction is to use VSX numbering/encoding.
42 /// Since ISA 3.0, there are scalar instructions that use the upper
43 /// half of the VSX register set only. Rather than adding further complexity
44 /// to the register class set, the VSX registers just include the Altivec
45 /// registers and this flag decides the numbering to be used for them.
46 bits<1> UseVSXReg = 0;
47 let TSFlags{6} = UseVSXReg;
49 // Indicate that this instruction is of type X-Form Load or Store
50 bits<1> XFormMemOp = 0;
51 let TSFlags{7} = XFormMemOp;
53 // Fields used for relation models.
56 // For cases where multiple instruction definitions really represent the
57 // same underlying instruction but with one definition for 64-bit arguments
58 // and one for 32-bit arguments, this bit breaks the degeneracy between
59 // the two forms and allows TableGen to generate mapping tables.
60 bit Interpretation64Bit = 0;
63 class PPC970_DGroup_First { bits<1> PPC970_First = 1; }
64 class PPC970_DGroup_Single { bits<1> PPC970_Single = 1; }
65 class PPC970_DGroup_Cracked { bits<1> PPC970_Cracked = 1; }
66 class PPC970_MicroCode;
68 class PPC970_Unit_Pseudo { bits<3> PPC970_Unit = 0; }
69 class PPC970_Unit_FXU { bits<3> PPC970_Unit = 1; }
70 class PPC970_Unit_LSU { bits<3> PPC970_Unit = 2; }
71 class PPC970_Unit_FPU { bits<3> PPC970_Unit = 3; }
72 class PPC970_Unit_CRU { bits<3> PPC970_Unit = 4; }
73 class PPC970_Unit_VALU { bits<3> PPC970_Unit = 5; }
74 class PPC970_Unit_VPERM { bits<3> PPC970_Unit = 6; }
75 class PPC970_Unit_BRU { bits<3> PPC970_Unit = 7; }
77 class UseVSXReg { bits<1> UseVSXReg = 1; }
78 class XFormMemOp { bits<1> XFormMemOp = 1; }
80 // Two joined instructions; used to emit two adjacent instructions as one.
81 // The itinerary from the first instruction is used for scheduling and
83 class I2<bits<6> opcode1, bits<6> opcode2, dag OOL, dag IOL, string asmstr,
87 field bits<64> SoftFail = 0;
90 bit PPC64 = 0; // Default value, override with isPPC64
92 let Namespace = "PPC";
93 let Inst{0-5} = opcode1;
94 let Inst{32-37} = opcode2;
95 let OutOperandList = OOL;
96 let InOperandList = IOL;
97 let AsmString = asmstr;
100 bits<1> PPC970_First = 0;
101 bits<1> PPC970_Single = 0;
102 bits<1> PPC970_Cracked = 0;
103 bits<3> PPC970_Unit = 0;
105 /// These fields correspond to the fields in PPCInstrInfo.h. Any changes to
106 /// these must be reflected there! See comments there for what these are.
107 let TSFlags{0} = PPC970_First;
108 let TSFlags{1} = PPC970_Single;
109 let TSFlags{2} = PPC970_Cracked;
110 let TSFlags{5-3} = PPC970_Unit;
112 // Fields used for relation models.
113 string BaseName = "";
114 bit Interpretation64Bit = 0;
117 // Base class for all X-Form memory instructions
118 class IXFormMemOp<bits<6> opcode, dag OOL, dag IOL, string asmstr,
120 :I<opcode, OOL, IOL, asmstr, itin>, XFormMemOp;
123 class IForm<bits<6> opcode, bit aa, bit lk, dag OOL, dag IOL, string asmstr,
124 InstrItinClass itin, list<dag> pattern>
125 : I<opcode, OOL, IOL, asmstr, itin> {
126 let Pattern = pattern;
135 class BForm<bits<6> opcode, bit aa, bit lk, dag OOL, dag IOL, string asmstr>
136 : I<opcode, OOL, IOL, asmstr, IIC_BrB> {
137 bits<7> BIBO; // 2 bits of BI and 5 bits of BO.
142 let BI{0-1} = BIBO{5-6};
143 let BI{2-4} = CR{0-2};
145 let Inst{6-10} = BIBO{4-0};
146 let Inst{11-15} = BI;
147 let Inst{16-29} = BD;
152 class BForm_1<bits<6> opcode, bits<5> bo, bit aa, bit lk, dag OOL, dag IOL,
154 : BForm<opcode, aa, lk, OOL, IOL, asmstr> {
160 class BForm_2<bits<6> opcode, bits<5> bo, bits<5> bi, bit aa, bit lk,
161 dag OOL, dag IOL, string asmstr>
162 : I<opcode, OOL, IOL, asmstr, IIC_BrB> {
166 let Inst{11-15} = bi;
167 let Inst{16-29} = BD;
172 class BForm_3<bits<6> opcode, bit aa, bit lk,
173 dag OOL, dag IOL, string asmstr>
174 : I<opcode, OOL, IOL, asmstr, IIC_BrB> {
180 let Inst{11-15} = BI;
181 let Inst{16-29} = BD;
186 class BForm_3_at<bits<6> opcode, bit aa, bit lk,
187 dag OOL, dag IOL, string asmstr>
188 : I<opcode, OOL, IOL, asmstr, IIC_BrB> {
194 let Inst{6-8} = BO{4-2};
196 let Inst{11-15} = BI;
197 let Inst{16-29} = BD;
202 class BForm_4<bits<6> opcode, bits<5> bo, bit aa, bit lk,
203 dag OOL, dag IOL, string asmstr>
204 : I<opcode, OOL, IOL, asmstr, IIC_BrB> {
209 let Inst{11-15} = BI;
210 let Inst{16-29} = BD;
216 class SCForm<bits<6> opcode, bits<1> xo,
217 dag OOL, dag IOL, string asmstr, InstrItinClass itin,
219 : I<opcode, OOL, IOL, asmstr, itin> {
222 let Pattern = pattern;
224 let Inst{20-26} = LEV;
229 class DForm_base<bits<6> opcode, dag OOL, dag IOL, string asmstr,
230 InstrItinClass itin, list<dag> pattern>
231 : I<opcode, OOL, IOL, asmstr, itin> {
236 let Pattern = pattern;
243 class DForm_1<bits<6> opcode, dag OOL, dag IOL, string asmstr,
244 InstrItinClass itin, list<dag> pattern>
245 : I<opcode, OOL, IOL, asmstr, itin> {
249 let Pattern = pattern;
252 let Inst{11-15} = Addr{20-16}; // Base Reg
253 let Inst{16-31} = Addr{15-0}; // Displacement
256 class DForm_1a<bits<6> opcode, dag OOL, dag IOL, string asmstr,
257 InstrItinClass itin, list<dag> pattern>
258 : I<opcode, OOL, IOL, asmstr, itin> {
263 let Pattern = pattern;
271 class DForm_2<bits<6> opcode, dag OOL, dag IOL, string asmstr,
272 InstrItinClass itin, list<dag> pattern>
273 : DForm_base<opcode, OOL, IOL, asmstr, itin, pattern> {
275 // Even though ADDICo does not really have an RC bit, provide
276 // the declaration of one here so that isDOT has something to set.
280 class DForm_2_r0<bits<6> opcode, dag OOL, dag IOL, string asmstr,
281 InstrItinClass itin, list<dag> pattern>
282 : I<opcode, OOL, IOL, asmstr, itin> {
286 let Pattern = pattern;
293 class DForm_4<bits<6> opcode, dag OOL, dag IOL, string asmstr,
294 InstrItinClass itin, list<dag> pattern>
295 : I<opcode, OOL, IOL, asmstr, itin> {
300 let Pattern = pattern;
307 class DForm_4_zero<bits<6> opcode, dag OOL, dag IOL, string asmstr,
308 InstrItinClass itin, list<dag> pattern>
309 : DForm_1<opcode, OOL, IOL, asmstr, itin, pattern> {
314 class DForm_4_fixedreg_zero<bits<6> opcode, bits<5> R, dag OOL, dag IOL,
315 string asmstr, InstrItinClass itin,
317 : DForm_4<opcode, OOL, IOL, asmstr, itin, pattern> {
323 class IForm_and_DForm_1<bits<6> opcode1, bit aa, bit lk, bits<6> opcode2,
324 dag OOL, dag IOL, string asmstr,
325 InstrItinClass itin, list<dag> pattern>
326 : I2<opcode1, opcode2, OOL, IOL, asmstr, itin> {
330 let Pattern = pattern;
338 let Inst{43-47} = Addr{20-16}; // Base Reg
339 let Inst{48-63} = Addr{15-0}; // Displacement
342 // This is used to emit BL8+NOP.
343 class IForm_and_DForm_4_zero<bits<6> opcode1, bit aa, bit lk, bits<6> opcode2,
344 dag OOL, dag IOL, string asmstr,
345 InstrItinClass itin, list<dag> pattern>
346 : IForm_and_DForm_1<opcode1, aa, lk, opcode2,
347 OOL, IOL, asmstr, itin, pattern> {
352 class DForm_5<bits<6> opcode, dag OOL, dag IOL, string asmstr,
354 : I<opcode, OOL, IOL, asmstr, itin> {
363 let Inst{11-15} = RA;
367 class DForm_5_ext<bits<6> opcode, dag OOL, dag IOL, string asmstr,
369 : DForm_5<opcode, OOL, IOL, asmstr, itin> {
373 class DForm_6<bits<6> opcode, dag OOL, dag IOL, string asmstr,
375 : DForm_5<opcode, OOL, IOL, asmstr, itin>;
377 class DForm_6_ext<bits<6> opcode, dag OOL, dag IOL, string asmstr,
379 : DForm_6<opcode, OOL, IOL, asmstr, itin> {
385 class DSForm_1<bits<6> opcode, bits<2> xo, dag OOL, dag IOL, string asmstr,
386 InstrItinClass itin, list<dag> pattern>
387 : I<opcode, OOL, IOL, asmstr, itin> {
391 let Pattern = pattern;
393 let Inst{6-10} = RST;
394 let Inst{11-15} = DS_RA{18-14}; // Register #
395 let Inst{16-29} = DS_RA{13-0}; // Displacement.
396 let Inst{30-31} = xo;
399 // ISA V3.0B 1.6.6 DX-Form
400 class DXForm<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
401 InstrItinClass itin, list<dag> pattern>
402 : I<opcode, OOL, IOL, asmstr, itin> {
406 let Pattern = pattern;
409 let Inst{11-15} = D{5-1}; // d1
410 let Inst{16-25} = D{15-6}; // d0
411 let Inst{26-30} = xo;
412 let Inst{31} = D{0}; // d2
415 // DQ-Form: [PO T RA DQ TX XO] or [PO S RA DQ SX XO]
416 class DQ_RD6_RS5_DQ12<bits<6> opcode, bits<3> xo, dag OOL, dag IOL,
417 string asmstr, InstrItinClass itin, list<dag> pattern>
418 : I<opcode, OOL, IOL, asmstr, itin> {
422 let Pattern = pattern;
424 let Inst{6-10} = XT{4-0};
425 let Inst{11-15} = DS_RA{16-12}; // Register #
426 let Inst{16-27} = DS_RA{11-0}; // Displacement.
427 let Inst{28} = XT{5};
428 let Inst{29-31} = xo;
432 class XForm_base_r3xo<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
433 InstrItinClass itin, list<dag> pattern>
434 : I<opcode, OOL, IOL, asmstr, itin> {
439 let Pattern = pattern;
441 bit RC = 0; // set by isDOT
443 let Inst{6-10} = RST;
446 let Inst{21-30} = xo;
450 class XForm_base_r3xo_memOp<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
451 string asmstr, InstrItinClass itin,
453 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern>, XFormMemOp;
455 class XForm_tlb<bits<10> xo, dag OOL, dag IOL, string asmstr,
456 InstrItinClass itin> : XForm_base_r3xo<31, xo, OOL, IOL, asmstr, itin, []> {
460 class XForm_attn<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
462 : I<opcode, OOL, IOL, asmstr, itin> {
463 let Inst{21-30} = xo;
466 // This is the same as XForm_base_r3xo, but the first two operands are swapped
467 // when code is emitted.
468 class XForm_base_r3xo_swapped
469 <bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
471 : I<opcode, OOL, IOL, asmstr, itin> {
476 bit RC = 0; // set by isDOT
478 let Inst{6-10} = RST;
481 let Inst{21-30} = xo;
486 class XForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
487 InstrItinClass itin, list<dag> pattern>
488 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern>;
490 class XForm_1_memOp<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
491 InstrItinClass itin, list<dag> pattern>
492 : XForm_base_r3xo_memOp<opcode, xo, OOL, IOL, asmstr, itin, pattern>;
494 class XForm_1a<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
495 InstrItinClass itin, list<dag> pattern>
496 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
500 class XForm_rs<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
501 InstrItinClass itin, list<dag> pattern>
502 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
507 class XForm_tlbws<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
508 InstrItinClass itin, list<dag> pattern>
509 : I<opcode, OOL, IOL, asmstr, itin> {
514 let Pattern = pattern;
516 let Inst{6-10} = RST;
519 let Inst{21-30} = xo;
523 class XForm_6<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
524 InstrItinClass itin, list<dag> pattern>
525 : XForm_base_r3xo_swapped<opcode, xo, OOL, IOL, asmstr, itin> {
526 let Pattern = pattern;
529 class XForm_8<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
530 InstrItinClass itin, list<dag> pattern>
531 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern>;
533 class XForm_8_memOp<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
534 InstrItinClass itin, list<dag> pattern>
535 : XForm_base_r3xo_memOp<opcode, xo, OOL, IOL, asmstr, itin, pattern>;
537 class XForm_10<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
538 InstrItinClass itin, list<dag> pattern>
539 : XForm_base_r3xo_swapped<opcode, xo, OOL, IOL, asmstr, itin> {
540 let Pattern = pattern;
543 class XForm_11<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
544 InstrItinClass itin, list<dag> pattern>
545 : XForm_base_r3xo_swapped<opcode, xo, OOL, IOL, asmstr, itin> {
547 let Pattern = pattern;
550 class XForm_16<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
552 : I<opcode, OOL, IOL, asmstr, itin> {
561 let Inst{11-15} = RA;
562 let Inst{16-20} = RB;
563 let Inst{21-30} = xo;
567 class XForm_icbt<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
569 : I<opcode, OOL, IOL, asmstr, itin> {
576 let Inst{11-15} = RA;
577 let Inst{16-20} = RB;
578 let Inst{21-30} = xo;
582 class XForm_sr<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
584 : I<opcode, OOL, IOL, asmstr, itin> {
589 let Inst{12-15} = SR;
590 let Inst{21-30} = xo;
593 class XForm_mbar<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
595 : I<opcode, OOL, IOL, asmstr, itin> {
599 let Inst{21-30} = xo;
602 class XForm_srin<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
604 : I<opcode, OOL, IOL, asmstr, itin> {
609 let Inst{16-20} = RB;
610 let Inst{21-30} = xo;
613 class XForm_mtmsr<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
615 : I<opcode, OOL, IOL, asmstr, itin> {
621 let Inst{21-30} = xo;
624 class XForm_16_ext<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
626 : XForm_16<opcode, xo, OOL, IOL, asmstr, itin> {
630 class XForm_17<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
632 : I<opcode, OOL, IOL, asmstr, itin> {
639 let Inst{11-15} = FRA;
640 let Inst{16-20} = FRB;
641 let Inst{21-30} = xo;
645 class XForm_17a<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
647 : XForm_17<opcode, xo, OOL, IOL, asmstr, itin > {
652 class XForm_18<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
653 InstrItinClass itin, list<dag> pattern>
654 : I<opcode, OOL, IOL, asmstr, itin> {
659 let Pattern = pattern;
661 let Inst{6-10} = FRT;
662 let Inst{11-15} = FRA;
663 let Inst{16-20} = FRB;
664 let Inst{21-30} = xo;
668 class XForm_19<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
669 InstrItinClass itin, list<dag> pattern>
670 : XForm_18<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
674 class XForm_20<bits<6> opcode, bits<6> xo, dag OOL, dag IOL, string asmstr,
675 InstrItinClass itin, list<dag> pattern>
676 : I<opcode, OOL, IOL, asmstr, itin> {
682 let Pattern = pattern;
684 let Inst{6-10} = FRT;
685 let Inst{11-15} = FRA;
686 let Inst{16-20} = FRB;
687 let Inst{21-24} = tttt;
688 let Inst{25-30} = xo;
692 class XForm_24<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
693 InstrItinClass itin, list<dag> pattern>
694 : I<opcode, OOL, IOL, asmstr, itin> {
695 let Pattern = pattern;
699 let Inst{21-30} = xo;
703 class XForm_24_sync<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
704 string asmstr, InstrItinClass itin, list<dag> pattern>
705 : I<opcode, OOL, IOL, asmstr, itin> {
708 let Pattern = pattern;
713 let Inst{21-30} = xo;
717 class XForm_24_eieio<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
718 string asmstr, InstrItinClass itin, list<dag> pattern>
719 : XForm_24_sync<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
723 class XForm_25<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
724 InstrItinClass itin, list<dag> pattern>
725 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
728 class XForm_25_memOp<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
729 string asmstr, InstrItinClass itin, list<dag> pattern>
730 : XForm_base_r3xo_memOp<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
733 class XForm_26<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
734 InstrItinClass itin, list<dag> pattern>
735 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
739 class XForm_28_memOp<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
740 string asmstr, InstrItinClass itin, list<dag> pattern>
741 : XForm_base_r3xo_memOp<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
744 class XForm_28<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
745 InstrItinClass itin, list<dag> pattern>
746 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
749 // This is used for MFFS, MTFSB0, MTFSB1. 42 is arbitrary; this series of
750 // numbers presumably relates to some document, but I haven't found it.
751 class XForm_42<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
752 InstrItinClass itin, list<dag> pattern>
753 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
754 let Pattern = pattern;
756 bit RC = 0; // set by isDOT
758 let Inst{6-10} = RST;
760 let Inst{21-30} = xo;
763 class XForm_43<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
764 InstrItinClass itin, list<dag> pattern>
765 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
766 let Pattern = pattern;
769 bit RC = 0; // set by isDOT
773 let Inst{21-30} = xo;
777 class XForm_44<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
779 : I<opcode, OOL, IOL, asmstr, itin> {
784 let Inst{11-13} = BFA;
787 let Inst{21-30} = xo;
791 class XForm_45<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
793 : I<opcode, OOL, IOL, asmstr, itin> {
801 let Inst{21-30} = xo;
805 class X_FRT5_XO2_XO3_XO10<bits<6> opcode, bits<2> xo1, bits<3> xo2, bits<10> xo,
806 dag OOL, dag IOL, string asmstr, InstrItinClass itin,
808 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
809 let Pattern = pattern;
811 let Inst{6-10} = RST;
812 let Inst{11-12} = xo1;
813 let Inst{13-15} = xo2;
815 let Inst{21-30} = xo;
819 class X_FRT5_XO2_XO3_FRB5_XO10<bits<6> opcode, bits<2> xo1, bits<3> xo2,
820 bits<10> xo, dag OOL, dag IOL, string asmstr,
821 InstrItinClass itin, list<dag> pattern>
822 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
823 let Pattern = pattern;
826 let Inst{6-10} = RST;
827 let Inst{11-12} = xo1;
828 let Inst{13-15} = xo2;
829 let Inst{16-20} = FRB;
830 let Inst{21-30} = xo;
834 class X_FRT5_XO2_XO3_DRM3_XO10<bits<6> opcode, bits<2> xo1, bits<3> xo2,
835 bits<10> xo, dag OOL, dag IOL, string asmstr,
836 InstrItinClass itin, list<dag> pattern>
837 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
838 let Pattern = pattern;
841 let Inst{6-10} = RST;
842 let Inst{11-12} = xo1;
843 let Inst{13-15} = xo2;
845 let Inst{18-20} = DRM;
846 let Inst{21-30} = xo;
850 class X_FRT5_XO2_XO3_RM2_X10<bits<6> opcode, bits<2> xo1, bits<3> xo2,
851 bits<10> xo, dag OOL, dag IOL, string asmstr,
852 InstrItinClass itin, list<dag> pattern>
853 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
854 let Pattern = pattern;
857 let Inst{6-10} = RST;
858 let Inst{11-12} = xo1;
859 let Inst{13-15} = xo2;
861 let Inst{19-20} = RM;
862 let Inst{21-30} = xo;
867 class XForm_0<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
868 InstrItinClass itin, list<dag> pattern>
869 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
875 class XForm_16b<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
876 InstrItinClass itin, list<dag> pattern>
877 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
882 class XForm_htm0<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
883 string asmstr, InstrItinClass itin, list<dag> pattern>
884 : I<opcode, OOL, IOL, asmstr, itin> {
892 let Inst{21-30} = xo;
896 class XForm_htm1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
897 string asmstr, InstrItinClass itin, list<dag> pattern>
898 : I<opcode, OOL, IOL, asmstr, itin> {
905 let Inst{21-30} = xo;
909 class XForm_htm2<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
910 InstrItinClass itin, list<dag> pattern>
911 : I<opcode, OOL, IOL, asmstr, itin> {
914 bit RC = 0; // set by isDOT
919 let Inst{21-30} = xo;
923 class XForm_htm3<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
924 InstrItinClass itin, list<dag> pattern>
925 : I<opcode, OOL, IOL, asmstr, itin> {
932 let Inst{21-30} = xo;
936 // [PO RT RA RB XO /]
937 class X_BF3_L1_RS5_RS5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
938 string asmstr, InstrItinClass itin, list<dag> pattern>
939 : I<opcode, OOL, IOL, asmstr, itin> {
945 let Pattern = pattern;
950 let Inst{11-15} = RA;
951 let Inst{16-20} = RB;
952 let Inst{21-30} = xo;
956 // Same as XForm_17 but with GPR's and new naming convention
957 class X_BF3_RS5_RS5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
958 string asmstr, InstrItinClass itin, list<dag> pattern>
959 : I<opcode, OOL, IOL, asmstr, itin> {
964 let Pattern = pattern;
968 let Inst{11-15} = RA;
969 let Inst{16-20} = RB;
970 let Inst{21-30} = xo;
974 // e.g. [PO VRT XO VRB XO /] or [PO VRT XO VRB XO RO]
975 class X_RD5_XO5_RS5<bits<6> opcode, bits<5> xo2, bits<10> xo, dag OOL, dag IOL,
976 string asmstr, InstrItinClass itin, list<dag> pattern>
977 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
981 class X_BF3_DCMX7_RS5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
982 string asmstr, InstrItinClass itin, list<dag> pattern>
983 : I<opcode, OOL, IOL, asmstr, itin> {
988 let Pattern = pattern;
991 let Inst{9-15} = DCMX;
992 let Inst{16-20} = VB;
993 let Inst{21-30} = xo;
997 class X_RD6_IMM8<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
998 string asmstr, InstrItinClass itin, list<dag> pattern>
999 : I<opcode, OOL, IOL, asmstr, itin> {
1003 let Pattern = pattern;
1005 let Inst{6-10} = XT{4-0};
1006 let Inst{11-12} = 0;
1007 let Inst{13-20} = IMM8;
1008 let Inst{21-30} = xo;
1009 let Inst{31} = XT{5};
1012 // XForm_base_r3xo for instructions such as P9 atomics where we don't want
1013 // to specify an SDAG pattern for matching.
1014 class X_RD5_RS5_IM5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
1015 string asmstr, InstrItinClass itin>
1016 : XForm_base_r3xo_memOp<opcode, xo, OOL, IOL, asmstr, itin, []> {
1019 class X_BF3<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
1020 InstrItinClass itin>
1021 : XForm_17<opcode, xo, OOL, IOL, asmstr, itin> {
1026 // [PO /// L RA RB XO /]
1027 class X_L1_RS5_RS5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
1028 string asmstr, InstrItinClass itin, list<dag> pattern>
1029 : XForm_16<opcode, xo, OOL, IOL, asmstr, itin> {
1031 let Pattern = pattern;
1038 class XX1Form<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
1039 InstrItinClass itin, list<dag> pattern>
1040 : I<opcode, OOL, IOL, asmstr, itin> {
1045 let Pattern = pattern;
1047 let Inst{6-10} = XT{4-0};
1048 let Inst{11-15} = A;
1049 let Inst{16-20} = B;
1050 let Inst{21-30} = xo;
1051 let Inst{31} = XT{5};
1054 class XX1Form_memOp<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
1055 string asmstr, InstrItinClass itin, list<dag> pattern>
1056 : XX1Form<opcode, xo, OOL, IOL, asmstr, itin, pattern>, XFormMemOp;
1058 class XX1_RS6_RD5_XO<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
1059 string asmstr, InstrItinClass itin, list<dag> pattern>
1060 : XX1Form<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
1064 class XX2Form<bits<6> opcode, bits<9> xo, dag OOL, dag IOL, string asmstr,
1065 InstrItinClass itin, list<dag> pattern>
1066 : I<opcode, OOL, IOL, asmstr, itin> {
1070 let Pattern = pattern;
1072 let Inst{6-10} = XT{4-0};
1073 let Inst{11-15} = 0;
1074 let Inst{16-20} = XB{4-0};
1075 let Inst{21-29} = xo;
1076 let Inst{30} = XB{5};
1077 let Inst{31} = XT{5};
1080 class XX2Form_1<bits<6> opcode, bits<9> xo, dag OOL, dag IOL, string asmstr,
1081 InstrItinClass itin, list<dag> pattern>
1082 : I<opcode, OOL, IOL, asmstr, itin> {
1086 let Pattern = pattern;
1090 let Inst{16-20} = XB{4-0};
1091 let Inst{21-29} = xo;
1092 let Inst{30} = XB{5};
1096 class XX2Form_2<bits<6> opcode, bits<9> xo, dag OOL, dag IOL, string asmstr,
1097 InstrItinClass itin, list<dag> pattern>
1098 : I<opcode, OOL, IOL, asmstr, itin> {
1103 let Pattern = pattern;
1105 let Inst{6-10} = XT{4-0};
1106 let Inst{11-13} = 0;
1107 let Inst{14-15} = D;
1108 let Inst{16-20} = XB{4-0};
1109 let Inst{21-29} = xo;
1110 let Inst{30} = XB{5};
1111 let Inst{31} = XT{5};
1114 class XX2_RD6_UIM5_RS6<bits<6> opcode, bits<9> xo, dag OOL, dag IOL,
1115 string asmstr, InstrItinClass itin, list<dag> pattern>
1116 : I<opcode, OOL, IOL, asmstr, itin> {
1121 let Pattern = pattern;
1123 let Inst{6-10} = XT{4-0};
1124 let Inst{11-15} = UIM5;
1125 let Inst{16-20} = XB{4-0};
1126 let Inst{21-29} = xo;
1127 let Inst{30} = XB{5};
1128 let Inst{31} = XT{5};
1131 // [PO T XO B XO BX /]
1132 class XX2_RD5_XO5_RS6<bits<6> opcode, bits<5> xo2, bits<9> xo, dag OOL, dag IOL,
1133 string asmstr, InstrItinClass itin, list<dag> pattern>
1134 : I<opcode, OOL, IOL, asmstr, itin> {
1138 let Pattern = pattern;
1140 let Inst{6-10} = RT;
1141 let Inst{11-15} = xo2;
1142 let Inst{16-20} = XB{4-0};
1143 let Inst{21-29} = xo;
1144 let Inst{30} = XB{5};
1148 // [PO T XO B XO BX TX]
1149 class XX2_RD6_XO5_RS6<bits<6> opcode, bits<5> xo2, bits<9> xo, dag OOL, dag IOL,
1150 string asmstr, InstrItinClass itin, list<dag> pattern>
1151 : I<opcode, OOL, IOL, asmstr, itin> {
1155 let Pattern = pattern;
1157 let Inst{6-10} = XT{4-0};
1158 let Inst{11-15} = xo2;
1159 let Inst{16-20} = XB{4-0};
1160 let Inst{21-29} = xo;
1161 let Inst{30} = XB{5};
1162 let Inst{31} = XT{5};
1165 class XX2_BF3_DCMX7_RS6<bits<6> opcode, bits<9> xo, dag OOL, dag IOL,
1166 string asmstr, InstrItinClass itin, list<dag> pattern>
1167 : I<opcode, OOL, IOL, asmstr, itin> {
1172 let Pattern = pattern;
1175 let Inst{9-15} = DCMX;
1176 let Inst{16-20} = XB{4-0};
1177 let Inst{21-29} = xo;
1178 let Inst{30} = XB{5};
1182 class XX2_RD6_DCMX7_RS6<bits<6> opcode, bits<4> xo1, bits<3> xo2,
1183 dag OOL, dag IOL, string asmstr, InstrItinClass itin,
1185 : I<opcode, OOL, IOL, asmstr, itin> {
1190 let Pattern = pattern;
1192 let Inst{6-10} = XT{4-0};
1193 let Inst{11-15} = DCMX{4-0};
1194 let Inst{16-20} = XB{4-0};
1195 let Inst{21-24} = xo1;
1196 let Inst{25} = DCMX{5};
1197 let Inst{26-28} = xo2;
1198 let Inst{29} = DCMX{6};
1199 let Inst{30} = XB{5};
1200 let Inst{31} = XT{5};
1203 class XX3Form<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, string asmstr,
1204 InstrItinClass itin, list<dag> pattern>
1205 : I<opcode, OOL, IOL, asmstr, itin> {
1210 let Pattern = pattern;
1212 let Inst{6-10} = XT{4-0};
1213 let Inst{11-15} = XA{4-0};
1214 let Inst{16-20} = XB{4-0};
1215 let Inst{21-28} = xo;
1216 let Inst{29} = XA{5};
1217 let Inst{30} = XB{5};
1218 let Inst{31} = XT{5};
1221 class XX3Form_Zero<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, string asmstr,
1222 InstrItinClass itin, list<dag> pattern>
1223 : XX3Form<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
1228 class XX3Form_SetZero<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, string asmstr,
1229 InstrItinClass itin, list<dag> pattern>
1230 : XX3Form<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
1235 class XX3Form_1<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, string asmstr,
1236 InstrItinClass itin, list<dag> pattern>
1237 : I<opcode, OOL, IOL, asmstr, itin> {
1242 let Pattern = pattern;
1246 let Inst{11-15} = XA{4-0};
1247 let Inst{16-20} = XB{4-0};
1248 let Inst{21-28} = xo;
1249 let Inst{29} = XA{5};
1250 let Inst{30} = XB{5};
1254 class XX3Form_2<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
1255 InstrItinClass itin, list<dag> pattern>
1256 : I<opcode, OOL, IOL, asmstr, itin> {
1262 let Pattern = pattern;
1264 let Inst{6-10} = XT{4-0};
1265 let Inst{11-15} = XA{4-0};
1266 let Inst{16-20} = XB{4-0};
1268 let Inst{22-23} = D;
1269 let Inst{24-28} = xo;
1270 let Inst{29} = XA{5};
1271 let Inst{30} = XB{5};
1272 let Inst{31} = XT{5};
1275 class XX3Form_Rc<bits<6> opcode, bits<7> xo, dag OOL, dag IOL, string asmstr,
1276 InstrItinClass itin, list<dag> pattern>
1277 : I<opcode, OOL, IOL, asmstr, itin> {
1282 let Pattern = pattern;
1284 bit RC = 0; // set by isDOT
1286 let Inst{6-10} = XT{4-0};
1287 let Inst{11-15} = XA{4-0};
1288 let Inst{16-20} = XB{4-0};
1290 let Inst{22-28} = xo;
1291 let Inst{29} = XA{5};
1292 let Inst{30} = XB{5};
1293 let Inst{31} = XT{5};
1296 class XX4Form<bits<6> opcode, bits<2> xo, dag OOL, dag IOL, string asmstr,
1297 InstrItinClass itin, list<dag> pattern>
1298 : I<opcode, OOL, IOL, asmstr, itin> {
1304 let Pattern = pattern;
1306 let Inst{6-10} = XT{4-0};
1307 let Inst{11-15} = XA{4-0};
1308 let Inst{16-20} = XB{4-0};
1309 let Inst{21-25} = XC{4-0};
1310 let Inst{26-27} = xo;
1311 let Inst{28} = XC{5};
1312 let Inst{29} = XA{5};
1313 let Inst{30} = XB{5};
1314 let Inst{31} = XT{5};
1317 // DCB_Form - Form X instruction, used for dcb* instructions.
1318 class DCB_Form<bits<10> xo, bits<5> immfield, dag OOL, dag IOL, string asmstr,
1319 InstrItinClass itin, list<dag> pattern>
1320 : I<31, OOL, IOL, asmstr, itin> {
1324 let Pattern = pattern;
1326 let Inst{6-10} = immfield;
1327 let Inst{11-15} = A;
1328 let Inst{16-20} = B;
1329 let Inst{21-30} = xo;
1333 class DCB_Form_hint<bits<10> xo, dag OOL, dag IOL, string asmstr,
1334 InstrItinClass itin, list<dag> pattern>
1335 : I<31, OOL, IOL, asmstr, itin> {
1340 let Pattern = pattern;
1342 let Inst{6-10} = TH;
1343 let Inst{11-15} = A;
1344 let Inst{16-20} = B;
1345 let Inst{21-30} = xo;
1349 // DSS_Form - Form X instruction, used for altivec dss* instructions.
1350 class DSS_Form<bits<1> T, bits<10> xo, dag OOL, dag IOL, string asmstr,
1351 InstrItinClass itin, list<dag> pattern>
1352 : I<31, OOL, IOL, asmstr, itin> {
1357 let Pattern = pattern;
1361 let Inst{9-10} = STRM;
1362 let Inst{11-15} = A;
1363 let Inst{16-20} = B;
1364 let Inst{21-30} = xo;
1369 class XLForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
1370 InstrItinClass itin, list<dag> pattern>
1371 : I<opcode, OOL, IOL, asmstr, itin> {
1376 let Pattern = pattern;
1378 let Inst{6-10} = CRD;
1379 let Inst{11-15} = CRA;
1380 let Inst{16-20} = CRB;
1381 let Inst{21-30} = xo;
1385 class XLForm_1_np<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
1386 InstrItinClass itin, list<dag> pattern>
1387 : XLForm_1<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
1393 class XLForm_1_gen<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
1394 InstrItinClass itin, list<dag> pattern>
1395 : XLForm_1<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
1404 class XLForm_1_ext<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
1405 InstrItinClass itin, list<dag> pattern>
1406 : I<opcode, OOL, IOL, asmstr, itin> {
1409 let Pattern = pattern;
1411 let Inst{6-10} = CRD;
1412 let Inst{11-15} = CRD;
1413 let Inst{16-20} = CRD;
1414 let Inst{21-30} = xo;
1418 class XLForm_2<bits<6> opcode, bits<10> xo, bit lk, dag OOL, dag IOL, string asmstr,
1419 InstrItinClass itin, list<dag> pattern>
1420 : I<opcode, OOL, IOL, asmstr, itin> {
1425 let Pattern = pattern;
1427 let Inst{6-10} = BO;
1428 let Inst{11-15} = BI;
1429 let Inst{16-18} = 0;
1430 let Inst{19-20} = BH;
1431 let Inst{21-30} = xo;
1435 class XLForm_2_br<bits<6> opcode, bits<10> xo, bit lk,
1436 dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern>
1437 : XLForm_2<opcode, xo, lk, OOL, IOL, asmstr, itin, pattern> {
1438 bits<7> BIBO; // 2 bits of BI and 5 bits of BO.
1442 let BI{0-1} = BIBO{5-6};
1443 let BI{2-4} = CR{0-2};
1447 class XLForm_2_br2<bits<6> opcode, bits<10> xo, bits<5> bo, bit lk,
1448 dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern>
1449 : XLForm_2<opcode, xo, lk, OOL, IOL, asmstr, itin, pattern> {
1454 class XLForm_2_ext<bits<6> opcode, bits<10> xo, bits<5> bo, bits<5> bi, bit lk,
1455 dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern>
1456 : XLForm_2<opcode, xo, lk, OOL, IOL, asmstr, itin, pattern> {
1462 class XLForm_3<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
1463 InstrItinClass itin>
1464 : I<opcode, OOL, IOL, asmstr, itin> {
1470 let Inst{11-13} = BFA;
1471 let Inst{14-15} = 0;
1472 let Inst{16-20} = 0;
1473 let Inst{21-30} = xo;
1477 class XLForm_4<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
1478 InstrItinClass itin>
1479 : I<opcode, OOL, IOL, asmstr, itin> {
1488 let Inst{11-14} = 0;
1490 let Inst{16-19} = U;
1492 let Inst{21-30} = xo;
1496 class XLForm_S<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
1497 InstrItinClass itin, list<dag> pattern>
1498 : I<opcode, OOL, IOL, asmstr, itin> {
1501 let Pattern = pattern;
1505 let Inst{21-30} = xo;
1509 class XLForm_2_and_DSForm_1<bits<6> opcode1, bits<10> xo1, bit lk,
1510 bits<6> opcode2, bits<2> xo2,
1511 dag OOL, dag IOL, string asmstr,
1512 InstrItinClass itin, list<dag> pattern>
1513 : I2<opcode1, opcode2, OOL, IOL, asmstr, itin> {
1521 let Pattern = pattern;
1523 let Inst{6-10} = BO;
1524 let Inst{11-15} = BI;
1525 let Inst{16-18} = 0;
1526 let Inst{19-20} = BH;
1527 let Inst{21-30} = xo1;
1530 let Inst{38-42} = RST;
1531 let Inst{43-47} = DS_RA{18-14}; // Register #
1532 let Inst{48-61} = DS_RA{13-0}; // Displacement.
1533 let Inst{62-63} = xo2;
1536 class XLForm_2_ext_and_DSForm_1<bits<6> opcode1, bits<10> xo1,
1537 bits<5> bo, bits<5> bi, bit lk,
1538 bits<6> opcode2, bits<2> xo2,
1539 dag OOL, dag IOL, string asmstr,
1540 InstrItinClass itin, list<dag> pattern>
1541 : XLForm_2_and_DSForm_1<opcode1, xo1, lk, opcode2, xo2,
1542 OOL, IOL, asmstr, itin, pattern> {
1549 class XFXForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
1550 InstrItinClass itin>
1551 : I<opcode, OOL, IOL, asmstr, itin> {
1555 let Inst{6-10} = RT;
1556 let Inst{11} = SPR{4};
1557 let Inst{12} = SPR{3};
1558 let Inst{13} = SPR{2};
1559 let Inst{14} = SPR{1};
1560 let Inst{15} = SPR{0};
1561 let Inst{16} = SPR{9};
1562 let Inst{17} = SPR{8};
1563 let Inst{18} = SPR{7};
1564 let Inst{19} = SPR{6};
1565 let Inst{20} = SPR{5};
1566 let Inst{21-30} = xo;
1570 class XFXForm_1_ext<bits<6> opcode, bits<10> xo, bits<10> spr,
1571 dag OOL, dag IOL, string asmstr, InstrItinClass itin>
1572 : XFXForm_1<opcode, xo, OOL, IOL, asmstr, itin> {
1576 class XFXForm_3<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
1577 InstrItinClass itin>
1578 : I<opcode, OOL, IOL, asmstr, itin> {
1581 let Inst{6-10} = RT;
1582 let Inst{11-20} = 0;
1583 let Inst{21-30} = xo;
1587 class XFXForm_3p<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
1588 InstrItinClass itin, list<dag> pattern>
1589 : I<opcode, OOL, IOL, asmstr, itin> {
1592 let Pattern = pattern;
1594 let Inst{6-10} = RT;
1595 let Inst{11-20} = Entry;
1596 let Inst{21-30} = xo;
1600 class XFXForm_5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
1601 InstrItinClass itin>
1602 : I<opcode, OOL, IOL, asmstr, itin> {
1606 let Inst{6-10} = rS;
1608 let Inst{12-19} = FXM;
1610 let Inst{21-30} = xo;
1614 class XFXForm_5a<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
1615 InstrItinClass itin>
1616 : I<opcode, OOL, IOL, asmstr, itin> {
1620 let Inst{6-10} = ST;
1622 let Inst{12-19} = FXM;
1624 let Inst{21-30} = xo;
1628 class XFXForm_7<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
1629 InstrItinClass itin>
1630 : XFXForm_1<opcode, xo, OOL, IOL, asmstr, itin>;
1632 class XFXForm_7_ext<bits<6> opcode, bits<10> xo, bits<10> spr,
1633 dag OOL, dag IOL, string asmstr, InstrItinClass itin>
1634 : XFXForm_7<opcode, xo, OOL, IOL, asmstr, itin> {
1639 // This is probably 1.7.9, but I don't have the reference that uses this
1640 // numbering scheme...
1641 class XFLForm<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
1642 InstrItinClass itin, list<dag>pattern>
1643 : I<opcode, OOL, IOL, asmstr, itin> {
1647 bit RC = 0; // set by isDOT
1648 let Pattern = pattern;
1651 let Inst{7-14} = FM;
1653 let Inst{16-20} = rT;
1654 let Inst{21-30} = xo;
1658 class XFLForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
1659 InstrItinClass itin, list<dag>pattern>
1660 : I<opcode, OOL, IOL, asmstr, itin> {
1666 bit RC = 0; // set by isDOT
1667 let Pattern = pattern;
1670 let Inst{7-14} = FLM;
1672 let Inst{16-20} = FRB;
1673 let Inst{21-30} = xo;
1677 // 1.7.10 XS-Form - SRADI.
1678 class XSForm_1<bits<6> opcode, bits<9> xo, dag OOL, dag IOL, string asmstr,
1679 InstrItinClass itin, list<dag> pattern>
1680 : I<opcode, OOL, IOL, asmstr, itin> {
1685 bit RC = 0; // set by isDOT
1686 let Pattern = pattern;
1688 let Inst{6-10} = RS;
1689 let Inst{11-15} = A;
1690 let Inst{16-20} = SH{4,3,2,1,0};
1691 let Inst{21-29} = xo;
1692 let Inst{30} = SH{5};
1697 class XOForm_1<bits<6> opcode, bits<9> xo, bit oe, dag OOL, dag IOL, string asmstr,
1698 InstrItinClass itin, list<dag> pattern>
1699 : I<opcode, OOL, IOL, asmstr, itin> {
1704 let Pattern = pattern;
1706 bit RC = 0; // set by isDOT
1708 let Inst{6-10} = RT;
1709 let Inst{11-15} = RA;
1710 let Inst{16-20} = RB;
1712 let Inst{22-30} = xo;
1716 class XOForm_3<bits<6> opcode, bits<9> xo, bit oe,
1717 dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern>
1718 : XOForm_1<opcode, xo, oe, OOL, IOL, asmstr, itin, pattern> {
1723 class AForm_1<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
1724 InstrItinClass itin, list<dag> pattern>
1725 : I<opcode, OOL, IOL, asmstr, itin> {
1731 let Pattern = pattern;
1733 bit RC = 0; // set by isDOT
1735 let Inst{6-10} = FRT;
1736 let Inst{11-15} = FRA;
1737 let Inst{16-20} = FRB;
1738 let Inst{21-25} = FRC;
1739 let Inst{26-30} = xo;
1743 class AForm_2<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
1744 InstrItinClass itin, list<dag> pattern>
1745 : AForm_1<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
1749 class AForm_3<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
1750 InstrItinClass itin, list<dag> pattern>
1751 : AForm_1<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
1755 class AForm_4<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
1756 InstrItinClass itin, list<dag> pattern>
1757 : I<opcode, OOL, IOL, asmstr, itin> {
1763 let Pattern = pattern;
1765 let Inst{6-10} = RT;
1766 let Inst{11-15} = RA;
1767 let Inst{16-20} = RB;
1768 let Inst{21-25} = COND;
1769 let Inst{26-30} = xo;
1774 class AForm_4a<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
1775 InstrItinClass itin, list<dag> pattern>
1776 : AForm_1<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
1782 class MForm_1<bits<6> opcode, dag OOL, dag IOL, string asmstr,
1783 InstrItinClass itin, list<dag> pattern>
1784 : I<opcode, OOL, IOL, asmstr, itin> {
1791 let Pattern = pattern;
1793 bit RC = 0; // set by isDOT
1795 let Inst{6-10} = RS;
1796 let Inst{11-15} = RA;
1797 let Inst{16-20} = RB;
1798 let Inst{21-25} = MB;
1799 let Inst{26-30} = ME;
1803 class MForm_2<bits<6> opcode, dag OOL, dag IOL, string asmstr,
1804 InstrItinClass itin, list<dag> pattern>
1805 : MForm_1<opcode, OOL, IOL, asmstr, itin, pattern> {
1809 class MDForm_1<bits<6> opcode, bits<3> xo, dag OOL, dag IOL, string asmstr,
1810 InstrItinClass itin, list<dag> pattern>
1811 : I<opcode, OOL, IOL, asmstr, itin> {
1817 let Pattern = pattern;
1819 bit RC = 0; // set by isDOT
1821 let Inst{6-10} = RS;
1822 let Inst{11-15} = RA;
1823 let Inst{16-20} = SH{4,3,2,1,0};
1824 let Inst{21-26} = MBE{4,3,2,1,0,5};
1825 let Inst{27-29} = xo;
1826 let Inst{30} = SH{5};
1830 class MDSForm_1<bits<6> opcode, bits<4> xo, dag OOL, dag IOL, string asmstr,
1831 InstrItinClass itin, list<dag> pattern>
1832 : I<opcode, OOL, IOL, asmstr, itin> {
1838 let Pattern = pattern;
1840 bit RC = 0; // set by isDOT
1842 let Inst{6-10} = RS;
1843 let Inst{11-15} = RA;
1844 let Inst{16-20} = RB;
1845 let Inst{21-26} = MBE{4,3,2,1,0,5};
1846 let Inst{27-30} = xo;
1853 // VAForm_1 - DACB ordering.
1854 class VAForm_1<bits<6> xo, dag OOL, dag IOL, string asmstr,
1855 InstrItinClass itin, list<dag> pattern>
1856 : I<4, OOL, IOL, asmstr, itin> {
1862 let Pattern = pattern;
1864 let Inst{6-10} = VD;
1865 let Inst{11-15} = VA;
1866 let Inst{16-20} = VB;
1867 let Inst{21-25} = VC;
1868 let Inst{26-31} = xo;
1871 // VAForm_1a - DABC ordering.
1872 class VAForm_1a<bits<6> xo, dag OOL, dag IOL, string asmstr,
1873 InstrItinClass itin, list<dag> pattern>
1874 : I<4, OOL, IOL, asmstr, itin> {
1880 let Pattern = pattern;
1882 let Inst{6-10} = VD;
1883 let Inst{11-15} = VA;
1884 let Inst{16-20} = VB;
1885 let Inst{21-25} = VC;
1886 let Inst{26-31} = xo;
1889 class VAForm_2<bits<6> xo, dag OOL, dag IOL, string asmstr,
1890 InstrItinClass itin, list<dag> pattern>
1891 : I<4, OOL, IOL, asmstr, itin> {
1897 let Pattern = pattern;
1899 let Inst{6-10} = VD;
1900 let Inst{11-15} = VA;
1901 let Inst{16-20} = VB;
1903 let Inst{22-25} = SH;
1904 let Inst{26-31} = xo;
1908 class VXForm_1<bits<11> xo, dag OOL, dag IOL, string asmstr,
1909 InstrItinClass itin, list<dag> pattern>
1910 : I<4, OOL, IOL, asmstr, itin> {
1915 let Pattern = pattern;
1917 let Inst{6-10} = VD;
1918 let Inst{11-15} = VA;
1919 let Inst{16-20} = VB;
1920 let Inst{21-31} = xo;
1923 class VXForm_setzero<bits<11> xo, dag OOL, dag IOL, string asmstr,
1924 InstrItinClass itin, list<dag> pattern>
1925 : VXForm_1<xo, OOL, IOL, asmstr, itin, pattern> {
1931 class VXForm_2<bits<11> xo, dag OOL, dag IOL, string asmstr,
1932 InstrItinClass itin, list<dag> pattern>
1933 : I<4, OOL, IOL, asmstr, itin> {
1937 let Pattern = pattern;
1939 let Inst{6-10} = VD;
1940 let Inst{11-15} = 0;
1941 let Inst{16-20} = VB;
1942 let Inst{21-31} = xo;
1945 class VXForm_3<bits<11> xo, dag OOL, dag IOL, string asmstr,
1946 InstrItinClass itin, list<dag> pattern>
1947 : I<4, OOL, IOL, asmstr, itin> {
1951 let Pattern = pattern;
1953 let Inst{6-10} = VD;
1954 let Inst{11-15} = IMM;
1955 let Inst{16-20} = 0;
1956 let Inst{21-31} = xo;
1959 /// VXForm_4 - VX instructions with "VD,0,0" register fields, like mfvscr.
1960 class VXForm_4<bits<11> xo, dag OOL, dag IOL, string asmstr,
1961 InstrItinClass itin, list<dag> pattern>
1962 : I<4, OOL, IOL, asmstr, itin> {
1965 let Pattern = pattern;
1967 let Inst{6-10} = VD;
1968 let Inst{11-15} = 0;
1969 let Inst{16-20} = 0;
1970 let Inst{21-31} = xo;
1973 /// VXForm_5 - VX instructions with "0,0,VB" register fields, like mtvscr.
1974 class VXForm_5<bits<11> xo, dag OOL, dag IOL, string asmstr,
1975 InstrItinClass itin, list<dag> pattern>
1976 : I<4, OOL, IOL, asmstr, itin> {
1979 let Pattern = pattern;
1982 let Inst{11-15} = 0;
1983 let Inst{16-20} = VB;
1984 let Inst{21-31} = xo;
1987 // e.g. [PO VRT EO VRB XO]
1988 class VXForm_RD5_XO5_RS5<bits<11> xo, bits<5> eo, dag OOL, dag IOL,
1989 string asmstr, InstrItinClass itin, list<dag> pattern>
1990 : I<4, OOL, IOL, asmstr, itin> {
1994 let Pattern = pattern;
1996 let Inst{6-10} = RD;
1997 let Inst{11-15} = eo;
1998 let Inst{16-20} = VB;
1999 let Inst{21-31} = xo;
2002 /// VXForm_CR - VX crypto instructions with "VRT, VRA, ST, SIX"
2003 class VXForm_CR<bits<11> xo, dag OOL, dag IOL, string asmstr,
2004 InstrItinClass itin, list<dag> pattern>
2005 : I<4, OOL, IOL, asmstr, itin> {
2011 let Pattern = pattern;
2013 let Inst{6-10} = VD;
2014 let Inst{11-15} = VA;
2016 let Inst{17-20} = SIX;
2017 let Inst{21-31} = xo;
2020 /// VXForm_BX - VX crypto instructions with "VRT, VRA, 0 - like vsbox"
2021 class VXForm_BX<bits<11> xo, dag OOL, dag IOL, string asmstr,
2022 InstrItinClass itin, list<dag> pattern>
2023 : I<4, OOL, IOL, asmstr, itin> {
2027 let Pattern = pattern;
2029 let Inst{6-10} = VD;
2030 let Inst{11-15} = VA;
2031 let Inst{16-20} = 0;
2032 let Inst{21-31} = xo;
2036 class VXRForm_1<bits<10> xo, dag OOL, dag IOL, string asmstr,
2037 InstrItinClass itin, list<dag> pattern>
2038 : I<4, OOL, IOL, asmstr, itin> {
2044 let Pattern = pattern;
2046 let Inst{6-10} = VD;
2047 let Inst{11-15} = VA;
2048 let Inst{16-20} = VB;
2050 let Inst{22-31} = xo;
2053 // VX-Form: [PO VRT EO VRB 1 PS XO]
2054 class VX_RD5_EO5_RS5_PS1_XO9<bits<5> eo, bits<9> xo,
2055 dag OOL, dag IOL, string asmstr,
2056 InstrItinClass itin, list<dag> pattern>
2057 : I<4, OOL, IOL, asmstr, itin> {
2062 let Pattern = pattern;
2064 let Inst{6-10} = VD;
2065 let Inst{11-15} = eo;
2066 let Inst{16-20} = VB;
2069 let Inst{23-31} = xo;
2072 // VX-Form: [PO VRT VRA VRB 1 PS XO] or [PO VRT VRA VRB 1 / XO]
2073 class VX_RD5_RSp5_PS1_XO9<bits<9> xo, dag OOL, dag IOL, string asmstr,
2074 InstrItinClass itin, list<dag> pattern>
2075 : I<4, OOL, IOL, asmstr, itin> {
2081 let Pattern = pattern;
2083 let Inst{6-10} = VD;
2084 let Inst{11-15} = VA;
2085 let Inst{16-20} = VB;
2088 let Inst{23-31} = xo;
2091 // Z23-Form (used by QPX)
2092 class Z23Form_1<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, string asmstr,
2093 InstrItinClass itin, list<dag> pattern>
2094 : I<opcode, OOL, IOL, asmstr, itin> {
2100 let Pattern = pattern;
2102 bit RC = 0; // set by isDOT
2104 let Inst{6-10} = FRT;
2105 let Inst{11-15} = FRA;
2106 let Inst{16-20} = FRB;
2107 let Inst{21-22} = idx;
2108 let Inst{23-30} = xo;
2112 class Z23Form_2<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, string asmstr,
2113 InstrItinClass itin, list<dag> pattern>
2114 : Z23Form_1<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
2118 class Z23Form_3<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, string asmstr,
2119 InstrItinClass itin, list<dag> pattern>
2120 : I<opcode, OOL, IOL, asmstr, itin> {
2124 let Pattern = pattern;
2126 bit RC = 0; // set by isDOT
2128 let Inst{6-10} = FRT;
2129 let Inst{11-22} = idx;
2130 let Inst{23-30} = xo;
2134 class Z23Form_8<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, string asmstr,
2135 InstrItinClass itin, list<dag> pattern>
2136 : I<opcode, OOL, IOL, asmstr, itin> {
2142 let Pattern = pattern;
2144 bit RC = 0; // set by isDOT
2146 let Inst{6-10} = VRT;
2147 let Inst{11-14} = 0;
2149 let Inst{16-20} = VRB;
2150 let Inst{21-22} = idx;
2151 let Inst{23-30} = xo;
2155 //===----------------------------------------------------------------------===//
2156 class Pseudo<dag OOL, dag IOL, string asmstr, list<dag> pattern>
2157 : I<0, OOL, IOL, asmstr, NoItinerary> {
2158 let isCodeGenOnly = 1;
2160 let Pattern = pattern;
2162 let hasNoSchedulingInfo = 1;
2165 class PseudoXFormMemOp<dag OOL, dag IOL, string asmstr, list<dag> pattern>
2166 : Pseudo<OOL, IOL, asmstr, pattern>, XFormMemOp;