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>
18 bit PPC64 = 0; // Default value, override with isPPC64
20 let Namespace = "PPC";
21 let Inst{0-5} = opcode;
22 let OutOperandList = OOL;
23 let InOperandList = IOL;
24 let AsmString = asmstr;
27 bits<1> PPC970_First = 0;
28 bits<1> PPC970_Single = 0;
29 bits<1> PPC970_Cracked = 0;
30 bits<3> PPC970_Unit = 0;
32 /// These fields correspond to the fields in PPCInstrInfo.h. Any changes to
33 /// these must be reflected there! See comments there for what these are.
34 let TSFlags{0} = PPC970_First;
35 let TSFlags{1} = PPC970_Single;
36 let TSFlags{2} = PPC970_Cracked;
37 let TSFlags{5-3} = PPC970_Unit;
40 class PPC970_DGroup_First { bits<1> PPC970_First = 1; }
41 class PPC970_DGroup_Single { bits<1> PPC970_Single = 1; }
42 class PPC970_DGroup_Cracked { bits<1> PPC970_Cracked = 1; }
43 class PPC970_MicroCode;
45 class PPC970_Unit_Pseudo { bits<3> PPC970_Unit = 0; }
46 class PPC970_Unit_FXU { bits<3> PPC970_Unit = 1; }
47 class PPC970_Unit_LSU { bits<3> PPC970_Unit = 2; }
48 class PPC970_Unit_FPU { bits<3> PPC970_Unit = 3; }
49 class PPC970_Unit_CRU { bits<3> PPC970_Unit = 4; }
50 class PPC970_Unit_VALU { bits<3> PPC970_Unit = 5; }
51 class PPC970_Unit_VPERM { bits<3> PPC970_Unit = 6; }
52 class PPC970_Unit_BRU { bits<3> PPC970_Unit = 7; }
56 class IForm<bits<6> opcode, bit aa, bit lk, dag OOL, dag IOL, string asmstr,
57 InstrItinClass itin, list<dag> pattern>
58 : I<opcode, OOL, IOL, asmstr, itin> {
59 let Pattern = pattern;
68 class BForm<bits<6> opcode, bit aa, bit lk, dag OOL, dag IOL, string asmstr>
69 : I<opcode, OOL, IOL, asmstr, BrB> {
70 bits<7> BIBO; // 2 bits of BI and 5 bits of BO.
75 let BI{0-1} = BIBO{5-6};
76 let BI{2-4} = CR{0-2};
78 let Inst{6-10} = BIBO{4-0};
87 class DForm_base<bits<6> opcode, dag OOL, dag IOL, string asmstr,
88 InstrItinClass itin, list<dag> pattern>
89 : I<opcode, OOL, IOL, asmstr, itin> {
94 let Pattern = pattern;
101 class DForm_1<bits<6> opcode, dag OOL, dag IOL, string asmstr,
102 InstrItinClass itin, list<dag> pattern>
103 : I<opcode, OOL, IOL, asmstr, itin> {
108 let Pattern = pattern;
115 class DForm_2<bits<6> opcode, dag OOL, dag IOL, string asmstr,
116 InstrItinClass itin, list<dag> pattern>
117 : DForm_base<opcode, OOL, IOL, asmstr, itin, pattern>;
119 class DForm_2_r0<bits<6> opcode, dag OOL, dag IOL, string asmstr,
120 InstrItinClass itin, list<dag> pattern>
121 : I<opcode, OOL, IOL, asmstr, itin> {
125 let Pattern = pattern;
132 class DForm_4<bits<6> opcode, dag OOL, dag IOL, string asmstr,
133 InstrItinClass itin, list<dag> pattern>
134 : I<opcode, OOL, IOL, asmstr, itin> {
139 let Pattern = pattern;
146 class DForm_4_zero<bits<6> opcode, dag OOL, dag IOL, string asmstr,
147 InstrItinClass itin, list<dag> pattern>
148 : DForm_1<opcode, OOL, IOL, asmstr, itin, pattern> {
154 class DForm_5<bits<6> opcode, dag OOL, dag IOL, string asmstr,
156 : I<opcode, OOL, IOL, asmstr, itin> {
165 let Inst{11-15} = RA;
169 class DForm_5_ext<bits<6> opcode, dag OOL, dag IOL, string asmstr,
171 : DForm_5<opcode, OOL, IOL, asmstr, itin> {
175 class DForm_6<bits<6> opcode, dag OOL, dag IOL, string asmstr,
177 : DForm_5<opcode, OOL, IOL, asmstr, itin>;
179 class DForm_6_ext<bits<6> opcode, dag OOL, dag IOL, string asmstr,
181 : DForm_6<opcode, OOL, IOL, asmstr, itin> {
187 class DSForm_1<bits<6> opcode, bits<2> xo, dag OOL, dag IOL, string asmstr,
188 InstrItinClass itin, list<dag> pattern>
189 : I<opcode, OOL, IOL, asmstr, itin> {
193 let Pattern = pattern;
195 let Inst{6-10} = RST;
196 let Inst{11-15} = DS_RA{18-14}; // Register #
197 let Inst{16-29} = DS_RA{13-0}; // Displacement.
198 let Inst{30-31} = xo;
201 class DSForm_1a<bits<6> opcode, bits<2> xo, dag OOL, dag IOL, string asmstr,
202 InstrItinClass itin, list<dag> pattern>
203 : I<opcode, OOL, IOL, asmstr, itin> {
208 let Pattern = pattern;
210 let Inst{6-10} = RST;
211 let Inst{11-15} = RA;
212 let Inst{16-29} = DS;
213 let Inst{30-31} = xo;
217 class XForm_base_r3xo<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
218 InstrItinClass itin, list<dag> pattern>
219 : I<opcode, OOL, IOL, asmstr, itin> {
224 let Pattern = pattern;
226 bit RC = 0; // set by isDOT
228 let Inst{6-10} = RST;
231 let Inst{21-30} = xo;
235 // This is the same as XForm_base_r3xo, but the first two operands are swapped
236 // when code is emitted.
237 class XForm_base_r3xo_swapped
238 <bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
240 : I<opcode, OOL, IOL, asmstr, itin> {
245 bit RC = 0; // set by isDOT
247 let Inst{6-10} = RST;
250 let Inst{21-30} = xo;
255 class XForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
256 InstrItinClass itin, list<dag> pattern>
257 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern>;
259 class XForm_6<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
260 InstrItinClass itin, list<dag> pattern>
261 : XForm_base_r3xo_swapped<opcode, xo, OOL, IOL, asmstr, itin> {
262 let Pattern = pattern;
265 class XForm_8<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
266 InstrItinClass itin, list<dag> pattern>
267 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern>;
269 class XForm_10<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
270 InstrItinClass itin, list<dag> pattern>
271 : XForm_base_r3xo_swapped<opcode, xo, OOL, IOL, asmstr, itin> {
272 let Pattern = pattern;
275 class XForm_11<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
276 InstrItinClass itin, list<dag> pattern>
277 : XForm_base_r3xo_swapped<opcode, xo, OOL, IOL, asmstr, itin> {
279 let Pattern = pattern;
282 class XForm_16<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
284 : I<opcode, OOL, IOL, asmstr, itin> {
293 let Inst{11-15} = RA;
294 let Inst{16-20} = RB;
295 let Inst{21-30} = xo;
299 class XForm_16_ext<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
301 : XForm_16<opcode, xo, OOL, IOL, asmstr, itin> {
305 class XForm_17<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
307 : I<opcode, OOL, IOL, asmstr, itin> {
314 let Inst{11-15} = FRA;
315 let Inst{16-20} = FRB;
316 let Inst{21-30} = xo;
320 class XForm_24<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
321 InstrItinClass itin, list<dag> pattern>
322 : I<opcode, OOL, IOL, asmstr, itin> {
323 let Pattern = pattern;
327 let Inst{21-30} = xo;
331 class XForm_24_sync<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
332 string asmstr, InstrItinClass itin, list<dag> pattern>
333 : I<opcode, OOL, IOL, asmstr, itin> {
334 let Pattern = pattern;
338 let Inst{21-30} = xo;
342 class XForm_25<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
343 InstrItinClass itin, list<dag> pattern>
344 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
347 class XForm_26<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
348 InstrItinClass itin, list<dag> pattern>
349 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
353 class XForm_28<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
354 InstrItinClass itin, list<dag> pattern>
355 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
358 // This is used for MFFS, MTFSB0, MTFSB1. 42 is arbitrary; this series of
359 // numbers presumably relates to some document, but I haven't found it.
360 class XForm_42<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
361 InstrItinClass itin, list<dag> pattern>
362 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
363 let Pattern = pattern;
365 bit RC = 0; // set by isDOT
367 let Inst{6-10} = RST;
369 let Inst{21-30} = xo;
372 class XForm_43<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
373 InstrItinClass itin, list<dag> pattern>
374 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
375 let Pattern = pattern;
378 bit RC = 0; // set by isDOT
382 let Inst{21-30} = xo;
386 // DCB_Form - Form X instruction, used for dcb* instructions.
387 class DCB_Form<bits<10> xo, bits<5> immfield, dag OOL, dag IOL, string asmstr,
388 InstrItinClass itin, list<dag> pattern>
389 : I<31, OOL, IOL, asmstr, itin> {
393 let Pattern = pattern;
395 let Inst{6-10} = immfield;
398 let Inst{21-30} = xo;
403 // DSS_Form - Form X instruction, used for altivec dss* instructions.
404 class DSS_Form<bits<10> xo, dag OOL, dag IOL, string asmstr,
405 InstrItinClass itin, list<dag> pattern>
406 : I<31, OOL, IOL, asmstr, itin> {
412 let Pattern = pattern;
416 let Inst{9-10} = STRM;
419 let Inst{21-30} = xo;
424 class XLForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
425 InstrItinClass itin, list<dag> pattern>
426 : I<opcode, OOL, IOL, asmstr, itin> {
431 let Pattern = pattern;
433 let Inst{6-10} = CRD;
434 let Inst{11-15} = CRA;
435 let Inst{16-20} = CRB;
436 let Inst{21-30} = xo;
440 class XLForm_1_ext<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
441 InstrItinClass itin, list<dag> pattern>
442 : I<opcode, OOL, IOL, asmstr, itin> {
445 let Pattern = pattern;
447 let Inst{6-10} = CRD;
448 let Inst{11-15} = CRD;
449 let Inst{16-20} = CRD;
450 let Inst{21-30} = xo;
454 class XLForm_2<bits<6> opcode, bits<10> xo, bit lk, dag OOL, dag IOL, string asmstr,
455 InstrItinClass itin, list<dag> pattern>
456 : I<opcode, OOL, IOL, asmstr, itin> {
461 let Pattern = pattern;
464 let Inst{11-15} = BI;
466 let Inst{19-20} = BH;
467 let Inst{21-30} = xo;
471 class XLForm_2_br<bits<6> opcode, bits<10> xo, bit lk,
472 dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern>
473 : XLForm_2<opcode, xo, lk, OOL, IOL, asmstr, itin, pattern> {
474 bits<7> BIBO; // 2 bits of BI and 5 bits of BO.
478 let BI{0-1} = BIBO{0-1};
484 class XLForm_2_ext<bits<6> opcode, bits<10> xo, bits<5> bo, bits<5> bi, bit lk,
485 dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern>
486 : XLForm_2<opcode, xo, lk, OOL, IOL, asmstr, itin, pattern> {
492 class XLForm_3<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
494 : I<opcode, OOL, IOL, asmstr, itin> {
500 let Inst{11-13} = BFA;
503 let Inst{21-30} = xo;
508 class XFXForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
510 : I<opcode, OOL, IOL, asmstr, itin> {
515 let Inst{11} = SPR{4};
516 let Inst{12} = SPR{3};
517 let Inst{13} = SPR{2};
518 let Inst{14} = SPR{1};
519 let Inst{15} = SPR{0};
520 let Inst{16} = SPR{9};
521 let Inst{17} = SPR{8};
522 let Inst{18} = SPR{7};
523 let Inst{19} = SPR{6};
524 let Inst{20} = SPR{5};
525 let Inst{21-30} = xo;
529 class XFXForm_1_ext<bits<6> opcode, bits<10> xo, bits<10> spr,
530 dag OOL, dag IOL, string asmstr, InstrItinClass itin>
531 : XFXForm_1<opcode, xo, OOL, IOL, asmstr, itin> {
535 class XFXForm_3<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
537 : I<opcode, OOL, IOL, asmstr, itin> {
542 let Inst{21-30} = xo;
546 class XFXForm_5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
548 : I<opcode, OOL, IOL, asmstr, itin> {
554 let Inst{12-19} = FXM;
556 let Inst{21-30} = xo;
560 class XFXForm_5a<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
562 : I<opcode, OOL, IOL, asmstr, itin> {
568 let Inst{12-19} = FXM;
570 let Inst{21-30} = xo;
574 class XFXForm_7<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
576 : XFXForm_1<opcode, xo, OOL, IOL, asmstr, itin>;
578 class XFXForm_7_ext<bits<6> opcode, bits<10> xo, bits<10> spr,
579 dag OOL, dag IOL, string asmstr, InstrItinClass itin>
580 : XFXForm_7<opcode, xo, OOL, IOL, asmstr, itin> {
585 // This is probably 1.7.9, but I don't have the reference that uses this
586 // numbering scheme...
587 class XFLForm<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
588 string cstr, InstrItinClass itin, list<dag>pattern>
589 : I<opcode, OOL, IOL, asmstr, itin> {
593 bit RC = 0; // set by isDOT
594 let Pattern = pattern;
595 let Constraints = cstr;
600 let Inst{16-20} = RT;
601 let Inst{21-30} = xo;
605 // 1.7.10 XS-Form - SRADI.
606 class XSForm_1<bits<6> opcode, bits<9> xo, dag OOL, dag IOL, string asmstr,
607 InstrItinClass itin, list<dag> pattern>
608 : I<opcode, OOL, IOL, asmstr, itin> {
613 bit RC = 0; // set by isDOT
614 let Pattern = pattern;
618 let Inst{16-20} = SH{4,3,2,1,0};
619 let Inst{21-29} = xo;
620 let Inst{30} = SH{5};
625 class XOForm_1<bits<6> opcode, bits<9> xo, bit oe, dag OOL, dag IOL, string asmstr,
626 InstrItinClass itin, list<dag> pattern>
627 : I<opcode, OOL, IOL, asmstr, itin> {
632 let Pattern = pattern;
634 bit RC = 0; // set by isDOT
637 let Inst{11-15} = RA;
638 let Inst{16-20} = RB;
640 let Inst{22-30} = xo;
644 class XOForm_3<bits<6> opcode, bits<9> xo, bit oe,
645 dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern>
646 : XOForm_1<opcode, xo, oe, OOL, IOL, asmstr, itin, pattern> {
651 class AForm_1<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
652 InstrItinClass itin, list<dag> pattern>
653 : I<opcode, OOL, IOL, asmstr, itin> {
659 let Pattern = pattern;
661 bit RC = 0; // set by isDOT
663 let Inst{6-10} = FRT;
664 let Inst{11-15} = FRA;
665 let Inst{16-20} = FRB;
666 let Inst{21-25} = FRC;
667 let Inst{26-30} = xo;
671 class AForm_2<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
672 InstrItinClass itin, list<dag> pattern>
673 : AForm_1<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
677 class AForm_3<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
678 InstrItinClass itin, list<dag> pattern>
679 : AForm_1<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
684 class MForm_1<bits<6> opcode, dag OOL, dag IOL, string asmstr,
685 InstrItinClass itin, list<dag> pattern>
686 : I<opcode, OOL, IOL, asmstr, itin> {
693 let Pattern = pattern;
695 bit RC = 0; // set by isDOT
698 let Inst{11-15} = RA;
699 let Inst{16-20} = RB;
700 let Inst{21-25} = MB;
701 let Inst{26-30} = ME;
705 class MForm_2<bits<6> opcode, dag OOL, dag IOL, string asmstr,
706 InstrItinClass itin, list<dag> pattern>
707 : MForm_1<opcode, OOL, IOL, asmstr, itin, pattern> {
711 class MDForm_1<bits<6> opcode, bits<3> xo, dag OOL, dag IOL, string asmstr,
712 InstrItinClass itin, list<dag> pattern>
713 : I<opcode, OOL, IOL, asmstr, itin> {
719 let Pattern = pattern;
721 bit RC = 0; // set by isDOT
724 let Inst{11-15} = RA;
725 let Inst{16-20} = SH{4,3,2,1,0};
726 let Inst{21-26} = MBE{4,3,2,1,0,5};
727 let Inst{27-29} = xo;
728 let Inst{30} = SH{5};
736 // VAForm_1 - DACB ordering.
737 class VAForm_1<bits<6> xo, dag OOL, dag IOL, string asmstr,
738 InstrItinClass itin, list<dag> pattern>
739 : I<4, OOL, IOL, asmstr, itin> {
745 let Pattern = pattern;
748 let Inst{11-15} = VA;
749 let Inst{16-20} = VB;
750 let Inst{21-25} = VC;
751 let Inst{26-31} = xo;
754 // VAForm_1a - DABC ordering.
755 class VAForm_1a<bits<6> xo, dag OOL, dag IOL, string asmstr,
756 InstrItinClass itin, list<dag> pattern>
757 : I<4, OOL, IOL, asmstr, itin> {
763 let Pattern = pattern;
766 let Inst{11-15} = VA;
767 let Inst{16-20} = VB;
768 let Inst{21-25} = VC;
769 let Inst{26-31} = xo;
772 class VAForm_2<bits<6> xo, dag OOL, dag IOL, string asmstr,
773 InstrItinClass itin, list<dag> pattern>
774 : I<4, OOL, IOL, asmstr, itin> {
780 let Pattern = pattern;
783 let Inst{11-15} = VA;
784 let Inst{16-20} = VB;
786 let Inst{22-25} = SH;
787 let Inst{26-31} = xo;
791 class VXForm_1<bits<11> xo, dag OOL, dag IOL, string asmstr,
792 InstrItinClass itin, list<dag> pattern>
793 : I<4, OOL, IOL, asmstr, itin> {
798 let Pattern = pattern;
801 let Inst{11-15} = VA;
802 let Inst{16-20} = VB;
803 let Inst{21-31} = xo;
806 class VXForm_setzero<bits<11> xo, dag OOL, dag IOL, string asmstr,
807 InstrItinClass itin, list<dag> pattern>
808 : VXForm_1<xo, OOL, IOL, asmstr, itin, pattern> {
814 class VXForm_2<bits<11> xo, dag OOL, dag IOL, string asmstr,
815 InstrItinClass itin, list<dag> pattern>
816 : I<4, OOL, IOL, asmstr, itin> {
820 let Pattern = pattern;
824 let Inst{16-20} = VB;
825 let Inst{21-31} = xo;
828 class VXForm_3<bits<11> xo, dag OOL, dag IOL, string asmstr,
829 InstrItinClass itin, list<dag> pattern>
830 : I<4, OOL, IOL, asmstr, itin> {
834 let Pattern = pattern;
837 let Inst{11-15} = IMM;
839 let Inst{21-31} = xo;
842 /// VXForm_4 - VX instructions with "VD,0,0" register fields, like mfvscr.
843 class VXForm_4<bits<11> xo, dag OOL, dag IOL, string asmstr,
844 InstrItinClass itin, list<dag> pattern>
845 : I<4, OOL, IOL, asmstr, itin> {
848 let Pattern = pattern;
853 let Inst{21-31} = xo;
856 /// VXForm_5 - VX instructions with "0,0,VB" register fields, like mtvscr.
857 class VXForm_5<bits<11> xo, dag OOL, dag IOL, string asmstr,
858 InstrItinClass itin, list<dag> pattern>
859 : I<4, OOL, IOL, asmstr, itin> {
862 let Pattern = pattern;
866 let Inst{16-20} = VB;
867 let Inst{21-31} = xo;
871 class VXRForm_1<bits<10> xo, dag OOL, dag IOL, string asmstr,
872 InstrItinClass itin, list<dag> pattern>
873 : I<4, OOL, IOL, asmstr, itin> {
879 let Pattern = pattern;
882 let Inst{11-15} = VA;
883 let Inst{16-20} = VB;
885 let Inst{22-31} = xo;
888 //===----------------------------------------------------------------------===//
889 class Pseudo<dag OOL, dag IOL, string asmstr, list<dag> pattern>
890 : I<0, OOL, IOL, asmstr, NoItinerary> {
892 let Pattern = pattern;