There is a trunc(lshr (zext A), Cst) optimization in InstCombineCasts that
[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 CMP_BRANCH_1R_RT_OFF16_FM_MMR6<bits<6> funct> : MipsR6Inst {
228   bits<5> rt;
229   bits<16> offset;
230
231   bits<32> Inst;
232
233   let Inst{31-26} = funct;
234   let Inst{25-21} = rt;
235   let Inst{20-16} = 0b00000;
236   let Inst{15-0}  = offset;
237 }
238
239 class CMP_BRANCH_1R_BOTH_OFF16_FM_MMR6<bits<6> funct> : MipsR6Inst {
240   bits<5> rt;
241   bits<16> offset;
242
243   bits<32> Inst;
244
245   let Inst{31-26} = funct;
246   let Inst{25-21} = rt;
247   let Inst{20-16} = rt;
248   let Inst{15-0}  = offset;
249 }
250
251 class ERET_FM_MMR6<string instr_asm> : MMR6Arch<instr_asm> {
252   bits<32> Inst;
253
254   let Inst{31-26} = 0x00;
255   let Inst{25-16} = 0x00;
256   let Inst{15-6}  = 0x3cd;
257   let Inst{5-0}   = 0x3c;
258 }
259
260 class ERETNC_FM_MMR6<string instr_asm> : MMR6Arch<instr_asm> {
261   bits<32> Inst;
262
263   let Inst{31-26} = 0x00;
264   let Inst{25-17} = 0x00;
265   let Inst{16-16} = 0x01;
266   let Inst{15-6}  = 0x3cd;
267   let Inst{5-0}   = 0x3c;
268 }
269
270 class BREAK_MMR6_ENC<string instr_asm> : MMR6Arch<instr_asm> {
271   bits<10> code_1;
272   bits<10> code_2;
273   bits<32> Inst;
274   let Inst{31-26} = 0x0;
275   let Inst{25-16} = code_1;
276   let Inst{15-6}  = code_2;
277   let Inst{5-0}   = 0x07;
278 }
279
280 class BARRIER_MMR6_ENC<string instr_asm, bits<5> op> : MMR6Arch<instr_asm> {
281   bits<32> Inst;
282
283   let Inst{31-26} = 0x0;
284   let Inst{25-21} = 0x0;
285   let Inst{20-16} = 0x0;
286   let Inst{15-11} = op;
287   let Inst{10-6}  = 0x0;
288   let Inst{5-0}   = 0x0;
289 }
290
291 class EIDI_MMR6_ENC<string instr_asm, bits<10> funct> : MMR6Arch<instr_asm> {
292   bits<32> Inst;
293   bits<5> rt; // Actually rs but we're sharing code with the standard encodings which call it rt
294
295   let Inst{31-26} = 0x00;
296   let Inst{25-21} = 0x00;
297   let Inst{20-16} = rt;
298   let Inst{15-6}  = funct;
299   let Inst{5-0}   = 0x3c;
300 }
301
302 class SHIFT_MMR6_ENC<string instr_asm, bits<10> funct, bit rotate> : MMR6Arch<instr_asm> {
303   bits<5> rd;
304   bits<5> rt;
305   bits<5> shamt;
306
307   bits<32> Inst;
308
309   let Inst{31-26} = 0;
310   let Inst{25-21} = rd;
311   let Inst{20-16} = rt;
312   let Inst{15-11} = shamt;
313   let Inst{10}    = rotate;
314   let Inst{9-0}   = funct;
315 }
316
317 class SW32_FM_MMR6<string instr_asm, bits<6> op> : MMR6Arch<instr_asm> {
318   bits<5> rt;
319   bits<21> addr;
320
321   bits<32> Inst;
322
323   let Inst{31-26} = op;
324   let Inst{25-21} = rt;
325   let Inst{20-16} = addr{20-16};
326   let Inst{15-0}  = addr{15-0};
327 }
328
329 class POOL32C_SWE_FM_MMR6<string instr_asm, bits<6> op, bits<4> fmt,
330     bits<3> funct> : MMR6Arch<instr_asm> {
331   bits<5> rt;
332   bits<21> addr;
333   bits<5> base = addr{20-16};
334   bits<9> offset = addr{8-0};
335
336   bits<32> Inst;
337
338   let Inst{31-26} = op;
339   let Inst{25-21} = rt;
340   let Inst{20-16} = base;
341   let Inst{15-12} = fmt;
342   let Inst{11-9} = funct;
343   let Inst{8-0}  = offset;
344 }
345
346 class POOL32F_ARITH_FM_MMR6<string instr_asm, bits<2> fmt, bits<8> funct>
347     : MMR6Arch<instr_asm>, MipsR6Inst {
348   bits<5> ft;
349   bits<5> fs;
350   bits<5> fd;
351
352   bits<32> Inst;
353
354   let Inst{31-26} = 0b010101;
355   let Inst{25-21} = ft;
356   let Inst{20-16} = fs;
357   let Inst{15-11} = fd;
358   let Inst{10}    = 0;
359   let Inst{9-8}   = fmt;
360   let Inst{7-0}   = funct;
361 }
362
363 class POOL32F_ARITHF_FM_MMR6<string instr_asm, bits<2> fmt, bits<9> funct>
364     : MMR6Arch<instr_asm>, MipsR6Inst {
365   bits<5> ft;
366   bits<5> fs;
367   bits<5> fd;
368
369   bits<32> Inst;
370
371   let Inst{31-26} = 0b010101;
372   let Inst{25-21} = ft;
373   let Inst{20-16} = fs;
374   let Inst{15-11} = fd;
375   let Inst{10-9}  = fmt;
376   let Inst{8-0}   = funct;
377 }
378
379 class POOL32F_MOV_NEG_FM_MMR6<string instr_asm, bits<2> fmt, bits<7> funct>
380     : MMR6Arch<instr_asm>, MipsR6Inst {
381   bits<5> ft;
382   bits<5> fs;
383
384   bits<32> Inst;
385
386   let Inst{31-26} = 0b010101;
387   let Inst{25-21} = ft;
388   let Inst{20-16} = fs;
389   let Inst{15}    = 0;
390   let Inst{14-13} = fmt;
391   let Inst{12-6}  = funct;
392   let Inst{5-0}   = 0b111011;
393 }
394
395 class POOL32F_MINMAX_FM<string instr_asm, bits<2> fmt, bits<9> funct>
396     : MMR6Arch<instr_asm>, MipsR6Inst {
397   bits<5> ft;
398   bits<5> fs;
399   bits<5> fd;
400
401   bits<32> Inst;
402
403   let Inst{31-26} = 0b010101;
404   let Inst{25-21} = ft;
405   let Inst{20-16} = fs;
406   let Inst{15-11} = fd;
407   let Inst{10-9} = fmt;
408   let Inst{8-0} = funct;
409 }
410
411 class POOL32F_CMP_FM<string instr_asm, bits<6> format, FIELD_CMP_COND Cond>
412     : MMR6Arch<instr_asm>, MipsR6Inst {
413   bits<5> ft;
414   bits<5> fs;
415   bits<5> fd;
416
417   bits<32> Inst;
418
419   let Inst{31-26} = 0b010101;
420   let Inst{25-21} = ft;
421   let Inst{20-16} = fs;
422   let Inst{15-11} = fd;
423   let Inst{10-6} = Cond.Value;
424   let Inst{5-0} = format;
425 }
426
427 class POOL32F_CVT_LW_FM<string instr_asm, bit fmt, bits<8> funct>
428     : MMR6Arch<instr_asm>, MipsR6Inst {
429   bits<5> ft;
430   bits<5> fs;
431
432   bits<32> Inst;
433   let Inst{31-26} = 0b010101;
434   let Inst{25-21} = ft;
435   let Inst{20-16} = fs;
436   let Inst{15} = 0;
437   let Inst{14} = fmt;
438   let Inst{13-6} = funct;
439   let Inst{5-0} = 0b111011;
440 }
441
442 class POOL32F_CVT_DS_FM<string instr_asm, bits<2> fmt, bits<7> funct>
443     : MMR6Arch<instr_asm>, MipsR6Inst {
444   bits<5> ft;
445   bits<5> fs;
446
447   bits<32> Inst;
448   let Inst{31-26} = 0b010101;
449   let Inst{25-21} = ft;
450   let Inst{20-16} = fs;
451   let Inst{15} = 0;
452   let Inst{14-13} = fmt;
453   let Inst{12-6} = funct;
454   let Inst{5-0} = 0b111011;
455 }
456
457 class POOL32F_ABS_FM_MMR6<string instr_asm, bits<2> fmt, bits<7> funct>
458     : MMR6Arch<instr_asm>, MipsR6Inst {
459   bits<5> ft;
460   bits<5> fs;
461
462   bits<32> Inst;
463
464   let Inst{31-26} = 0b010101;
465   let Inst{25-21} = ft;
466   let Inst{20-16} = fs;
467   let Inst{15}    = 0;
468   let Inst{14-13} = fmt;
469   let Inst{12-6}  = funct;
470   let Inst{5-0}   = 0b111011;
471 }
472
473 class POOL32F_MATH_FM_MMR6<string instr_asm, bits<1> fmt, bits<8> funct>
474     : MMR6Arch<instr_asm>, MipsR6Inst {
475   bits<5> ft;
476   bits<5> fs;
477
478   bits<32> Inst;
479
480   let Inst{31-26} = 0b010101;
481   let Inst{25-21} = ft;
482   let Inst{20-16} = fs;
483   let Inst{15}    = 0;
484   let Inst{14}    = fmt;
485   let Inst{13-6}  = funct;
486   let Inst{5-0}   = 0b111011;
487 }