blob: 6babee918d5f4f800a6a22c308794bc133866ddc [file] [log] [blame]
Akira Hatanakac515bfb2012-05-08 19:08:58 +00001//===- Mips16InstrFormats.td - Mips 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//===----------------------------------------------------------------------===//
11// Describe MIPS instructions format
12//
13// CPU INSTRUCTION FORMATS
14//
15// funct or f Function field
16//
Akira Hatanakaf640f042012-07-17 22:55:34 +000017// immediate 4-,5-,8- or 11-bit immediate, branch displacement, or
Akira Hatanakac515bfb2012-05-08 19:08:58 +000018// or imm address displacement
19//
Akira Hatanaka21371762012-06-13 02:42:47 +000020// op 5-bit major operation code
Akira Hatanakac515bfb2012-05-08 19:08:58 +000021//
22// rx 3-bit source or destination register
23//
24// ry 3-bit source or destination register
25//
26// rz 3-bit source or destination register
27//
28// sa 3- or 5-bit shift amount
29//
30//===----------------------------------------------------------------------===//
31
32// Format specifies the encoding used by the instruction. This is part of the
33// ad-hoc solution used to emit machine instruction encodings by our machine
34// code emitter.
35//
36class Format16<bits<5> val> {
37 bits<5> Value = val;
38}
39
40def Pseudo16 : Format16<0>;
41def FrmI16 : Format16<1>;
42def FrmRI16 : Format16<2>;
43def FrmRR16 : Format16<3>;
44def FrmRRI16 : Format16<4>;
45def FrmRRR16 : Format16<5>;
46def FrmRRI_A16 : Format16<6>;
47def FrmSHIFT16 : Format16<7>;
48def FrmI8_TYPE16 : Format16<8>;
49def FrmI8_MOVR3216 : Format16<9>;
50def FrmI8_MOV32R16 : Format16<10>;
51def FrmI8_SVRS16 : Format16<11>;
52def FrmJAL16 : Format16<12>;
53def FrmJALX16 : Format16<13>;
54def FrmEXT_I16 : Format16<14>;
55def FrmASMACRO16 : Format16<15>;
56def FrmEXT_RI16 : Format16<16>;
57def FrmEXT_RRI16 : Format16<17>;
58def FrmEXT_RRI_A16 : Format16<18>;
59def FrmEXT_SHIFT16 : Format16<19>;
60def FrmEXT_I816 : Format16<20>;
61def FrmEXT_I8_SVRS16 : Format16<21>;
62def FrmOther16 : Format16<22>; // Instruction w/ a custom format
63
Akira Hatanakabff8e312012-05-31 02:59:44 +000064// Base class for Mips 16 Format
65// This class does not depend on the instruction size
66//
67class MipsInst16_Base<dag outs, dag ins, string asmstr, list<dag> pattern,
Akira Hatanakaf640f042012-07-17 22:55:34 +000068 InstrItinClass itin, Format16 f>: Instruction
Akira Hatanakac515bfb2012-05-08 19:08:58 +000069{
Akira Hatanakac515bfb2012-05-08 19:08:58 +000070 Format16 Form = f;
71
72 let Namespace = "Mips";
73
Akira Hatanakac515bfb2012-05-08 19:08:58 +000074 let OutOperandList = outs;
75 let InOperandList = ins;
76
77 let AsmString = asmstr;
78 let Pattern = pattern;
79 let Itinerary = itin;
80
81 //
82 // Attributes specific to Mips instructions...
83 //
84 bits<5> FormBits = Form.Value;
85
86 // TSFlags layout should be kept in sync with MipsInstrInfo.h.
87 let TSFlags{4-0} = FormBits;
Akira Hatanakabff8e312012-05-31 02:59:44 +000088
89 let Predicates = [InMips16Mode];
Akira Hatanakac515bfb2012-05-08 19:08:58 +000090}
91
92//
Akira Hatanakabff8e312012-05-31 02:59:44 +000093// Generic Mips 16 Format
Akira Hatanakac515bfb2012-05-08 19:08:58 +000094//
Akira Hatanakabff8e312012-05-31 02:59:44 +000095class MipsInst16<dag outs, dag ins, string asmstr, list<dag> pattern,
96 InstrItinClass itin, Format16 f>:
Akira Hatanakaf640f042012-07-17 22:55:34 +000097 MipsInst16_Base<outs, ins, asmstr, pattern, itin, f>
Akira Hatanakac515bfb2012-05-08 19:08:58 +000098{
Akira Hatanakabff8e312012-05-31 02:59:44 +000099 field bits<16> Inst;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000100 bits<5> Opcode = 0;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000101
Akira Hatanakaf640f042012-07-17 22:55:34 +0000102 // Top 5 bits are the 'opcode' field
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000103 let Inst{15-11} = Opcode;
Akira Hatanakabff8e312012-05-31 02:59:44 +0000104}
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000105
Akira Hatanakabff8e312012-05-31 02:59:44 +0000106//
107// For 32 bit extended instruction forms.
108//
109class MipsInst16_32<dag outs, dag ins, string asmstr, list<dag> pattern,
110 InstrItinClass itin, Format16 f>:
Akira Hatanakaf640f042012-07-17 22:55:34 +0000111 MipsInst16_Base<outs, ins, asmstr, pattern, itin, f>
Akira Hatanakabff8e312012-05-31 02:59:44 +0000112{
113 field bits<32> Inst;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000114
Akira Hatanakabff8e312012-05-31 02:59:44 +0000115}
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000116
Akira Hatanakabff8e312012-05-31 02:59:44 +0000117class MipsInst16_EXTEND<dag outs, dag ins, string asmstr, list<dag> pattern,
118 InstrItinClass itin, Format16 f>:
Akira Hatanakaf640f042012-07-17 22:55:34 +0000119 MipsInst16_32<outs, ins, asmstr, pattern, itin, f>
Akira Hatanakabff8e312012-05-31 02:59:44 +0000120{
Akira Hatanakabff8e312012-05-31 02:59:44 +0000121 let Inst{31-27} = 0b11110;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000122}
123
124
125
126// Mips Pseudo Instructions Format
127class MipsPseudo16<dag outs, dag ins, string asmstr, list<dag> pattern>:
Akira Hatanakaf640f042012-07-17 22:55:34 +0000128 MipsInst16<outs, ins, asmstr, pattern, IIPseudo, Pseudo16> {
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000129 let isCodeGenOnly = 1;
130 let isPseudo = 1;
131}
132
133
134//===----------------------------------------------------------------------===//
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000135// Format I instruction class in Mips : <|opcode|imm11|>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000136//===----------------------------------------------------------------------===//
137
138class FI16<bits<5> op, dag outs, dag ins, string asmstr, list<dag> pattern,
Akira Hatanakaf640f042012-07-17 22:55:34 +0000139 InstrItinClass itin>:
140 MipsInst16<outs, ins, asmstr, pattern, itin, FrmI16>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000141{
142 bits<11> imm11;
143
144 let Opcode = op;
145
146 let Inst{10-0} = imm11;
147}
148
149//===----------------------------------------------------------------------===//
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000150// Format RI instruction class in Mips : <|opcode|rx|imm8|>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000151//===----------------------------------------------------------------------===//
152
153class FRI16<bits<5> op, dag outs, dag ins, string asmstr,
154 list<dag> pattern, InstrItinClass itin>:
Akira Hatanakaf640f042012-07-17 22:55:34 +0000155 MipsInst16<outs, ins, asmstr, pattern, itin, FrmRI16>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000156{
157 bits<3> rx;
158 bits<8> imm8;
159
160 let Opcode = op;
161
162 let Inst{10-8} = rx;
163 let Inst{7-0} = imm8;
164}
165
166//===----------------------------------------------------------------------===//
167// Format RR instruction class in Mips : <|opcode|rx|ry|funct|>
168//===----------------------------------------------------------------------===//
169
Akira Hatanakadf98a7a2012-05-24 18:32:33 +0000170class FRR16<bits<5> _funct, dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000171 list<dag> pattern, InstrItinClass itin>:
Akira Hatanakaf640f042012-07-17 22:55:34 +0000172 MipsInst16<outs, ins, asmstr, pattern, itin, FrmRR16>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000173{
174 bits<3> rx;
175 bits<3> ry;
176 bits<5> funct;
177
Akira Hatanakadf98a7a2012-05-24 18:32:33 +0000178 let Opcode = 0b11101;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000179 let funct = _funct;
180
181 let Inst{10-8} = rx;
182 let Inst{7-5} = ry;
183 let Inst{4-0} = funct;
184}
185
Akira Hatanakaf640f042012-07-17 22:55:34 +0000186//
187// For conversion functions.
188//
189class FRR_SF16<bits<5> _funct, bits<3> _subfunct, dag outs, dag ins,
190 string asmstr, list<dag> pattern, InstrItinClass itin>:
191 MipsInst16<outs, ins, asmstr, pattern, itin, FrmRR16>
192{
193 bits<3> rx;
194 bits<3> subfunct;
195 bits<5> funct;
196
197 let Opcode = 0b11101; // RR
198 let funct = _funct;
199 let subfunct = _subfunct;
200
201 let Inst{10-8} = rx;
202 let Inst{7-5} = subfunct;
203 let Inst{4-0} = funct;
204}
205
206//
207// just used for breakpoint (hardware and software) instructions.
208//
209class FC16<bits<5> _funct, dag outs, dag ins, string asmstr,
210 list<dag> pattern, InstrItinClass itin>:
211 MipsInst16<outs, ins, asmstr, pattern, itin, FrmRR16>
212{
213 bits<6> _code; // code is a keyword in tablegen
214 bits<5> funct;
215
216 let Opcode = 0b11101; // RR
217 let funct = _funct;
218
219 let Inst{10-5} = _code;
220 let Inst{4-0} = funct;
221}
Akira Hatanakabff8e312012-05-31 02:59:44 +0000222
223//
224// J(AL)R(C) subformat
225//
Akira Hatanakaf640f042012-07-17 22:55:34 +0000226class FRR16_JALRC<bits<1> _nd, bits<1> _l, bits<1> r_a,
227 dag outs, dag ins, string asmstr,
228 list<dag> pattern, InstrItinClass itin>:
229 MipsInst16<outs, ins, asmstr, pattern, itin, FrmRR16>
Akira Hatanakabff8e312012-05-31 02:59:44 +0000230{
231 bits<3> rx;
232 bits<1> nd;
233 bits<1> l;
234 bits<1> ra;
235
Akira Hatanakaf640f042012-07-17 22:55:34 +0000236 let nd = _nd;
237 let l = _l;
238 let ra = r_a;
239
Akira Hatanakabff8e312012-05-31 02:59:44 +0000240 let Opcode = 0b11101;
241
242 let Inst{10-8} = rx;
243 let Inst{7} = nd;
244 let Inst{6} = l;
245 let Inst{5} = ra;
246 let Inst{4-0} = 0;
247}
248
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000249//===----------------------------------------------------------------------===//
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000250// Format RRI instruction class in Mips : <|opcode|rx|ry|imm5|>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000251//===----------------------------------------------------------------------===//
252
253class FRRI16<bits<5> op, dag outs, dag ins, string asmstr,
254 list<dag> pattern, InstrItinClass itin>:
Akira Hatanakaf640f042012-07-17 22:55:34 +0000255 MipsInst16<outs, ins, asmstr, pattern, itin, FrmRRI16>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000256{
257 bits<3> rx;
258 bits<3> ry;
259 bits<5> imm5;
260
261 let Opcode = op;
262
263
264 let Inst{10-8} = rx;
265 let Inst{7-5} = ry;
266 let Inst{4-0} = imm5;
267}
268
269//===----------------------------------------------------------------------===//
270// Format RRR instruction class in Mips : <|opcode|rx|ry|rz|f|>
271//===----------------------------------------------------------------------===//
272
Akira Hatanakaf640f042012-07-17 22:55:34 +0000273class FRRR16<bits<2> _f, dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000274 list<dag> pattern, InstrItinClass itin>:
Akira Hatanakaf640f042012-07-17 22:55:34 +0000275 MipsInst16<outs, ins, asmstr, pattern, itin, FrmRRR16>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000276{
277 bits<3> rx;
278 bits<3> ry;
279 bits<3> rz;
280 bits<2> f;
281
Akira Hatanakaf640f042012-07-17 22:55:34 +0000282 let Opcode = 0b11100;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000283 let f = _f;
284
285 let Inst{10-8} = rx;
286 let Inst{7-5} = ry;
287 let Inst{4-2} = rz;
288 let Inst{1-0} = f;
289}
290
291//===----------------------------------------------------------------------===//
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000292// Format RRI-A instruction class in Mips : <|opcode|rx|ry|f|imm4|>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000293//===----------------------------------------------------------------------===//
294
Akira Hatanakaf640f042012-07-17 22:55:34 +0000295class FRRI_A16<bits<1> _f, dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000296 list<dag> pattern, InstrItinClass itin>:
Akira Hatanakaf640f042012-07-17 22:55:34 +0000297 MipsInst16<outs, ins, asmstr, pattern, itin, FrmRRI_A16>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000298{
299 bits<3> rx;
300 bits<3> ry;
301 bits<1> f;
302 bits<4> imm4;
303
Akira Hatanakaf640f042012-07-17 22:55:34 +0000304 let Opcode = 0b01000;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000305 let f = _f;
306
307 let Inst{10-8} = rx;
308 let Inst{7-5} = ry;
309 let Inst{4} = f;
310 let Inst{3-0} = imm4;
311}
312
313//===----------------------------------------------------------------------===//
314// Format Shift instruction class in Mips : <|opcode|rx|ry|sa|f|>
315//===----------------------------------------------------------------------===//
316
Akira Hatanakaf640f042012-07-17 22:55:34 +0000317class FSHIFT16<bits<2> _f, dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000318 list<dag> pattern, InstrItinClass itin>:
Akira Hatanakaf640f042012-07-17 22:55:34 +0000319 MipsInst16<outs, ins, asmstr, pattern, itin, FrmSHIFT16>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000320{
321 bits<3> rx;
322 bits<3> ry;
323 bits<3> sa;
324 bits<2> f;
325
Akira Hatanakaf640f042012-07-17 22:55:34 +0000326 let Opcode = 0b00110;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000327 let f = _f;
328
329 let Inst{10-8} = rx;
330 let Inst{7-5} = ry;
331 let Inst{4-2} = sa;
332 let Inst{1-0} = f;
333}
334
335//===----------------------------------------------------------------------===//
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000336// Format i8 instruction class in Mips : <|opcode|funct|imm8>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000337//===----------------------------------------------------------------------===//
338
Akira Hatanakaf640f042012-07-17 22:55:34 +0000339class FI816<bits<3> _func, dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000340 list<dag> pattern, InstrItinClass itin>:
Akira Hatanakaf640f042012-07-17 22:55:34 +0000341 MipsInst16<outs, ins, asmstr, pattern, itin, FrmI8_TYPE16>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000342{
343 bits<3> func;
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000344 bits<8> imm8;
Akira Hatanaka21371762012-06-13 02:42:47 +0000345
Akira Hatanakaf640f042012-07-17 22:55:34 +0000346 let Opcode = 0b01100;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000347 let func = _func;
348
349 let Inst{10-8} = func;
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000350 let Inst{7-0} = imm8;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000351}
352
353//===----------------------------------------------------------------------===//
354// Format i8_MOVR32 instruction class in Mips : <|opcode|func|ry|r32>
355//===----------------------------------------------------------------------===//
356
Akira Hatanakaf640f042012-07-17 22:55:34 +0000357class FI8_MOVR3216<dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000358 list<dag> pattern, InstrItinClass itin>:
Akira Hatanakaf640f042012-07-17 22:55:34 +0000359 MipsInst16<outs, ins, asmstr, pattern, itin, FrmI8_MOVR3216>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000360{
361
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000362 bits<4> ry;
363 bits<4> r32;
Akira Hatanaka21371762012-06-13 02:42:47 +0000364
Akira Hatanakaf640f042012-07-17 22:55:34 +0000365 let Opcode = 0b01100;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000366
Akira Hatanakaf640f042012-07-17 22:55:34 +0000367 let Inst{10-8} = 0b111;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000368 let Inst{7-4} = ry;
369 let Inst{3-0} = r32;
Akira Hatanaka21371762012-06-13 02:42:47 +0000370
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000371}
372
373
374
375//===----------------------------------------------------------------------===//
Akira Hatanakaf640f042012-07-17 22:55:34 +0000376// Format i8_MOV32R instruction class in Mips : <|opcode|func|r32|rz>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000377//===----------------------------------------------------------------------===//
378
Akira Hatanakaf640f042012-07-17 22:55:34 +0000379class FI8_MOV32R16<dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000380 list<dag> pattern, InstrItinClass itin>:
Akira Hatanakaf640f042012-07-17 22:55:34 +0000381 MipsInst16<outs, ins, asmstr, pattern, itin, FrmI8_MOV32R16>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000382{
383
384 bits<3> func;
385 bits<5> r32;
386 bits<3> rz;
387
Akira Hatanaka21371762012-06-13 02:42:47 +0000388
Akira Hatanakaf640f042012-07-17 22:55:34 +0000389 let Opcode = 0b01100;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000390
Akira Hatanakaf640f042012-07-17 22:55:34 +0000391 let Inst{10-8} = 0b101;
Akira Hatanaka21371762012-06-13 02:42:47 +0000392 let Inst{7-5} = r32{2-0};
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000393 let Inst{4-3} = r32{4-3};
394 let Inst{2-0} = rz;
Akira Hatanaka21371762012-06-13 02:42:47 +0000395
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000396}
397
398//===----------------------------------------------------------------------===//
Akira Hatanaka21371762012-06-13 02:42:47 +0000399// Format i8_SVRS instruction class in Mips :
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000400// <|opcode|svrs|s|ra|s0|s1|framesize>
401//===----------------------------------------------------------------------===//
402
Akira Hatanakaf640f042012-07-17 22:55:34 +0000403class FI8_SVRS16<bits<1> _s, dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000404 list<dag> pattern, InstrItinClass itin>:
Akira Hatanakaf640f042012-07-17 22:55:34 +0000405 MipsInst16<outs, ins, asmstr, pattern, itin, FrmI8_SVRS16>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000406{
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000407 bits<1> s;
Akira Hatanakaf640f042012-07-17 22:55:34 +0000408 bits<1> ra = 0;
409 bits<1> s0 = 0;
410 bits<1> s1 = 0;
411 bits<4> framesize = 0;
Akira Hatanaka21371762012-06-13 02:42:47 +0000412
Akira Hatanakaf640f042012-07-17 22:55:34 +0000413 let s =_s;
414 let Opcode = 0b01100;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000415
Akira Hatanakaf640f042012-07-17 22:55:34 +0000416 let Inst{10-8} = 0b100;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000417 let Inst{7} = s;
418 let Inst{6} = ra;
419 let Inst{5} = s0;
420 let Inst{4} = s1;
421 let Inst{3-0} = framesize;
Akira Hatanaka21371762012-06-13 02:42:47 +0000422
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000423}
424
425//===----------------------------------------------------------------------===//
Akira Hatanaka21371762012-06-13 02:42:47 +0000426// Format JAL instruction class in Mips16 :
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000427// <|opcode|svrs|s|ra|s0|s1|framesize>
428//===----------------------------------------------------------------------===//
429
Akira Hatanakaf640f042012-07-17 22:55:34 +0000430class FJAL16<bits<1> _X, dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000431 list<dag> pattern, InstrItinClass itin>:
Akira Hatanakaf640f042012-07-17 22:55:34 +0000432 MipsInst16_32<outs, ins, asmstr, pattern, itin, FrmJAL16>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000433{
434 bits<1> X;
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000435 bits<26> imm26;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000436
Akira Hatanaka21371762012-06-13 02:42:47 +0000437
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000438 let X = _X;
439
Akira Hatanakabff8e312012-05-31 02:59:44 +0000440 let Inst{31-27} = 0b00011;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000441 let Inst{26} = X;
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000442 let Inst{25-21} = imm26{20-16};
443 let Inst{20-16} = imm26{25-21};
444 let Inst{15-0} = imm26{15-0};
Akira Hatanaka21371762012-06-13 02:42:47 +0000445
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000446}
447
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000448//===----------------------------------------------------------------------===//
Akira Hatanaka21371762012-06-13 02:42:47 +0000449// Format EXT-I instruction class in Mips16 :
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000450// <|EXTEND|imm10:5|imm15:11|op|0|0|0|0|0|0|imm4:0>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000451//===----------------------------------------------------------------------===//
452
Akira Hatanakabff8e312012-05-31 02:59:44 +0000453class FEXT_I16<bits<5> _eop, dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000454 list<dag> pattern, InstrItinClass itin>:
Akira Hatanakaf640f042012-07-17 22:55:34 +0000455 MipsInst16_EXTEND<outs, ins, asmstr, pattern, itin, FrmEXT_I16>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000456{
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000457 bits<16> imm16;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000458 bits<5> eop;
Akira Hatanaka21371762012-06-13 02:42:47 +0000459
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000460 let eop = _eop;
461
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000462 let Inst{26-21} = imm16{10-5};
463 let Inst{20-16} = imm16{15-11};
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000464 let Inst{15-11} = eop;
465 let Inst{10-5} = 0;
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000466 let Inst{4-0} = imm16{4-0};
Akira Hatanaka21371762012-06-13 02:42:47 +0000467
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000468}
469
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000470//===----------------------------------------------------------------------===//
Akira Hatanaka21371762012-06-13 02:42:47 +0000471// Format ASMACRO instruction class in Mips16 :
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000472// <EXTEND|select|p4|p3|RRR|p2|p1|p0>
473//===----------------------------------------------------------------------===//
474
Akira Hatanakaf640f042012-07-17 22:55:34 +0000475class FASMACRO16<dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000476 list<dag> pattern, InstrItinClass itin>:
Akira Hatanakaf640f042012-07-17 22:55:34 +0000477 MipsInst16_EXTEND<outs, ins, asmstr, pattern, itin, FrmASMACRO16>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000478{
479 bits<3> select;
480 bits<3> p4;
481 bits<5> p3;
Akira Hatanakaf640f042012-07-17 22:55:34 +0000482 bits<5> RRR = 0b11100;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000483 bits<3> p2;
484 bits<3> p1;
485 bits<5> p0;
Akira Hatanaka21371762012-06-13 02:42:47 +0000486
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000487
488 let Inst{26-24} = select;
489 let Inst{23-21} = p4;
490 let Inst{20-16} = p3;
491 let Inst{15-11} = RRR;
492 let Inst{10-8} = p2;
493 let Inst{7-5} = p1;
Akira Hatanaka21371762012-06-13 02:42:47 +0000494 let Inst{4-0} = p0;
495
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000496}
497
498
499//===----------------------------------------------------------------------===//
Akira Hatanaka21371762012-06-13 02:42:47 +0000500// Format EXT-RI instruction class in Mips16 :
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000501// <|EXTEND|imm10:5|imm15:11|op|rx|0|0|0|imm4:0>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000502//===----------------------------------------------------------------------===//
503
Akira Hatanakabff8e312012-05-31 02:59:44 +0000504class FEXT_RI16<bits<5> _op, dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000505 list<dag> pattern, InstrItinClass itin>:
Akira Hatanakaf640f042012-07-17 22:55:34 +0000506 MipsInst16_EXTEND<outs, ins, asmstr, pattern, itin, FrmEXT_RI16>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000507{
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000508 bits<16> imm16;
Akira Hatanakabff8e312012-05-31 02:59:44 +0000509 bits<5> op;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000510 bits<3> rx;
Akira Hatanaka21371762012-06-13 02:42:47 +0000511
Akira Hatanakabff8e312012-05-31 02:59:44 +0000512 let op = _op;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000513
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000514 let Inst{26-21} = imm16{10-5};
515 let Inst{20-16} = imm16{15-11};
Akira Hatanakabff8e312012-05-31 02:59:44 +0000516 let Inst{15-11} = op;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000517 let Inst{10-8} = rx;
518 let Inst{7-5} = 0;
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000519 let Inst{4-0} = imm16{4-0};
Akira Hatanaka21371762012-06-13 02:42:47 +0000520
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000521}
522
523//===----------------------------------------------------------------------===//
524// Format EXT-RRI instruction class in Mips16 :
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000525// <|EXTEND|imm10:5|imm15:11|op|rx|ry|imm4:0>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000526//===----------------------------------------------------------------------===//
527
Akira Hatanakabff8e312012-05-31 02:59:44 +0000528class FEXT_RRI16<bits<5> _op, dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000529 list<dag> pattern, InstrItinClass itin>:
Akira Hatanakaf640f042012-07-17 22:55:34 +0000530 MipsInst16_EXTEND<outs, ins, asmstr, pattern, itin, FrmEXT_RRI16>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000531{
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000532 bits<16> imm16;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000533 bits<3> rx;
534 bits<3> ry;
Akira Hatanakabff8e312012-05-31 02:59:44 +0000535
Akira Hatanakab49c68a62012-07-21 02:20:33 +0000536
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000537 let Inst{26-21} = imm16{10-5};
538 let Inst{20-16} = imm16{15-11};
Akira Hatanakab49c68a62012-07-21 02:20:33 +0000539 let Inst{15-11} = _op;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000540 let Inst{10-8} = rx;
541 let Inst{7-5} = ry;
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000542 let Inst{4-0} = imm16{4-0};
Akira Hatanaka21371762012-06-13 02:42:47 +0000543
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000544}
545
546//===----------------------------------------------------------------------===//
Akira Hatanaka21371762012-06-13 02:42:47 +0000547// Format EXT-RRI-A instruction class in Mips16 :
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000548// <|EXTEND|imm10:4|imm14:11|RRI-A|rx|ry|f|imm3:0>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000549//===----------------------------------------------------------------------===//
550
Akira Hatanakabff8e312012-05-31 02:59:44 +0000551class FEXT_RRI_A16<bits<1> _f, dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000552 list<dag> pattern, InstrItinClass itin>:
Akira Hatanakaf640f042012-07-17 22:55:34 +0000553 MipsInst16_EXTEND<outs, ins, asmstr, pattern, itin, FrmEXT_RRI_A16>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000554{
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000555 bits<15> imm15;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000556 bits<3> rx;
557 bits<3> ry;
558 bits<1> f;
Akira Hatanaka21371762012-06-13 02:42:47 +0000559
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000560 let f = _f;
561
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000562 let Inst{26-20} = imm15{10-4};
563 let Inst{19-16} = imm15{14-11};
Akira Hatanakabff8e312012-05-31 02:59:44 +0000564 let Inst{15-11} = 0b01000;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000565 let Inst{10-8} = rx;
566 let Inst{7-5} = ry;
567 let Inst{4} = f;
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000568 let Inst{3-0} = imm15{3-0};
Akira Hatanaka21371762012-06-13 02:42:47 +0000569
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000570}
571
572//===----------------------------------------------------------------------===//
Akira Hatanaka21371762012-06-13 02:42:47 +0000573// Format EXT-SHIFT instruction class in Mips16 :
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000574// <|EXTEND|sa 4:0|s5|0|SHIFT|rx|ry|0|f>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000575//===----------------------------------------------------------------------===//
576
Akira Hatanakaf640f042012-07-17 22:55:34 +0000577class FEXT_SHIFT16<bits<2> _f, dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000578 list<dag> pattern, InstrItinClass itin>:
Akira Hatanakaf640f042012-07-17 22:55:34 +0000579 MipsInst16_EXTEND<outs, ins, asmstr, pattern, itin, FrmEXT_SHIFT16>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000580{
581 bits<6> sa6;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000582 bits<3> rx;
583 bits<3> ry;
584 bits<2> f;
Akira Hatanaka21371762012-06-13 02:42:47 +0000585
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000586 let f = _f;
587
588 let Inst{26-22} = sa6{4-0};
589 let Inst{21} = sa6{5};
590 let Inst{20-16} = 0;
Akira Hatanakabff8e312012-05-31 02:59:44 +0000591 let Inst{15-11} = 0b00110;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000592 let Inst{10-8} = rx;
593 let Inst{7-5} = ry;
594 let Inst{4-2} = 0;
Akira Hatanaka21371762012-06-13 02:42:47 +0000595 let Inst{1-0} = f;
596
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000597}
598
599//===----------------------------------------------------------------------===//
Akira Hatanaka21371762012-06-13 02:42:47 +0000600// Format EXT-I8 instruction class in Mips16 :
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000601// <|EXTEND|imm10:5|imm15:11|I8|funct|0|imm4:0>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000602//===----------------------------------------------------------------------===//
603
Akira Hatanakabff8e312012-05-31 02:59:44 +0000604class FEXT_I816<bits<3> _funct, dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000605 list<dag> pattern, InstrItinClass itin>:
Akira Hatanakaf640f042012-07-17 22:55:34 +0000606 MipsInst16_EXTEND<outs, ins, asmstr, pattern, itin, FrmEXT_I816>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000607{
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000608 bits<16> imm16;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000609 bits<5> I8;
610 bits<3> funct;
Akira Hatanaka21371762012-06-13 02:42:47 +0000611
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000612 let funct = _funct;
Akira Hatanakaf640f042012-07-17 22:55:34 +0000613 let I8 = 0b0110;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000614
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000615 let Inst{26-21} = imm16{10-5};
616 let Inst{20-16} = imm16{15-11};
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000617 let Inst{15-11} = I8;
618 let Inst{10-8} = funct;
619 let Inst{7-5} = 0;
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000620 let Inst{4-0} = imm16{4-0};
Akira Hatanaka21371762012-06-13 02:42:47 +0000621
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000622}
623
624//===----------------------------------------------------------------------===//
Akira Hatanaka21371762012-06-13 02:42:47 +0000625// Format EXT-I8_SVRS instruction class in Mips16 :
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000626// <|EXTEND|xsregs|framesize7:4|aregs|I8|SVRS|s|ra|s0|s1|framesize3:0>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000627//===----------------------------------------------------------------------===//
628
Akira Hatanakaf640f042012-07-17 22:55:34 +0000629class FEXT_I8_SVRS16<bits<1> s_, dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000630 list<dag> pattern, InstrItinClass itin>:
Akira Hatanakaf640f042012-07-17 22:55:34 +0000631 MipsInst16_EXTEND<outs, ins, asmstr, pattern, itin, FrmI8_SVRS16>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000632{
Akira Hatanakaf640f042012-07-17 22:55:34 +0000633 bits<3> xsregs =0;
634 bits<8> framesize =0;
635 bits<3> aregs =0;
636 bits<5> I8 = 0b01100;
637 bits<3> SVRS = 0b100;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000638 bits<1> s;
Akira Hatanakaf640f042012-07-17 22:55:34 +0000639 bits<1> ra = 0;
640 bits<1> s0 = 0;
641 bits<1> s1 = 0;
Akira Hatanaka21371762012-06-13 02:42:47 +0000642
Akira Hatanakaf640f042012-07-17 22:55:34 +0000643 let s= s_;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000644
645 let Inst{26-24} = xsregs;
646 let Inst{23-20} = framesize{7-4};
647 let Inst{19} = 0;
648 let Inst{18-16} = aregs;
649 let Inst{15-11} = I8;
650 let Inst{10-8} = SVRS;
651 let Inst{7} = s;
652 let Inst{6} = ra;
653 let Inst{5} = s0;
654 let Inst{4} = s1;
655 let Inst{3-0} = framesize{3-0};
Akira Hatanaka21371762012-06-13 02:42:47 +0000656
657
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000658}
659
660
661