blob: 8f7aeb286d2960ddfac63b4adfcfc0ce8bd5f097 [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"
Benjamin Kramerf57c1972016-01-26 16:44:37 +000018#include "llvm/MC/MCDisassembler/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
Vasileios Kalintiris36901dd2016-03-01 20:25:43 +0000127static DecodeStatus DecodeFGRCCRegisterClass(MCInst &Inst, unsigned RegNo,
128 uint64_t Address,
129 const void *Decoder);
Daniel Sanders0fa60412014-06-12 13:39:06 +0000130
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 Jovanovica887b362015-11-30 12:56:18 +0000232// DecodeBranchTarget26MM - Decode microMIPS branch offset, which is
233// shifted left by 1 bit.
234static DecodeStatus DecodeBranchTarget26MM(MCInst &Inst,
235 unsigned Offset,
236 uint64_t Address,
237 const void *Decoder);
238
Zoran Jovanovic507e0842013-10-29 16:38:59 +0000239// DecodeJumpTargetMM - Decode microMIPS jump target, which is
240// shifted left by 1 bit.
241static DecodeStatus DecodeJumpTargetMM(MCInst &Inst,
242 unsigned Insn,
243 uint64_t Address,
244 const void *Decoder);
245
Akira Hatanaka71928e62012-04-17 18:03:21 +0000246static DecodeStatus DecodeMem(MCInst &Inst,
247 unsigned Insn,
248 uint64_t Address,
249 const void *Decoder);
250
Daniel Sanderse4e83a72015-09-15 10:02:16 +0000251static DecodeStatus DecodeMemEVA(MCInst &Inst,
252 unsigned Insn,
253 uint64_t Address,
254 const void *Decoder);
255
Hrvoje Varga3c88fbd2015-10-16 12:24:58 +0000256static DecodeStatus DecodeLoadByte9(MCInst &Inst,
257 unsigned Insn,
258 uint64_t Address,
259 const void *Decoder);
260
261static DecodeStatus DecodeLoadByte15(MCInst &Inst,
262 unsigned Insn,
263 uint64_t Address,
264 const void *Decoder);
265
Daniel Sanders92db6b72014-10-01 08:26:55 +0000266static DecodeStatus DecodeCacheOp(MCInst &Inst,
267 unsigned Insn,
268 uint64_t Address,
269 const void *Decoder);
270
Daniel Sanderse4e83a72015-09-15 10:02:16 +0000271static DecodeStatus DecodeCacheeOp_CacheOpR6(MCInst &Inst,
272 unsigned Insn,
273 uint64_t Address,
274 const void *Decoder);
Vladimir Medicdf464ae2015-01-29 11:33:41 +0000275
Jozef Kolekab6d1cc2014-12-23 19:55:34 +0000276static DecodeStatus DecodeCacheOpMM(MCInst &Inst,
277 unsigned Insn,
278 uint64_t Address,
279 const void *Decoder);
280
Zoran Jovanovic9eaa30d2015-09-08 10:18:38 +0000281static DecodeStatus DecodeStoreEvaOpMM(MCInst &Inst,
282 unsigned Insn,
283 uint64_t Address,
284 const void *Decoder);
285
Zoran Jovanovicd9790792015-09-09 09:10:46 +0000286static DecodeStatus DecodePrefeOpMM(MCInst &Inst,
287 unsigned Insn,
288 uint64_t Address,
289 const void *Decoder);
290
Daniel Sandersb4484d62014-11-27 17:28:10 +0000291static DecodeStatus DecodeSyncI(MCInst &Inst,
292 unsigned Insn,
293 uint64_t Address,
294 const void *Decoder);
295
Hrvoje Varga18148672015-10-28 11:04:29 +0000296static DecodeStatus DecodeSynciR6(MCInst &Inst,
297 unsigned Insn,
298 uint64_t Address,
299 const void *Decoder);
300
Matheus Almeidafe0bf9f2013-10-21 13:07:13 +0000301static DecodeStatus DecodeMSA128Mem(MCInst &Inst, unsigned Insn,
302 uint64_t Address, const void *Decoder);
303
Jozef Kolek315e7ec2014-11-26 18:56:38 +0000304static DecodeStatus DecodeMemMMImm4(MCInst &Inst,
305 unsigned Insn,
306 uint64_t Address,
307 const void *Decoder);
308
Jozef Kolek12c69822014-12-23 16:16:33 +0000309static DecodeStatus DecodeMemMMSPImm5Lsl2(MCInst &Inst,
310 unsigned Insn,
311 uint64_t Address,
312 const void *Decoder);
313
Jozef Koleke10a02e2015-01-28 17:27:26 +0000314static DecodeStatus DecodeMemMMGPImm7Lsl2(MCInst &Inst,
315 unsigned Insn,
316 uint64_t Address,
317 const void *Decoder);
318
Jozef Kolekd68d424a2015-02-10 12:41:13 +0000319static DecodeStatus DecodeMemMMReglistImm4Lsl2(MCInst &Inst,
320 unsigned Insn,
321 uint64_t Address,
322 const void *Decoder);
323
Zoran Jovanovica6593ff2015-08-18 12:53:08 +0000324static DecodeStatus DecodeMemMMImm9(MCInst &Inst,
325 unsigned Insn,
326 uint64_t Address,
327 const void *Decoder);
328
Vladimir Medicdde3d582013-09-06 12:30:36 +0000329static DecodeStatus DecodeMemMMImm12(MCInst &Inst,
330 unsigned Insn,
331 uint64_t Address,
332 const void *Decoder);
333
334static DecodeStatus DecodeMemMMImm16(MCInst &Inst,
335 unsigned Insn,
336 uint64_t Address,
337 const void *Decoder);
338
Akira Hatanaka71928e62012-04-17 18:03:21 +0000339static DecodeStatus DecodeFMem(MCInst &Inst, unsigned Insn,
340 uint64_t Address,
341 const void *Decoder);
342
Daniel Sanders92db6b72014-10-01 08:26:55 +0000343static DecodeStatus DecodeFMem2(MCInst &Inst, unsigned Insn,
344 uint64_t Address,
345 const void *Decoder);
346
347static DecodeStatus DecodeFMem3(MCInst &Inst, unsigned Insn,
348 uint64_t Address,
349 const void *Decoder);
350
Vladimir Medic435cf8a2015-01-21 10:47:36 +0000351static DecodeStatus DecodeFMemCop2R6(MCInst &Inst, unsigned Insn,
352 uint64_t Address,
353 const void *Decoder);
354
Daniel Sanders6a803f62014-06-16 13:13:03 +0000355static DecodeStatus DecodeSpecial3LlSc(MCInst &Inst,
356 unsigned Insn,
357 uint64_t Address,
358 const void *Decoder);
359
Jozef Kolekaa2b9272014-11-27 14:41:44 +0000360static DecodeStatus DecodeAddiur2Simm7(MCInst &Inst,
361 unsigned Value,
362 uint64_t Address,
363 const void *Decoder);
364
Daniel Sanders97297772016-03-22 14:40:00 +0000365static DecodeStatus DecodeLi16Imm(MCInst &Inst,
Jozef Kolekaa2b9272014-11-27 14:41:44 +0000366 unsigned Value,
367 uint64_t Address,
368 const void *Decoder);
369
Zoran Jovanovic6b28f092015-09-09 13:55:45 +0000370static DecodeStatus DecodePOOL16BEncodedField(MCInst &Inst,
371 unsigned Value,
372 uint64_t Address,
373 const void *Decoder);
374
Akira Hatanaka71928e62012-04-17 18:03:21 +0000375static DecodeStatus DecodeSimm16(MCInst &Inst,
376 unsigned Insn,
377 uint64_t Address,
378 const void *Decoder);
379
Daniel Sanders19b7f762016-03-14 11:16:56 +0000380template <unsigned Bits, int Offset, int Scale>
381static DecodeStatus DecodeUImmWithOffsetAndScale(MCInst &Inst, unsigned Value,
382 uint64_t Address,
383 const void *Decoder);
384
Daniel Sandersea4f6532015-11-06 12:22:31 +0000385template <unsigned Bits, int Offset>
386static DecodeStatus DecodeUImmWithOffset(MCInst &Inst, unsigned Value,
Daniel Sanders19b7f762016-03-14 11:16:56 +0000387 uint64_t Address,
388 const void *Decoder) {
389 return DecodeUImmWithOffsetAndScale<Bits, Offset, 1>(Inst, Value, Address,
390 Decoder);
391}
Matheus Almeida779c5932013-11-18 12:32:49 +0000392
Daniel Sanders97297772016-03-22 14:40:00 +0000393template <unsigned Bits, int Offset = 0, int ScaleBy = 1>
394static DecodeStatus DecodeSImmWithOffsetAndScale(MCInst &Inst, unsigned Value,
395 uint64_t Address,
396 const void *Decoder);
Daniel Sanders78e89022016-03-11 11:37:50 +0000397
Akira Hatanaka71928e62012-04-17 18:03:21 +0000398static DecodeStatus DecodeInsSize(MCInst &Inst,
399 unsigned Insn,
400 uint64_t Address,
401 const void *Decoder);
402
Daniel Sandersb59e1a42014-05-15 10:45:58 +0000403static DecodeStatus DecodeSimm19Lsl2(MCInst &Inst, unsigned Insn,
404 uint64_t Address, const void *Decoder);
405
Zoran Jovanovic28551422014-06-09 09:49:51 +0000406static DecodeStatus DecodeSimm18Lsl3(MCInst &Inst, unsigned Insn,
407 uint64_t Address, const void *Decoder);
408
Vladimir Medicb682ddf2014-12-01 11:12:04 +0000409static DecodeStatus DecodeSimm9SP(MCInst &Inst, unsigned Insn,
410 uint64_t Address, const void *Decoder);
411
412static DecodeStatus DecodeANDI16Imm(MCInst &Inst, unsigned Insn,
413 uint64_t Address, const void *Decoder);
414
Jozef Kolek2c6d7322015-01-21 12:10:11 +0000415static DecodeStatus DecodeSimm23Lsl2(MCInst &Inst, unsigned Insn,
416 uint64_t Address, const void *Decoder);
417
Daniel Sandersb50ccf82014-04-01 10:35:28 +0000418/// INSVE_[BHWD] have an implicit operand that the generated decoder doesn't
419/// handle.
420template <typename InsnType>
421static DecodeStatus DecodeINSVE_DF(MCInst &MI, InsnType insn, uint64_t Address,
422 const void *Decoder);
Daniel Sanders5c582b22014-05-22 11:23:21 +0000423
424template <typename InsnType>
425static DecodeStatus
426DecodeAddiGroupBranch(MCInst &MI, InsnType insn, uint64_t Address,
427 const void *Decoder);
428
429template <typename InsnType>
430static DecodeStatus
431DecodeDaddiGroupBranch(MCInst &MI, InsnType insn, uint64_t Address,
432 const void *Decoder);
433
434template <typename InsnType>
435static DecodeStatus
436DecodeBlezlGroupBranch(MCInst &MI, InsnType insn, uint64_t Address,
437 const void *Decoder);
438
439template <typename InsnType>
440static DecodeStatus
441DecodeBgtzlGroupBranch(MCInst &MI, InsnType insn, uint64_t Address,
442 const void *Decoder);
443
444template <typename InsnType>
445static DecodeStatus
446DecodeBgtzGroupBranch(MCInst &MI, InsnType insn, uint64_t Address,
447 const void *Decoder);
448
Zoran Jovanovic28a0ca02014-06-12 11:47:44 +0000449template <typename InsnType>
450static DecodeStatus
451DecodeBlezGroupBranch(MCInst &MI, InsnType insn, uint64_t Address,
452 const void *Decoder);
453
Zoran Jovanovica4c4b5f2014-11-19 16:44:02 +0000454static DecodeStatus DecodeRegListOperand(MCInst &Inst, unsigned Insn,
455 uint64_t Address,
456 const void *Decoder);
457
Zoran Jovanovicf9a02502014-11-27 18:28:59 +0000458static DecodeStatus DecodeRegListOperand16(MCInst &Inst, unsigned Insn,
459 uint64_t Address,
460 const void *Decoder);
461
Zoran Jovanovic41688672015-02-10 16:36:20 +0000462static DecodeStatus DecodeMovePRegPair(MCInst &Inst, unsigned Insn,
463 uint64_t Address,
464 const void *Decoder);
465
Akira Hatanaka71928e62012-04-17 18:03:21 +0000466namespace llvm {
467extern Target TheMipselTarget, TheMipsTarget, TheMips64Target,
468 TheMips64elTarget;
469}
470
471static MCDisassembler *createMipsDisassembler(
472 const Target &T,
Lang Hamesa1bc0f52014-04-15 04:40:56 +0000473 const MCSubtargetInfo &STI,
474 MCContext &Ctx) {
475 return new MipsDisassembler(STI, Ctx, true);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000476}
477
478static MCDisassembler *createMipselDisassembler(
479 const Target &T,
Lang Hamesa1bc0f52014-04-15 04:40:56 +0000480 const MCSubtargetInfo &STI,
481 MCContext &Ctx) {
482 return new MipsDisassembler(STI, Ctx, false);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000483}
484
Akira Hatanaka71928e62012-04-17 18:03:21 +0000485extern "C" void LLVMInitializeMipsDisassembler() {
486 // Register the disassembler.
487 TargetRegistry::RegisterMCDisassembler(TheMipsTarget,
488 createMipsDisassembler);
489 TargetRegistry::RegisterMCDisassembler(TheMipselTarget,
490 createMipselDisassembler);
491 TargetRegistry::RegisterMCDisassembler(TheMips64Target,
Daniel Sandersa19216c2015-02-11 11:28:56 +0000492 createMipsDisassembler);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000493 TargetRegistry::RegisterMCDisassembler(TheMips64elTarget,
Daniel Sandersa19216c2015-02-11 11:28:56 +0000494 createMipselDisassembler);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000495}
496
Akira Hatanaka71928e62012-04-17 18:03:21 +0000497#include "MipsGenDisassemblerTables.inc"
498
Daniel Sanders5c582b22014-05-22 11:23:21 +0000499static unsigned getReg(const void *D, unsigned RC, unsigned RegNo) {
Daniel Sandersa19216c2015-02-11 11:28:56 +0000500 const MipsDisassembler *Dis = static_cast<const MipsDisassembler*>(D);
Daniel Sanders5c582b22014-05-22 11:23:21 +0000501 const MCRegisterInfo *RegInfo = Dis->getContext().getRegisterInfo();
502 return *(RegInfo->getRegClass(RC).begin() + RegNo);
503}
504
Daniel Sandersb50ccf82014-04-01 10:35:28 +0000505template <typename InsnType>
506static DecodeStatus DecodeINSVE_DF(MCInst &MI, InsnType insn, uint64_t Address,
507 const void *Decoder) {
508 typedef DecodeStatus (*DecodeFN)(MCInst &, unsigned, uint64_t, const void *);
509 // The size of the n field depends on the element size
510 // The register class also depends on this.
511 InsnType tmp = fieldFromInstruction(insn, 17, 5);
512 unsigned NSize = 0;
513 DecodeFN RegDecoder = nullptr;
514 if ((tmp & 0x18) == 0x00) { // INSVE_B
515 NSize = 4;
516 RegDecoder = DecodeMSA128BRegisterClass;
517 } else if ((tmp & 0x1c) == 0x10) { // INSVE_H
518 NSize = 3;
519 RegDecoder = DecodeMSA128HRegisterClass;
520 } else if ((tmp & 0x1e) == 0x18) { // INSVE_W
521 NSize = 2;
522 RegDecoder = DecodeMSA128WRegisterClass;
523 } else if ((tmp & 0x1f) == 0x1c) { // INSVE_D
524 NSize = 1;
525 RegDecoder = DecodeMSA128DRegisterClass;
526 } else
527 llvm_unreachable("Invalid encoding");
528
529 assert(NSize != 0 && RegDecoder != nullptr);
530
531 // $wd
532 tmp = fieldFromInstruction(insn, 6, 5);
533 if (RegDecoder(MI, tmp, Address, Decoder) == MCDisassembler::Fail)
534 return MCDisassembler::Fail;
535 // $wd_in
536 if (RegDecoder(MI, tmp, Address, Decoder) == MCDisassembler::Fail)
537 return MCDisassembler::Fail;
538 // $n
539 tmp = fieldFromInstruction(insn, 16, NSize);
Jim Grosbache9119e42015-05-13 18:37:00 +0000540 MI.addOperand(MCOperand::createImm(tmp));
Daniel Sandersb50ccf82014-04-01 10:35:28 +0000541 // $ws
542 tmp = fieldFromInstruction(insn, 11, 5);
543 if (RegDecoder(MI, tmp, Address, Decoder) == MCDisassembler::Fail)
544 return MCDisassembler::Fail;
545 // $n2
Jim Grosbache9119e42015-05-13 18:37:00 +0000546 MI.addOperand(MCOperand::createImm(0));
Daniel Sandersb50ccf82014-04-01 10:35:28 +0000547
548 return MCDisassembler::Success;
549}
550
Daniel Sanders5c582b22014-05-22 11:23:21 +0000551template <typename InsnType>
552static DecodeStatus DecodeAddiGroupBranch(MCInst &MI, InsnType insn,
553 uint64_t Address,
554 const void *Decoder) {
555 // If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled
556 // (otherwise we would have matched the ADDI instruction from the earlier
557 // ISA's instead).
558 //
559 // We have:
560 // 0b001000 sssss ttttt iiiiiiiiiiiiiiii
561 // BOVC if rs >= rt
562 // BEQZALC if rs == 0 && rt != 0
563 // BEQC if rs < rt && rs != 0
564
565 InsnType Rs = fieldFromInstruction(insn, 21, 5);
566 InsnType Rt = fieldFromInstruction(insn, 16, 5);
Alexey Samsonovd37bab62014-09-02 17:49:16 +0000567 InsnType Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4;
Daniel Sanders5c582b22014-05-22 11:23:21 +0000568 bool HasRs = false;
569
570 if (Rs >= Rt) {
571 MI.setOpcode(Mips::BOVC);
572 HasRs = true;
573 } else if (Rs != 0 && Rs < Rt) {
574 MI.setOpcode(Mips::BEQC);
575 HasRs = true;
576 } else
577 MI.setOpcode(Mips::BEQZALC);
578
579 if (HasRs)
Jim Grosbache9119e42015-05-13 18:37:00 +0000580 MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
Daniel Sanders5c582b22014-05-22 11:23:21 +0000581 Rs)));
582
Jim Grosbache9119e42015-05-13 18:37:00 +0000583 MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
Daniel Sanders5c582b22014-05-22 11:23:21 +0000584 Rt)));
Jim Grosbache9119e42015-05-13 18:37:00 +0000585 MI.addOperand(MCOperand::createImm(Imm));
Daniel Sanders5c582b22014-05-22 11:23:21 +0000586
587 return MCDisassembler::Success;
588}
589
590template <typename InsnType>
591static DecodeStatus DecodeDaddiGroupBranch(MCInst &MI, InsnType insn,
592 uint64_t Address,
593 const void *Decoder) {
594 // If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled
595 // (otherwise we would have matched the ADDI instruction from the earlier
596 // ISA's instead).
597 //
598 // We have:
599 // 0b011000 sssss ttttt iiiiiiiiiiiiiiii
600 // BNVC if rs >= rt
601 // BNEZALC if rs == 0 && rt != 0
602 // BNEC if rs < rt && rs != 0
603
604 InsnType Rs = fieldFromInstruction(insn, 21, 5);
605 InsnType Rt = fieldFromInstruction(insn, 16, 5);
Alexey Samsonovd37bab62014-09-02 17:49:16 +0000606 InsnType Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4;
Daniel Sanders5c582b22014-05-22 11:23:21 +0000607 bool HasRs = false;
608
609 if (Rs >= Rt) {
610 MI.setOpcode(Mips::BNVC);
611 HasRs = true;
612 } else if (Rs != 0 && Rs < Rt) {
613 MI.setOpcode(Mips::BNEC);
614 HasRs = true;
615 } else
616 MI.setOpcode(Mips::BNEZALC);
617
618 if (HasRs)
Jim Grosbache9119e42015-05-13 18:37:00 +0000619 MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
Daniel Sanders5c582b22014-05-22 11:23:21 +0000620 Rs)));
621
Jim Grosbache9119e42015-05-13 18:37:00 +0000622 MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
Daniel Sanders5c582b22014-05-22 11:23:21 +0000623 Rt)));
Jim Grosbache9119e42015-05-13 18:37:00 +0000624 MI.addOperand(MCOperand::createImm(Imm));
Daniel Sanders5c582b22014-05-22 11:23:21 +0000625
626 return MCDisassembler::Success;
627}
628
629template <typename InsnType>
630static DecodeStatus DecodeBlezlGroupBranch(MCInst &MI, InsnType insn,
631 uint64_t Address,
632 const void *Decoder) {
633 // If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled
634 // (otherwise we would have matched the BLEZL instruction from the earlier
635 // ISA's instead).
636 //
637 // We have:
638 // 0b010110 sssss ttttt iiiiiiiiiiiiiiii
639 // Invalid if rs == 0
640 // BLEZC if rs == 0 && rt != 0
641 // BGEZC if rs == rt && rt != 0
642 // BGEC if rs != rt && rs != 0 && rt != 0
643
644 InsnType Rs = fieldFromInstruction(insn, 21, 5);
645 InsnType Rt = fieldFromInstruction(insn, 16, 5);
Alexey Samsonovd37bab62014-09-02 17:49:16 +0000646 InsnType Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4;
Zoran Jovanovic28a0ca02014-06-12 11:47:44 +0000647 bool HasRs = false;
Daniel Sanders5c582b22014-05-22 11:23:21 +0000648
649 if (Rt == 0)
650 return MCDisassembler::Fail;
651 else if (Rs == 0)
652 MI.setOpcode(Mips::BLEZC);
653 else if (Rs == Rt)
654 MI.setOpcode(Mips::BGEZC);
Zoran Jovanovic28a0ca02014-06-12 11:47:44 +0000655 else {
656 HasRs = true;
657 MI.setOpcode(Mips::BGEC);
658 }
659
660 if (HasRs)
Jim Grosbache9119e42015-05-13 18:37:00 +0000661 MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
Zoran Jovanovic28a0ca02014-06-12 11:47:44 +0000662 Rs)));
Daniel Sanders5c582b22014-05-22 11:23:21 +0000663
Jim Grosbache9119e42015-05-13 18:37:00 +0000664 MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
Daniel Sanders5c582b22014-05-22 11:23:21 +0000665 Rt)));
666
Jim Grosbache9119e42015-05-13 18:37:00 +0000667 MI.addOperand(MCOperand::createImm(Imm));
Daniel Sanders5c582b22014-05-22 11:23:21 +0000668
669 return MCDisassembler::Success;
670}
671
672template <typename InsnType>
673static DecodeStatus DecodeBgtzlGroupBranch(MCInst &MI, InsnType insn,
674 uint64_t Address,
675 const void *Decoder) {
676 // If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled
677 // (otherwise we would have matched the BGTZL instruction from the earlier
678 // ISA's instead).
679 //
680 // We have:
681 // 0b010111 sssss ttttt iiiiiiiiiiiiiiii
682 // Invalid if rs == 0
683 // BGTZC if rs == 0 && rt != 0
684 // BLTZC if rs == rt && rt != 0
685 // BLTC if rs != rt && rs != 0 && rt != 0
686
Zoran Jovanovic5c14b062014-06-18 14:36:00 +0000687 bool HasRs = false;
688
Daniel Sanders5c582b22014-05-22 11:23:21 +0000689 InsnType Rs = fieldFromInstruction(insn, 21, 5);
690 InsnType Rt = fieldFromInstruction(insn, 16, 5);
Alexey Samsonovd37bab62014-09-02 17:49:16 +0000691 InsnType Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4;
Daniel Sanders5c582b22014-05-22 11:23:21 +0000692
693 if (Rt == 0)
694 return MCDisassembler::Fail;
695 else if (Rs == 0)
696 MI.setOpcode(Mips::BGTZC);
697 else if (Rs == Rt)
698 MI.setOpcode(Mips::BLTZC);
Zoran Jovanovic5c14b062014-06-18 14:36:00 +0000699 else {
700 MI.setOpcode(Mips::BLTC);
701 HasRs = true;
702 }
703
704 if (HasRs)
Jim Grosbache9119e42015-05-13 18:37:00 +0000705 MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
Zoran Jovanovic5c14b062014-06-18 14:36:00 +0000706 Rs)));
Daniel Sanders5c582b22014-05-22 11:23:21 +0000707
Jim Grosbache9119e42015-05-13 18:37:00 +0000708 MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
Daniel Sanders5c582b22014-05-22 11:23:21 +0000709 Rt)));
710
Jim Grosbache9119e42015-05-13 18:37:00 +0000711 MI.addOperand(MCOperand::createImm(Imm));
Daniel Sanders5c582b22014-05-22 11:23:21 +0000712
713 return MCDisassembler::Success;
714}
715
716template <typename InsnType>
717static DecodeStatus DecodeBgtzGroupBranch(MCInst &MI, InsnType insn,
718 uint64_t Address,
719 const void *Decoder) {
720 // If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled
721 // (otherwise we would have matched the BGTZ instruction from the earlier
722 // ISA's instead).
723 //
724 // We have:
725 // 0b000111 sssss ttttt iiiiiiiiiiiiiiii
726 // BGTZ if rt == 0
727 // BGTZALC if rs == 0 && rt != 0
728 // BLTZALC if rs != 0 && rs == rt
729 // BLTUC if rs != 0 && rs != rt
730
731 InsnType Rs = fieldFromInstruction(insn, 21, 5);
732 InsnType Rt = fieldFromInstruction(insn, 16, 5);
Alexey Samsonovd37bab62014-09-02 17:49:16 +0000733 InsnType Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4;
Daniel Sanders5c582b22014-05-22 11:23:21 +0000734 bool HasRs = false;
735 bool HasRt = false;
736
737 if (Rt == 0) {
738 MI.setOpcode(Mips::BGTZ);
739 HasRs = true;
740 } else if (Rs == 0) {
741 MI.setOpcode(Mips::BGTZALC);
742 HasRt = true;
743 } else if (Rs == Rt) {
744 MI.setOpcode(Mips::BLTZALC);
745 HasRs = true;
Zoran Jovanovic5c14b062014-06-18 14:36:00 +0000746 } else {
747 MI.setOpcode(Mips::BLTUC);
748 HasRs = true;
749 HasRt = true;
750 }
Daniel Sanders5c582b22014-05-22 11:23:21 +0000751
752 if (HasRs)
Jim Grosbache9119e42015-05-13 18:37:00 +0000753 MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
Daniel Sanders5c582b22014-05-22 11:23:21 +0000754 Rs)));
755
756 if (HasRt)
Jim Grosbache9119e42015-05-13 18:37:00 +0000757 MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
Daniel Sanders5c582b22014-05-22 11:23:21 +0000758 Rt)));
759
Jim Grosbache9119e42015-05-13 18:37:00 +0000760 MI.addOperand(MCOperand::createImm(Imm));
Daniel Sanders5c582b22014-05-22 11:23:21 +0000761
762 return MCDisassembler::Success;
763}
764
Zoran Jovanovic28a0ca02014-06-12 11:47:44 +0000765template <typename InsnType>
766static DecodeStatus DecodeBlezGroupBranch(MCInst &MI, InsnType insn,
767 uint64_t Address,
768 const void *Decoder) {
769 // If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled
770 // (otherwise we would have matched the BLEZL instruction from the earlier
771 // ISA's instead).
772 //
773 // We have:
774 // 0b000110 sssss ttttt iiiiiiiiiiiiiiii
775 // Invalid if rs == 0
776 // BLEZALC if rs == 0 && rt != 0
777 // BGEZALC if rs == rt && rt != 0
778 // BGEUC if rs != rt && rs != 0 && rt != 0
779
780 InsnType Rs = fieldFromInstruction(insn, 21, 5);
781 InsnType Rt = fieldFromInstruction(insn, 16, 5);
Alexey Samsonovd37bab62014-09-02 17:49:16 +0000782 InsnType Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4;
Zoran Jovanovic28a0ca02014-06-12 11:47:44 +0000783 bool HasRs = false;
784
785 if (Rt == 0)
786 return MCDisassembler::Fail;
787 else if (Rs == 0)
788 MI.setOpcode(Mips::BLEZALC);
789 else if (Rs == Rt)
790 MI.setOpcode(Mips::BGEZALC);
791 else {
792 HasRs = true;
793 MI.setOpcode(Mips::BGEUC);
794 }
795
796 if (HasRs)
Jim Grosbache9119e42015-05-13 18:37:00 +0000797 MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
Zoran Jovanovic28a0ca02014-06-12 11:47:44 +0000798 Rs)));
Jim Grosbache9119e42015-05-13 18:37:00 +0000799 MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
Zoran Jovanovic28a0ca02014-06-12 11:47:44 +0000800 Rt)));
801
Jim Grosbache9119e42015-05-13 18:37:00 +0000802 MI.addOperand(MCOperand::createImm(Imm));
Zoran Jovanovic28a0ca02014-06-12 11:47:44 +0000803
804 return MCDisassembler::Success;
805}
806
Jozef Kolekea22c4c2014-11-24 13:29:59 +0000807/// Read two bytes from the ArrayRef and return 16 bit halfword sorted
808/// according to the given endianess.
809static DecodeStatus readInstruction16(ArrayRef<uint8_t> Bytes, uint64_t Address,
810 uint64_t &Size, uint32_t &Insn,
811 bool IsBigEndian) {
812 // We want to read exactly 2 Bytes of data.
813 if (Bytes.size() < 2) {
814 Size = 0;
815 return MCDisassembler::Fail;
816 }
817
818 if (IsBigEndian) {
819 Insn = (Bytes[0] << 8) | Bytes[1];
820 } else {
821 Insn = (Bytes[1] << 8) | Bytes[0];
822 }
823
824 return MCDisassembler::Success;
825}
826
Rafael Espindola7fc5b872014-11-12 02:04:27 +0000827/// Read four bytes from the ArrayRef and return 32 bit word sorted
Rafael Espindola4aa6bea2014-11-10 18:11:10 +0000828/// according to the given endianess
Rafael Espindola7fc5b872014-11-12 02:04:27 +0000829static DecodeStatus readInstruction32(ArrayRef<uint8_t> Bytes, uint64_t Address,
830 uint64_t &Size, uint32_t &Insn,
831 bool IsBigEndian, bool IsMicroMips) {
Akira Hatanaka71928e62012-04-17 18:03:21 +0000832 // We want to read exactly 4 Bytes of data.
Rafael Espindola7fc5b872014-11-12 02:04:27 +0000833 if (Bytes.size() < 4) {
Rafael Espindola4aa6bea2014-11-10 18:11:10 +0000834 Size = 0;
Akira Hatanaka71928e62012-04-17 18:03:21 +0000835 return MCDisassembler::Fail;
836 }
837
Jozef Kolekea22c4c2014-11-24 13:29:59 +0000838 // High 16 bits of a 32-bit microMIPS instruction (where the opcode is)
839 // always precede the low 16 bits in the instruction stream (that is, they
840 // are placed at lower addresses in the instruction stream).
841 //
842 // microMIPS byte ordering:
843 // Big-endian: 0 | 1 | 2 | 3
844 // Little-endian: 1 | 0 | 3 | 2
845
Rafael Espindola4aa6bea2014-11-10 18:11:10 +0000846 if (IsBigEndian) {
Akira Hatanaka71928e62012-04-17 18:03:21 +0000847 // Encoded as a big-endian 32-bit word in the stream.
Rafael Espindola4aa6bea2014-11-10 18:11:10 +0000848 Insn =
849 (Bytes[3] << 0) | (Bytes[2] << 8) | (Bytes[1] << 16) | (Bytes[0] << 24);
850 } else {
Vladimir Medicdde3d582013-09-06 12:30:36 +0000851 if (IsMicroMips) {
Rafael Espindola4aa6bea2014-11-10 18:11:10 +0000852 Insn = (Bytes[2] << 0) | (Bytes[3] << 8) | (Bytes[0] << 16) |
Vladimir Medicdde3d582013-09-06 12:30:36 +0000853 (Bytes[1] << 24);
854 } else {
Rafael Espindola4aa6bea2014-11-10 18:11:10 +0000855 Insn = (Bytes[0] << 0) | (Bytes[1] << 8) | (Bytes[2] << 16) |
Vladimir Medicdde3d582013-09-06 12:30:36 +0000856 (Bytes[3] << 24);
857 }
Akira Hatanaka71928e62012-04-17 18:03:21 +0000858 }
859
860 return MCDisassembler::Success;
861}
862
Rafael Espindola4aa6bea2014-11-10 18:11:10 +0000863DecodeStatus MipsDisassembler::getInstruction(MCInst &Instr, uint64_t &Size,
Rafael Espindola7fc5b872014-11-12 02:04:27 +0000864 ArrayRef<uint8_t> Bytes,
Rafael Espindola4aa6bea2014-11-10 18:11:10 +0000865 uint64_t Address,
866 raw_ostream &VStream,
867 raw_ostream &CStream) const {
Akira Hatanaka71928e62012-04-17 18:03:21 +0000868 uint32_t Insn;
Jozef Kolekea22c4c2014-11-24 13:29:59 +0000869 DecodeStatus Result;
Akira Hatanaka71928e62012-04-17 18:03:21 +0000870
Vladimir Medicdde3d582013-09-06 12:30:36 +0000871 if (IsMicroMips) {
Jozef Kolekea22c4c2014-11-24 13:29:59 +0000872 Result = readInstruction16(Bytes, Address, Size, Insn, IsBigEndian);
Reid Klecknerebee6122015-11-19 21:51:55 +0000873 if (Result == MCDisassembler::Fail)
874 return MCDisassembler::Fail;
Jozef Kolekea22c4c2014-11-24 13:29:59 +0000875
Zoran Jovanovicada70912015-09-07 11:56:37 +0000876 if (hasMips32r6()) {
877 DEBUG(dbgs() << "Trying MicroMipsR616 table (16-bit instructions):\n");
878 // Calling the auto-generated decoder function for microMIPS32R6
879 // (and microMIPS64R6) 16-bit instructions.
880 Result = decodeInstruction(DecoderTableMicroMipsR616, Instr, Insn,
881 Address, this, STI);
882 if (Result != MCDisassembler::Fail) {
883 Size = 2;
884 return Result;
885 }
886 }
887
Jozef Kolekea22c4c2014-11-24 13:29:59 +0000888 DEBUG(dbgs() << "Trying MicroMips16 table (16-bit instructions):\n");
Zoran Jovanovicada70912015-09-07 11:56:37 +0000889 // Calling the auto-generated decoder function for microMIPS 16-bit
890 // instructions.
Jozef Kolekea22c4c2014-11-24 13:29:59 +0000891 Result = decodeInstruction(DecoderTableMicroMips16, Instr, Insn, Address,
892 this, STI);
893 if (Result != MCDisassembler::Fail) {
894 Size = 2;
895 return Result;
896 }
897
898 Result = readInstruction32(Bytes, Address, Size, Insn, IsBigEndian, true);
899 if (Result == MCDisassembler::Fail)
900 return MCDisassembler::Fail;
901
Jozef Kolek676d6012015-04-20 14:40:38 +0000902 if (hasMips32r6()) {
903 DEBUG(dbgs() << "Trying MicroMips32r632 table (32-bit instructions):\n");
904 // Calling the auto-generated decoder function.
Zoran Jovanovic366783e2015-08-12 12:45:16 +0000905 Result = decodeInstruction(DecoderTableMicroMipsR632, Instr, Insn, Address,
Jozef Kolek676d6012015-04-20 14:40:38 +0000906 this, STI);
Zoran Jovanovicada70912015-09-07 11:56:37 +0000907 if (Result != MCDisassembler::Fail) {
908 Size = 4;
909 return Result;
910 }
Jozef Kolek676d6012015-04-20 14:40:38 +0000911 }
Zoran Jovanovic366783e2015-08-12 12:45:16 +0000912
Zoran Jovanovicada70912015-09-07 11:56:37 +0000913 DEBUG(dbgs() << "Trying MicroMips32 table (32-bit instructions):\n");
914 // Calling the auto-generated decoder function.
915 Result = decodeInstruction(DecoderTableMicroMips32, Instr, Insn, Address,
916 this, STI);
Vladimir Medicdde3d582013-09-06 12:30:36 +0000917 if (Result != MCDisassembler::Fail) {
918 Size = 4;
919 return Result;
920 }
Hrvoje Varga2cb74ac2016-03-24 08:02:09 +0000921
922 if (hasMips32r6()) {
923 DEBUG(dbgs() << "Trying MicroMips32r6FPU table (32-bit opcodes):\n");
924 Result = decodeInstruction(DecoderTableMicroMips32r6FPU32, Instr, Insn,
925 Address, this, STI);
926 if (Result != MCDisassembler::Fail) {
927 Size = 4;
928 return Result;
929 }
930 }
931
Reid Klecknerebee6122015-11-19 21:51:55 +0000932 // This is an invalid instruction. Let the disassembler move forward by the
933 // minimum instruction size.
934 Size = 2;
Vladimir Medicdde3d582013-09-06 12:30:36 +0000935 return MCDisassembler::Fail;
936 }
937
Jozef Kolekea22c4c2014-11-24 13:29:59 +0000938 Result = readInstruction32(Bytes, Address, Size, Insn, IsBigEndian, false);
Reid Klecknerebee6122015-11-19 21:51:55 +0000939 if (Result == MCDisassembler::Fail) {
940 Size = 4;
Jozef Kolekea22c4c2014-11-24 13:29:59 +0000941 return MCDisassembler::Fail;
Reid Klecknerebee6122015-11-19 21:51:55 +0000942 }
Jozef Kolekea22c4c2014-11-24 13:29:59 +0000943
Daniel Sandersc171f652014-06-13 13:15:59 +0000944 if (hasCOP3()) {
945 DEBUG(dbgs() << "Trying COP3_ table (32-bit opcodes):\n");
946 Result =
Rafael Espindola4aa6bea2014-11-10 18:11:10 +0000947 decodeInstruction(DecoderTableCOP3_32, Instr, Insn, Address, this, STI);
Daniel Sandersc171f652014-06-13 13:15:59 +0000948 if (Result != MCDisassembler::Fail) {
949 Size = 4;
950 return Result;
951 }
952 }
953
954 if (hasMips32r6() && isGP64()) {
Vasileios Kalintiris36901dd2016-03-01 20:25:43 +0000955 DEBUG(dbgs() << "Trying Mips32r6_64r6 (GPR64) table (32-bit opcodes):\n");
956 Result = decodeInstruction(DecoderTableMips32r6_64r6_GP6432, Instr, Insn,
957 Address, this, STI);
Daniel Sanders0fa60412014-06-12 13:39:06 +0000958 if (Result != MCDisassembler::Fail) {
959 Size = 4;
960 return Result;
961 }
962 }
963
Daniel Sandersc171f652014-06-13 13:15:59 +0000964 if (hasMips32r6()) {
Daniel Sanders0fa60412014-06-12 13:39:06 +0000965 DEBUG(dbgs() << "Trying Mips32r6_64r6 table (32-bit opcodes):\n");
Rafael Espindola4aa6bea2014-11-10 18:11:10 +0000966 Result = decodeInstruction(DecoderTableMips32r6_64r632, Instr, Insn,
Daniel Sanders5c582b22014-05-22 11:23:21 +0000967 Address, this, STI);
968 if (Result != MCDisassembler::Fail) {
969 Size = 4;
970 return Result;
971 }
972 }
973
Kai Nacke3adf9b82015-05-28 16:23:16 +0000974 if (hasCnMips()) {
975 DEBUG(dbgs() << "Trying CnMips table (32-bit opcodes):\n");
976 Result = decodeInstruction(DecoderTableCnMips32, Instr, Insn,
977 Address, this, STI);
978 if (Result != MCDisassembler::Fail) {
979 Size = 4;
980 return Result;
981 }
982 }
983
Daniel Sandersa19216c2015-02-11 11:28:56 +0000984 if (isGP64()) {
985 DEBUG(dbgs() << "Trying Mips64 (GPR64) table (32-bit opcodes):\n");
986 Result = decodeInstruction(DecoderTableMips6432, Instr, Insn,
987 Address, this, STI);
988 if (Result != MCDisassembler::Fail) {
989 Size = 4;
990 return Result;
991 }
992 }
993
Daniel Sanders0fa60412014-06-12 13:39:06 +0000994 DEBUG(dbgs() << "Trying Mips table (32-bit opcodes):\n");
Akira Hatanaka71928e62012-04-17 18:03:21 +0000995 // Calling the auto-generated decoder function.
Rafael Espindola4aa6bea2014-11-10 18:11:10 +0000996 Result =
997 decodeInstruction(DecoderTableMips32, Instr, Insn, Address, this, STI);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000998 if (Result != MCDisassembler::Fail) {
999 Size = 4;
1000 return Result;
1001 }
1002
Reid Klecknerebee6122015-11-19 21:51:55 +00001003 Size = 4;
Akira Hatanaka71928e62012-04-17 18:03:21 +00001004 return MCDisassembler::Fail;
1005}
1006
Reed Kotlerec8a5492013-02-14 03:05:25 +00001007static DecodeStatus DecodeCPU16RegsRegisterClass(MCInst &Inst,
1008 unsigned RegNo,
1009 uint64_t Address,
1010 const void *Decoder) {
1011
1012 return MCDisassembler::Fail;
1013
1014}
1015
Akira Hatanaka13e6ccf2013-08-06 23:08:38 +00001016static DecodeStatus DecodeGPR64RegisterClass(MCInst &Inst,
1017 unsigned RegNo,
1018 uint64_t Address,
1019 const void *Decoder) {
Akira Hatanaka71928e62012-04-17 18:03:21 +00001020
1021 if (RegNo > 31)
1022 return MCDisassembler::Fail;
1023
Akira Hatanaka13e6ccf2013-08-06 23:08:38 +00001024 unsigned Reg = getReg(Decoder, Mips::GPR64RegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001025 Inst.addOperand(MCOperand::createReg(Reg));
Akira Hatanaka71928e62012-04-17 18:03:21 +00001026 return MCDisassembler::Success;
1027}
1028
Zoran Jovanovicb0852e52014-10-21 08:23:11 +00001029static DecodeStatus DecodeGPRMM16RegisterClass(MCInst &Inst,
1030 unsigned RegNo,
1031 uint64_t Address,
1032 const void *Decoder) {
Jozef Kolekea22c4c2014-11-24 13:29:59 +00001033 if (RegNo > 7)
1034 return MCDisassembler::Fail;
1035 unsigned Reg = getReg(Decoder, Mips::GPRMM16RegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001036 Inst.addOperand(MCOperand::createReg(Reg));
Jozef Kolekea22c4c2014-11-24 13:29:59 +00001037 return MCDisassembler::Success;
Zoran Jovanovicb0852e52014-10-21 08:23:11 +00001038}
1039
Jozef Kolek1904fa22014-11-24 14:25:53 +00001040static DecodeStatus DecodeGPRMM16ZeroRegisterClass(MCInst &Inst,
1041 unsigned RegNo,
1042 uint64_t Address,
1043 const void *Decoder) {
Jozef Kolek315e7ec2014-11-26 18:56:38 +00001044 if (RegNo > 7)
1045 return MCDisassembler::Fail;
1046 unsigned Reg = getReg(Decoder, Mips::GPRMM16ZeroRegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001047 Inst.addOperand(MCOperand::createReg(Reg));
Jozef Kolek315e7ec2014-11-26 18:56:38 +00001048 return MCDisassembler::Success;
Jozef Kolek1904fa22014-11-24 14:25:53 +00001049}
1050
Zoran Jovanovic41688672015-02-10 16:36:20 +00001051static DecodeStatus DecodeGPRMM16MovePRegisterClass(MCInst &Inst,
1052 unsigned RegNo,
1053 uint64_t Address,
1054 const void *Decoder) {
1055 if (RegNo > 7)
1056 return MCDisassembler::Fail;
1057 unsigned Reg = getReg(Decoder, Mips::GPRMM16MovePRegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001058 Inst.addOperand(MCOperand::createReg(Reg));
Zoran Jovanovic41688672015-02-10 16:36:20 +00001059 return MCDisassembler::Success;
1060}
1061
Akira Hatanaka13e6ccf2013-08-06 23:08:38 +00001062static DecodeStatus DecodeGPR32RegisterClass(MCInst &Inst,
1063 unsigned RegNo,
1064 uint64_t Address,
1065 const void *Decoder) {
Akira Hatanaka71928e62012-04-17 18:03:21 +00001066 if (RegNo > 31)
1067 return MCDisassembler::Fail;
Akira Hatanaka13e6ccf2013-08-06 23:08:38 +00001068 unsigned Reg = getReg(Decoder, Mips::GPR32RegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001069 Inst.addOperand(MCOperand::createReg(Reg));
Akira Hatanaka71928e62012-04-17 18:03:21 +00001070 return MCDisassembler::Success;
1071}
1072
Akira Hatanaka9bfa2e22013-08-28 00:55:15 +00001073static DecodeStatus DecodePtrRegisterClass(MCInst &Inst,
1074 unsigned RegNo,
1075 uint64_t Address,
1076 const void *Decoder) {
Daniel Sandersa19216c2015-02-11 11:28:56 +00001077 if (static_cast<const MipsDisassembler *>(Decoder)->isGP64())
Akira Hatanaka9bfa2e22013-08-28 00:55:15 +00001078 return DecodeGPR64RegisterClass(Inst, RegNo, Address, Decoder);
1079
1080 return DecodeGPR32RegisterClass(Inst, RegNo, Address, Decoder);
1081}
1082
Akira Hatanaka654655f2013-08-14 00:53:38 +00001083static DecodeStatus DecodeDSPRRegisterClass(MCInst &Inst,
1084 unsigned RegNo,
1085 uint64_t Address,
1086 const void *Decoder) {
Akira Hatanaka13e6ccf2013-08-06 23:08:38 +00001087 return DecodeGPR32RegisterClass(Inst, RegNo, Address, Decoder);
Akira Hatanakaecabd1a2012-09-27 02:01:10 +00001088}
1089
Akira Hatanaka71928e62012-04-17 18:03:21 +00001090static DecodeStatus DecodeFGR64RegisterClass(MCInst &Inst,
1091 unsigned RegNo,
1092 uint64_t Address,
1093 const void *Decoder) {
1094 if (RegNo > 31)
1095 return MCDisassembler::Fail;
1096
Akira Hatanaka9bf2b562012-07-09 18:46:47 +00001097 unsigned Reg = getReg(Decoder, Mips::FGR64RegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001098 Inst.addOperand(MCOperand::createReg(Reg));
Akira Hatanaka71928e62012-04-17 18:03:21 +00001099 return MCDisassembler::Success;
1100}
1101
1102static DecodeStatus DecodeFGR32RegisterClass(MCInst &Inst,
1103 unsigned RegNo,
1104 uint64_t Address,
1105 const void *Decoder) {
1106 if (RegNo > 31)
1107 return MCDisassembler::Fail;
1108
Akira Hatanaka9bf2b562012-07-09 18:46:47 +00001109 unsigned Reg = getReg(Decoder, Mips::FGR32RegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001110 Inst.addOperand(MCOperand::createReg(Reg));
Akira Hatanaka71928e62012-04-17 18:03:21 +00001111 return MCDisassembler::Success;
1112}
1113
1114static DecodeStatus DecodeCCRRegisterClass(MCInst &Inst,
1115 unsigned RegNo,
1116 uint64_t Address,
1117 const void *Decoder) {
Chad Rosier253777f2013-06-26 22:23:32 +00001118 if (RegNo > 31)
1119 return MCDisassembler::Fail;
1120 unsigned Reg = getReg(Decoder, Mips::CCRRegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001121 Inst.addOperand(MCOperand::createReg(Reg));
Akira Hatanaka71928e62012-04-17 18:03:21 +00001122 return MCDisassembler::Success;
1123}
1124
Akira Hatanaka1fb1b8b2013-07-26 20:13:47 +00001125static DecodeStatus DecodeFCCRegisterClass(MCInst &Inst,
1126 unsigned RegNo,
1127 uint64_t Address,
1128 const void *Decoder) {
1129 if (RegNo > 7)
1130 return MCDisassembler::Fail;
1131 unsigned Reg = getReg(Decoder, Mips::FCCRegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001132 Inst.addOperand(MCOperand::createReg(Reg));
Akira Hatanaka1fb1b8b2013-07-26 20:13:47 +00001133 return MCDisassembler::Success;
1134}
1135
Vasileios Kalintiris36901dd2016-03-01 20:25:43 +00001136static DecodeStatus DecodeFGRCCRegisterClass(MCInst &Inst, unsigned RegNo,
1137 uint64_t Address,
1138 const void *Decoder) {
Daniel Sanders0fa60412014-06-12 13:39:06 +00001139 if (RegNo > 31)
1140 return MCDisassembler::Fail;
1141
Vasileios Kalintiris36901dd2016-03-01 20:25:43 +00001142 unsigned Reg = getReg(Decoder, Mips::FGRCCRegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001143 Inst.addOperand(MCOperand::createReg(Reg));
Daniel Sanders0fa60412014-06-12 13:39:06 +00001144 return MCDisassembler::Success;
1145}
1146
Akira Hatanaka71928e62012-04-17 18:03:21 +00001147static DecodeStatus DecodeMem(MCInst &Inst,
1148 unsigned Insn,
1149 uint64_t Address,
1150 const void *Decoder) {
1151 int Offset = SignExtend32<16>(Insn & 0xffff);
Jim Grosbachecaef492012-08-14 19:06:05 +00001152 unsigned Reg = fieldFromInstruction(Insn, 16, 5);
1153 unsigned Base = fieldFromInstruction(Insn, 21, 5);
Akira Hatanaka9bf2b562012-07-09 18:46:47 +00001154
Akira Hatanaka13e6ccf2013-08-06 23:08:38 +00001155 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
1156 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
Akira Hatanaka71928e62012-04-17 18:03:21 +00001157
Daniel Sanderse4e83a72015-09-15 10:02:16 +00001158 if (Inst.getOpcode() == Mips::SC ||
1159 Inst.getOpcode() == Mips::SCD)
Jim Grosbache9119e42015-05-13 18:37:00 +00001160 Inst.addOperand(MCOperand::createReg(Reg));
Daniel Sanderse4e83a72015-09-15 10:02:16 +00001161
1162 Inst.addOperand(MCOperand::createReg(Reg));
1163 Inst.addOperand(MCOperand::createReg(Base));
1164 Inst.addOperand(MCOperand::createImm(Offset));
1165
1166 return MCDisassembler::Success;
1167}
1168
1169static DecodeStatus DecodeMemEVA(MCInst &Inst,
1170 unsigned Insn,
1171 uint64_t Address,
1172 const void *Decoder) {
1173 int Offset = SignExtend32<9>(Insn >> 7);
1174 unsigned Reg = fieldFromInstruction(Insn, 16, 5);
1175 unsigned Base = fieldFromInstruction(Insn, 21, 5);
1176
1177 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
1178 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1179
1180 if (Inst.getOpcode() == Mips::SCE)
1181 Inst.addOperand(MCOperand::createReg(Reg));
Akira Hatanaka71928e62012-04-17 18:03:21 +00001182
Jim Grosbache9119e42015-05-13 18:37:00 +00001183 Inst.addOperand(MCOperand::createReg(Reg));
1184 Inst.addOperand(MCOperand::createReg(Base));
1185 Inst.addOperand(MCOperand::createImm(Offset));
Akira Hatanaka71928e62012-04-17 18:03:21 +00001186
1187 return MCDisassembler::Success;
1188}
1189
Hrvoje Varga3c88fbd2015-10-16 12:24:58 +00001190static DecodeStatus DecodeLoadByte9(MCInst &Inst,
1191 unsigned Insn,
1192 uint64_t Address,
1193 const void *Decoder) {
1194 int Offset = SignExtend32<9>(Insn & 0x1ff);
1195 unsigned Base = fieldFromInstruction(Insn, 16, 5);
1196 unsigned Reg = fieldFromInstruction(Insn, 21, 5);
1197
1198 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1199 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
1200
1201 Inst.addOperand(MCOperand::createReg(Reg));
1202 Inst.addOperand(MCOperand::createReg(Base));
1203 Inst.addOperand(MCOperand::createImm(Offset));
1204
1205 return MCDisassembler::Success;
1206}
1207
1208static DecodeStatus DecodeLoadByte15(MCInst &Inst,
1209 unsigned Insn,
1210 uint64_t Address,
1211 const void *Decoder) {
1212 int Offset = SignExtend32<16>(Insn & 0xffff);
1213 unsigned Base = fieldFromInstruction(Insn, 16, 5);
1214 unsigned Reg = fieldFromInstruction(Insn, 21, 5);
1215
1216 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1217 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
1218
1219 Inst.addOperand(MCOperand::createReg(Reg));
1220 Inst.addOperand(MCOperand::createReg(Base));
1221 Inst.addOperand(MCOperand::createImm(Offset));
1222
1223 return MCDisassembler::Success;
1224}
1225
Daniel Sanders92db6b72014-10-01 08:26:55 +00001226static DecodeStatus DecodeCacheOp(MCInst &Inst,
1227 unsigned Insn,
1228 uint64_t Address,
1229 const void *Decoder) {
1230 int Offset = SignExtend32<16>(Insn & 0xffff);
1231 unsigned Hint = fieldFromInstruction(Insn, 16, 5);
1232 unsigned Base = fieldFromInstruction(Insn, 21, 5);
1233
1234 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1235
Jim Grosbache9119e42015-05-13 18:37:00 +00001236 Inst.addOperand(MCOperand::createReg(Base));
1237 Inst.addOperand(MCOperand::createImm(Offset));
1238 Inst.addOperand(MCOperand::createImm(Hint));
Daniel Sanders92db6b72014-10-01 08:26:55 +00001239
1240 return MCDisassembler::Success;
1241}
1242
Jozef Kolekab6d1cc2014-12-23 19:55:34 +00001243static DecodeStatus DecodeCacheOpMM(MCInst &Inst,
1244 unsigned Insn,
1245 uint64_t Address,
1246 const void *Decoder) {
1247 int Offset = SignExtend32<12>(Insn & 0xfff);
1248 unsigned Base = fieldFromInstruction(Insn, 16, 5);
1249 unsigned Hint = fieldFromInstruction(Insn, 21, 5);
1250
1251 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1252
Jim Grosbache9119e42015-05-13 18:37:00 +00001253 Inst.addOperand(MCOperand::createReg(Base));
1254 Inst.addOperand(MCOperand::createImm(Offset));
1255 Inst.addOperand(MCOperand::createImm(Hint));
Jozef Kolekab6d1cc2014-12-23 19:55:34 +00001256
1257 return MCDisassembler::Success;
1258}
1259
Zoran Jovanovicd9790792015-09-09 09:10:46 +00001260static DecodeStatus DecodePrefeOpMM(MCInst &Inst,
1261 unsigned Insn,
1262 uint64_t Address,
1263 const void *Decoder) {
1264 int Offset = SignExtend32<9>(Insn & 0x1ff);
1265 unsigned Base = fieldFromInstruction(Insn, 16, 5);
1266 unsigned Hint = fieldFromInstruction(Insn, 21, 5);
1267
1268 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1269
1270 Inst.addOperand(MCOperand::createReg(Base));
1271 Inst.addOperand(MCOperand::createImm(Offset));
1272 Inst.addOperand(MCOperand::createImm(Hint));
1273
1274 return MCDisassembler::Success;
1275}
1276
Daniel Sanderse4e83a72015-09-15 10:02:16 +00001277static DecodeStatus DecodeCacheeOp_CacheOpR6(MCInst &Inst,
1278 unsigned Insn,
1279 uint64_t Address,
1280 const void *Decoder) {
1281 int Offset = SignExtend32<9>(Insn >> 7);
Vladimir Medicdf464ae2015-01-29 11:33:41 +00001282 unsigned Hint = fieldFromInstruction(Insn, 16, 5);
1283 unsigned Base = fieldFromInstruction(Insn, 21, 5);
1284
1285 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1286
Jim Grosbache9119e42015-05-13 18:37:00 +00001287 Inst.addOperand(MCOperand::createReg(Base));
1288 Inst.addOperand(MCOperand::createImm(Offset));
1289 Inst.addOperand(MCOperand::createImm(Hint));
Vladimir Medicdf464ae2015-01-29 11:33:41 +00001290
1291 return MCDisassembler::Success;
1292}
1293
Zoran Jovanovic9eaa30d2015-09-08 10:18:38 +00001294static DecodeStatus DecodeStoreEvaOpMM(MCInst &Inst,
1295 unsigned Insn,
1296 uint64_t Address,
1297 const void *Decoder) {
1298 int Offset = SignExtend32<9>(Insn & 0x1ff);
1299 unsigned Reg = fieldFromInstruction(Insn, 21, 5);
1300 unsigned Base = fieldFromInstruction(Insn, 16, 5);
1301
1302 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
1303 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1304
1305 Inst.addOperand(MCOperand::createReg(Reg));
1306 Inst.addOperand(MCOperand::createReg(Base));
1307 Inst.addOperand(MCOperand::createImm(Offset));
1308
1309 return MCDisassembler::Success;
1310}
1311
Daniel Sandersb4484d62014-11-27 17:28:10 +00001312static DecodeStatus DecodeSyncI(MCInst &Inst,
1313 unsigned Insn,
1314 uint64_t Address,
1315 const void *Decoder) {
1316 int Offset = SignExtend32<16>(Insn & 0xffff);
1317 unsigned Base = fieldFromInstruction(Insn, 21, 5);
1318
1319 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1320
Jim Grosbache9119e42015-05-13 18:37:00 +00001321 Inst.addOperand(MCOperand::createReg(Base));
1322 Inst.addOperand(MCOperand::createImm(Offset));
Daniel Sandersb4484d62014-11-27 17:28:10 +00001323
1324 return MCDisassembler::Success;
1325}
1326
Hrvoje Varga18148672015-10-28 11:04:29 +00001327static DecodeStatus DecodeSynciR6(MCInst &Inst,
1328 unsigned Insn,
1329 uint64_t Address,
1330 const void *Decoder) {
1331 int Immediate = SignExtend32<16>(Insn & 0xffff);
1332 unsigned Base = fieldFromInstruction(Insn, 16, 5);
1333
1334 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1335
1336 Inst.addOperand(MCOperand::createReg(Base));
1337 Inst.addOperand(MCOperand::createImm(Immediate));
1338
1339 return MCDisassembler::Success;
1340}
1341
Matheus Almeidafe0bf9f2013-10-21 13:07:13 +00001342static DecodeStatus DecodeMSA128Mem(MCInst &Inst, unsigned Insn,
1343 uint64_t Address, const void *Decoder) {
1344 int Offset = SignExtend32<10>(fieldFromInstruction(Insn, 16, 10));
1345 unsigned Reg = fieldFromInstruction(Insn, 6, 5);
1346 unsigned Base = fieldFromInstruction(Insn, 11, 5);
1347
1348 Reg = getReg(Decoder, Mips::MSA128BRegClassID, Reg);
1349 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1350
Jim Grosbache9119e42015-05-13 18:37:00 +00001351 Inst.addOperand(MCOperand::createReg(Reg));
1352 Inst.addOperand(MCOperand::createReg(Base));
Matheus Almeida6b59c442013-12-05 11:06:22 +00001353
1354 // The immediate field of an LD/ST instruction is scaled which means it must
1355 // be multiplied (when decoding) by the size (in bytes) of the instructions'
1356 // data format.
1357 // .b - 1 byte
1358 // .h - 2 bytes
1359 // .w - 4 bytes
1360 // .d - 8 bytes
1361 switch(Inst.getOpcode())
1362 {
1363 default:
1364 assert (0 && "Unexpected instruction");
1365 return MCDisassembler::Fail;
1366 break;
1367 case Mips::LD_B:
1368 case Mips::ST_B:
Jim Grosbache9119e42015-05-13 18:37:00 +00001369 Inst.addOperand(MCOperand::createImm(Offset));
Matheus Almeida6b59c442013-12-05 11:06:22 +00001370 break;
1371 case Mips::LD_H:
1372 case Mips::ST_H:
Jim Grosbache9119e42015-05-13 18:37:00 +00001373 Inst.addOperand(MCOperand::createImm(Offset * 2));
Matheus Almeida6b59c442013-12-05 11:06:22 +00001374 break;
1375 case Mips::LD_W:
1376 case Mips::ST_W:
Jim Grosbache9119e42015-05-13 18:37:00 +00001377 Inst.addOperand(MCOperand::createImm(Offset * 4));
Matheus Almeida6b59c442013-12-05 11:06:22 +00001378 break;
1379 case Mips::LD_D:
1380 case Mips::ST_D:
Jim Grosbache9119e42015-05-13 18:37:00 +00001381 Inst.addOperand(MCOperand::createImm(Offset * 8));
Matheus Almeida6b59c442013-12-05 11:06:22 +00001382 break;
1383 }
Matheus Almeidafe0bf9f2013-10-21 13:07:13 +00001384
1385 return MCDisassembler::Success;
1386}
1387
Jozef Kolek315e7ec2014-11-26 18:56:38 +00001388static DecodeStatus DecodeMemMMImm4(MCInst &Inst,
1389 unsigned Insn,
1390 uint64_t Address,
1391 const void *Decoder) {
1392 unsigned Offset = Insn & 0xf;
1393 unsigned Reg = fieldFromInstruction(Insn, 7, 3);
1394 unsigned Base = fieldFromInstruction(Insn, 4, 3);
1395
1396 switch (Inst.getOpcode()) {
1397 case Mips::LBU16_MM:
1398 case Mips::LHU16_MM:
1399 case Mips::LW16_MM:
1400 if (DecodeGPRMM16RegisterClass(Inst, Reg, Address, Decoder)
1401 == MCDisassembler::Fail)
1402 return MCDisassembler::Fail;
1403 break;
1404 case Mips::SB16_MM:
Zlatko Buljan797c2ae2015-11-12 13:21:33 +00001405 case Mips::SB16_MMR6:
Jozef Kolek315e7ec2014-11-26 18:56:38 +00001406 case Mips::SH16_MM:
Zlatko Buljan797c2ae2015-11-12 13:21:33 +00001407 case Mips::SH16_MMR6:
Jozef Kolek315e7ec2014-11-26 18:56:38 +00001408 case Mips::SW16_MM:
Zlatko Buljan797c2ae2015-11-12 13:21:33 +00001409 case Mips::SW16_MMR6:
Jozef Kolek315e7ec2014-11-26 18:56:38 +00001410 if (DecodeGPRMM16ZeroRegisterClass(Inst, Reg, Address, Decoder)
1411 == MCDisassembler::Fail)
1412 return MCDisassembler::Fail;
1413 break;
1414 }
1415
1416 if (DecodeGPRMM16RegisterClass(Inst, Base, Address, Decoder)
1417 == MCDisassembler::Fail)
1418 return MCDisassembler::Fail;
1419
1420 switch (Inst.getOpcode()) {
1421 case Mips::LBU16_MM:
1422 if (Offset == 0xf)
Jim Grosbache9119e42015-05-13 18:37:00 +00001423 Inst.addOperand(MCOperand::createImm(-1));
Jozef Kolek315e7ec2014-11-26 18:56:38 +00001424 else
Jim Grosbache9119e42015-05-13 18:37:00 +00001425 Inst.addOperand(MCOperand::createImm(Offset));
Jozef Kolek315e7ec2014-11-26 18:56:38 +00001426 break;
1427 case Mips::SB16_MM:
Zlatko Buljan797c2ae2015-11-12 13:21:33 +00001428 case Mips::SB16_MMR6:
Jim Grosbache9119e42015-05-13 18:37:00 +00001429 Inst.addOperand(MCOperand::createImm(Offset));
Jozef Kolek315e7ec2014-11-26 18:56:38 +00001430 break;
1431 case Mips::LHU16_MM:
1432 case Mips::SH16_MM:
Zlatko Buljan797c2ae2015-11-12 13:21:33 +00001433 case Mips::SH16_MMR6:
Jim Grosbache9119e42015-05-13 18:37:00 +00001434 Inst.addOperand(MCOperand::createImm(Offset << 1));
Jozef Kolek315e7ec2014-11-26 18:56:38 +00001435 break;
1436 case Mips::LW16_MM:
1437 case Mips::SW16_MM:
Zlatko Buljan797c2ae2015-11-12 13:21:33 +00001438 case Mips::SW16_MMR6:
Jim Grosbache9119e42015-05-13 18:37:00 +00001439 Inst.addOperand(MCOperand::createImm(Offset << 2));
Jozef Kolek315e7ec2014-11-26 18:56:38 +00001440 break;
1441 }
1442
1443 return MCDisassembler::Success;
1444}
1445
Jozef Kolek12c69822014-12-23 16:16:33 +00001446static DecodeStatus DecodeMemMMSPImm5Lsl2(MCInst &Inst,
1447 unsigned Insn,
1448 uint64_t Address,
1449 const void *Decoder) {
1450 unsigned Offset = Insn & 0x1F;
1451 unsigned Reg = fieldFromInstruction(Insn, 5, 5);
1452
1453 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
1454
Jim Grosbache9119e42015-05-13 18:37:00 +00001455 Inst.addOperand(MCOperand::createReg(Reg));
1456 Inst.addOperand(MCOperand::createReg(Mips::SP));
1457 Inst.addOperand(MCOperand::createImm(Offset << 2));
Jozef Kolek12c69822014-12-23 16:16:33 +00001458
1459 return MCDisassembler::Success;
1460}
1461
Jozef Koleke10a02e2015-01-28 17:27:26 +00001462static DecodeStatus DecodeMemMMGPImm7Lsl2(MCInst &Inst,
1463 unsigned Insn,
1464 uint64_t Address,
1465 const void *Decoder) {
1466 unsigned Offset = Insn & 0x7F;
1467 unsigned Reg = fieldFromInstruction(Insn, 7, 3);
1468
1469 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
1470
Jim Grosbache9119e42015-05-13 18:37:00 +00001471 Inst.addOperand(MCOperand::createReg(Reg));
1472 Inst.addOperand(MCOperand::createReg(Mips::GP));
1473 Inst.addOperand(MCOperand::createImm(Offset << 2));
Jozef Koleke10a02e2015-01-28 17:27:26 +00001474
1475 return MCDisassembler::Success;
1476}
1477
Jozef Kolekd68d424a2015-02-10 12:41:13 +00001478static DecodeStatus DecodeMemMMReglistImm4Lsl2(MCInst &Inst,
1479 unsigned Insn,
1480 uint64_t Address,
1481 const void *Decoder) {
Zlatko Buljan797c2ae2015-11-12 13:21:33 +00001482 int Offset;
1483 switch (Inst.getOpcode()) {
1484 case Mips::LWM16_MMR6:
1485 case Mips::SWM16_MMR6:
1486 Offset = fieldFromInstruction(Insn, 4, 4);
1487 break;
1488 default:
1489 Offset = SignExtend32<4>(Insn & 0xf);
1490 break;
1491 }
Jozef Kolekd68d424a2015-02-10 12:41:13 +00001492
1493 if (DecodeRegListOperand16(Inst, Insn, Address, Decoder)
1494 == MCDisassembler::Fail)
1495 return MCDisassembler::Fail;
1496
Jim Grosbache9119e42015-05-13 18:37:00 +00001497 Inst.addOperand(MCOperand::createReg(Mips::SP));
1498 Inst.addOperand(MCOperand::createImm(Offset << 2));
Jozef Kolekd68d424a2015-02-10 12:41:13 +00001499
1500 return MCDisassembler::Success;
1501}
1502
Zoran Jovanovica6593ff2015-08-18 12:53:08 +00001503static DecodeStatus DecodeMemMMImm9(MCInst &Inst,
1504 unsigned Insn,
1505 uint64_t Address,
1506 const void *Decoder) {
1507 int Offset = SignExtend32<9>(Insn & 0x1ff);
1508 unsigned Reg = fieldFromInstruction(Insn, 21, 5);
1509 unsigned Base = fieldFromInstruction(Insn, 16, 5);
1510
1511 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
1512 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1513
Hrvoje Varga3ef4dd72015-10-15 08:11:50 +00001514 if (Inst.getOpcode() == Mips::SCE_MM)
1515 Inst.addOperand(MCOperand::createReg(Reg));
1516
Zoran Jovanovica6593ff2015-08-18 12:53:08 +00001517 Inst.addOperand(MCOperand::createReg(Reg));
1518 Inst.addOperand(MCOperand::createReg(Base));
1519 Inst.addOperand(MCOperand::createImm(Offset));
1520
1521 return MCDisassembler::Success;
1522}
1523
Vladimir Medicdde3d582013-09-06 12:30:36 +00001524static DecodeStatus DecodeMemMMImm12(MCInst &Inst,
1525 unsigned Insn,
1526 uint64_t Address,
1527 const void *Decoder) {
1528 int Offset = SignExtend32<12>(Insn & 0x0fff);
1529 unsigned Reg = fieldFromInstruction(Insn, 21, 5);
1530 unsigned Base = fieldFromInstruction(Insn, 16, 5);
1531
1532 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
1533 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1534
Zoran Jovanovica4c4b5f2014-11-19 16:44:02 +00001535 switch (Inst.getOpcode()) {
1536 case Mips::SWM32_MM:
1537 case Mips::LWM32_MM:
1538 if (DecodeRegListOperand(Inst, Insn, Address, Decoder)
1539 == MCDisassembler::Fail)
1540 return MCDisassembler::Fail;
Jim Grosbache9119e42015-05-13 18:37:00 +00001541 Inst.addOperand(MCOperand::createReg(Base));
1542 Inst.addOperand(MCOperand::createImm(Offset));
Zoran Jovanovica4c4b5f2014-11-19 16:44:02 +00001543 break;
1544 case Mips::SC_MM:
Jim Grosbache9119e42015-05-13 18:37:00 +00001545 Inst.addOperand(MCOperand::createReg(Reg));
Zoran Jovanovica4c4b5f2014-11-19 16:44:02 +00001546 // fallthrough
1547 default:
Jim Grosbache9119e42015-05-13 18:37:00 +00001548 Inst.addOperand(MCOperand::createReg(Reg));
Zoran Jovanovic2deca342014-12-16 14:59:10 +00001549 if (Inst.getOpcode() == Mips::LWP_MM || Inst.getOpcode() == Mips::SWP_MM)
Jim Grosbache9119e42015-05-13 18:37:00 +00001550 Inst.addOperand(MCOperand::createReg(Reg+1));
Zoran Jovanovic2deca342014-12-16 14:59:10 +00001551
Jim Grosbache9119e42015-05-13 18:37:00 +00001552 Inst.addOperand(MCOperand::createReg(Base));
1553 Inst.addOperand(MCOperand::createImm(Offset));
Zoran Jovanovica4c4b5f2014-11-19 16:44:02 +00001554 }
Vladimir Medicdde3d582013-09-06 12:30:36 +00001555
1556 return MCDisassembler::Success;
1557}
1558
1559static DecodeStatus DecodeMemMMImm16(MCInst &Inst,
1560 unsigned Insn,
1561 uint64_t Address,
1562 const void *Decoder) {
1563 int Offset = SignExtend32<16>(Insn & 0xffff);
1564 unsigned Reg = fieldFromInstruction(Insn, 21, 5);
1565 unsigned Base = fieldFromInstruction(Insn, 16, 5);
1566
1567 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
1568 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1569
Jim Grosbache9119e42015-05-13 18:37:00 +00001570 Inst.addOperand(MCOperand::createReg(Reg));
1571 Inst.addOperand(MCOperand::createReg(Base));
1572 Inst.addOperand(MCOperand::createImm(Offset));
Vladimir Medicdde3d582013-09-06 12:30:36 +00001573
1574 return MCDisassembler::Success;
1575}
1576
Akira Hatanaka71928e62012-04-17 18:03:21 +00001577static DecodeStatus DecodeFMem(MCInst &Inst,
1578 unsigned Insn,
1579 uint64_t Address,
1580 const void *Decoder) {
1581 int Offset = SignExtend32<16>(Insn & 0xffff);
Jim Grosbachecaef492012-08-14 19:06:05 +00001582 unsigned Reg = fieldFromInstruction(Insn, 16, 5);
1583 unsigned Base = fieldFromInstruction(Insn, 21, 5);
Akira Hatanaka71928e62012-04-17 18:03:21 +00001584
Akira Hatanaka9bf2b562012-07-09 18:46:47 +00001585 Reg = getReg(Decoder, Mips::FGR64RegClassID, Reg);
Akira Hatanaka13e6ccf2013-08-06 23:08:38 +00001586 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
Akira Hatanaka9bf2b562012-07-09 18:46:47 +00001587
Jim Grosbache9119e42015-05-13 18:37:00 +00001588 Inst.addOperand(MCOperand::createReg(Reg));
1589 Inst.addOperand(MCOperand::createReg(Base));
1590 Inst.addOperand(MCOperand::createImm(Offset));
Akira Hatanaka71928e62012-04-17 18:03:21 +00001591
1592 return MCDisassembler::Success;
1593}
1594
Daniel Sanders92db6b72014-10-01 08:26:55 +00001595static DecodeStatus DecodeFMem2(MCInst &Inst,
1596 unsigned Insn,
1597 uint64_t Address,
1598 const void *Decoder) {
1599 int Offset = SignExtend32<16>(Insn & 0xffff);
1600 unsigned Reg = fieldFromInstruction(Insn, 16, 5);
1601 unsigned Base = fieldFromInstruction(Insn, 21, 5);
1602
1603 Reg = getReg(Decoder, Mips::COP2RegClassID, Reg);
1604 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1605
Jim Grosbache9119e42015-05-13 18:37:00 +00001606 Inst.addOperand(MCOperand::createReg(Reg));
1607 Inst.addOperand(MCOperand::createReg(Base));
1608 Inst.addOperand(MCOperand::createImm(Offset));
Daniel Sanders92db6b72014-10-01 08:26:55 +00001609
1610 return MCDisassembler::Success;
1611}
1612
1613static DecodeStatus DecodeFMem3(MCInst &Inst,
1614 unsigned Insn,
1615 uint64_t Address,
1616 const void *Decoder) {
1617 int Offset = SignExtend32<16>(Insn & 0xffff);
1618 unsigned Reg = fieldFromInstruction(Insn, 16, 5);
1619 unsigned Base = fieldFromInstruction(Insn, 21, 5);
1620
1621 Reg = getReg(Decoder, Mips::COP3RegClassID, Reg);
1622 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1623
Jim Grosbache9119e42015-05-13 18:37:00 +00001624 Inst.addOperand(MCOperand::createReg(Reg));
1625 Inst.addOperand(MCOperand::createReg(Base));
1626 Inst.addOperand(MCOperand::createImm(Offset));
Daniel Sanders92db6b72014-10-01 08:26:55 +00001627
1628 return MCDisassembler::Success;
1629}
1630
Vladimir Medic435cf8a2015-01-21 10:47:36 +00001631static DecodeStatus DecodeFMemCop2R6(MCInst &Inst,
1632 unsigned Insn,
1633 uint64_t Address,
1634 const void *Decoder) {
1635 int Offset = SignExtend32<11>(Insn & 0x07ff);
1636 unsigned Reg = fieldFromInstruction(Insn, 16, 5);
1637 unsigned Base = fieldFromInstruction(Insn, 11, 5);
1638
1639 Reg = getReg(Decoder, Mips::COP2RegClassID, Reg);
1640 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1641
Jim Grosbache9119e42015-05-13 18:37:00 +00001642 Inst.addOperand(MCOperand::createReg(Reg));
1643 Inst.addOperand(MCOperand::createReg(Base));
1644 Inst.addOperand(MCOperand::createImm(Offset));
Vladimir Medic435cf8a2015-01-21 10:47:36 +00001645
1646 return MCDisassembler::Success;
1647}
Daniel Sanders6a803f62014-06-16 13:13:03 +00001648static DecodeStatus DecodeSpecial3LlSc(MCInst &Inst,
1649 unsigned Insn,
1650 uint64_t Address,
1651 const void *Decoder) {
1652 int64_t Offset = SignExtend64<9>((Insn >> 7) & 0x1ff);
1653 unsigned Rt = fieldFromInstruction(Insn, 16, 5);
1654 unsigned Base = fieldFromInstruction(Insn, 21, 5);
1655
1656 Rt = getReg(Decoder, Mips::GPR32RegClassID, Rt);
1657 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1658
1659 if(Inst.getOpcode() == Mips::SC_R6 || Inst.getOpcode() == Mips::SCD_R6){
Jim Grosbache9119e42015-05-13 18:37:00 +00001660 Inst.addOperand(MCOperand::createReg(Rt));
Daniel Sanders6a803f62014-06-16 13:13:03 +00001661 }
1662
Jim Grosbache9119e42015-05-13 18:37:00 +00001663 Inst.addOperand(MCOperand::createReg(Rt));
1664 Inst.addOperand(MCOperand::createReg(Base));
1665 Inst.addOperand(MCOperand::createImm(Offset));
Daniel Sanders6a803f62014-06-16 13:13:03 +00001666
1667 return MCDisassembler::Success;
1668}
Akira Hatanaka71928e62012-04-17 18:03:21 +00001669
1670static DecodeStatus DecodeHWRegsRegisterClass(MCInst &Inst,
1671 unsigned RegNo,
1672 uint64_t Address,
1673 const void *Decoder) {
1674 // Currently only hardware register 29 is supported.
1675 if (RegNo != 29)
1676 return MCDisassembler::Fail;
Jim Grosbache9119e42015-05-13 18:37:00 +00001677 Inst.addOperand(MCOperand::createReg(Mips::HWR29));
Akira Hatanaka71928e62012-04-17 18:03:21 +00001678 return MCDisassembler::Success;
1679}
1680
Akira Hatanaka71928e62012-04-17 18:03:21 +00001681static DecodeStatus DecodeAFGR64RegisterClass(MCInst &Inst,
1682 unsigned RegNo,
1683 uint64_t Address,
1684 const void *Decoder) {
Akira Hatanaka9bf2b562012-07-09 18:46:47 +00001685 if (RegNo > 30 || RegNo %2)
Akira Hatanaka71928e62012-04-17 18:03:21 +00001686 return MCDisassembler::Fail;
1687
Akira Hatanaka9bf2b562012-07-09 18:46:47 +00001688 ;
1689 unsigned Reg = getReg(Decoder, Mips::AFGR64RegClassID, RegNo /2);
Jim Grosbache9119e42015-05-13 18:37:00 +00001690 Inst.addOperand(MCOperand::createReg(Reg));
Akira Hatanaka71928e62012-04-17 18:03:21 +00001691 return MCDisassembler::Success;
1692}
1693
Akira Hatanaka00fcf2e2013-08-08 21:54:26 +00001694static DecodeStatus DecodeACC64DSPRegisterClass(MCInst &Inst,
1695 unsigned RegNo,
1696 uint64_t Address,
1697 const void *Decoder) {
Akira Hatanakaecabd1a2012-09-27 02:01:10 +00001698 if (RegNo >= 4)
1699 return MCDisassembler::Fail;
1700
Akira Hatanaka00fcf2e2013-08-08 21:54:26 +00001701 unsigned Reg = getReg(Decoder, Mips::ACC64DSPRegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001702 Inst.addOperand(MCOperand::createReg(Reg));
Akira Hatanakaecabd1a2012-09-27 02:01:10 +00001703 return MCDisassembler::Success;
1704}
1705
Akira Hatanaka8002a3f2013-08-14 00:47:08 +00001706static DecodeStatus DecodeHI32DSPRegisterClass(MCInst &Inst,
1707 unsigned RegNo,
1708 uint64_t Address,
1709 const void *Decoder) {
Akira Hatanaka59bfaf72013-04-18 00:52:44 +00001710 if (RegNo >= 4)
1711 return MCDisassembler::Fail;
1712
Akira Hatanaka8002a3f2013-08-14 00:47:08 +00001713 unsigned Reg = getReg(Decoder, Mips::HI32DSPRegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001714 Inst.addOperand(MCOperand::createReg(Reg));
Akira Hatanaka59bfaf72013-04-18 00:52:44 +00001715 return MCDisassembler::Success;
1716}
1717
Akira Hatanaka8002a3f2013-08-14 00:47:08 +00001718static DecodeStatus DecodeLO32DSPRegisterClass(MCInst &Inst,
1719 unsigned RegNo,
1720 uint64_t Address,
1721 const void *Decoder) {
Akira Hatanaka59bfaf72013-04-18 00:52:44 +00001722 if (RegNo >= 4)
1723 return MCDisassembler::Fail;
1724
Akira Hatanaka8002a3f2013-08-14 00:47:08 +00001725 unsigned Reg = getReg(Decoder, Mips::LO32DSPRegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001726 Inst.addOperand(MCOperand::createReg(Reg));
Akira Hatanaka59bfaf72013-04-18 00:52:44 +00001727 return MCDisassembler::Success;
1728}
1729
Jack Carter3eb663b2013-09-26 00:09:46 +00001730static DecodeStatus DecodeMSA128BRegisterClass(MCInst &Inst,
1731 unsigned RegNo,
1732 uint64_t Address,
1733 const void *Decoder) {
1734 if (RegNo > 31)
1735 return MCDisassembler::Fail;
1736
1737 unsigned Reg = getReg(Decoder, Mips::MSA128BRegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001738 Inst.addOperand(MCOperand::createReg(Reg));
Jack Carter3eb663b2013-09-26 00:09:46 +00001739 return MCDisassembler::Success;
1740}
1741
Jack Carter5dc8ac92013-09-25 23:50:44 +00001742static DecodeStatus DecodeMSA128HRegisterClass(MCInst &Inst,
1743 unsigned RegNo,
1744 uint64_t Address,
1745 const void *Decoder) {
1746 if (RegNo > 31)
1747 return MCDisassembler::Fail;
1748
1749 unsigned Reg = getReg(Decoder, Mips::MSA128HRegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001750 Inst.addOperand(MCOperand::createReg(Reg));
Jack Carter5dc8ac92013-09-25 23:50:44 +00001751 return MCDisassembler::Success;
1752}
1753
1754static DecodeStatus DecodeMSA128WRegisterClass(MCInst &Inst,
1755 unsigned RegNo,
1756 uint64_t Address,
1757 const void *Decoder) {
1758 if (RegNo > 31)
1759 return MCDisassembler::Fail;
1760
1761 unsigned Reg = getReg(Decoder, Mips::MSA128WRegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001762 Inst.addOperand(MCOperand::createReg(Reg));
Jack Carter5dc8ac92013-09-25 23:50:44 +00001763 return MCDisassembler::Success;
1764}
1765
1766static DecodeStatus DecodeMSA128DRegisterClass(MCInst &Inst,
1767 unsigned RegNo,
1768 uint64_t Address,
1769 const void *Decoder) {
1770 if (RegNo > 31)
1771 return MCDisassembler::Fail;
1772
1773 unsigned Reg = getReg(Decoder, Mips::MSA128DRegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001774 Inst.addOperand(MCOperand::createReg(Reg));
Jack Carter5dc8ac92013-09-25 23:50:44 +00001775 return MCDisassembler::Success;
1776}
1777
Matheus Almeidaa591fdc2013-10-21 12:26:50 +00001778static DecodeStatus DecodeMSACtrlRegisterClass(MCInst &Inst,
1779 unsigned RegNo,
1780 uint64_t Address,
1781 const void *Decoder) {
1782 if (RegNo > 7)
1783 return MCDisassembler::Fail;
1784
1785 unsigned Reg = getReg(Decoder, Mips::MSACtrlRegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001786 Inst.addOperand(MCOperand::createReg(Reg));
Matheus Almeidaa591fdc2013-10-21 12:26:50 +00001787 return MCDisassembler::Success;
1788}
1789
Daniel Sandersa3134fa2015-06-27 15:39:19 +00001790static DecodeStatus DecodeCOP0RegisterClass(MCInst &Inst,
1791 unsigned RegNo,
1792 uint64_t Address,
1793 const void *Decoder) {
1794 if (RegNo > 31)
1795 return MCDisassembler::Fail;
1796
1797 unsigned Reg = getReg(Decoder, Mips::COP0RegClassID, RegNo);
1798 Inst.addOperand(MCOperand::createReg(Reg));
1799 return MCDisassembler::Success;
1800}
1801
Daniel Sanders2a83d682014-05-21 12:56:39 +00001802static DecodeStatus DecodeCOP2RegisterClass(MCInst &Inst,
1803 unsigned RegNo,
1804 uint64_t Address,
1805 const void *Decoder) {
1806 if (RegNo > 31)
1807 return MCDisassembler::Fail;
1808
1809 unsigned Reg = getReg(Decoder, Mips::COP2RegClassID, RegNo);
Jim Grosbache9119e42015-05-13 18:37:00 +00001810 Inst.addOperand(MCOperand::createReg(Reg));
Daniel Sanders2a83d682014-05-21 12:56:39 +00001811 return MCDisassembler::Success;
1812}
1813
Akira Hatanaka71928e62012-04-17 18:03:21 +00001814static DecodeStatus DecodeBranchTarget(MCInst &Inst,
1815 unsigned Offset,
1816 uint64_t Address,
1817 const void *Decoder) {
Alexey Samsonovd37bab62014-09-02 17:49:16 +00001818 int32_t BranchOffset = (SignExtend32<16>(Offset) * 4) + 4;
Jim Grosbache9119e42015-05-13 18:37:00 +00001819 Inst.addOperand(MCOperand::createImm(BranchOffset));
Akira Hatanaka71928e62012-04-17 18:03:21 +00001820 return MCDisassembler::Success;
1821}
1822
Akira Hatanaka71928e62012-04-17 18:03:21 +00001823static DecodeStatus DecodeJumpTarget(MCInst &Inst,
1824 unsigned Insn,
1825 uint64_t Address,
1826 const void *Decoder) {
1827
Jim Grosbachecaef492012-08-14 19:06:05 +00001828 unsigned JumpOffset = fieldFromInstruction(Insn, 0, 26) << 2;
Jim Grosbache9119e42015-05-13 18:37:00 +00001829 Inst.addOperand(MCOperand::createImm(JumpOffset));
Akira Hatanaka71928e62012-04-17 18:03:21 +00001830 return MCDisassembler::Success;
1831}
1832
Zoran Jovanovic3c8869d2014-05-16 11:03:45 +00001833static DecodeStatus DecodeBranchTarget21(MCInst &Inst,
1834 unsigned Offset,
1835 uint64_t Address,
1836 const void *Decoder) {
Alexey Samsonovd37bab62014-09-02 17:49:16 +00001837 int32_t BranchOffset = SignExtend32<21>(Offset) * 4;
Zoran Jovanovic3c8869d2014-05-16 11:03:45 +00001838
Jim Grosbache9119e42015-05-13 18:37:00 +00001839 Inst.addOperand(MCOperand::createImm(BranchOffset));
Zoran Jovanovic3c8869d2014-05-16 11:03:45 +00001840 return MCDisassembler::Success;
1841}
1842
1843static DecodeStatus DecodeBranchTarget26(MCInst &Inst,
1844 unsigned Offset,
1845 uint64_t Address,
1846 const void *Decoder) {
Alexey Samsonovd37bab62014-09-02 17:49:16 +00001847 int32_t BranchOffset = SignExtend32<26>(Offset) * 4;
Zoran Jovanovic3c8869d2014-05-16 11:03:45 +00001848
Jim Grosbache9119e42015-05-13 18:37:00 +00001849 Inst.addOperand(MCOperand::createImm(BranchOffset));
Zoran Jovanovic3c8869d2014-05-16 11:03:45 +00001850 return MCDisassembler::Success;
1851}
1852
Jozef Kolek9761e962015-01-12 12:03:34 +00001853static DecodeStatus DecodeBranchTarget7MM(MCInst &Inst,
1854 unsigned Offset,
1855 uint64_t Address,
1856 const void *Decoder) {
1857 int32_t BranchOffset = SignExtend32<7>(Offset) << 1;
Jim Grosbache9119e42015-05-13 18:37:00 +00001858 Inst.addOperand(MCOperand::createImm(BranchOffset));
Jozef Kolek9761e962015-01-12 12:03:34 +00001859 return MCDisassembler::Success;
1860}
1861
Jozef Kolek5cfebdd2015-01-21 12:39:30 +00001862static DecodeStatus DecodeBranchTarget10MM(MCInst &Inst,
1863 unsigned Offset,
1864 uint64_t Address,
1865 const void *Decoder) {
1866 int32_t BranchOffset = SignExtend32<10>(Offset) << 1;
Jim Grosbache9119e42015-05-13 18:37:00 +00001867 Inst.addOperand(MCOperand::createImm(BranchOffset));
Jozef Kolek5cfebdd2015-01-21 12:39:30 +00001868 return MCDisassembler::Success;
1869}
1870
Zoran Jovanovic8a80aa72013-11-04 14:53:22 +00001871static DecodeStatus DecodeBranchTargetMM(MCInst &Inst,
1872 unsigned Offset,
1873 uint64_t Address,
1874 const void *Decoder) {
Alexey Samsonovd37bab62014-09-02 17:49:16 +00001875 int32_t BranchOffset = SignExtend32<16>(Offset) * 2;
Jim Grosbache9119e42015-05-13 18:37:00 +00001876 Inst.addOperand(MCOperand::createImm(BranchOffset));
Zoran Jovanovic8a80aa72013-11-04 14:53:22 +00001877 return MCDisassembler::Success;
1878}
1879
Zoran Jovanovica887b362015-11-30 12:56:18 +00001880static DecodeStatus DecodeBranchTarget26MM(MCInst &Inst,
1881 unsigned Offset,
1882 uint64_t Address,
1883 const void *Decoder) {
1884 int32_t BranchOffset = SignExtend32<26>(Offset) << 1;
1885
1886 Inst.addOperand(MCOperand::createImm(BranchOffset));
1887 return MCDisassembler::Success;
1888}
1889
Zoran Jovanovic507e0842013-10-29 16:38:59 +00001890static DecodeStatus DecodeJumpTargetMM(MCInst &Inst,
1891 unsigned Insn,
1892 uint64_t Address,
1893 const void *Decoder) {
1894 unsigned JumpOffset = fieldFromInstruction(Insn, 0, 26) << 1;
Jim Grosbache9119e42015-05-13 18:37:00 +00001895 Inst.addOperand(MCOperand::createImm(JumpOffset));
Zoran Jovanovic507e0842013-10-29 16:38:59 +00001896 return MCDisassembler::Success;
1897}
Akira Hatanaka71928e62012-04-17 18:03:21 +00001898
Jozef Kolekaa2b9272014-11-27 14:41:44 +00001899static DecodeStatus DecodeAddiur2Simm7(MCInst &Inst,
1900 unsigned Value,
1901 uint64_t Address,
1902 const void *Decoder) {
1903 if (Value == 0)
Jim Grosbache9119e42015-05-13 18:37:00 +00001904 Inst.addOperand(MCOperand::createImm(1));
Jozef Kolekaa2b9272014-11-27 14:41:44 +00001905 else if (Value == 0x7)
Jim Grosbache9119e42015-05-13 18:37:00 +00001906 Inst.addOperand(MCOperand::createImm(-1));
Jozef Kolekaa2b9272014-11-27 14:41:44 +00001907 else
Jim Grosbache9119e42015-05-13 18:37:00 +00001908 Inst.addOperand(MCOperand::createImm(Value << 2));
Jozef Kolekaa2b9272014-11-27 14:41:44 +00001909 return MCDisassembler::Success;
1910}
1911
Daniel Sanders97297772016-03-22 14:40:00 +00001912static DecodeStatus DecodeLi16Imm(MCInst &Inst,
Jozef Kolekaa2b9272014-11-27 14:41:44 +00001913 unsigned Value,
1914 uint64_t Address,
1915 const void *Decoder) {
1916 if (Value == 0x7F)
Jim Grosbache9119e42015-05-13 18:37:00 +00001917 Inst.addOperand(MCOperand::createImm(-1));
Jozef Kolekaa2b9272014-11-27 14:41:44 +00001918 else
Jim Grosbache9119e42015-05-13 18:37:00 +00001919 Inst.addOperand(MCOperand::createImm(Value));
Jozef Kolekaa2b9272014-11-27 14:41:44 +00001920 return MCDisassembler::Success;
1921}
1922
Zoran Jovanovic6b28f092015-09-09 13:55:45 +00001923static DecodeStatus DecodePOOL16BEncodedField(MCInst &Inst,
1924 unsigned Value,
1925 uint64_t Address,
1926 const void *Decoder) {
1927 Inst.addOperand(MCOperand::createImm(Value == 0x0 ? 8 : Value));
1928 return MCDisassembler::Success;
1929}
1930
Akira Hatanaka71928e62012-04-17 18:03:21 +00001931static DecodeStatus DecodeSimm16(MCInst &Inst,
1932 unsigned Insn,
1933 uint64_t Address,
1934 const void *Decoder) {
Jim Grosbache9119e42015-05-13 18:37:00 +00001935 Inst.addOperand(MCOperand::createImm(SignExtend32<16>(Insn)));
Akira Hatanaka71928e62012-04-17 18:03:21 +00001936 return MCDisassembler::Success;
1937}
1938
Daniel Sanders19b7f762016-03-14 11:16:56 +00001939template <unsigned Bits, int Offset, int Scale>
1940static DecodeStatus DecodeUImmWithOffsetAndScale(MCInst &Inst, unsigned Value,
1941 uint64_t Address,
1942 const void *Decoder) {
Daniel Sandersea4f6532015-11-06 12:22:31 +00001943 Value &= ((1 << Bits) - 1);
Daniel Sanders19b7f762016-03-14 11:16:56 +00001944 Value *= Scale;
Daniel Sandersea4f6532015-11-06 12:22:31 +00001945 Inst.addOperand(MCOperand::createImm(Value + Offset));
Matheus Almeida779c5932013-11-18 12:32:49 +00001946 return MCDisassembler::Success;
1947}
1948
Daniel Sanders97297772016-03-22 14:40:00 +00001949template <unsigned Bits, int Offset, int ScaleBy>
1950static DecodeStatus DecodeSImmWithOffsetAndScale(MCInst &Inst, unsigned Value,
1951 uint64_t Address,
1952 const void *Decoder) {
1953 int32_t Imm = SignExtend32<Bits>(Value) * ScaleBy;
Daniel Sanders78e89022016-03-11 11:37:50 +00001954 Inst.addOperand(MCOperand::createImm(Imm + Offset));
1955 return MCDisassembler::Success;
1956}
1957
Akira Hatanaka71928e62012-04-17 18:03:21 +00001958static DecodeStatus DecodeInsSize(MCInst &Inst,
1959 unsigned Insn,
1960 uint64_t Address,
1961 const void *Decoder) {
1962 // First we need to grab the pos(lsb) from MCInst.
1963 int Pos = Inst.getOperand(2).getImm();
1964 int Size = (int) Insn - Pos + 1;
Jim Grosbache9119e42015-05-13 18:37:00 +00001965 Inst.addOperand(MCOperand::createImm(SignExtend32<16>(Size)));
Akira Hatanaka71928e62012-04-17 18:03:21 +00001966 return MCDisassembler::Success;
1967}
1968
Daniel Sandersb59e1a42014-05-15 10:45:58 +00001969static DecodeStatus DecodeSimm19Lsl2(MCInst &Inst, unsigned Insn,
1970 uint64_t Address, const void *Decoder) {
Jim Grosbache9119e42015-05-13 18:37:00 +00001971 Inst.addOperand(MCOperand::createImm(SignExtend32<19>(Insn) * 4));
Daniel Sandersb59e1a42014-05-15 10:45:58 +00001972 return MCDisassembler::Success;
1973}
Zoran Jovanovic28551422014-06-09 09:49:51 +00001974
1975static DecodeStatus DecodeSimm18Lsl3(MCInst &Inst, unsigned Insn,
1976 uint64_t Address, const void *Decoder) {
Jim Grosbache9119e42015-05-13 18:37:00 +00001977 Inst.addOperand(MCOperand::createImm(SignExtend32<18>(Insn) * 8));
Zoran Jovanovic28551422014-06-09 09:49:51 +00001978 return MCDisassembler::Success;
1979}
Zoran Jovanovica4c4b5f2014-11-19 16:44:02 +00001980
Vladimir Medicb682ddf2014-12-01 11:12:04 +00001981static DecodeStatus DecodeSimm9SP(MCInst &Inst, unsigned Insn,
1982 uint64_t Address, const void *Decoder) {
1983 int32_t DecodedValue;
1984 switch (Insn) {
1985 case 0: DecodedValue = 256; break;
1986 case 1: DecodedValue = 257; break;
1987 case 510: DecodedValue = -258; break;
1988 case 511: DecodedValue = -257; break;
1989 default: DecodedValue = SignExtend32<9>(Insn); break;
1990 }
Jim Grosbache9119e42015-05-13 18:37:00 +00001991 Inst.addOperand(MCOperand::createImm(DecodedValue * 4));
Vladimir Medicb682ddf2014-12-01 11:12:04 +00001992 return MCDisassembler::Success;
1993}
1994
1995static DecodeStatus DecodeANDI16Imm(MCInst &Inst, unsigned Insn,
1996 uint64_t Address, const void *Decoder) {
1997 // Insn must be >= 0, since it is unsigned that condition is always true.
1998 assert(Insn < 16);
1999 int32_t DecodedValues[] = {128, 1, 2, 3, 4, 7, 8, 15, 16, 31, 32, 63, 64,
2000 255, 32768, 65535};
Jim Grosbache9119e42015-05-13 18:37:00 +00002001 Inst.addOperand(MCOperand::createImm(DecodedValues[Insn]));
Vladimir Medicb682ddf2014-12-01 11:12:04 +00002002 return MCDisassembler::Success;
2003}
2004
Zoran Jovanovica4c4b5f2014-11-19 16:44:02 +00002005static DecodeStatus DecodeRegListOperand(MCInst &Inst,
2006 unsigned Insn,
2007 uint64_t Address,
2008 const void *Decoder) {
2009 unsigned Regs[] = {Mips::S0, Mips::S1, Mips::S2, Mips::S3, Mips::S4, Mips::S5,
Zoran Jovanovicdc4b8c22015-09-15 15:21:27 +00002010 Mips::S6, Mips::S7, Mips::FP};
Zoran Jovanovica4c4b5f2014-11-19 16:44:02 +00002011 unsigned RegNum;
2012
2013 unsigned RegLst = fieldFromInstruction(Insn, 21, 5);
Daniel Sandersdf19a5e2015-09-18 14:20:54 +00002014
Zoran Jovanovica4c4b5f2014-11-19 16:44:02 +00002015 // Empty register lists are not allowed.
2016 if (RegLst == 0)
2017 return MCDisassembler::Fail;
2018
2019 RegNum = RegLst & 0xf;
Daniel Sandersdf19a5e2015-09-18 14:20:54 +00002020
2021 // RegLst values 10-15, and 26-31 are reserved.
2022 if (RegNum > 9)
2023 return MCDisassembler::Fail;
2024
Zoran Jovanovica4c4b5f2014-11-19 16:44:02 +00002025 for (unsigned i = 0; i < RegNum; i++)
Jim Grosbache9119e42015-05-13 18:37:00 +00002026 Inst.addOperand(MCOperand::createReg(Regs[i]));
Zoran Jovanovica4c4b5f2014-11-19 16:44:02 +00002027
2028 if (RegLst & 0x10)
Jim Grosbache9119e42015-05-13 18:37:00 +00002029 Inst.addOperand(MCOperand::createReg(Mips::RA));
Zoran Jovanovica4c4b5f2014-11-19 16:44:02 +00002030
2031 return MCDisassembler::Success;
2032}
Zoran Jovanovicf9a02502014-11-27 18:28:59 +00002033
2034static DecodeStatus DecodeRegListOperand16(MCInst &Inst, unsigned Insn,
2035 uint64_t Address,
2036 const void *Decoder) {
2037 unsigned Regs[] = {Mips::S0, Mips::S1, Mips::S2, Mips::S3};
Zlatko Buljan797c2ae2015-11-12 13:21:33 +00002038 unsigned RegLst;
2039 switch(Inst.getOpcode()) {
2040 default:
2041 RegLst = fieldFromInstruction(Insn, 4, 2);
2042 break;
2043 case Mips::LWM16_MMR6:
2044 case Mips::SWM16_MMR6:
2045 RegLst = fieldFromInstruction(Insn, 8, 2);
2046 break;
2047 }
Jozef Kolekd68d424a2015-02-10 12:41:13 +00002048 unsigned RegNum = RegLst & 0x3;
Zoran Jovanovicf9a02502014-11-27 18:28:59 +00002049
Jozef Kolekd68d424a2015-02-10 12:41:13 +00002050 for (unsigned i = 0; i <= RegNum; i++)
Jim Grosbache9119e42015-05-13 18:37:00 +00002051 Inst.addOperand(MCOperand::createReg(Regs[i]));
Zoran Jovanovicf9a02502014-11-27 18:28:59 +00002052
Jim Grosbache9119e42015-05-13 18:37:00 +00002053 Inst.addOperand(MCOperand::createReg(Mips::RA));
Zoran Jovanovicf9a02502014-11-27 18:28:59 +00002054
2055 return MCDisassembler::Success;
2056}
Jozef Kolek2c6d7322015-01-21 12:10:11 +00002057
Zoran Jovanovic41688672015-02-10 16:36:20 +00002058static DecodeStatus DecodeMovePRegPair(MCInst &Inst, unsigned Insn,
2059 uint64_t Address, const void *Decoder) {
2060
2061 unsigned RegPair = fieldFromInstruction(Insn, 7, 3);
2062
2063 switch (RegPair) {
2064 default:
2065 return MCDisassembler::Fail;
2066 case 0:
Jim Grosbache9119e42015-05-13 18:37:00 +00002067 Inst.addOperand(MCOperand::createReg(Mips::A1));
2068 Inst.addOperand(MCOperand::createReg(Mips::A2));
Zoran Jovanovic41688672015-02-10 16:36:20 +00002069 break;
2070 case 1:
Jim Grosbache9119e42015-05-13 18:37:00 +00002071 Inst.addOperand(MCOperand::createReg(Mips::A1));
2072 Inst.addOperand(MCOperand::createReg(Mips::A3));
Zoran Jovanovic41688672015-02-10 16:36:20 +00002073 break;
2074 case 2:
Jim Grosbache9119e42015-05-13 18:37:00 +00002075 Inst.addOperand(MCOperand::createReg(Mips::A2));
2076 Inst.addOperand(MCOperand::createReg(Mips::A3));
Zoran Jovanovic41688672015-02-10 16:36:20 +00002077 break;
2078 case 3:
Jim Grosbache9119e42015-05-13 18:37:00 +00002079 Inst.addOperand(MCOperand::createReg(Mips::A0));
2080 Inst.addOperand(MCOperand::createReg(Mips::S5));
Zoran Jovanovic41688672015-02-10 16:36:20 +00002081 break;
2082 case 4:
Jim Grosbache9119e42015-05-13 18:37:00 +00002083 Inst.addOperand(MCOperand::createReg(Mips::A0));
2084 Inst.addOperand(MCOperand::createReg(Mips::S6));
Zoran Jovanovic41688672015-02-10 16:36:20 +00002085 break;
2086 case 5:
Jim Grosbache9119e42015-05-13 18:37:00 +00002087 Inst.addOperand(MCOperand::createReg(Mips::A0));
2088 Inst.addOperand(MCOperand::createReg(Mips::A1));
Zoran Jovanovic41688672015-02-10 16:36:20 +00002089 break;
2090 case 6:
Jim Grosbache9119e42015-05-13 18:37:00 +00002091 Inst.addOperand(MCOperand::createReg(Mips::A0));
2092 Inst.addOperand(MCOperand::createReg(Mips::A2));
Zoran Jovanovic41688672015-02-10 16:36:20 +00002093 break;
2094 case 7:
Jim Grosbache9119e42015-05-13 18:37:00 +00002095 Inst.addOperand(MCOperand::createReg(Mips::A0));
2096 Inst.addOperand(MCOperand::createReg(Mips::A3));
Zoran Jovanovic41688672015-02-10 16:36:20 +00002097 break;
2098 }
2099
2100 return MCDisassembler::Success;
2101}
2102
Jozef Kolek2c6d7322015-01-21 12:10:11 +00002103static DecodeStatus DecodeSimm23Lsl2(MCInst &Inst, unsigned Insn,
2104 uint64_t Address, const void *Decoder) {
Justin Bogner6499b5f2015-06-23 07:28:57 +00002105 Inst.addOperand(MCOperand::createImm(SignExtend32<25>(Insn << 2)));
Jozef Kolek2c6d7322015-01-21 12:10:11 +00002106 return MCDisassembler::Success;
2107}