[PowerPC] Add variants of "sync" instruction
[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   bits<2> L;
477
478   let Pattern = pattern;
479   let Inst{6-8}   = 0;
480   let Inst{9-10}  = L;
481   let Inst{11-15} = 0;
482   let Inst{16-20} = 0;
483   let Inst{21-30} = xo;
484   let Inst{31}    = 0;
485 }
486
487 class XForm_25<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
488                InstrItinClass itin, list<dag> pattern> 
489   : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
490 }
491
492 class XForm_26<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
493                InstrItinClass itin, list<dag> pattern>
494   : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
495   let A = 0;
496 }
497
498 class XForm_28<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
499                InstrItinClass itin, list<dag> pattern> 
500   : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
501 }
502
503 // This is used for MFFS, MTFSB0, MTFSB1.  42 is arbitrary; this series of
504 // numbers presumably relates to some document, but I haven't found it.
505 class XForm_42<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
506               InstrItinClass itin, list<dag> pattern>
507   : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
508   let Pattern = pattern;
509
510   bit RC = 0;    // set by isDOT
511
512   let Inst{6-10}  = RST;
513   let Inst{11-20} = 0;
514   let Inst{21-30} = xo;
515   let Inst{31}    = RC;
516 }
517 class XForm_43<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
518               InstrItinClass itin, list<dag> pattern>
519   : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
520   let Pattern = pattern;
521   bits<5> FM;
522
523   bit RC = 0;    // set by isDOT
524
525   let Inst{6-10}  = FM;
526   let Inst{11-20} = 0;
527   let Inst{21-30} = xo;
528   let Inst{31}    = RC;
529 }
530
531 // DCB_Form - Form X instruction, used for dcb* instructions.
532 class DCB_Form<bits<10> xo, bits<5> immfield, dag OOL, dag IOL, string asmstr, 
533                       InstrItinClass itin, list<dag> pattern>
534   : I<31, OOL, IOL, asmstr, itin> {
535   bits<5> A;
536   bits<5> B;
537
538   let Pattern = pattern;
539
540   let Inst{6-10}  = immfield;
541   let Inst{11-15} = A;
542   let Inst{16-20} = B;
543   let Inst{21-30} = xo;
544   let Inst{31}    = 0;
545 }
546
547
548 // DSS_Form - Form X instruction, used for altivec dss* instructions.
549 class DSS_Form<bits<10> xo, dag OOL, dag IOL, string asmstr, 
550                       InstrItinClass itin, list<dag> pattern>
551   : I<31, OOL, IOL, asmstr, itin> {
552   bits<1> T;
553   bits<2> STRM;
554   bits<5> A;
555   bits<5> B;
556
557   let Pattern = pattern;
558
559   let Inst{6}     = T;
560   let Inst{7-8}   = 0;
561   let Inst{9-10}  = STRM;
562   let Inst{11-15} = A;
563   let Inst{16-20} = B;
564   let Inst{21-30} = xo;
565   let Inst{31}    = 0;
566 }
567
568 // 1.7.7 XL-Form
569 class XLForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
570                InstrItinClass itin, list<dag> pattern>
571     : I<opcode, OOL, IOL, asmstr, itin> {
572   bits<5> CRD;
573   bits<5> CRA;
574   bits<5> CRB;
575   
576   let Pattern = pattern;
577   
578   let Inst{6-10}  = CRD;
579   let Inst{11-15} = CRA;
580   let Inst{16-20} = CRB;
581   let Inst{21-30} = xo;
582   let Inst{31}    = 0;
583 }
584
585 class XLForm_1_ext<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
586                InstrItinClass itin, list<dag> pattern>
587     : I<opcode, OOL, IOL, asmstr, itin> {
588   bits<5> CRD;
589   
590   let Pattern = pattern;
591   
592   let Inst{6-10}  = CRD;
593   let Inst{11-15} = CRD;
594   let Inst{16-20} = CRD;
595   let Inst{21-30} = xo;
596   let Inst{31}    = 0;
597 }
598
599 class XLForm_2<bits<6> opcode, bits<10> xo, bit lk, dag OOL, dag IOL, string asmstr, 
600                InstrItinClass itin, list<dag> pattern>
601     : I<opcode, OOL, IOL, asmstr, itin> {
602   bits<5> BO;
603   bits<5> BI;
604   bits<2> BH;
605   
606   let Pattern = pattern;
607   
608   let Inst{6-10}  = BO;
609   let Inst{11-15} = BI;
610   let Inst{16-18} = 0;
611   let Inst{19-20} = BH;
612   let Inst{21-30} = xo;
613   let Inst{31}    = lk;
614 }
615
616 class XLForm_2_br<bits<6> opcode, bits<10> xo, bit lk,
617                   dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern>
618   : XLForm_2<opcode, xo, lk, OOL, IOL, asmstr, itin, pattern> {
619   bits<7> BIBO;  // 2 bits of BI and 5 bits of BO.
620   bits<3>  CR;
621   
622   let BO = BIBO{4-0};
623   let BI{0-1} = BIBO{5-6};
624   let BI{2-4} = CR{0-2};
625   let BH = 0;
626 }
627
628
629 class XLForm_2_ext<bits<6> opcode, bits<10> xo, bits<5> bo,  bits<5> bi, bit lk,
630                   dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern>
631   : XLForm_2<opcode, xo, lk, OOL, IOL, asmstr, itin, pattern> {
632   let BO = bo;
633   let BI = bi;
634   let BH = 0;
635 }
636
637 class XLForm_3<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
638                InstrItinClass itin>
639          : I<opcode, OOL, IOL, asmstr, itin> {
640   bits<3> BF;
641   bits<3> BFA;
642   
643   let Inst{6-8}   = BF;
644   let Inst{9-10}  = 0;
645   let Inst{11-13} = BFA;
646   let Inst{14-15} = 0;
647   let Inst{16-20} = 0;
648   let Inst{21-30} = xo;
649   let Inst{31}    = 0;
650 }
651
652 // 1.7.8 XFX-Form
653 class XFXForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
654                 InstrItinClass itin>
655          : I<opcode, OOL, IOL, asmstr, itin> {
656   bits<5>  RT;
657   bits<10> SPR;
658
659   let Inst{6-10}  = RT;
660   let Inst{11}    = SPR{4};
661   let Inst{12}    = SPR{3};
662   let Inst{13}    = SPR{2};
663   let Inst{14}    = SPR{1};
664   let Inst{15}    = SPR{0};
665   let Inst{16}    = SPR{9};
666   let Inst{17}    = SPR{8};
667   let Inst{18}    = SPR{7};
668   let Inst{19}    = SPR{6};
669   let Inst{20}    = SPR{5};
670   let Inst{21-30} = xo;
671   let Inst{31}    = 0;
672 }
673
674 class XFXForm_1_ext<bits<6> opcode, bits<10> xo, bits<10> spr, 
675                    dag OOL, dag IOL, string asmstr, InstrItinClass itin> 
676   : XFXForm_1<opcode, xo, OOL, IOL, asmstr, itin> {
677   let SPR = spr;
678 }
679
680 class XFXForm_3<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
681                 InstrItinClass itin>
682          : I<opcode, OOL, IOL, asmstr, itin> {
683   bits<5>  RT;
684    
685   let Inst{6-10}  = RT;
686   let Inst{11-20} = 0;
687   let Inst{21-30} = xo;
688   let Inst{31}    = 0;
689 }
690
691 class XFXForm_5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
692                 InstrItinClass itin> 
693   : I<opcode, OOL, IOL, asmstr, itin> {
694   bits<8>  FXM;
695   bits<5>  rS;
696    
697   let Inst{6-10}  = rS;
698   let Inst{11}    = 0;
699   let Inst{12-19} = FXM;
700   let Inst{20}    = 0;
701   let Inst{21-30} = xo;
702   let Inst{31}    = 0;
703 }
704
705 class XFXForm_5a<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
706                  InstrItinClass itin> 
707   : I<opcode, OOL, IOL, asmstr, itin> {
708   bits<5>  ST;
709   bits<8>  FXM;
710    
711   let Inst{6-10}  = ST;
712   let Inst{11}    = 1;
713   let Inst{12-19} = FXM;
714   let Inst{20}    = 0;
715   let Inst{21-30} = xo;
716   let Inst{31}    = 0;
717 }
718
719 class XFXForm_7<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
720                 InstrItinClass itin>
721   : XFXForm_1<opcode, xo, OOL, IOL, asmstr, itin>;
722
723 class XFXForm_7_ext<bits<6> opcode, bits<10> xo, bits<10> spr, 
724                     dag OOL, dag IOL, string asmstr, InstrItinClass itin> 
725   : XFXForm_7<opcode, xo, OOL, IOL, asmstr, itin> {
726   let SPR = spr;
727 }
728
729 // XFL-Form - MTFSF
730 // This is probably 1.7.9, but I don't have the reference that uses this
731 // numbering scheme...
732 class XFLForm<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 
733               InstrItinClass itin, list<dag>pattern>
734   : I<opcode, OOL, IOL, asmstr, itin> {
735   bits<8> FM;
736   bits<5> rT;
737
738   bit RC = 0;    // set by isDOT
739   let Pattern = pattern;
740
741   let Inst{6} = 0;
742   let Inst{7-14}  = FM;
743   let Inst{15} = 0;
744   let Inst{16-20} = rT;
745   let Inst{21-30} = xo;
746   let Inst{31}    = RC;
747 }
748
749 // 1.7.10 XS-Form - SRADI.
750 class XSForm_1<bits<6> opcode, bits<9> xo, dag OOL, dag IOL, string asmstr,
751                InstrItinClass itin, list<dag> pattern>
752          : I<opcode, OOL, IOL, asmstr, itin> {
753   bits<5> A;
754   bits<5> RS;
755   bits<6> SH;
756
757   bit RC = 0;    // set by isDOT
758   let Pattern = pattern;
759
760   let Inst{6-10}  = RS;
761   let Inst{11-15} = A;
762   let Inst{16-20} = SH{4,3,2,1,0};
763   let Inst{21-29} = xo;
764   let Inst{30}    = SH{5};
765   let Inst{31}    = RC;
766 }
767
768 // 1.7.11 XO-Form
769 class XOForm_1<bits<6> opcode, bits<9> xo, bit oe, dag OOL, dag IOL, string asmstr,
770                InstrItinClass itin, list<dag> pattern>
771          : I<opcode, OOL, IOL, asmstr, itin> {
772   bits<5> RT;
773   bits<5> RA;
774   bits<5> RB;
775
776   let Pattern = pattern;
777
778   bit RC = 0;    // set by isDOT
779
780   let Inst{6-10}  = RT;
781   let Inst{11-15} = RA;
782   let Inst{16-20} = RB;
783   let Inst{21}    = oe;
784   let Inst{22-30} = xo;
785   let Inst{31}    = RC;  
786 }
787
788 class XOForm_3<bits<6> opcode, bits<9> xo, bit oe, 
789                dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern>
790   : XOForm_1<opcode, xo, oe, OOL, IOL, asmstr, itin, pattern> {
791   let RB = 0;
792 }
793
794 // 1.7.12 A-Form
795 class AForm_1<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr, 
796               InstrItinClass itin, list<dag> pattern>
797          : I<opcode, OOL, IOL, asmstr, itin> {
798   bits<5> FRT;
799   bits<5> FRA;
800   bits<5> FRC;
801   bits<5> FRB;
802
803   let Pattern = pattern;
804
805   bit RC = 0;    // set by isDOT
806
807   let Inst{6-10}  = FRT;
808   let Inst{11-15} = FRA;
809   let Inst{16-20} = FRB;
810   let Inst{21-25} = FRC;
811   let Inst{26-30} = xo;
812   let Inst{31}    = RC;
813 }
814
815 class AForm_2<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
816               InstrItinClass itin, list<dag> pattern>
817   : AForm_1<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
818   let FRC = 0;
819 }
820
821 class AForm_3<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
822               InstrItinClass itin, list<dag> pattern> 
823   : AForm_1<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
824   let FRB = 0;
825 }
826
827 class AForm_4<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr, 
828               InstrItinClass itin, list<dag> pattern>
829          : I<opcode, OOL, IOL, asmstr, itin> {
830   bits<5> RT;
831   bits<5> RA;
832   bits<5> RB;
833   bits<5> COND;
834
835   let Pattern = pattern;
836
837   let Inst{6-10}  = RT;
838   let Inst{11-15} = RA;
839   let Inst{16-20} = RB;
840   let Inst{21-25} = COND;
841   let Inst{26-30} = xo;
842   let Inst{31}    = 0;
843 }
844
845 // 1.7.13 M-Form
846 class MForm_1<bits<6> opcode, dag OOL, dag IOL, string asmstr,
847               InstrItinClass itin, list<dag> pattern>
848     : I<opcode, OOL, IOL, asmstr, itin> {
849   bits<5> RA;
850   bits<5> RS;
851   bits<5> RB;
852   bits<5> MB;
853   bits<5> ME;
854
855   let Pattern = pattern;
856
857   bit RC = 0;    // set by isDOT
858
859   let Inst{6-10}  = RS;
860   let Inst{11-15} = RA;
861   let Inst{16-20} = RB;
862   let Inst{21-25} = MB;
863   let Inst{26-30} = ME;
864   let Inst{31}    = RC;
865 }
866
867 class MForm_2<bits<6> opcode, dag OOL, dag IOL, string asmstr,
868               InstrItinClass itin, list<dag> pattern>
869   : MForm_1<opcode, OOL, IOL, asmstr, itin, pattern> {
870 }
871
872 // 1.7.14 MD-Form
873 class MDForm_1<bits<6> opcode, bits<3> xo, dag OOL, dag IOL, string asmstr,
874                InstrItinClass itin, list<dag> pattern>
875     : I<opcode, OOL, IOL, asmstr, itin> {
876   bits<5> RA;
877   bits<5> RS;
878   bits<6> SH;
879   bits<6> MBE;
880
881   let Pattern = pattern;
882
883   bit RC = 0;    // set by isDOT
884
885   let Inst{6-10}  = RS;
886   let Inst{11-15} = RA;
887   let Inst{16-20} = SH{4,3,2,1,0};
888   let Inst{21-26} = MBE{4,3,2,1,0,5};
889   let Inst{27-29} = xo;
890   let Inst{30}    = SH{5};
891   let Inst{31}    = RC;
892 }
893
894 class MDSForm_1<bits<6> opcode, bits<4> xo, dag OOL, dag IOL, string asmstr,
895                 InstrItinClass itin, list<dag> pattern>
896     : I<opcode, OOL, IOL, asmstr, itin> {
897   bits<5> RA;
898   bits<5> RS;
899   bits<5> RB;
900   bits<6> MBE;
901
902   let Pattern = pattern;
903
904   bit RC = 0;    // set by isDOT
905
906   let Inst{6-10}  = RS;
907   let Inst{11-15} = RA;
908   let Inst{16-20} = RB;
909   let Inst{21-26} = MBE{4,3,2,1,0,5};
910   let Inst{27-30} = xo;
911   let Inst{31}    = RC;
912 }
913
914
915 // E-1 VA-Form
916
917 // VAForm_1 - DACB ordering.
918 class VAForm_1<bits<6> xo, dag OOL, dag IOL, string asmstr,
919                InstrItinClass itin, list<dag> pattern>
920     : I<4, OOL, IOL, asmstr, itin> {
921   bits<5> VD;
922   bits<5> VA;
923   bits<5> VC;
924   bits<5> VB;
925
926   let Pattern = pattern;
927   
928   let Inst{6-10}  = VD;
929   let Inst{11-15} = VA;
930   let Inst{16-20} = VB;
931   let Inst{21-25} = VC;
932   let Inst{26-31} = xo;
933 }
934
935 // VAForm_1a - DABC ordering.
936 class VAForm_1a<bits<6> xo, dag OOL, dag IOL, string asmstr,
937                 InstrItinClass itin, list<dag> pattern>
938     : I<4, OOL, IOL, asmstr, itin> {
939   bits<5> VD;
940   bits<5> VA;
941   bits<5> VB;
942   bits<5> VC;
943
944   let Pattern = pattern;
945   
946   let Inst{6-10}  = VD;
947   let Inst{11-15} = VA;
948   let Inst{16-20} = VB;
949   let Inst{21-25} = VC;
950   let Inst{26-31} = xo;
951 }
952
953 class VAForm_2<bits<6> xo, dag OOL, dag IOL, string asmstr,
954                InstrItinClass itin, list<dag> pattern>
955     : I<4, OOL, IOL, asmstr, itin> {
956   bits<5> VD;
957   bits<5> VA;
958   bits<5> VB;
959   bits<4> SH;
960
961   let Pattern = pattern;
962   
963   let Inst{6-10}  = VD;
964   let Inst{11-15} = VA;
965   let Inst{16-20} = VB;
966   let Inst{21}    = 0;
967   let Inst{22-25} = SH;
968   let Inst{26-31} = xo;
969 }
970
971 // E-2 VX-Form
972 class VXForm_1<bits<11> xo, dag OOL, dag IOL, string asmstr,
973                InstrItinClass itin, list<dag> pattern>
974     : I<4, OOL, IOL, asmstr, itin> {
975   bits<5> VD;
976   bits<5> VA;
977   bits<5> VB;
978   
979   let Pattern = pattern;
980   
981   let Inst{6-10}  = VD;
982   let Inst{11-15} = VA;
983   let Inst{16-20} = VB;
984   let Inst{21-31} = xo;
985 }
986
987 class VXForm_setzero<bits<11> xo, dag OOL, dag IOL, string asmstr,
988                InstrItinClass itin, list<dag> pattern>
989     : VXForm_1<xo, OOL, IOL, asmstr, itin, pattern> {
990   let VA = VD;
991   let VB = VD;
992 }
993
994
995 class VXForm_2<bits<11> xo, dag OOL, dag IOL, string asmstr,
996                InstrItinClass itin, list<dag> pattern>
997     : I<4, OOL, IOL, asmstr, itin> {
998   bits<5> VD;
999   bits<5> VB;
1000   
1001   let Pattern = pattern;
1002   
1003   let Inst{6-10}  = VD;
1004   let Inst{11-15} = 0;
1005   let Inst{16-20} = VB;
1006   let Inst{21-31} = xo;
1007 }
1008
1009 class VXForm_3<bits<11> xo, dag OOL, dag IOL, string asmstr,
1010                InstrItinClass itin, list<dag> pattern>
1011     : I<4, OOL, IOL, asmstr, itin> {
1012   bits<5> VD;
1013   bits<5> IMM;
1014   
1015   let Pattern = pattern;
1016   
1017   let Inst{6-10}  = VD;
1018   let Inst{11-15} = IMM;
1019   let Inst{16-20} = 0;
1020   let Inst{21-31} = xo;
1021 }
1022
1023 /// VXForm_4 - VX instructions with "VD,0,0" register fields, like mfvscr.
1024 class VXForm_4<bits<11> xo, dag OOL, dag IOL, string asmstr,
1025                InstrItinClass itin, list<dag> pattern>
1026     : I<4, OOL, IOL, asmstr, itin> {
1027   bits<5> VD;
1028   
1029   let Pattern = pattern;
1030   
1031   let Inst{6-10}  = VD;
1032   let Inst{11-15} = 0;
1033   let Inst{16-20} = 0;
1034   let Inst{21-31} = xo;
1035 }
1036
1037 /// VXForm_5 - VX instructions with "0,0,VB" register fields, like mtvscr.
1038 class VXForm_5<bits<11> xo, dag OOL, dag IOL, string asmstr,
1039                InstrItinClass itin, list<dag> pattern>
1040     : I<4, OOL, IOL, asmstr, itin> {
1041   bits<5> VB;
1042   
1043   let Pattern = pattern;
1044   
1045   let Inst{6-10}  = 0;
1046   let Inst{11-15} = 0;
1047   let Inst{16-20} = VB;
1048   let Inst{21-31} = xo;
1049 }
1050
1051 // E-4 VXR-Form
1052 class VXRForm_1<bits<10> xo, dag OOL, dag IOL, string asmstr,
1053                InstrItinClass itin, list<dag> pattern>
1054     : I<4, OOL, IOL, asmstr, itin> {
1055   bits<5> VD;
1056   bits<5> VA;
1057   bits<5> VB;
1058   bit RC = 0;
1059   
1060   let Pattern = pattern;
1061   
1062   let Inst{6-10}  = VD;
1063   let Inst{11-15} = VA;
1064   let Inst{16-20} = VB;
1065   let Inst{21}    = RC;
1066   let Inst{22-31} = xo;
1067 }
1068
1069 //===----------------------------------------------------------------------===//
1070 class Pseudo<dag OOL, dag IOL, string asmstr, list<dag> pattern>
1071     : I<0, OOL, IOL, asmstr, NoItinerary> {
1072   let isCodeGenOnly = 1;
1073   let PPC64 = 0;
1074   let Pattern = pattern;
1075   let Inst{31-0} = 0;
1076 }