blob: 6332e1d52c417c1b3fd7302d6dbcc458d44d89a2 [file] [log] [blame]
Akira Hatanaka71928e62012-04-17 18:03:21 +00001//===- MipsDisassembler.cpp - Disassembler for Mips -------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file is part of the Mips Disassembler.
11//
12//===----------------------------------------------------------------------===//
13
14#include "Mips.h"
Akira Hatanaka9bf2b562012-07-09 18:46:47 +000015#include "MipsRegisterInfo.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000016#include "MipsSubtarget.h"
Lang Hamesa1bc0f52014-04-15 04:40:56 +000017#include "llvm/MC/MCContext.h"
Akira Hatanaka71928e62012-04-17 18:03:21 +000018#include "llvm/MC/MCDisassembler.h"
Jim Grosbachecaef492012-08-14 19:06:05 +000019#include "llvm/MC/MCFixedLenDisassembler.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000020#include "llvm/MC/MCInst.h"
21#include "llvm/MC/MCSubtargetInfo.h"
22#include "llvm/Support/MathExtras.h"
Akira Hatanaka71928e62012-04-17 18:03:21 +000023#include "llvm/Support/TargetRegistry.h"
Akira Hatanaka71928e62012-04-17 18:03:21 +000024
Akira Hatanaka71928e62012-04-17 18:03:21 +000025using namespace llvm;
26
Chandler Carruthe96dd892014-04-21 22:55:11 +000027#define DEBUG_TYPE "mips-disassembler"
28
Akira Hatanaka71928e62012-04-17 18:03:21 +000029typedef MCDisassembler::DecodeStatus DecodeStatus;
30
Benjamin Kramercb3e98c2012-05-01 14:34:24 +000031namespace {
32
Daniel Sandersa19216c2015-02-11 11:28:56 +000033class MipsDisassembler : public MCDisassembler {
Vladimir Medicdde3d582013-09-06 12:30:36 +000034 bool IsMicroMips;
Daniel Sandersa19216c2015-02-11 11:28:56 +000035 bool IsBigEndian;
Akira Hatanaka9bf2b562012-07-09 18:46:47 +000036public:
Daniel Sandersa19216c2015-02-11 11:28:56 +000037 MipsDisassembler(const MCSubtargetInfo &STI, MCContext &Ctx, bool IsBigEndian)
38 : MCDisassembler(STI, Ctx),
Michael Kupersteindb0712f2015-05-26 10:47:10 +000039 IsMicroMips(STI.getFeatureBits()[Mips::FeatureMicroMips]),
Daniel Sandersa19216c2015-02-11 11:28:56 +000040 IsBigEndian(IsBigEndian) {}
Akira Hatanaka9bf2b562012-07-09 18:46:47 +000041
Michael Kupersteindb0712f2015-05-26 10:47:10 +000042 bool hasMips3() const { return STI.getFeatureBits()[Mips::FeatureMips3]; }
43 bool hasMips32() const { return STI.getFeatureBits()[Mips::FeatureMips32]; }
Daniel Sandersc171f652014-06-13 13:15:59 +000044 bool hasMips32r6() const {
Michael Kupersteindb0712f2015-05-26 10:47:10 +000045 return STI.getFeatureBits()[Mips::FeatureMips32r6];
Daniel Sanders5c582b22014-05-22 11:23:21 +000046 }
47
Michael Kupersteindb0712f2015-05-26 10:47:10 +000048 bool isGP64() const { return STI.getFeatureBits()[Mips::FeatureGP64Bit]; }
Daniel Sanders0fa60412014-06-12 13:39:06 +000049
Kai Nacke3adf9b82015-05-28 16:23:16 +000050 bool hasCnMips() const { return STI.getFeatureBits()[Mips::FeatureCnMips]; }
51
Daniel Sandersc171f652014-06-13 13:15:59 +000052 bool hasCOP3() const {
53 // Only present in MIPS-I and MIPS-II
54 return !hasMips32() && !hasMips3();
55 }
56
Rafael Espindola4aa6bea2014-11-10 18:11:10 +000057 DecodeStatus getInstruction(MCInst &Instr, uint64_t &Size,
Rafael Espindola7fc5b872014-11-12 02:04:27 +000058 ArrayRef<uint8_t> Bytes, uint64_t Address,
Rafael Espindola4aa6bea2014-11-10 18:11:10 +000059 raw_ostream &VStream,
60 raw_ostream &CStream) const override;
Akira Hatanaka9bf2b562012-07-09 18:46:47 +000061};
62
Benjamin Kramercb3e98c2012-05-01 14:34:24 +000063} // end anonymous namespace
64
Akira Hatanaka71928e62012-04-17 18:03:21 +000065// Forward declare these because the autogenerated code will reference them.
66// Definitions are further down.
Akira Hatanaka13e6ccf2013-08-06 23:08:38 +000067static DecodeStatus DecodeGPR64RegisterClass(MCInst &Inst,
68 unsigned RegNo,
69 uint64_t Address,
70 const void *Decoder);
Akira Hatanaka71928e62012-04-17 18:03:21 +000071
Reed Kotlerec8a5492013-02-14 03:05:25 +000072static DecodeStatus DecodeCPU16RegsRegisterClass(MCInst &Inst,
73 unsigned RegNo,
74 uint64_t Address,
75 const void *Decoder);
76
Zoran Jovanovicb0852e52014-10-21 08:23:11 +000077static DecodeStatus DecodeGPRMM16RegisterClass(MCInst &Inst,
78 unsigned RegNo,
79 uint64_t Address,
80 const void *Decoder);
81
Jozef Kolek1904fa22014-11-24 14:25:53 +000082static DecodeStatus DecodeGPRMM16ZeroRegisterClass(MCInst &Inst,
83 unsigned RegNo,
84 uint64_t Address,
85 const void *Decoder);
86
Zoran Jovanovic41688672015-02-10 16:36:20 +000087static DecodeStatus DecodeGPRMM16MovePRegisterClass(MCInst &Inst,
88 unsigned RegNo,
89 uint64_t Address,
90 const void *Decoder);
91
Akira Hatanaka13e6ccf2013-08-06 23:08:38 +000092static DecodeStatus DecodeGPR32RegisterClass(MCInst &Inst,
93 unsigned RegNo,
94 uint64_t Address,
95 const void *Decoder);
Akira Hatanaka71928e62012-04-17 18:03:21 +000096
Akira Hatanaka9bfa2e22013-08-28 00:55:15 +000097static DecodeStatus DecodePtrRegisterClass(MCInst &Inst,
98 unsigned Insn,
99 uint64_t Address,
100 const void *Decoder);
101
Akira Hatanaka654655f2013-08-14 00:53:38 +0000102static DecodeStatus DecodeDSPRRegisterClass(MCInst &Inst,
103 unsigned RegNo,
104 uint64_t Address,
105 const void *Decoder);
Akira Hatanakaecabd1a2012-09-27 02:01:10 +0000106
Akira Hatanaka71928e62012-04-17 18:03:21 +0000107static DecodeStatus DecodeFGR64RegisterClass(MCInst &Inst,
108 unsigned RegNo,
109 uint64_t Address,
110 const void *Decoder);
111
112static DecodeStatus DecodeFGR32RegisterClass(MCInst &Inst,
113 unsigned RegNo,
114 uint64_t Address,
115 const void *Decoder);
116
117static DecodeStatus DecodeCCRRegisterClass(MCInst &Inst,
118 unsigned RegNo,
119 uint64_t Address,
120 const void *Decoder);
121
Akira Hatanaka1fb1b8b2013-07-26 20:13:47 +0000122static DecodeStatus DecodeFCCRegisterClass(MCInst &Inst,
123 unsigned RegNo,
124 uint64_t Address,
125 const void *Decoder);
126
Daniel Sanders0fa60412014-06-12 13:39:06 +0000127static DecodeStatus DecodeFGRCCRegisterClass(MCInst &Inst, unsigned RegNo,
128 uint64_t Address,
129 const void *Decoder);
130
Akira Hatanaka71928e62012-04-17 18:03:21 +0000131static DecodeStatus DecodeHWRegsRegisterClass(MCInst &Inst,
132 unsigned Insn,
133 uint64_t Address,
134 const void *Decoder);
135
136static DecodeStatus DecodeAFGR64RegisterClass(MCInst &Inst,
137 unsigned RegNo,
138 uint64_t Address,
139 const void *Decoder);
140
Akira Hatanaka00fcf2e2013-08-08 21:54:26 +0000141static DecodeStatus DecodeACC64DSPRegisterClass(MCInst &Inst,
142 unsigned RegNo,
143 uint64_t Address,
144 const void *Decoder);
Akira Hatanakaecabd1a2012-09-27 02:01:10 +0000145
Akira Hatanaka8002a3f2013-08-14 00:47:08 +0000146static DecodeStatus DecodeHI32DSPRegisterClass(MCInst &Inst,
147 unsigned RegNo,
148 uint64_t Address,
149 const void *Decoder);
Akira Hatanaka59bfaf72013-04-18 00:52:44 +0000150
Akira Hatanaka8002a3f2013-08-14 00:47:08 +0000151static DecodeStatus DecodeLO32DSPRegisterClass(MCInst &Inst,
152 unsigned RegNo,
153 uint64_t Address,
154 const void *Decoder);
Akira Hatanaka59bfaf72013-04-18 00:52:44 +0000155
Jack Carter3eb663b2013-09-26 00:09:46 +0000156static DecodeStatus DecodeMSA128BRegisterClass(MCInst &Inst,
157 unsigned RegNo,
158 uint64_t Address,
159 const void *Decoder);
160
Jack Carter5dc8ac92013-09-25 23:50:44 +0000161static DecodeStatus DecodeMSA128HRegisterClass(MCInst &Inst,
162 unsigned RegNo,
163 uint64_t Address,
164 const void *Decoder);
165
166static DecodeStatus DecodeMSA128WRegisterClass(MCInst &Inst,
167 unsigned RegNo,
168 uint64_t Address,
169 const void *Decoder);
170
171static DecodeStatus DecodeMSA128DRegisterClass(MCInst &Inst,
172 unsigned RegNo,
173 uint64_t Address,
174 const void *Decoder);
175
Matheus Almeidaa591fdc2013-10-21 12:26:50 +0000176static DecodeStatus DecodeMSACtrlRegisterClass(MCInst &Inst,
177 unsigned RegNo,
178 uint64_t Address,
179 const void *Decoder);
180
Daniel Sandersa3134fa2015-06-27 15:39:19 +0000181static DecodeStatus DecodeCOP0RegisterClass(MCInst &Inst,
182 unsigned RegNo,
183 uint64_t Address,
184 const void *Decoder);
185
Daniel Sanders2a83d682014-05-21 12:56:39 +0000186static DecodeStatus DecodeCOP2RegisterClass(MCInst &Inst,
187 unsigned RegNo,
188 uint64_t Address,
189 const void *Decoder);
190
Akira Hatanaka71928e62012-04-17 18:03:21 +0000191static DecodeStatus DecodeBranchTarget(MCInst &Inst,
192 unsigned Offset,
193 uint64_t Address,
194 const void *Decoder);
195
Akira Hatanaka71928e62012-04-17 18:03:21 +0000196static DecodeStatus DecodeJumpTarget(MCInst &Inst,
197 unsigned Insn,
198 uint64_t Address,
199 const void *Decoder);
200
Zoran Jovanovic3c8869d2014-05-16 11:03:45 +0000201static DecodeStatus DecodeBranchTarget21(MCInst &Inst,
202 unsigned Offset,
203 uint64_t Address,
204 const void *Decoder);
205
206static DecodeStatus DecodeBranchTarget26(MCInst &Inst,
207 unsigned Offset,
208 uint64_t Address,
209 const void *Decoder);
210
Jozef Kolek9761e962015-01-12 12:03:34 +0000211// DecodeBranchTarget7MM - Decode microMIPS branch offset, which is
212// shifted left by 1 bit.
213static DecodeStatus DecodeBranchTarget7MM(MCInst &Inst,
214 unsigned Offset,
215 uint64_t Address,
216 const void *Decoder);
217
Jozef Kolek5cfebdd2015-01-21 12:39:30 +0000218// DecodeBranchTarget10MM - Decode microMIPS branch offset, which is
219// shifted left by 1 bit.
220static DecodeStatus DecodeBranchTarget10MM(MCInst &Inst,
221 unsigned Offset,
222 uint64_t Address,
223 const void *Decoder);
224
Zoran Jovanovic8a80aa72013-11-04 14:53:22 +0000225// DecodeBranchTargetMM - Decode microMIPS branch offset, which is
226// shifted left by 1 bit.
227static DecodeStatus DecodeBranchTargetMM(MCInst &Inst,
228 unsigned Offset,
229 uint64_t Address,
230 const void *Decoder);
231
Zoran Jovanovic507e0842013-10-29 16:38:59 +0000232// DecodeJumpTargetMM - Decode microMIPS jump target, which is
233// shifted left by 1 bit.
234static DecodeStatus DecodeJumpTargetMM(MCInst &Inst,
235 unsigned Insn,
236 uint64_t Address,
237 const void *Decoder);
238
Akira Hatanaka71928e62012-04-17 18:03:21 +0000239static DecodeStatus DecodeMem(MCInst &Inst,
240 unsigned Insn,
241 uint64_t Address,
242 const void *Decoder);
243
Daniel Sanderse4e83a72015-09-15 10:02:16 +0000244static DecodeStatus DecodeMemEVA(MCInst &Inst,
245 unsigned Insn,
246 uint64_t Address,
247 const void *Decoder);
248
Hrvoje Varga3c88fbd2015-10-16 12:24:58 +0000249static DecodeStatus DecodeLoadByte9(MCInst &Inst,
250 unsigned Insn,
251 uint64_t Address,
252 const void *Decoder);
253
254static DecodeStatus DecodeLoadByte15(MCInst &Inst,
255 unsigned Insn,
256 uint64_t Address,
257 const void *Decoder);
258
Daniel Sanders92db6b72014-10-01 08:26:55 +0000259static DecodeStatus DecodeCacheOp(MCInst &Inst,
260 unsigned Insn,
261 uint64_t Address,
262 const void *Decoder);
263
Daniel Sanderse4e83a72015-09-15 10:02:16 +0000264static DecodeStatus DecodeCacheeOp_CacheOpR6(MCInst &Inst,
265 unsigned Insn,
266 uint64_t Address,
267 const void *Decoder);
Vladimir Medicdf464ae2015-01-29 11:33:41 +0000268
Jozef Kolekab6d1cc2014-12-23 19:55:34 +0000269static DecodeStatus DecodeCacheOpMM(MCInst &Inst,
270 unsigned Insn,
271 uint64_t Address,
272 const void *Decoder);
273
Zoran Jovanovic9eaa30d2015-09-08 10:18:38 +0000274static DecodeStatus DecodeStoreEvaOpMM(MCInst &Inst,
275 unsigned Insn,
276 uint64_t Address,
277 const void *Decoder);
278
Zoran Jovanovicd9790792015-09-09 09:10:46 +0000279static DecodeStatus DecodePrefeOpMM(MCInst &Inst,
280 unsigned Insn,
281 uint64_t Address,
282 const void *Decoder);
283
Daniel Sandersb4484d62014-11-27 17:28:10 +0000284static DecodeStatus DecodeSyncI(MCInst &Inst,
285 unsigned Insn,
286 uint64_t Address,
287 const void *Decoder);
288
Hrvoje Varga18148672015-10-28 11:04:29 +0000289static DecodeStatus DecodeSynciR6(MCInst &Inst,
290 unsigned Insn,
291 uint64_t Address,
292 const void *Decoder);
293
Matheus Almeidafe0bf9f2013-10-21 13:07:13 +0000294static DecodeStatus DecodeMSA128Mem(MCInst &Inst, unsigned Insn,
295 uint64_t Address, const void *Decoder);
296
Jozef Kolek315e7ec2014-11-26 18:56:38 +0000297static DecodeStatus DecodeMemMMImm4(MCInst &Inst,
298 unsigned Insn,
299 uint64_t Address,
300 const void *Decoder);
301
Jozef Kolek12c69822014-12-23 16:16:33 +0000302static DecodeStatus DecodeMemMMSPImm5Lsl2(MCInst &Inst,
303 unsigned Insn,
304 uint64_t Address,
305 const void *Decoder);
306
Jozef Koleke10a02e2015-01-28 17:27:26 +0000307static DecodeStatus DecodeMemMMGPImm7Lsl2(MCInst &Inst,
308 unsigned Insn,
309 uint64_t Address,
310 const void *Decoder);
311
Jozef Kolekd68d424a2015-02-10 12:41:13 +0000312static DecodeStatus DecodeMemMMReglistImm4Lsl2(MCInst &Inst,
313 unsigned Insn,
314 uint64_t Address,
315 const void *Decoder);
316
Zoran Jovanovica6593ff2015-08-18 12:53:08 +0000317static DecodeStatus DecodeMemMMImm9(MCInst &Inst,
318 unsigned Insn,
319 uint64_t Address,
320 const void *Decoder);
321
Vladimir Medicdde3d582013-09-06 12:30:36 +0000322static DecodeStatus DecodeMemMMImm12(MCInst &Inst,
323 unsigned Insn,
324 uint64_t Address,
325 const void *Decoder);
326
327static DecodeStatus DecodeMemMMImm16(MCInst &Inst,
328 unsigned Insn,
329 uint64_t Address,
330 const void *Decoder);
331
Akira Hatanaka71928e62012-04-17 18:03:21 +0000332static DecodeStatus DecodeFMem(MCInst &Inst, unsigned Insn,
333 uint64_t Address,
334 const void *Decoder);
335
Daniel Sanders92db6b72014-10-01 08:26:55 +0000336static DecodeStatus DecodeFMem2(MCInst &Inst, unsigned Insn,
337 uint64_t Address,
338 const void *Decoder);
339
340static DecodeStatus DecodeFMem3(MCInst &Inst, unsigned Insn,
341 uint64_t Address,
342 const void *Decoder);
343
Vladimir Medic435cf8a2015-01-21 10:47:36 +0000344static DecodeStatus DecodeFMemCop2R6(MCInst &Inst, unsigned Insn,
345 uint64_t Address,
346 const void *Decoder);
347
Daniel Sanders6a803f62014-06-16 13:13:03 +0000348static DecodeStatus DecodeSpecial3LlSc(MCInst &Inst,
349 unsigned Insn,
350 uint64_t Address,
351 const void *Decoder);
352
Jozef Kolekaa2b9272014-11-27 14:41:44 +0000353static DecodeStatus DecodeAddiur2Simm7(MCInst &Inst,
354 unsigned Value,
355 uint64_t Address,
356 const void *Decoder);
357
358static DecodeStatus DecodeUImm6Lsl2(MCInst &Inst,
359 unsigned Value,
360 uint64_t Address,
361 const void *Decoder);
362
363static DecodeStatus DecodeLiSimm7(MCInst &Inst,
364 unsigned Value,
365 uint64_t Address,
366 const void *Decoder);
367
Zoran Jovanovic6b28f092015-09-09 13:55:45 +0000368static DecodeStatus DecodePOOL16BEncodedField(MCInst &Inst,
369 unsigned Value,
370 uint64_t Address,
371 const void *Decoder);
372
Jozef Kolekaa2b9272014-11-27 14:41:44 +0000373static DecodeStatus DecodeSimm4(MCInst &Inst,
374 unsigned Value,
375 uint64_t Address,
376 const void *Decoder);
377
Akira Hatanaka71928e62012-04-17 18:03:21 +0000378static DecodeStatus DecodeSimm16(MCInst &Inst,
379 unsigned Insn,
380 uint64_t Address,
381 const void *Decoder);
382
Daniel Sandersea4f6532015-11-06 12:22:31 +0000383template <unsigned Bits, int Offset>
384static DecodeStatus DecodeUImmWithOffset(MCInst &Inst, unsigned Value,
385 uint64_t Address, const void *Decoder);
Matheus Almeida779c5932013-11-18 12:32:49 +0000386
Akira Hatanaka71928e62012-04-17 18:03:21 +0000387static DecodeStatus DecodeInsSize(MCInst &Inst,
388 unsigned Insn,
389 uint64_t Address,
390 const void *Decoder);
391
392static DecodeStatus DecodeExtSize(MCInst &Inst,
393 unsigned Insn,
394 uint64_t Address,
395 const void *Decoder);
396
Daniel Sandersb59e1a42014-05-15 10:45:58 +0000397static DecodeStatus DecodeSimm19Lsl2(MCInst &Inst, unsigned Insn,
398 uint64_t Address, const void *Decoder);
399
Zoran Jovanovic28551422014-06-09 09:49:51 +0000400static DecodeStatus DecodeSimm18Lsl3(MCInst &Inst, unsigned Insn,
401 uint64_t Address, const void *Decoder);
402
Vladimir Medicb682ddf2014-12-01 11:12:04 +0000403static DecodeStatus DecodeSimm9SP(MCInst &Inst, unsigned Insn,
404 uint64_t Address, const void *Decoder);
405
406static DecodeStatus DecodeANDI16Imm(MCInst &Inst, unsigned Insn,
407 uint64_t Address, const void *Decoder);
408
409static DecodeStatus DecodeUImm5lsl2(MCInst &Inst, unsigned Insn,
410 uint64_t Address, const void *Decoder);
411
Jozef Kolek2c6d7322015-01-21 12:10:11 +0000412static DecodeStatus DecodeSimm23Lsl2(MCInst &Inst, unsigned Insn,
413 uint64_t Address, const void *Decoder);
414
Daniel Sandersb50ccf82014-04-01 10:35:28 +0000415/// INSVE_[BHWD] have an implicit operand that the generated decoder doesn't
416/// handle.
417template <typename InsnType>
418static DecodeStatus DecodeINSVE_DF(MCInst &MI, InsnType insn, uint64_t Address,
419 const void *Decoder);
Daniel Sanders5c582b22014-05-22 11:23:21 +0000420
421template <typename InsnType>
422static DecodeStatus
423DecodeAddiGroupBranch(MCInst &MI, InsnType insn, uint64_t Address,
424 const void *Decoder);
425
426template <typename InsnType>
427static DecodeStatus
428DecodeDaddiGroupBranch(MCInst &MI, InsnType insn, uint64_t Address,
429 const void *Decoder);
430
431template <typename InsnType>
432static DecodeStatus
433DecodeBlezlGroupBranch(MCInst &MI, InsnType insn, uint64_t Address,
434 const void *Decoder);
435
436template <typename InsnType>
437static DecodeStatus
438DecodeBgtzlGroupBranch(MCInst &MI, InsnType insn, uint64_t Address,
439 const void *Decoder);
440
441template <typename InsnType>
442static DecodeStatus
443DecodeBgtzGroupBranch(MCInst &MI, InsnType insn, uint64_t Address,
444 const void *Decoder);
445
Zoran Jovanovic28a0ca02014-06-12 11:47:44 +0000446template <typename InsnType>
447static DecodeStatus
448DecodeBlezGroupBranch(MCInst &MI, InsnType insn, uint64_t Address,
449 const void *Decoder);
450
Zoran Jovanovica4c4b5f2014-11-19 16:44:02 +0000451static DecodeStatus DecodeRegListOperand(MCInst &Inst, unsigned Insn,
452 uint64_t Address,
453 const void *Decoder);
454
Zoran Jovanovicf9a02502014-11-27 18:28:59 +0000455static DecodeStatus DecodeRegListOperand16(MCInst &Inst, unsigned Insn,
456 uint64_t Address,
457 const void *Decoder);
458
Zoran Jovanovic41688672015-02-10 16:36:20 +0000459static DecodeStatus DecodeMovePRegPair(MCInst &Inst, unsigned Insn,
460 uint64_t Address,
461 const void *Decoder);
462
Akira Hatanaka71928e62012-04-17 18:03:21 +0000463namespace llvm {
464extern Target TheMipselTarget, TheMipsTarget, TheMips64Target,
465 TheMips64elTarget;
466}
467
468static MCDisassembler *createMipsDisassembler(
469 const Target &T,
Lang Hamesa1bc0f52014-04-15 04:40:56 +0000470 const MCSubtargetInfo &STI,
471 MCContext &Ctx) {
472 return new MipsDisassembler(STI, Ctx, true);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000473}
474
475static MCDisassembler *createMipselDisassembler(
476 const Target &T,
Lang Hamesa1bc0f52014-04-15 04:40:56 +0000477 const MCSubtargetInfo &STI,
478 MCContext &Ctx) {
479 return new MipsDisassembler(STI, Ctx, false);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000480}
481
Akira Hatanaka71928e62012-04-17 18:03:21 +0000482extern "C" void LLVMInitializeMipsDisassembler() {
483 // Register the disassembler.
484 TargetRegistry::RegisterMCDisassembler(TheMipsTarget,
485 createMipsDisassembler);
486 TargetRegistry::RegisterMCDisassembler(TheMipselTarget,
487 createMipselDisassembler);
488 TargetRegistry::RegisterMCDisassembler(TheMips64Target,
Daniel Sandersa19216c2015-02-11 11:28:56 +0000489 createMipsDisassembler);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000490 TargetRegistry::RegisterMCDisassembler(TheMips64elTarget,
Daniel Sandersa19216c2015-02-11 11:28:56 +0000491 createMipselDisassembler);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000492}
493
Akira Hatanaka71928e62012-04-17 18:03:21 +0000494#include "MipsGenDisassemblerTables.inc"
495
Daniel Sanders5c582b22014-05-22 11:23:21 +0000496static unsigned getReg(const void *D, unsigned RC, unsigned RegNo) {
Daniel Sandersa19216c2015-02-11 11:28:56 +0000497 const MipsDisassembler *Dis = static_cast<const MipsDisassembler*>(D);
Daniel Sanders5c582b22014-05-22 11:23:21 +0000498 const MCRegisterInfo *RegInfo = Dis->getContext().getRegisterInfo();
499 return *(RegInfo->getRegClass(RC).begin() + RegNo);
500}
501
Daniel Sandersb50ccf82014-04-01 10:35:28 +0000502template <typename InsnType>
503static DecodeStatus DecodeINSVE_DF(MCInst &MI, InsnType insn, uint64_t Address,
504 const void *Decoder) {
505 typedef DecodeStatus (*DecodeFN)(MCInst &, unsigned, uint64_t, const void *);
506 // The size of the n field depends on the element size
507 // The register class also depends on this.
508 InsnType tmp = fieldFromInstruction(insn, 17, 5);
509 unsigned NSize = 0;
510 DecodeFN RegDecoder = nullptr;
511 if ((tmp & 0x18) == 0x00) { // INSVE_B
512 NSize = 4;
513 RegDecoder = DecodeMSA128BRegisterClass;
514 } else if ((tmp & 0x1c) == 0x10) { // INSVE_H
515 NSize = 3;
516 RegDecoder = DecodeMSA128HRegisterClass;
517 } else if ((tmp & 0x1e) == 0x18) { // INSVE_W
518 NSize = 2;
519 RegDecoder = DecodeMSA128WRegisterClass;
520 } else if ((tmp & 0x1f) == 0x1c) { // INSVE_D
521 NSize = 1;
522 RegDecoder = DecodeMSA128DRegisterClass;
523 } else
524 llvm_unreachable("Invalid encoding");
525
526 assert(NSize != 0 && RegDecoder != nullptr);
527
528 // $wd
529 tmp = fieldFromInstruction(insn, 6, 5);
530 if (RegDecoder(MI, tmp, Address, Decoder) == MCDisassembler::Fail)
531 return MCDisassembler::Fail;
532 // $wd_in
533 if (RegDecoder(MI, tmp, Address, Decoder) == MCDisassembler::Fail)
534 return MCDisassembler::Fail;
535 // $n
536 tmp = fieldFromInstruction(insn, 16, NSize);
Jim Grosbache9119e42015-05-13 18:37:00 +0000537 MI.addOperand(MCOperand::createImm(tmp));
Daniel Sandersb50ccf82014-04-01 10:35:28 +0000538 // $ws
539 tmp = fieldFromInstruction(insn, 11, 5);
540 if (RegDecoder(MI, tmp, Address, Decoder) == MCDisassembler::Fail)
541 return MCDisassembler::Fail;
542 // $n2
Jim Grosbache9119e42015-05-13 18:37:00 +0000543 MI.addOperand(MCOperand::createImm(0));
Daniel Sandersb50ccf82014-04-01 10:35:28 +0000544
545 return MCDisassembler::Success;
546}
547
Daniel Sanders5c582b22014-05-22 11:23:21 +0000548template <typename InsnType>
549static DecodeStatus DecodeAddiGroupBranch(MCInst &MI, InsnType insn,
550 uint64_t Address,
551 const void *Decoder) {
552 // If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled
553 // (otherwise we would have matched the ADDI instruction from the earlier
554 // ISA's instead).
555 //
556 // We have:
557 // 0b001000 sssss ttttt iiiiiiiiiiiiiiii
558 // BOVC if rs >= rt
559 // BEQZALC if rs == 0 && rt != 0
560 // BEQC if rs < rt && rs != 0
561
562 InsnType Rs = fieldFromInstruction(insn, 21, 5);
563 InsnType Rt = fieldFromInstruction(insn, 16, 5);
Alexey Samsonovd37bab62014-09-02 17:49:16 +0000564 InsnType Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4;
Daniel Sanders5c582b22014-05-22 11:23:21 +0000565 bool HasRs = false;
566
567 if (Rs >= Rt) {
568 MI.setOpcode(Mips::BOVC);
569 HasRs = true;
570 } else if (Rs != 0 && Rs < Rt) {
571 MI.setOpcode(Mips::BEQC);
572 HasRs = true;
573 } else
574 MI.setOpcode(Mips::BEQZALC);
575
576 if (HasRs)
Jim Grosbache9119e42015-05-13 18:37:00 +0000577 MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
Daniel Sanders5c582b22014-05-22 11:23:21 +0000578 Rs)));
579
Jim Grosbache9119e42015-05-13 18:37:00 +0000580 MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
Daniel Sanders5c582b22014-05-22 11:23:21 +0000581 Rt)));
Jim Grosbache9119e42015-05-13 18:37:00 +0000582 MI.addOperand(MCOperand::createImm(Imm));
Daniel Sanders5c582b22014-05-22 11:23:21 +0000583
584 return MCDisassembler::Success;
585}
586
587template <typename InsnType>
588static DecodeStatus DecodeDaddiGroupBranch(MCInst &MI, InsnType insn,
589 uint64_t Address,
590 const void *Decoder) {
591 // If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled
592 // (otherwise we would have matched the ADDI instruction from the earlier
593 // ISA's instead).
594 //
595 // We have:
596 // 0b011000 sssss ttttt iiiiiiiiiiiiiiii
597 // BNVC if rs >= rt
598 // BNEZALC if rs == 0 && rt != 0
599 // BNEC if rs < rt && rs != 0
600
601 InsnType Rs = fieldFromInstruction(insn, 21, 5);
602 InsnType Rt = fieldFromInstruction(insn, 16, 5);
Alexey Samsonovd37bab62014-09-02 17:49:16 +0000603 InsnType Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4;
Daniel Sanders5c582b22014-05-22 11:23:21 +0000604 bool HasRs = false;
605
606 if (Rs >= Rt) {
607 MI.setOpcode(Mips::BNVC);
608 HasRs = true;
609 } else if (Rs != 0 && Rs < Rt) {
610 MI.setOpcode(Mips::BNEC);
611 HasRs = true;
612 } else
613 MI.setOpcode(Mips::BNEZALC);
614
615 if (HasRs)
Jim Grosbache9119e42015-05-13 18:37:00 +0000616 MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
Daniel Sanders5c582b22014-05-22 11:23:21 +0000617 Rs)));
618
Jim Grosbache9119e42015-05-13 18:37:00 +0000619 MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
Daniel Sanders5c582b22014-05-22 11:23:21 +0000620 Rt)));
Jim Grosbache9119e42015-05-13 18:37:00 +0000621 MI.addOperand(MCOperand::createImm(Imm));
Daniel Sanders5c582b22014-05-22 11:23:21 +0000622
623 return MCDisassembler::Success;
624}
625
626template <typename InsnType>
627static DecodeStatus DecodeBlezlGroupBranch(MCInst &MI, InsnType insn,
628 uint64_t Address,
629 const void *Decoder) {
630 // If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled
631 // (otherwise we would have matched the BLEZL instruction from the earlier
632 // ISA's instead).
633 //
634 // We have:
635 // 0b010110 sssss ttttt iiiiiiiiiiiiiiii
636 // Invalid if rs == 0
637 // BLEZC if rs == 0 && rt != 0
638 // BGEZC if rs == rt && rt != 0
639 // BGEC if rs != rt && rs != 0 && rt != 0
640
641 InsnType Rs = fieldFromInstruction(insn, 21, 5);
642 InsnType Rt = fieldFromInstruction(insn, 16, 5);
Alexey Samsonovd37bab62014-09-02 17:49:16 +0000643 InsnType Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4;
Zoran Jovanovic28a0ca02014-06-12 11:47:44 +0000644 bool HasRs = false;
Daniel Sanders5c582b22014-05-22 11:23:21 +0000645
646 if (Rt == 0)
647 return MCDisassembler::Fail;
648 else if (Rs == 0)
649 MI.setOpcode(Mips::BLEZC);
650 else if (Rs == Rt)
651 MI.setOpcode(Mips::BGEZC);
Zoran Jovanovic28a0ca02014-06-12 11:47:44 +0000652 else {
653 HasRs = true;
654 MI.setOpcode(Mips::BGEC);
655 }
656
657 if (HasRs)
Jim Grosbache9119e42015-05-13 18:37:00 +0000658 MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
Zoran Jovanovic28a0ca02014-06-12 11:47:44 +0000659 Rs)));
Daniel Sanders5c582b22014-05-22 11:23:21 +0000660
Jim Grosbache9119e42015-05-13 18:37:00 +0000661 MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
Daniel Sanders5c582b22014-05-22 11:23:21 +0000662 Rt)));
663
Jim Grosbache9119e42015-05-13 18:37:00 +0000664 MI.addOperand(MCOperand::createImm(Imm));
Daniel Sanders5c582b22014-05-22 11:23:21 +0000665
666 return MCDisassembler::Success;
667}
668
669template <typename InsnType>
670static DecodeStatus DecodeBgtzlGroupBranch(MCInst &MI, InsnType insn,
671 uint64_t Address,
672 const void *Decoder) {
673 // If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled
674 // (otherwise we would have matched the BGTZL instruction from the earlier
675 // ISA's instead).
676 //
677 // We have:
678 // 0b010111 sssss ttttt iiiiiiiiiiiiiiii
679 // Invalid if rs == 0
680 // BGTZC if rs == 0 && rt != 0
681 // BLTZC if rs == rt && rt != 0
682 // BLTC if rs != rt && rs != 0 && rt != 0
683
Zoran Jovanovic5c14b062014-06-18 14:36:00 +0000684 bool HasRs = false;
685
Daniel Sanders5c582b22014-05-22 11:23:21 +0000686 InsnType Rs = fieldFromInstruction(insn, 21, 5);
687 InsnType Rt = fieldFromInstruction(insn, 16, 5);
Alexey Samsonovd37bab62014-09-02 17:49:16 +0000688 InsnType Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4;
Daniel Sanders5c582b22014-05-22 11:23:21 +0000689
690 if (Rt == 0)
691 return MCDisassembler::Fail;
692 else if (Rs == 0)
693 MI.setOpcode(Mips::BGTZC);
694 else if (Rs == Rt)
695 MI.setOpcode(Mips::BLTZC);
Zoran Jovanovic5c14b062014-06-18 14:36:00 +0000696 else {
697 MI.setOpcode(Mips::BLTC);
698 HasRs = true;
699 }
700
701 if (HasRs)
Jim Grosbache9119e42015-05-13 18:37:00 +0000702 MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
Zoran Jovanovic5c14b062014-06-18 14:36:00 +0000703 Rs)));
Daniel Sanders5c582b22014-05-22 11:23:21 +0000704
Jim Grosbache9119e42015-05-13 18:37:00 +0000705 MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
Daniel Sanders5c582b22014-05-22 11:23:21 +0000706 Rt)));
707
Jim Grosbache9119e42015-05-13 18:37:00 +0000708 MI.addOperand(MCOperand::createImm(Imm));
Daniel Sanders5c582b22014-05-22 11:23:21 +0000709
710 return MCDisassembler::Success;
711}
712
713template <typename InsnType>
714static DecodeStatus DecodeBgtzGroupBranch(MCInst &MI, InsnType insn,
715 uint64_t Address,
716 const void *Decoder) {
717 // If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled
718 // (otherwise we would have matched the BGTZ instruction from the earlier
719 // ISA's instead).
720 //
721 // We have:
722 // 0b000111 sssss ttttt iiiiiiiiiiiiiiii
723 // BGTZ if rt == 0
724 // BGTZALC if rs == 0 && rt != 0
725 // BLTZALC if rs != 0 && rs == rt
726 // BLTUC if rs != 0 && rs != rt
727
728 InsnType Rs = fieldFromInstruction(insn, 21, 5);
729 InsnType Rt = fieldFromInstruction(insn, 16, 5);
Alexey Samsonovd37bab62014-09-02 17:49:16 +0000730 InsnType Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4;
Daniel Sanders5c582b22014-05-22 11:23:21 +0000731 bool HasRs = false;
732 bool HasRt = false;
733
734 if (Rt == 0) {
735 MI.setOpcode(Mips::BGTZ);
736 HasRs = true;
737 } else if (Rs == 0) {
738 MI.setOpcode(Mips::BGTZALC);
739 HasRt = true;
740 } else if (Rs == Rt) {
741 MI.setOpcode(Mips::BLTZALC);
742 HasRs = true;
Zoran Jovanovic5c14b062014-06-18 14:36:00 +0000743 } else {
744 MI.setOpcode(Mips::BLTUC);
745 HasRs = true;
746 HasRt = true;
747 }
Daniel Sanders5c582b22014-05-22 11:23:21 +0000748
749 if (HasRs)
Jim Grosbache9119e42015-05-13 18:37:00 +0000750 MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
Daniel Sanders5c582b22014-05-22 11:23:21 +0000751 Rs)));
752
753 if (HasRt)
Jim Grosbache9119e42015-05-13 18:37:00 +0000754 MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
Daniel Sanders5c582b22014-05-22 11:23:21 +0000755 Rt)));
756
Jim Grosbache9119e42015-05-13 18:37:00 +0000757 MI.addOperand(MCOperand::createImm(Imm));
Daniel Sanders5c582b22014-05-22 11:23:21 +0000758
759 return MCDisassembler::Success;
760}
761
Zoran Jovanovic28a0ca02014-06-12 11:47:44 +0000762template <typename InsnType>
763static DecodeStatus DecodeBlezGroupBranch(MCInst &MI, InsnType insn,
764 uint64_t Address,
765 const void *Decoder) {
766 // If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled
767 // (otherwise we would have matched the BLEZL instruction from the earlier
768 // ISA's instead).
769 //
770 // We have:
771 // 0b000110 sssss ttttt iiiiiiiiiiiiiiii
772 // Invalid if rs == 0
773 // BLEZALC if rs == 0 && rt != 0
774 // BGEZALC if rs == rt && rt != 0
775 // BGEUC if rs != rt && rs != 0 && rt != 0
776
777 InsnType Rs = fieldFromInstruction(insn, 21, 5);
778 InsnType Rt = fieldFromInstruction(insn, 16, 5);
Alexey Samsonovd37bab62014-09-02 17:49:16 +0000779 InsnType Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4;
Zoran Jovanovic28a0ca02014-06-12 11:47:44 +0000780 bool HasRs = false;
781
782 if (Rt == 0)
783 return MCDisassembler::Fail;
784 else if (Rs == 0)
785 MI.setOpcode(Mips::BLEZALC);
786 else if (Rs == Rt)
787 MI.setOpcode(Mips::BGEZALC);
788 else {
789 HasRs = true;
790 MI.setOpcode(Mips::BGEUC);
791 }
792
793 if (HasRs)
Jim Grosbache9119e42015-05-13 18:37:00 +0000794 MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
Zoran Jovanovic28a0ca02014-06-12 11:47:44 +0000795 Rs)));
Jim Grosbache9119e42015-05-13 18:37:00 +0000796 MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
Zoran Jovanovic28a0ca02014-06-12 11:47:44 +0000797 Rt)));
798
Jim Grosbache9119e42015-05-13 18:37:00 +0000799 MI.addOperand(MCOperand::createImm(Imm));
Zoran Jovanovic28a0ca02014-06-12 11:47:44 +0000800
801 return MCDisassembler::Success;
802}
803
Jozef Kolekea22c4c2014-11-24 13:29:59 +0000804/// Read two bytes from the ArrayRef and return 16 bit halfword sorted
805/// according to the given endianess.
806static DecodeStatus readInstruction16(ArrayRef<uint8_t> Bytes, uint64_t Address,
807 uint64_t &Size, uint32_t &Insn,
808 bool IsBigEndian) {
809 // We want to read exactly 2 Bytes of data.
810 if (Bytes.size() < 2) {
811 Size = 0;
812 return MCDisassembler::Fail;
813 }
814
815 if (IsBigEndian) {
816 Insn = (Bytes[0] << 8) | Bytes[1];
817 } else {
818 Insn = (Bytes[1] << 8) | Bytes[0];
819 }
820
821 return MCDisassembler::Success;
822}
823
Rafael Espindola7fc5b872014-11-12 02:04:27 +0000824/// Read four bytes from the ArrayRef and return 32 bit word sorted
Rafael Espindola4aa6bea2014-11-10 18:11:10 +0000825/// according to the given endianess
Rafael Espindola7fc5b872014-11-12 02:04:27 +0000826static DecodeStatus readInstruction32(ArrayRef<uint8_t> Bytes, uint64_t Address,
827 uint64_t &Size, uint32_t &Insn,
828 bool IsBigEndian, bool IsMicroMips) {
Akira Hatanaka71928e62012-04-17 18:03:21 +0000829 // We want to read exactly 4 Bytes of data.
Rafael Espindola7fc5b872014-11-12 02:04:27 +0000830 if (Bytes.size() < 4) {
Rafael Espindola4aa6bea2014-11-10 18:11:10 +0000831 Size = 0;
Akira Hatanaka71928e62012-04-17 18:03:21 +0000832 return MCDisassembler::Fail;
833 }
834
Jozef Kolekea22c4c2014-11-24 13:29:59 +0000835 // High 16 bits of a 32-bit microMIPS instruction (where the opcode is)
836 // always precede the low 16 bits in the instruction stream (that is, they
837 // are placed at lower addresses in the instruction stream).
838 //
839 // microMIPS byte ordering:
840 // Big-endian: 0 | 1 | 2 | 3
841 // Little-endian: 1 | 0 | 3 | 2
842
Rafael Espindola4aa6bea2014-11-10 18:11:10 +0000843 if (IsBigEndian) {
Akira Hatanaka71928e62012-04-17 18:03:21 +0000844 // Encoded as a big-endian 32-bit word in the stream.
Rafael Espindola4aa6bea2014-11-10 18:11:10 +0000845 Insn =
846 (Bytes[3] << 0) | (Bytes[2] << 8) | (Bytes[1] << 16) | (Bytes[0] << 24);
847 } else {
Vladimir Medicdde3d582013-09-06 12:30:36 +0000848 if (IsMicroMips) {
Rafael Espindola4aa6bea2014-11-10 18:11:10 +0000849 Insn = (Bytes[2] << 0) | (Bytes[3] << 8) | (Bytes[0] << 16) |
Vladimir Medicdde3d582013-09-06 12:30:36 +0000850 (Bytes[1] << 24);
851 } else {
Rafael Espindola4aa6bea2014-11-10 18:11:10 +0000852 Insn = (Bytes[0] << 0) | (Bytes[1] << 8) | (Bytes[2] << 16) |
Vladimir Medicdde3d582013-09-06 12:30:36 +0000853 (Bytes[3] << 24);
854 }
Akira Hatanaka71928e62012-04-17 18:03:21 +0000855 }
856
857 return MCDisassembler::Success;
858}
859
Rafael Espindola4aa6bea2014-11-10 18:11:10 +0000860DecodeStatus MipsDisassembler::getInstruction(MCInst &Instr, uint64_t &Size,
Rafael Espindola7fc5b872014-11-12 02:04:27 +0000861 ArrayRef<uint8_t> Bytes,
Rafael Espindola4aa6bea2014-11-10 18:11:10 +0000862 uint64_t Address,
863 raw_ostream &VStream,
864 raw_ostream &CStream) const {
Akira Hatanaka71928e62012-04-17 18:03:21 +0000865 uint32_t Insn;
Jozef Kolekea22c4c2014-11-24 13:29:59 +0000866 DecodeStatus Result;
Akira Hatanaka71928e62012-04-17 18:03:21 +0000867
Vladimir Medicdde3d582013-09-06 12:30:36 +0000868 if (IsMicroMips) {
Jozef Kolekea22c4c2014-11-24 13:29:59 +0000869 Result = readInstruction16(Bytes, Address, Size, Insn, IsBigEndian);
870
Zoran Jovanovicada70912015-09-07 11:56:37 +0000871 if (hasMips32r6()) {
872 DEBUG(dbgs() << "Trying MicroMipsR616 table (16-bit instructions):\n");
873 // Calling the auto-generated decoder function for microMIPS32R6
874 // (and microMIPS64R6) 16-bit instructions.
875 Result = decodeInstruction(DecoderTableMicroMipsR616, Instr, Insn,
876 Address, this, STI);
877 if (Result != MCDisassembler::Fail) {
878 Size = 2;
879 return Result;
880 }
881 }
882
Jozef Kolekea22c4c2014-11-24 13:29:59 +0000883 DEBUG(dbgs() << "Trying MicroMips16 table (16-bit instructions):\n");
Zoran Jovanovicada70912015-09-07 11:56:37 +0000884 // Calling the auto-generated decoder function for microMIPS 16-bit
885 // instructions.
Jozef Kolekea22c4c2014-11-24 13:29:59 +0000886 Result = decodeInstruction(DecoderTableMicroMips16, Instr, Insn, Address,
887 this, STI);
888 if (Result != MCDisassembler::Fail) {
889 Size = 2;
890 return Result;
891 }
892
893 Result = readInstruction32(Bytes, Address, Size, Insn, IsBigEndian, true);
894 if (Result == MCDisassembler::Fail)
895 return MCDisassembler::Fail;
896
Jozef Kolek676d6012015-04-20 14:40:38 +0000897 if (hasMips32r6()) {
898 DEBUG(dbgs() << "Trying MicroMips32r632 table (32-bit instructions):\n");
899 // Calling the auto-generated decoder function.
Zoran Jovanovic366783e2015-08-12 12:45:16 +0000900 Result = decodeInstruction(DecoderTableMicroMipsR632, Instr, Insn, Address,
Jozef Kolek676d6012015-04-20 14:40:38 +0000901 this, STI);
Zoran Jovanovicada70912015-09-07 11:56:37 +0000902 if (Result != MCDisassembler::Fail) {
903 Size = 4;
904 return Result;
905 }
Jozef Kolek676d6012015-04-20 14:40:38 +0000906 }
Zoran Jovanovic366783e2015-08-12 12:45:16 +0000907
Zoran Jovanovicada70912015-09-07 11:56:37 +0000908 DEBUG(dbgs() << "Trying MicroMips32 table (32-bit instructions):\n");
909 // Calling the auto-generated decoder function.
910 Result = decodeInstruction(DecoderTableMicroMips32, Instr, Insn, Address,
911 this, STI);
Vladimir Medicdde3d582013-09-06 12:30:36 +0000912 if (Result != MCDisassembler::Fail) {
913 Size = 4;
914 return Result;
915 }
916 return MCDisassembler::Fail;
917 }
918
Jozef Kolekea22c4c2014-11-24 13:29:59 +0000919 Result = readInstruction32(Bytes, Address, Size, Insn, IsBigEndian, false);
920 if (Result == MCDisassembler::Fail)
921 return MCDisassembler::Fail;
922
Daniel Sandersc171f652014-06-13 13:15:59 +0000923 if (hasCOP3()) {
924 DEBUG(dbgs() << "Trying COP3_ table (32-bit opcodes):\n");
925 Result =
Rafael Espindola4aa6bea2014-11-10 18:11:10 +0000926 decodeInstruction(DecoderTableCOP3_32, Instr, Insn, Address, this, STI);
Daniel Sandersc171f652014-06-13 13:15:59 +0000927 if (Result != MCDisassembler::Fail) {
928 Size = 4;
929 return Result;
930 }
931 }
932
933 if (hasMips32r6() && isGP64()) {
Daniel Sanders0fa60412014-06-12 13:39:06 +0000934 DEBUG(dbgs() << "Trying Mips32r6_64r6 (GPR64) table (32-bit opcodes):\n");
Rafael Espindola4aa6bea2014-11-10 18:11:10 +0000935 Result = decodeInstruction(DecoderTableMips32r6_64r6_GP6432, Instr, Insn,
Daniel Sanders0fa60412014-06-12 13:39:06 +0000936 Address, this, STI);
937 if (Result != MCDisassembler::Fail) {
938 Size = 4;
939 return Result;
940 }
941 }
942
Daniel Sandersc171f652014-06-13 13:15:59 +0000943 if (hasMips32r6()) {
Daniel Sanders0fa60412014-06-12 13:39:06 +0000944 DEBUG(dbgs() << "Trying Mips32r6_64r6 table (32-bit opcodes):\n");
Rafael Espindola4aa6bea2014-11-10 18:11:10 +0000945 Result = decodeInstruction(DecoderTableMips32r6_64r632, Instr, Insn,
Daniel Sanders5c582b22014-05-22 11:23:21 +0000946 Address, this, STI);
947 if (Result != MCDisassembler::Fail) {
948 Size = 4;
949 return Result;
950 }
951 }
952
Kai Nacke3adf9b82015-05-28 16:23:16 +0000953 if (hasCnMips()) {
954 DEBUG(dbgs() << "Trying CnMips table (32-bit opcodes):\n");
955 Result = decodeInstruction(DecoderTableCnMips32, Instr, Insn,
956 Address, this, STI);
957 if (Result != MCDisassembler::Fail) {
958 Size = 4;
959 return Result;
960 }
961 }
962
Daniel Sandersa19216c2015-02-11 11:28:56 +0000963 if (isGP64()) {
964 DEBUG(dbgs() << "Trying Mips64 (GPR64) table (32-bit opcodes):\n");
965 Result = decodeInstruction(DecoderTableMips6432, Instr, Insn,
966 Address, this, STI);
967 if (Result != MCDisassembler::Fail) {
968 Size = 4;
969 return Result;
970 }
971 }
972
Daniel Sanders0fa60412014-06-12 13:39:06 +0000973 DEBUG(dbgs() << "Trying Mips table (32-bit opcodes):\n");
Akira Hatanaka71928e62012-04-17 18:03:21 +0000974 // Calling the auto-generated decoder function.
Rafael Espindola4aa6bea2014-11-10 18:11:10 +0000975 Result =
976 decodeInstruction(DecoderTableMips32, Instr, Insn, Address, this, STI);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000977 if (Result != MCDisassembler::Fail) {
978 Size = 4;
979 return Result;
980 }
981
982 return MCDisassembler::Fail;
983}
984
Reed Kotlerec8a5492013-02-14 03:05:25 +0000985static DecodeStatus DecodeCPU16RegsRegisterClass(MCInst &Inst,
986 unsigned RegNo,
987 uint64_t Address,
988 const void *Decoder) {
989
990 return MCDisassembler::Fail;
991
992}
993
Akira Hatanaka13e6ccf2013-08-06 23:08:38 +0000994static DecodeStatus DecodeGPR64RegisterClass(MCInst &Inst,
995 unsigned RegNo,
996 uint64_t Address,
997 const void *Decoder) {
Akira Hatanaka71928e62012-04-17 18:03:21 +0000998
999 if (RegNo > 31)
1000 return MCDisassembler::Fail;
1001
Akira Hatanaka13e6ccf2013-08-06 23:08:38 +00001002 unsigned Reg = getReg(Decoder, Mips::GPR64RegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001003 Inst.addOperand(MCOperand::createReg(Reg));
Akira Hatanaka71928e62012-04-17 18:03:21 +00001004 return MCDisassembler::Success;
1005}
1006
Zoran Jovanovicb0852e52014-10-21 08:23:11 +00001007static DecodeStatus DecodeGPRMM16RegisterClass(MCInst &Inst,
1008 unsigned RegNo,
1009 uint64_t Address,
1010 const void *Decoder) {
Jozef Kolekea22c4c2014-11-24 13:29:59 +00001011 if (RegNo > 7)
1012 return MCDisassembler::Fail;
1013 unsigned Reg = getReg(Decoder, Mips::GPRMM16RegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001014 Inst.addOperand(MCOperand::createReg(Reg));
Jozef Kolekea22c4c2014-11-24 13:29:59 +00001015 return MCDisassembler::Success;
Zoran Jovanovicb0852e52014-10-21 08:23:11 +00001016}
1017
Jozef Kolek1904fa22014-11-24 14:25:53 +00001018static DecodeStatus DecodeGPRMM16ZeroRegisterClass(MCInst &Inst,
1019 unsigned RegNo,
1020 uint64_t Address,
1021 const void *Decoder) {
Jozef Kolek315e7ec2014-11-26 18:56:38 +00001022 if (RegNo > 7)
1023 return MCDisassembler::Fail;
1024 unsigned Reg = getReg(Decoder, Mips::GPRMM16ZeroRegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001025 Inst.addOperand(MCOperand::createReg(Reg));
Jozef Kolek315e7ec2014-11-26 18:56:38 +00001026 return MCDisassembler::Success;
Jozef Kolek1904fa22014-11-24 14:25:53 +00001027}
1028
Zoran Jovanovic41688672015-02-10 16:36:20 +00001029static DecodeStatus DecodeGPRMM16MovePRegisterClass(MCInst &Inst,
1030 unsigned RegNo,
1031 uint64_t Address,
1032 const void *Decoder) {
1033 if (RegNo > 7)
1034 return MCDisassembler::Fail;
1035 unsigned Reg = getReg(Decoder, Mips::GPRMM16MovePRegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001036 Inst.addOperand(MCOperand::createReg(Reg));
Zoran Jovanovic41688672015-02-10 16:36:20 +00001037 return MCDisassembler::Success;
1038}
1039
Akira Hatanaka13e6ccf2013-08-06 23:08:38 +00001040static DecodeStatus DecodeGPR32RegisterClass(MCInst &Inst,
1041 unsigned RegNo,
1042 uint64_t Address,
1043 const void *Decoder) {
Akira Hatanaka71928e62012-04-17 18:03:21 +00001044 if (RegNo > 31)
1045 return MCDisassembler::Fail;
Akira Hatanaka13e6ccf2013-08-06 23:08:38 +00001046 unsigned Reg = getReg(Decoder, Mips::GPR32RegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001047 Inst.addOperand(MCOperand::createReg(Reg));
Akira Hatanaka71928e62012-04-17 18:03:21 +00001048 return MCDisassembler::Success;
1049}
1050
Akira Hatanaka9bfa2e22013-08-28 00:55:15 +00001051static DecodeStatus DecodePtrRegisterClass(MCInst &Inst,
1052 unsigned RegNo,
1053 uint64_t Address,
1054 const void *Decoder) {
Daniel Sandersa19216c2015-02-11 11:28:56 +00001055 if (static_cast<const MipsDisassembler *>(Decoder)->isGP64())
Akira Hatanaka9bfa2e22013-08-28 00:55:15 +00001056 return DecodeGPR64RegisterClass(Inst, RegNo, Address, Decoder);
1057
1058 return DecodeGPR32RegisterClass(Inst, RegNo, Address, Decoder);
1059}
1060
Akira Hatanaka654655f2013-08-14 00:53:38 +00001061static DecodeStatus DecodeDSPRRegisterClass(MCInst &Inst,
1062 unsigned RegNo,
1063 uint64_t Address,
1064 const void *Decoder) {
Akira Hatanaka13e6ccf2013-08-06 23:08:38 +00001065 return DecodeGPR32RegisterClass(Inst, RegNo, Address, Decoder);
Akira Hatanakaecabd1a2012-09-27 02:01:10 +00001066}
1067
Akira Hatanaka71928e62012-04-17 18:03:21 +00001068static DecodeStatus DecodeFGR64RegisterClass(MCInst &Inst,
1069 unsigned RegNo,
1070 uint64_t Address,
1071 const void *Decoder) {
1072 if (RegNo > 31)
1073 return MCDisassembler::Fail;
1074
Akira Hatanaka9bf2b562012-07-09 18:46:47 +00001075 unsigned Reg = getReg(Decoder, Mips::FGR64RegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001076 Inst.addOperand(MCOperand::createReg(Reg));
Akira Hatanaka71928e62012-04-17 18:03:21 +00001077 return MCDisassembler::Success;
1078}
1079
1080static DecodeStatus DecodeFGR32RegisterClass(MCInst &Inst,
1081 unsigned RegNo,
1082 uint64_t Address,
1083 const void *Decoder) {
1084 if (RegNo > 31)
1085 return MCDisassembler::Fail;
1086
Akira Hatanaka9bf2b562012-07-09 18:46:47 +00001087 unsigned Reg = getReg(Decoder, Mips::FGR32RegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001088 Inst.addOperand(MCOperand::createReg(Reg));
Akira Hatanaka71928e62012-04-17 18:03:21 +00001089 return MCDisassembler::Success;
1090}
1091
1092static DecodeStatus DecodeCCRRegisterClass(MCInst &Inst,
1093 unsigned RegNo,
1094 uint64_t Address,
1095 const void *Decoder) {
Chad Rosier253777f2013-06-26 22:23:32 +00001096 if (RegNo > 31)
1097 return MCDisassembler::Fail;
1098 unsigned Reg = getReg(Decoder, Mips::CCRRegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001099 Inst.addOperand(MCOperand::createReg(Reg));
Akira Hatanaka71928e62012-04-17 18:03:21 +00001100 return MCDisassembler::Success;
1101}
1102
Akira Hatanaka1fb1b8b2013-07-26 20:13:47 +00001103static DecodeStatus DecodeFCCRegisterClass(MCInst &Inst,
1104 unsigned RegNo,
1105 uint64_t Address,
1106 const void *Decoder) {
1107 if (RegNo > 7)
1108 return MCDisassembler::Fail;
1109 unsigned Reg = getReg(Decoder, Mips::FCCRegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001110 Inst.addOperand(MCOperand::createReg(Reg));
Akira Hatanaka1fb1b8b2013-07-26 20:13:47 +00001111 return MCDisassembler::Success;
1112}
1113
Daniel Sanders0fa60412014-06-12 13:39:06 +00001114static DecodeStatus DecodeFGRCCRegisterClass(MCInst &Inst, unsigned RegNo,
1115 uint64_t Address,
1116 const void *Decoder) {
1117 if (RegNo > 31)
1118 return MCDisassembler::Fail;
1119
1120 unsigned Reg = getReg(Decoder, Mips::FGRCCRegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001121 Inst.addOperand(MCOperand::createReg(Reg));
Daniel Sanders0fa60412014-06-12 13:39:06 +00001122 return MCDisassembler::Success;
1123}
1124
Akira Hatanaka71928e62012-04-17 18:03:21 +00001125static DecodeStatus DecodeMem(MCInst &Inst,
1126 unsigned Insn,
1127 uint64_t Address,
1128 const void *Decoder) {
1129 int Offset = SignExtend32<16>(Insn & 0xffff);
Jim Grosbachecaef492012-08-14 19:06:05 +00001130 unsigned Reg = fieldFromInstruction(Insn, 16, 5);
1131 unsigned Base = fieldFromInstruction(Insn, 21, 5);
Akira Hatanaka9bf2b562012-07-09 18:46:47 +00001132
Akira Hatanaka13e6ccf2013-08-06 23:08:38 +00001133 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
1134 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
Akira Hatanaka71928e62012-04-17 18:03:21 +00001135
Daniel Sanderse4e83a72015-09-15 10:02:16 +00001136 if (Inst.getOpcode() == Mips::SC ||
1137 Inst.getOpcode() == Mips::SCD)
Jim Grosbache9119e42015-05-13 18:37:00 +00001138 Inst.addOperand(MCOperand::createReg(Reg));
Daniel Sanderse4e83a72015-09-15 10:02:16 +00001139
1140 Inst.addOperand(MCOperand::createReg(Reg));
1141 Inst.addOperand(MCOperand::createReg(Base));
1142 Inst.addOperand(MCOperand::createImm(Offset));
1143
1144 return MCDisassembler::Success;
1145}
1146
1147static DecodeStatus DecodeMemEVA(MCInst &Inst,
1148 unsigned Insn,
1149 uint64_t Address,
1150 const void *Decoder) {
1151 int Offset = SignExtend32<9>(Insn >> 7);
1152 unsigned Reg = fieldFromInstruction(Insn, 16, 5);
1153 unsigned Base = fieldFromInstruction(Insn, 21, 5);
1154
1155 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
1156 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1157
1158 if (Inst.getOpcode() == Mips::SCE)
1159 Inst.addOperand(MCOperand::createReg(Reg));
Akira Hatanaka71928e62012-04-17 18:03:21 +00001160
Jim Grosbache9119e42015-05-13 18:37:00 +00001161 Inst.addOperand(MCOperand::createReg(Reg));
1162 Inst.addOperand(MCOperand::createReg(Base));
1163 Inst.addOperand(MCOperand::createImm(Offset));
Akira Hatanaka71928e62012-04-17 18:03:21 +00001164
1165 return MCDisassembler::Success;
1166}
1167
Hrvoje Varga3c88fbd2015-10-16 12:24:58 +00001168static DecodeStatus DecodeLoadByte9(MCInst &Inst,
1169 unsigned Insn,
1170 uint64_t Address,
1171 const void *Decoder) {
1172 int Offset = SignExtend32<9>(Insn & 0x1ff);
1173 unsigned Base = fieldFromInstruction(Insn, 16, 5);
1174 unsigned Reg = fieldFromInstruction(Insn, 21, 5);
1175
1176 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1177 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
1178
1179 Inst.addOperand(MCOperand::createReg(Reg));
1180 Inst.addOperand(MCOperand::createReg(Base));
1181 Inst.addOperand(MCOperand::createImm(Offset));
1182
1183 return MCDisassembler::Success;
1184}
1185
1186static DecodeStatus DecodeLoadByte15(MCInst &Inst,
1187 unsigned Insn,
1188 uint64_t Address,
1189 const void *Decoder) {
1190 int Offset = SignExtend32<16>(Insn & 0xffff);
1191 unsigned Base = fieldFromInstruction(Insn, 16, 5);
1192 unsigned Reg = fieldFromInstruction(Insn, 21, 5);
1193
1194 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1195 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
1196
1197 Inst.addOperand(MCOperand::createReg(Reg));
1198 Inst.addOperand(MCOperand::createReg(Base));
1199 Inst.addOperand(MCOperand::createImm(Offset));
1200
1201 return MCDisassembler::Success;
1202}
1203
Daniel Sanders92db6b72014-10-01 08:26:55 +00001204static DecodeStatus DecodeCacheOp(MCInst &Inst,
1205 unsigned Insn,
1206 uint64_t Address,
1207 const void *Decoder) {
1208 int Offset = SignExtend32<16>(Insn & 0xffff);
1209 unsigned Hint = fieldFromInstruction(Insn, 16, 5);
1210 unsigned Base = fieldFromInstruction(Insn, 21, 5);
1211
1212 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1213
Jim Grosbache9119e42015-05-13 18:37:00 +00001214 Inst.addOperand(MCOperand::createReg(Base));
1215 Inst.addOperand(MCOperand::createImm(Offset));
1216 Inst.addOperand(MCOperand::createImm(Hint));
Daniel Sanders92db6b72014-10-01 08:26:55 +00001217
1218 return MCDisassembler::Success;
1219}
1220
Jozef Kolekab6d1cc2014-12-23 19:55:34 +00001221static DecodeStatus DecodeCacheOpMM(MCInst &Inst,
1222 unsigned Insn,
1223 uint64_t Address,
1224 const void *Decoder) {
1225 int Offset = SignExtend32<12>(Insn & 0xfff);
1226 unsigned Base = fieldFromInstruction(Insn, 16, 5);
1227 unsigned Hint = fieldFromInstruction(Insn, 21, 5);
1228
1229 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1230
Jim Grosbache9119e42015-05-13 18:37:00 +00001231 Inst.addOperand(MCOperand::createReg(Base));
1232 Inst.addOperand(MCOperand::createImm(Offset));
1233 Inst.addOperand(MCOperand::createImm(Hint));
Jozef Kolekab6d1cc2014-12-23 19:55:34 +00001234
1235 return MCDisassembler::Success;
1236}
1237
Zoran Jovanovicd9790792015-09-09 09:10:46 +00001238static DecodeStatus DecodePrefeOpMM(MCInst &Inst,
1239 unsigned Insn,
1240 uint64_t Address,
1241 const void *Decoder) {
1242 int Offset = SignExtend32<9>(Insn & 0x1ff);
1243 unsigned Base = fieldFromInstruction(Insn, 16, 5);
1244 unsigned Hint = fieldFromInstruction(Insn, 21, 5);
1245
1246 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1247
1248 Inst.addOperand(MCOperand::createReg(Base));
1249 Inst.addOperand(MCOperand::createImm(Offset));
1250 Inst.addOperand(MCOperand::createImm(Hint));
1251
1252 return MCDisassembler::Success;
1253}
1254
Daniel Sanderse4e83a72015-09-15 10:02:16 +00001255static DecodeStatus DecodeCacheeOp_CacheOpR6(MCInst &Inst,
1256 unsigned Insn,
1257 uint64_t Address,
1258 const void *Decoder) {
1259 int Offset = SignExtend32<9>(Insn >> 7);
Vladimir Medicdf464ae2015-01-29 11:33:41 +00001260 unsigned Hint = fieldFromInstruction(Insn, 16, 5);
1261 unsigned Base = fieldFromInstruction(Insn, 21, 5);
1262
1263 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1264
Jim Grosbache9119e42015-05-13 18:37:00 +00001265 Inst.addOperand(MCOperand::createReg(Base));
1266 Inst.addOperand(MCOperand::createImm(Offset));
1267 Inst.addOperand(MCOperand::createImm(Hint));
Vladimir Medicdf464ae2015-01-29 11:33:41 +00001268
1269 return MCDisassembler::Success;
1270}
1271
Zoran Jovanovic9eaa30d2015-09-08 10:18:38 +00001272static DecodeStatus DecodeStoreEvaOpMM(MCInst &Inst,
1273 unsigned Insn,
1274 uint64_t Address,
1275 const void *Decoder) {
1276 int Offset = SignExtend32<9>(Insn & 0x1ff);
1277 unsigned Reg = fieldFromInstruction(Insn, 21, 5);
1278 unsigned Base = fieldFromInstruction(Insn, 16, 5);
1279
1280 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
1281 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1282
1283 Inst.addOperand(MCOperand::createReg(Reg));
1284 Inst.addOperand(MCOperand::createReg(Base));
1285 Inst.addOperand(MCOperand::createImm(Offset));
1286
1287 return MCDisassembler::Success;
1288}
1289
Daniel Sandersb4484d62014-11-27 17:28:10 +00001290static DecodeStatus DecodeSyncI(MCInst &Inst,
1291 unsigned Insn,
1292 uint64_t Address,
1293 const void *Decoder) {
1294 int Offset = SignExtend32<16>(Insn & 0xffff);
1295 unsigned Base = fieldFromInstruction(Insn, 21, 5);
1296
1297 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1298
Jim Grosbache9119e42015-05-13 18:37:00 +00001299 Inst.addOperand(MCOperand::createReg(Base));
1300 Inst.addOperand(MCOperand::createImm(Offset));
Daniel Sandersb4484d62014-11-27 17:28:10 +00001301
1302 return MCDisassembler::Success;
1303}
1304
Hrvoje Varga18148672015-10-28 11:04:29 +00001305static DecodeStatus DecodeSynciR6(MCInst &Inst,
1306 unsigned Insn,
1307 uint64_t Address,
1308 const void *Decoder) {
1309 int Immediate = SignExtend32<16>(Insn & 0xffff);
1310 unsigned Base = fieldFromInstruction(Insn, 16, 5);
1311
1312 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1313
1314 Inst.addOperand(MCOperand::createReg(Base));
1315 Inst.addOperand(MCOperand::createImm(Immediate));
1316
1317 return MCDisassembler::Success;
1318}
1319
Matheus Almeidafe0bf9f2013-10-21 13:07:13 +00001320static DecodeStatus DecodeMSA128Mem(MCInst &Inst, unsigned Insn,
1321 uint64_t Address, const void *Decoder) {
1322 int Offset = SignExtend32<10>(fieldFromInstruction(Insn, 16, 10));
1323 unsigned Reg = fieldFromInstruction(Insn, 6, 5);
1324 unsigned Base = fieldFromInstruction(Insn, 11, 5);
1325
1326 Reg = getReg(Decoder, Mips::MSA128BRegClassID, Reg);
1327 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1328
Jim Grosbache9119e42015-05-13 18:37:00 +00001329 Inst.addOperand(MCOperand::createReg(Reg));
1330 Inst.addOperand(MCOperand::createReg(Base));
Matheus Almeida6b59c442013-12-05 11:06:22 +00001331
1332 // The immediate field of an LD/ST instruction is scaled which means it must
1333 // be multiplied (when decoding) by the size (in bytes) of the instructions'
1334 // data format.
1335 // .b - 1 byte
1336 // .h - 2 bytes
1337 // .w - 4 bytes
1338 // .d - 8 bytes
1339 switch(Inst.getOpcode())
1340 {
1341 default:
1342 assert (0 && "Unexpected instruction");
1343 return MCDisassembler::Fail;
1344 break;
1345 case Mips::LD_B:
1346 case Mips::ST_B:
Jim Grosbache9119e42015-05-13 18:37:00 +00001347 Inst.addOperand(MCOperand::createImm(Offset));
Matheus Almeida6b59c442013-12-05 11:06:22 +00001348 break;
1349 case Mips::LD_H:
1350 case Mips::ST_H:
Jim Grosbache9119e42015-05-13 18:37:00 +00001351 Inst.addOperand(MCOperand::createImm(Offset * 2));
Matheus Almeida6b59c442013-12-05 11:06:22 +00001352 break;
1353 case Mips::LD_W:
1354 case Mips::ST_W:
Jim Grosbache9119e42015-05-13 18:37:00 +00001355 Inst.addOperand(MCOperand::createImm(Offset * 4));
Matheus Almeida6b59c442013-12-05 11:06:22 +00001356 break;
1357 case Mips::LD_D:
1358 case Mips::ST_D:
Jim Grosbache9119e42015-05-13 18:37:00 +00001359 Inst.addOperand(MCOperand::createImm(Offset * 8));
Matheus Almeida6b59c442013-12-05 11:06:22 +00001360 break;
1361 }
Matheus Almeidafe0bf9f2013-10-21 13:07:13 +00001362
1363 return MCDisassembler::Success;
1364}
1365
Jozef Kolek315e7ec2014-11-26 18:56:38 +00001366static DecodeStatus DecodeMemMMImm4(MCInst &Inst,
1367 unsigned Insn,
1368 uint64_t Address,
1369 const void *Decoder) {
1370 unsigned Offset = Insn & 0xf;
1371 unsigned Reg = fieldFromInstruction(Insn, 7, 3);
1372 unsigned Base = fieldFromInstruction(Insn, 4, 3);
1373
1374 switch (Inst.getOpcode()) {
1375 case Mips::LBU16_MM:
1376 case Mips::LHU16_MM:
1377 case Mips::LW16_MM:
1378 if (DecodeGPRMM16RegisterClass(Inst, Reg, Address, Decoder)
1379 == MCDisassembler::Fail)
1380 return MCDisassembler::Fail;
1381 break;
1382 case Mips::SB16_MM:
1383 case Mips::SH16_MM:
1384 case Mips::SW16_MM:
1385 if (DecodeGPRMM16ZeroRegisterClass(Inst, Reg, Address, Decoder)
1386 == MCDisassembler::Fail)
1387 return MCDisassembler::Fail;
1388 break;
1389 }
1390
1391 if (DecodeGPRMM16RegisterClass(Inst, Base, Address, Decoder)
1392 == MCDisassembler::Fail)
1393 return MCDisassembler::Fail;
1394
1395 switch (Inst.getOpcode()) {
1396 case Mips::LBU16_MM:
1397 if (Offset == 0xf)
Jim Grosbache9119e42015-05-13 18:37:00 +00001398 Inst.addOperand(MCOperand::createImm(-1));
Jozef Kolek315e7ec2014-11-26 18:56:38 +00001399 else
Jim Grosbache9119e42015-05-13 18:37:00 +00001400 Inst.addOperand(MCOperand::createImm(Offset));
Jozef Kolek315e7ec2014-11-26 18:56:38 +00001401 break;
1402 case Mips::SB16_MM:
Jim Grosbache9119e42015-05-13 18:37:00 +00001403 Inst.addOperand(MCOperand::createImm(Offset));
Jozef Kolek315e7ec2014-11-26 18:56:38 +00001404 break;
1405 case Mips::LHU16_MM:
1406 case Mips::SH16_MM:
Jim Grosbache9119e42015-05-13 18:37:00 +00001407 Inst.addOperand(MCOperand::createImm(Offset << 1));
Jozef Kolek315e7ec2014-11-26 18:56:38 +00001408 break;
1409 case Mips::LW16_MM:
1410 case Mips::SW16_MM:
Jim Grosbache9119e42015-05-13 18:37:00 +00001411 Inst.addOperand(MCOperand::createImm(Offset << 2));
Jozef Kolek315e7ec2014-11-26 18:56:38 +00001412 break;
1413 }
1414
1415 return MCDisassembler::Success;
1416}
1417
Jozef Kolek12c69822014-12-23 16:16:33 +00001418static DecodeStatus DecodeMemMMSPImm5Lsl2(MCInst &Inst,
1419 unsigned Insn,
1420 uint64_t Address,
1421 const void *Decoder) {
1422 unsigned Offset = Insn & 0x1F;
1423 unsigned Reg = fieldFromInstruction(Insn, 5, 5);
1424
1425 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
1426
Jim Grosbache9119e42015-05-13 18:37:00 +00001427 Inst.addOperand(MCOperand::createReg(Reg));
1428 Inst.addOperand(MCOperand::createReg(Mips::SP));
1429 Inst.addOperand(MCOperand::createImm(Offset << 2));
Jozef Kolek12c69822014-12-23 16:16:33 +00001430
1431 return MCDisassembler::Success;
1432}
1433
Jozef Koleke10a02e2015-01-28 17:27:26 +00001434static DecodeStatus DecodeMemMMGPImm7Lsl2(MCInst &Inst,
1435 unsigned Insn,
1436 uint64_t Address,
1437 const void *Decoder) {
1438 unsigned Offset = Insn & 0x7F;
1439 unsigned Reg = fieldFromInstruction(Insn, 7, 3);
1440
1441 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
1442
Jim Grosbache9119e42015-05-13 18:37:00 +00001443 Inst.addOperand(MCOperand::createReg(Reg));
1444 Inst.addOperand(MCOperand::createReg(Mips::GP));
1445 Inst.addOperand(MCOperand::createImm(Offset << 2));
Jozef Koleke10a02e2015-01-28 17:27:26 +00001446
1447 return MCDisassembler::Success;
1448}
1449
Jozef Kolekd68d424a2015-02-10 12:41:13 +00001450static DecodeStatus DecodeMemMMReglistImm4Lsl2(MCInst &Inst,
1451 unsigned Insn,
1452 uint64_t Address,
1453 const void *Decoder) {
1454 int Offset = SignExtend32<4>(Insn & 0xf);
1455
1456 if (DecodeRegListOperand16(Inst, Insn, Address, Decoder)
1457 == MCDisassembler::Fail)
1458 return MCDisassembler::Fail;
1459
Jim Grosbache9119e42015-05-13 18:37:00 +00001460 Inst.addOperand(MCOperand::createReg(Mips::SP));
1461 Inst.addOperand(MCOperand::createImm(Offset << 2));
Jozef Kolekd68d424a2015-02-10 12:41:13 +00001462
1463 return MCDisassembler::Success;
1464}
1465
Zoran Jovanovica6593ff2015-08-18 12:53:08 +00001466static DecodeStatus DecodeMemMMImm9(MCInst &Inst,
1467 unsigned Insn,
1468 uint64_t Address,
1469 const void *Decoder) {
1470 int Offset = SignExtend32<9>(Insn & 0x1ff);
1471 unsigned Reg = fieldFromInstruction(Insn, 21, 5);
1472 unsigned Base = fieldFromInstruction(Insn, 16, 5);
1473
1474 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
1475 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1476
Hrvoje Varga3ef4dd72015-10-15 08:11:50 +00001477 if (Inst.getOpcode() == Mips::SCE_MM)
1478 Inst.addOperand(MCOperand::createReg(Reg));
1479
Zoran Jovanovica6593ff2015-08-18 12:53:08 +00001480 Inst.addOperand(MCOperand::createReg(Reg));
1481 Inst.addOperand(MCOperand::createReg(Base));
1482 Inst.addOperand(MCOperand::createImm(Offset));
1483
1484 return MCDisassembler::Success;
1485}
1486
Vladimir Medicdde3d582013-09-06 12:30:36 +00001487static DecodeStatus DecodeMemMMImm12(MCInst &Inst,
1488 unsigned Insn,
1489 uint64_t Address,
1490 const void *Decoder) {
1491 int Offset = SignExtend32<12>(Insn & 0x0fff);
1492 unsigned Reg = fieldFromInstruction(Insn, 21, 5);
1493 unsigned Base = fieldFromInstruction(Insn, 16, 5);
1494
1495 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
1496 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1497
Zoran Jovanovica4c4b5f2014-11-19 16:44:02 +00001498 switch (Inst.getOpcode()) {
1499 case Mips::SWM32_MM:
1500 case Mips::LWM32_MM:
1501 if (DecodeRegListOperand(Inst, Insn, Address, Decoder)
1502 == MCDisassembler::Fail)
1503 return MCDisassembler::Fail;
Jim Grosbache9119e42015-05-13 18:37:00 +00001504 Inst.addOperand(MCOperand::createReg(Base));
1505 Inst.addOperand(MCOperand::createImm(Offset));
Zoran Jovanovica4c4b5f2014-11-19 16:44:02 +00001506 break;
1507 case Mips::SC_MM:
Jim Grosbache9119e42015-05-13 18:37:00 +00001508 Inst.addOperand(MCOperand::createReg(Reg));
Zoran Jovanovica4c4b5f2014-11-19 16:44:02 +00001509 // fallthrough
1510 default:
Jim Grosbache9119e42015-05-13 18:37:00 +00001511 Inst.addOperand(MCOperand::createReg(Reg));
Zoran Jovanovic2deca342014-12-16 14:59:10 +00001512 if (Inst.getOpcode() == Mips::LWP_MM || Inst.getOpcode() == Mips::SWP_MM)
Jim Grosbache9119e42015-05-13 18:37:00 +00001513 Inst.addOperand(MCOperand::createReg(Reg+1));
Zoran Jovanovic2deca342014-12-16 14:59:10 +00001514
Jim Grosbache9119e42015-05-13 18:37:00 +00001515 Inst.addOperand(MCOperand::createReg(Base));
1516 Inst.addOperand(MCOperand::createImm(Offset));
Zoran Jovanovica4c4b5f2014-11-19 16:44:02 +00001517 }
Vladimir Medicdde3d582013-09-06 12:30:36 +00001518
1519 return MCDisassembler::Success;
1520}
1521
1522static DecodeStatus DecodeMemMMImm16(MCInst &Inst,
1523 unsigned Insn,
1524 uint64_t Address,
1525 const void *Decoder) {
1526 int Offset = SignExtend32<16>(Insn & 0xffff);
1527 unsigned Reg = fieldFromInstruction(Insn, 21, 5);
1528 unsigned Base = fieldFromInstruction(Insn, 16, 5);
1529
1530 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
1531 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1532
Jim Grosbache9119e42015-05-13 18:37:00 +00001533 Inst.addOperand(MCOperand::createReg(Reg));
1534 Inst.addOperand(MCOperand::createReg(Base));
1535 Inst.addOperand(MCOperand::createImm(Offset));
Vladimir Medicdde3d582013-09-06 12:30:36 +00001536
1537 return MCDisassembler::Success;
1538}
1539
Akira Hatanaka71928e62012-04-17 18:03:21 +00001540static DecodeStatus DecodeFMem(MCInst &Inst,
1541 unsigned Insn,
1542 uint64_t Address,
1543 const void *Decoder) {
1544 int Offset = SignExtend32<16>(Insn & 0xffff);
Jim Grosbachecaef492012-08-14 19:06:05 +00001545 unsigned Reg = fieldFromInstruction(Insn, 16, 5);
1546 unsigned Base = fieldFromInstruction(Insn, 21, 5);
Akira Hatanaka71928e62012-04-17 18:03:21 +00001547
Akira Hatanaka9bf2b562012-07-09 18:46:47 +00001548 Reg = getReg(Decoder, Mips::FGR64RegClassID, Reg);
Akira Hatanaka13e6ccf2013-08-06 23:08:38 +00001549 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
Akira Hatanaka9bf2b562012-07-09 18:46:47 +00001550
Jim Grosbache9119e42015-05-13 18:37:00 +00001551 Inst.addOperand(MCOperand::createReg(Reg));
1552 Inst.addOperand(MCOperand::createReg(Base));
1553 Inst.addOperand(MCOperand::createImm(Offset));
Akira Hatanaka71928e62012-04-17 18:03:21 +00001554
1555 return MCDisassembler::Success;
1556}
1557
Daniel Sanders92db6b72014-10-01 08:26:55 +00001558static DecodeStatus DecodeFMem2(MCInst &Inst,
1559 unsigned Insn,
1560 uint64_t Address,
1561 const void *Decoder) {
1562 int Offset = SignExtend32<16>(Insn & 0xffff);
1563 unsigned Reg = fieldFromInstruction(Insn, 16, 5);
1564 unsigned Base = fieldFromInstruction(Insn, 21, 5);
1565
1566 Reg = getReg(Decoder, Mips::COP2RegClassID, Reg);
1567 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1568
Jim Grosbache9119e42015-05-13 18:37:00 +00001569 Inst.addOperand(MCOperand::createReg(Reg));
1570 Inst.addOperand(MCOperand::createReg(Base));
1571 Inst.addOperand(MCOperand::createImm(Offset));
Daniel Sanders92db6b72014-10-01 08:26:55 +00001572
1573 return MCDisassembler::Success;
1574}
1575
1576static DecodeStatus DecodeFMem3(MCInst &Inst,
1577 unsigned Insn,
1578 uint64_t Address,
1579 const void *Decoder) {
1580 int Offset = SignExtend32<16>(Insn & 0xffff);
1581 unsigned Reg = fieldFromInstruction(Insn, 16, 5);
1582 unsigned Base = fieldFromInstruction(Insn, 21, 5);
1583
1584 Reg = getReg(Decoder, Mips::COP3RegClassID, Reg);
1585 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1586
Jim Grosbache9119e42015-05-13 18:37:00 +00001587 Inst.addOperand(MCOperand::createReg(Reg));
1588 Inst.addOperand(MCOperand::createReg(Base));
1589 Inst.addOperand(MCOperand::createImm(Offset));
Daniel Sanders92db6b72014-10-01 08:26:55 +00001590
1591 return MCDisassembler::Success;
1592}
1593
Vladimir Medic435cf8a2015-01-21 10:47:36 +00001594static DecodeStatus DecodeFMemCop2R6(MCInst &Inst,
1595 unsigned Insn,
1596 uint64_t Address,
1597 const void *Decoder) {
1598 int Offset = SignExtend32<11>(Insn & 0x07ff);
1599 unsigned Reg = fieldFromInstruction(Insn, 16, 5);
1600 unsigned Base = fieldFromInstruction(Insn, 11, 5);
1601
1602 Reg = getReg(Decoder, Mips::COP2RegClassID, Reg);
1603 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1604
Jim Grosbache9119e42015-05-13 18:37:00 +00001605 Inst.addOperand(MCOperand::createReg(Reg));
1606 Inst.addOperand(MCOperand::createReg(Base));
1607 Inst.addOperand(MCOperand::createImm(Offset));
Vladimir Medic435cf8a2015-01-21 10:47:36 +00001608
1609 return MCDisassembler::Success;
1610}
Daniel Sanders6a803f62014-06-16 13:13:03 +00001611static DecodeStatus DecodeSpecial3LlSc(MCInst &Inst,
1612 unsigned Insn,
1613 uint64_t Address,
1614 const void *Decoder) {
1615 int64_t Offset = SignExtend64<9>((Insn >> 7) & 0x1ff);
1616 unsigned Rt = fieldFromInstruction(Insn, 16, 5);
1617 unsigned Base = fieldFromInstruction(Insn, 21, 5);
1618
1619 Rt = getReg(Decoder, Mips::GPR32RegClassID, Rt);
1620 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1621
1622 if(Inst.getOpcode() == Mips::SC_R6 || Inst.getOpcode() == Mips::SCD_R6){
Jim Grosbache9119e42015-05-13 18:37:00 +00001623 Inst.addOperand(MCOperand::createReg(Rt));
Daniel Sanders6a803f62014-06-16 13:13:03 +00001624 }
1625
Jim Grosbache9119e42015-05-13 18:37:00 +00001626 Inst.addOperand(MCOperand::createReg(Rt));
1627 Inst.addOperand(MCOperand::createReg(Base));
1628 Inst.addOperand(MCOperand::createImm(Offset));
Daniel Sanders6a803f62014-06-16 13:13:03 +00001629
1630 return MCDisassembler::Success;
1631}
Akira Hatanaka71928e62012-04-17 18:03:21 +00001632
1633static DecodeStatus DecodeHWRegsRegisterClass(MCInst &Inst,
1634 unsigned RegNo,
1635 uint64_t Address,
1636 const void *Decoder) {
1637 // Currently only hardware register 29 is supported.
1638 if (RegNo != 29)
1639 return MCDisassembler::Fail;
Jim Grosbache9119e42015-05-13 18:37:00 +00001640 Inst.addOperand(MCOperand::createReg(Mips::HWR29));
Akira Hatanaka71928e62012-04-17 18:03:21 +00001641 return MCDisassembler::Success;
1642}
1643
Akira Hatanaka71928e62012-04-17 18:03:21 +00001644static DecodeStatus DecodeAFGR64RegisterClass(MCInst &Inst,
1645 unsigned RegNo,
1646 uint64_t Address,
1647 const void *Decoder) {
Akira Hatanaka9bf2b562012-07-09 18:46:47 +00001648 if (RegNo > 30 || RegNo %2)
Akira Hatanaka71928e62012-04-17 18:03:21 +00001649 return MCDisassembler::Fail;
1650
Akira Hatanaka9bf2b562012-07-09 18:46:47 +00001651 ;
1652 unsigned Reg = getReg(Decoder, Mips::AFGR64RegClassID, RegNo /2);
Jim Grosbache9119e42015-05-13 18:37:00 +00001653 Inst.addOperand(MCOperand::createReg(Reg));
Akira Hatanaka71928e62012-04-17 18:03:21 +00001654 return MCDisassembler::Success;
1655}
1656
Akira Hatanaka00fcf2e2013-08-08 21:54:26 +00001657static DecodeStatus DecodeACC64DSPRegisterClass(MCInst &Inst,
1658 unsigned RegNo,
1659 uint64_t Address,
1660 const void *Decoder) {
Akira Hatanakaecabd1a2012-09-27 02:01:10 +00001661 if (RegNo >= 4)
1662 return MCDisassembler::Fail;
1663
Akira Hatanaka00fcf2e2013-08-08 21:54:26 +00001664 unsigned Reg = getReg(Decoder, Mips::ACC64DSPRegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001665 Inst.addOperand(MCOperand::createReg(Reg));
Akira Hatanakaecabd1a2012-09-27 02:01:10 +00001666 return MCDisassembler::Success;
1667}
1668
Akira Hatanaka8002a3f2013-08-14 00:47:08 +00001669static DecodeStatus DecodeHI32DSPRegisterClass(MCInst &Inst,
1670 unsigned RegNo,
1671 uint64_t Address,
1672 const void *Decoder) {
Akira Hatanaka59bfaf72013-04-18 00:52:44 +00001673 if (RegNo >= 4)
1674 return MCDisassembler::Fail;
1675
Akira Hatanaka8002a3f2013-08-14 00:47:08 +00001676 unsigned Reg = getReg(Decoder, Mips::HI32DSPRegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001677 Inst.addOperand(MCOperand::createReg(Reg));
Akira Hatanaka59bfaf72013-04-18 00:52:44 +00001678 return MCDisassembler::Success;
1679}
1680
Akira Hatanaka8002a3f2013-08-14 00:47:08 +00001681static DecodeStatus DecodeLO32DSPRegisterClass(MCInst &Inst,
1682 unsigned RegNo,
1683 uint64_t Address,
1684 const void *Decoder) {
Akira Hatanaka59bfaf72013-04-18 00:52:44 +00001685 if (RegNo >= 4)
1686 return MCDisassembler::Fail;
1687
Akira Hatanaka8002a3f2013-08-14 00:47:08 +00001688 unsigned Reg = getReg(Decoder, Mips::LO32DSPRegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001689 Inst.addOperand(MCOperand::createReg(Reg));
Akira Hatanaka59bfaf72013-04-18 00:52:44 +00001690 return MCDisassembler::Success;
1691}
1692
Jack Carter3eb663b2013-09-26 00:09:46 +00001693static DecodeStatus DecodeMSA128BRegisterClass(MCInst &Inst,
1694 unsigned RegNo,
1695 uint64_t Address,
1696 const void *Decoder) {
1697 if (RegNo > 31)
1698 return MCDisassembler::Fail;
1699
1700 unsigned Reg = getReg(Decoder, Mips::MSA128BRegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001701 Inst.addOperand(MCOperand::createReg(Reg));
Jack Carter3eb663b2013-09-26 00:09:46 +00001702 return MCDisassembler::Success;
1703}
1704
Jack Carter5dc8ac92013-09-25 23:50:44 +00001705static DecodeStatus DecodeMSA128HRegisterClass(MCInst &Inst,
1706 unsigned RegNo,
1707 uint64_t Address,
1708 const void *Decoder) {
1709 if (RegNo > 31)
1710 return MCDisassembler::Fail;
1711
1712 unsigned Reg = getReg(Decoder, Mips::MSA128HRegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001713 Inst.addOperand(MCOperand::createReg(Reg));
Jack Carter5dc8ac92013-09-25 23:50:44 +00001714 return MCDisassembler::Success;
1715}
1716
1717static DecodeStatus DecodeMSA128WRegisterClass(MCInst &Inst,
1718 unsigned RegNo,
1719 uint64_t Address,
1720 const void *Decoder) {
1721 if (RegNo > 31)
1722 return MCDisassembler::Fail;
1723
1724 unsigned Reg = getReg(Decoder, Mips::MSA128WRegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001725 Inst.addOperand(MCOperand::createReg(Reg));
Jack Carter5dc8ac92013-09-25 23:50:44 +00001726 return MCDisassembler::Success;
1727}
1728
1729static DecodeStatus DecodeMSA128DRegisterClass(MCInst &Inst,
1730 unsigned RegNo,
1731 uint64_t Address,
1732 const void *Decoder) {
1733 if (RegNo > 31)
1734 return MCDisassembler::Fail;
1735
1736 unsigned Reg = getReg(Decoder, Mips::MSA128DRegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001737 Inst.addOperand(MCOperand::createReg(Reg));
Jack Carter5dc8ac92013-09-25 23:50:44 +00001738 return MCDisassembler::Success;
1739}
1740
Matheus Almeidaa591fdc2013-10-21 12:26:50 +00001741static DecodeStatus DecodeMSACtrlRegisterClass(MCInst &Inst,
1742 unsigned RegNo,
1743 uint64_t Address,
1744 const void *Decoder) {
1745 if (RegNo > 7)
1746 return MCDisassembler::Fail;
1747
1748 unsigned Reg = getReg(Decoder, Mips::MSACtrlRegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001749 Inst.addOperand(MCOperand::createReg(Reg));
Matheus Almeidaa591fdc2013-10-21 12:26:50 +00001750 return MCDisassembler::Success;
1751}
1752
Daniel Sandersa3134fa2015-06-27 15:39:19 +00001753static DecodeStatus DecodeCOP0RegisterClass(MCInst &Inst,
1754 unsigned RegNo,
1755 uint64_t Address,
1756 const void *Decoder) {
1757 if (RegNo > 31)
1758 return MCDisassembler::Fail;
1759
1760 unsigned Reg = getReg(Decoder, Mips::COP0RegClassID, RegNo);
1761 Inst.addOperand(MCOperand::createReg(Reg));
1762 return MCDisassembler::Success;
1763}
1764
Daniel Sanders2a83d682014-05-21 12:56:39 +00001765static DecodeStatus DecodeCOP2RegisterClass(MCInst &Inst,
1766 unsigned RegNo,
1767 uint64_t Address,
1768 const void *Decoder) {
1769 if (RegNo > 31)
1770 return MCDisassembler::Fail;
1771
1772 unsigned Reg = getReg(Decoder, Mips::COP2RegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001773 Inst.addOperand(MCOperand::createReg(Reg));
Daniel Sanders2a83d682014-05-21 12:56:39 +00001774 return MCDisassembler::Success;
1775}
1776
Akira Hatanaka71928e62012-04-17 18:03:21 +00001777static DecodeStatus DecodeBranchTarget(MCInst &Inst,
1778 unsigned Offset,
1779 uint64_t Address,
1780 const void *Decoder) {
Alexey Samsonovd37bab62014-09-02 17:49:16 +00001781 int32_t BranchOffset = (SignExtend32<16>(Offset) * 4) + 4;
Jim Grosbache9119e42015-05-13 18:37:00 +00001782 Inst.addOperand(MCOperand::createImm(BranchOffset));
Akira Hatanaka71928e62012-04-17 18:03:21 +00001783 return MCDisassembler::Success;
1784}
1785
Akira Hatanaka71928e62012-04-17 18:03:21 +00001786static DecodeStatus DecodeJumpTarget(MCInst &Inst,
1787 unsigned Insn,
1788 uint64_t Address,
1789 const void *Decoder) {
1790
Jim Grosbachecaef492012-08-14 19:06:05 +00001791 unsigned JumpOffset = fieldFromInstruction(Insn, 0, 26) << 2;
Jim Grosbache9119e42015-05-13 18:37:00 +00001792 Inst.addOperand(MCOperand::createImm(JumpOffset));
Akira Hatanaka71928e62012-04-17 18:03:21 +00001793 return MCDisassembler::Success;
1794}
1795
Zoran Jovanovic3c8869d2014-05-16 11:03:45 +00001796static DecodeStatus DecodeBranchTarget21(MCInst &Inst,
1797 unsigned Offset,
1798 uint64_t Address,
1799 const void *Decoder) {
Alexey Samsonovd37bab62014-09-02 17:49:16 +00001800 int32_t BranchOffset = SignExtend32<21>(Offset) * 4;
Zoran Jovanovic3c8869d2014-05-16 11:03:45 +00001801
Jim Grosbache9119e42015-05-13 18:37:00 +00001802 Inst.addOperand(MCOperand::createImm(BranchOffset));
Zoran Jovanovic3c8869d2014-05-16 11:03:45 +00001803 return MCDisassembler::Success;
1804}
1805
1806static DecodeStatus DecodeBranchTarget26(MCInst &Inst,
1807 unsigned Offset,
1808 uint64_t Address,
1809 const void *Decoder) {
Alexey Samsonovd37bab62014-09-02 17:49:16 +00001810 int32_t BranchOffset = SignExtend32<26>(Offset) * 4;
Zoran Jovanovic3c8869d2014-05-16 11:03:45 +00001811
Jim Grosbache9119e42015-05-13 18:37:00 +00001812 Inst.addOperand(MCOperand::createImm(BranchOffset));
Zoran Jovanovic3c8869d2014-05-16 11:03:45 +00001813 return MCDisassembler::Success;
1814}
1815
Jozef Kolek9761e962015-01-12 12:03:34 +00001816static DecodeStatus DecodeBranchTarget7MM(MCInst &Inst,
1817 unsigned Offset,
1818 uint64_t Address,
1819 const void *Decoder) {
1820 int32_t BranchOffset = SignExtend32<7>(Offset) << 1;
Jim Grosbache9119e42015-05-13 18:37:00 +00001821 Inst.addOperand(MCOperand::createImm(BranchOffset));
Jozef Kolek9761e962015-01-12 12:03:34 +00001822 return MCDisassembler::Success;
1823}
1824
Jozef Kolek5cfebdd2015-01-21 12:39:30 +00001825static DecodeStatus DecodeBranchTarget10MM(MCInst &Inst,
1826 unsigned Offset,
1827 uint64_t Address,
1828 const void *Decoder) {
1829 int32_t BranchOffset = SignExtend32<10>(Offset) << 1;
Jim Grosbache9119e42015-05-13 18:37:00 +00001830 Inst.addOperand(MCOperand::createImm(BranchOffset));
Jozef Kolek5cfebdd2015-01-21 12:39:30 +00001831 return MCDisassembler::Success;
1832}
1833
Zoran Jovanovic8a80aa72013-11-04 14:53:22 +00001834static DecodeStatus DecodeBranchTargetMM(MCInst &Inst,
1835 unsigned Offset,
1836 uint64_t Address,
1837 const void *Decoder) {
Alexey Samsonovd37bab62014-09-02 17:49:16 +00001838 int32_t BranchOffset = SignExtend32<16>(Offset) * 2;
Jim Grosbache9119e42015-05-13 18:37:00 +00001839 Inst.addOperand(MCOperand::createImm(BranchOffset));
Zoran Jovanovic8a80aa72013-11-04 14:53:22 +00001840 return MCDisassembler::Success;
1841}
1842
Zoran Jovanovic507e0842013-10-29 16:38:59 +00001843static DecodeStatus DecodeJumpTargetMM(MCInst &Inst,
1844 unsigned Insn,
1845 uint64_t Address,
1846 const void *Decoder) {
1847 unsigned JumpOffset = fieldFromInstruction(Insn, 0, 26) << 1;
Jim Grosbache9119e42015-05-13 18:37:00 +00001848 Inst.addOperand(MCOperand::createImm(JumpOffset));
Zoran Jovanovic507e0842013-10-29 16:38:59 +00001849 return MCDisassembler::Success;
1850}
Akira Hatanaka71928e62012-04-17 18:03:21 +00001851
Jozef Kolekaa2b9272014-11-27 14:41:44 +00001852static DecodeStatus DecodeAddiur2Simm7(MCInst &Inst,
1853 unsigned Value,
1854 uint64_t Address,
1855 const void *Decoder) {
1856 if (Value == 0)
Jim Grosbache9119e42015-05-13 18:37:00 +00001857 Inst.addOperand(MCOperand::createImm(1));
Jozef Kolekaa2b9272014-11-27 14:41:44 +00001858 else if (Value == 0x7)
Jim Grosbache9119e42015-05-13 18:37:00 +00001859 Inst.addOperand(MCOperand::createImm(-1));
Jozef Kolekaa2b9272014-11-27 14:41:44 +00001860 else
Jim Grosbache9119e42015-05-13 18:37:00 +00001861 Inst.addOperand(MCOperand::createImm(Value << 2));
Jozef Kolekaa2b9272014-11-27 14:41:44 +00001862 return MCDisassembler::Success;
1863}
1864
1865static DecodeStatus DecodeUImm6Lsl2(MCInst &Inst,
1866 unsigned Value,
1867 uint64_t Address,
1868 const void *Decoder) {
Jim Grosbache9119e42015-05-13 18:37:00 +00001869 Inst.addOperand(MCOperand::createImm(Value << 2));
Jozef Kolekaa2b9272014-11-27 14:41:44 +00001870 return MCDisassembler::Success;
1871}
1872
1873static DecodeStatus DecodeLiSimm7(MCInst &Inst,
1874 unsigned Value,
1875 uint64_t Address,
1876 const void *Decoder) {
1877 if (Value == 0x7F)
Jim Grosbache9119e42015-05-13 18:37:00 +00001878 Inst.addOperand(MCOperand::createImm(-1));
Jozef Kolekaa2b9272014-11-27 14:41:44 +00001879 else
Jim Grosbache9119e42015-05-13 18:37:00 +00001880 Inst.addOperand(MCOperand::createImm(Value));
Jozef Kolekaa2b9272014-11-27 14:41:44 +00001881 return MCDisassembler::Success;
1882}
1883
Zoran Jovanovic6b28f092015-09-09 13:55:45 +00001884static DecodeStatus DecodePOOL16BEncodedField(MCInst &Inst,
1885 unsigned Value,
1886 uint64_t Address,
1887 const void *Decoder) {
1888 Inst.addOperand(MCOperand::createImm(Value == 0x0 ? 8 : Value));
1889 return MCDisassembler::Success;
1890}
1891
Jozef Kolekaa2b9272014-11-27 14:41:44 +00001892static DecodeStatus DecodeSimm4(MCInst &Inst,
1893 unsigned Value,
1894 uint64_t Address,
1895 const void *Decoder) {
Jim Grosbache9119e42015-05-13 18:37:00 +00001896 Inst.addOperand(MCOperand::createImm(SignExtend32<4>(Value)));
Jozef Kolekaa2b9272014-11-27 14:41:44 +00001897 return MCDisassembler::Success;
1898}
1899
Akira Hatanaka71928e62012-04-17 18:03:21 +00001900static DecodeStatus DecodeSimm16(MCInst &Inst,
1901 unsigned Insn,
1902 uint64_t Address,
1903 const void *Decoder) {
Jim Grosbache9119e42015-05-13 18:37:00 +00001904 Inst.addOperand(MCOperand::createImm(SignExtend32<16>(Insn)));
Akira Hatanaka71928e62012-04-17 18:03:21 +00001905 return MCDisassembler::Success;
1906}
1907
Daniel Sandersea4f6532015-11-06 12:22:31 +00001908template <unsigned Bits, int Offset>
1909static DecodeStatus DecodeUImmWithOffset(MCInst &Inst, unsigned Value,
1910 uint64_t Address,
1911 const void *Decoder) {
1912 Value &= ((1 << Bits) - 1);
1913 Inst.addOperand(MCOperand::createImm(Value + Offset));
Matheus Almeida779c5932013-11-18 12:32:49 +00001914 return MCDisassembler::Success;
1915}
1916
Akira Hatanaka71928e62012-04-17 18:03:21 +00001917static DecodeStatus DecodeInsSize(MCInst &Inst,
1918 unsigned Insn,
1919 uint64_t Address,
1920 const void *Decoder) {
1921 // First we need to grab the pos(lsb) from MCInst.
1922 int Pos = Inst.getOperand(2).getImm();
1923 int Size = (int) Insn - Pos + 1;
Jim Grosbache9119e42015-05-13 18:37:00 +00001924 Inst.addOperand(MCOperand::createImm(SignExtend32<16>(Size)));
Akira Hatanaka71928e62012-04-17 18:03:21 +00001925 return MCDisassembler::Success;
1926}
1927
1928static DecodeStatus DecodeExtSize(MCInst &Inst,
1929 unsigned Insn,
1930 uint64_t Address,
1931 const void *Decoder) {
1932 int Size = (int) Insn + 1;
Jim Grosbache9119e42015-05-13 18:37:00 +00001933 Inst.addOperand(MCOperand::createImm(SignExtend32<16>(Size)));
Akira Hatanaka71928e62012-04-17 18:03:21 +00001934 return MCDisassembler::Success;
1935}
Daniel Sandersb59e1a42014-05-15 10:45:58 +00001936
1937static DecodeStatus DecodeSimm19Lsl2(MCInst &Inst, unsigned Insn,
1938 uint64_t Address, const void *Decoder) {
Jim Grosbache9119e42015-05-13 18:37:00 +00001939 Inst.addOperand(MCOperand::createImm(SignExtend32<19>(Insn) * 4));
Daniel Sandersb59e1a42014-05-15 10:45:58 +00001940 return MCDisassembler::Success;
1941}
Zoran Jovanovic28551422014-06-09 09:49:51 +00001942
1943static DecodeStatus DecodeSimm18Lsl3(MCInst &Inst, unsigned Insn,
1944 uint64_t Address, const void *Decoder) {
Jim Grosbache9119e42015-05-13 18:37:00 +00001945 Inst.addOperand(MCOperand::createImm(SignExtend32<18>(Insn) * 8));
Zoran Jovanovic28551422014-06-09 09:49:51 +00001946 return MCDisassembler::Success;
1947}
Zoran Jovanovica4c4b5f2014-11-19 16:44:02 +00001948
Vladimir Medicb682ddf2014-12-01 11:12:04 +00001949static DecodeStatus DecodeSimm9SP(MCInst &Inst, unsigned Insn,
1950 uint64_t Address, const void *Decoder) {
1951 int32_t DecodedValue;
1952 switch (Insn) {
1953 case 0: DecodedValue = 256; break;
1954 case 1: DecodedValue = 257; break;
1955 case 510: DecodedValue = -258; break;
1956 case 511: DecodedValue = -257; break;
1957 default: DecodedValue = SignExtend32<9>(Insn); break;
1958 }
Jim Grosbache9119e42015-05-13 18:37:00 +00001959 Inst.addOperand(MCOperand::createImm(DecodedValue * 4));
Vladimir Medicb682ddf2014-12-01 11:12:04 +00001960 return MCDisassembler::Success;
1961}
1962
1963static DecodeStatus DecodeANDI16Imm(MCInst &Inst, unsigned Insn,
1964 uint64_t Address, const void *Decoder) {
1965 // Insn must be >= 0, since it is unsigned that condition is always true.
1966 assert(Insn < 16);
1967 int32_t DecodedValues[] = {128, 1, 2, 3, 4, 7, 8, 15, 16, 31, 32, 63, 64,
1968 255, 32768, 65535};
Jim Grosbache9119e42015-05-13 18:37:00 +00001969 Inst.addOperand(MCOperand::createImm(DecodedValues[Insn]));
Vladimir Medicb682ddf2014-12-01 11:12:04 +00001970 return MCDisassembler::Success;
1971}
1972
1973static DecodeStatus DecodeUImm5lsl2(MCInst &Inst, unsigned Insn,
1974 uint64_t Address, const void *Decoder) {
Jim Grosbache9119e42015-05-13 18:37:00 +00001975 Inst.addOperand(MCOperand::createImm(Insn << 2));
Vladimir Medicb682ddf2014-12-01 11:12:04 +00001976 return MCDisassembler::Success;
1977}
1978
Zoran Jovanovica4c4b5f2014-11-19 16:44:02 +00001979static DecodeStatus DecodeRegListOperand(MCInst &Inst,
1980 unsigned Insn,
1981 uint64_t Address,
1982 const void *Decoder) {
1983 unsigned Regs[] = {Mips::S0, Mips::S1, Mips::S2, Mips::S3, Mips::S4, Mips::S5,
Zoran Jovanovicdc4b8c22015-09-15 15:21:27 +00001984 Mips::S6, Mips::S7, Mips::FP};
Zoran Jovanovica4c4b5f2014-11-19 16:44:02 +00001985 unsigned RegNum;
1986
1987 unsigned RegLst = fieldFromInstruction(Insn, 21, 5);
Daniel Sandersdf19a5e2015-09-18 14:20:54 +00001988
Zoran Jovanovica4c4b5f2014-11-19 16:44:02 +00001989 // Empty register lists are not allowed.
1990 if (RegLst == 0)
1991 return MCDisassembler::Fail;
1992
1993 RegNum = RegLst & 0xf;
Daniel Sandersdf19a5e2015-09-18 14:20:54 +00001994
1995 // RegLst values 10-15, and 26-31 are reserved.
1996 if (RegNum > 9)
1997 return MCDisassembler::Fail;
1998
Zoran Jovanovica4c4b5f2014-11-19 16:44:02 +00001999 for (unsigned i = 0; i < RegNum; i++)
Jim Grosbache9119e42015-05-13 18:37:00 +00002000 Inst.addOperand(MCOperand::createReg(Regs[i]));
Zoran Jovanovica4c4b5f2014-11-19 16:44:02 +00002001
2002 if (RegLst & 0x10)
Jim Grosbache9119e42015-05-13 18:37:00 +00002003 Inst.addOperand(MCOperand::createReg(Mips::RA));
Zoran Jovanovica4c4b5f2014-11-19 16:44:02 +00002004
2005 return MCDisassembler::Success;
2006}
Zoran Jovanovicf9a02502014-11-27 18:28:59 +00002007
2008static DecodeStatus DecodeRegListOperand16(MCInst &Inst, unsigned Insn,
2009 uint64_t Address,
2010 const void *Decoder) {
2011 unsigned Regs[] = {Mips::S0, Mips::S1, Mips::S2, Mips::S3};
Zoran Jovanovicf9a02502014-11-27 18:28:59 +00002012 unsigned RegLst = fieldFromInstruction(Insn, 4, 2);
Jozef Kolekd68d424a2015-02-10 12:41:13 +00002013 unsigned RegNum = RegLst & 0x3;
Zoran Jovanovicf9a02502014-11-27 18:28:59 +00002014
Jozef Kolekd68d424a2015-02-10 12:41:13 +00002015 for (unsigned i = 0; i <= RegNum; i++)
Jim Grosbache9119e42015-05-13 18:37:00 +00002016 Inst.addOperand(MCOperand::createReg(Regs[i]));
Zoran Jovanovicf9a02502014-11-27 18:28:59 +00002017
Jim Grosbache9119e42015-05-13 18:37:00 +00002018 Inst.addOperand(MCOperand::createReg(Mips::RA));
Zoran Jovanovicf9a02502014-11-27 18:28:59 +00002019
2020 return MCDisassembler::Success;
2021}
Jozef Kolek2c6d7322015-01-21 12:10:11 +00002022
Zoran Jovanovic41688672015-02-10 16:36:20 +00002023static DecodeStatus DecodeMovePRegPair(MCInst &Inst, unsigned Insn,
2024 uint64_t Address, const void *Decoder) {
2025
2026 unsigned RegPair = fieldFromInstruction(Insn, 7, 3);
2027
2028 switch (RegPair) {
2029 default:
2030 return MCDisassembler::Fail;
2031 case 0:
Jim Grosbache9119e42015-05-13 18:37:00 +00002032 Inst.addOperand(MCOperand::createReg(Mips::A1));
2033 Inst.addOperand(MCOperand::createReg(Mips::A2));
Zoran Jovanovic41688672015-02-10 16:36:20 +00002034 break;
2035 case 1:
Jim Grosbache9119e42015-05-13 18:37:00 +00002036 Inst.addOperand(MCOperand::createReg(Mips::A1));
2037 Inst.addOperand(MCOperand::createReg(Mips::A3));
Zoran Jovanovic41688672015-02-10 16:36:20 +00002038 break;
2039 case 2:
Jim Grosbache9119e42015-05-13 18:37:00 +00002040 Inst.addOperand(MCOperand::createReg(Mips::A2));
2041 Inst.addOperand(MCOperand::createReg(Mips::A3));
Zoran Jovanovic41688672015-02-10 16:36:20 +00002042 break;
2043 case 3:
Jim Grosbache9119e42015-05-13 18:37:00 +00002044 Inst.addOperand(MCOperand::createReg(Mips::A0));
2045 Inst.addOperand(MCOperand::createReg(Mips::S5));
Zoran Jovanovic41688672015-02-10 16:36:20 +00002046 break;
2047 case 4:
Jim Grosbache9119e42015-05-13 18:37:00 +00002048 Inst.addOperand(MCOperand::createReg(Mips::A0));
2049 Inst.addOperand(MCOperand::createReg(Mips::S6));
Zoran Jovanovic41688672015-02-10 16:36:20 +00002050 break;
2051 case 5:
Jim Grosbache9119e42015-05-13 18:37:00 +00002052 Inst.addOperand(MCOperand::createReg(Mips::A0));
2053 Inst.addOperand(MCOperand::createReg(Mips::A1));
Zoran Jovanovic41688672015-02-10 16:36:20 +00002054 break;
2055 case 6:
Jim Grosbache9119e42015-05-13 18:37:00 +00002056 Inst.addOperand(MCOperand::createReg(Mips::A0));
2057 Inst.addOperand(MCOperand::createReg(Mips::A2));
Zoran Jovanovic41688672015-02-10 16:36:20 +00002058 break;
2059 case 7:
Jim Grosbache9119e42015-05-13 18:37:00 +00002060 Inst.addOperand(MCOperand::createReg(Mips::A0));
2061 Inst.addOperand(MCOperand::createReg(Mips::A3));
Zoran Jovanovic41688672015-02-10 16:36:20 +00002062 break;
2063 }
2064
2065 return MCDisassembler::Success;
2066}
2067
Jozef Kolek2c6d7322015-01-21 12:10:11 +00002068static DecodeStatus DecodeSimm23Lsl2(MCInst &Inst, unsigned Insn,
2069 uint64_t Address, const void *Decoder) {
Justin Bogner6499b5f2015-06-23 07:28:57 +00002070 Inst.addOperand(MCOperand::createImm(SignExtend32<25>(Insn << 2)));
Jozef Kolek2c6d7322015-01-21 12:10:11 +00002071 return MCDisassembler::Success;
2072}