blob: 1177c3fa1e6368e1c805d340b5d290e9a6887f6e [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 Sanders92db6b72014-10-01 08:26:55 +0000244static DecodeStatus DecodeCacheOp(MCInst &Inst,
245 unsigned Insn,
246 uint64_t Address,
247 const void *Decoder);
248
Vladimir Medicdf464ae2015-01-29 11:33:41 +0000249static DecodeStatus DecodeCacheOpR6(MCInst &Inst,
250 unsigned Insn,
251 uint64_t Address,
252 const void *Decoder);
253
Jozef Kolekab6d1cc2014-12-23 19:55:34 +0000254static DecodeStatus DecodeCacheOpMM(MCInst &Inst,
255 unsigned Insn,
256 uint64_t Address,
257 const void *Decoder);
258
Zoran Jovanovic9eaa30d2015-09-08 10:18:38 +0000259static DecodeStatus DecodeStoreEvaOpMM(MCInst &Inst,
260 unsigned Insn,
261 uint64_t Address,
262 const void *Decoder);
263
Zoran Jovanovicd9790792015-09-09 09:10:46 +0000264static DecodeStatus DecodePrefeOpMM(MCInst &Inst,
265 unsigned Insn,
266 uint64_t Address,
267 const void *Decoder);
268
Daniel Sandersb4484d62014-11-27 17:28:10 +0000269static DecodeStatus DecodeSyncI(MCInst &Inst,
270 unsigned Insn,
271 uint64_t Address,
272 const void *Decoder);
273
Matheus Almeidafe0bf9f2013-10-21 13:07:13 +0000274static DecodeStatus DecodeMSA128Mem(MCInst &Inst, unsigned Insn,
275 uint64_t Address, const void *Decoder);
276
Jozef Kolek315e7ec2014-11-26 18:56:38 +0000277static DecodeStatus DecodeMemMMImm4(MCInst &Inst,
278 unsigned Insn,
279 uint64_t Address,
280 const void *Decoder);
281
Jozef Kolek12c69822014-12-23 16:16:33 +0000282static DecodeStatus DecodeMemMMSPImm5Lsl2(MCInst &Inst,
283 unsigned Insn,
284 uint64_t Address,
285 const void *Decoder);
286
Jozef Koleke10a02e2015-01-28 17:27:26 +0000287static DecodeStatus DecodeMemMMGPImm7Lsl2(MCInst &Inst,
288 unsigned Insn,
289 uint64_t Address,
290 const void *Decoder);
291
Jozef Kolekd68d424a2015-02-10 12:41:13 +0000292static DecodeStatus DecodeMemMMReglistImm4Lsl2(MCInst &Inst,
293 unsigned Insn,
294 uint64_t Address,
295 const void *Decoder);
296
Zoran Jovanovica6593ff2015-08-18 12:53:08 +0000297static DecodeStatus DecodeMemMMImm9(MCInst &Inst,
298 unsigned Insn,
299 uint64_t Address,
300 const void *Decoder);
301
Vladimir Medicdde3d582013-09-06 12:30:36 +0000302static DecodeStatus DecodeMemMMImm12(MCInst &Inst,
303 unsigned Insn,
304 uint64_t Address,
305 const void *Decoder);
306
307static DecodeStatus DecodeMemMMImm16(MCInst &Inst,
308 unsigned Insn,
309 uint64_t Address,
310 const void *Decoder);
311
Akira Hatanaka71928e62012-04-17 18:03:21 +0000312static DecodeStatus DecodeFMem(MCInst &Inst, unsigned Insn,
313 uint64_t Address,
314 const void *Decoder);
315
Daniel Sanders92db6b72014-10-01 08:26:55 +0000316static DecodeStatus DecodeFMem2(MCInst &Inst, unsigned Insn,
317 uint64_t Address,
318 const void *Decoder);
319
320static DecodeStatus DecodeFMem3(MCInst &Inst, unsigned Insn,
321 uint64_t Address,
322 const void *Decoder);
323
Vladimir Medic435cf8a2015-01-21 10:47:36 +0000324static DecodeStatus DecodeFMemCop2R6(MCInst &Inst, unsigned Insn,
325 uint64_t Address,
326 const void *Decoder);
327
Daniel Sanders6a803f62014-06-16 13:13:03 +0000328static DecodeStatus DecodeSpecial3LlSc(MCInst &Inst,
329 unsigned Insn,
330 uint64_t Address,
331 const void *Decoder);
332
Jozef Kolekaa2b9272014-11-27 14:41:44 +0000333static DecodeStatus DecodeAddiur2Simm7(MCInst &Inst,
334 unsigned Value,
335 uint64_t Address,
336 const void *Decoder);
337
338static DecodeStatus DecodeUImm6Lsl2(MCInst &Inst,
339 unsigned Value,
340 uint64_t Address,
341 const void *Decoder);
342
343static DecodeStatus DecodeLiSimm7(MCInst &Inst,
344 unsigned Value,
345 uint64_t Address,
346 const void *Decoder);
347
Zoran Jovanovic6b28f092015-09-09 13:55:45 +0000348static DecodeStatus DecodePOOL16BEncodedField(MCInst &Inst,
349 unsigned Value,
350 uint64_t Address,
351 const void *Decoder);
352
Jozef Kolekaa2b9272014-11-27 14:41:44 +0000353static DecodeStatus DecodeSimm4(MCInst &Inst,
354 unsigned Value,
355 uint64_t Address,
356 const void *Decoder);
357
Akira Hatanaka71928e62012-04-17 18:03:21 +0000358static DecodeStatus DecodeSimm16(MCInst &Inst,
359 unsigned Insn,
360 uint64_t Address,
361 const void *Decoder);
362
Matheus Almeida779c5932013-11-18 12:32:49 +0000363// Decode the immediate field of an LSA instruction which
364// is off by one.
365static DecodeStatus DecodeLSAImm(MCInst &Inst,
366 unsigned Insn,
367 uint64_t Address,
368 const void *Decoder);
369
Akira Hatanaka71928e62012-04-17 18:03:21 +0000370static DecodeStatus DecodeInsSize(MCInst &Inst,
371 unsigned Insn,
372 uint64_t Address,
373 const void *Decoder);
374
375static DecodeStatus DecodeExtSize(MCInst &Inst,
376 unsigned Insn,
377 uint64_t Address,
378 const void *Decoder);
379
Daniel Sandersb59e1a42014-05-15 10:45:58 +0000380static DecodeStatus DecodeSimm19Lsl2(MCInst &Inst, unsigned Insn,
381 uint64_t Address, const void *Decoder);
382
Zoran Jovanovic28551422014-06-09 09:49:51 +0000383static DecodeStatus DecodeSimm18Lsl3(MCInst &Inst, unsigned Insn,
384 uint64_t Address, const void *Decoder);
385
Vladimir Medicb682ddf2014-12-01 11:12:04 +0000386static DecodeStatus DecodeSimm9SP(MCInst &Inst, unsigned Insn,
387 uint64_t Address, const void *Decoder);
388
389static DecodeStatus DecodeANDI16Imm(MCInst &Inst, unsigned Insn,
390 uint64_t Address, const void *Decoder);
391
392static DecodeStatus DecodeUImm5lsl2(MCInst &Inst, unsigned Insn,
393 uint64_t Address, const void *Decoder);
394
Jozef Kolek2c6d7322015-01-21 12:10:11 +0000395static DecodeStatus DecodeSimm23Lsl2(MCInst &Inst, unsigned Insn,
396 uint64_t Address, const void *Decoder);
397
Daniel Sandersb50ccf82014-04-01 10:35:28 +0000398/// INSVE_[BHWD] have an implicit operand that the generated decoder doesn't
399/// handle.
400template <typename InsnType>
401static DecodeStatus DecodeINSVE_DF(MCInst &MI, InsnType insn, uint64_t Address,
402 const void *Decoder);
Daniel Sanders5c582b22014-05-22 11:23:21 +0000403
404template <typename InsnType>
405static DecodeStatus
406DecodeAddiGroupBranch(MCInst &MI, InsnType insn, uint64_t Address,
407 const void *Decoder);
408
409template <typename InsnType>
410static DecodeStatus
411DecodeDaddiGroupBranch(MCInst &MI, InsnType insn, uint64_t Address,
412 const void *Decoder);
413
414template <typename InsnType>
415static DecodeStatus
416DecodeBlezlGroupBranch(MCInst &MI, InsnType insn, uint64_t Address,
417 const void *Decoder);
418
419template <typename InsnType>
420static DecodeStatus
421DecodeBgtzlGroupBranch(MCInst &MI, InsnType insn, uint64_t Address,
422 const void *Decoder);
423
424template <typename InsnType>
425static DecodeStatus
426DecodeBgtzGroupBranch(MCInst &MI, InsnType insn, uint64_t Address,
427 const void *Decoder);
428
Zoran Jovanovic28a0ca02014-06-12 11:47:44 +0000429template <typename InsnType>
430static DecodeStatus
431DecodeBlezGroupBranch(MCInst &MI, InsnType insn, uint64_t Address,
432 const void *Decoder);
433
Zoran Jovanovica4c4b5f2014-11-19 16:44:02 +0000434static DecodeStatus DecodeRegListOperand(MCInst &Inst, unsigned Insn,
435 uint64_t Address,
436 const void *Decoder);
437
Zoran Jovanovicf9a02502014-11-27 18:28:59 +0000438static DecodeStatus DecodeRegListOperand16(MCInst &Inst, unsigned Insn,
439 uint64_t Address,
440 const void *Decoder);
441
Zoran Jovanovic41688672015-02-10 16:36:20 +0000442static DecodeStatus DecodeMovePRegPair(MCInst &Inst, unsigned Insn,
443 uint64_t Address,
444 const void *Decoder);
445
Akira Hatanaka71928e62012-04-17 18:03:21 +0000446namespace llvm {
447extern Target TheMipselTarget, TheMipsTarget, TheMips64Target,
448 TheMips64elTarget;
449}
450
451static MCDisassembler *createMipsDisassembler(
452 const Target &T,
Lang Hamesa1bc0f52014-04-15 04:40:56 +0000453 const MCSubtargetInfo &STI,
454 MCContext &Ctx) {
455 return new MipsDisassembler(STI, Ctx, true);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000456}
457
458static MCDisassembler *createMipselDisassembler(
459 const Target &T,
Lang Hamesa1bc0f52014-04-15 04:40:56 +0000460 const MCSubtargetInfo &STI,
461 MCContext &Ctx) {
462 return new MipsDisassembler(STI, Ctx, false);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000463}
464
Akira Hatanaka71928e62012-04-17 18:03:21 +0000465extern "C" void LLVMInitializeMipsDisassembler() {
466 // Register the disassembler.
467 TargetRegistry::RegisterMCDisassembler(TheMipsTarget,
468 createMipsDisassembler);
469 TargetRegistry::RegisterMCDisassembler(TheMipselTarget,
470 createMipselDisassembler);
471 TargetRegistry::RegisterMCDisassembler(TheMips64Target,
Daniel Sandersa19216c2015-02-11 11:28:56 +0000472 createMipsDisassembler);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000473 TargetRegistry::RegisterMCDisassembler(TheMips64elTarget,
Daniel Sandersa19216c2015-02-11 11:28:56 +0000474 createMipselDisassembler);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000475}
476
Akira Hatanaka71928e62012-04-17 18:03:21 +0000477#include "MipsGenDisassemblerTables.inc"
478
Daniel Sanders5c582b22014-05-22 11:23:21 +0000479static unsigned getReg(const void *D, unsigned RC, unsigned RegNo) {
Daniel Sandersa19216c2015-02-11 11:28:56 +0000480 const MipsDisassembler *Dis = static_cast<const MipsDisassembler*>(D);
Daniel Sanders5c582b22014-05-22 11:23:21 +0000481 const MCRegisterInfo *RegInfo = Dis->getContext().getRegisterInfo();
482 return *(RegInfo->getRegClass(RC).begin() + RegNo);
483}
484
Daniel Sandersb50ccf82014-04-01 10:35:28 +0000485template <typename InsnType>
486static DecodeStatus DecodeINSVE_DF(MCInst &MI, InsnType insn, uint64_t Address,
487 const void *Decoder) {
488 typedef DecodeStatus (*DecodeFN)(MCInst &, unsigned, uint64_t, const void *);
489 // The size of the n field depends on the element size
490 // The register class also depends on this.
491 InsnType tmp = fieldFromInstruction(insn, 17, 5);
492 unsigned NSize = 0;
493 DecodeFN RegDecoder = nullptr;
494 if ((tmp & 0x18) == 0x00) { // INSVE_B
495 NSize = 4;
496 RegDecoder = DecodeMSA128BRegisterClass;
497 } else if ((tmp & 0x1c) == 0x10) { // INSVE_H
498 NSize = 3;
499 RegDecoder = DecodeMSA128HRegisterClass;
500 } else if ((tmp & 0x1e) == 0x18) { // INSVE_W
501 NSize = 2;
502 RegDecoder = DecodeMSA128WRegisterClass;
503 } else if ((tmp & 0x1f) == 0x1c) { // INSVE_D
504 NSize = 1;
505 RegDecoder = DecodeMSA128DRegisterClass;
506 } else
507 llvm_unreachable("Invalid encoding");
508
509 assert(NSize != 0 && RegDecoder != nullptr);
510
511 // $wd
512 tmp = fieldFromInstruction(insn, 6, 5);
513 if (RegDecoder(MI, tmp, Address, Decoder) == MCDisassembler::Fail)
514 return MCDisassembler::Fail;
515 // $wd_in
516 if (RegDecoder(MI, tmp, Address, Decoder) == MCDisassembler::Fail)
517 return MCDisassembler::Fail;
518 // $n
519 tmp = fieldFromInstruction(insn, 16, NSize);
Jim Grosbache9119e42015-05-13 18:37:00 +0000520 MI.addOperand(MCOperand::createImm(tmp));
Daniel Sandersb50ccf82014-04-01 10:35:28 +0000521 // $ws
522 tmp = fieldFromInstruction(insn, 11, 5);
523 if (RegDecoder(MI, tmp, Address, Decoder) == MCDisassembler::Fail)
524 return MCDisassembler::Fail;
525 // $n2
Jim Grosbache9119e42015-05-13 18:37:00 +0000526 MI.addOperand(MCOperand::createImm(0));
Daniel Sandersb50ccf82014-04-01 10:35:28 +0000527
528 return MCDisassembler::Success;
529}
530
Daniel Sanders5c582b22014-05-22 11:23:21 +0000531template <typename InsnType>
532static DecodeStatus DecodeAddiGroupBranch(MCInst &MI, InsnType insn,
533 uint64_t Address,
534 const void *Decoder) {
535 // If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled
536 // (otherwise we would have matched the ADDI instruction from the earlier
537 // ISA's instead).
538 //
539 // We have:
540 // 0b001000 sssss ttttt iiiiiiiiiiiiiiii
541 // BOVC if rs >= rt
542 // BEQZALC if rs == 0 && rt != 0
543 // BEQC if rs < rt && rs != 0
544
545 InsnType Rs = fieldFromInstruction(insn, 21, 5);
546 InsnType Rt = fieldFromInstruction(insn, 16, 5);
Alexey Samsonovd37bab62014-09-02 17:49:16 +0000547 InsnType Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4;
Daniel Sanders5c582b22014-05-22 11:23:21 +0000548 bool HasRs = false;
549
550 if (Rs >= Rt) {
551 MI.setOpcode(Mips::BOVC);
552 HasRs = true;
553 } else if (Rs != 0 && Rs < Rt) {
554 MI.setOpcode(Mips::BEQC);
555 HasRs = true;
556 } else
557 MI.setOpcode(Mips::BEQZALC);
558
559 if (HasRs)
Jim Grosbache9119e42015-05-13 18:37:00 +0000560 MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
Daniel Sanders5c582b22014-05-22 11:23:21 +0000561 Rs)));
562
Jim Grosbache9119e42015-05-13 18:37:00 +0000563 MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
Daniel Sanders5c582b22014-05-22 11:23:21 +0000564 Rt)));
Jim Grosbache9119e42015-05-13 18:37:00 +0000565 MI.addOperand(MCOperand::createImm(Imm));
Daniel Sanders5c582b22014-05-22 11:23:21 +0000566
567 return MCDisassembler::Success;
568}
569
570template <typename InsnType>
571static DecodeStatus DecodeDaddiGroupBranch(MCInst &MI, InsnType insn,
572 uint64_t Address,
573 const void *Decoder) {
574 // If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled
575 // (otherwise we would have matched the ADDI instruction from the earlier
576 // ISA's instead).
577 //
578 // We have:
579 // 0b011000 sssss ttttt iiiiiiiiiiiiiiii
580 // BNVC if rs >= rt
581 // BNEZALC if rs == 0 && rt != 0
582 // BNEC if rs < rt && rs != 0
583
584 InsnType Rs = fieldFromInstruction(insn, 21, 5);
585 InsnType Rt = fieldFromInstruction(insn, 16, 5);
Alexey Samsonovd37bab62014-09-02 17:49:16 +0000586 InsnType Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4;
Daniel Sanders5c582b22014-05-22 11:23:21 +0000587 bool HasRs = false;
588
589 if (Rs >= Rt) {
590 MI.setOpcode(Mips::BNVC);
591 HasRs = true;
592 } else if (Rs != 0 && Rs < Rt) {
593 MI.setOpcode(Mips::BNEC);
594 HasRs = true;
595 } else
596 MI.setOpcode(Mips::BNEZALC);
597
598 if (HasRs)
Jim Grosbache9119e42015-05-13 18:37:00 +0000599 MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
Daniel Sanders5c582b22014-05-22 11:23:21 +0000600 Rs)));
601
Jim Grosbache9119e42015-05-13 18:37:00 +0000602 MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
Daniel Sanders5c582b22014-05-22 11:23:21 +0000603 Rt)));
Jim Grosbache9119e42015-05-13 18:37:00 +0000604 MI.addOperand(MCOperand::createImm(Imm));
Daniel Sanders5c582b22014-05-22 11:23:21 +0000605
606 return MCDisassembler::Success;
607}
608
609template <typename InsnType>
610static DecodeStatus DecodeBlezlGroupBranch(MCInst &MI, InsnType insn,
611 uint64_t Address,
612 const void *Decoder) {
613 // If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled
614 // (otherwise we would have matched the BLEZL instruction from the earlier
615 // ISA's instead).
616 //
617 // We have:
618 // 0b010110 sssss ttttt iiiiiiiiiiiiiiii
619 // Invalid if rs == 0
620 // BLEZC if rs == 0 && rt != 0
621 // BGEZC if rs == rt && rt != 0
622 // BGEC if rs != rt && rs != 0 && rt != 0
623
624 InsnType Rs = fieldFromInstruction(insn, 21, 5);
625 InsnType Rt = fieldFromInstruction(insn, 16, 5);
Alexey Samsonovd37bab62014-09-02 17:49:16 +0000626 InsnType Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4;
Zoran Jovanovic28a0ca02014-06-12 11:47:44 +0000627 bool HasRs = false;
Daniel Sanders5c582b22014-05-22 11:23:21 +0000628
629 if (Rt == 0)
630 return MCDisassembler::Fail;
631 else if (Rs == 0)
632 MI.setOpcode(Mips::BLEZC);
633 else if (Rs == Rt)
634 MI.setOpcode(Mips::BGEZC);
Zoran Jovanovic28a0ca02014-06-12 11:47:44 +0000635 else {
636 HasRs = true;
637 MI.setOpcode(Mips::BGEC);
638 }
639
640 if (HasRs)
Jim Grosbache9119e42015-05-13 18:37:00 +0000641 MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
Zoran Jovanovic28a0ca02014-06-12 11:47:44 +0000642 Rs)));
Daniel Sanders5c582b22014-05-22 11:23:21 +0000643
Jim Grosbache9119e42015-05-13 18:37:00 +0000644 MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
Daniel Sanders5c582b22014-05-22 11:23:21 +0000645 Rt)));
646
Jim Grosbache9119e42015-05-13 18:37:00 +0000647 MI.addOperand(MCOperand::createImm(Imm));
Daniel Sanders5c582b22014-05-22 11:23:21 +0000648
649 return MCDisassembler::Success;
650}
651
652template <typename InsnType>
653static DecodeStatus DecodeBgtzlGroupBranch(MCInst &MI, InsnType insn,
654 uint64_t Address,
655 const void *Decoder) {
656 // If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled
657 // (otherwise we would have matched the BGTZL instruction from the earlier
658 // ISA's instead).
659 //
660 // We have:
661 // 0b010111 sssss ttttt iiiiiiiiiiiiiiii
662 // Invalid if rs == 0
663 // BGTZC if rs == 0 && rt != 0
664 // BLTZC if rs == rt && rt != 0
665 // BLTC if rs != rt && rs != 0 && rt != 0
666
Zoran Jovanovic5c14b062014-06-18 14:36:00 +0000667 bool HasRs = false;
668
Daniel Sanders5c582b22014-05-22 11:23:21 +0000669 InsnType Rs = fieldFromInstruction(insn, 21, 5);
670 InsnType Rt = fieldFromInstruction(insn, 16, 5);
Alexey Samsonovd37bab62014-09-02 17:49:16 +0000671 InsnType Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4;
Daniel Sanders5c582b22014-05-22 11:23:21 +0000672
673 if (Rt == 0)
674 return MCDisassembler::Fail;
675 else if (Rs == 0)
676 MI.setOpcode(Mips::BGTZC);
677 else if (Rs == Rt)
678 MI.setOpcode(Mips::BLTZC);
Zoran Jovanovic5c14b062014-06-18 14:36:00 +0000679 else {
680 MI.setOpcode(Mips::BLTC);
681 HasRs = true;
682 }
683
684 if (HasRs)
Jim Grosbache9119e42015-05-13 18:37:00 +0000685 MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
Zoran Jovanovic5c14b062014-06-18 14:36:00 +0000686 Rs)));
Daniel Sanders5c582b22014-05-22 11:23:21 +0000687
Jim Grosbache9119e42015-05-13 18:37:00 +0000688 MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
Daniel Sanders5c582b22014-05-22 11:23:21 +0000689 Rt)));
690
Jim Grosbache9119e42015-05-13 18:37:00 +0000691 MI.addOperand(MCOperand::createImm(Imm));
Daniel Sanders5c582b22014-05-22 11:23:21 +0000692
693 return MCDisassembler::Success;
694}
695
696template <typename InsnType>
697static DecodeStatus DecodeBgtzGroupBranch(MCInst &MI, InsnType insn,
698 uint64_t Address,
699 const void *Decoder) {
700 // If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled
701 // (otherwise we would have matched the BGTZ instruction from the earlier
702 // ISA's instead).
703 //
704 // We have:
705 // 0b000111 sssss ttttt iiiiiiiiiiiiiiii
706 // BGTZ if rt == 0
707 // BGTZALC if rs == 0 && rt != 0
708 // BLTZALC if rs != 0 && rs == rt
709 // BLTUC if rs != 0 && rs != rt
710
711 InsnType Rs = fieldFromInstruction(insn, 21, 5);
712 InsnType Rt = fieldFromInstruction(insn, 16, 5);
Alexey Samsonovd37bab62014-09-02 17:49:16 +0000713 InsnType Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4;
Daniel Sanders5c582b22014-05-22 11:23:21 +0000714 bool HasRs = false;
715 bool HasRt = false;
716
717 if (Rt == 0) {
718 MI.setOpcode(Mips::BGTZ);
719 HasRs = true;
720 } else if (Rs == 0) {
721 MI.setOpcode(Mips::BGTZALC);
722 HasRt = true;
723 } else if (Rs == Rt) {
724 MI.setOpcode(Mips::BLTZALC);
725 HasRs = true;
Zoran Jovanovic5c14b062014-06-18 14:36:00 +0000726 } else {
727 MI.setOpcode(Mips::BLTUC);
728 HasRs = true;
729 HasRt = true;
730 }
Daniel Sanders5c582b22014-05-22 11:23:21 +0000731
732 if (HasRs)
Jim Grosbache9119e42015-05-13 18:37:00 +0000733 MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
Daniel Sanders5c582b22014-05-22 11:23:21 +0000734 Rs)));
735
736 if (HasRt)
Jim Grosbache9119e42015-05-13 18:37:00 +0000737 MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
Daniel Sanders5c582b22014-05-22 11:23:21 +0000738 Rt)));
739
Jim Grosbache9119e42015-05-13 18:37:00 +0000740 MI.addOperand(MCOperand::createImm(Imm));
Daniel Sanders5c582b22014-05-22 11:23:21 +0000741
742 return MCDisassembler::Success;
743}
744
Zoran Jovanovic28a0ca02014-06-12 11:47:44 +0000745template <typename InsnType>
746static DecodeStatus DecodeBlezGroupBranch(MCInst &MI, InsnType insn,
747 uint64_t Address,
748 const void *Decoder) {
749 // If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled
750 // (otherwise we would have matched the BLEZL instruction from the earlier
751 // ISA's instead).
752 //
753 // We have:
754 // 0b000110 sssss ttttt iiiiiiiiiiiiiiii
755 // Invalid if rs == 0
756 // BLEZALC if rs == 0 && rt != 0
757 // BGEZALC if rs == rt && rt != 0
758 // BGEUC if rs != rt && rs != 0 && rt != 0
759
760 InsnType Rs = fieldFromInstruction(insn, 21, 5);
761 InsnType Rt = fieldFromInstruction(insn, 16, 5);
Alexey Samsonovd37bab62014-09-02 17:49:16 +0000762 InsnType Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4;
Zoran Jovanovic28a0ca02014-06-12 11:47:44 +0000763 bool HasRs = false;
764
765 if (Rt == 0)
766 return MCDisassembler::Fail;
767 else if (Rs == 0)
768 MI.setOpcode(Mips::BLEZALC);
769 else if (Rs == Rt)
770 MI.setOpcode(Mips::BGEZALC);
771 else {
772 HasRs = true;
773 MI.setOpcode(Mips::BGEUC);
774 }
775
776 if (HasRs)
Jim Grosbache9119e42015-05-13 18:37:00 +0000777 MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
Zoran Jovanovic28a0ca02014-06-12 11:47:44 +0000778 Rs)));
Jim Grosbache9119e42015-05-13 18:37:00 +0000779 MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
Zoran Jovanovic28a0ca02014-06-12 11:47:44 +0000780 Rt)));
781
Jim Grosbache9119e42015-05-13 18:37:00 +0000782 MI.addOperand(MCOperand::createImm(Imm));
Zoran Jovanovic28a0ca02014-06-12 11:47:44 +0000783
784 return MCDisassembler::Success;
785}
786
Jozef Kolekea22c4c2014-11-24 13:29:59 +0000787/// Read two bytes from the ArrayRef and return 16 bit halfword sorted
788/// according to the given endianess.
789static DecodeStatus readInstruction16(ArrayRef<uint8_t> Bytes, uint64_t Address,
790 uint64_t &Size, uint32_t &Insn,
791 bool IsBigEndian) {
792 // We want to read exactly 2 Bytes of data.
793 if (Bytes.size() < 2) {
794 Size = 0;
795 return MCDisassembler::Fail;
796 }
797
798 if (IsBigEndian) {
799 Insn = (Bytes[0] << 8) | Bytes[1];
800 } else {
801 Insn = (Bytes[1] << 8) | Bytes[0];
802 }
803
804 return MCDisassembler::Success;
805}
806
Rafael Espindola7fc5b872014-11-12 02:04:27 +0000807/// Read four bytes from the ArrayRef and return 32 bit word sorted
Rafael Espindola4aa6bea2014-11-10 18:11:10 +0000808/// according to the given endianess
Rafael Espindola7fc5b872014-11-12 02:04:27 +0000809static DecodeStatus readInstruction32(ArrayRef<uint8_t> Bytes, uint64_t Address,
810 uint64_t &Size, uint32_t &Insn,
811 bool IsBigEndian, bool IsMicroMips) {
Akira Hatanaka71928e62012-04-17 18:03:21 +0000812 // We want to read exactly 4 Bytes of data.
Rafael Espindola7fc5b872014-11-12 02:04:27 +0000813 if (Bytes.size() < 4) {
Rafael Espindola4aa6bea2014-11-10 18:11:10 +0000814 Size = 0;
Akira Hatanaka71928e62012-04-17 18:03:21 +0000815 return MCDisassembler::Fail;
816 }
817
Jozef Kolekea22c4c2014-11-24 13:29:59 +0000818 // High 16 bits of a 32-bit microMIPS instruction (where the opcode is)
819 // always precede the low 16 bits in the instruction stream (that is, they
820 // are placed at lower addresses in the instruction stream).
821 //
822 // microMIPS byte ordering:
823 // Big-endian: 0 | 1 | 2 | 3
824 // Little-endian: 1 | 0 | 3 | 2
825
Rafael Espindola4aa6bea2014-11-10 18:11:10 +0000826 if (IsBigEndian) {
Akira Hatanaka71928e62012-04-17 18:03:21 +0000827 // Encoded as a big-endian 32-bit word in the stream.
Rafael Espindola4aa6bea2014-11-10 18:11:10 +0000828 Insn =
829 (Bytes[3] << 0) | (Bytes[2] << 8) | (Bytes[1] << 16) | (Bytes[0] << 24);
830 } else {
Vladimir Medicdde3d582013-09-06 12:30:36 +0000831 if (IsMicroMips) {
Rafael Espindola4aa6bea2014-11-10 18:11:10 +0000832 Insn = (Bytes[2] << 0) | (Bytes[3] << 8) | (Bytes[0] << 16) |
Vladimir Medicdde3d582013-09-06 12:30:36 +0000833 (Bytes[1] << 24);
834 } else {
Rafael Espindola4aa6bea2014-11-10 18:11:10 +0000835 Insn = (Bytes[0] << 0) | (Bytes[1] << 8) | (Bytes[2] << 16) |
Vladimir Medicdde3d582013-09-06 12:30:36 +0000836 (Bytes[3] << 24);
837 }
Akira Hatanaka71928e62012-04-17 18:03:21 +0000838 }
839
840 return MCDisassembler::Success;
841}
842
Rafael Espindola4aa6bea2014-11-10 18:11:10 +0000843DecodeStatus MipsDisassembler::getInstruction(MCInst &Instr, uint64_t &Size,
Rafael Espindola7fc5b872014-11-12 02:04:27 +0000844 ArrayRef<uint8_t> Bytes,
Rafael Espindola4aa6bea2014-11-10 18:11:10 +0000845 uint64_t Address,
846 raw_ostream &VStream,
847 raw_ostream &CStream) const {
Akira Hatanaka71928e62012-04-17 18:03:21 +0000848 uint32_t Insn;
Jozef Kolekea22c4c2014-11-24 13:29:59 +0000849 DecodeStatus Result;
Akira Hatanaka71928e62012-04-17 18:03:21 +0000850
Vladimir Medicdde3d582013-09-06 12:30:36 +0000851 if (IsMicroMips) {
Jozef Kolekea22c4c2014-11-24 13:29:59 +0000852 Result = readInstruction16(Bytes, Address, Size, Insn, IsBigEndian);
853
Zoran Jovanovicada70912015-09-07 11:56:37 +0000854 if (hasMips32r6()) {
855 DEBUG(dbgs() << "Trying MicroMipsR616 table (16-bit instructions):\n");
856 // Calling the auto-generated decoder function for microMIPS32R6
857 // (and microMIPS64R6) 16-bit instructions.
858 Result = decodeInstruction(DecoderTableMicroMipsR616, Instr, Insn,
859 Address, this, STI);
860 if (Result != MCDisassembler::Fail) {
861 Size = 2;
862 return Result;
863 }
864 }
865
Jozef Kolekea22c4c2014-11-24 13:29:59 +0000866 DEBUG(dbgs() << "Trying MicroMips16 table (16-bit instructions):\n");
Zoran Jovanovicada70912015-09-07 11:56:37 +0000867 // Calling the auto-generated decoder function for microMIPS 16-bit
868 // instructions.
Jozef Kolekea22c4c2014-11-24 13:29:59 +0000869 Result = decodeInstruction(DecoderTableMicroMips16, Instr, Insn, Address,
870 this, STI);
871 if (Result != MCDisassembler::Fail) {
872 Size = 2;
873 return Result;
874 }
875
876 Result = readInstruction32(Bytes, Address, Size, Insn, IsBigEndian, true);
877 if (Result == MCDisassembler::Fail)
878 return MCDisassembler::Fail;
879
Jozef Kolek676d6012015-04-20 14:40:38 +0000880 if (hasMips32r6()) {
881 DEBUG(dbgs() << "Trying MicroMips32r632 table (32-bit instructions):\n");
882 // Calling the auto-generated decoder function.
Zoran Jovanovic366783e2015-08-12 12:45:16 +0000883 Result = decodeInstruction(DecoderTableMicroMipsR632, Instr, Insn, Address,
Jozef Kolek676d6012015-04-20 14:40:38 +0000884 this, STI);
Zoran Jovanovicada70912015-09-07 11:56:37 +0000885 if (Result != MCDisassembler::Fail) {
886 Size = 4;
887 return Result;
888 }
Jozef Kolek676d6012015-04-20 14:40:38 +0000889 }
Zoran Jovanovic366783e2015-08-12 12:45:16 +0000890
Zoran Jovanovicada70912015-09-07 11:56:37 +0000891 DEBUG(dbgs() << "Trying MicroMips32 table (32-bit instructions):\n");
892 // Calling the auto-generated decoder function.
893 Result = decodeInstruction(DecoderTableMicroMips32, Instr, Insn, Address,
894 this, STI);
Vladimir Medicdde3d582013-09-06 12:30:36 +0000895 if (Result != MCDisassembler::Fail) {
896 Size = 4;
897 return Result;
898 }
899 return MCDisassembler::Fail;
900 }
901
Jozef Kolekea22c4c2014-11-24 13:29:59 +0000902 Result = readInstruction32(Bytes, Address, Size, Insn, IsBigEndian, false);
903 if (Result == MCDisassembler::Fail)
904 return MCDisassembler::Fail;
905
Daniel Sandersc171f652014-06-13 13:15:59 +0000906 if (hasCOP3()) {
907 DEBUG(dbgs() << "Trying COP3_ table (32-bit opcodes):\n");
908 Result =
Rafael Espindola4aa6bea2014-11-10 18:11:10 +0000909 decodeInstruction(DecoderTableCOP3_32, Instr, Insn, Address, this, STI);
Daniel Sandersc171f652014-06-13 13:15:59 +0000910 if (Result != MCDisassembler::Fail) {
911 Size = 4;
912 return Result;
913 }
914 }
915
916 if (hasMips32r6() && isGP64()) {
Daniel Sanders0fa60412014-06-12 13:39:06 +0000917 DEBUG(dbgs() << "Trying Mips32r6_64r6 (GPR64) table (32-bit opcodes):\n");
Rafael Espindola4aa6bea2014-11-10 18:11:10 +0000918 Result = decodeInstruction(DecoderTableMips32r6_64r6_GP6432, Instr, Insn,
Daniel Sanders0fa60412014-06-12 13:39:06 +0000919 Address, this, STI);
920 if (Result != MCDisassembler::Fail) {
921 Size = 4;
922 return Result;
923 }
924 }
925
Daniel Sandersc171f652014-06-13 13:15:59 +0000926 if (hasMips32r6()) {
Daniel Sanders0fa60412014-06-12 13:39:06 +0000927 DEBUG(dbgs() << "Trying Mips32r6_64r6 table (32-bit opcodes):\n");
Rafael Espindola4aa6bea2014-11-10 18:11:10 +0000928 Result = decodeInstruction(DecoderTableMips32r6_64r632, Instr, Insn,
Daniel Sanders5c582b22014-05-22 11:23:21 +0000929 Address, this, STI);
930 if (Result != MCDisassembler::Fail) {
931 Size = 4;
932 return Result;
933 }
934 }
935
Kai Nacke3adf9b82015-05-28 16:23:16 +0000936 if (hasCnMips()) {
937 DEBUG(dbgs() << "Trying CnMips table (32-bit opcodes):\n");
938 Result = decodeInstruction(DecoderTableCnMips32, Instr, Insn,
939 Address, this, STI);
940 if (Result != MCDisassembler::Fail) {
941 Size = 4;
942 return Result;
943 }
944 }
945
Daniel Sandersa19216c2015-02-11 11:28:56 +0000946 if (isGP64()) {
947 DEBUG(dbgs() << "Trying Mips64 (GPR64) table (32-bit opcodes):\n");
948 Result = decodeInstruction(DecoderTableMips6432, Instr, Insn,
949 Address, this, STI);
950 if (Result != MCDisassembler::Fail) {
951 Size = 4;
952 return Result;
953 }
954 }
955
Daniel Sanders0fa60412014-06-12 13:39:06 +0000956 DEBUG(dbgs() << "Trying Mips table (32-bit opcodes):\n");
Akira Hatanaka71928e62012-04-17 18:03:21 +0000957 // Calling the auto-generated decoder function.
Rafael Espindola4aa6bea2014-11-10 18:11:10 +0000958 Result =
959 decodeInstruction(DecoderTableMips32, Instr, Insn, Address, this, STI);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000960 if (Result != MCDisassembler::Fail) {
961 Size = 4;
962 return Result;
963 }
964
965 return MCDisassembler::Fail;
966}
967
Reed Kotlerec8a5492013-02-14 03:05:25 +0000968static DecodeStatus DecodeCPU16RegsRegisterClass(MCInst &Inst,
969 unsigned RegNo,
970 uint64_t Address,
971 const void *Decoder) {
972
973 return MCDisassembler::Fail;
974
975}
976
Akira Hatanaka13e6ccf2013-08-06 23:08:38 +0000977static DecodeStatus DecodeGPR64RegisterClass(MCInst &Inst,
978 unsigned RegNo,
979 uint64_t Address,
980 const void *Decoder) {
Akira Hatanaka71928e62012-04-17 18:03:21 +0000981
982 if (RegNo > 31)
983 return MCDisassembler::Fail;
984
Akira Hatanaka13e6ccf2013-08-06 23:08:38 +0000985 unsigned Reg = getReg(Decoder, Mips::GPR64RegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +0000986 Inst.addOperand(MCOperand::createReg(Reg));
Akira Hatanaka71928e62012-04-17 18:03:21 +0000987 return MCDisassembler::Success;
988}
989
Zoran Jovanovicb0852e52014-10-21 08:23:11 +0000990static DecodeStatus DecodeGPRMM16RegisterClass(MCInst &Inst,
991 unsigned RegNo,
992 uint64_t Address,
993 const void *Decoder) {
Jozef Kolekea22c4c2014-11-24 13:29:59 +0000994 if (RegNo > 7)
995 return MCDisassembler::Fail;
996 unsigned Reg = getReg(Decoder, Mips::GPRMM16RegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +0000997 Inst.addOperand(MCOperand::createReg(Reg));
Jozef Kolekea22c4c2014-11-24 13:29:59 +0000998 return MCDisassembler::Success;
Zoran Jovanovicb0852e52014-10-21 08:23:11 +0000999}
1000
Jozef Kolek1904fa22014-11-24 14:25:53 +00001001static DecodeStatus DecodeGPRMM16ZeroRegisterClass(MCInst &Inst,
1002 unsigned RegNo,
1003 uint64_t Address,
1004 const void *Decoder) {
Jozef Kolek315e7ec2014-11-26 18:56:38 +00001005 if (RegNo > 7)
1006 return MCDisassembler::Fail;
1007 unsigned Reg = getReg(Decoder, Mips::GPRMM16ZeroRegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001008 Inst.addOperand(MCOperand::createReg(Reg));
Jozef Kolek315e7ec2014-11-26 18:56:38 +00001009 return MCDisassembler::Success;
Jozef Kolek1904fa22014-11-24 14:25:53 +00001010}
1011
Zoran Jovanovic41688672015-02-10 16:36:20 +00001012static DecodeStatus DecodeGPRMM16MovePRegisterClass(MCInst &Inst,
1013 unsigned RegNo,
1014 uint64_t Address,
1015 const void *Decoder) {
1016 if (RegNo > 7)
1017 return MCDisassembler::Fail;
1018 unsigned Reg = getReg(Decoder, Mips::GPRMM16MovePRegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001019 Inst.addOperand(MCOperand::createReg(Reg));
Zoran Jovanovic41688672015-02-10 16:36:20 +00001020 return MCDisassembler::Success;
1021}
1022
Akira Hatanaka13e6ccf2013-08-06 23:08:38 +00001023static DecodeStatus DecodeGPR32RegisterClass(MCInst &Inst,
1024 unsigned RegNo,
1025 uint64_t Address,
1026 const void *Decoder) {
Akira Hatanaka71928e62012-04-17 18:03:21 +00001027 if (RegNo > 31)
1028 return MCDisassembler::Fail;
Akira Hatanaka13e6ccf2013-08-06 23:08:38 +00001029 unsigned Reg = getReg(Decoder, Mips::GPR32RegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001030 Inst.addOperand(MCOperand::createReg(Reg));
Akira Hatanaka71928e62012-04-17 18:03:21 +00001031 return MCDisassembler::Success;
1032}
1033
Akira Hatanaka9bfa2e22013-08-28 00:55:15 +00001034static DecodeStatus DecodePtrRegisterClass(MCInst &Inst,
1035 unsigned RegNo,
1036 uint64_t Address,
1037 const void *Decoder) {
Daniel Sandersa19216c2015-02-11 11:28:56 +00001038 if (static_cast<const MipsDisassembler *>(Decoder)->isGP64())
Akira Hatanaka9bfa2e22013-08-28 00:55:15 +00001039 return DecodeGPR64RegisterClass(Inst, RegNo, Address, Decoder);
1040
1041 return DecodeGPR32RegisterClass(Inst, RegNo, Address, Decoder);
1042}
1043
Akira Hatanaka654655f2013-08-14 00:53:38 +00001044static DecodeStatus DecodeDSPRRegisterClass(MCInst &Inst,
1045 unsigned RegNo,
1046 uint64_t Address,
1047 const void *Decoder) {
Akira Hatanaka13e6ccf2013-08-06 23:08:38 +00001048 return DecodeGPR32RegisterClass(Inst, RegNo, Address, Decoder);
Akira Hatanakaecabd1a2012-09-27 02:01:10 +00001049}
1050
Akira Hatanaka71928e62012-04-17 18:03:21 +00001051static DecodeStatus DecodeFGR64RegisterClass(MCInst &Inst,
1052 unsigned RegNo,
1053 uint64_t Address,
1054 const void *Decoder) {
1055 if (RegNo > 31)
1056 return MCDisassembler::Fail;
1057
Akira Hatanaka9bf2b562012-07-09 18:46:47 +00001058 unsigned Reg = getReg(Decoder, Mips::FGR64RegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001059 Inst.addOperand(MCOperand::createReg(Reg));
Akira Hatanaka71928e62012-04-17 18:03:21 +00001060 return MCDisassembler::Success;
1061}
1062
1063static DecodeStatus DecodeFGR32RegisterClass(MCInst &Inst,
1064 unsigned RegNo,
1065 uint64_t Address,
1066 const void *Decoder) {
1067 if (RegNo > 31)
1068 return MCDisassembler::Fail;
1069
Akira Hatanaka9bf2b562012-07-09 18:46:47 +00001070 unsigned Reg = getReg(Decoder, Mips::FGR32RegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001071 Inst.addOperand(MCOperand::createReg(Reg));
Akira Hatanaka71928e62012-04-17 18:03:21 +00001072 return MCDisassembler::Success;
1073}
1074
1075static DecodeStatus DecodeCCRRegisterClass(MCInst &Inst,
1076 unsigned RegNo,
1077 uint64_t Address,
1078 const void *Decoder) {
Chad Rosier253777f2013-06-26 22:23:32 +00001079 if (RegNo > 31)
1080 return MCDisassembler::Fail;
1081 unsigned Reg = getReg(Decoder, Mips::CCRRegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001082 Inst.addOperand(MCOperand::createReg(Reg));
Akira Hatanaka71928e62012-04-17 18:03:21 +00001083 return MCDisassembler::Success;
1084}
1085
Akira Hatanaka1fb1b8b2013-07-26 20:13:47 +00001086static DecodeStatus DecodeFCCRegisterClass(MCInst &Inst,
1087 unsigned RegNo,
1088 uint64_t Address,
1089 const void *Decoder) {
1090 if (RegNo > 7)
1091 return MCDisassembler::Fail;
1092 unsigned Reg = getReg(Decoder, Mips::FCCRegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001093 Inst.addOperand(MCOperand::createReg(Reg));
Akira Hatanaka1fb1b8b2013-07-26 20:13:47 +00001094 return MCDisassembler::Success;
1095}
1096
Daniel Sanders0fa60412014-06-12 13:39:06 +00001097static DecodeStatus DecodeFGRCCRegisterClass(MCInst &Inst, unsigned RegNo,
1098 uint64_t Address,
1099 const void *Decoder) {
1100 if (RegNo > 31)
1101 return MCDisassembler::Fail;
1102
1103 unsigned Reg = getReg(Decoder, Mips::FGRCCRegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001104 Inst.addOperand(MCOperand::createReg(Reg));
Daniel Sanders0fa60412014-06-12 13:39:06 +00001105 return MCDisassembler::Success;
1106}
1107
Akira Hatanaka71928e62012-04-17 18:03:21 +00001108static DecodeStatus DecodeMem(MCInst &Inst,
1109 unsigned Insn,
1110 uint64_t Address,
1111 const void *Decoder) {
1112 int Offset = SignExtend32<16>(Insn & 0xffff);
Jim Grosbachecaef492012-08-14 19:06:05 +00001113 unsigned Reg = fieldFromInstruction(Insn, 16, 5);
1114 unsigned Base = fieldFromInstruction(Insn, 21, 5);
Akira Hatanaka9bf2b562012-07-09 18:46:47 +00001115
Akira Hatanaka13e6ccf2013-08-06 23:08:38 +00001116 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
1117 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
Akira Hatanaka71928e62012-04-17 18:03:21 +00001118
Vladimir Medicd7ecf492014-12-15 16:19:34 +00001119 if(Inst.getOpcode() == Mips::SC ||
1120 Inst.getOpcode() == Mips::SCD){
Jim Grosbache9119e42015-05-13 18:37:00 +00001121 Inst.addOperand(MCOperand::createReg(Reg));
Akira Hatanaka71928e62012-04-17 18:03:21 +00001122 }
1123
Jim Grosbache9119e42015-05-13 18:37:00 +00001124 Inst.addOperand(MCOperand::createReg(Reg));
1125 Inst.addOperand(MCOperand::createReg(Base));
1126 Inst.addOperand(MCOperand::createImm(Offset));
Akira Hatanaka71928e62012-04-17 18:03:21 +00001127
1128 return MCDisassembler::Success;
1129}
1130
Daniel Sanders92db6b72014-10-01 08:26:55 +00001131static DecodeStatus DecodeCacheOp(MCInst &Inst,
1132 unsigned Insn,
1133 uint64_t Address,
1134 const void *Decoder) {
1135 int Offset = SignExtend32<16>(Insn & 0xffff);
1136 unsigned Hint = fieldFromInstruction(Insn, 16, 5);
1137 unsigned Base = fieldFromInstruction(Insn, 21, 5);
1138
1139 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1140
Jim Grosbache9119e42015-05-13 18:37:00 +00001141 Inst.addOperand(MCOperand::createReg(Base));
1142 Inst.addOperand(MCOperand::createImm(Offset));
1143 Inst.addOperand(MCOperand::createImm(Hint));
Daniel Sanders92db6b72014-10-01 08:26:55 +00001144
1145 return MCDisassembler::Success;
1146}
1147
Jozef Kolekab6d1cc2014-12-23 19:55:34 +00001148static DecodeStatus DecodeCacheOpMM(MCInst &Inst,
1149 unsigned Insn,
1150 uint64_t Address,
1151 const void *Decoder) {
1152 int Offset = SignExtend32<12>(Insn & 0xfff);
1153 unsigned Base = fieldFromInstruction(Insn, 16, 5);
1154 unsigned Hint = fieldFromInstruction(Insn, 21, 5);
1155
1156 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1157
Jim Grosbache9119e42015-05-13 18:37:00 +00001158 Inst.addOperand(MCOperand::createReg(Base));
1159 Inst.addOperand(MCOperand::createImm(Offset));
1160 Inst.addOperand(MCOperand::createImm(Hint));
Jozef Kolekab6d1cc2014-12-23 19:55:34 +00001161
1162 return MCDisassembler::Success;
1163}
1164
Zoran Jovanovicd9790792015-09-09 09:10:46 +00001165static DecodeStatus DecodePrefeOpMM(MCInst &Inst,
1166 unsigned Insn,
1167 uint64_t Address,
1168 const void *Decoder) {
1169 int Offset = SignExtend32<9>(Insn & 0x1ff);
1170 unsigned Base = fieldFromInstruction(Insn, 16, 5);
1171 unsigned Hint = fieldFromInstruction(Insn, 21, 5);
1172
1173 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1174
1175 Inst.addOperand(MCOperand::createReg(Base));
1176 Inst.addOperand(MCOperand::createImm(Offset));
1177 Inst.addOperand(MCOperand::createImm(Hint));
1178
1179 return MCDisassembler::Success;
1180}
1181
Vladimir Medicdf464ae2015-01-29 11:33:41 +00001182static DecodeStatus DecodeCacheOpR6(MCInst &Inst,
1183 unsigned Insn,
1184 uint64_t Address,
1185 const void *Decoder) {
1186 int Offset = fieldFromInstruction(Insn, 7, 9);
1187 unsigned Hint = fieldFromInstruction(Insn, 16, 5);
1188 unsigned Base = fieldFromInstruction(Insn, 21, 5);
1189
1190 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1191
Jim Grosbache9119e42015-05-13 18:37:00 +00001192 Inst.addOperand(MCOperand::createReg(Base));
1193 Inst.addOperand(MCOperand::createImm(Offset));
1194 Inst.addOperand(MCOperand::createImm(Hint));
Vladimir Medicdf464ae2015-01-29 11:33:41 +00001195
1196 return MCDisassembler::Success;
1197}
1198
Zoran Jovanovic9eaa30d2015-09-08 10:18:38 +00001199static DecodeStatus DecodeStoreEvaOpMM(MCInst &Inst,
1200 unsigned Insn,
1201 uint64_t Address,
1202 const void *Decoder) {
1203 int Offset = SignExtend32<9>(Insn & 0x1ff);
1204 unsigned Reg = fieldFromInstruction(Insn, 21, 5);
1205 unsigned Base = fieldFromInstruction(Insn, 16, 5);
1206
1207 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
1208 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1209
1210 Inst.addOperand(MCOperand::createReg(Reg));
1211 Inst.addOperand(MCOperand::createReg(Base));
1212 Inst.addOperand(MCOperand::createImm(Offset));
1213
1214 return MCDisassembler::Success;
1215}
1216
Daniel Sandersb4484d62014-11-27 17:28:10 +00001217static DecodeStatus DecodeSyncI(MCInst &Inst,
1218 unsigned Insn,
1219 uint64_t Address,
1220 const void *Decoder) {
1221 int Offset = SignExtend32<16>(Insn & 0xffff);
1222 unsigned Base = fieldFromInstruction(Insn, 21, 5);
1223
1224 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1225
Jim Grosbache9119e42015-05-13 18:37:00 +00001226 Inst.addOperand(MCOperand::createReg(Base));
1227 Inst.addOperand(MCOperand::createImm(Offset));
Daniel Sandersb4484d62014-11-27 17:28:10 +00001228
1229 return MCDisassembler::Success;
1230}
1231
Matheus Almeidafe0bf9f2013-10-21 13:07:13 +00001232static DecodeStatus DecodeMSA128Mem(MCInst &Inst, unsigned Insn,
1233 uint64_t Address, const void *Decoder) {
1234 int Offset = SignExtend32<10>(fieldFromInstruction(Insn, 16, 10));
1235 unsigned Reg = fieldFromInstruction(Insn, 6, 5);
1236 unsigned Base = fieldFromInstruction(Insn, 11, 5);
1237
1238 Reg = getReg(Decoder, Mips::MSA128BRegClassID, Reg);
1239 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1240
Jim Grosbache9119e42015-05-13 18:37:00 +00001241 Inst.addOperand(MCOperand::createReg(Reg));
1242 Inst.addOperand(MCOperand::createReg(Base));
Matheus Almeida6b59c442013-12-05 11:06:22 +00001243
1244 // The immediate field of an LD/ST instruction is scaled which means it must
1245 // be multiplied (when decoding) by the size (in bytes) of the instructions'
1246 // data format.
1247 // .b - 1 byte
1248 // .h - 2 bytes
1249 // .w - 4 bytes
1250 // .d - 8 bytes
1251 switch(Inst.getOpcode())
1252 {
1253 default:
1254 assert (0 && "Unexpected instruction");
1255 return MCDisassembler::Fail;
1256 break;
1257 case Mips::LD_B:
1258 case Mips::ST_B:
Jim Grosbache9119e42015-05-13 18:37:00 +00001259 Inst.addOperand(MCOperand::createImm(Offset));
Matheus Almeida6b59c442013-12-05 11:06:22 +00001260 break;
1261 case Mips::LD_H:
1262 case Mips::ST_H:
Jim Grosbache9119e42015-05-13 18:37:00 +00001263 Inst.addOperand(MCOperand::createImm(Offset * 2));
Matheus Almeida6b59c442013-12-05 11:06:22 +00001264 break;
1265 case Mips::LD_W:
1266 case Mips::ST_W:
Jim Grosbache9119e42015-05-13 18:37:00 +00001267 Inst.addOperand(MCOperand::createImm(Offset * 4));
Matheus Almeida6b59c442013-12-05 11:06:22 +00001268 break;
1269 case Mips::LD_D:
1270 case Mips::ST_D:
Jim Grosbache9119e42015-05-13 18:37:00 +00001271 Inst.addOperand(MCOperand::createImm(Offset * 8));
Matheus Almeida6b59c442013-12-05 11:06:22 +00001272 break;
1273 }
Matheus Almeidafe0bf9f2013-10-21 13:07:13 +00001274
1275 return MCDisassembler::Success;
1276}
1277
Jozef Kolek315e7ec2014-11-26 18:56:38 +00001278static DecodeStatus DecodeMemMMImm4(MCInst &Inst,
1279 unsigned Insn,
1280 uint64_t Address,
1281 const void *Decoder) {
1282 unsigned Offset = Insn & 0xf;
1283 unsigned Reg = fieldFromInstruction(Insn, 7, 3);
1284 unsigned Base = fieldFromInstruction(Insn, 4, 3);
1285
1286 switch (Inst.getOpcode()) {
1287 case Mips::LBU16_MM:
1288 case Mips::LHU16_MM:
1289 case Mips::LW16_MM:
1290 if (DecodeGPRMM16RegisterClass(Inst, Reg, Address, Decoder)
1291 == MCDisassembler::Fail)
1292 return MCDisassembler::Fail;
1293 break;
1294 case Mips::SB16_MM:
1295 case Mips::SH16_MM:
1296 case Mips::SW16_MM:
1297 if (DecodeGPRMM16ZeroRegisterClass(Inst, Reg, Address, Decoder)
1298 == MCDisassembler::Fail)
1299 return MCDisassembler::Fail;
1300 break;
1301 }
1302
1303 if (DecodeGPRMM16RegisterClass(Inst, Base, Address, Decoder)
1304 == MCDisassembler::Fail)
1305 return MCDisassembler::Fail;
1306
1307 switch (Inst.getOpcode()) {
1308 case Mips::LBU16_MM:
1309 if (Offset == 0xf)
Jim Grosbache9119e42015-05-13 18:37:00 +00001310 Inst.addOperand(MCOperand::createImm(-1));
Jozef Kolek315e7ec2014-11-26 18:56:38 +00001311 else
Jim Grosbache9119e42015-05-13 18:37:00 +00001312 Inst.addOperand(MCOperand::createImm(Offset));
Jozef Kolek315e7ec2014-11-26 18:56:38 +00001313 break;
1314 case Mips::SB16_MM:
Jim Grosbache9119e42015-05-13 18:37:00 +00001315 Inst.addOperand(MCOperand::createImm(Offset));
Jozef Kolek315e7ec2014-11-26 18:56:38 +00001316 break;
1317 case Mips::LHU16_MM:
1318 case Mips::SH16_MM:
Jim Grosbache9119e42015-05-13 18:37:00 +00001319 Inst.addOperand(MCOperand::createImm(Offset << 1));
Jozef Kolek315e7ec2014-11-26 18:56:38 +00001320 break;
1321 case Mips::LW16_MM:
1322 case Mips::SW16_MM:
Jim Grosbache9119e42015-05-13 18:37:00 +00001323 Inst.addOperand(MCOperand::createImm(Offset << 2));
Jozef Kolek315e7ec2014-11-26 18:56:38 +00001324 break;
1325 }
1326
1327 return MCDisassembler::Success;
1328}
1329
Jozef Kolek12c69822014-12-23 16:16:33 +00001330static DecodeStatus DecodeMemMMSPImm5Lsl2(MCInst &Inst,
1331 unsigned Insn,
1332 uint64_t Address,
1333 const void *Decoder) {
1334 unsigned Offset = Insn & 0x1F;
1335 unsigned Reg = fieldFromInstruction(Insn, 5, 5);
1336
1337 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
1338
Jim Grosbache9119e42015-05-13 18:37:00 +00001339 Inst.addOperand(MCOperand::createReg(Reg));
1340 Inst.addOperand(MCOperand::createReg(Mips::SP));
1341 Inst.addOperand(MCOperand::createImm(Offset << 2));
Jozef Kolek12c69822014-12-23 16:16:33 +00001342
1343 return MCDisassembler::Success;
1344}
1345
Jozef Koleke10a02e2015-01-28 17:27:26 +00001346static DecodeStatus DecodeMemMMGPImm7Lsl2(MCInst &Inst,
1347 unsigned Insn,
1348 uint64_t Address,
1349 const void *Decoder) {
1350 unsigned Offset = Insn & 0x7F;
1351 unsigned Reg = fieldFromInstruction(Insn, 7, 3);
1352
1353 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
1354
Jim Grosbache9119e42015-05-13 18:37:00 +00001355 Inst.addOperand(MCOperand::createReg(Reg));
1356 Inst.addOperand(MCOperand::createReg(Mips::GP));
1357 Inst.addOperand(MCOperand::createImm(Offset << 2));
Jozef Koleke10a02e2015-01-28 17:27:26 +00001358
1359 return MCDisassembler::Success;
1360}
1361
Jozef Kolekd68d424a2015-02-10 12:41:13 +00001362static DecodeStatus DecodeMemMMReglistImm4Lsl2(MCInst &Inst,
1363 unsigned Insn,
1364 uint64_t Address,
1365 const void *Decoder) {
1366 int Offset = SignExtend32<4>(Insn & 0xf);
1367
1368 if (DecodeRegListOperand16(Inst, Insn, Address, Decoder)
1369 == MCDisassembler::Fail)
1370 return MCDisassembler::Fail;
1371
Jim Grosbache9119e42015-05-13 18:37:00 +00001372 Inst.addOperand(MCOperand::createReg(Mips::SP));
1373 Inst.addOperand(MCOperand::createImm(Offset << 2));
Jozef Kolekd68d424a2015-02-10 12:41:13 +00001374
1375 return MCDisassembler::Success;
1376}
1377
Zoran Jovanovica6593ff2015-08-18 12:53:08 +00001378static DecodeStatus DecodeMemMMImm9(MCInst &Inst,
1379 unsigned Insn,
1380 uint64_t Address,
1381 const void *Decoder) {
1382 int Offset = SignExtend32<9>(Insn & 0x1ff);
1383 unsigned Reg = fieldFromInstruction(Insn, 21, 5);
1384 unsigned Base = fieldFromInstruction(Insn, 16, 5);
1385
1386 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
1387 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1388
1389 Inst.addOperand(MCOperand::createReg(Reg));
1390 Inst.addOperand(MCOperand::createReg(Base));
1391 Inst.addOperand(MCOperand::createImm(Offset));
1392
1393 return MCDisassembler::Success;
1394}
1395
Vladimir Medicdde3d582013-09-06 12:30:36 +00001396static DecodeStatus DecodeMemMMImm12(MCInst &Inst,
1397 unsigned Insn,
1398 uint64_t Address,
1399 const void *Decoder) {
1400 int Offset = SignExtend32<12>(Insn & 0x0fff);
1401 unsigned Reg = fieldFromInstruction(Insn, 21, 5);
1402 unsigned Base = fieldFromInstruction(Insn, 16, 5);
1403
1404 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
1405 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1406
Zoran Jovanovica4c4b5f2014-11-19 16:44:02 +00001407 switch (Inst.getOpcode()) {
1408 case Mips::SWM32_MM:
1409 case Mips::LWM32_MM:
1410 if (DecodeRegListOperand(Inst, Insn, Address, Decoder)
1411 == MCDisassembler::Fail)
1412 return MCDisassembler::Fail;
Jim Grosbache9119e42015-05-13 18:37:00 +00001413 Inst.addOperand(MCOperand::createReg(Base));
1414 Inst.addOperand(MCOperand::createImm(Offset));
Zoran Jovanovica4c4b5f2014-11-19 16:44:02 +00001415 break;
1416 case Mips::SC_MM:
Jim Grosbache9119e42015-05-13 18:37:00 +00001417 Inst.addOperand(MCOperand::createReg(Reg));
Zoran Jovanovica4c4b5f2014-11-19 16:44:02 +00001418 // fallthrough
1419 default:
Jim Grosbache9119e42015-05-13 18:37:00 +00001420 Inst.addOperand(MCOperand::createReg(Reg));
Zoran Jovanovic2deca342014-12-16 14:59:10 +00001421 if (Inst.getOpcode() == Mips::LWP_MM || Inst.getOpcode() == Mips::SWP_MM)
Jim Grosbache9119e42015-05-13 18:37:00 +00001422 Inst.addOperand(MCOperand::createReg(Reg+1));
Zoran Jovanovic2deca342014-12-16 14:59:10 +00001423
Jim Grosbache9119e42015-05-13 18:37:00 +00001424 Inst.addOperand(MCOperand::createReg(Base));
1425 Inst.addOperand(MCOperand::createImm(Offset));
Zoran Jovanovica4c4b5f2014-11-19 16:44:02 +00001426 }
Vladimir Medicdde3d582013-09-06 12:30:36 +00001427
1428 return MCDisassembler::Success;
1429}
1430
1431static DecodeStatus DecodeMemMMImm16(MCInst &Inst,
1432 unsigned Insn,
1433 uint64_t Address,
1434 const void *Decoder) {
1435 int Offset = SignExtend32<16>(Insn & 0xffff);
1436 unsigned Reg = fieldFromInstruction(Insn, 21, 5);
1437 unsigned Base = fieldFromInstruction(Insn, 16, 5);
1438
1439 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
1440 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1441
Jim Grosbache9119e42015-05-13 18:37:00 +00001442 Inst.addOperand(MCOperand::createReg(Reg));
1443 Inst.addOperand(MCOperand::createReg(Base));
1444 Inst.addOperand(MCOperand::createImm(Offset));
Vladimir Medicdde3d582013-09-06 12:30:36 +00001445
1446 return MCDisassembler::Success;
1447}
1448
Akira Hatanaka71928e62012-04-17 18:03:21 +00001449static DecodeStatus DecodeFMem(MCInst &Inst,
1450 unsigned Insn,
1451 uint64_t Address,
1452 const void *Decoder) {
1453 int Offset = SignExtend32<16>(Insn & 0xffff);
Jim Grosbachecaef492012-08-14 19:06:05 +00001454 unsigned Reg = fieldFromInstruction(Insn, 16, 5);
1455 unsigned Base = fieldFromInstruction(Insn, 21, 5);
Akira Hatanaka71928e62012-04-17 18:03:21 +00001456
Akira Hatanaka9bf2b562012-07-09 18:46:47 +00001457 Reg = getReg(Decoder, Mips::FGR64RegClassID, Reg);
Akira Hatanaka13e6ccf2013-08-06 23:08:38 +00001458 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
Akira Hatanaka9bf2b562012-07-09 18:46:47 +00001459
Jim Grosbache9119e42015-05-13 18:37:00 +00001460 Inst.addOperand(MCOperand::createReg(Reg));
1461 Inst.addOperand(MCOperand::createReg(Base));
1462 Inst.addOperand(MCOperand::createImm(Offset));
Akira Hatanaka71928e62012-04-17 18:03:21 +00001463
1464 return MCDisassembler::Success;
1465}
1466
Daniel Sanders92db6b72014-10-01 08:26:55 +00001467static DecodeStatus DecodeFMem2(MCInst &Inst,
1468 unsigned Insn,
1469 uint64_t Address,
1470 const void *Decoder) {
1471 int Offset = SignExtend32<16>(Insn & 0xffff);
1472 unsigned Reg = fieldFromInstruction(Insn, 16, 5);
1473 unsigned Base = fieldFromInstruction(Insn, 21, 5);
1474
1475 Reg = getReg(Decoder, Mips::COP2RegClassID, Reg);
1476 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1477
Jim Grosbache9119e42015-05-13 18:37:00 +00001478 Inst.addOperand(MCOperand::createReg(Reg));
1479 Inst.addOperand(MCOperand::createReg(Base));
1480 Inst.addOperand(MCOperand::createImm(Offset));
Daniel Sanders92db6b72014-10-01 08:26:55 +00001481
1482 return MCDisassembler::Success;
1483}
1484
1485static DecodeStatus DecodeFMem3(MCInst &Inst,
1486 unsigned Insn,
1487 uint64_t Address,
1488 const void *Decoder) {
1489 int Offset = SignExtend32<16>(Insn & 0xffff);
1490 unsigned Reg = fieldFromInstruction(Insn, 16, 5);
1491 unsigned Base = fieldFromInstruction(Insn, 21, 5);
1492
1493 Reg = getReg(Decoder, Mips::COP3RegClassID, Reg);
1494 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1495
Jim Grosbache9119e42015-05-13 18:37:00 +00001496 Inst.addOperand(MCOperand::createReg(Reg));
1497 Inst.addOperand(MCOperand::createReg(Base));
1498 Inst.addOperand(MCOperand::createImm(Offset));
Daniel Sanders92db6b72014-10-01 08:26:55 +00001499
1500 return MCDisassembler::Success;
1501}
1502
Vladimir Medic435cf8a2015-01-21 10:47:36 +00001503static DecodeStatus DecodeFMemCop2R6(MCInst &Inst,
1504 unsigned Insn,
1505 uint64_t Address,
1506 const void *Decoder) {
1507 int Offset = SignExtend32<11>(Insn & 0x07ff);
1508 unsigned Reg = fieldFromInstruction(Insn, 16, 5);
1509 unsigned Base = fieldFromInstruction(Insn, 11, 5);
1510
1511 Reg = getReg(Decoder, Mips::COP2RegClassID, Reg);
1512 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1513
Jim Grosbache9119e42015-05-13 18:37:00 +00001514 Inst.addOperand(MCOperand::createReg(Reg));
1515 Inst.addOperand(MCOperand::createReg(Base));
1516 Inst.addOperand(MCOperand::createImm(Offset));
Vladimir Medic435cf8a2015-01-21 10:47:36 +00001517
1518 return MCDisassembler::Success;
1519}
Daniel Sanders6a803f62014-06-16 13:13:03 +00001520static DecodeStatus DecodeSpecial3LlSc(MCInst &Inst,
1521 unsigned Insn,
1522 uint64_t Address,
1523 const void *Decoder) {
1524 int64_t Offset = SignExtend64<9>((Insn >> 7) & 0x1ff);
1525 unsigned Rt = fieldFromInstruction(Insn, 16, 5);
1526 unsigned Base = fieldFromInstruction(Insn, 21, 5);
1527
1528 Rt = getReg(Decoder, Mips::GPR32RegClassID, Rt);
1529 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1530
1531 if(Inst.getOpcode() == Mips::SC_R6 || Inst.getOpcode() == Mips::SCD_R6){
Jim Grosbache9119e42015-05-13 18:37:00 +00001532 Inst.addOperand(MCOperand::createReg(Rt));
Daniel Sanders6a803f62014-06-16 13:13:03 +00001533 }
1534
Jim Grosbache9119e42015-05-13 18:37:00 +00001535 Inst.addOperand(MCOperand::createReg(Rt));
1536 Inst.addOperand(MCOperand::createReg(Base));
1537 Inst.addOperand(MCOperand::createImm(Offset));
Daniel Sanders6a803f62014-06-16 13:13:03 +00001538
1539 return MCDisassembler::Success;
1540}
Akira Hatanaka71928e62012-04-17 18:03:21 +00001541
1542static DecodeStatus DecodeHWRegsRegisterClass(MCInst &Inst,
1543 unsigned RegNo,
1544 uint64_t Address,
1545 const void *Decoder) {
1546 // Currently only hardware register 29 is supported.
1547 if (RegNo != 29)
1548 return MCDisassembler::Fail;
Jim Grosbache9119e42015-05-13 18:37:00 +00001549 Inst.addOperand(MCOperand::createReg(Mips::HWR29));
Akira Hatanaka71928e62012-04-17 18:03:21 +00001550 return MCDisassembler::Success;
1551}
1552
Akira Hatanaka71928e62012-04-17 18:03:21 +00001553static DecodeStatus DecodeAFGR64RegisterClass(MCInst &Inst,
1554 unsigned RegNo,
1555 uint64_t Address,
1556 const void *Decoder) {
Akira Hatanaka9bf2b562012-07-09 18:46:47 +00001557 if (RegNo > 30 || RegNo %2)
Akira Hatanaka71928e62012-04-17 18:03:21 +00001558 return MCDisassembler::Fail;
1559
Akira Hatanaka9bf2b562012-07-09 18:46:47 +00001560 ;
1561 unsigned Reg = getReg(Decoder, Mips::AFGR64RegClassID, RegNo /2);
Jim Grosbache9119e42015-05-13 18:37:00 +00001562 Inst.addOperand(MCOperand::createReg(Reg));
Akira Hatanaka71928e62012-04-17 18:03:21 +00001563 return MCDisassembler::Success;
1564}
1565
Akira Hatanaka00fcf2e2013-08-08 21:54:26 +00001566static DecodeStatus DecodeACC64DSPRegisterClass(MCInst &Inst,
1567 unsigned RegNo,
1568 uint64_t Address,
1569 const void *Decoder) {
Akira Hatanakaecabd1a2012-09-27 02:01:10 +00001570 if (RegNo >= 4)
1571 return MCDisassembler::Fail;
1572
Akira Hatanaka00fcf2e2013-08-08 21:54:26 +00001573 unsigned Reg = getReg(Decoder, Mips::ACC64DSPRegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001574 Inst.addOperand(MCOperand::createReg(Reg));
Akira Hatanakaecabd1a2012-09-27 02:01:10 +00001575 return MCDisassembler::Success;
1576}
1577
Akira Hatanaka8002a3f2013-08-14 00:47:08 +00001578static DecodeStatus DecodeHI32DSPRegisterClass(MCInst &Inst,
1579 unsigned RegNo,
1580 uint64_t Address,
1581 const void *Decoder) {
Akira Hatanaka59bfaf72013-04-18 00:52:44 +00001582 if (RegNo >= 4)
1583 return MCDisassembler::Fail;
1584
Akira Hatanaka8002a3f2013-08-14 00:47:08 +00001585 unsigned Reg = getReg(Decoder, Mips::HI32DSPRegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001586 Inst.addOperand(MCOperand::createReg(Reg));
Akira Hatanaka59bfaf72013-04-18 00:52:44 +00001587 return MCDisassembler::Success;
1588}
1589
Akira Hatanaka8002a3f2013-08-14 00:47:08 +00001590static DecodeStatus DecodeLO32DSPRegisterClass(MCInst &Inst,
1591 unsigned RegNo,
1592 uint64_t Address,
1593 const void *Decoder) {
Akira Hatanaka59bfaf72013-04-18 00:52:44 +00001594 if (RegNo >= 4)
1595 return MCDisassembler::Fail;
1596
Akira Hatanaka8002a3f2013-08-14 00:47:08 +00001597 unsigned Reg = getReg(Decoder, Mips::LO32DSPRegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001598 Inst.addOperand(MCOperand::createReg(Reg));
Akira Hatanaka59bfaf72013-04-18 00:52:44 +00001599 return MCDisassembler::Success;
1600}
1601
Jack Carter3eb663b2013-09-26 00:09:46 +00001602static DecodeStatus DecodeMSA128BRegisterClass(MCInst &Inst,
1603 unsigned RegNo,
1604 uint64_t Address,
1605 const void *Decoder) {
1606 if (RegNo > 31)
1607 return MCDisassembler::Fail;
1608
1609 unsigned Reg = getReg(Decoder, Mips::MSA128BRegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001610 Inst.addOperand(MCOperand::createReg(Reg));
Jack Carter3eb663b2013-09-26 00:09:46 +00001611 return MCDisassembler::Success;
1612}
1613
Jack Carter5dc8ac92013-09-25 23:50:44 +00001614static DecodeStatus DecodeMSA128HRegisterClass(MCInst &Inst,
1615 unsigned RegNo,
1616 uint64_t Address,
1617 const void *Decoder) {
1618 if (RegNo > 31)
1619 return MCDisassembler::Fail;
1620
1621 unsigned Reg = getReg(Decoder, Mips::MSA128HRegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001622 Inst.addOperand(MCOperand::createReg(Reg));
Jack Carter5dc8ac92013-09-25 23:50:44 +00001623 return MCDisassembler::Success;
1624}
1625
1626static DecodeStatus DecodeMSA128WRegisterClass(MCInst &Inst,
1627 unsigned RegNo,
1628 uint64_t Address,
1629 const void *Decoder) {
1630 if (RegNo > 31)
1631 return MCDisassembler::Fail;
1632
1633 unsigned Reg = getReg(Decoder, Mips::MSA128WRegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001634 Inst.addOperand(MCOperand::createReg(Reg));
Jack Carter5dc8ac92013-09-25 23:50:44 +00001635 return MCDisassembler::Success;
1636}
1637
1638static DecodeStatus DecodeMSA128DRegisterClass(MCInst &Inst,
1639 unsigned RegNo,
1640 uint64_t Address,
1641 const void *Decoder) {
1642 if (RegNo > 31)
1643 return MCDisassembler::Fail;
1644
1645 unsigned Reg = getReg(Decoder, Mips::MSA128DRegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001646 Inst.addOperand(MCOperand::createReg(Reg));
Jack Carter5dc8ac92013-09-25 23:50:44 +00001647 return MCDisassembler::Success;
1648}
1649
Matheus Almeidaa591fdc2013-10-21 12:26:50 +00001650static DecodeStatus DecodeMSACtrlRegisterClass(MCInst &Inst,
1651 unsigned RegNo,
1652 uint64_t Address,
1653 const void *Decoder) {
1654 if (RegNo > 7)
1655 return MCDisassembler::Fail;
1656
1657 unsigned Reg = getReg(Decoder, Mips::MSACtrlRegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001658 Inst.addOperand(MCOperand::createReg(Reg));
Matheus Almeidaa591fdc2013-10-21 12:26:50 +00001659 return MCDisassembler::Success;
1660}
1661
Daniel Sandersa3134fa2015-06-27 15:39:19 +00001662static DecodeStatus DecodeCOP0RegisterClass(MCInst &Inst,
1663 unsigned RegNo,
1664 uint64_t Address,
1665 const void *Decoder) {
1666 if (RegNo > 31)
1667 return MCDisassembler::Fail;
1668
1669 unsigned Reg = getReg(Decoder, Mips::COP0RegClassID, RegNo);
1670 Inst.addOperand(MCOperand::createReg(Reg));
1671 return MCDisassembler::Success;
1672}
1673
Daniel Sanders2a83d682014-05-21 12:56:39 +00001674static DecodeStatus DecodeCOP2RegisterClass(MCInst &Inst,
1675 unsigned RegNo,
1676 uint64_t Address,
1677 const void *Decoder) {
1678 if (RegNo > 31)
1679 return MCDisassembler::Fail;
1680
1681 unsigned Reg = getReg(Decoder, Mips::COP2RegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001682 Inst.addOperand(MCOperand::createReg(Reg));
Daniel Sanders2a83d682014-05-21 12:56:39 +00001683 return MCDisassembler::Success;
1684}
1685
Akira Hatanaka71928e62012-04-17 18:03:21 +00001686static DecodeStatus DecodeBranchTarget(MCInst &Inst,
1687 unsigned Offset,
1688 uint64_t Address,
1689 const void *Decoder) {
Alexey Samsonovd37bab62014-09-02 17:49:16 +00001690 int32_t BranchOffset = (SignExtend32<16>(Offset) * 4) + 4;
Jim Grosbache9119e42015-05-13 18:37:00 +00001691 Inst.addOperand(MCOperand::createImm(BranchOffset));
Akira Hatanaka71928e62012-04-17 18:03:21 +00001692 return MCDisassembler::Success;
1693}
1694
Akira Hatanaka71928e62012-04-17 18:03:21 +00001695static DecodeStatus DecodeJumpTarget(MCInst &Inst,
1696 unsigned Insn,
1697 uint64_t Address,
1698 const void *Decoder) {
1699
Jim Grosbachecaef492012-08-14 19:06:05 +00001700 unsigned JumpOffset = fieldFromInstruction(Insn, 0, 26) << 2;
Jim Grosbache9119e42015-05-13 18:37:00 +00001701 Inst.addOperand(MCOperand::createImm(JumpOffset));
Akira Hatanaka71928e62012-04-17 18:03:21 +00001702 return MCDisassembler::Success;
1703}
1704
Zoran Jovanovic3c8869d2014-05-16 11:03:45 +00001705static DecodeStatus DecodeBranchTarget21(MCInst &Inst,
1706 unsigned Offset,
1707 uint64_t Address,
1708 const void *Decoder) {
Alexey Samsonovd37bab62014-09-02 17:49:16 +00001709 int32_t BranchOffset = SignExtend32<21>(Offset) * 4;
Zoran Jovanovic3c8869d2014-05-16 11:03:45 +00001710
Jim Grosbache9119e42015-05-13 18:37:00 +00001711 Inst.addOperand(MCOperand::createImm(BranchOffset));
Zoran Jovanovic3c8869d2014-05-16 11:03:45 +00001712 return MCDisassembler::Success;
1713}
1714
1715static DecodeStatus DecodeBranchTarget26(MCInst &Inst,
1716 unsigned Offset,
1717 uint64_t Address,
1718 const void *Decoder) {
Alexey Samsonovd37bab62014-09-02 17:49:16 +00001719 int32_t BranchOffset = SignExtend32<26>(Offset) * 4;
Zoran Jovanovic3c8869d2014-05-16 11:03:45 +00001720
Jim Grosbache9119e42015-05-13 18:37:00 +00001721 Inst.addOperand(MCOperand::createImm(BranchOffset));
Zoran Jovanovic3c8869d2014-05-16 11:03:45 +00001722 return MCDisassembler::Success;
1723}
1724
Jozef Kolek9761e962015-01-12 12:03:34 +00001725static DecodeStatus DecodeBranchTarget7MM(MCInst &Inst,
1726 unsigned Offset,
1727 uint64_t Address,
1728 const void *Decoder) {
1729 int32_t BranchOffset = SignExtend32<7>(Offset) << 1;
Jim Grosbache9119e42015-05-13 18:37:00 +00001730 Inst.addOperand(MCOperand::createImm(BranchOffset));
Jozef Kolek9761e962015-01-12 12:03:34 +00001731 return MCDisassembler::Success;
1732}
1733
Jozef Kolek5cfebdd2015-01-21 12:39:30 +00001734static DecodeStatus DecodeBranchTarget10MM(MCInst &Inst,
1735 unsigned Offset,
1736 uint64_t Address,
1737 const void *Decoder) {
1738 int32_t BranchOffset = SignExtend32<10>(Offset) << 1;
Jim Grosbache9119e42015-05-13 18:37:00 +00001739 Inst.addOperand(MCOperand::createImm(BranchOffset));
Jozef Kolek5cfebdd2015-01-21 12:39:30 +00001740 return MCDisassembler::Success;
1741}
1742
Zoran Jovanovic8a80aa72013-11-04 14:53:22 +00001743static DecodeStatus DecodeBranchTargetMM(MCInst &Inst,
1744 unsigned Offset,
1745 uint64_t Address,
1746 const void *Decoder) {
Alexey Samsonovd37bab62014-09-02 17:49:16 +00001747 int32_t BranchOffset = SignExtend32<16>(Offset) * 2;
Jim Grosbache9119e42015-05-13 18:37:00 +00001748 Inst.addOperand(MCOperand::createImm(BranchOffset));
Zoran Jovanovic8a80aa72013-11-04 14:53:22 +00001749 return MCDisassembler::Success;
1750}
1751
Zoran Jovanovic507e0842013-10-29 16:38:59 +00001752static DecodeStatus DecodeJumpTargetMM(MCInst &Inst,
1753 unsigned Insn,
1754 uint64_t Address,
1755 const void *Decoder) {
1756 unsigned JumpOffset = fieldFromInstruction(Insn, 0, 26) << 1;
Jim Grosbache9119e42015-05-13 18:37:00 +00001757 Inst.addOperand(MCOperand::createImm(JumpOffset));
Zoran Jovanovic507e0842013-10-29 16:38:59 +00001758 return MCDisassembler::Success;
1759}
Akira Hatanaka71928e62012-04-17 18:03:21 +00001760
Jozef Kolekaa2b9272014-11-27 14:41:44 +00001761static DecodeStatus DecodeAddiur2Simm7(MCInst &Inst,
1762 unsigned Value,
1763 uint64_t Address,
1764 const void *Decoder) {
1765 if (Value == 0)
Jim Grosbache9119e42015-05-13 18:37:00 +00001766 Inst.addOperand(MCOperand::createImm(1));
Jozef Kolekaa2b9272014-11-27 14:41:44 +00001767 else if (Value == 0x7)
Jim Grosbache9119e42015-05-13 18:37:00 +00001768 Inst.addOperand(MCOperand::createImm(-1));
Jozef Kolekaa2b9272014-11-27 14:41:44 +00001769 else
Jim Grosbache9119e42015-05-13 18:37:00 +00001770 Inst.addOperand(MCOperand::createImm(Value << 2));
Jozef Kolekaa2b9272014-11-27 14:41:44 +00001771 return MCDisassembler::Success;
1772}
1773
1774static DecodeStatus DecodeUImm6Lsl2(MCInst &Inst,
1775 unsigned Value,
1776 uint64_t Address,
1777 const void *Decoder) {
Jim Grosbache9119e42015-05-13 18:37:00 +00001778 Inst.addOperand(MCOperand::createImm(Value << 2));
Jozef Kolekaa2b9272014-11-27 14:41:44 +00001779 return MCDisassembler::Success;
1780}
1781
1782static DecodeStatus DecodeLiSimm7(MCInst &Inst,
1783 unsigned Value,
1784 uint64_t Address,
1785 const void *Decoder) {
1786 if (Value == 0x7F)
Jim Grosbache9119e42015-05-13 18:37:00 +00001787 Inst.addOperand(MCOperand::createImm(-1));
Jozef Kolekaa2b9272014-11-27 14:41:44 +00001788 else
Jim Grosbache9119e42015-05-13 18:37:00 +00001789 Inst.addOperand(MCOperand::createImm(Value));
Jozef Kolekaa2b9272014-11-27 14:41:44 +00001790 return MCDisassembler::Success;
1791}
1792
Zoran Jovanovic6b28f092015-09-09 13:55:45 +00001793static DecodeStatus DecodePOOL16BEncodedField(MCInst &Inst,
1794 unsigned Value,
1795 uint64_t Address,
1796 const void *Decoder) {
1797 Inst.addOperand(MCOperand::createImm(Value == 0x0 ? 8 : Value));
1798 return MCDisassembler::Success;
1799}
1800
Jozef Kolekaa2b9272014-11-27 14:41:44 +00001801static DecodeStatus DecodeSimm4(MCInst &Inst,
1802 unsigned Value,
1803 uint64_t Address,
1804 const void *Decoder) {
Jim Grosbache9119e42015-05-13 18:37:00 +00001805 Inst.addOperand(MCOperand::createImm(SignExtend32<4>(Value)));
Jozef Kolekaa2b9272014-11-27 14:41:44 +00001806 return MCDisassembler::Success;
1807}
1808
Akira Hatanaka71928e62012-04-17 18:03:21 +00001809static DecodeStatus DecodeSimm16(MCInst &Inst,
1810 unsigned Insn,
1811 uint64_t Address,
1812 const void *Decoder) {
Jim Grosbache9119e42015-05-13 18:37:00 +00001813 Inst.addOperand(MCOperand::createImm(SignExtend32<16>(Insn)));
Akira Hatanaka71928e62012-04-17 18:03:21 +00001814 return MCDisassembler::Success;
1815}
1816
Matheus Almeida779c5932013-11-18 12:32:49 +00001817static DecodeStatus DecodeLSAImm(MCInst &Inst,
1818 unsigned Insn,
1819 uint64_t Address,
1820 const void *Decoder) {
1821 // We add one to the immediate field as it was encoded as 'imm - 1'.
Jim Grosbache9119e42015-05-13 18:37:00 +00001822 Inst.addOperand(MCOperand::createImm(Insn + 1));
Matheus Almeida779c5932013-11-18 12:32:49 +00001823 return MCDisassembler::Success;
1824}
1825
Akira Hatanaka71928e62012-04-17 18:03:21 +00001826static DecodeStatus DecodeInsSize(MCInst &Inst,
1827 unsigned Insn,
1828 uint64_t Address,
1829 const void *Decoder) {
1830 // First we need to grab the pos(lsb) from MCInst.
1831 int Pos = Inst.getOperand(2).getImm();
1832 int Size = (int) Insn - Pos + 1;
Jim Grosbache9119e42015-05-13 18:37:00 +00001833 Inst.addOperand(MCOperand::createImm(SignExtend32<16>(Size)));
Akira Hatanaka71928e62012-04-17 18:03:21 +00001834 return MCDisassembler::Success;
1835}
1836
1837static DecodeStatus DecodeExtSize(MCInst &Inst,
1838 unsigned Insn,
1839 uint64_t Address,
1840 const void *Decoder) {
1841 int Size = (int) Insn + 1;
Jim Grosbache9119e42015-05-13 18:37:00 +00001842 Inst.addOperand(MCOperand::createImm(SignExtend32<16>(Size)));
Akira Hatanaka71928e62012-04-17 18:03:21 +00001843 return MCDisassembler::Success;
1844}
Daniel Sandersb59e1a42014-05-15 10:45:58 +00001845
1846static DecodeStatus DecodeSimm19Lsl2(MCInst &Inst, unsigned Insn,
1847 uint64_t Address, const void *Decoder) {
Jim Grosbache9119e42015-05-13 18:37:00 +00001848 Inst.addOperand(MCOperand::createImm(SignExtend32<19>(Insn) * 4));
Daniel Sandersb59e1a42014-05-15 10:45:58 +00001849 return MCDisassembler::Success;
1850}
Zoran Jovanovic28551422014-06-09 09:49:51 +00001851
1852static DecodeStatus DecodeSimm18Lsl3(MCInst &Inst, unsigned Insn,
1853 uint64_t Address, const void *Decoder) {
Jim Grosbache9119e42015-05-13 18:37:00 +00001854 Inst.addOperand(MCOperand::createImm(SignExtend32<18>(Insn) * 8));
Zoran Jovanovic28551422014-06-09 09:49:51 +00001855 return MCDisassembler::Success;
1856}
Zoran Jovanovica4c4b5f2014-11-19 16:44:02 +00001857
Vladimir Medicb682ddf2014-12-01 11:12:04 +00001858static DecodeStatus DecodeSimm9SP(MCInst &Inst, unsigned Insn,
1859 uint64_t Address, const void *Decoder) {
1860 int32_t DecodedValue;
1861 switch (Insn) {
1862 case 0: DecodedValue = 256; break;
1863 case 1: DecodedValue = 257; break;
1864 case 510: DecodedValue = -258; break;
1865 case 511: DecodedValue = -257; break;
1866 default: DecodedValue = SignExtend32<9>(Insn); break;
1867 }
Jim Grosbache9119e42015-05-13 18:37:00 +00001868 Inst.addOperand(MCOperand::createImm(DecodedValue * 4));
Vladimir Medicb682ddf2014-12-01 11:12:04 +00001869 return MCDisassembler::Success;
1870}
1871
1872static DecodeStatus DecodeANDI16Imm(MCInst &Inst, unsigned Insn,
1873 uint64_t Address, const void *Decoder) {
1874 // Insn must be >= 0, since it is unsigned that condition is always true.
1875 assert(Insn < 16);
1876 int32_t DecodedValues[] = {128, 1, 2, 3, 4, 7, 8, 15, 16, 31, 32, 63, 64,
1877 255, 32768, 65535};
Jim Grosbache9119e42015-05-13 18:37:00 +00001878 Inst.addOperand(MCOperand::createImm(DecodedValues[Insn]));
Vladimir Medicb682ddf2014-12-01 11:12:04 +00001879 return MCDisassembler::Success;
1880}
1881
1882static DecodeStatus DecodeUImm5lsl2(MCInst &Inst, unsigned Insn,
1883 uint64_t Address, const void *Decoder) {
Jim Grosbache9119e42015-05-13 18:37:00 +00001884 Inst.addOperand(MCOperand::createImm(Insn << 2));
Vladimir Medicb682ddf2014-12-01 11:12:04 +00001885 return MCDisassembler::Success;
1886}
1887
Zoran Jovanovica4c4b5f2014-11-19 16:44:02 +00001888static DecodeStatus DecodeRegListOperand(MCInst &Inst,
1889 unsigned Insn,
1890 uint64_t Address,
1891 const void *Decoder) {
1892 unsigned Regs[] = {Mips::S0, Mips::S1, Mips::S2, Mips::S3, Mips::S4, Mips::S5,
1893 Mips::S6, Mips::FP};
1894 unsigned RegNum;
1895
1896 unsigned RegLst = fieldFromInstruction(Insn, 21, 5);
1897 // Empty register lists are not allowed.
1898 if (RegLst == 0)
1899 return MCDisassembler::Fail;
1900
1901 RegNum = RegLst & 0xf;
1902 for (unsigned i = 0; i < RegNum; i++)
Jim Grosbache9119e42015-05-13 18:37:00 +00001903 Inst.addOperand(MCOperand::createReg(Regs[i]));
Zoran Jovanovica4c4b5f2014-11-19 16:44:02 +00001904
1905 if (RegLst & 0x10)
Jim Grosbache9119e42015-05-13 18:37:00 +00001906 Inst.addOperand(MCOperand::createReg(Mips::RA));
Zoran Jovanovica4c4b5f2014-11-19 16:44:02 +00001907
1908 return MCDisassembler::Success;
1909}
Zoran Jovanovicf9a02502014-11-27 18:28:59 +00001910
1911static DecodeStatus DecodeRegListOperand16(MCInst &Inst, unsigned Insn,
1912 uint64_t Address,
1913 const void *Decoder) {
1914 unsigned Regs[] = {Mips::S0, Mips::S1, Mips::S2, Mips::S3};
Zoran Jovanovicf9a02502014-11-27 18:28:59 +00001915 unsigned RegLst = fieldFromInstruction(Insn, 4, 2);
Jozef Kolekd68d424a2015-02-10 12:41:13 +00001916 unsigned RegNum = RegLst & 0x3;
Zoran Jovanovicf9a02502014-11-27 18:28:59 +00001917
Jozef Kolekd68d424a2015-02-10 12:41:13 +00001918 for (unsigned i = 0; i <= RegNum; i++)
Jim Grosbache9119e42015-05-13 18:37:00 +00001919 Inst.addOperand(MCOperand::createReg(Regs[i]));
Zoran Jovanovicf9a02502014-11-27 18:28:59 +00001920
Jim Grosbache9119e42015-05-13 18:37:00 +00001921 Inst.addOperand(MCOperand::createReg(Mips::RA));
Zoran Jovanovicf9a02502014-11-27 18:28:59 +00001922
1923 return MCDisassembler::Success;
1924}
Jozef Kolek2c6d7322015-01-21 12:10:11 +00001925
Zoran Jovanovic41688672015-02-10 16:36:20 +00001926static DecodeStatus DecodeMovePRegPair(MCInst &Inst, unsigned Insn,
1927 uint64_t Address, const void *Decoder) {
1928
1929 unsigned RegPair = fieldFromInstruction(Insn, 7, 3);
1930
1931 switch (RegPair) {
1932 default:
1933 return MCDisassembler::Fail;
1934 case 0:
Jim Grosbache9119e42015-05-13 18:37:00 +00001935 Inst.addOperand(MCOperand::createReg(Mips::A1));
1936 Inst.addOperand(MCOperand::createReg(Mips::A2));
Zoran Jovanovic41688672015-02-10 16:36:20 +00001937 break;
1938 case 1:
Jim Grosbache9119e42015-05-13 18:37:00 +00001939 Inst.addOperand(MCOperand::createReg(Mips::A1));
1940 Inst.addOperand(MCOperand::createReg(Mips::A3));
Zoran Jovanovic41688672015-02-10 16:36:20 +00001941 break;
1942 case 2:
Jim Grosbache9119e42015-05-13 18:37:00 +00001943 Inst.addOperand(MCOperand::createReg(Mips::A2));
1944 Inst.addOperand(MCOperand::createReg(Mips::A3));
Zoran Jovanovic41688672015-02-10 16:36:20 +00001945 break;
1946 case 3:
Jim Grosbache9119e42015-05-13 18:37:00 +00001947 Inst.addOperand(MCOperand::createReg(Mips::A0));
1948 Inst.addOperand(MCOperand::createReg(Mips::S5));
Zoran Jovanovic41688672015-02-10 16:36:20 +00001949 break;
1950 case 4:
Jim Grosbache9119e42015-05-13 18:37:00 +00001951 Inst.addOperand(MCOperand::createReg(Mips::A0));
1952 Inst.addOperand(MCOperand::createReg(Mips::S6));
Zoran Jovanovic41688672015-02-10 16:36:20 +00001953 break;
1954 case 5:
Jim Grosbache9119e42015-05-13 18:37:00 +00001955 Inst.addOperand(MCOperand::createReg(Mips::A0));
1956 Inst.addOperand(MCOperand::createReg(Mips::A1));
Zoran Jovanovic41688672015-02-10 16:36:20 +00001957 break;
1958 case 6:
Jim Grosbache9119e42015-05-13 18:37:00 +00001959 Inst.addOperand(MCOperand::createReg(Mips::A0));
1960 Inst.addOperand(MCOperand::createReg(Mips::A2));
Zoran Jovanovic41688672015-02-10 16:36:20 +00001961 break;
1962 case 7:
Jim Grosbache9119e42015-05-13 18:37:00 +00001963 Inst.addOperand(MCOperand::createReg(Mips::A0));
1964 Inst.addOperand(MCOperand::createReg(Mips::A3));
Zoran Jovanovic41688672015-02-10 16:36:20 +00001965 break;
1966 }
1967
1968 return MCDisassembler::Success;
1969}
1970
Jozef Kolek2c6d7322015-01-21 12:10:11 +00001971static DecodeStatus DecodeSimm23Lsl2(MCInst &Inst, unsigned Insn,
1972 uint64_t Address, const void *Decoder) {
Justin Bogner6499b5f2015-06-23 07:28:57 +00001973 Inst.addOperand(MCOperand::createImm(SignExtend32<25>(Insn << 2)));
Jozef Kolek2c6d7322015-01-21 12:10:11 +00001974 return MCDisassembler::Success;
1975}