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