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> {
107 let Pattern = pattern;
110 let Inst{11-15} = Addr{20-16}; // Base Reg
111 let Inst{16-31} = Addr{15-0}; // Displacement
114 class DForm_1a<bits<6> opcode, dag OOL, dag IOL, string asmstr,
115 InstrItinClass itin, list<dag> pattern>
116 : I<opcode, OOL, IOL, asmstr, itin> {
121 let Pattern = pattern;
129 class DForm_2<bits<6> opcode, dag OOL, dag IOL, string asmstr,
130 InstrItinClass itin, list<dag> pattern>
131 : DForm_base<opcode, OOL, IOL, asmstr, itin, pattern>;
133 class DForm_2_r0<bits<6> opcode, dag OOL, dag IOL, string asmstr,
134 InstrItinClass itin, list<dag> pattern>
135 : I<opcode, OOL, IOL, asmstr, itin> {
139 let Pattern = pattern;
146 class DForm_4<bits<6> opcode, dag OOL, dag IOL, string asmstr,
147 InstrItinClass itin, list<dag> pattern>
148 : I<opcode, OOL, IOL, asmstr, itin> {
153 let Pattern = pattern;
160 class DForm_4_zero<bits<6> opcode, dag OOL, dag IOL, string asmstr,
161 InstrItinClass itin, list<dag> pattern>
162 : DForm_1<opcode, OOL, IOL, asmstr, itin, pattern> {
167 class DForm_5<bits<6> opcode, dag OOL, dag IOL, string asmstr,
169 : I<opcode, OOL, IOL, asmstr, itin> {
178 let Inst{11-15} = RA;
182 class DForm_5_ext<bits<6> opcode, dag OOL, dag IOL, string asmstr,
184 : DForm_5<opcode, OOL, IOL, asmstr, itin> {
188 class DForm_6<bits<6> opcode, dag OOL, dag IOL, string asmstr,
190 : DForm_5<opcode, OOL, IOL, asmstr, itin>;
192 class DForm_6_ext<bits<6> opcode, dag OOL, dag IOL, string asmstr,
194 : DForm_6<opcode, OOL, IOL, asmstr, itin> {
200 class DSForm_1<bits<6> opcode, bits<2> xo, dag OOL, dag IOL, string asmstr,
201 InstrItinClass itin, list<dag> pattern>
202 : I<opcode, OOL, IOL, asmstr, itin> {
206 let Pattern = pattern;
208 let Inst{6-10} = RST;
209 let Inst{11-15} = DS_RA{18-14}; // Register #
210 let Inst{16-29} = DS_RA{13-0}; // Displacement.
211 let Inst{30-31} = xo;
214 class DSForm_1a<bits<6> opcode, bits<2> xo, dag OOL, dag IOL, string asmstr,
215 InstrItinClass itin, list<dag> pattern>
216 : I<opcode, OOL, IOL, asmstr, itin> {
221 let Pattern = pattern;
223 let Inst{6-10} = RST;
224 let Inst{11-15} = RA;
225 let Inst{16-29} = DS;
226 let Inst{30-31} = xo;
230 class XForm_base_r3xo<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
231 InstrItinClass itin, list<dag> pattern>
232 : I<opcode, OOL, IOL, asmstr, itin> {
237 let Pattern = pattern;
239 bit RC = 0; // set by isDOT
241 let Inst{6-10} = RST;
244 let Inst{21-30} = xo;
248 // This is the same as XForm_base_r3xo, but the first two operands are swapped
249 // when code is emitted.
250 class XForm_base_r3xo_swapped
251 <bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
253 : I<opcode, OOL, IOL, asmstr, itin> {
258 bit RC = 0; // set by isDOT
260 let Inst{6-10} = RST;
263 let Inst{21-30} = xo;
268 class XForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
269 InstrItinClass itin, list<dag> pattern>
270 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern>;
272 class XForm_6<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
273 InstrItinClass itin, list<dag> pattern>
274 : XForm_base_r3xo_swapped<opcode, xo, OOL, IOL, asmstr, itin> {
275 let Pattern = pattern;
278 class XForm_8<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
279 InstrItinClass itin, list<dag> pattern>
280 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern>;
282 class XForm_10<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
283 InstrItinClass itin, list<dag> pattern>
284 : XForm_base_r3xo_swapped<opcode, xo, OOL, IOL, asmstr, itin> {
285 let Pattern = pattern;
288 class XForm_11<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
289 InstrItinClass itin, list<dag> pattern>
290 : XForm_base_r3xo_swapped<opcode, xo, OOL, IOL, asmstr, itin> {
292 let Pattern = pattern;
295 class XForm_16<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
297 : I<opcode, OOL, IOL, asmstr, itin> {
306 let Inst{11-15} = RA;
307 let Inst{16-20} = RB;
308 let Inst{21-30} = xo;
312 class XForm_16_ext<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
314 : XForm_16<opcode, xo, OOL, IOL, asmstr, itin> {
318 class XForm_17<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
320 : I<opcode, OOL, IOL, asmstr, itin> {
327 let Inst{11-15} = FRA;
328 let Inst{16-20} = FRB;
329 let Inst{21-30} = xo;
333 class XForm_24<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
334 InstrItinClass itin, list<dag> pattern>
335 : I<opcode, OOL, IOL, asmstr, itin> {
336 let Pattern = pattern;
340 let Inst{21-30} = xo;
344 class XForm_24_sync<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
345 string asmstr, InstrItinClass itin, list<dag> pattern>
346 : I<opcode, OOL, IOL, asmstr, itin> {
347 let Pattern = pattern;
351 let Inst{21-30} = xo;
355 class XForm_25<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
356 InstrItinClass itin, list<dag> pattern>
357 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
360 class XForm_26<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> {
366 class XForm_28<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
367 InstrItinClass itin, list<dag> pattern>
368 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
371 // This is used for MFFS, MTFSB0, MTFSB1. 42 is arbitrary; this series of
372 // numbers presumably relates to some document, but I haven't found it.
373 class XForm_42<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
374 InstrItinClass itin, list<dag> pattern>
375 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
376 let Pattern = pattern;
378 bit RC = 0; // set by isDOT
380 let Inst{6-10} = RST;
382 let Inst{21-30} = xo;
385 class XForm_43<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
386 InstrItinClass itin, list<dag> pattern>
387 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
388 let Pattern = pattern;
391 bit RC = 0; // set by isDOT
395 let Inst{21-30} = xo;
399 // DCB_Form - Form X instruction, used for dcb* instructions.
400 class DCB_Form<bits<10> xo, bits<5> immfield, dag OOL, dag IOL, string asmstr,
401 InstrItinClass itin, list<dag> pattern>
402 : I<31, OOL, IOL, asmstr, itin> {
406 let Pattern = pattern;
408 let Inst{6-10} = immfield;
411 let Inst{21-30} = xo;
416 // DSS_Form - Form X instruction, used for altivec dss* instructions.
417 class DSS_Form<bits<10> xo, dag OOL, dag IOL, string asmstr,
418 InstrItinClass itin, list<dag> pattern>
419 : I<31, OOL, IOL, asmstr, itin> {
425 let Pattern = pattern;
429 let Inst{9-10} = STRM;
432 let Inst{21-30} = xo;
437 class XLForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
438 InstrItinClass itin, list<dag> pattern>
439 : I<opcode, OOL, IOL, asmstr, itin> {
444 let Pattern = pattern;
446 let Inst{6-10} = CRD;
447 let Inst{11-15} = CRA;
448 let Inst{16-20} = CRB;
449 let Inst{21-30} = xo;
453 class XLForm_1_ext<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
454 InstrItinClass itin, list<dag> pattern>
455 : I<opcode, OOL, IOL, asmstr, itin> {
458 let Pattern = pattern;
460 let Inst{6-10} = CRD;
461 let Inst{11-15} = CRD;
462 let Inst{16-20} = CRD;
463 let Inst{21-30} = xo;
467 class XLForm_2<bits<6> opcode, bits<10> xo, bit lk, dag OOL, dag IOL, string asmstr,
468 InstrItinClass itin, list<dag> pattern>
469 : I<opcode, OOL, IOL, asmstr, itin> {
474 let Pattern = pattern;
477 let Inst{11-15} = BI;
479 let Inst{19-20} = BH;
480 let Inst{21-30} = xo;
484 class XLForm_2_br<bits<6> opcode, bits<10> xo, 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> {
487 bits<7> BIBO; // 2 bits of BI and 5 bits of BO.
491 let BI{0-1} = BIBO{0-1};
497 class XLForm_2_ext<bits<6> opcode, bits<10> xo, bits<5> bo, bits<5> bi, bit lk,
498 dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern>
499 : XLForm_2<opcode, xo, lk, OOL, IOL, asmstr, itin, pattern> {
505 class XLForm_3<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
507 : I<opcode, OOL, IOL, asmstr, itin> {
513 let Inst{11-13} = BFA;
516 let Inst{21-30} = xo;
521 class XFXForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
523 : I<opcode, OOL, IOL, asmstr, itin> {
528 let Inst{11} = SPR{4};
529 let Inst{12} = SPR{3};
530 let Inst{13} = SPR{2};
531 let Inst{14} = SPR{1};
532 let Inst{15} = SPR{0};
533 let Inst{16} = SPR{9};
534 let Inst{17} = SPR{8};
535 let Inst{18} = SPR{7};
536 let Inst{19} = SPR{6};
537 let Inst{20} = SPR{5};
538 let Inst{21-30} = xo;
542 class XFXForm_1_ext<bits<6> opcode, bits<10> xo, bits<10> spr,
543 dag OOL, dag IOL, string asmstr, InstrItinClass itin>
544 : XFXForm_1<opcode, xo, OOL, IOL, asmstr, itin> {
548 class XFXForm_3<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
550 : I<opcode, OOL, IOL, asmstr, itin> {
555 let Inst{21-30} = xo;
559 class XFXForm_5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
561 : I<opcode, OOL, IOL, asmstr, itin> {
567 let Inst{12-19} = FXM;
569 let Inst{21-30} = xo;
573 class XFXForm_5a<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
575 : I<opcode, OOL, IOL, asmstr, itin> {
581 let Inst{12-19} = FXM;
583 let Inst{21-30} = xo;
587 class XFXForm_7<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
589 : XFXForm_1<opcode, xo, OOL, IOL, asmstr, itin>;
591 class XFXForm_7_ext<bits<6> opcode, bits<10> xo, bits<10> spr,
592 dag OOL, dag IOL, string asmstr, InstrItinClass itin>
593 : XFXForm_7<opcode, xo, OOL, IOL, asmstr, itin> {
598 // This is probably 1.7.9, but I don't have the reference that uses this
599 // numbering scheme...
600 class XFLForm<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
601 string cstr, InstrItinClass itin, list<dag>pattern>
602 : I<opcode, OOL, IOL, asmstr, itin> {
606 bit RC = 0; // set by isDOT
607 let Pattern = pattern;
608 let Constraints = cstr;
613 let Inst{16-20} = RT;
614 let Inst{21-30} = xo;
618 // 1.7.10 XS-Form - SRADI.
619 class XSForm_1<bits<6> opcode, bits<9> xo, dag OOL, dag IOL, string asmstr,
620 InstrItinClass itin, list<dag> pattern>
621 : I<opcode, OOL, IOL, asmstr, itin> {
626 bit RC = 0; // set by isDOT
627 let Pattern = pattern;
631 let Inst{16-20} = SH{4,3,2,1,0};
632 let Inst{21-29} = xo;
633 let Inst{30} = SH{5};
638 class XOForm_1<bits<6> opcode, bits<9> xo, bit oe, dag OOL, dag IOL, string asmstr,
639 InstrItinClass itin, list<dag> pattern>
640 : I<opcode, OOL, IOL, asmstr, itin> {
645 let Pattern = pattern;
647 bit RC = 0; // set by isDOT
650 let Inst{11-15} = RA;
651 let Inst{16-20} = RB;
653 let Inst{22-30} = xo;
657 class XOForm_3<bits<6> opcode, bits<9> xo, bit oe,
658 dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern>
659 : XOForm_1<opcode, xo, oe, OOL, IOL, asmstr, itin, pattern> {
664 class AForm_1<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
665 InstrItinClass itin, list<dag> pattern>
666 : I<opcode, OOL, IOL, asmstr, itin> {
672 let Pattern = pattern;
674 bit RC = 0; // set by isDOT
676 let Inst{6-10} = FRT;
677 let Inst{11-15} = FRA;
678 let Inst{16-20} = FRB;
679 let Inst{21-25} = FRC;
680 let Inst{26-30} = xo;
684 class AForm_2<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
685 InstrItinClass itin, list<dag> pattern>
686 : AForm_1<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
690 class AForm_3<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
691 InstrItinClass itin, list<dag> pattern>
692 : AForm_1<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
697 class MForm_1<bits<6> opcode, dag OOL, dag IOL, string asmstr,
698 InstrItinClass itin, list<dag> pattern>
699 : I<opcode, OOL, IOL, asmstr, itin> {
706 let Pattern = pattern;
708 bit RC = 0; // set by isDOT
711 let Inst{11-15} = RA;
712 let Inst{16-20} = RB;
713 let Inst{21-25} = MB;
714 let Inst{26-30} = ME;
718 class MForm_2<bits<6> opcode, dag OOL, dag IOL, string asmstr,
719 InstrItinClass itin, list<dag> pattern>
720 : MForm_1<opcode, OOL, IOL, asmstr, itin, pattern> {
724 class MDForm_1<bits<6> opcode, bits<3> xo, dag OOL, dag IOL, string asmstr,
725 InstrItinClass itin, list<dag> pattern>
726 : I<opcode, OOL, IOL, asmstr, itin> {
732 let Pattern = pattern;
734 bit RC = 0; // set by isDOT
737 let Inst{11-15} = RA;
738 let Inst{16-20} = SH{4,3,2,1,0};
739 let Inst{21-26} = MBE{4,3,2,1,0,5};
740 let Inst{27-29} = xo;
741 let Inst{30} = SH{5};
749 // VAForm_1 - DACB ordering.
750 class VAForm_1<bits<6> xo, dag OOL, dag IOL, string asmstr,
751 InstrItinClass itin, list<dag> pattern>
752 : I<4, OOL, IOL, asmstr, itin> {
758 let Pattern = pattern;
761 let Inst{11-15} = VA;
762 let Inst{16-20} = VB;
763 let Inst{21-25} = VC;
764 let Inst{26-31} = xo;
767 // VAForm_1a - DABC ordering.
768 class VAForm_1a<bits<6> xo, dag OOL, dag IOL, string asmstr,
769 InstrItinClass itin, list<dag> pattern>
770 : I<4, OOL, IOL, asmstr, itin> {
776 let Pattern = pattern;
779 let Inst{11-15} = VA;
780 let Inst{16-20} = VB;
781 let Inst{21-25} = VC;
782 let Inst{26-31} = xo;
785 class VAForm_2<bits<6> xo, dag OOL, dag IOL, string asmstr,
786 InstrItinClass itin, list<dag> pattern>
787 : I<4, OOL, IOL, asmstr, itin> {
793 let Pattern = pattern;
796 let Inst{11-15} = VA;
797 let Inst{16-20} = VB;
799 let Inst{22-25} = SH;
800 let Inst{26-31} = xo;
804 class VXForm_1<bits<11> xo, dag OOL, dag IOL, string asmstr,
805 InstrItinClass itin, list<dag> pattern>
806 : I<4, OOL, IOL, asmstr, itin> {
811 let Pattern = pattern;
814 let Inst{11-15} = VA;
815 let Inst{16-20} = VB;
816 let Inst{21-31} = xo;
819 class VXForm_setzero<bits<11> xo, dag OOL, dag IOL, string asmstr,
820 InstrItinClass itin, list<dag> pattern>
821 : VXForm_1<xo, OOL, IOL, asmstr, itin, pattern> {
827 class VXForm_2<bits<11> xo, dag OOL, dag IOL, string asmstr,
828 InstrItinClass itin, list<dag> pattern>
829 : I<4, OOL, IOL, asmstr, itin> {
833 let Pattern = pattern;
837 let Inst{16-20} = VB;
838 let Inst{21-31} = xo;
841 class VXForm_3<bits<11> xo, dag OOL, dag IOL, string asmstr,
842 InstrItinClass itin, list<dag> pattern>
843 : I<4, OOL, IOL, asmstr, itin> {
847 let Pattern = pattern;
850 let Inst{11-15} = IMM;
852 let Inst{21-31} = xo;
855 /// VXForm_4 - VX instructions with "VD,0,0" register fields, like mfvscr.
856 class VXForm_4<bits<11> xo, dag OOL, dag IOL, string asmstr,
857 InstrItinClass itin, list<dag> pattern>
858 : I<4, OOL, IOL, asmstr, itin> {
861 let Pattern = pattern;
866 let Inst{21-31} = xo;
869 /// VXForm_5 - VX instructions with "0,0,VB" register fields, like mtvscr.
870 class VXForm_5<bits<11> xo, dag OOL, dag IOL, string asmstr,
871 InstrItinClass itin, list<dag> pattern>
872 : I<4, OOL, IOL, asmstr, itin> {
875 let Pattern = pattern;
879 let Inst{16-20} = VB;
880 let Inst{21-31} = xo;
884 class VXRForm_1<bits<10> xo, dag OOL, dag IOL, string asmstr,
885 InstrItinClass itin, list<dag> pattern>
886 : I<4, OOL, IOL, asmstr, itin> {
892 let Pattern = pattern;
895 let Inst{11-15} = VA;
896 let Inst{16-20} = VB;
898 let Inst{22-31} = xo;
901 //===----------------------------------------------------------------------===//
902 class Pseudo<dag OOL, dag IOL, string asmstr, list<dag> pattern>
903 : I<0, OOL, IOL, asmstr, NoItinerary> {
905 let Pattern = pattern;