[PowerPC] Support generic conditional branches in asm parser
[oota-llvm.git] / lib / Target / PowerPC / PPCInstrFormats.td
1 //===- PowerPCInstrFormats.td - PowerPC Instruction Formats --*- tablegen -*-=//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 //===----------------------------------------------------------------------===//
11 //
12 // PowerPC instruction formats
13
14 class I<bits<6> opcode, dag OOL, dag IOL, string asmstr, InstrItinClass itin>
15         : Instruction {
16   field bits<32> Inst;
17
18   bit PPC64 = 0;  // Default value, override with isPPC64
19
20   let Namespace = "PPC";
21   let Inst{0-5} = opcode;
22   let OutOperandList = OOL;
23   let InOperandList = IOL;
24   let AsmString = asmstr;
25   let Itinerary = itin;
26
27   bits<1> PPC970_First = 0;
28   bits<1> PPC970_Single = 0;
29   bits<1> PPC970_Cracked = 0;
30   bits<3> PPC970_Unit = 0;
31
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;
38
39   // Fields used for relation models.
40   string BaseName = "";
41
42   // For cases where multiple instruction definitions really represent the
43   // same underlying instruction but with one definition for 64-bit arguments
44   // and one for 32-bit arguments, this bit breaks the degeneracy between
45   // the two forms and allows TableGen to generate mapping tables.
46   bit Interpretation64Bit = 0;
47 }
48
49 class PPC970_DGroup_First   { bits<1> PPC970_First = 1;  }
50 class PPC970_DGroup_Single  { bits<1> PPC970_Single = 1; }
51 class PPC970_DGroup_Cracked { bits<1> PPC970_Cracked = 1; }
52 class PPC970_MicroCode;
53
54 class PPC970_Unit_Pseudo   { bits<3> PPC970_Unit = 0;   }
55 class PPC970_Unit_FXU      { bits<3> PPC970_Unit = 1;   }
56 class PPC970_Unit_LSU      { bits<3> PPC970_Unit = 2;   }
57 class PPC970_Unit_FPU      { bits<3> PPC970_Unit = 3;   }
58 class PPC970_Unit_CRU      { bits<3> PPC970_Unit = 4;   }
59 class PPC970_Unit_VALU     { bits<3> PPC970_Unit = 5;   }
60 class PPC970_Unit_VPERM    { bits<3> PPC970_Unit = 6;   }
61 class PPC970_Unit_BRU      { bits<3> PPC970_Unit = 7;   }
62
63 // Two joined instructions; used to emit two adjacent instructions as one.
64 // The itinerary from the first instruction is used for scheduling and
65 // classification.
66 class I2<bits<6> opcode1, bits<6> opcode2, dag OOL, dag IOL, string asmstr,
67          InstrItinClass itin>
68         : Instruction {
69   field bits<64> Inst;
70
71   bit PPC64 = 0;  // Default value, override with isPPC64
72
73   let Namespace = "PPC";
74   let Inst{0-5} = opcode1;
75   let Inst{32-37} = opcode2;
76   let OutOperandList = OOL;
77   let InOperandList = IOL;
78   let AsmString = asmstr;
79   let Itinerary = itin;
80
81   bits<1> PPC970_First = 0;
82   bits<1> PPC970_Single = 0;
83   bits<1> PPC970_Cracked = 0;
84   bits<3> PPC970_Unit = 0;
85
86   /// These fields correspond to the fields in PPCInstrInfo.h.  Any changes to
87   /// these must be reflected there!  See comments there for what these are.
88   let TSFlags{0}   = PPC970_First;
89   let TSFlags{1}   = PPC970_Single;
90   let TSFlags{2}   = PPC970_Cracked;
91   let TSFlags{5-3} = PPC970_Unit;
92
93   // Fields used for relation models.
94   string BaseName = "";
95   bit Interpretation64Bit = 0;
96 }
97
98 // 1.7.1 I-Form
99 class IForm<bits<6> opcode, bit aa, bit lk, dag OOL, dag IOL, string asmstr,
100             InstrItinClass itin, list<dag> pattern>
101          : I<opcode, OOL, IOL, asmstr, itin> {
102   let Pattern = pattern;
103   bits<24> LI;
104
105   let Inst{6-29}  = LI;
106   let Inst{30}    = aa;
107   let Inst{31}    = lk;
108 }
109
110 // 1.7.2 B-Form
111 class BForm<bits<6> opcode, bit aa, bit lk, dag OOL, dag IOL, string asmstr>
112   : I<opcode, OOL, IOL, asmstr, BrB> {
113   bits<7> BIBO;  // 2 bits of BI and 5 bits of BO.
114   bits<3>  CR;
115   bits<14> BD;
116
117   bits<5> BI;
118   let BI{0-1} = BIBO{5-6};
119   let BI{2-4} = CR{0-2};
120
121   let Inst{6-10}  = BIBO{4-0};
122   let Inst{11-15} = BI;
123   let Inst{16-29} = BD;
124   let Inst{30}    = aa;
125   let Inst{31}    = lk;
126 }
127
128 class BForm_1<bits<6> opcode, bits<5> bo, bit aa, bit lk, dag OOL, dag IOL,
129              string asmstr>
130   : BForm<opcode, aa, lk, OOL, IOL, asmstr> {
131   let BIBO{4-0} = bo;
132   let BIBO{6-5} = 0;
133   let CR = 0;
134 }
135
136 class BForm_2<bits<6> opcode, bits<5> bo, bits<5> bi, bit aa, bit lk,
137               dag OOL, dag IOL, string asmstr>
138   : I<opcode, OOL, IOL, asmstr, BrB> {
139   bits<14> BD;
140
141   let Inst{6-10}  = bo;
142   let Inst{11-15} = bi;
143   let Inst{16-29} = BD;
144   let Inst{30}    = aa;
145   let Inst{31}    = lk;
146 }
147
148 class BForm_3<bits<6> opcode, bit aa, bit lk,
149               dag OOL, dag IOL, string asmstr>
150   : I<opcode, OOL, IOL, asmstr, BrB> {
151   bits<5> BO;
152   bits<5> BI;
153   bits<14> BD;
154
155   let Inst{6-10}  = BO;
156   let Inst{11-15} = BI;
157   let Inst{16-29} = BD;
158   let Inst{30}    = aa;
159   let Inst{31}    = lk;
160 }
161
162 // 1.7.3 SC-Form
163 class SCForm<bits<6> opcode, bits<1> xo,
164                      dag OOL, dag IOL, string asmstr, InstrItinClass itin,
165                      list<dag> pattern>
166   : I<opcode, OOL, IOL, asmstr, itin> {
167   bits<7>  LEV;
168
169   let Pattern = pattern;
170
171   let Inst{20-26} = LEV;
172   let Inst{30}    = xo;
173 }
174
175 // 1.7.4 D-Form
176 class DForm_base<bits<6> opcode, dag OOL, dag IOL, string asmstr,
177                  InstrItinClass itin, list<dag> pattern> 
178   : I<opcode, OOL, IOL, asmstr, itin> {
179   bits<5>  A;
180   bits<5>  B;
181   bits<16> C;
182
183   let Pattern = pattern;
184   
185   let Inst{6-10}  = A;
186   let Inst{11-15} = B;
187   let Inst{16-31} = C;
188 }
189
190 class DForm_1<bits<6> opcode, dag OOL, dag IOL, string asmstr,
191               InstrItinClass itin, list<dag> pattern>
192   : I<opcode, OOL, IOL, asmstr, itin> {
193   bits<5>  A;
194   bits<21> Addr;
195
196   let Pattern = pattern;
197   
198   let Inst{6-10}  = A;
199   let Inst{11-15} = Addr{20-16}; // Base Reg
200   let Inst{16-31} = Addr{15-0};  // Displacement
201 }
202
203 class DForm_1a<bits<6> opcode, dag OOL, dag IOL, string asmstr,
204                InstrItinClass itin, list<dag> pattern>
205   : I<opcode, OOL, IOL, asmstr, itin> {
206   bits<5>  A;
207   bits<16> C;
208   bits<5>  B;
209
210   let Pattern = pattern;
211   
212   let Inst{6-10}  = A;
213   let Inst{11-15} = B;
214   let Inst{16-31} = C;
215 }
216
217
218 class DForm_2<bits<6> opcode, dag OOL, dag IOL, string asmstr,
219               InstrItinClass itin, list<dag> pattern>
220   : DForm_base<opcode, OOL, IOL, asmstr, itin, pattern> {
221
222   // Even though ADDICo does not really have an RC bit, provide
223   // the declaration of one here so that isDOT has something to set.
224   bit RC = 0;
225 }
226
227 class DForm_2_r0<bits<6> opcode, dag OOL, dag IOL, string asmstr,
228                  InstrItinClass itin, list<dag> pattern>
229   : I<opcode, OOL, IOL, asmstr, itin> {
230   bits<5>  A;
231   bits<16> B;
232   
233   let Pattern = pattern;
234   
235   let Inst{6-10}  = A;
236   let Inst{11-15} = 0;
237   let Inst{16-31} = B;
238 }
239
240 class DForm_4<bits<6> opcode, dag OOL, dag IOL, string asmstr,
241               InstrItinClass itin, list<dag> pattern>
242   : I<opcode, OOL, IOL, asmstr, itin> {
243   bits<5>  B;
244   bits<5>  A;
245   bits<16> C;
246   
247   let Pattern = pattern;
248   
249   let Inst{6-10}  = A;
250   let Inst{11-15} = B;
251   let Inst{16-31} = C;
252 }
253               
254 class DForm_4_zero<bits<6> opcode, dag OOL, dag IOL, string asmstr,
255                    InstrItinClass itin, list<dag> pattern>
256   : DForm_1<opcode, OOL, IOL, asmstr, itin, pattern> {
257   let A = 0;
258   let Addr = 0;
259 }
260
261 class IForm_and_DForm_1<bits<6> opcode1, bit aa, bit lk, bits<6> opcode2,
262             dag OOL, dag IOL, string asmstr,
263             InstrItinClass itin, list<dag> pattern>
264          : I2<opcode1, opcode2, OOL, IOL, asmstr, itin> {
265   bits<5>  A;
266   bits<21> Addr;
267
268   let Pattern = pattern;
269   bits<24> LI;
270
271   let Inst{6-29}  = LI;
272   let Inst{30}    = aa;
273   let Inst{31}    = lk;
274
275   let Inst{38-42}  = A;
276   let Inst{43-47} = Addr{20-16}; // Base Reg
277   let Inst{48-63} = Addr{15-0};  // Displacement
278 }
279
280 // This is used to emit BL8+NOP.
281 class IForm_and_DForm_4_zero<bits<6> opcode1, bit aa, bit lk, bits<6> opcode2,
282             dag OOL, dag IOL, string asmstr,
283             InstrItinClass itin, list<dag> pattern>
284          :  IForm_and_DForm_1<opcode1, aa, lk, opcode2,
285                               OOL, IOL, asmstr, itin, pattern> {
286   let A = 0;
287   let Addr = 0;
288 }
289
290 class DForm_5<bits<6> opcode, dag OOL, dag IOL, string asmstr,
291               InstrItinClass itin>
292   : I<opcode, OOL, IOL, asmstr, itin> {
293   bits<3>  BF;
294   bits<1>  L;
295   bits<5>  RA;
296   bits<16> I;
297
298   let Inst{6-8}   = BF;
299   let Inst{9}     = 0;
300   let Inst{10}    = L;
301   let Inst{11-15} = RA;
302   let Inst{16-31} = I;
303 }
304
305 class DForm_5_ext<bits<6> opcode, dag OOL, dag IOL, string asmstr,
306                   InstrItinClass itin>
307   : DForm_5<opcode, OOL, IOL, asmstr, itin> {
308   let L = PPC64;
309 }
310
311 class DForm_6<bits<6> opcode, dag OOL, dag IOL, string asmstr,
312               InstrItinClass itin> 
313   : DForm_5<opcode, OOL, IOL, asmstr, itin>;
314
315 class DForm_6_ext<bits<6> opcode, dag OOL, dag IOL, string asmstr,
316                   InstrItinClass itin>
317   : DForm_6<opcode, OOL, IOL, asmstr, itin> {
318   let L = PPC64;
319 }
320
321
322 // 1.7.5 DS-Form
323 class DSForm_1<bits<6> opcode, bits<2> xo, dag OOL, dag IOL, string asmstr,
324                InstrItinClass itin, list<dag> pattern>
325          : I<opcode, OOL, IOL, asmstr, itin> {
326   bits<5>  RST;
327   bits<19> DS_RA;
328
329   let Pattern = pattern;
330   
331   let Inst{6-10}  = RST;
332   let Inst{11-15} = DS_RA{18-14};  // Register #
333   let Inst{16-29} = DS_RA{13-0};   // Displacement.
334   let Inst{30-31} = xo;
335 }
336
337 class DSForm_1a<bits<6> opcode, bits<2> xo, dag OOL, dag IOL, string asmstr,
338                 InstrItinClass itin, list<dag> pattern>
339          : I<opcode, OOL, IOL, asmstr, itin> {
340    bits<5>  RST;
341    bits<14> DS;
342    bits<5>  RA;
343  
344    let Pattern = pattern;
345    
346    let Inst{6-10}  = RST;
347    let Inst{11-15} = RA;
348    let Inst{16-29} = DS;
349    let Inst{30-31} = xo;
350 }
351
352 // 1.7.6 X-Form
353 class XForm_base_r3xo<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 
354                       InstrItinClass itin, list<dag> pattern>
355   : I<opcode, OOL, IOL, asmstr, itin> {
356   bits<5> RST;
357   bits<5> A;
358   bits<5> B;
359
360   let Pattern = pattern;
361
362   bit RC = 0;    // set by isDOT
363
364   let Inst{6-10}  = RST;
365   let Inst{11-15} = A;
366   let Inst{16-20} = B;
367   let Inst{21-30} = xo;
368   let Inst{31}    = RC;
369 }
370
371 // This is the same as XForm_base_r3xo, but the first two operands are swapped
372 // when code is emitted.
373 class XForm_base_r3xo_swapped
374         <bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
375         InstrItinClass itin> 
376   : I<opcode, OOL, IOL, asmstr, itin> {
377   bits<5> A;
378   bits<5> RST;
379   bits<5> B;
380
381   bit RC = 0;    // set by isDOT
382
383   let Inst{6-10}  = RST;
384   let Inst{11-15} = A;
385   let Inst{16-20} = B;
386   let Inst{21-30} = xo;
387   let Inst{31}    = RC;
388 }
389
390
391 class XForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
392               InstrItinClass itin, list<dag> pattern> 
393   : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern>;
394
395 class XForm_1a<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
396               InstrItinClass itin, list<dag> pattern>
397   : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
398   let RST = 0;
399 }
400
401 class XForm_6<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
402               InstrItinClass itin, list<dag> pattern> 
403   : XForm_base_r3xo_swapped<opcode, xo, OOL, IOL, asmstr, itin> {
404   let Pattern = pattern;
405 }
406
407 class XForm_8<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
408               InstrItinClass itin, list<dag> pattern> 
409   : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern>;
410
411 class XForm_10<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
412                InstrItinClass itin, list<dag> pattern> 
413   : XForm_base_r3xo_swapped<opcode, xo, OOL, IOL, asmstr, itin> {
414     let Pattern = pattern;
415 }
416
417 class XForm_11<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
418                InstrItinClass itin, list<dag> pattern> 
419   : XForm_base_r3xo_swapped<opcode, xo, OOL, IOL, asmstr, itin> {
420   let B = 0;
421   let Pattern = pattern;
422 }
423
424 class XForm_16<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
425                InstrItinClass itin>
426          : I<opcode, OOL, IOL, asmstr, itin> {
427   bits<3> BF;
428   bits<1> L; 
429   bits<5> RA;
430   bits<5> RB;
431   
432   let Inst{6-8}   = BF;
433   let Inst{9}     = 0;
434   let Inst{10}    = L;
435   let Inst{11-15} = RA;
436   let Inst{16-20} = RB;
437   let Inst{21-30} = xo;
438   let Inst{31}    = 0;
439 }
440
441 class XForm_16_ext<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
442                    InstrItinClass itin>
443   : XForm_16<opcode, xo, OOL, IOL, asmstr, itin> {
444   let L = PPC64;
445 }
446
447 class XForm_17<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
448                InstrItinClass itin>
449          : I<opcode, OOL, IOL, asmstr, itin> {
450   bits<3> BF;
451   bits<5> FRA;
452   bits<5> FRB;
453   
454   let Inst{6-8}   = BF;
455   let Inst{9-10}  = 0;
456   let Inst{11-15} = FRA;
457   let Inst{16-20} = FRB;
458   let Inst{21-30} = xo;
459   let Inst{31}    = 0;
460 }
461
462 class XForm_24<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
463                InstrItinClass itin, list<dag> pattern> 
464   : I<opcode, OOL, IOL, asmstr, itin> {
465   let Pattern = pattern;
466   let Inst{6-10}  = 31;
467   let Inst{11-15} = 0;
468   let Inst{16-20} = 0;
469   let Inst{21-30} = xo;
470   let Inst{31}    = 0;
471 }
472
473 class XForm_24_sync<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
474                string asmstr, InstrItinClass itin, list<dag> pattern> 
475   : I<opcode, OOL, IOL, asmstr, itin> {
476   let Pattern = pattern;
477   let Inst{6-10}  = 0;
478   let Inst{11-15} = 0;
479   let Inst{16-20} = 0;
480   let Inst{21-30} = xo;
481   let Inst{31}    = 0;
482 }
483
484 class XForm_25<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
485                InstrItinClass itin, list<dag> pattern> 
486   : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
487 }
488
489 class XForm_26<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
490                InstrItinClass itin, list<dag> pattern>
491   : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
492   let A = 0;
493 }
494
495 class XForm_28<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
496                InstrItinClass itin, list<dag> pattern> 
497   : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
498 }
499
500 // This is used for MFFS, MTFSB0, MTFSB1.  42 is arbitrary; this series of
501 // numbers presumably relates to some document, but I haven't found it.
502 class XForm_42<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
503               InstrItinClass itin, list<dag> pattern>
504   : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
505   let Pattern = pattern;
506
507   bit RC = 0;    // set by isDOT
508
509   let Inst{6-10}  = RST;
510   let Inst{11-20} = 0;
511   let Inst{21-30} = xo;
512   let Inst{31}    = RC;
513 }
514 class XForm_43<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
515               InstrItinClass itin, list<dag> pattern>
516   : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
517   let Pattern = pattern;
518   bits<5> FM;
519
520   bit RC = 0;    // set by isDOT
521
522   let Inst{6-10}  = FM;
523   let Inst{11-20} = 0;
524   let Inst{21-30} = xo;
525   let Inst{31}    = RC;
526 }
527
528 // DCB_Form - Form X instruction, used for dcb* instructions.
529 class DCB_Form<bits<10> xo, bits<5> immfield, dag OOL, dag IOL, string asmstr, 
530                       InstrItinClass itin, list<dag> pattern>
531   : I<31, OOL, IOL, asmstr, itin> {
532   bits<5> A;
533   bits<5> B;
534
535   let Pattern = pattern;
536
537   let Inst{6-10}  = immfield;
538   let Inst{11-15} = A;
539   let Inst{16-20} = B;
540   let Inst{21-30} = xo;
541   let Inst{31}    = 0;
542 }
543
544
545 // DSS_Form - Form X instruction, used for altivec dss* instructions.
546 class DSS_Form<bits<10> xo, dag OOL, dag IOL, string asmstr, 
547                       InstrItinClass itin, list<dag> pattern>
548   : I<31, OOL, IOL, asmstr, itin> {
549   bits<1> T;
550   bits<2> STRM;
551   bits<5> A;
552   bits<5> B;
553
554   let Pattern = pattern;
555
556   let Inst{6}     = T;
557   let Inst{7-8}   = 0;
558   let Inst{9-10}  = STRM;
559   let Inst{11-15} = A;
560   let Inst{16-20} = B;
561   let Inst{21-30} = xo;
562   let Inst{31}    = 0;
563 }
564
565 // 1.7.7 XL-Form
566 class XLForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
567                InstrItinClass itin, list<dag> pattern>
568     : I<opcode, OOL, IOL, asmstr, itin> {
569   bits<5> CRD;
570   bits<5> CRA;
571   bits<5> CRB;
572   
573   let Pattern = pattern;
574   
575   let Inst{6-10}  = CRD;
576   let Inst{11-15} = CRA;
577   let Inst{16-20} = CRB;
578   let Inst{21-30} = xo;
579   let Inst{31}    = 0;
580 }
581
582 class XLForm_1_ext<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
583                InstrItinClass itin, list<dag> pattern>
584     : I<opcode, OOL, IOL, asmstr, itin> {
585   bits<5> CRD;
586   
587   let Pattern = pattern;
588   
589   let Inst{6-10}  = CRD;
590   let Inst{11-15} = CRD;
591   let Inst{16-20} = CRD;
592   let Inst{21-30} = xo;
593   let Inst{31}    = 0;
594 }
595
596 class XLForm_2<bits<6> opcode, bits<10> xo, bit lk, dag OOL, dag IOL, string asmstr, 
597                InstrItinClass itin, list<dag> pattern>
598     : I<opcode, OOL, IOL, asmstr, itin> {
599   bits<5> BO;
600   bits<5> BI;
601   bits<2> BH;
602   
603   let Pattern = pattern;
604   
605   let Inst{6-10}  = BO;
606   let Inst{11-15} = BI;
607   let Inst{16-18} = 0;
608   let Inst{19-20} = BH;
609   let Inst{21-30} = xo;
610   let Inst{31}    = lk;
611 }
612
613 class XLForm_2_br<bits<6> opcode, bits<10> xo, bit lk,
614                   dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern>
615   : XLForm_2<opcode, xo, lk, OOL, IOL, asmstr, itin, pattern> {
616   bits<7> BIBO;  // 2 bits of BI and 5 bits of BO.
617   bits<3>  CR;
618   
619   let BO = BIBO{4-0};
620   let BI{0-1} = BIBO{5-6};
621   let BI{2-4} = CR{0-2};
622   let BH = 0;
623 }
624
625
626 class XLForm_2_ext<bits<6> opcode, bits<10> xo, bits<5> bo,  bits<5> bi, bit lk,
627                   dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern>
628   : XLForm_2<opcode, xo, lk, OOL, IOL, asmstr, itin, pattern> {
629   let BO = bo;
630   let BI = bi;
631   let BH = 0;
632 }
633
634 class XLForm_3<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
635                InstrItinClass itin>
636          : I<opcode, OOL, IOL, asmstr, itin> {
637   bits<3> BF;
638   bits<3> BFA;
639   
640   let Inst{6-8}   = BF;
641   let Inst{9-10}  = 0;
642   let Inst{11-13} = BFA;
643   let Inst{14-15} = 0;
644   let Inst{16-20} = 0;
645   let Inst{21-30} = xo;
646   let Inst{31}    = 0;
647 }
648
649 // 1.7.8 XFX-Form
650 class XFXForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
651                 InstrItinClass itin>
652          : I<opcode, OOL, IOL, asmstr, itin> {
653   bits<5>  RT;
654   bits<10> SPR;
655
656   let Inst{6-10}  = RT;
657   let Inst{11}    = SPR{4};
658   let Inst{12}    = SPR{3};
659   let Inst{13}    = SPR{2};
660   let Inst{14}    = SPR{1};
661   let Inst{15}    = SPR{0};
662   let Inst{16}    = SPR{9};
663   let Inst{17}    = SPR{8};
664   let Inst{18}    = SPR{7};
665   let Inst{19}    = SPR{6};
666   let Inst{20}    = SPR{5};
667   let Inst{21-30} = xo;
668   let Inst{31}    = 0;
669 }
670
671 class XFXForm_1_ext<bits<6> opcode, bits<10> xo, bits<10> spr, 
672                    dag OOL, dag IOL, string asmstr, InstrItinClass itin> 
673   : XFXForm_1<opcode, xo, OOL, IOL, asmstr, itin> {
674   let SPR = spr;
675 }
676
677 class XFXForm_3<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
678                 InstrItinClass itin>
679          : I<opcode, OOL, IOL, asmstr, itin> {
680   bits<5>  RT;
681    
682   let Inst{6-10}  = RT;
683   let Inst{11-20} = 0;
684   let Inst{21-30} = xo;
685   let Inst{31}    = 0;
686 }
687
688 class XFXForm_5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
689                 InstrItinClass itin> 
690   : I<opcode, OOL, IOL, asmstr, itin> {
691   bits<8>  FXM;
692   bits<5>  rS;
693    
694   let Inst{6-10}  = rS;
695   let Inst{11}    = 0;
696   let Inst{12-19} = FXM;
697   let Inst{20}    = 0;
698   let Inst{21-30} = xo;
699   let Inst{31}    = 0;
700 }
701
702 class XFXForm_5a<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
703                  InstrItinClass itin> 
704   : I<opcode, OOL, IOL, asmstr, itin> {
705   bits<5>  ST;
706   bits<8>  FXM;
707    
708   let Inst{6-10}  = ST;
709   let Inst{11}    = 1;
710   let Inst{12-19} = FXM;
711   let Inst{20}    = 0;
712   let Inst{21-30} = xo;
713   let Inst{31}    = 0;
714 }
715
716 class XFXForm_7<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
717                 InstrItinClass itin>
718   : XFXForm_1<opcode, xo, OOL, IOL, asmstr, itin>;
719
720 class XFXForm_7_ext<bits<6> opcode, bits<10> xo, bits<10> spr, 
721                     dag OOL, dag IOL, string asmstr, InstrItinClass itin> 
722   : XFXForm_7<opcode, xo, OOL, IOL, asmstr, itin> {
723   let SPR = spr;
724 }
725
726 // XFL-Form - MTFSF
727 // This is probably 1.7.9, but I don't have the reference that uses this
728 // numbering scheme...
729 class XFLForm<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 
730               InstrItinClass itin, list<dag>pattern>
731   : I<opcode, OOL, IOL, asmstr, itin> {
732   bits<8> FM;
733   bits<5> rT;
734
735   bit RC = 0;    // set by isDOT
736   let Pattern = pattern;
737
738   let Inst{6} = 0;
739   let Inst{7-14}  = FM;
740   let Inst{15} = 0;
741   let Inst{16-20} = rT;
742   let Inst{21-30} = xo;
743   let Inst{31}    = RC;
744 }
745
746 // 1.7.10 XS-Form - SRADI.
747 class XSForm_1<bits<6> opcode, bits<9> xo, dag OOL, dag IOL, string asmstr,
748                InstrItinClass itin, list<dag> pattern>
749          : I<opcode, OOL, IOL, asmstr, itin> {
750   bits<5> A;
751   bits<5> RS;
752   bits<6> SH;
753
754   bit RC = 0;    // set by isDOT
755   let Pattern = pattern;
756
757   let Inst{6-10}  = RS;
758   let Inst{11-15} = A;
759   let Inst{16-20} = SH{4,3,2,1,0};
760   let Inst{21-29} = xo;
761   let Inst{30}    = SH{5};
762   let Inst{31}    = RC;
763 }
764
765 // 1.7.11 XO-Form
766 class XOForm_1<bits<6> opcode, bits<9> xo, bit oe, dag OOL, dag IOL, string asmstr,
767                InstrItinClass itin, list<dag> pattern>
768          : I<opcode, OOL, IOL, asmstr, itin> {
769   bits<5> RT;
770   bits<5> RA;
771   bits<5> RB;
772
773   let Pattern = pattern;
774
775   bit RC = 0;    // set by isDOT
776
777   let Inst{6-10}  = RT;
778   let Inst{11-15} = RA;
779   let Inst{16-20} = RB;
780   let Inst{21}    = oe;
781   let Inst{22-30} = xo;
782   let Inst{31}    = RC;  
783 }
784
785 class XOForm_3<bits<6> opcode, bits<9> xo, bit oe, 
786                dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern>
787   : XOForm_1<opcode, xo, oe, OOL, IOL, asmstr, itin, pattern> {
788   let RB = 0;
789 }
790
791 // 1.7.12 A-Form
792 class AForm_1<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr, 
793               InstrItinClass itin, list<dag> pattern>
794          : I<opcode, OOL, IOL, asmstr, itin> {
795   bits<5> FRT;
796   bits<5> FRA;
797   bits<5> FRC;
798   bits<5> FRB;
799
800   let Pattern = pattern;
801
802   bit RC = 0;    // set by isDOT
803
804   let Inst{6-10}  = FRT;
805   let Inst{11-15} = FRA;
806   let Inst{16-20} = FRB;
807   let Inst{21-25} = FRC;
808   let Inst{26-30} = xo;
809   let Inst{31}    = RC;
810 }
811
812 class AForm_2<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
813               InstrItinClass itin, list<dag> pattern>
814   : AForm_1<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
815   let FRC = 0;
816 }
817
818 class AForm_3<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
819               InstrItinClass itin, list<dag> pattern> 
820   : AForm_1<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
821   let FRB = 0;
822 }
823
824 class AForm_4<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr, 
825               InstrItinClass itin, list<dag> pattern>
826          : I<opcode, OOL, IOL, asmstr, itin> {
827   bits<5> RT;
828   bits<5> RA;
829   bits<5> RB;
830   bits<5> COND;
831
832   let Pattern = pattern;
833
834   let Inst{6-10}  = RT;
835   let Inst{11-15} = RA;
836   let Inst{16-20} = RB;
837   let Inst{21-25} = COND;
838   let Inst{26-30} = xo;
839   let Inst{31}    = 0;
840 }
841
842 // 1.7.13 M-Form
843 class MForm_1<bits<6> opcode, dag OOL, dag IOL, string asmstr,
844               InstrItinClass itin, list<dag> pattern>
845     : I<opcode, OOL, IOL, asmstr, itin> {
846   bits<5> RA;
847   bits<5> RS;
848   bits<5> RB;
849   bits<5> MB;
850   bits<5> ME;
851
852   let Pattern = pattern;
853
854   bit RC = 0;    // set by isDOT
855
856   let Inst{6-10}  = RS;
857   let Inst{11-15} = RA;
858   let Inst{16-20} = RB;
859   let Inst{21-25} = MB;
860   let Inst{26-30} = ME;
861   let Inst{31}    = RC;
862 }
863
864 class MForm_2<bits<6> opcode, dag OOL, dag IOL, string asmstr,
865               InstrItinClass itin, list<dag> pattern>
866   : MForm_1<opcode, OOL, IOL, asmstr, itin, pattern> {
867 }
868
869 // 1.7.14 MD-Form
870 class MDForm_1<bits<6> opcode, bits<3> xo, dag OOL, dag IOL, string asmstr,
871                InstrItinClass itin, list<dag> pattern>
872     : I<opcode, OOL, IOL, asmstr, itin> {
873   bits<5> RA;
874   bits<5> RS;
875   bits<6> SH;
876   bits<6> MBE;
877
878   let Pattern = pattern;
879
880   bit RC = 0;    // set by isDOT
881
882   let Inst{6-10}  = RS;
883   let Inst{11-15} = RA;
884   let Inst{16-20} = SH{4,3,2,1,0};
885   let Inst{21-26} = MBE{4,3,2,1,0,5};
886   let Inst{27-29} = xo;
887   let Inst{30}    = SH{5};
888   let Inst{31}    = RC;
889 }
890
891 class MDSForm_1<bits<6> opcode, bits<4> xo, dag OOL, dag IOL, string asmstr,
892                 InstrItinClass itin, list<dag> pattern>
893     : I<opcode, OOL, IOL, asmstr, itin> {
894   bits<5> RA;
895   bits<5> RS;
896   bits<5> RB;
897   bits<6> MBE;
898
899   let Pattern = pattern;
900
901   bit RC = 0;    // set by isDOT
902
903   let Inst{6-10}  = RS;
904   let Inst{11-15} = RA;
905   let Inst{16-20} = RB;
906   let Inst{21-26} = MBE{4,3,2,1,0,5};
907   let Inst{27-30} = xo;
908   let Inst{31}    = RC;
909 }
910
911
912 // E-1 VA-Form
913
914 // VAForm_1 - DACB ordering.
915 class VAForm_1<bits<6> xo, dag OOL, dag IOL, string asmstr,
916                InstrItinClass itin, list<dag> pattern>
917     : I<4, OOL, IOL, asmstr, itin> {
918   bits<5> VD;
919   bits<5> VA;
920   bits<5> VC;
921   bits<5> VB;
922
923   let Pattern = pattern;
924   
925   let Inst{6-10}  = VD;
926   let Inst{11-15} = VA;
927   let Inst{16-20} = VB;
928   let Inst{21-25} = VC;
929   let Inst{26-31} = xo;
930 }
931
932 // VAForm_1a - DABC ordering.
933 class VAForm_1a<bits<6> xo, dag OOL, dag IOL, string asmstr,
934                 InstrItinClass itin, list<dag> pattern>
935     : I<4, OOL, IOL, asmstr, itin> {
936   bits<5> VD;
937   bits<5> VA;
938   bits<5> VB;
939   bits<5> VC;
940
941   let Pattern = pattern;
942   
943   let Inst{6-10}  = VD;
944   let Inst{11-15} = VA;
945   let Inst{16-20} = VB;
946   let Inst{21-25} = VC;
947   let Inst{26-31} = xo;
948 }
949
950 class VAForm_2<bits<6> xo, dag OOL, dag IOL, string asmstr,
951                InstrItinClass itin, list<dag> pattern>
952     : I<4, OOL, IOL, asmstr, itin> {
953   bits<5> VD;
954   bits<5> VA;
955   bits<5> VB;
956   bits<4> SH;
957
958   let Pattern = pattern;
959   
960   let Inst{6-10}  = VD;
961   let Inst{11-15} = VA;
962   let Inst{16-20} = VB;
963   let Inst{21}    = 0;
964   let Inst{22-25} = SH;
965   let Inst{26-31} = xo;
966 }
967
968 // E-2 VX-Form
969 class VXForm_1<bits<11> xo, dag OOL, dag IOL, string asmstr,
970                InstrItinClass itin, list<dag> pattern>
971     : I<4, OOL, IOL, asmstr, itin> {
972   bits<5> VD;
973   bits<5> VA;
974   bits<5> VB;
975   
976   let Pattern = pattern;
977   
978   let Inst{6-10}  = VD;
979   let Inst{11-15} = VA;
980   let Inst{16-20} = VB;
981   let Inst{21-31} = xo;
982 }
983
984 class VXForm_setzero<bits<11> xo, dag OOL, dag IOL, string asmstr,
985                InstrItinClass itin, list<dag> pattern>
986     : VXForm_1<xo, OOL, IOL, asmstr, itin, pattern> {
987   let VA = VD;
988   let VB = VD;
989 }
990
991
992 class VXForm_2<bits<11> xo, dag OOL, dag IOL, string asmstr,
993                InstrItinClass itin, list<dag> pattern>
994     : I<4, OOL, IOL, asmstr, itin> {
995   bits<5> VD;
996   bits<5> VB;
997   
998   let Pattern = pattern;
999   
1000   let Inst{6-10}  = VD;
1001   let Inst{11-15} = 0;
1002   let Inst{16-20} = VB;
1003   let Inst{21-31} = xo;
1004 }
1005
1006 class VXForm_3<bits<11> xo, dag OOL, dag IOL, string asmstr,
1007                InstrItinClass itin, list<dag> pattern>
1008     : I<4, OOL, IOL, asmstr, itin> {
1009   bits<5> VD;
1010   bits<5> IMM;
1011   
1012   let Pattern = pattern;
1013   
1014   let Inst{6-10}  = VD;
1015   let Inst{11-15} = IMM;
1016   let Inst{16-20} = 0;
1017   let Inst{21-31} = xo;
1018 }
1019
1020 /// VXForm_4 - VX instructions with "VD,0,0" register fields, like mfvscr.
1021 class VXForm_4<bits<11> xo, dag OOL, dag IOL, string asmstr,
1022                InstrItinClass itin, list<dag> pattern>
1023     : I<4, OOL, IOL, asmstr, itin> {
1024   bits<5> VD;
1025   
1026   let Pattern = pattern;
1027   
1028   let Inst{6-10}  = VD;
1029   let Inst{11-15} = 0;
1030   let Inst{16-20} = 0;
1031   let Inst{21-31} = xo;
1032 }
1033
1034 /// VXForm_5 - VX instructions with "0,0,VB" register fields, like mtvscr.
1035 class VXForm_5<bits<11> xo, dag OOL, dag IOL, string asmstr,
1036                InstrItinClass itin, list<dag> pattern>
1037     : I<4, OOL, IOL, asmstr, itin> {
1038   bits<5> VB;
1039   
1040   let Pattern = pattern;
1041   
1042   let Inst{6-10}  = 0;
1043   let Inst{11-15} = 0;
1044   let Inst{16-20} = VB;
1045   let Inst{21-31} = xo;
1046 }
1047
1048 // E-4 VXR-Form
1049 class VXRForm_1<bits<10> xo, dag OOL, dag IOL, string asmstr,
1050                InstrItinClass itin, list<dag> pattern>
1051     : I<4, OOL, IOL, asmstr, itin> {
1052   bits<5> VD;
1053   bits<5> VA;
1054   bits<5> VB;
1055   bit RC = 0;
1056   
1057   let Pattern = pattern;
1058   
1059   let Inst{6-10}  = VD;
1060   let Inst{11-15} = VA;
1061   let Inst{16-20} = VB;
1062   let Inst{21}    = RC;
1063   let Inst{22-31} = xo;
1064 }
1065
1066 //===----------------------------------------------------------------------===//
1067 class Pseudo<dag OOL, dag IOL, string asmstr, list<dag> pattern>
1068     : I<0, OOL, IOL, asmstr, NoItinerary> {
1069   let isCodeGenOnly = 1;
1070   let PPC64 = 0;
1071   let Pattern = pattern;
1072   let Inst{31-0} = 0;
1073 }