blob: 4ff68bef957efbdaacbd9aed5fc7085c3459cf8c [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;
Jack Carter59817112013-05-16 20:08:49 +000064
Reed Kotlerec8a5492013-02-14 03:05:25 +000065 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;
Jack Carter59817112013-05-16 20:08:49 +000077
Reed Kotlerec8a5492013-02-14 03:05:25 +000078 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
Reed Kotlerbb870e22013-08-07 04:00:26 +0000151class FRRBreak16<dag outs, dag ins, string asmstr,
152 list<dag> pattern, InstrItinClass itin>:
153 MipsInst16<outs, ins, asmstr, pattern, itin>
154{
155 bits<6> Code;
156 bits<5> funct;
157
158 let Opcode = 0b11101;
159 let funct = 0b00101;
160
161 let Inst{10-5} = Code;
162 let Inst{4-0} = funct;
163}
164
Akira Hatanakaf640f042012-07-17 22:55:34 +0000165//
166// For conversion functions.
167//
168class FRR_SF16<bits<5> _funct, bits<3> _subfunct, dag outs, dag ins,
169 string asmstr, list<dag> pattern, InstrItinClass itin>:
Reed Kotlerec8a5492013-02-14 03:05:25 +0000170 MipsInst16<outs, ins, asmstr, pattern, itin>
Akira Hatanakaf640f042012-07-17 22:55:34 +0000171{
172 bits<3> rx;
173 bits<3> subfunct;
174 bits<5> funct;
175
176 let Opcode = 0b11101; // RR
177 let funct = _funct;
178 let subfunct = _subfunct;
179
180 let Inst{10-8} = rx;
181 let Inst{7-5} = subfunct;
182 let Inst{4-0} = funct;
183}
184
185//
186// just used for breakpoint (hardware and software) instructions.
187//
188class FC16<bits<5> _funct, dag outs, dag ins, string asmstr,
189 list<dag> pattern, InstrItinClass itin>:
Reed Kotlerec8a5492013-02-14 03:05:25 +0000190 MipsInst16<outs, ins, asmstr, pattern, itin>
Akira Hatanakaf640f042012-07-17 22:55:34 +0000191{
192 bits<6> _code; // code is a keyword in tablegen
193 bits<5> funct;
194
195 let Opcode = 0b11101; // RR
196 let funct = _funct;
197
198 let Inst{10-5} = _code;
199 let Inst{4-0} = funct;
200}
Akira Hatanakabff8e312012-05-31 02:59:44 +0000201
202//
203// J(AL)R(C) subformat
204//
Akira Hatanakaf640f042012-07-17 22:55:34 +0000205class FRR16_JALRC<bits<1> _nd, bits<1> _l, bits<1> r_a,
206 dag outs, dag ins, string asmstr,
207 list<dag> pattern, InstrItinClass itin>:
Reed Kotlerec8a5492013-02-14 03:05:25 +0000208 MipsInst16<outs, ins, asmstr, pattern, itin>
Akira Hatanakabff8e312012-05-31 02:59:44 +0000209{
210 bits<3> rx;
211 bits<1> nd;
212 bits<1> l;
213 bits<1> ra;
214
Akira Hatanakaf640f042012-07-17 22:55:34 +0000215 let nd = _nd;
216 let l = _l;
217 let ra = r_a;
218
Akira Hatanakabff8e312012-05-31 02:59:44 +0000219 let Opcode = 0b11101;
220
221 let Inst{10-8} = rx;
222 let Inst{7} = nd;
223 let Inst{6} = l;
224 let Inst{5} = ra;
225 let Inst{4-0} = 0;
226}
227
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000228//===----------------------------------------------------------------------===//
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000229// Format RRI instruction class in Mips : <|opcode|rx|ry|imm5|>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000230//===----------------------------------------------------------------------===//
231
232class FRRI16<bits<5> op, dag outs, dag ins, string asmstr,
233 list<dag> pattern, InstrItinClass itin>:
Reed Kotlerec8a5492013-02-14 03:05:25 +0000234 MipsInst16<outs, ins, asmstr, pattern, itin>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000235{
236 bits<3> rx;
237 bits<3> ry;
238 bits<5> imm5;
239
240 let Opcode = op;
241
242
243 let Inst{10-8} = rx;
244 let Inst{7-5} = ry;
245 let Inst{4-0} = imm5;
246}
247
248//===----------------------------------------------------------------------===//
249// Format RRR instruction class in Mips : <|opcode|rx|ry|rz|f|>
250//===----------------------------------------------------------------------===//
251
Akira Hatanakaf640f042012-07-17 22:55:34 +0000252class FRRR16<bits<2> _f, dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000253 list<dag> pattern, InstrItinClass itin>:
Reed Kotlerec8a5492013-02-14 03:05:25 +0000254 MipsInst16<outs, ins, asmstr, pattern, itin>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000255{
256 bits<3> rx;
257 bits<3> ry;
258 bits<3> rz;
259 bits<2> f;
260
Akira Hatanakaf640f042012-07-17 22:55:34 +0000261 let Opcode = 0b11100;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000262 let f = _f;
263
264 let Inst{10-8} = rx;
265 let Inst{7-5} = ry;
266 let Inst{4-2} = rz;
267 let Inst{1-0} = f;
268}
269
270//===----------------------------------------------------------------------===//
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000271// Format RRI-A instruction class in Mips : <|opcode|rx|ry|f|imm4|>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000272//===----------------------------------------------------------------------===//
273
Akira Hatanakaf640f042012-07-17 22:55:34 +0000274class FRRI_A16<bits<1> _f, dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000275 list<dag> pattern, InstrItinClass itin>:
Reed Kotlerec8a5492013-02-14 03:05:25 +0000276 MipsInst16<outs, ins, asmstr, pattern, itin>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000277{
278 bits<3> rx;
279 bits<3> ry;
280 bits<1> f;
281 bits<4> imm4;
282
Akira Hatanakaf640f042012-07-17 22:55:34 +0000283 let Opcode = 0b01000;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000284 let f = _f;
285
286 let Inst{10-8} = rx;
287 let Inst{7-5} = ry;
288 let Inst{4} = f;
289 let Inst{3-0} = imm4;
290}
291
292//===----------------------------------------------------------------------===//
293// Format Shift instruction class in Mips : <|opcode|rx|ry|sa|f|>
294//===----------------------------------------------------------------------===//
295
Akira Hatanakaf640f042012-07-17 22:55:34 +0000296class FSHIFT16<bits<2> _f, dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000297 list<dag> pattern, InstrItinClass itin>:
Reed Kotlerec8a5492013-02-14 03:05:25 +0000298 MipsInst16<outs, ins, asmstr, pattern, itin>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000299{
300 bits<3> rx;
301 bits<3> ry;
302 bits<3> sa;
303 bits<2> f;
304
Akira Hatanakaf640f042012-07-17 22:55:34 +0000305 let Opcode = 0b00110;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000306 let f = _f;
307
308 let Inst{10-8} = rx;
309 let Inst{7-5} = ry;
310 let Inst{4-2} = sa;
311 let Inst{1-0} = f;
312}
313
314//===----------------------------------------------------------------------===//
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000315// Format i8 instruction class in Mips : <|opcode|funct|imm8>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000316//===----------------------------------------------------------------------===//
317
Akira Hatanakaf640f042012-07-17 22:55:34 +0000318class FI816<bits<3> _func, dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000319 list<dag> pattern, InstrItinClass itin>:
Reed Kotlerec8a5492013-02-14 03:05:25 +0000320 MipsInst16<outs, ins, asmstr, pattern, itin>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000321{
322 bits<3> func;
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000323 bits<8> imm8;
Akira Hatanaka21371762012-06-13 02:42:47 +0000324
Akira Hatanakaf640f042012-07-17 22:55:34 +0000325 let Opcode = 0b01100;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000326 let func = _func;
327
328 let Inst{10-8} = func;
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000329 let Inst{7-0} = imm8;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000330}
331
332//===----------------------------------------------------------------------===//
333// Format i8_MOVR32 instruction class in Mips : <|opcode|func|ry|r32>
334//===----------------------------------------------------------------------===//
335
Akira Hatanakaf640f042012-07-17 22:55:34 +0000336class FI8_MOVR3216<dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000337 list<dag> pattern, InstrItinClass itin>:
Reed Kotlerec8a5492013-02-14 03:05:25 +0000338 MipsInst16<outs, ins, asmstr, pattern, itin>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000339{
340
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000341 bits<4> ry;
342 bits<4> r32;
Akira Hatanaka21371762012-06-13 02:42:47 +0000343
Akira Hatanakaf640f042012-07-17 22:55:34 +0000344 let Opcode = 0b01100;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000345
Akira Hatanakaf640f042012-07-17 22:55:34 +0000346 let Inst{10-8} = 0b111;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000347 let Inst{7-4} = ry;
348 let Inst{3-0} = r32;
Akira Hatanaka21371762012-06-13 02:42:47 +0000349
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000350}
351
352
353
354//===----------------------------------------------------------------------===//
Akira Hatanakaf640f042012-07-17 22:55:34 +0000355// Format i8_MOV32R instruction class in Mips : <|opcode|func|r32|rz>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000356//===----------------------------------------------------------------------===//
357
Akira Hatanakaf640f042012-07-17 22:55:34 +0000358class FI8_MOV32R16<dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000359 list<dag> pattern, InstrItinClass itin>:
Reed Kotlerec8a5492013-02-14 03:05:25 +0000360 MipsInst16<outs, ins, asmstr, pattern, itin>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000361{
362
363 bits<3> func;
364 bits<5> r32;
365 bits<3> rz;
366
Akira Hatanaka21371762012-06-13 02:42:47 +0000367
Akira Hatanakaf640f042012-07-17 22:55:34 +0000368 let Opcode = 0b01100;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000369
Akira Hatanakaf640f042012-07-17 22:55:34 +0000370 let Inst{10-8} = 0b101;
Akira Hatanaka21371762012-06-13 02:42:47 +0000371 let Inst{7-5} = r32{2-0};
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000372 let Inst{4-3} = r32{4-3};
373 let Inst{2-0} = rz;
Akira Hatanaka21371762012-06-13 02:42:47 +0000374
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000375}
376
377//===----------------------------------------------------------------------===//
Akira Hatanaka21371762012-06-13 02:42:47 +0000378// Format i8_SVRS instruction class in Mips :
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000379// <|opcode|svrs|s|ra|s0|s1|framesize>
380//===----------------------------------------------------------------------===//
381
Akira Hatanakaf640f042012-07-17 22:55:34 +0000382class FI8_SVRS16<bits<1> _s, dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000383 list<dag> pattern, InstrItinClass itin>:
Reed Kotlerec8a5492013-02-14 03:05:25 +0000384 MipsInst16<outs, ins, asmstr, pattern, itin>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000385{
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000386 bits<1> s;
Akira Hatanakaf640f042012-07-17 22:55:34 +0000387 bits<1> ra = 0;
388 bits<1> s0 = 0;
389 bits<1> s1 = 0;
390 bits<4> framesize = 0;
Akira Hatanaka21371762012-06-13 02:42:47 +0000391
Akira Hatanakaf640f042012-07-17 22:55:34 +0000392 let s =_s;
393 let Opcode = 0b01100;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000394
Akira Hatanakaf640f042012-07-17 22:55:34 +0000395 let Inst{10-8} = 0b100;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000396 let Inst{7} = s;
397 let Inst{6} = ra;
398 let Inst{5} = s0;
399 let Inst{4} = s1;
400 let Inst{3-0} = framesize;
Akira Hatanaka21371762012-06-13 02:42:47 +0000401
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000402}
403
404//===----------------------------------------------------------------------===//
Akira Hatanaka21371762012-06-13 02:42:47 +0000405// Format JAL instruction class in Mips16 :
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000406// <|opcode|svrs|s|ra|s0|s1|framesize>
407//===----------------------------------------------------------------------===//
408
Akira Hatanakaf640f042012-07-17 22:55:34 +0000409class FJAL16<bits<1> _X, dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000410 list<dag> pattern, InstrItinClass itin>:
Reed Kotlerec8a5492013-02-14 03:05:25 +0000411 MipsInst16_32<outs, ins, asmstr, pattern, itin>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000412{
413 bits<1> X;
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000414 bits<26> imm26;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000415
Akira Hatanaka21371762012-06-13 02:42:47 +0000416
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000417 let X = _X;
418
Akira Hatanakabff8e312012-05-31 02:59:44 +0000419 let Inst{31-27} = 0b00011;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000420 let Inst{26} = X;
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000421 let Inst{25-21} = imm26{20-16};
422 let Inst{20-16} = imm26{25-21};
423 let Inst{15-0} = imm26{15-0};
Akira Hatanaka21371762012-06-13 02:42:47 +0000424
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000425}
426
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000427//===----------------------------------------------------------------------===//
Akira Hatanaka21371762012-06-13 02:42:47 +0000428// Format EXT-I instruction class in Mips16 :
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000429// <|EXTEND|imm10:5|imm15:11|op|0|0|0|0|0|0|imm4:0>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000430//===----------------------------------------------------------------------===//
431
Akira Hatanakabff8e312012-05-31 02:59:44 +0000432class FEXT_I16<bits<5> _eop, dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000433 list<dag> pattern, InstrItinClass itin>:
Reed Kotlerec8a5492013-02-14 03:05:25 +0000434 MipsInst16_EXTEND<outs, ins, asmstr, pattern, itin>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000435{
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000436 bits<16> imm16;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000437 bits<5> eop;
Akira Hatanaka21371762012-06-13 02:42:47 +0000438
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000439 let eop = _eop;
440
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000441 let Inst{26-21} = imm16{10-5};
442 let Inst{20-16} = imm16{15-11};
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000443 let Inst{15-11} = eop;
444 let Inst{10-5} = 0;
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000445 let Inst{4-0} = imm16{4-0};
Akira Hatanaka21371762012-06-13 02:42:47 +0000446
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000447}
448
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000449//===----------------------------------------------------------------------===//
Akira Hatanaka21371762012-06-13 02:42:47 +0000450// Format ASMACRO instruction class in Mips16 :
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000451// <EXTEND|select|p4|p3|RRR|p2|p1|p0>
452//===----------------------------------------------------------------------===//
453
Akira Hatanakaf640f042012-07-17 22:55:34 +0000454class FASMACRO16<dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000455 list<dag> pattern, InstrItinClass itin>:
Reed Kotlerec8a5492013-02-14 03:05:25 +0000456 MipsInst16_EXTEND<outs, ins, asmstr, pattern, itin>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000457{
458 bits<3> select;
459 bits<3> p4;
460 bits<5> p3;
Akira Hatanakaf640f042012-07-17 22:55:34 +0000461 bits<5> RRR = 0b11100;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000462 bits<3> p2;
463 bits<3> p1;
464 bits<5> p0;
Akira Hatanaka21371762012-06-13 02:42:47 +0000465
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000466
467 let Inst{26-24} = select;
468 let Inst{23-21} = p4;
469 let Inst{20-16} = p3;
470 let Inst{15-11} = RRR;
471 let Inst{10-8} = p2;
472 let Inst{7-5} = p1;
Akira Hatanaka21371762012-06-13 02:42:47 +0000473 let Inst{4-0} = p0;
474
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000475}
476
477
478//===----------------------------------------------------------------------===//
Akira Hatanaka21371762012-06-13 02:42:47 +0000479// Format EXT-RI instruction class in Mips16 :
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000480// <|EXTEND|imm10:5|imm15:11|op|rx|0|0|0|imm4:0>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000481//===----------------------------------------------------------------------===//
482
Akira Hatanakabff8e312012-05-31 02:59:44 +0000483class FEXT_RI16<bits<5> _op, dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000484 list<dag> pattern, InstrItinClass itin>:
Reed Kotlerec8a5492013-02-14 03:05:25 +0000485 MipsInst16_EXTEND<outs, ins, asmstr, pattern, itin>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000486{
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000487 bits<16> imm16;
Akira Hatanakabff8e312012-05-31 02:59:44 +0000488 bits<5> op;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000489 bits<3> rx;
Akira Hatanaka21371762012-06-13 02:42:47 +0000490
Akira Hatanakabff8e312012-05-31 02:59:44 +0000491 let op = _op;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000492
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000493 let Inst{26-21} = imm16{10-5};
494 let Inst{20-16} = imm16{15-11};
Akira Hatanakabff8e312012-05-31 02:59:44 +0000495 let Inst{15-11} = op;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000496 let Inst{10-8} = rx;
497 let Inst{7-5} = 0;
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000498 let Inst{4-0} = imm16{4-0};
Akira Hatanaka21371762012-06-13 02:42:47 +0000499
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000500}
501
502//===----------------------------------------------------------------------===//
503// Format EXT-RRI instruction class in Mips16 :
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000504// <|EXTEND|imm10:5|imm15:11|op|rx|ry|imm4:0>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000505//===----------------------------------------------------------------------===//
506
Akira Hatanakabff8e312012-05-31 02:59:44 +0000507class FEXT_RRI16<bits<5> _op, dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000508 list<dag> pattern, InstrItinClass itin>:
Reed Kotlerec8a5492013-02-14 03:05:25 +0000509 MipsInst16_EXTEND<outs, ins, asmstr, pattern, itin>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000510{
Akira Hatanaka26e9ecb2012-07-23 23:45:54 +0000511 bits<5> op;
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000512 bits<16> imm16;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000513 bits<3> rx;
514 bits<3> ry;
Akira Hatanakabff8e312012-05-31 02:59:44 +0000515
Akira Hatanaka26e9ecb2012-07-23 23:45:54 +0000516 let op=_op;
Akira Hatanakab49c68a62012-07-21 02:20:33 +0000517
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000518 let Inst{26-21} = imm16{10-5};
519 let Inst{20-16} = imm16{15-11};
Akira Hatanaka26e9ecb2012-07-23 23:45:54 +0000520 let Inst{15-11} = op;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000521 let Inst{10-8} = rx;
522 let Inst{7-5} = ry;
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000523 let Inst{4-0} = imm16{4-0};
Akira Hatanaka21371762012-06-13 02:42:47 +0000524
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000525}
526
527//===----------------------------------------------------------------------===//
Akira Hatanaka21371762012-06-13 02:42:47 +0000528// Format EXT-RRI-A instruction class in Mips16 :
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000529// <|EXTEND|imm10:4|imm14:11|RRI-A|rx|ry|f|imm3:0>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000530//===----------------------------------------------------------------------===//
531
Akira Hatanakabff8e312012-05-31 02:59:44 +0000532class FEXT_RRI_A16<bits<1> _f, dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000533 list<dag> pattern, InstrItinClass itin>:
Reed Kotlerec8a5492013-02-14 03:05:25 +0000534 MipsInst16_EXTEND<outs, ins, asmstr, pattern, itin>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000535{
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000536 bits<15> imm15;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000537 bits<3> rx;
538 bits<3> ry;
539 bits<1> f;
Akira Hatanaka21371762012-06-13 02:42:47 +0000540
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000541 let f = _f;
542
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000543 let Inst{26-20} = imm15{10-4};
544 let Inst{19-16} = imm15{14-11};
Akira Hatanakabff8e312012-05-31 02:59:44 +0000545 let Inst{15-11} = 0b01000;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000546 let Inst{10-8} = rx;
547 let Inst{7-5} = ry;
548 let Inst{4} = f;
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000549 let Inst{3-0} = imm15{3-0};
Akira Hatanaka21371762012-06-13 02:42:47 +0000550
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000551}
552
553//===----------------------------------------------------------------------===//
Akira Hatanaka21371762012-06-13 02:42:47 +0000554// Format EXT-SHIFT instruction class in Mips16 :
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000555// <|EXTEND|sa 4:0|s5|0|SHIFT|rx|ry|0|f>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000556//===----------------------------------------------------------------------===//
557
Akira Hatanakaf640f042012-07-17 22:55:34 +0000558class FEXT_SHIFT16<bits<2> _f, dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000559 list<dag> pattern, InstrItinClass itin>:
Reed Kotlerec8a5492013-02-14 03:05:25 +0000560 MipsInst16_EXTEND<outs, ins, asmstr, pattern, itin>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000561{
562 bits<6> sa6;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000563 bits<3> rx;
564 bits<3> ry;
565 bits<2> f;
Akira Hatanaka21371762012-06-13 02:42:47 +0000566
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000567 let f = _f;
568
569 let Inst{26-22} = sa6{4-0};
570 let Inst{21} = sa6{5};
571 let Inst{20-16} = 0;
Akira Hatanakabff8e312012-05-31 02:59:44 +0000572 let Inst{15-11} = 0b00110;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000573 let Inst{10-8} = rx;
574 let Inst{7-5} = ry;
575 let Inst{4-2} = 0;
Akira Hatanaka21371762012-06-13 02:42:47 +0000576 let Inst{1-0} = f;
577
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000578}
579
580//===----------------------------------------------------------------------===//
Akira Hatanaka21371762012-06-13 02:42:47 +0000581// Format EXT-I8 instruction class in Mips16 :
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000582// <|EXTEND|imm10:5|imm15:11|I8|funct|0|imm4:0>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000583//===----------------------------------------------------------------------===//
584
Akira Hatanakabff8e312012-05-31 02:59:44 +0000585class FEXT_I816<bits<3> _funct, dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000586 list<dag> pattern, InstrItinClass itin>:
Reed Kotlerec8a5492013-02-14 03:05:25 +0000587 MipsInst16_EXTEND<outs, ins, asmstr, pattern, itin>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000588{
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000589 bits<16> imm16;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000590 bits<5> I8;
591 bits<3> funct;
Akira Hatanaka21371762012-06-13 02:42:47 +0000592
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000593 let funct = _funct;
Pete Cooperc18261d2014-08-07 05:46:54 +0000594 let I8 = 0b00110;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000595
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000596 let Inst{26-21} = imm16{10-5};
597 let Inst{20-16} = imm16{15-11};
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000598 let Inst{15-11} = I8;
599 let Inst{10-8} = funct;
600 let Inst{7-5} = 0;
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000601 let Inst{4-0} = imm16{4-0};
Akira Hatanaka21371762012-06-13 02:42:47 +0000602
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000603}
604
605//===----------------------------------------------------------------------===//
Akira Hatanaka21371762012-06-13 02:42:47 +0000606// Format EXT-I8_SVRS instruction class in Mips16 :
Akira Hatanaka3fe00f22012-06-13 02:37:54 +0000607// <|EXTEND|xsregs|framesize7:4|aregs|I8|SVRS|s|ra|s0|s1|framesize3:0>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000608//===----------------------------------------------------------------------===//
609
Akira Hatanakaf640f042012-07-17 22:55:34 +0000610class FEXT_I8_SVRS16<bits<1> s_, dag outs, dag ins, string asmstr,
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000611 list<dag> pattern, InstrItinClass itin>:
Reed Kotlerec8a5492013-02-14 03:05:25 +0000612 MipsInst16_EXTEND<outs, ins, asmstr, pattern, itin>
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000613{
Akira Hatanakaf640f042012-07-17 22:55:34 +0000614 bits<3> xsregs =0;
615 bits<8> framesize =0;
616 bits<3> aregs =0;
617 bits<5> I8 = 0b01100;
618 bits<3> SVRS = 0b100;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000619 bits<1> s;
Akira Hatanakaf640f042012-07-17 22:55:34 +0000620 bits<1> ra = 0;
621 bits<1> s0 = 0;
622 bits<1> s1 = 0;
Akira Hatanaka21371762012-06-13 02:42:47 +0000623
Akira Hatanakaf640f042012-07-17 22:55:34 +0000624 let s= s_;
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000625
626 let Inst{26-24} = xsregs;
627 let Inst{23-20} = framesize{7-4};
628 let Inst{19} = 0;
629 let Inst{18-16} = aregs;
630 let Inst{15-11} = I8;
631 let Inst{10-8} = SVRS;
632 let Inst{7} = s;
633 let Inst{6} = ra;
634 let Inst{5} = s0;
635 let Inst{4} = s1;
636 let Inst{3-0} = framesize{3-0};
Akira Hatanaka21371762012-06-13 02:42:47 +0000637
638
Akira Hatanakac515bfb2012-05-08 19:08:58 +0000639}
640