add patterns for x?oris?
[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 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
13 class Format<bits<5> val> {
14   bits<5> Value = val;
15 }
16
17 def Pseudo: Format<0>;
18 def Gpr : Format<1>;
19 def Gpr0 : Format<2>;
20 def Simm16 : Format<3>;
21 def PCRelimm24 : Format<5>;
22 def Imm24 : Format<6>;
23 def Imm5 : Format<7>;
24 def PCRelimm14 : Format<8>;
25 def Imm14 : Format<9>;
26 def Imm2 : Format<10>;
27 def Crf : Format<11>;
28 def Imm3 : Format<12>;
29 def Imm1 : Format<13>;
30 def Fpr : Format<14>;
31 def Imm4 : Format<15>;
32 def Imm8 : Format<16>;
33 def Disimm16 : Format<17>;
34 def Disimm14 : Format<18>;
35 def Spr : Format<19>;
36 def Sgr : Format<20>;
37 def Imm15 : Format<21>;
38 def Vpr : Format<22>;
39 def Imm6 : Format<23>;
40
41 //===----------------------------------------------------------------------===//
42 //
43 // PowerPC instruction formats
44
45 class I<bits<6> opcode, dag OL, string asmstr> : Instruction {
46   field bits<32> Inst;
47
48   bit PPC64 = 0;  // Default value, override with isPPC64
49   bit VMX = 0;    // Default value, override with isVMX
50
51   let Name = "";
52   let Namespace = "PPC";
53   let Inst{0-5} = opcode;
54   let OperandList = OL;
55   let AsmString = asmstr;
56 }
57
58 // 1.7.1 I-Form
59 class IForm<bits<6> opcode, bit aa, bit lk, dag OL, string asmstr>
60          : I<opcode, OL, asmstr> {
61   bits<24> LI;
62
63   let Inst{6-29}  = LI;
64   let Inst{30}    = aa;
65   let Inst{31}    = lk;
66 }
67
68 // 1.7.2 B-Form
69 class BForm<bits<6> opcode, bit aa, bit lk, bits<5> bo, bits<2> bicode, dag OL, 
70             string asmstr>
71   : I<opcode, OL, asmstr> {
72   bits<3>  CR;
73   bits<14> BD;
74
75   let Inst{6-10}  = bo;
76   let Inst{11-13} = CR;
77   let Inst{14-15} = bicode;
78   let Inst{16-29} = BD;
79   let Inst{30}    = aa;
80   let Inst{31}    = lk;
81 }
82
83 // 1.7.4 D-Form
84 class DForm_base<bits<6> opcode, dag OL, string asmstr, list<dag> pattern>
85    : I<opcode, OL, asmstr> {
86   let Pattern = pattern;
87   bits<5>  A;
88   bits<5>  B;
89   bits<16> C;
90   
91   let Inst{6-10}  = A;
92   let Inst{11-15} = B;
93   let Inst{16-31} = C;
94 }
95
96 class DForm_1<bits<6> opcode, dag OL, string asmstr>
97    : I<opcode, OL, asmstr> {
98   bits<5>  A;
99   bits<16> C;
100   bits<5>  B;
101   
102   let Inst{6-10}  = A;
103   let Inst{11-15} = B;
104   let Inst{16-31} = C;
105 }
106
107 class DForm_2<bits<6> opcode, dag OL, string asmstr, list<dag> pattern>
108   : DForm_base<opcode, OL, asmstr, pattern>;
109
110 class DForm_2_r0<bits<6> opcode, dag OL, string asmstr, list<dag> pattern>
111   : I<opcode, OL, asmstr> {
112   bits<5>  A;
113   bits<16> B;
114   
115   let Pattern = pattern;
116   
117   let Inst{6-10}  = A;
118   let Inst{11-15} = 0;
119   let Inst{16-31} = B;
120 }
121
122 // Currently we make the use/def reg distinction in ISel, not tablegen
123 class DForm_3<bits<6> opcode, dag OL, string asmstr>
124   : DForm_1<opcode, OL, asmstr>;
125
126 class DForm_4<bits<6> opcode, dag OL, string asmstr, list<dag> pattern>
127  : I<opcode, OL, asmstr> {
128   bits<5>  B;
129   bits<5>  A;
130   bits<16> C;
131   
132   let Pattern = pattern;
133   
134   let Inst{6-10}  = A;
135   let Inst{11-15} = B;
136   let Inst{16-31} = C;
137 }
138               
139 class DForm_4_zero<bits<6> opcode, dag OL, string asmstr>
140   : DForm_1<opcode, OL, asmstr> {
141   let A = 0;
142   let B = 0;
143   let C = 0;
144 }
145
146 class DForm_5<bits<6> opcode, dag OL, string asmstr> : I<opcode, OL, asmstr> {
147   bits<3>  BF;
148   bits<1>  L;
149   bits<5>  RA;
150   bits<16> I;
151
152   let Inst{6-8}   = BF;
153   let Inst{9}     = 0;
154   let Inst{10}    = L;
155   let Inst{11-15} = RA;
156   let Inst{16-31} = I;
157 }
158
159 class DForm_5_ext<bits<6> opcode, dag OL, string asmstr>
160   : DForm_5<opcode, OL, asmstr> {
161   let L = PPC64;
162 }
163
164 class DForm_6<bits<6> opcode, dag OL, string asmstr> 
165   : DForm_5<opcode, OL, asmstr>;
166
167 class DForm_6_ext<bits<6> opcode, dag OL, string asmstr>
168   : DForm_6<opcode, OL, asmstr> {
169   let L = PPC64;
170 }
171
172 class DForm_8<bits<6> opcode, dag OL, string asmstr>
173   : DForm_1<opcode, OL, asmstr> {
174 }
175
176 class DForm_9<bits<6> opcode, dag OL, string asmstr>
177   : DForm_1<opcode, OL, asmstr> {
178 }
179
180 // 1.7.5 DS-Form
181 class DSForm_1<bits<6> opcode, bits<2> xo, dag OL, string asmstr>
182          : I<opcode, OL, asmstr> {
183   bits<5>  RST;
184   bits<14> DS;
185   bits<5>  RA;
186
187   let Inst{6-10}  = RST;
188   let Inst{11-15} = RA;
189   let Inst{16-29} = DS;
190   let Inst{30-31} = xo;
191 }
192
193 class DSForm_2<bits<6> opcode, bits<2> xo, dag OL, string asmstr>
194   : DSForm_1<opcode, xo, OL, asmstr>;
195
196 // 1.7.6 X-Form
197 class XForm_base_r3xo<bits<6> opcode, bits<10> xo, 
198                       dag OL, string asmstr> : I<opcode, OL, asmstr> {
199   bits<5> RST;
200   bits<5> A;
201   bits<5> B;
202
203   bit RC = 0;    // set by isDOT
204
205   let Inst{6-10}  = RST;
206   let Inst{11-15} = A;
207   let Inst{16-20} = B;
208   let Inst{21-30} = xo;
209   let Inst{31}    = RC;
210 }
211
212 // This is the same as XForm_base_r3xo, but the first two operands are swapped
213 // when code is emitted.
214 class XForm_base_r3xo_swapped
215         <bits<6> opcode, bits<10> xo, dag OL, string asmstr> 
216   : I<opcode, OL, asmstr> {
217   bits<5> A;
218   bits<5> RST;
219   bits<5> B;
220
221   bit RC = 0;    // set by isDOT
222
223   let Inst{6-10}  = RST;
224   let Inst{11-15} = A;
225   let Inst{16-20} = B;
226   let Inst{21-30} = xo;
227   let Inst{31}    = RC;
228 }
229
230
231 class XForm_1<bits<6> opcode, bits<10> xo, dag OL, string asmstr> 
232   : XForm_base_r3xo<opcode, xo, OL, asmstr>;
233
234 class XForm_6<bits<6> opcode, bits<10> xo, dag OL, string asmstr, 
235               list<dag> pattern> 
236   : XForm_base_r3xo_swapped<opcode, xo, OL, asmstr> {
237   let Pattern = pattern;
238 }
239
240 class XForm_8<bits<6> opcode, bits<10> xo, dag OL, string asmstr> 
241   : XForm_base_r3xo<opcode, xo, OL, asmstr>;
242
243 class XForm_10<bits<6> opcode, bits<10> xo, dag OL, string asmstr> 
244   : XForm_base_r3xo_swapped<opcode, xo, OL, asmstr> {
245 }
246
247 class XForm_11<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
248                list<dag> pattern> 
249   : XForm_base_r3xo_swapped<opcode, xo, OL, asmstr> {
250   let B = 0;
251   let Pattern = pattern;
252 }
253
254 class XForm_16<bits<6> opcode, bits<10> xo, dag OL, string asmstr>
255          : I<opcode, OL, asmstr> {
256   bits<3> BF;
257   bits<1> L; 
258   bits<5> RA;
259   bits<5> RB;
260   
261   let Inst{6-8}   = BF;
262   let Inst{9}     = 0;
263   let Inst{10}    = L;
264   let Inst{11-15} = RA;
265   let Inst{16-20} = RB;
266   let Inst{21-30} = xo;
267   let Inst{31}    = 0;
268 }
269
270 class XForm_16_ext<bits<6> opcode, bits<10> xo, dag OL, string asmstr>
271   : XForm_16<opcode, xo, OL, asmstr> {
272   let L = PPC64;
273 }
274
275 class XForm_17<bits<6> opcode, bits<10> xo, dag OL, string asmstr>
276          : I<opcode, OL, asmstr> {
277   bits<3> BF;
278   bits<5> FRA;
279   bits<5> FRB;
280   
281   let Inst{6-8}   = BF;
282   let Inst{9-10}  = 0;
283   let Inst{11-15} = FRA;
284   let Inst{16-20} = FRB;
285   let Inst{21-30} = xo;
286   let Inst{31}    = 0;
287 }
288
289 class XForm_25<bits<6> opcode, bits<10> xo, dag OL, string asmstr> 
290   : XForm_base_r3xo<opcode, xo, OL, asmstr> {
291 }
292
293 class XForm_26<bits<6> opcode, bits<10> xo, dag OL, string asmstr> 
294   : XForm_base_r3xo<opcode, xo, OL, asmstr> {
295   let A = 0;
296 }
297
298 class XForm_28<bits<6> opcode, bits<10> xo, dag OL, string asmstr> 
299   : XForm_base_r3xo<opcode, xo, OL, asmstr> {
300 }
301
302 // 1.7.7 XL-Form
303 class XLForm_1<bits<6> opcode, bits<10> xo, dag OL, string asmstr>
304          : I<opcode, OL, asmstr> {
305   bits<3> CRD;
306   bits<2> CRDb;
307   bits<3> CRA;
308   bits<2> CRAb;
309   bits<3> CRB;
310   bits<2> CRBb;
311   
312   let Inst{6-8}   = CRD;
313   let Inst{9-10}  = CRDb;
314   let Inst{11-13} = CRA;
315   let Inst{14-15} = CRAb;
316   let Inst{16-18} = CRB;
317   let Inst{19-20} = CRBb;
318   let Inst{21-30} = xo;
319   let Inst{31}    = 0;
320 }
321
322 class XLForm_2<bits<6> opcode, bits<10> xo, bit lk, 
323                dag OL, string asmstr> : I<opcode, OL, asmstr> {
324   bits<5> BO;
325   bits<5> BI;
326   bits<2> BH;
327   
328   let Inst{6-10}  = BO;
329   let Inst{11-15} = BI;
330   let Inst{16-18} = 0;
331   let Inst{19-20} = BH;
332   let Inst{21-30} = xo;
333   let Inst{31}    = lk;
334 }
335
336 class XLForm_2_ext<bits<6> opcode, bits<10> xo, bits<5> bo, 
337                    bits<5> bi, bit lk, dag OL, string asmstr>
338   : XLForm_2<opcode, xo, lk, OL, asmstr> {
339   let BO = bo;
340   let BI = bi;
341   let BH = 0;
342 }
343
344 class XLForm_3<bits<6> opcode, bits<10> xo, dag OL, string asmstr>
345          : I<opcode, OL, asmstr> {
346   bits<3> BF;
347   bits<3> BFA;
348   
349   let Inst{6-8}   = BF;
350   let Inst{9-10}  = 0;
351   let Inst{11-13} = BFA;
352   let Inst{14-15} = 0;
353   let Inst{16-20} = 0;
354   let Inst{21-30} = xo;
355   let Inst{31}    = 0;
356 }
357
358 // 1.7.8 XFX-Form
359 class XFXForm_1<bits<6> opcode, bits<10> xo, dag OL, string asmstr>
360          : I<opcode, OL, asmstr> {
361   bits<5>  RT;
362   bits<10> SPR;
363
364   let Inst{6-10}  = RT;
365   let Inst{11-20} = SPR;
366   let Inst{21-30} = xo;
367   let Inst{31}    = 0;
368 }
369
370 class XFXForm_1_ext<bits<6> opcode, bits<10> xo, bits<10> spr, 
371                    dag OL, string asmstr> 
372   : XFXForm_1<opcode, xo, OL, asmstr> {
373   let SPR = spr;
374 }
375
376 class XFXForm_3<bits<6> opcode, bits<10> xo, dag OL, string asmstr>
377          : I<opcode, OL, asmstr> {
378   bits<5>  RT;
379    
380   let Inst{6-10}  = RT;
381   let Inst{11-20} = 0;
382   let Inst{21-30} = xo;
383   let Inst{31}    = 0;
384 }
385
386 class XFXForm_5<bits<6> opcode, bits<10> xo, dag OL, string asmstr> 
387   : I<opcode, OL, asmstr> {
388   bits<8>  FXM;
389   bits<5>  ST;
390    
391   let Inst{6-10}  = ST;
392   let Inst{11}    = 0;
393   let Inst{12-19} = FXM;
394   let Inst{20}    = 0;
395   let Inst{21-30} = xo;
396   let Inst{31}    = 0;
397 }
398
399 class XFXForm_5a<bits<6> opcode, bits<10> xo, dag OL, string asmstr> 
400   : I<opcode, OL, asmstr> {
401   bits<5>  ST;
402   bits<8>  FXM;
403    
404   let Inst{6-10}  = ST;
405   let Inst{11}    = 1;
406   let Inst{12-19} = FXM;
407   let Inst{20}    = 0;
408   let Inst{21-30} = xo;
409   let Inst{31}    = 0;
410 }
411
412
413 class XFXForm_7<bits<6> opcode, bits<10> xo, dag OL, string asmstr>
414   : XFXForm_1<opcode, xo, OL, asmstr>;
415
416 class XFXForm_7_ext<bits<6> opcode, bits<10> xo, bits<10> spr, 
417                     dag OL, string asmstr> 
418   : XFXForm_7<opcode, xo, OL, asmstr> {
419   let SPR = spr;
420 }
421
422 // 1.7.10 XS-Form
423 class XSForm_1<bits<6> opcode, bits<9> xo, dag OL, string asmstr>
424          : I<opcode, OL, asmstr> {
425   bits<5> RS;
426   bits<5> A;
427   bits<6> SH;
428
429   bit RC = 0;    // set by isDOT
430
431   let Inst{6-10}  = RS;
432   let Inst{11-15} = A;
433   let Inst{16-20} = SH{1-5};
434   let Inst{21-29} = xo;
435   let Inst{30}    = SH{0};
436   let Inst{31}    = RC;
437 }
438
439 // 1.7.11 XO-Form
440 class XOForm_1<bits<6> opcode, bits<9> xo, bit oe, dag OL, string asmstr,
441                list<dag> pattern>
442          : I<opcode, OL, asmstr> {
443   bits<5> RT;
444   bits<5> RA;
445   bits<5> RB;
446
447   let Pattern = pattern;
448
449   bit RC = 0;    // set by isDOT
450
451   let Inst{6-10}  = RT;
452   let Inst{11-15} = RA;
453   let Inst{16-20} = RB;
454   let Inst{21}    = oe;
455   let Inst{22-30} = xo;
456   let Inst{31}    = RC;  
457 }
458
459 class XOForm_3<bits<6> opcode, bits<9> xo, bit oe, 
460                dag OL, string asmstr, list<dag> pattern>
461   : XOForm_1<opcode, xo, oe, OL, asmstr, pattern> {
462   let RB = 0;
463 }
464
465 // 1.7.12 A-Form
466 class AForm_1<bits<6> opcode, bits<5> xo, dag OL, string asmstr>
467          : I<opcode, OL, asmstr> {
468   bits<5> FRT;
469   bits<5> FRA;
470   bits<5> FRC;
471   bits<5> FRB;
472
473   bit RC = 0;    // set by isDOT
474
475   let Inst{6-10}  = FRT;
476   let Inst{11-15} = FRA;
477   let Inst{16-20} = FRB;
478   let Inst{21-25} = FRC;
479   let Inst{26-30} = xo;
480   let Inst{31}    = RC;
481 }
482
483 class AForm_2<bits<6> opcode, bits<5> xo, dag OL, string asmstr> 
484   : AForm_1<opcode, xo, OL, asmstr> {
485   let FRC = 0;
486 }
487
488 class AForm_3<bits<6> opcode, bits<5> xo, dag OL, string asmstr> 
489   : AForm_1<opcode, xo, OL, asmstr> {
490   let FRB = 0;
491 }
492
493 // 1.7.13 M-Form
494 class MForm_1<bits<6> opcode, dag OL, string asmstr> : I<opcode, OL, asmstr> {
495   bits<5> RA;
496   bits<5> RS;
497   bits<5> RB;
498   bits<5> MB;
499   bits<5> ME;
500
501   bit RC = 0;    // set by isDOT
502
503   let Inst{6-10}  = RS;
504   let Inst{11-15} = RA;
505   let Inst{16-20} = RB;
506   let Inst{21-25} = MB;
507   let Inst{26-30} = ME;
508   let Inst{31}    = RC;
509 }
510
511 class MForm_2<bits<6> opcode, dag OL, string asmstr>
512   : MForm_1<opcode, OL, asmstr> {
513 }
514
515 // 1.7.14 MD-Form
516 class MDForm_1<bits<6> opcode, bits<3> xo, dag OL, string asmstr>
517          : I<opcode, OL, asmstr> {
518   bits<5> RS;
519   bits<5> RA;
520   bits<6> SH;
521   bits<6> MBE;
522
523   bit RC = 0;    // set by isDOT
524
525   let Inst{6-10}  = RS;
526   let Inst{11-15} = RA;
527   let Inst{16-20} = SH{1-5};
528   let Inst{21-26} = MBE;
529   let Inst{27-29} = xo;
530   let Inst{30}    = SH{0};
531   let Inst{31}    = RC;
532 }
533
534 //===----------------------------------------------------------------------===//
535
536 class Pseudo<dag OL, string asmstr> : I<0, OL, asmstr> {
537   let PPC64 = 0;
538   let VMX = 0;
539
540   let Inst{31-0} = 0;
541 }