PPCInstrFormats.td revision a606b70cf5167e37b92a2b41a0fc0e280ac6aaa3
1//===- PowerPCInstrFormats.td - PowerPC Instruction Formats --*- tablegen -*-=//
2// 
3//                     The LLVM Compiler Infrastructure
4//
5// This file was developed by the LLVM research group and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7// 
8//===----------------------------------------------------------------------===//
9
10//===----------------------------------------------------------------------===//
11//
12// PowerPC instruction formats
13
14class I<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin>
15        : Instruction {
16  field bits<32> Inst;
17
18  bit PPC64 = 0;  // Default value, override with isPPC64
19
20  let Name = "";
21  let Namespace = "PPC";
22  let Inst{0-5} = opcode;
23  let OperandList = OL;
24  let AsmString = asmstr;
25  let Itinerary = itin;
26  
27  /// These fields correspond to the fields in PPCInstrInfo.h.  Any changes to
28  /// these must be reflected there!  See comments there for what these are.
29  bits<1> PPC970_First = 0;
30  bits<1> PPC970_Single = 0;
31  bits<1> PPC970_Cracked = 0;
32  bits<3> PPC970_Unit = 0;
33}
34
35class PPC970_DGroup_First   { bits<1> PPC970_First = 1;  }
36class PPC970_DGroup_Single  { bits<1> PPC970_Single = 1; }
37class PPC970_DGroup_Cracked { bits<1> PPC970_Cracked = 1; }
38class PPC970_MicroCode;
39
40class PPC970_Unit_Pseudo   { bits<3> PPC970_Unit = 0;   }
41class PPC970_Unit_FXU      { bits<3> PPC970_Unit = 1;   }
42class PPC970_Unit_LSU      { bits<3> PPC970_Unit = 2;   }
43class PPC970_Unit_FPU      { bits<3> PPC970_Unit = 3;   }
44class PPC970_Unit_CRU      { bits<3> PPC970_Unit = 4;   }
45class PPC970_Unit_VALU     { bits<3> PPC970_Unit = 5;   }
46class PPC970_Unit_VPERM    { bits<3> PPC970_Unit = 6;   }
47class PPC970_Unit_BRU      { bits<3> PPC970_Unit = 7;   }
48
49
50// 1.7.1 I-Form
51class IForm<bits<6> opcode, bit aa, bit lk, dag OL, string asmstr,
52            InstrItinClass itin, list<dag> pattern>
53         : I<opcode, OL, asmstr, itin> {
54  let Pattern = pattern;
55  bits<24> LI;
56
57  let Inst{6-29}  = LI;
58  let Inst{30}    = aa;
59  let Inst{31}    = lk;
60}
61
62// 1.7.2 B-Form
63class BForm<bits<6> opcode, bit aa, bit lk, bits<5> bo, bits<2> bicode, dag OL, 
64            string asmstr, InstrItinClass itin>
65  : I<opcode, OL, asmstr, itin> {
66  bits<3>  CR;
67  bits<14> BD;
68
69  let Inst{6-10}  = bo;
70  let Inst{11-13} = CR;
71  let Inst{14-15} = bicode;
72  let Inst{16-29} = BD;
73  let Inst{30}    = aa;
74  let Inst{31}    = lk;
75}
76
77// 1.7.4 D-Form
78class DForm_base<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin,
79                 list<dag> pattern> 
80  : I<opcode, OL, asmstr, itin> {
81  bits<5>  A;
82  bits<5>  B;
83  bits<16> C;
84
85  let Pattern = pattern;
86  
87  let Inst{6-10}  = A;
88  let Inst{11-15} = B;
89  let Inst{16-31} = C;
90}
91
92class DForm_1<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin,
93              list<dag> pattern>
94  : I<opcode, OL, asmstr, itin> {
95  bits<5>  A;
96  bits<16> C;
97  bits<5>  B;
98
99  let Pattern = pattern;
100  
101  let Inst{6-10}  = A;
102  let Inst{11-15} = B;
103  let Inst{16-31} = C;
104}
105
106class DForm_2<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin,
107              list<dag> pattern>
108  : DForm_base<opcode, OL, asmstr, itin, pattern>;
109
110class DForm_2_r0<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin,
111                 list<dag> pattern>
112  : I<opcode, OL, asmstr, itin> {
113  bits<5>  A;
114  bits<16> B;
115  
116  let Pattern = pattern;
117  
118  let Inst{6-10}  = A;
119  let Inst{11-15} = 0;
120  let Inst{16-31} = B;
121}
122
123// Currently we make the use/def reg distinction in ISel, not tablegen
124class DForm_3<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin,
125              list<dag> pattern>
126  : DForm_1<opcode, OL, asmstr, itin, pattern>;
127
128class DForm_4<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin,
129              list<dag> pattern>
130  : I<opcode, OL, asmstr, itin> {
131  bits<5>  B;
132  bits<5>  A;
133  bits<16> C;
134  
135  let Pattern = pattern;
136  
137  let Inst{6-10}  = A;
138  let Inst{11-15} = B;
139  let Inst{16-31} = C;
140}
141              
142class DForm_4_zero<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin,
143                   list<dag> pattern>
144  : DForm_1<opcode, OL, asmstr, itin, pattern> {
145  let A = 0;
146  let B = 0;
147  let C = 0;
148}
149
150class DForm_5<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin>
151  : I<opcode, OL, asmstr, itin> {
152  bits<3>  BF;
153  bits<1>  L;
154  bits<5>  RA;
155  bits<16> I;
156
157  let Inst{6-8}   = BF;
158  let Inst{9}     = 0;
159  let Inst{10}    = L;
160  let Inst{11-15} = RA;
161  let Inst{16-31} = I;
162}
163
164class DForm_5_ext<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin>
165  : DForm_5<opcode, OL, asmstr, itin> {
166  let L = PPC64;
167}
168
169class DForm_6<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin> 
170  : DForm_5<opcode, OL, asmstr, itin>;
171
172class DForm_6_ext<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin>
173  : DForm_6<opcode, OL, asmstr, itin> {
174  let L = PPC64;
175}
176
177class DForm_8<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin,
178              list<dag> pattern>
179  : DForm_1<opcode, OL, asmstr, itin, pattern> {
180}
181
182class DForm_9<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin,
183              list<dag> pattern>
184  : DForm_1<opcode, OL, asmstr, itin, pattern> {
185}
186
187// 1.7.5 DS-Form
188class DSForm_1<bits<6> opcode, bits<2> xo, dag OL, string asmstr,
189               InstrItinClass itin, list<dag> pattern>
190         : I<opcode, OL, asmstr, itin> {
191  bits<5>  RST;
192  bits<14> DS;
193  bits<5>  RA;
194
195  let Pattern = pattern;
196  
197  let Inst{6-10}  = RST;
198  let Inst{11-15} = RA;
199  let Inst{16-29} = DS;
200  let Inst{30-31} = xo;
201}
202
203class DSForm_2<bits<6> opcode, bits<2> xo, dag OL, string asmstr,
204               InstrItinClass itin, list<dag> pattern>
205  : DSForm_1<opcode, xo, OL, asmstr, itin, pattern>;
206
207// 1.7.6 X-Form
208class XForm_base_r3xo<bits<6> opcode, bits<10> xo, dag OL, string asmstr, 
209                      InstrItinClass itin, list<dag> pattern>
210  : I<opcode, OL, asmstr, itin> {
211  bits<5> RST;
212  bits<5> A;
213  bits<5> B;
214
215  let Pattern = pattern;
216
217  bit RC = 0;    // set by isDOT
218
219  let Inst{6-10}  = RST;
220  let Inst{11-15} = A;
221  let Inst{16-20} = B;
222  let Inst{21-30} = xo;
223  let Inst{31}    = RC;
224}
225
226// This is the same as XForm_base_r3xo, but the first two operands are swapped
227// when code is emitted.
228class XForm_base_r3xo_swapped
229        <bits<6> opcode, bits<10> xo, dag OL, string asmstr,
230        InstrItinClass itin> 
231  : I<opcode, OL, asmstr, itin> {
232  bits<5> A;
233  bits<5> RST;
234  bits<5> B;
235
236  bit RC = 0;    // set by isDOT
237
238  let Inst{6-10}  = RST;
239  let Inst{11-15} = A;
240  let Inst{16-20} = B;
241  let Inst{21-30} = xo;
242  let Inst{31}    = RC;
243}
244
245
246class XForm_1<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
247              InstrItinClass itin, list<dag> pattern> 
248  : XForm_base_r3xo<opcode, xo, OL, asmstr, itin, pattern>;
249
250class XForm_6<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
251              InstrItinClass itin, list<dag> pattern> 
252  : XForm_base_r3xo_swapped<opcode, xo, OL, asmstr, itin> {
253  let Pattern = pattern;
254}
255
256class XForm_8<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
257              InstrItinClass itin, list<dag> pattern> 
258  : XForm_base_r3xo<opcode, xo, OL, asmstr, itin, pattern>;
259
260class XForm_10<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
261               InstrItinClass itin, list<dag> pattern> 
262  : XForm_base_r3xo_swapped<opcode, xo, OL, asmstr, itin> {
263    let Pattern = pattern;
264}
265
266class XForm_11<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
267               InstrItinClass itin, list<dag> pattern> 
268  : XForm_base_r3xo_swapped<opcode, xo, OL, asmstr, itin> {
269  let B = 0;
270  let Pattern = pattern;
271}
272
273class XForm_16<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
274               InstrItinClass itin>
275         : I<opcode, OL, asmstr, itin> {
276  bits<3> BF;
277  bits<1> L; 
278  bits<5> RA;
279  bits<5> RB;
280  
281  let Inst{6-8}   = BF;
282  let Inst{9}     = 0;
283  let Inst{10}    = L;
284  let Inst{11-15} = RA;
285  let Inst{16-20} = RB;
286  let Inst{21-30} = xo;
287  let Inst{31}    = 0;
288}
289
290class XForm_16_ext<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
291                   InstrItinClass itin>
292  : XForm_16<opcode, xo, OL, asmstr, itin> {
293  let L = PPC64;
294}
295
296class XForm_17<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
297               InstrItinClass itin>
298         : I<opcode, OL, asmstr, itin> {
299  bits<3> BF;
300  bits<5> FRA;
301  bits<5> FRB;
302  
303  let Inst{6-8}   = BF;
304  let Inst{9-10}  = 0;
305  let Inst{11-15} = FRA;
306  let Inst{16-20} = FRB;
307  let Inst{21-30} = xo;
308  let Inst{31}    = 0;
309}
310
311class XForm_25<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
312               InstrItinClass itin, list<dag> pattern> 
313  : XForm_base_r3xo<opcode, xo, OL, asmstr, itin, pattern> {
314}
315
316class XForm_26<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
317               InstrItinClass itin, list<dag> pattern>
318  : XForm_base_r3xo<opcode, xo, OL, asmstr, itin, pattern> {
319  let A = 0;
320}
321
322class XForm_28<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
323               InstrItinClass itin, list<dag> pattern> 
324  : XForm_base_r3xo<opcode, xo, OL, asmstr, itin, pattern> {
325}
326
327// DCB_Form - Form X instruction, used for dcb* instructions.
328class DCB_Form<bits<10> xo, bits<5> immfield, dag OL, string asmstr, 
329                      InstrItinClass itin, list<dag> pattern>
330  : I<31, OL, asmstr, itin> {
331  bits<5> A;
332  bits<5> B;
333
334  let Pattern = pattern;
335
336  let Inst{6-10}  = immfield;
337  let Inst{11-15} = A;
338  let Inst{16-20} = B;
339  let Inst{21-30} = xo;
340  let Inst{31}    = 0;
341}
342
343
344// DSS_Form - Form X instruction, used for altivec dss* instructions.
345class DSS_Form<bits<10> xo, dag OL, string asmstr, 
346                      InstrItinClass itin, list<dag> pattern>
347  : I<31, OL, asmstr, itin> {
348  bits<1> T;
349  bits<2> STRM;
350  bits<5> A;
351  bits<5> B;
352
353  let Pattern = pattern;
354
355  let Inst{6}     = T;
356  let Inst{7-8}   = 0;
357  let Inst{9-10}  = STRM;
358  let Inst{11-15} = A;
359  let Inst{16-20} = B;
360  let Inst{21-30} = xo;
361  let Inst{31}    = 0;
362}
363
364// 1.7.7 XL-Form
365class XLForm_1<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
366               InstrItinClass itin>
367    : I<opcode, OL, asmstr, itin> {
368  bits<3> CRD;
369  bits<2> CRDb;
370  bits<3> CRA;
371  bits<2> CRAb;
372  bits<3> CRB;
373  bits<2> CRBb;
374  
375  let Inst{6-8}   = CRD;
376  let Inst{9-10}  = CRDb;
377  let Inst{11-13} = CRA;
378  let Inst{14-15} = CRAb;
379  let Inst{16-18} = CRB;
380  let Inst{19-20} = CRBb;
381  let Inst{21-30} = xo;
382  let Inst{31}    = 0;
383}
384
385class XLForm_2<bits<6> opcode, bits<10> xo, bit lk, dag OL, string asmstr, 
386               InstrItinClass itin, list<dag> pattern>
387    : I<opcode, OL, asmstr, itin> {
388  bits<5> BO;
389  bits<5> BI;
390  bits<2> BH;
391  
392  let Pattern = pattern;
393  
394  let Inst{6-10}  = BO;
395  let Inst{11-15} = BI;
396  let Inst{16-18} = 0;
397  let Inst{19-20} = BH;
398  let Inst{21-30} = xo;
399  let Inst{31}    = lk;
400}
401
402class XLForm_2_ext<bits<6> opcode, bits<10> xo, bits<5> bo,  bits<5> bi, bit lk,
403                  dag OL, string asmstr, InstrItinClass itin, list<dag> pattern>
404  : XLForm_2<opcode, xo, lk, OL, asmstr, itin, pattern> {
405  let BO = bo;
406  let BI = bi;
407  let BH = 0;
408}
409
410class XLForm_3<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
411               InstrItinClass itin>
412         : I<opcode, OL, asmstr, itin> {
413  bits<3> BF;
414  bits<3> BFA;
415  
416  let Inst{6-8}   = BF;
417  let Inst{9-10}  = 0;
418  let Inst{11-13} = BFA;
419  let Inst{14-15} = 0;
420  let Inst{16-20} = 0;
421  let Inst{21-30} = xo;
422  let Inst{31}    = 0;
423}
424
425// 1.7.8 XFX-Form
426class XFXForm_1<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
427                InstrItinClass itin>
428         : I<opcode, OL, asmstr, itin> {
429  bits<5>  RT;
430  bits<10> SPR;
431
432  let Inst{6-10}  = RT;
433  let Inst{11}    = SPR{4};
434  let Inst{12}    = SPR{3};
435  let Inst{13}    = SPR{2};
436  let Inst{14}    = SPR{1};
437  let Inst{15}    = SPR{0};
438  let Inst{16}    = SPR{9};
439  let Inst{17}    = SPR{8};
440  let Inst{18}    = SPR{7};
441  let Inst{19}    = SPR{6};
442  let Inst{20}    = SPR{5};
443  let Inst{21-30} = xo;
444  let Inst{31}    = 0;
445}
446
447class XFXForm_1_ext<bits<6> opcode, bits<10> xo, bits<10> spr, 
448                   dag OL, string asmstr, InstrItinClass itin> 
449  : XFXForm_1<opcode, xo, OL, asmstr, itin> {
450  let SPR = spr;
451}
452
453class XFXForm_3<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
454                InstrItinClass itin>
455         : I<opcode, OL, asmstr, itin> {
456  bits<5>  RT;
457   
458  let Inst{6-10}  = RT;
459  let Inst{11-20} = 0;
460  let Inst{21-30} = xo;
461  let Inst{31}    = 0;
462}
463
464class XFXForm_5<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
465                InstrItinClass itin> 
466  : I<opcode, OL, asmstr, itin> {
467  bits<8>  FXM;
468  bits<5>  ST;
469   
470  let Inst{6-10}  = ST;
471  let Inst{11}    = 0;
472  let Inst{12-19} = FXM;
473  let Inst{20}    = 0;
474  let Inst{21-30} = xo;
475  let Inst{31}    = 0;
476}
477
478class XFXForm_5a<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
479                 InstrItinClass itin> 
480  : I<opcode, OL, asmstr, itin> {
481  bits<5>  ST;
482  bits<8>  FXM;
483   
484  let Inst{6-10}  = ST;
485  let Inst{11}    = 1;
486  let Inst{12-19} = FXM;
487  let Inst{20}    = 0;
488  let Inst{21-30} = xo;
489  let Inst{31}    = 0;
490}
491
492class XFXForm_7<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
493                InstrItinClass itin>
494  : XFXForm_1<opcode, xo, OL, asmstr, itin>;
495
496class XFXForm_7_ext<bits<6> opcode, bits<10> xo, bits<10> spr, 
497                    dag OL, string asmstr, InstrItinClass itin> 
498  : XFXForm_7<opcode, xo, OL, asmstr, itin> {
499  let SPR = spr;
500}
501
502// 1.7.10 XS-Form
503class XSForm_1<bits<6> opcode, bits<9> xo, dag OL, string asmstr,
504               InstrItinClass itin, list<dag> pattern>
505         : I<opcode, OL, asmstr, itin> {
506  bits<5> RS;
507  bits<5> A;
508  bits<6> SH;
509
510  bit RC = 0;    // set by isDOT
511  let Pattern = pattern;
512
513  let Inst{6-10}  = RS;
514  let Inst{11-15} = A;
515  let Inst{16-20} = SH{1-5};
516  let Inst{21-29} = xo;
517  let Inst{30}    = SH{0};
518  let Inst{31}    = RC;
519}
520
521// 1.7.11 XO-Form
522class XOForm_1<bits<6> opcode, bits<9> xo, bit oe, dag OL, string asmstr,
523               InstrItinClass itin, list<dag> pattern>
524         : I<opcode, OL, asmstr, itin> {
525  bits<5> RT;
526  bits<5> RA;
527  bits<5> RB;
528
529  let Pattern = pattern;
530
531  bit RC = 0;    // set by isDOT
532
533  let Inst{6-10}  = RT;
534  let Inst{11-15} = RA;
535  let Inst{16-20} = RB;
536  let Inst{21}    = oe;
537  let Inst{22-30} = xo;
538  let Inst{31}    = RC;  
539}
540
541class XOForm_3<bits<6> opcode, bits<9> xo, bit oe, 
542               dag OL, string asmstr, InstrItinClass itin, list<dag> pattern>
543  : XOForm_1<opcode, xo, oe, OL, asmstr, itin, pattern> {
544  let RB = 0;
545}
546
547// 1.7.12 A-Form
548class AForm_1<bits<6> opcode, bits<5> xo, dag OL, string asmstr, 
549              InstrItinClass itin, list<dag> pattern>
550         : I<opcode, OL, asmstr, itin> {
551  bits<5> FRT;
552  bits<5> FRA;
553  bits<5> FRC;
554  bits<5> FRB;
555
556  let Pattern = pattern;
557
558  bit RC = 0;    // set by isDOT
559
560  let Inst{6-10}  = FRT;
561  let Inst{11-15} = FRA;
562  let Inst{16-20} = FRB;
563  let Inst{21-25} = FRC;
564  let Inst{26-30} = xo;
565  let Inst{31}    = RC;
566}
567
568class AForm_2<bits<6> opcode, bits<5> xo, dag OL, string asmstr,
569              InstrItinClass itin, list<dag> pattern>
570  : AForm_1<opcode, xo, OL, asmstr, itin, pattern> {
571  let FRC = 0;
572}
573
574class AForm_3<bits<6> opcode, bits<5> xo, dag OL, string asmstr,
575              InstrItinClass itin, list<dag> pattern> 
576  : AForm_1<opcode, xo, OL, asmstr, itin, pattern> {
577  let FRB = 0;
578}
579
580// 1.7.13 M-Form
581class MForm_1<bits<6> opcode, dag OL, string asmstr,
582              InstrItinClass itin, list<dag> pattern>
583    : I<opcode, OL, asmstr, itin> {
584  bits<5> RA;
585  bits<5> RS;
586  bits<5> RB;
587  bits<5> MB;
588  bits<5> ME;
589
590  let Pattern = pattern;
591
592  bit RC = 0;    // set by isDOT
593
594  let Inst{6-10}  = RS;
595  let Inst{11-15} = RA;
596  let Inst{16-20} = RB;
597  let Inst{21-25} = MB;
598  let Inst{26-30} = ME;
599  let Inst{31}    = RC;
600}
601
602class MForm_2<bits<6> opcode, dag OL, string asmstr,
603              InstrItinClass itin, list<dag> pattern>
604  : MForm_1<opcode, OL, asmstr, itin, pattern> {
605}
606
607// 1.7.14 MD-Form
608class MDForm_1<bits<6> opcode, bits<3> xo, dag OL, string asmstr,
609               InstrItinClass itin, list<dag> pattern>
610    : I<opcode, OL, asmstr, itin> {
611  bits<5> RA;
612  bits<5> RS;
613  bits<6> SH;
614  bits<6> MBE;
615
616  let Pattern = pattern;
617
618  bit RC = 0;    // set by isDOT
619
620  let Inst{6-10}  = RS;
621  let Inst{11-15} = RA;
622  let Inst{16-20} = { SH{4}, SH{3}, SH{2}, SH{1}, SH{0} };
623  let Inst{21-26} = { MBE{4}, MBE{3}, MBE{2}, MBE{1}, MBE{0}, MBE{5} };
624  let Inst{27-29} = xo;
625  let Inst{30}    = SH{5};
626  let Inst{31}    = RC;
627}
628
629
630
631// E-1 VA-Form
632
633// VAForm_1 - DACB ordering.
634class VAForm_1<bits<6> xo, dag OL, string asmstr,
635               InstrItinClass itin, list<dag> pattern>
636    : I<4, OL, asmstr, itin> {
637  bits<5> VD;
638  bits<5> VA;
639  bits<5> VC;
640  bits<5> VB;
641
642  let Pattern = pattern;
643  
644  let Inst{6-10}  = VD;
645  let Inst{11-15} = VA;
646  let Inst{16-20} = VB;
647  let Inst{21-25} = VC;
648  let Inst{26-31} = xo;
649}
650
651// VAForm_1a - DABC ordering.
652class VAForm_1a<bits<6> xo, dag OL, string asmstr,
653                InstrItinClass itin, list<dag> pattern>
654    : I<4, OL, asmstr, itin> {
655  bits<5> VD;
656  bits<5> VA;
657  bits<5> VB;
658  bits<5> VC;
659
660  let Pattern = pattern;
661  
662  let Inst{6-10}  = VD;
663  let Inst{11-15} = VA;
664  let Inst{16-20} = VB;
665  let Inst{21-25} = VC;
666  let Inst{26-31} = xo;
667}
668
669class VAForm_2<bits<6> xo, dag OL, string asmstr,
670               InstrItinClass itin, list<dag> pattern>
671    : I<4, OL, asmstr, itin> {
672  bits<5> VD;
673  bits<5> VA;
674  bits<5> VB;
675  bits<4> SH;
676
677  let Pattern = pattern;
678  
679  let Inst{6-10}  = VD;
680  let Inst{11-15} = VA;
681  let Inst{16-20} = VB;
682  let Inst{21}    = 0;
683  let Inst{22-25} = SH;
684  let Inst{26-31} = xo;
685}
686
687// E-2 VX-Form
688class VXForm_1<bits<11> xo, dag OL, string asmstr,
689               InstrItinClass itin, list<dag> pattern>
690    : I<4, OL, asmstr, itin> {
691  bits<5> VD;
692  bits<5> VA;
693  bits<5> VB;
694  
695  let Pattern = pattern;
696  
697  let Inst{6-10}  = VD;
698  let Inst{11-15} = VA;
699  let Inst{16-20} = VB;
700  let Inst{21-31} = xo;
701}
702
703class VXForm_setzero<bits<11> xo, dag OL, string asmstr,
704               InstrItinClass itin, list<dag> pattern>
705    : VXForm_1<xo, OL, asmstr, itin, pattern> {
706  let VA = VD;
707  let VB = VD;
708}
709
710
711class VXForm_2<bits<11> xo, dag OL, string asmstr,
712               InstrItinClass itin, list<dag> pattern>
713    : I<4, OL, asmstr, itin> {
714  bits<5> VD;
715  bits<5> VB;
716  
717  let Pattern = pattern;
718  
719  let Inst{6-10}  = VD;
720  let Inst{11-15} = 0;
721  let Inst{16-20} = VB;
722  let Inst{21-31} = xo;
723}
724
725class VXForm_3<bits<11> xo, dag OL, string asmstr,
726               InstrItinClass itin, list<dag> pattern>
727    : I<4, OL, asmstr, itin> {
728  bits<5> VD;
729  bits<5> IMM;
730  
731  let Pattern = pattern;
732  
733  let Inst{6-10}  = VD;
734  let Inst{11-15} = IMM;
735  let Inst{16-20} = 0;
736  let Inst{21-31} = xo;
737}
738
739/// VXForm_4 - VX instructions with "VD,0,0" register fields, like mfvscr.
740class VXForm_4<bits<11> xo, dag OL, string asmstr,
741               InstrItinClass itin, list<dag> pattern>
742    : I<4, OL, asmstr, itin> {
743  bits<5> VD;
744  
745  let Pattern = pattern;
746  
747  let Inst{6-10}  = VD;
748  let Inst{11-15} = 0;
749  let Inst{16-20} = 0;
750  let Inst{21-31} = xo;
751}
752
753/// VXForm_5 - VX instructions with "0,0,VB" register fields, like mtvscr.
754class VXForm_5<bits<11> xo, dag OL, string asmstr,
755               InstrItinClass itin, list<dag> pattern>
756    : I<4, OL, asmstr, itin> {
757  bits<5> VB;
758  
759  let Pattern = pattern;
760  
761  let Inst{6-10}  = 0;
762  let Inst{11-15} = 0;
763  let Inst{16-20} = VB;
764  let Inst{21-31} = xo;
765}
766
767// E-4 VXR-Form
768class VXRForm_1<bits<10> xo, dag OL, string asmstr,
769               InstrItinClass itin, list<dag> pattern>
770    : I<4, OL, asmstr, itin> {
771  bits<5> VD;
772  bits<5> VA;
773  bits<5> VB;
774  bit RC = 0;
775  
776  let Pattern = pattern;
777  
778  let Inst{6-10}  = VD;
779  let Inst{11-15} = VA;
780  let Inst{16-20} = VB;
781  let Inst{21}    = RC;
782  let Inst{22-31} = xo;
783}
784
785//===----------------------------------------------------------------------===//
786class Pseudo<dag OL, string asmstr, list<dag> pattern>
787    : I<0, OL, asmstr, NoItinerary> {
788  let PPC64 = 0;
789  let Pattern = pattern;
790  let Inst{31-0} = 0;
791}
792