f32/f64 regs are stored on stack if we're short in FP regs
[oota-llvm.git] / lib / Target / SystemZ / SystemZInstrFormats.td
1 //===- SystemZInstrFormats.td - SystemZ 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 class InstSystemZ<dag outs, dag ins, string asmstr, list<dag> pattern> : Instruction {
11   let Namespace = "SystemZ";
12
13   dag OutOperandList = outs;
14   dag InOperandList = ins;
15   let AsmString   = asmstr;
16   let Pattern = pattern;
17 }
18
19 //===----------------------------------------------------------------------===//
20 // E format
21 //===----------------------------------------------------------------------===//
22
23 class F_E<bits<16> opcode,
24           dag outs, dag ins, string asmstr, list<dag> pattern>
25    : InstSystemZ<outs, ins, asmstr, pattern> {
26
27   field bits<16> Inst;
28
29   let Inst{15-0} = opcode;   
30 }
31
32 //===----------------------------------------------------------------------===//
33 // I format
34 //===----------------------------------------------------------------------===//
35
36 class F_I<bits<16> opcode,
37           dag outs, dag ins, string asmstr, list<dag> pattern>
38    : InstSystemZ<outs, ins, asmstr, pattern> {
39
40   field bits<48> Inst;
41
42   let Inst{47-32} = opcode;   
43   //let Inst{31-0}  = simm32;
44 }
45
46 //===----------------------------------------------------------------------===//
47 // RR format
48 //===----------------------------------------------------------------------===//
49
50 class F_RR<bits<8> opcode,
51            dag outs, dag ins, string asmstr, list<dag> pattern>
52    : InstSystemZ<outs, ins, asmstr, pattern> {
53
54   field bits<16> Inst;
55
56   let Inst{15-8} = opcode;
57 }
58
59 //===----------------------------------------------------------------------===//
60 // RRE format
61 //===----------------------------------------------------------------------===//
62
63 class F_RRE<bits<16> opcode,
64             dag outs, dag ins, string asmstr, list<dag> pattern>
65    : InstSystemZ<outs, ins, asmstr, pattern> {
66
67   field bits<32> Inst;
68
69   let Inst{31-16} = opcode;
70   let Inst{15-8}  = 0;
71   //let Inst{7-4}   = r1;
72   //let Inst{3-0}   = r2;
73 }
74
75 //===----------------------------------------------------------------------===//
76 // RRF format (1)
77 //===----------------------------------------------------------------------===//
78
79 class F_RRF_1<bits<16> opcode,
80               dag outs, dag ins, string asmstr, list<dag> pattern>
81    : InstSystemZ<outs, ins, asmstr, pattern> {
82
83   field bits<32> Inst;
84
85   let Inst{31-16} = opcode;
86   //let Inst{15-12} = r1;
87   let Inst{11-8}  = 0;
88   //let Inst{7-4}   = r3;
89   //let Inst{3-0}   = r2;
90 }
91
92 //===----------------------------------------------------------------------===//
93 // RRF format (2)
94 //===----------------------------------------------------------------------===//
95
96 class F_RRF_2<bits<16> opcode,
97               dag outs, dag ins, string asmstr, list<dag> pattern>
98    : InstSystemZ<outs, ins, asmstr, pattern> {
99
100   field bits<32> Inst;
101
102   let Inst{31-16} = opcode;
103   //let Inst{15-12} = m3;
104   let Inst{11-8}  = 0;
105   //let Inst{7-4}   = r1;
106   //let Inst{3-0}   = r2;
107 }
108
109 //===----------------------------------------------------------------------===//
110 // RRF format (3)
111 //===----------------------------------------------------------------------===//
112
113 class F_RRF_3<bits<16> opcode,
114               dag outs, dag ins, string asmstr, list<dag> pattern>
115    : InstSystemZ<outs, ins, asmstr, pattern> {
116
117   field bits<32> Inst;
118
119   let Inst{31-16} = opcode;
120   //let Inst{15-12} = r3;
121   //let Inst{11-8}  = m4;
122   //let Inst{7-4}   = r1;
123   //let Inst{3-0}   = r2;
124 }
125
126 //===----------------------------------------------------------------------===//
127 // RX format
128 //===----------------------------------------------------------------------===//
129
130 class F_RX<bits<8> opcode,
131            dag outs, dag ins, string asmstr, list<dag> pattern>
132    : InstSystemZ<outs, ins, asmstr, pattern> {
133
134   field bits<32> Inst;
135
136   let Inst{31-24} = opcode;
137   //let Inst{23-20} = r1;
138   //let Inst{19-16} = x2;
139   //let Inst{15-12} = b2;
140   //let Inst{11-0}  = udisp12;
141 }
142
143 //===----------------------------------------------------------------------===//
144 // RXE format
145 //===----------------------------------------------------------------------===//
146
147 class F_RXE<bits<8> opcode,
148             dag outs, dag ins, string asmstr, list<dag> pattern>
149    : InstSystemZ<outs, ins, asmstr, pattern> {
150
151   field bits<48> Inst;
152
153   let Inst{47-40} = opcode;
154   //let Inst{39-36} = r1;
155   //let Inst{35-32} = x2;
156   //let Inst{31-28} = b2;
157   //let Inst{27-16} = udisp12;
158   let Inst{15-8}  = 0;
159   //let Inst{7-0}   = op2;
160 }
161
162 //===----------------------------------------------------------------------===//
163 // RXF format
164 //===----------------------------------------------------------------------===//
165
166 class F_RXF<bits<8> opcode,
167             dag outs, dag ins, string asmstr, list<dag> pattern>
168    : InstSystemZ<outs, ins, asmstr, pattern> {
169
170   field bits<48> Inst;
171
172   let Inst{47-40} = opcode;
173   //let Inst{39-36} = r3;
174   //let Inst{35-32} = x2;
175   //let Inst{31-28} = b2;
176   //let Inst{27-16} = udisp12;
177   //let Inst{15-11} = r1;
178   let Inst{11-8}  = 0;
179   //let Inst{7-0}   = op2;
180 }
181
182 //===----------------------------------------------------------------------===//
183 // RXY format
184 //===----------------------------------------------------------------------===//
185
186 class F_RXY<bits<8> opcode,
187             dag outs, dag ins, string asmstr, list<dag> pattern>
188    : InstSystemZ<outs, ins, asmstr, pattern> {
189
190   field bits<48> Inst;
191
192   let Inst{47-40} = opcode;
193   //let Inst{39-36} = r1;
194   //let Inst{35-32} = x2;
195   //let Inst{31-28} = b2;
196   //let Inst{27-8}  = sdisp20;
197   //let Inst{7-0}   = op2;
198 }
199
200 //===----------------------------------------------------------------------===//
201 // RS format (1)
202 //===----------------------------------------------------------------------===//
203
204 class F_RS_1<bits<8> opcode,
205              dag outs, dag ins, string asmstr, list<dag> pattern>
206    : InstSystemZ<outs, ins, asmstr, pattern> {
207
208   field bits<32> Inst;
209
210   let Inst{31-24} = opcode;
211   //let Inst{23-20} = r1;
212   //let Inst{19-16} = r3;
213   //let Inst{15-12} = b2;
214   //let Inst{11-0}  = udisp12;
215 }
216
217 //===----------------------------------------------------------------------===//
218 // RS format (2)
219 //===----------------------------------------------------------------------===//
220
221 class F_RS_2<bits<8> opcode,
222              dag outs, dag ins, string asmstr, list<dag> pattern>
223    : InstSystemZ<outs, ins, asmstr, pattern> {
224
225   field bits<32> Inst;
226
227   let Inst{31-24} = opcode;
228   //let Inst{23-20} = r1;
229   //let Inst{19-16} = m3;
230   //let Inst{15-12} = b2;
231   //let Inst{11-0}  = udisp12;
232 }
233
234 //===----------------------------------------------------------------------===//
235 // RS format (3)
236 //===----------------------------------------------------------------------===//
237
238 class F_RS_3<bits<8> opcode,
239              dag outs, dag ins, string asmstr, list<dag> pattern>
240    : InstSystemZ<outs, ins, asmstr, pattern> {
241
242   field bits<32> Inst;
243
244   let Inst{31-24} = opcode;
245   //let Inst{23-20} = r1;
246   let Inst{19-16} = 0;
247   //let Inst{15-12} = b2;
248   //let Inst{11-0}  = udisp12;
249 }
250
251 //===----------------------------------------------------------------------===//
252 // RSY format (1)
253 //===----------------------------------------------------------------------===//
254
255 class F_RSY_1<bits<8> opcode,
256               dag outs, dag ins, string asmstr, list<dag> pattern>
257    : InstSystemZ<outs, ins, asmstr, pattern> {
258
259   field bits<48> Inst;
260
261   let Inst{47-40} = opcode;
262   //let Inst{39-36} = r1;
263   //let Inst{35-32} = r3;
264   //let Inst{31-28} = b2;
265   //let Inst{27-8}  = sdisp20;
266   //let Inst{7-0}   = op2;
267 }
268
269 //===----------------------------------------------------------------------===//
270 // RSY format (2)
271 //===----------------------------------------------------------------------===//
272
273 class F_RSY_2<bits<8> opcode,
274               dag outs, dag ins, string asmstr, list<dag> pattern>
275    : InstSystemZ<outs, ins, asmstr, pattern> {
276
277   field bits<48> Inst;
278
279   let Inst{47-40} = opcode;
280   //let Inst{39-36} = r1;
281   //let Inst{35-32} = m3;
282   //let Inst{31-28} = b2;
283   //let Inst{27-8}  = sdisp20;
284   //let Inst{7-0}   = op2;
285 }
286
287 //===----------------------------------------------------------------------===//
288 // RSL format
289 //===----------------------------------------------------------------------===//
290
291 class F_RSL<bits<8> opcode,
292             dag outs, dag ins, string asmstr, list<dag> pattern>
293    : InstSystemZ<outs, ins, asmstr, pattern> {
294
295   field bits<48> Inst;
296
297   let Inst{47-40} = opcode;
298   //let Inst{39-36} = ll;
299   let Inst{35-32} = 0;
300   //let Inst{31-28} = b1;
301   //let Inst{27-16} = udisp12;
302   let Inst{15-8}  = 0;
303   //let Inst{7-0}   = op2;
304 }
305
306 //===----------------------------------------------------------------------===//
307 // RSI format
308 //===----------------------------------------------------------------------===//
309
310 class F_RSI<bits<8> opcode,
311             dag outs, dag ins, string asmstr, list<dag> pattern>
312    : InstSystemZ<outs, ins, asmstr, pattern> {
313
314   field bits<32> Inst;
315
316   let Inst{31-24} = opcode;
317   //let Inst{23-20} = r1;
318   //let Inst{19-16} = r3;
319   //let Inst{15-0}  = simm16;
320 }
321
322 //===----------------------------------------------------------------------===//
323 // RI format
324 //===----------------------------------------------------------------------===//
325
326 class F_RI<bits<8> opcode,
327            dag outs, dag ins, string asmstr, list<dag> pattern>
328    : InstSystemZ<outs, ins, asmstr, pattern> {
329
330   field bits<32> Inst;
331
332   let Inst{31-24} = opcode;
333   //let Inst{23-20} = r1;
334   //let Inst{19-16} = op2;
335   //let Inst{15-0}  = simm16;
336 }
337
338 //===----------------------------------------------------------------------===//
339 // RIE format
340 //===----------------------------------------------------------------------===//
341
342 class F_RIE<bits<8> opcode,
343             dag outs, dag ins, string asmstr, list<dag> pattern>
344    : InstSystemZ<outs, ins, asmstr, pattern> {
345
346   field bits<48> Inst;
347
348   let Inst{47-40} = opcode;
349   //let Inst{39-36} = r1;
350   //let Inst{35-32} = r2;
351   //let Inst{31-16} = simm16;
352   let Inst{15-8}  = 0;
353   //let Inst{7-0}   = op2;
354 }
355
356 //===----------------------------------------------------------------------===//
357 // RIL format (1)
358 //===----------------------------------------------------------------------===//
359
360 class F_RIL_1<bits<8> opcode,
361               dag outs, dag ins, string asmstr, list<dag> pattern>
362    : InstSystemZ<outs, ins, asmstr, pattern> {
363
364   field bits<48> Inst;
365
366   let Inst{47-40} = opcode;
367   //let Inst{39-36} = r1;
368   //let Inst{35-32} = op2;
369   //let Inst{31-0}  = simm32;
370 }
371
372 //===----------------------------------------------------------------------===//
373 // RIL format (2)
374 //===----------------------------------------------------------------------===//
375
376 class F_RIL_2<bits<8> opcode,
377               dag outs, dag ins, string asmstr, list<dag> pattern>
378    : InstSystemZ<outs, ins, asmstr, pattern> {
379
380   field bits<48> Inst;
381
382   let Inst{47-40} = opcode;
383   //let Inst{39-36} = m1;
384   //let Inst{35-32} = op2;
385   //let Inst{31-0}  = simm32;
386 }
387
388 //===----------------------------------------------------------------------===//
389 // SI format
390 //===----------------------------------------------------------------------===//
391
392 class F_SI<bits<8> opcode,
393            dag outs, dag ins, string asmstr, list<dag> pattern>
394    : InstSystemZ<outs, ins, asmstr, pattern> {
395
396   field bits<32> Inst;
397
398   let Inst{31-24} = opcode;
399   //let Inst{23-16} = simm8;
400   //let Inst{15-12} = b1;
401   //let Inst{11-0}  = udisp12;
402 }
403
404 //===----------------------------------------------------------------------===//
405 // SIY format
406 //===----------------------------------------------------------------------===//
407
408 class F_SIY<bits<8> opcode,
409             dag outs, dag ins, string asmstr, list<dag> pattern>
410    : InstSystemZ<outs, ins, asmstr, pattern> {
411
412   field bits<48> Inst;
413
414   let Inst{47-40} = opcode;
415   //let Inst{39-32} = simm8;
416   //let Inst{31-28} = b1;
417   //let Inst{27-8}  = sdisp20;
418   //let Inst{7-0}   = op2;
419 }
420
421 //===----------------------------------------------------------------------===//
422 // S format
423 //===----------------------------------------------------------------------===//
424
425 class F_S<bits<16> opcode,
426           dag outs, dag ins, string asmstr, list<dag> pattern>
427    : InstSystemZ<outs, ins, asmstr, pattern> {
428
429   field bits<32> Inst;
430
431   let Inst{31-16} = opcode;
432   //let Inst{15-12} = b2;
433   //let Inst{11-0}  = udisp12;
434 }
435
436 //===----------------------------------------------------------------------===//
437 // SS format (1)
438 //===----------------------------------------------------------------------===//
439
440 class F_SS_1<bits<8> opcode,
441              dag outs, dag ins, string asmstr, list<dag> pattern>
442    : InstSystemZ<outs, ins, asmstr, pattern> {
443
444   field bits<48> Inst;
445
446   let Inst{47-40} = opcode;
447   //let Inst{39-32} = ll;
448   //let Inst{31-28} = b1;
449   //let Inst{27-16} = udisp12;
450   //let Inst{15-12} = b2;
451   //let Inst{11-0}  = udisp12_2;
452 }
453
454 //===----------------------------------------------------------------------===//
455 // SS format (2)
456 //===----------------------------------------------------------------------===//
457
458 class F_SS_2<bits<8> opcode,
459              dag outs, dag ins, string asmstr, list<dag> pattern>
460    : InstSystemZ<outs, ins, asmstr, pattern> {
461
462   field bits<48> Inst;
463
464   let Inst{47-40} = opcode;
465   //let Inst{39-36} = l1;
466   //let Inst{35-32} = l2;
467   //let Inst{31-28} = b1;
468   //let Inst{27-16} = udisp12;
469   //let Inst{15-12} = b2;
470   //let Inst{11-0}  = udisp12_2;
471 }
472
473 //===----------------------------------------------------------------------===//
474 // SS format (3)
475 //===----------------------------------------------------------------------===//
476
477 class F_SS_3<bits<8> opcode,
478              dag outs, dag ins, string asmstr, list<dag> pattern>
479    : InstSystemZ<outs, ins, asmstr, pattern> {
480
481   field bits<48> Inst;
482
483   let Inst{47-40} = opcode;
484   //let Inst{39-36} = r1;
485   //let Inst{35-32} = r3;
486   //let Inst{31-28} = b1;
487   //let Inst{27-16} = udisp12;
488   //let Inst{15-12} = b2;
489   //let Inst{11-0}  = udisp12_2;
490 }
491
492 //===----------------------------------------------------------------------===//
493 // SS format (4)
494 //===----------------------------------------------------------------------===//
495
496 class F_SS_4<bits<8> opcode,
497              dag outs, dag ins, string asmstr, list<dag> pattern>
498    : InstSystemZ<outs, ins, asmstr, pattern> {
499
500   field bits<48> Inst;
501
502   let Inst{47-40} = opcode;
503   //let Inst{39-36} = r1;
504   //let Inst{35-32} = r3;
505   //let Inst{31-28} = b2;
506   //let Inst{27-16} = udisp12_2;
507   //let Inst{15-12} = b4;
508   //let Inst{11-0}  = udisp12_4;
509 }
510
511 //===----------------------------------------------------------------------===//
512 // SSE format
513 //===----------------------------------------------------------------------===//
514
515 class F_SSE<bits<16> opcode,
516             dag outs, dag ins, string asmstr, list<dag> pattern>
517    : InstSystemZ<outs, ins, asmstr, pattern> {
518
519   field bits<48> Inst;
520
521   let Inst{47-32} = opcode;
522   //let Inst{31-28} = b1;
523   //let Inst{27-16} = udisp12;
524   //let Inst{15-12} = b2;
525   //let Inst{11-0}  = udisp12_2;
526 }
527
528 //===----------------------------------------------------------------------===//
529 // Pseudo instructions
530 //===----------------------------------------------------------------------===//
531
532 class Pseudo<dag outs, dag ins, string asmstr, list<dag> pattern>
533    : InstSystemZ<outs, ins, asmstr, pattern> {
534 }