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