add support for encoding the lo14 forms used for a few PPC64 addressing
[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
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;
44
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;   }
53
54
55 // 1.7.1 I-Form
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;
60   bits<24> LI;
61
62   let Inst{6-29}  = LI;
63   let Inst{30}    = aa;
64   let Inst{31}    = lk;
65 }
66
67 // 1.7.2 B-Form
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.
71   bits<3>  CR;
72   bits<14> BD;
73
74   bits<5> BI;
75   let BI{0-1} = BIBO{5-6};
76   let BI{2-4} = CR{0-2};
77
78   let Inst{6-10}  = BIBO{4-0};
79   let Inst{11-15} = BI;
80   let Inst{16-29} = BD;
81   let Inst{30}    = aa;
82   let Inst{31}    = lk;
83 }
84
85
86 // 1.7.4 D-Form
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> {
90   bits<5>  A;
91   bits<5>  B;
92   bits<16> C;
93
94   let Pattern = pattern;
95   
96   let Inst{6-10}  = A;
97   let Inst{11-15} = B;
98   let Inst{16-31} = C;
99 }
100
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> {
104   bits<5>  A;
105   bits<16> C;
106   bits<5>  B;
107
108   let Pattern = pattern;
109   
110   let Inst{6-10}  = A;
111   let Inst{11-15} = B;
112   let Inst{16-31} = C;
113 }
114
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>;
118
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> {
122   bits<5>  A;
123   bits<16> B;
124   
125   let Pattern = pattern;
126   
127   let Inst{6-10}  = A;
128   let Inst{11-15} = 0;
129   let Inst{16-31} = B;
130 }
131
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> {
135   bits<5>  B;
136   bits<5>  A;
137   bits<16> C;
138   
139   let Pattern = pattern;
140   
141   let Inst{6-10}  = A;
142   let Inst{11-15} = B;
143   let Inst{16-31} = C;
144 }
145               
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> {
149   let A = 0;
150   let B = 0;
151   let C = 0;
152 }
153
154 class DForm_5<bits<6> opcode, dag OOL, dag IOL, string asmstr,
155               InstrItinClass itin>
156   : I<opcode, OOL, IOL, asmstr, itin> {
157   bits<3>  BF;
158   bits<1>  L;
159   bits<5>  RA;
160   bits<16> I;
161
162   let Inst{6-8}   = BF;
163   let Inst{9}     = 0;
164   let Inst{10}    = L;
165   let Inst{11-15} = RA;
166   let Inst{16-31} = I;
167 }
168
169 class DForm_5_ext<bits<6> opcode, dag OOL, dag IOL, string asmstr,
170                   InstrItinClass itin>
171   : DForm_5<opcode, OOL, IOL, asmstr, itin> {
172   let L = PPC64;
173 }
174
175 class DForm_6<bits<6> opcode, dag OOL, dag IOL, string asmstr,
176               InstrItinClass itin> 
177   : DForm_5<opcode, OOL, IOL, asmstr, itin>;
178
179 class DForm_6_ext<bits<6> opcode, dag OOL, dag IOL, string asmstr,
180                   InstrItinClass itin>
181   : DForm_6<opcode, OOL, IOL, asmstr, itin> {
182   let L = PPC64;
183 }
184
185
186 // 1.7.5 DS-Form
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> {
190   bits<5>  RST;
191   bits<19> DS_RA;
192
193   let Pattern = pattern;
194   
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;
199 }
200
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> {
204    bits<5>  RST;
205    bits<14> DS;
206    bits<5>  RA;
207  
208    let Pattern = pattern;
209    
210    let Inst{6-10}  = RST;
211    let Inst{11-15} = RA;
212    let Inst{16-29} = DS;
213    let Inst{30-31} = xo;
214 }
215
216 // 1.7.6 X-Form
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> {
220   bits<5> RST;
221   bits<5> A;
222   bits<5> B;
223
224   let Pattern = pattern;
225
226   bit RC = 0;    // set by isDOT
227
228   let Inst{6-10}  = RST;
229   let Inst{11-15} = A;
230   let Inst{16-20} = B;
231   let Inst{21-30} = xo;
232   let Inst{31}    = RC;
233 }
234
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,
239         InstrItinClass itin> 
240   : I<opcode, OOL, IOL, asmstr, itin> {
241   bits<5> A;
242   bits<5> RST;
243   bits<5> B;
244
245   bit RC = 0;    // set by isDOT
246
247   let Inst{6-10}  = RST;
248   let Inst{11-15} = A;
249   let Inst{16-20} = B;
250   let Inst{21-30} = xo;
251   let Inst{31}    = RC;
252 }
253
254
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>;
258
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;
263 }
264
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>;
268
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;
273 }
274
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> {
278   let B = 0;
279   let Pattern = pattern;
280 }
281
282 class XForm_16<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
283                InstrItinClass itin>
284          : I<opcode, OOL, IOL, asmstr, itin> {
285   bits<3> BF;
286   bits<1> L; 
287   bits<5> RA;
288   bits<5> RB;
289   
290   let Inst{6-8}   = BF;
291   let Inst{9}     = 0;
292   let Inst{10}    = L;
293   let Inst{11-15} = RA;
294   let Inst{16-20} = RB;
295   let Inst{21-30} = xo;
296   let Inst{31}    = 0;
297 }
298
299 class XForm_16_ext<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
300                    InstrItinClass itin>
301   : XForm_16<opcode, xo, OOL, IOL, asmstr, itin> {
302   let L = PPC64;
303 }
304
305 class XForm_17<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
306                InstrItinClass itin>
307          : I<opcode, OOL, IOL, asmstr, itin> {
308   bits<3> BF;
309   bits<5> FRA;
310   bits<5> FRB;
311   
312   let Inst{6-8}   = BF;
313   let Inst{9-10}  = 0;
314   let Inst{11-15} = FRA;
315   let Inst{16-20} = FRB;
316   let Inst{21-30} = xo;
317   let Inst{31}    = 0;
318 }
319
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;
324   let Inst{6-10}  = 31;
325   let Inst{11-15} = 0;
326   let Inst{16-20} = 0;
327   let Inst{21-30} = xo;
328   let Inst{31}    = 0;
329 }
330
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;
335   let Inst{6-10}  = 0;
336   let Inst{11-15} = 0;
337   let Inst{16-20} = 0;
338   let Inst{21-30} = xo;
339   let Inst{31}    = 0;
340 }
341
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> {
345 }
346
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> {
350   let A = 0;
351 }
352
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> {
356 }
357
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;
364
365   bit RC = 0;    // set by isDOT
366
367   let Inst{6-10}  = RST;
368   let Inst{11-20} = 0;
369   let Inst{21-30} = xo;
370   let Inst{31}    = RC;
371 }
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;
376   bits<5> FM;
377
378   bit RC = 0;    // set by isDOT
379
380   let Inst{6-10}  = FM;
381   let Inst{11-20} = 0;
382   let Inst{21-30} = xo;
383   let Inst{31}    = RC;
384 }
385
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> {
390   bits<5> A;
391   bits<5> B;
392
393   let Pattern = pattern;
394
395   let Inst{6-10}  = immfield;
396   let Inst{11-15} = A;
397   let Inst{16-20} = B;
398   let Inst{21-30} = xo;
399   let Inst{31}    = 0;
400 }
401
402
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> {
407   bits<1> T;
408   bits<2> STRM;
409   bits<5> A;
410   bits<5> B;
411
412   let Pattern = pattern;
413
414   let Inst{6}     = T;
415   let Inst{7-8}   = 0;
416   let Inst{9-10}  = STRM;
417   let Inst{11-15} = A;
418   let Inst{16-20} = B;
419   let Inst{21-30} = xo;
420   let Inst{31}    = 0;
421 }
422
423 // 1.7.7 XL-Form
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> {
427   bits<5> CRD;
428   bits<5> CRA;
429   bits<5> CRB;
430   
431   let Pattern = pattern;
432   
433   let Inst{6-10}  = CRD;
434   let Inst{11-15} = CRA;
435   let Inst{16-20} = CRB;
436   let Inst{21-30} = xo;
437   let Inst{31}    = 0;
438 }
439
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> {
443   bits<5> CRD;
444   
445   let Pattern = pattern;
446   
447   let Inst{6-10}  = CRD;
448   let Inst{11-15} = CRD;
449   let Inst{16-20} = CRD;
450   let Inst{21-30} = xo;
451   let Inst{31}    = 0;
452 }
453
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> {
457   bits<5> BO;
458   bits<5> BI;
459   bits<2> BH;
460   
461   let Pattern = pattern;
462   
463   let Inst{6-10}  = BO;
464   let Inst{11-15} = BI;
465   let Inst{16-18} = 0;
466   let Inst{19-20} = BH;
467   let Inst{21-30} = xo;
468   let Inst{31}    = lk;
469 }
470
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.
475   bits<3>  CR;
476   
477   let BO = BIBO{2-6};
478   let BI{0-1} = BIBO{0-1};
479   let BI{2-4} = CR;
480   let BH = 0;
481 }
482
483
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> {
487   let BO = bo;
488   let BI = bi;
489   let BH = 0;
490 }
491
492 class XLForm_3<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
493                InstrItinClass itin>
494          : I<opcode, OOL, IOL, asmstr, itin> {
495   bits<3> BF;
496   bits<3> BFA;
497   
498   let Inst{6-8}   = BF;
499   let Inst{9-10}  = 0;
500   let Inst{11-13} = BFA;
501   let Inst{14-15} = 0;
502   let Inst{16-20} = 0;
503   let Inst{21-30} = xo;
504   let Inst{31}    = 0;
505 }
506
507 // 1.7.8 XFX-Form
508 class XFXForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
509                 InstrItinClass itin>
510          : I<opcode, OOL, IOL, asmstr, itin> {
511   bits<5>  RT;
512   bits<10> SPR;
513
514   let Inst{6-10}  = RT;
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;
526   let Inst{31}    = 0;
527 }
528
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> {
532   let SPR = spr;
533 }
534
535 class XFXForm_3<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
536                 InstrItinClass itin>
537          : I<opcode, OOL, IOL, asmstr, itin> {
538   bits<5>  RT;
539    
540   let Inst{6-10}  = RT;
541   let Inst{11-20} = 0;
542   let Inst{21-30} = xo;
543   let Inst{31}    = 0;
544 }
545
546 class XFXForm_5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
547                 InstrItinClass itin> 
548   : I<opcode, OOL, IOL, asmstr, itin> {
549   bits<8>  FXM;
550   bits<5>  ST;
551    
552   let Inst{6-10}  = ST;
553   let Inst{11}    = 0;
554   let Inst{12-19} = FXM;
555   let Inst{20}    = 0;
556   let Inst{21-30} = xo;
557   let Inst{31}    = 0;
558 }
559
560 class XFXForm_5a<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
561                  InstrItinClass itin> 
562   : I<opcode, OOL, IOL, asmstr, itin> {
563   bits<5>  ST;
564   bits<8>  FXM;
565    
566   let Inst{6-10}  = ST;
567   let Inst{11}    = 1;
568   let Inst{12-19} = FXM;
569   let Inst{20}    = 0;
570   let Inst{21-30} = xo;
571   let Inst{31}    = 0;
572 }
573
574 class XFXForm_7<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
575                 InstrItinClass itin>
576   : XFXForm_1<opcode, xo, OOL, IOL, asmstr, itin>;
577
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> {
581   let SPR = spr;
582 }
583
584 // XFL-Form - MTFSF
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> {
590   bits<8> FM;
591   bits<5> RT;
592
593   bit RC = 0;    // set by isDOT
594   let Pattern = pattern;
595   let Constraints = cstr;
596
597   let Inst{6} = 0;
598   let Inst{7-14}  = FM;
599   let Inst{15} = 0;
600   let Inst{16-20} = RT;
601   let Inst{21-30} = xo;
602   let Inst{31}    = RC;
603 }
604
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> {
609   bits<5> A;
610   bits<5> RS;
611   bits<6> SH;
612
613   bit RC = 0;    // set by isDOT
614   let Pattern = pattern;
615
616   let Inst{6-10}  = RS;
617   let Inst{11-15} = A;
618   let Inst{16-20} = SH{4,3,2,1,0};
619   let Inst{21-29} = xo;
620   let Inst{30}    = SH{5};
621   let Inst{31}    = RC;
622 }
623
624 // 1.7.11 XO-Form
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> {
628   bits<5> RT;
629   bits<5> RA;
630   bits<5> RB;
631
632   let Pattern = pattern;
633
634   bit RC = 0;    // set by isDOT
635
636   let Inst{6-10}  = RT;
637   let Inst{11-15} = RA;
638   let Inst{16-20} = RB;
639   let Inst{21}    = oe;
640   let Inst{22-30} = xo;
641   let Inst{31}    = RC;  
642 }
643
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> {
647   let RB = 0;
648 }
649
650 // 1.7.12 A-Form
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> {
654   bits<5> FRT;
655   bits<5> FRA;
656   bits<5> FRC;
657   bits<5> FRB;
658
659   let Pattern = pattern;
660
661   bit RC = 0;    // set by isDOT
662
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;
668   let Inst{31}    = RC;
669 }
670
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> {
674   let FRC = 0;
675 }
676
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> {
680   let FRB = 0;
681 }
682
683 // 1.7.13 M-Form
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> {
687   bits<5> RA;
688   bits<5> RS;
689   bits<5> RB;
690   bits<5> MB;
691   bits<5> ME;
692
693   let Pattern = pattern;
694
695   bit RC = 0;    // set by isDOT
696
697   let Inst{6-10}  = RS;
698   let Inst{11-15} = RA;
699   let Inst{16-20} = RB;
700   let Inst{21-25} = MB;
701   let Inst{26-30} = ME;
702   let Inst{31}    = RC;
703 }
704
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> {
708 }
709
710 // 1.7.14 MD-Form
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> {
714   bits<5> RA;
715   bits<5> RS;
716   bits<6> SH;
717   bits<6> MBE;
718
719   let Pattern = pattern;
720
721   bit RC = 0;    // set by isDOT
722
723   let Inst{6-10}  = RS;
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};
729   let Inst{31}    = RC;
730 }
731
732
733
734 // E-1 VA-Form
735
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> {
740   bits<5> VD;
741   bits<5> VA;
742   bits<5> VC;
743   bits<5> VB;
744
745   let Pattern = pattern;
746   
747   let Inst{6-10}  = VD;
748   let Inst{11-15} = VA;
749   let Inst{16-20} = VB;
750   let Inst{21-25} = VC;
751   let Inst{26-31} = xo;
752 }
753
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> {
758   bits<5> VD;
759   bits<5> VA;
760   bits<5> VB;
761   bits<5> VC;
762
763   let Pattern = pattern;
764   
765   let Inst{6-10}  = VD;
766   let Inst{11-15} = VA;
767   let Inst{16-20} = VB;
768   let Inst{21-25} = VC;
769   let Inst{26-31} = xo;
770 }
771
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> {
775   bits<5> VD;
776   bits<5> VA;
777   bits<5> VB;
778   bits<4> SH;
779
780   let Pattern = pattern;
781   
782   let Inst{6-10}  = VD;
783   let Inst{11-15} = VA;
784   let Inst{16-20} = VB;
785   let Inst{21}    = 0;
786   let Inst{22-25} = SH;
787   let Inst{26-31} = xo;
788 }
789
790 // E-2 VX-Form
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> {
794   bits<5> VD;
795   bits<5> VA;
796   bits<5> VB;
797   
798   let Pattern = pattern;
799   
800   let Inst{6-10}  = VD;
801   let Inst{11-15} = VA;
802   let Inst{16-20} = VB;
803   let Inst{21-31} = xo;
804 }
805
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> {
809   let VA = VD;
810   let VB = VD;
811 }
812
813
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> {
817   bits<5> VD;
818   bits<5> VB;
819   
820   let Pattern = pattern;
821   
822   let Inst{6-10}  = VD;
823   let Inst{11-15} = 0;
824   let Inst{16-20} = VB;
825   let Inst{21-31} = xo;
826 }
827
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> {
831   bits<5> VD;
832   bits<5> IMM;
833   
834   let Pattern = pattern;
835   
836   let Inst{6-10}  = VD;
837   let Inst{11-15} = IMM;
838   let Inst{16-20} = 0;
839   let Inst{21-31} = xo;
840 }
841
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> {
846   bits<5> VD;
847   
848   let Pattern = pattern;
849   
850   let Inst{6-10}  = VD;
851   let Inst{11-15} = 0;
852   let Inst{16-20} = 0;
853   let Inst{21-31} = xo;
854 }
855
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> {
860   bits<5> VB;
861   
862   let Pattern = pattern;
863   
864   let Inst{6-10}  = 0;
865   let Inst{11-15} = 0;
866   let Inst{16-20} = VB;
867   let Inst{21-31} = xo;
868 }
869
870 // E-4 VXR-Form
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> {
874   bits<5> VD;
875   bits<5> VA;
876   bits<5> VB;
877   bit RC = 0;
878   
879   let Pattern = pattern;
880   
881   let Inst{6-10}  = VD;
882   let Inst{11-15} = VA;
883   let Inst{16-20} = VB;
884   let Inst{21}    = RC;
885   let Inst{22-31} = xo;
886 }
887
888 //===----------------------------------------------------------------------===//
889 class Pseudo<dag OOL, dag IOL, string asmstr, list<dag> pattern>
890     : I<0, OOL, IOL, asmstr, NoItinerary> {
891   let PPC64 = 0;
892   let Pattern = pattern;
893   let Inst{31-0} = 0;
894 }