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