[mips][microMIPS] Implement LLE, LUI, LW and LWE instructions
[oota-llvm.git] / lib / Target / Mips / MicroMips32r6InstrFormats.td
1 //=- MicroMips32r6InstrFormats.td - Mips32r6 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 // This file describes microMIPS32r6 instruction formats.
11 //
12 //===----------------------------------------------------------------------===//
13
14 class MMR6Arch<string opstr> {
15   string Arch = "micromipsr6";
16   string BaseOpcode = opstr;
17 }
18
19 // Class used for microMIPS32r6 and microMIPS64r6 instructions.
20 class MicroMipsR6Inst16 : PredicateControl {
21   string DecoderNamespace = "MicroMipsR6";
22   let InsnPredicates = [HasMicroMips32r6];
23 }
24
25 class BC16_FM_MM16R6 {
26   bits<10> offset;
27
28   bits<16> Inst;
29
30   let Inst{15-10} = 0x33;
31   let Inst{9-0}   = offset;
32 }
33
34 class BEQZC_BNEZC_FM_MM16R6<bits<6> op> : MicroMipsR6Inst16 {
35   bits<3> rs;
36   bits<7> offset;
37
38   bits<16> Inst;
39
40   let Inst{15-10} = op;
41   let Inst{9-7}   = rs;
42   let Inst{6-0}   = offset;
43 }
44
45 class POOL32A_BITSWAP_FM_MMR6<bits<6> funct> : MipsR6Inst {
46   bits<5> rd;
47   bits<5> rt;
48
49   bits<32> Inst;
50
51   let Inst{31-26} = 0b000000;
52   let Inst{25-21} = rt;
53   let Inst{20-16} = rd;
54   let Inst{15-12} = 0b0000;
55   let Inst{11-6} = funct;
56   let Inst{5-0} = 0b111100;
57 }
58
59 class CACHE_PREF_FM_MMR6<bits<6> opgroup, bits<4> funct> : MipsR6Inst {
60   bits<21> addr;
61   bits<5> hint;
62
63   bits<32> Inst;
64
65   let Inst{31-26} = opgroup;
66   let Inst{25-21} = hint;
67   let Inst{20-16} = addr{20-16};
68   let Inst{15-12} = funct;
69   let Inst{11-0}  = addr{11-0};
70 }
71
72 class ARITH_FM_MMR6<string instr_asm, bits<10> funct> : MMR6Arch<instr_asm> {
73   bits<5> rd;
74   bits<5> rt;
75   bits<5> rs;
76
77   bits<32> Inst;
78
79   let Inst{31-26} = 0;
80   let Inst{25-21} = rt;
81   let Inst{20-16} = rs;
82   let Inst{15-11} = rd;
83   let Inst{10}    = 0;
84   let Inst{9-0}   = funct;
85 }
86
87 class ADDI_FM_MMR6<string instr_asm, bits<6> op> : MMR6Arch<instr_asm> {
88   bits<5>  rt;
89   bits<5>  rs;
90   bits<16> imm16;
91
92   bits<32> Inst;
93
94   let Inst{31-26} = op;
95   let Inst{25-21} = rt;
96   let Inst{20-16} = rs;
97   let Inst{15-0}  = imm16;
98 }
99
100 class SIGN_EXTEND_FM_MMR6<string instr_asm, bits<10> funct>
101     : MMR6Arch<instr_asm> {
102   bits<5> rd;
103   bits<5> rt;
104
105   bits<32> Inst;
106
107   let Inst{31-26} = 0b000000;
108   let Inst{25-21} = rd;
109   let Inst{20-16} = rt;
110   let Inst{15-6}  = funct;
111   let Inst{5-0}   = 0b111100;
112 }
113
114 class PCREL19_FM_MMR6<bits<2> funct> : MipsR6Inst {
115   bits<5> rt;
116   bits<19> imm;
117
118   bits<32> Inst;
119
120   let Inst{31-26} = 0b011110;
121   let Inst{25-21} = rt;
122   let Inst{20-19} = funct;
123   let Inst{18-0}  = imm;
124 }
125
126 class PCREL16_FM_MMR6<bits<5> funct> : MipsR6Inst {
127   bits<5> rt;
128   bits<16> imm;
129
130   bits<32> Inst;
131
132   let Inst{31-26} = 0b011110;
133   let Inst{25-21} = rt;
134   let Inst{20-16} = funct;
135   let Inst{15-0}  = imm;
136 }
137
138 class POOL32A_FM_MMR6<bits<10> funct> : MipsR6Inst {
139   bits<5> rd;
140   bits<5> rs;
141   bits<5> rt;
142
143   bits<32> Inst;
144
145   let Inst{31-26} = 0b000000;
146   let Inst{25-21} = rt;
147   let Inst{20-16} = rs;
148   let Inst{15-11} = rd;
149   let Inst{10}    = 0;
150   let Inst{9-0}   = funct;
151 }
152
153 class POOL32A_2R_FM_MMR6<bits<10> funct> : MipsR6Inst {
154   bits<5> rs;
155   bits<5> rt;
156
157   bits<32> Inst;
158
159   let Inst{31-26} = 0b000000;
160   let Inst{25-21} = rt;
161   let Inst{20-16} = rs;
162   let Inst{15-6}  = funct;
163   let Inst{5-0}   = 0b111100;
164 }
165
166 class SPECIAL_2R_FM_MMR6<bits<6> funct> : MipsR6Inst {
167   bits<5> rs;
168   bits<5> rt;
169
170   bits<32> Inst;
171
172   let Inst{31-26} = 0b000000;
173   let Inst{25-21} = rs;
174   let Inst{20-16} = 0b00000;
175   let Inst{15-11} = rt;
176   let Inst{10-6}  = 0b00001;
177   let Inst{5-0}   = funct;
178 }
179
180 class POOL32A_ALIGN_FM_MMR6<bits<6> funct> : MipsR6Inst {
181   bits<5> rd;
182   bits<5> rs;
183   bits<5> rt;
184   bits<2> bp;
185
186   bits<32> Inst;
187
188   let Inst{31-26} = 0b000000;
189   let Inst{25-21} = rs;
190   let Inst{20-16} = rt;
191   let Inst{15-11} = rd;
192   let Inst{10-9}  = bp;
193   let Inst{8-6}   = 0b000;
194   let Inst{5-0}   = funct;
195 }
196
197 class AUI_FM_MMR6 : MipsR6Inst {
198   bits<5> rs;
199   bits<5> rt;
200   bits<16> imm;
201
202   bits<32> Inst;
203
204   let Inst{31-26} = 0b000100;
205   let Inst{25-21} = rt;
206   let Inst{20-16} = rs;
207   let Inst{15-0} = imm;
208 }
209
210 class POOL32A_LSA_FM<bits<6> funct> : MipsR6Inst {
211   bits<5> rd;
212   bits<5> rs;
213   bits<5> rt;
214   bits<2> imm2;
215
216   bits<32> Inst;
217
218   let Inst{31-26} = 0b000000;
219   let Inst{25-21} = rt;
220   let Inst{20-16} = rs;
221   let Inst{15-11} = rd;
222   let Inst{10-9}  = imm2;
223   let Inst{8-6}   = 0b000;
224   let Inst{5-0}   = funct;
225 }
226
227 class SB32_SH32_STORE_FM_MMR6<bits<6> op> {
228   bits<5> rt;
229   bits<21> addr;
230   bits<5> base = addr{20-16};
231   bits<16> offset = addr{15-0};
232
233   bits<32> Inst;
234
235   let Inst{31-26} = op;
236   let Inst{25-21} = rt;
237   let Inst{20-16} = base;
238   let Inst{15-0}  = offset;
239 }
240
241 class POOL32C_STORE_EVA_FM_MMR6<bits<3> funct> {
242   bits<5> rt;
243   bits<21> addr;
244   bits<5> base = addr{20-16};
245   bits<9> offset = addr{8-0};
246
247   bits<32> Inst;
248
249   let Inst{31-26} = 0b011000;
250   let Inst{25-21} = rt;
251   let Inst{20-16} = base;
252   let Inst{15-12} = 0b1010;
253   let Inst{11-9}  = funct;
254   let Inst{8-0}   = offset;
255 }
256
257 class LOAD_WORD_EVA_FM_MMR6<bits<3> funct> {
258   bits<5> rt;
259   bits<21> addr;
260   bits<5> base = addr{20-16};
261   bits<9> offset = addr{8-0};
262
263   bits<32> Inst;
264
265   let Inst{31-26} = 0b011000;
266   let Inst{25-21} = rt;
267   let Inst{20-16} = base;
268   let Inst{15-12} = 0b0110;
269   let Inst{11-9}  = funct;
270   let Inst{8-0}   = offset;
271 }
272
273 class LOAD_WORD_FM_MMR6 {
274   bits<5> rt;
275   bits<21> addr;
276   bits<5> base = addr{20-16};
277   bits<16> offset = addr{15-0};
278
279   bits<32> Inst;
280
281   let Inst{31-26} = 0b111111;
282   let Inst{25-21} = rt;
283   let Inst{20-16} = base;
284   let Inst{15-0}  = offset;
285 }
286
287 class LOAD_UPPER_IMM_FM_MMR6 {
288   bits<5> rt;
289   bits<16> imm16;
290
291   bits<32> Inst;
292
293   let Inst{31-26} = 0b000100;
294   let Inst{25-21} = rt;
295   let Inst{20-16} = 0;
296   let Inst{15-0}  = imm16;
297 }
298
299 class CMP_BRANCH_1R_RT_OFF16_FM_MMR6<bits<6> funct> : MipsR6Inst {
300   bits<5> rt;
301   bits<16> offset;
302
303   bits<32> Inst;
304
305   let Inst{31-26} = funct;
306   let Inst{25-21} = rt;
307   let Inst{20-16} = 0b00000;
308   let Inst{15-0}  = offset;
309 }
310
311 class CMP_BRANCH_1R_BOTH_OFF16_FM_MMR6<bits<6> funct> : MipsR6Inst {
312   bits<5> rt;
313   bits<16> offset;
314
315   bits<32> Inst;
316
317   let Inst{31-26} = funct;
318   let Inst{25-21} = rt;
319   let Inst{20-16} = rt;
320   let Inst{15-0}  = offset;
321 }
322
323 class ERET_FM_MMR6<string instr_asm> : MMR6Arch<instr_asm> {
324   bits<32> Inst;
325
326   let Inst{31-26} = 0x00;
327   let Inst{25-16} = 0x00;
328   let Inst{15-6}  = 0x3cd;
329   let Inst{5-0}   = 0x3c;
330 }
331
332 class ERETNC_FM_MMR6<string instr_asm> : MMR6Arch<instr_asm> {
333   bits<32> Inst;
334
335   let Inst{31-26} = 0x00;
336   let Inst{25-17} = 0x00;
337   let Inst{16-16} = 0x01;
338   let Inst{15-6}  = 0x3cd;
339   let Inst{5-0}   = 0x3c;
340 }
341
342 class BREAK_MMR6_ENC<string instr_asm> : MMR6Arch<instr_asm> {
343   bits<10> code_1;
344   bits<10> code_2;
345   bits<32> Inst;
346   let Inst{31-26} = 0x0;
347   let Inst{25-16} = code_1;
348   let Inst{15-6}  = code_2;
349   let Inst{5-0}   = 0x07;
350 }
351
352 class BARRIER_MMR6_ENC<string instr_asm, bits<5> op> : MMR6Arch<instr_asm> {
353   bits<32> Inst;
354
355   let Inst{31-26} = 0x0;
356   let Inst{25-21} = 0x0;
357   let Inst{20-16} = 0x0;
358   let Inst{15-11} = op;
359   let Inst{10-6}  = 0x0;
360   let Inst{5-0}   = 0x0;
361 }
362
363 class EIDI_MMR6_ENC<string instr_asm, bits<10> funct> : MMR6Arch<instr_asm> {
364   bits<32> Inst;
365   bits<5> rt; // Actually rs but we're sharing code with the standard encodings which call it rt
366
367   let Inst{31-26} = 0x00;
368   let Inst{25-21} = 0x00;
369   let Inst{20-16} = rt;
370   let Inst{15-6}  = funct;
371   let Inst{5-0}   = 0x3c;
372 }
373
374 class SHIFT_MMR6_ENC<string instr_asm, bits<10> funct, bit rotate> : MMR6Arch<instr_asm> {
375   bits<5> rd;
376   bits<5> rt;
377   bits<5> shamt;
378
379   bits<32> Inst;
380
381   let Inst{31-26} = 0;
382   let Inst{25-21} = rd;
383   let Inst{20-16} = rt;
384   let Inst{15-11} = shamt;
385   let Inst{10}    = rotate;
386   let Inst{9-0}   = funct;
387 }
388
389 class SW32_FM_MMR6<string instr_asm, bits<6> op> : MMR6Arch<instr_asm> {
390   bits<5> rt;
391   bits<21> addr;
392
393   bits<32> Inst;
394
395   let Inst{31-26} = op;
396   let Inst{25-21} = rt;
397   let Inst{20-16} = addr{20-16};
398   let Inst{15-0}  = addr{15-0};
399 }
400
401 class POOL32C_SWE_FM_MMR6<string instr_asm, bits<6> op, bits<4> fmt,
402     bits<3> funct> : MMR6Arch<instr_asm> {
403   bits<5> rt;
404   bits<21> addr;
405   bits<5> base = addr{20-16};
406   bits<9> offset = addr{8-0};
407
408   bits<32> Inst;
409
410   let Inst{31-26} = op;
411   let Inst{25-21} = rt;
412   let Inst{20-16} = base;
413   let Inst{15-12} = fmt;
414   let Inst{11-9} = funct;
415   let Inst{8-0}  = offset;
416 }
417
418 class POOL32F_ARITH_FM_MMR6<string instr_asm, bits<2> fmt, bits<8> funct>
419     : MMR6Arch<instr_asm>, MipsR6Inst {
420   bits<5> ft;
421   bits<5> fs;
422   bits<5> fd;
423
424   bits<32> Inst;
425
426   let Inst{31-26} = 0b010101;
427   let Inst{25-21} = ft;
428   let Inst{20-16} = fs;
429   let Inst{15-11} = fd;
430   let Inst{10}    = 0;
431   let Inst{9-8}   = fmt;
432   let Inst{7-0}   = funct;
433 }
434
435 class POOL32F_ARITHF_FM_MMR6<string instr_asm, bits<2> fmt, bits<9> funct>
436     : MMR6Arch<instr_asm>, MipsR6Inst {
437   bits<5> ft;
438   bits<5> fs;
439   bits<5> fd;
440
441   bits<32> Inst;
442
443   let Inst{31-26} = 0b010101;
444   let Inst{25-21} = ft;
445   let Inst{20-16} = fs;
446   let Inst{15-11} = fd;
447   let Inst{10-9}  = fmt;
448   let Inst{8-0}   = funct;
449 }
450
451 class POOL32F_MOV_NEG_FM_MMR6<string instr_asm, bits<2> fmt, bits<7> funct>
452     : MMR6Arch<instr_asm>, MipsR6Inst {
453   bits<5> ft;
454   bits<5> fs;
455
456   bits<32> Inst;
457
458   let Inst{31-26} = 0b010101;
459   let Inst{25-21} = ft;
460   let Inst{20-16} = fs;
461   let Inst{15}    = 0;
462   let Inst{14-13} = fmt;
463   let Inst{12-6}  = funct;
464   let Inst{5-0}   = 0b111011;
465 }
466
467 class POOL32F_MINMAX_FM<string instr_asm, bits<2> fmt, bits<9> funct>
468     : MMR6Arch<instr_asm>, MipsR6Inst {
469   bits<5> ft;
470   bits<5> fs;
471   bits<5> fd;
472
473   bits<32> Inst;
474
475   let Inst{31-26} = 0b010101;
476   let Inst{25-21} = ft;
477   let Inst{20-16} = fs;
478   let Inst{15-11} = fd;
479   let Inst{10-9} = fmt;
480   let Inst{8-0} = funct;
481 }
482
483 class POOL32F_CMP_FM<string instr_asm, bits<6> format, FIELD_CMP_COND Cond>
484     : MMR6Arch<instr_asm>, MipsR6Inst {
485   bits<5> ft;
486   bits<5> fs;
487   bits<5> fd;
488
489   bits<32> Inst;
490
491   let Inst{31-26} = 0b010101;
492   let Inst{25-21} = ft;
493   let Inst{20-16} = fs;
494   let Inst{15-11} = fd;
495   let Inst{10-6} = Cond.Value;
496   let Inst{5-0} = format;
497 }
498
499 class POOL32F_CVT_LW_FM<string instr_asm, bit fmt, bits<8> funct>
500     : MMR6Arch<instr_asm>, MipsR6Inst {
501   bits<5> ft;
502   bits<5> fs;
503
504   bits<32> Inst;
505   let Inst{31-26} = 0b010101;
506   let Inst{25-21} = ft;
507   let Inst{20-16} = fs;
508   let Inst{15} = 0;
509   let Inst{14} = fmt;
510   let Inst{13-6} = funct;
511   let Inst{5-0} = 0b111011;
512 }
513
514 class POOL32F_CVT_DS_FM<string instr_asm, bits<2> fmt, bits<7> funct>
515     : MMR6Arch<instr_asm>, MipsR6Inst {
516   bits<5> ft;
517   bits<5> fs;
518
519   bits<32> Inst;
520   let Inst{31-26} = 0b010101;
521   let Inst{25-21} = ft;
522   let Inst{20-16} = fs;
523   let Inst{15} = 0;
524   let Inst{14-13} = fmt;
525   let Inst{12-6} = funct;
526   let Inst{5-0} = 0b111011;
527 }
528
529 class POOL32F_ABS_FM_MMR6<string instr_asm, bits<2> fmt, bits<7> funct>
530     : MMR6Arch<instr_asm>, MipsR6Inst {
531   bits<5> ft;
532   bits<5> fs;
533
534   bits<32> Inst;
535
536   let Inst{31-26} = 0b010101;
537   let Inst{25-21} = ft;
538   let Inst{20-16} = fs;
539   let Inst{15}    = 0;
540   let Inst{14-13} = fmt;
541   let Inst{12-6}  = funct;
542   let Inst{5-0}   = 0b111011;
543 }
544
545 class POOL32F_MATH_FM_MMR6<string instr_asm, bits<1> fmt, bits<8> funct>
546     : MMR6Arch<instr_asm>, MipsR6Inst {
547   bits<5> ft;
548   bits<5> fs;
549
550   bits<32> Inst;
551
552   let Inst{31-26} = 0b010101;
553   let Inst{25-21} = ft;
554   let Inst{20-16} = fs;
555   let Inst{15}    = 0;
556   let Inst{14}    = fmt;
557   let Inst{13-6}  = funct;
558   let Inst{5-0}   = 0b111011;
559 }