blob: 4ff62ef3b6f99fb116a660beb5c08e11528d0a0d [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
Akira Hatanakac515bfb2012-05-08 19:08:58 +000032
Akira Hatanakabff8e312012-05-31 02:59:44 +000033// Base class for Mips 16 Format
34// This class does not depend on the instruction size
35//
36class MipsInst16_Base<dag outs, dag ins, string asmstr, list<dag> pattern,
Reed Kotlerec8a5492013-02-14 03:05:25 +000037 InstrItinClass itin>: Instruction
Akira Hatanakac515bfb2012-05-08 19:08:58 +000038{
Akira Hatanakac515bfb2012-05-08 19:08:58 +000039
40 let Namespace = "Mips";
41
Akira Hatanakac515bfb2012-05-08 19:08:58 +000042 let OutOperandList = outs;
43 let InOperandList = ins;
44
45 let AsmString = asmstr;
46 let Pattern = pattern;
47 let Itinerary = itin;
48
Akira Hatanakabff8e312012-05-31 02:59:44 +000049 let Predicates = [InMips16Mode];
Akira Hatanakac515bfb2012-05-08 19:08:58 +000050}
51
52//
Akira Hatanakabff8e312012-05-31 02:59:44 +000053// Generic Mips 16 Format
Akira Hatanakac515bfb2012-05-08 19:08:58 +000054//
Akira Hatanakabff8e312012-05-31 02:59:44 +000055class MipsInst16<dag outs, dag ins, string asmstr, list<dag> pattern,
Reed Kotlerec8a5492013-02-14 03:05:25 +000056 InstrItinClass itin>:
57 MipsInst16_Base<outs, ins, asmstr, pattern, itin>
Akira Hatanakac515bfb2012-05-08 19:08:58 +000058{
Akira Hatanakabff8e312012-05-31 02:59:44 +000059 field bits<16> Inst;
Akira Hatanakac515bfb2012-05-08 19:08:58 +000060 bits<5> Opcode = 0;
Akira Hatanakac515bfb2012-05-08 19:08:58 +000061
Akira Hatanakaf640f042012-07-17 22:55:34 +000062 // Top 5 bits are the 'opcode' field
Akira Hatanakac515bfb2012-05-08 19:08:58 +000063 let Inst{15-11} = Opcode;
Reed Kotlerec8a5492013-02-14 03:05:25 +000064
65 let Size=2;
66 field bits<16> SoftFail = 0;
Akira Hatanakabff8e312012-05-31 02:59:44 +000067}
Akira Hatanakac515bfb2012-05-08 19:08:58 +000068
Akira Hatanakabff8e312012-05-31 02:59:44 +000069//
70// For 32 bit extended instruction forms.
71//
72class MipsInst16_32<dag outs, dag ins, string asmstr, list<dag> pattern,
Reed Kotlerec8a5492013-02-14 03:05:25 +000073 InstrItinClass itin>:
74 MipsInst16_Base<outs, ins, asmstr, pattern, itin>
Akira Hatanakabff8e312012-05-31 02:59:44 +000075{
76 field bits<32> Inst;
Reed Kotlerec8a5492013-02-14 03:05:25 +000077
78 let Size=4;
79 field bits<32> SoftFail = 0;
Akira Hatanakabff8e312012-05-31 02:59:44 +000080}
Akira Hatanakac515bfb2012-05-08 19:08:58 +000081
Akira Hatanakabff8e312012-05-31 02:59:44 +000082class MipsInst16_EXTEND<dag outs, dag ins, string asmstr, list<dag> pattern,
Reed Kotlerec8a5492013-02-14 03:05:25 +000083 InstrItinClass itin>:
84 MipsInst16_32<outs, ins, asmstr, pattern, itin>
Akira Hatanakabff8e312012-05-31 02:59:44 +000085{
Akira Hatanakabff8e312012-05-31 02:59:44 +000086 let Inst{31-27} = 0b11110;
Akira Hatanakac515bfb2012-05-08 19:08:58 +000087}
88
89
90
91// Mips Pseudo Instructions Format
92class MipsPseudo16<dag outs, dag ins, string asmstr, list<dag> pattern>:
Reed Kotlerec8a5492013-02-14 03:05:25 +000093 MipsInst16<outs, ins, asmstr, pattern, IIPseudo> {
Akira Hatanakac515bfb2012-05-08 19:08:58 +000094 let isCodeGenOnly = 1;
95 let isPseudo = 1;
96}
97
98
99//===----------------------------------------------------------------------===//
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000100// Format I instruction class in Mips : <|opcode|imm11|>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000101//===----------------------------------------------------------------------===//
102
103class FI16<bits<5> op, dag outs, dag ins, string asmstr, list<dag> pattern,
Akira Hatanakaf640f042012-07-17 22:55:34 +0000104 InstrItinClass itin>:
Reed Kotlerec8a5492013-02-14 03:05:25 +0000105 MipsInst16<outs, ins, asmstr, pattern, itin>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000106{
107 bits<11> imm11;
108
109 let Opcode = op;
110
111 let Inst{10-0} = imm11;
112}
113
114//===----------------------------------------------------------------------===//
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000115// Format RI instruction class in Mips : <|opcode|rx|imm8|>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000116//===----------------------------------------------------------------------===//
117
118class FRI16<bits<5> op, dag outs, dag ins, string asmstr,
119 list<dag> pattern, InstrItinClass itin>:
Reed Kotlerec8a5492013-02-14 03:05:25 +0000120 MipsInst16<outs, ins, asmstr, pattern, itin>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000121{
122 bits<3> rx;
123 bits<8> imm8;
124
125 let Opcode = op;
126
127 let Inst{10-8} = rx;
128 let Inst{7-0} = imm8;
129}
130
131//===----------------------------------------------------------------------===//
132// Format RR instruction class in Mips : <|opcode|rx|ry|funct|>
133//===----------------------------------------------------------------------===//
134
Akira Hatanakadf98a7a2012-05-24 18:32:33 +0000135class FRR16<bits<5> _funct, dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000136 list<dag> pattern, InstrItinClass itin>:
Reed Kotlerec8a5492013-02-14 03:05:25 +0000137 MipsInst16<outs, ins, asmstr, pattern, itin>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000138{
139 bits<3> rx;
140 bits<3> ry;
141 bits<5> funct;
142
Akira Hatanakadf98a7a2012-05-24 18:32:33 +0000143 let Opcode = 0b11101;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000144 let funct = _funct;
145
146 let Inst{10-8} = rx;
147 let Inst{7-5} = ry;
148 let Inst{4-0} = funct;
149}
150
Akira Hatanakaf640f042012-07-17 22:55:34 +0000151//
152// For conversion functions.
153//
154class FRR_SF16<bits<5> _funct, bits<3> _subfunct, dag outs, dag ins,
155 string asmstr, list<dag> pattern, InstrItinClass itin>:
Reed Kotlerec8a5492013-02-14 03:05:25 +0000156 MipsInst16<outs, ins, asmstr, pattern, itin>
Akira Hatanakaf640f042012-07-17 22:55:34 +0000157{
158 bits<3> rx;
159 bits<3> subfunct;
160 bits<5> funct;
161
162 let Opcode = 0b11101; // RR
163 let funct = _funct;
164 let subfunct = _subfunct;
165
166 let Inst{10-8} = rx;
167 let Inst{7-5} = subfunct;
168 let Inst{4-0} = funct;
169}
170
171//
172// just used for breakpoint (hardware and software) instructions.
173//
174class FC16<bits<5> _funct, dag outs, dag ins, string asmstr,
175 list<dag> pattern, InstrItinClass itin>:
Reed Kotlerec8a5492013-02-14 03:05:25 +0000176 MipsInst16<outs, ins, asmstr, pattern, itin>
Akira Hatanakaf640f042012-07-17 22:55:34 +0000177{
178 bits<6> _code; // code is a keyword in tablegen
179 bits<5> funct;
180
181 let Opcode = 0b11101; // RR
182 let funct = _funct;
183
184 let Inst{10-5} = _code;
185 let Inst{4-0} = funct;
186}
Akira Hatanakabff8e312012-05-31 02:59:44 +0000187
188//
189// J(AL)R(C) subformat
190//
Akira Hatanakaf640f042012-07-17 22:55:34 +0000191class FRR16_JALRC<bits<1> _nd, bits<1> _l, bits<1> r_a,
192 dag outs, dag ins, string asmstr,
193 list<dag> pattern, InstrItinClass itin>:
Reed Kotlerec8a5492013-02-14 03:05:25 +0000194 MipsInst16<outs, ins, asmstr, pattern, itin>
Akira Hatanakabff8e312012-05-31 02:59:44 +0000195{
196 bits<3> rx;
197 bits<1> nd;
198 bits<1> l;
199 bits<1> ra;
200
Akira Hatanakaf640f042012-07-17 22:55:34 +0000201 let nd = _nd;
202 let l = _l;
203 let ra = r_a;
204
Akira Hatanakabff8e312012-05-31 02:59:44 +0000205 let Opcode = 0b11101;
206
207 let Inst{10-8} = rx;
208 let Inst{7} = nd;
209 let Inst{6} = l;
210 let Inst{5} = ra;
211 let Inst{4-0} = 0;
212}
213
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000214//===----------------------------------------------------------------------===//
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000215// Format RRI instruction class in Mips : <|opcode|rx|ry|imm5|>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000216//===----------------------------------------------------------------------===//
217
218class FRRI16<bits<5> op, dag outs, dag ins, string asmstr,
219 list<dag> pattern, InstrItinClass itin>:
Reed Kotlerec8a5492013-02-14 03:05:25 +0000220 MipsInst16<outs, ins, asmstr, pattern, itin>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000221{
222 bits<3> rx;
223 bits<3> ry;
224 bits<5> imm5;
225
226 let Opcode = op;
227
228
229 let Inst{10-8} = rx;
230 let Inst{7-5} = ry;
231 let Inst{4-0} = imm5;
232}
233
234//===----------------------------------------------------------------------===//
235// Format RRR instruction class in Mips : <|opcode|rx|ry|rz|f|>
236//===----------------------------------------------------------------------===//
237
Akira Hatanakaf640f042012-07-17 22:55:34 +0000238class FRRR16<bits<2> _f, dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000239 list<dag> pattern, InstrItinClass itin>:
Reed Kotlerec8a5492013-02-14 03:05:25 +0000240 MipsInst16<outs, ins, asmstr, pattern, itin>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000241{
242 bits<3> rx;
243 bits<3> ry;
244 bits<3> rz;
245 bits<2> f;
246
Akira Hatanakaf640f042012-07-17 22:55:34 +0000247 let Opcode = 0b11100;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000248 let f = _f;
249
250 let Inst{10-8} = rx;
251 let Inst{7-5} = ry;
252 let Inst{4-2} = rz;
253 let Inst{1-0} = f;
254}
255
256//===----------------------------------------------------------------------===//
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000257// Format RRI-A instruction class in Mips : <|opcode|rx|ry|f|imm4|>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000258//===----------------------------------------------------------------------===//
259
Akira Hatanakaf640f042012-07-17 22:55:34 +0000260class FRRI_A16<bits<1> _f, dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000261 list<dag> pattern, InstrItinClass itin>:
Reed Kotlerec8a5492013-02-14 03:05:25 +0000262 MipsInst16<outs, ins, asmstr, pattern, itin>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000263{
264 bits<3> rx;
265 bits<3> ry;
266 bits<1> f;
267 bits<4> imm4;
268
Akira Hatanakaf640f042012-07-17 22:55:34 +0000269 let Opcode = 0b01000;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000270 let f = _f;
271
272 let Inst{10-8} = rx;
273 let Inst{7-5} = ry;
274 let Inst{4} = f;
275 let Inst{3-0} = imm4;
276}
277
278//===----------------------------------------------------------------------===//
279// Format Shift instruction class in Mips : <|opcode|rx|ry|sa|f|>
280//===----------------------------------------------------------------------===//
281
Akira Hatanakaf640f042012-07-17 22:55:34 +0000282class FSHIFT16<bits<2> _f, dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000283 list<dag> pattern, InstrItinClass itin>:
Reed Kotlerec8a5492013-02-14 03:05:25 +0000284 MipsInst16<outs, ins, asmstr, pattern, itin>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000285{
286 bits<3> rx;
287 bits<3> ry;
288 bits<3> sa;
289 bits<2> f;
290
Akira Hatanakaf640f042012-07-17 22:55:34 +0000291 let Opcode = 0b00110;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000292 let f = _f;
293
294 let Inst{10-8} = rx;
295 let Inst{7-5} = ry;
296 let Inst{4-2} = sa;
297 let Inst{1-0} = f;
298}
299
300//===----------------------------------------------------------------------===//
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000301// Format i8 instruction class in Mips : <|opcode|funct|imm8>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000302//===----------------------------------------------------------------------===//
303
Akira Hatanakaf640f042012-07-17 22:55:34 +0000304class FI816<bits<3> _func, dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000305 list<dag> pattern, InstrItinClass itin>:
Reed Kotlerec8a5492013-02-14 03:05:25 +0000306 MipsInst16<outs, ins, asmstr, pattern, itin>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000307{
308 bits<3> func;
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000309 bits<8> imm8;
Akira Hatanaka21371762012-06-13 02:42:47 +0000310
Akira Hatanakaf640f042012-07-17 22:55:34 +0000311 let Opcode = 0b01100;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000312 let func = _func;
313
314 let Inst{10-8} = func;
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000315 let Inst{7-0} = imm8;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000316}
317
318//===----------------------------------------------------------------------===//
319// Format i8_MOVR32 instruction class in Mips : <|opcode|func|ry|r32>
320//===----------------------------------------------------------------------===//
321
Akira Hatanakaf640f042012-07-17 22:55:34 +0000322class FI8_MOVR3216<dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000323 list<dag> pattern, InstrItinClass itin>:
Reed Kotlerec8a5492013-02-14 03:05:25 +0000324 MipsInst16<outs, ins, asmstr, pattern, itin>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000325{
326
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000327 bits<4> ry;
328 bits<4> r32;
Akira Hatanaka21371762012-06-13 02:42:47 +0000329
Akira Hatanakaf640f042012-07-17 22:55:34 +0000330 let Opcode = 0b01100;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000331
Akira Hatanakaf640f042012-07-17 22:55:34 +0000332 let Inst{10-8} = 0b111;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000333 let Inst{7-4} = ry;
334 let Inst{3-0} = r32;
Akira Hatanaka21371762012-06-13 02:42:47 +0000335
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000336}
337
338
339
340//===----------------------------------------------------------------------===//
Akira Hatanakaf640f042012-07-17 22:55:34 +0000341// Format i8_MOV32R instruction class in Mips : <|opcode|func|r32|rz>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000342//===----------------------------------------------------------------------===//
343
Akira Hatanakaf640f042012-07-17 22:55:34 +0000344class FI8_MOV32R16<dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000345 list<dag> pattern, InstrItinClass itin>:
Reed Kotlerec8a5492013-02-14 03:05:25 +0000346 MipsInst16<outs, ins, asmstr, pattern, itin>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000347{
348
349 bits<3> func;
350 bits<5> r32;
351 bits<3> rz;
352
Akira Hatanaka21371762012-06-13 02:42:47 +0000353
Akira Hatanakaf640f042012-07-17 22:55:34 +0000354 let Opcode = 0b01100;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000355
Akira Hatanakaf640f042012-07-17 22:55:34 +0000356 let Inst{10-8} = 0b101;
Akira Hatanaka21371762012-06-13 02:42:47 +0000357 let Inst{7-5} = r32{2-0};
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000358 let Inst{4-3} = r32{4-3};
359 let Inst{2-0} = rz;
Akira Hatanaka21371762012-06-13 02:42:47 +0000360
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000361}
362
363//===----------------------------------------------------------------------===//
Akira Hatanaka21371762012-06-13 02:42:47 +0000364// Format i8_SVRS instruction class in Mips :
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000365// <|opcode|svrs|s|ra|s0|s1|framesize>
366//===----------------------------------------------------------------------===//
367
Akira Hatanakaf640f042012-07-17 22:55:34 +0000368class FI8_SVRS16<bits<1> _s, dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000369 list<dag> pattern, InstrItinClass itin>:
Reed Kotlerec8a5492013-02-14 03:05:25 +0000370 MipsInst16<outs, ins, asmstr, pattern, itin>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000371{
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000372 bits<1> s;
Akira Hatanakaf640f042012-07-17 22:55:34 +0000373 bits<1> ra = 0;
374 bits<1> s0 = 0;
375 bits<1> s1 = 0;
376 bits<4> framesize = 0;
Akira Hatanaka21371762012-06-13 02:42:47 +0000377
Akira Hatanakaf640f042012-07-17 22:55:34 +0000378 let s =_s;
379 let Opcode = 0b01100;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000380
Akira Hatanakaf640f042012-07-17 22:55:34 +0000381 let Inst{10-8} = 0b100;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000382 let Inst{7} = s;
383 let Inst{6} = ra;
384 let Inst{5} = s0;
385 let Inst{4} = s1;
386 let Inst{3-0} = framesize;
Akira Hatanaka21371762012-06-13 02:42:47 +0000387
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000388}
389
390//===----------------------------------------------------------------------===//
Akira Hatanaka21371762012-06-13 02:42:47 +0000391// Format JAL instruction class in Mips16 :
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000392// <|opcode|svrs|s|ra|s0|s1|framesize>
393//===----------------------------------------------------------------------===//
394
Akira Hatanakaf640f042012-07-17 22:55:34 +0000395class FJAL16<bits<1> _X, dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000396 list<dag> pattern, InstrItinClass itin>:
Reed Kotlerec8a5492013-02-14 03:05:25 +0000397 MipsInst16_32<outs, ins, asmstr, pattern, itin>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000398{
399 bits<1> X;
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000400 bits<26> imm26;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000401
Akira Hatanaka21371762012-06-13 02:42:47 +0000402
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000403 let X = _X;
404
Akira Hatanakabff8e312012-05-31 02:59:44 +0000405 let Inst{31-27} = 0b00011;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000406 let Inst{26} = X;
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000407 let Inst{25-21} = imm26{20-16};
408 let Inst{20-16} = imm26{25-21};
409 let Inst{15-0} = imm26{15-0};
Akira Hatanaka21371762012-06-13 02:42:47 +0000410
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000411}
412
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000413//===----------------------------------------------------------------------===//
Akira Hatanaka21371762012-06-13 02:42:47 +0000414// Format EXT-I instruction class in Mips16 :
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000415// <|EXTEND|imm10:5|imm15:11|op|0|0|0|0|0|0|imm4:0>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000416//===----------------------------------------------------------------------===//
417
Akira Hatanakabff8e312012-05-31 02:59:44 +0000418class FEXT_I16<bits<5> _eop, dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000419 list<dag> pattern, InstrItinClass itin>:
Reed Kotlerec8a5492013-02-14 03:05:25 +0000420 MipsInst16_EXTEND<outs, ins, asmstr, pattern, itin>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000421{
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000422 bits<16> imm16;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000423 bits<5> eop;
Akira Hatanaka21371762012-06-13 02:42:47 +0000424
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000425 let eop = _eop;
426
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000427 let Inst{26-21} = imm16{10-5};
428 let Inst{20-16} = imm16{15-11};
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000429 let Inst{15-11} = eop;
430 let Inst{10-5} = 0;
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000431 let Inst{4-0} = imm16{4-0};
Akira Hatanaka21371762012-06-13 02:42:47 +0000432
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000433}
434
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000435//===----------------------------------------------------------------------===//
Akira Hatanaka21371762012-06-13 02:42:47 +0000436// Format ASMACRO instruction class in Mips16 :
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000437// <EXTEND|select|p4|p3|RRR|p2|p1|p0>
438//===----------------------------------------------------------------------===//
439
Akira Hatanakaf640f042012-07-17 22:55:34 +0000440class FASMACRO16<dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000441 list<dag> pattern, InstrItinClass itin>:
Reed Kotlerec8a5492013-02-14 03:05:25 +0000442 MipsInst16_EXTEND<outs, ins, asmstr, pattern, itin>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000443{
444 bits<3> select;
445 bits<3> p4;
446 bits<5> p3;
Akira Hatanakaf640f042012-07-17 22:55:34 +0000447 bits<5> RRR = 0b11100;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000448 bits<3> p2;
449 bits<3> p1;
450 bits<5> p0;
Akira Hatanaka21371762012-06-13 02:42:47 +0000451
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000452
453 let Inst{26-24} = select;
454 let Inst{23-21} = p4;
455 let Inst{20-16} = p3;
456 let Inst{15-11} = RRR;
457 let Inst{10-8} = p2;
458 let Inst{7-5} = p1;
Akira Hatanaka21371762012-06-13 02:42:47 +0000459 let Inst{4-0} = p0;
460
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000461}
462
463
464//===----------------------------------------------------------------------===//
Akira Hatanaka21371762012-06-13 02:42:47 +0000465// Format EXT-RI instruction class in Mips16 :
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000466// <|EXTEND|imm10:5|imm15:11|op|rx|0|0|0|imm4:0>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000467//===----------------------------------------------------------------------===//
468
Akira Hatanakabff8e312012-05-31 02:59:44 +0000469class FEXT_RI16<bits<5> _op, dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000470 list<dag> pattern, InstrItinClass itin>:
Reed Kotlerec8a5492013-02-14 03:05:25 +0000471 MipsInst16_EXTEND<outs, ins, asmstr, pattern, itin>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000472{
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000473 bits<16> imm16;
Akira Hatanakabff8e312012-05-31 02:59:44 +0000474 bits<5> op;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000475 bits<3> rx;
Akira Hatanaka21371762012-06-13 02:42:47 +0000476
Akira Hatanakabff8e312012-05-31 02:59:44 +0000477 let op = _op;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000478
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000479 let Inst{26-21} = imm16{10-5};
480 let Inst{20-16} = imm16{15-11};
Akira Hatanakabff8e312012-05-31 02:59:44 +0000481 let Inst{15-11} = op;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000482 let Inst{10-8} = rx;
483 let Inst{7-5} = 0;
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000484 let Inst{4-0} = imm16{4-0};
Akira Hatanaka21371762012-06-13 02:42:47 +0000485
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000486}
487
488//===----------------------------------------------------------------------===//
489// Format EXT-RRI instruction class in Mips16 :
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000490// <|EXTEND|imm10:5|imm15:11|op|rx|ry|imm4:0>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000491//===----------------------------------------------------------------------===//
492
Akira Hatanakabff8e312012-05-31 02:59:44 +0000493class FEXT_RRI16<bits<5> _op, dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000494 list<dag> pattern, InstrItinClass itin>:
Reed Kotlerec8a5492013-02-14 03:05:25 +0000495 MipsInst16_EXTEND<outs, ins, asmstr, pattern, itin>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000496{
Akira Hatanaka26e9ecb2012-07-23 23:45:54 +0000497 bits<5> op;
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000498 bits<16> imm16;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000499 bits<3> rx;
500 bits<3> ry;
Akira Hatanakabff8e312012-05-31 02:59:44 +0000501
Akira Hatanaka26e9ecb2012-07-23 23:45:54 +0000502 let op=_op;
Akira Hatanakab49c68a62012-07-21 02:20:33 +0000503
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000504 let Inst{26-21} = imm16{10-5};
505 let Inst{20-16} = imm16{15-11};
Akira Hatanaka26e9ecb2012-07-23 23:45:54 +0000506 let Inst{15-11} = op;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000507 let Inst{10-8} = rx;
508 let Inst{7-5} = ry;
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000509 let Inst{4-0} = imm16{4-0};
Akira Hatanaka21371762012-06-13 02:42:47 +0000510
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000511}
512
513//===----------------------------------------------------------------------===//
Akira Hatanaka21371762012-06-13 02:42:47 +0000514// Format EXT-RRI-A instruction class in Mips16 :
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000515// <|EXTEND|imm10:4|imm14:11|RRI-A|rx|ry|f|imm3:0>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000516//===----------------------------------------------------------------------===//
517
Akira Hatanakabff8e312012-05-31 02:59:44 +0000518class FEXT_RRI_A16<bits<1> _f, dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000519 list<dag> pattern, InstrItinClass itin>:
Reed Kotlerec8a5492013-02-14 03:05:25 +0000520 MipsInst16_EXTEND<outs, ins, asmstr, pattern, itin>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000521{
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000522 bits<15> imm15;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000523 bits<3> rx;
524 bits<3> ry;
525 bits<1> f;
Akira Hatanaka21371762012-06-13 02:42:47 +0000526
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000527 let f = _f;
528
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000529 let Inst{26-20} = imm15{10-4};
530 let Inst{19-16} = imm15{14-11};
Akira Hatanakabff8e312012-05-31 02:59:44 +0000531 let Inst{15-11} = 0b01000;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000532 let Inst{10-8} = rx;
533 let Inst{7-5} = ry;
534 let Inst{4} = f;
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000535 let Inst{3-0} = imm15{3-0};
Akira Hatanaka21371762012-06-13 02:42:47 +0000536
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000537}
538
539//===----------------------------------------------------------------------===//
Akira Hatanaka21371762012-06-13 02:42:47 +0000540// Format EXT-SHIFT instruction class in Mips16 :
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000541// <|EXTEND|sa 4:0|s5|0|SHIFT|rx|ry|0|f>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000542//===----------------------------------------------------------------------===//
543
Akira Hatanakaf640f042012-07-17 22:55:34 +0000544class FEXT_SHIFT16<bits<2> _f, dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000545 list<dag> pattern, InstrItinClass itin>:
Reed Kotlerec8a5492013-02-14 03:05:25 +0000546 MipsInst16_EXTEND<outs, ins, asmstr, pattern, itin>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000547{
548 bits<6> sa6;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000549 bits<3> rx;
550 bits<3> ry;
551 bits<2> f;
Akira Hatanaka21371762012-06-13 02:42:47 +0000552
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000553 let f = _f;
554
555 let Inst{26-22} = sa6{4-0};
556 let Inst{21} = sa6{5};
557 let Inst{20-16} = 0;
Akira Hatanakabff8e312012-05-31 02:59:44 +0000558 let Inst{15-11} = 0b00110;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000559 let Inst{10-8} = rx;
560 let Inst{7-5} = ry;
561 let Inst{4-2} = 0;
Akira Hatanaka21371762012-06-13 02:42:47 +0000562 let Inst{1-0} = f;
563
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000564}
565
566//===----------------------------------------------------------------------===//
Akira Hatanaka21371762012-06-13 02:42:47 +0000567// Format EXT-I8 instruction class in Mips16 :
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000568// <|EXTEND|imm10:5|imm15:11|I8|funct|0|imm4:0>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000569//===----------------------------------------------------------------------===//
570
Akira Hatanakabff8e312012-05-31 02:59:44 +0000571class FEXT_I816<bits<3> _funct, dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000572 list<dag> pattern, InstrItinClass itin>:
Reed Kotlerec8a5492013-02-14 03:05:25 +0000573 MipsInst16_EXTEND<outs, ins, asmstr, pattern, itin>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000574{
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000575 bits<16> imm16;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000576 bits<5> I8;
577 bits<3> funct;
Akira Hatanaka21371762012-06-13 02:42:47 +0000578
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000579 let funct = _funct;
Akira Hatanakaf640f042012-07-17 22:55:34 +0000580 let I8 = 0b0110;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000581
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000582 let Inst{26-21} = imm16{10-5};
583 let Inst{20-16} = imm16{15-11};
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000584 let Inst{15-11} = I8;
585 let Inst{10-8} = funct;
586 let Inst{7-5} = 0;
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000587 let Inst{4-0} = imm16{4-0};
Akira Hatanaka21371762012-06-13 02:42:47 +0000588
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000589}
590
591//===----------------------------------------------------------------------===//
Akira Hatanaka21371762012-06-13 02:42:47 +0000592// Format EXT-I8_SVRS instruction class in Mips16 :
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000593// <|EXTEND|xsregs|framesize7:4|aregs|I8|SVRS|s|ra|s0|s1|framesize3:0>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000594//===----------------------------------------------------------------------===//
595
Akira Hatanakaf640f042012-07-17 22:55:34 +0000596class FEXT_I8_SVRS16<bits<1> s_, dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000597 list<dag> pattern, InstrItinClass itin>:
Reed Kotlerec8a5492013-02-14 03:05:25 +0000598 MipsInst16_EXTEND<outs, ins, asmstr, pattern, itin>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000599{
Akira Hatanakaf640f042012-07-17 22:55:34 +0000600 bits<3> xsregs =0;
601 bits<8> framesize =0;
602 bits<3> aregs =0;
603 bits<5> I8 = 0b01100;
604 bits<3> SVRS = 0b100;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000605 bits<1> s;
Akira Hatanakaf640f042012-07-17 22:55:34 +0000606 bits<1> ra = 0;
607 bits<1> s0 = 0;
608 bits<1> s1 = 0;
Akira Hatanaka21371762012-06-13 02:42:47 +0000609
Akira Hatanakaf640f042012-07-17 22:55:34 +0000610 let s= s_;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000611
612 let Inst{26-24} = xsregs;
613 let Inst{23-20} = framesize{7-4};
614 let Inst{19} = 0;
615 let Inst{18-16} = aregs;
616 let Inst{15-11} = I8;
617 let Inst{10-8} = SVRS;
618 let Inst{7} = s;
619 let Inst{6} = ra;
620 let Inst{5} = s0;
621 let Inst{4} = s1;
622 let Inst{3-0} = framesize{3-0};
Akira Hatanaka21371762012-06-13 02:42:47 +0000623
624
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000625}
626