blob: 21abe6c5857dcbd203993b3f3ebc61271e24fc1f [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/MemoryObject.h"
24#include "llvm/Support/TargetRegistry.h"
Akira Hatanaka71928e62012-04-17 18:03:21 +000025
Akira Hatanaka71928e62012-04-17 18:03:21 +000026using namespace llvm;
27
Chandler Carruthe96dd892014-04-21 22:55:11 +000028#define DEBUG_TYPE "mips-disassembler"
29
Akira Hatanaka71928e62012-04-17 18:03:21 +000030typedef MCDisassembler::DecodeStatus DecodeStatus;
31
Benjamin Kramercb3e98c2012-05-01 14:34:24 +000032namespace {
33
Akira Hatanaka9bf2b562012-07-09 18:46:47 +000034/// MipsDisassemblerBase - a disasembler class for Mips.
35class MipsDisassemblerBase : public MCDisassembler {
Akira Hatanaka71928e62012-04-17 18:03:21 +000036public:
37 /// Constructor - Initializes the disassembler.
38 ///
Lang Hamesa1bc0f52014-04-15 04:40:56 +000039 MipsDisassemblerBase(const MCSubtargetInfo &STI, MCContext &Ctx,
Akira Hatanaka9bf2b562012-07-09 18:46:47 +000040 bool bigEndian) :
Lang Hamesa1bc0f52014-04-15 04:40:56 +000041 MCDisassembler(STI, Ctx),
Akira Hatanaka9bfa2e22013-08-28 00:55:15 +000042 IsN64(STI.getFeatureBits() & Mips::FeatureN64), isBigEndian(bigEndian) {}
Akira Hatanaka71928e62012-04-17 18:03:21 +000043
Akira Hatanaka9bf2b562012-07-09 18:46:47 +000044 virtual ~MipsDisassemblerBase() {}
Akira Hatanaka71928e62012-04-17 18:03:21 +000045
Akira Hatanaka9bfa2e22013-08-28 00:55:15 +000046 bool isN64() const { return IsN64; }
47
Akira Hatanaka71928e62012-04-17 18:03:21 +000048private:
Akira Hatanaka9bfa2e22013-08-28 00:55:15 +000049 bool IsN64;
Akira Hatanaka9bf2b562012-07-09 18:46:47 +000050protected:
Akira Hatanaka71928e62012-04-17 18:03:21 +000051 bool isBigEndian;
52};
53
Akira Hatanaka9bf2b562012-07-09 18:46:47 +000054/// MipsDisassembler - a disasembler class for Mips32.
55class MipsDisassembler : public MipsDisassemblerBase {
Vladimir Medicdde3d582013-09-06 12:30:36 +000056 bool IsMicroMips;
Akira Hatanaka9bf2b562012-07-09 18:46:47 +000057public:
58 /// Constructor - Initializes the disassembler.
59 ///
Lang Hamesa1bc0f52014-04-15 04:40:56 +000060 MipsDisassembler(const MCSubtargetInfo &STI, MCContext &Ctx,
Akira Hatanaka9bf2b562012-07-09 18:46:47 +000061 bool bigEndian) :
Lang Hamesa1bc0f52014-04-15 04:40:56 +000062 MipsDisassemblerBase(STI, Ctx, bigEndian) {
Vladimir Medicdde3d582013-09-06 12:30:36 +000063 IsMicroMips = STI.getFeatureBits() & Mips::FeatureMicroMips;
64 }
Akira Hatanaka9bf2b562012-07-09 18:46:47 +000065
66 /// getInstruction - See MCDisassembler.
Craig Topper56c590a2014-04-29 07:58:02 +000067 DecodeStatus getInstruction(MCInst &instr,
68 uint64_t &size,
69 const MemoryObject &region,
70 uint64_t address,
71 raw_ostream &vStream,
72 raw_ostream &cStream) const override;
Akira Hatanaka9bf2b562012-07-09 18:46:47 +000073};
74
Akira Hatanaka71928e62012-04-17 18:03:21 +000075
76/// Mips64Disassembler - a disasembler class for Mips64.
Akira Hatanaka9bf2b562012-07-09 18:46:47 +000077class Mips64Disassembler : public MipsDisassemblerBase {
Akira Hatanaka71928e62012-04-17 18:03:21 +000078public:
79 /// Constructor - Initializes the disassembler.
80 ///
Lang Hamesa1bc0f52014-04-15 04:40:56 +000081 Mips64Disassembler(const MCSubtargetInfo &STI, MCContext &Ctx,
Akira Hatanaka9bf2b562012-07-09 18:46:47 +000082 bool bigEndian) :
Lang Hamesa1bc0f52014-04-15 04:40:56 +000083 MipsDisassemblerBase(STI, Ctx, bigEndian) {}
Akira Hatanaka71928e62012-04-17 18:03:21 +000084
85 /// getInstruction - See MCDisassembler.
Craig Topper56c590a2014-04-29 07:58:02 +000086 DecodeStatus getInstruction(MCInst &instr,
87 uint64_t &size,
88 const MemoryObject &region,
89 uint64_t address,
90 raw_ostream &vStream,
91 raw_ostream &cStream) const override;
Akira Hatanaka71928e62012-04-17 18:03:21 +000092};
93
Benjamin Kramercb3e98c2012-05-01 14:34:24 +000094} // end anonymous namespace
95
Akira Hatanaka71928e62012-04-17 18:03:21 +000096// Forward declare these because the autogenerated code will reference them.
97// Definitions are further down.
Akira Hatanaka13e6ccf2013-08-06 23:08:38 +000098static DecodeStatus DecodeGPR64RegisterClass(MCInst &Inst,
99 unsigned RegNo,
100 uint64_t Address,
101 const void *Decoder);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000102
Reed Kotlerec8a5492013-02-14 03:05:25 +0000103static DecodeStatus DecodeCPU16RegsRegisterClass(MCInst &Inst,
104 unsigned RegNo,
105 uint64_t Address,
106 const void *Decoder);
107
Akira Hatanaka13e6ccf2013-08-06 23:08:38 +0000108static DecodeStatus DecodeGPR32RegisterClass(MCInst &Inst,
109 unsigned RegNo,
110 uint64_t Address,
111 const void *Decoder);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000112
Akira Hatanaka9bfa2e22013-08-28 00:55:15 +0000113static DecodeStatus DecodePtrRegisterClass(MCInst &Inst,
114 unsigned Insn,
115 uint64_t Address,
116 const void *Decoder);
117
Akira Hatanaka654655f2013-08-14 00:53:38 +0000118static DecodeStatus DecodeDSPRRegisterClass(MCInst &Inst,
119 unsigned RegNo,
120 uint64_t Address,
121 const void *Decoder);
Akira Hatanakaecabd1a2012-09-27 02:01:10 +0000122
Akira Hatanaka71928e62012-04-17 18:03:21 +0000123static DecodeStatus DecodeFGR64RegisterClass(MCInst &Inst,
124 unsigned RegNo,
125 uint64_t Address,
126 const void *Decoder);
127
128static DecodeStatus DecodeFGR32RegisterClass(MCInst &Inst,
129 unsigned RegNo,
130 uint64_t Address,
131 const void *Decoder);
132
Akira Hatanaka14e31a22013-08-20 22:58:56 +0000133static DecodeStatus DecodeFGRH32RegisterClass(MCInst &Inst,
134 unsigned RegNo,
135 uint64_t Address,
136 const void *Decoder);
137
Akira Hatanaka71928e62012-04-17 18:03:21 +0000138static DecodeStatus DecodeCCRRegisterClass(MCInst &Inst,
139 unsigned RegNo,
140 uint64_t Address,
141 const void *Decoder);
142
Akira Hatanaka1fb1b8b2013-07-26 20:13:47 +0000143static DecodeStatus DecodeFCCRegisterClass(MCInst &Inst,
144 unsigned RegNo,
145 uint64_t Address,
146 const void *Decoder);
147
Akira Hatanaka71928e62012-04-17 18:03:21 +0000148static DecodeStatus DecodeHWRegsRegisterClass(MCInst &Inst,
149 unsigned Insn,
150 uint64_t Address,
151 const void *Decoder);
152
153static DecodeStatus DecodeAFGR64RegisterClass(MCInst &Inst,
154 unsigned RegNo,
155 uint64_t Address,
156 const void *Decoder);
157
Akira Hatanaka00fcf2e2013-08-08 21:54:26 +0000158static DecodeStatus DecodeACC64DSPRegisterClass(MCInst &Inst,
159 unsigned RegNo,
160 uint64_t Address,
161 const void *Decoder);
Akira Hatanakaecabd1a2012-09-27 02:01:10 +0000162
Akira Hatanaka8002a3f2013-08-14 00:47:08 +0000163static DecodeStatus DecodeHI32DSPRegisterClass(MCInst &Inst,
164 unsigned RegNo,
165 uint64_t Address,
166 const void *Decoder);
Akira Hatanaka59bfaf72013-04-18 00:52:44 +0000167
Akira Hatanaka8002a3f2013-08-14 00:47:08 +0000168static DecodeStatus DecodeLO32DSPRegisterClass(MCInst &Inst,
169 unsigned RegNo,
170 uint64_t Address,
171 const void *Decoder);
Akira Hatanaka59bfaf72013-04-18 00:52:44 +0000172
Jack Carter3eb663b2013-09-26 00:09:46 +0000173static DecodeStatus DecodeMSA128BRegisterClass(MCInst &Inst,
174 unsigned RegNo,
175 uint64_t Address,
176 const void *Decoder);
177
Jack Carter5dc8ac92013-09-25 23:50:44 +0000178static DecodeStatus DecodeMSA128HRegisterClass(MCInst &Inst,
179 unsigned RegNo,
180 uint64_t Address,
181 const void *Decoder);
182
183static DecodeStatus DecodeMSA128WRegisterClass(MCInst &Inst,
184 unsigned RegNo,
185 uint64_t Address,
186 const void *Decoder);
187
188static DecodeStatus DecodeMSA128DRegisterClass(MCInst &Inst,
189 unsigned RegNo,
190 uint64_t Address,
191 const void *Decoder);
192
Matheus Almeidaa591fdc2013-10-21 12:26:50 +0000193static DecodeStatus DecodeMSACtrlRegisterClass(MCInst &Inst,
194 unsigned RegNo,
195 uint64_t Address,
196 const void *Decoder);
197
Akira Hatanaka71928e62012-04-17 18:03:21 +0000198static DecodeStatus DecodeBranchTarget(MCInst &Inst,
199 unsigned Offset,
200 uint64_t Address,
201 const void *Decoder);
202
Akira Hatanaka71928e62012-04-17 18:03:21 +0000203static DecodeStatus DecodeJumpTarget(MCInst &Inst,
204 unsigned Insn,
205 uint64_t Address,
206 const void *Decoder);
207
Zoran Jovanovic3c8869d2014-05-16 11:03:45 +0000208static DecodeStatus DecodeBranchTarget21(MCInst &Inst,
209 unsigned Offset,
210 uint64_t Address,
211 const void *Decoder);
212
213static DecodeStatus DecodeBranchTarget26(MCInst &Inst,
214 unsigned Offset,
215 uint64_t Address,
216 const void *Decoder);
217
Zoran Jovanovic8a80aa72013-11-04 14:53:22 +0000218// DecodeBranchTargetMM - Decode microMIPS branch offset, which is
219// shifted left by 1 bit.
220static DecodeStatus DecodeBranchTargetMM(MCInst &Inst,
221 unsigned Offset,
222 uint64_t Address,
223 const void *Decoder);
224
Zoran Jovanovic507e0842013-10-29 16:38:59 +0000225// DecodeJumpTargetMM - Decode microMIPS jump target, which is
226// shifted left by 1 bit.
227static DecodeStatus DecodeJumpTargetMM(MCInst &Inst,
228 unsigned Insn,
229 uint64_t Address,
230 const void *Decoder);
231
Akira Hatanaka71928e62012-04-17 18:03:21 +0000232static DecodeStatus DecodeMem(MCInst &Inst,
233 unsigned Insn,
234 uint64_t Address,
235 const void *Decoder);
236
Matheus Almeidafe0bf9f2013-10-21 13:07:13 +0000237static DecodeStatus DecodeMSA128Mem(MCInst &Inst, unsigned Insn,
238 uint64_t Address, const void *Decoder);
239
Vladimir Medicdde3d582013-09-06 12:30:36 +0000240static DecodeStatus DecodeMemMMImm12(MCInst &Inst,
241 unsigned Insn,
242 uint64_t Address,
243 const void *Decoder);
244
245static DecodeStatus DecodeMemMMImm16(MCInst &Inst,
246 unsigned Insn,
247 uint64_t Address,
248 const void *Decoder);
249
Akira Hatanaka71928e62012-04-17 18:03:21 +0000250static DecodeStatus DecodeFMem(MCInst &Inst, unsigned Insn,
251 uint64_t Address,
252 const void *Decoder);
253
254static DecodeStatus DecodeSimm16(MCInst &Inst,
255 unsigned Insn,
256 uint64_t Address,
257 const void *Decoder);
258
Matheus Almeida779c5932013-11-18 12:32:49 +0000259// Decode the immediate field of an LSA instruction which
260// is off by one.
261static DecodeStatus DecodeLSAImm(MCInst &Inst,
262 unsigned Insn,
263 uint64_t Address,
264 const void *Decoder);
265
Akira Hatanaka71928e62012-04-17 18:03:21 +0000266static DecodeStatus DecodeInsSize(MCInst &Inst,
267 unsigned Insn,
268 uint64_t Address,
269 const void *Decoder);
270
271static DecodeStatus DecodeExtSize(MCInst &Inst,
272 unsigned Insn,
273 uint64_t Address,
274 const void *Decoder);
275
Daniel Sandersb59e1a42014-05-15 10:45:58 +0000276static DecodeStatus DecodeSimm19Lsl2(MCInst &Inst, unsigned Insn,
277 uint64_t Address, const void *Decoder);
278
Daniel Sandersb50ccf82014-04-01 10:35:28 +0000279/// INSVE_[BHWD] have an implicit operand that the generated decoder doesn't
280/// handle.
281template <typename InsnType>
282static DecodeStatus DecodeINSVE_DF(MCInst &MI, InsnType insn, uint64_t Address,
283 const void *Decoder);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000284namespace llvm {
285extern Target TheMipselTarget, TheMipsTarget, TheMips64Target,
286 TheMips64elTarget;
287}
288
289static MCDisassembler *createMipsDisassembler(
290 const Target &T,
Lang Hamesa1bc0f52014-04-15 04:40:56 +0000291 const MCSubtargetInfo &STI,
292 MCContext &Ctx) {
293 return new MipsDisassembler(STI, Ctx, true);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000294}
295
296static MCDisassembler *createMipselDisassembler(
297 const Target &T,
Lang Hamesa1bc0f52014-04-15 04:40:56 +0000298 const MCSubtargetInfo &STI,
299 MCContext &Ctx) {
300 return new MipsDisassembler(STI, Ctx, false);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000301}
302
303static MCDisassembler *createMips64Disassembler(
304 const Target &T,
Lang Hamesa1bc0f52014-04-15 04:40:56 +0000305 const MCSubtargetInfo &STI,
306 MCContext &Ctx) {
307 return new Mips64Disassembler(STI, Ctx, true);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000308}
309
310static MCDisassembler *createMips64elDisassembler(
311 const Target &T,
Lang Hamesa1bc0f52014-04-15 04:40:56 +0000312 const MCSubtargetInfo &STI,
313 MCContext &Ctx) {
314 return new Mips64Disassembler(STI, Ctx, false);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000315}
316
317extern "C" void LLVMInitializeMipsDisassembler() {
318 // Register the disassembler.
319 TargetRegistry::RegisterMCDisassembler(TheMipsTarget,
320 createMipsDisassembler);
321 TargetRegistry::RegisterMCDisassembler(TheMipselTarget,
322 createMipselDisassembler);
323 TargetRegistry::RegisterMCDisassembler(TheMips64Target,
324 createMips64Disassembler);
325 TargetRegistry::RegisterMCDisassembler(TheMips64elTarget,
326 createMips64elDisassembler);
327}
328
Akira Hatanaka71928e62012-04-17 18:03:21 +0000329#include "MipsGenDisassemblerTables.inc"
330
Daniel Sandersb50ccf82014-04-01 10:35:28 +0000331template <typename InsnType>
332static DecodeStatus DecodeINSVE_DF(MCInst &MI, InsnType insn, uint64_t Address,
333 const void *Decoder) {
334 typedef DecodeStatus (*DecodeFN)(MCInst &, unsigned, uint64_t, const void *);
335 // The size of the n field depends on the element size
336 // The register class also depends on this.
337 InsnType tmp = fieldFromInstruction(insn, 17, 5);
338 unsigned NSize = 0;
339 DecodeFN RegDecoder = nullptr;
340 if ((tmp & 0x18) == 0x00) { // INSVE_B
341 NSize = 4;
342 RegDecoder = DecodeMSA128BRegisterClass;
343 } else if ((tmp & 0x1c) == 0x10) { // INSVE_H
344 NSize = 3;
345 RegDecoder = DecodeMSA128HRegisterClass;
346 } else if ((tmp & 0x1e) == 0x18) { // INSVE_W
347 NSize = 2;
348 RegDecoder = DecodeMSA128WRegisterClass;
349 } else if ((tmp & 0x1f) == 0x1c) { // INSVE_D
350 NSize = 1;
351 RegDecoder = DecodeMSA128DRegisterClass;
352 } else
353 llvm_unreachable("Invalid encoding");
354
355 assert(NSize != 0 && RegDecoder != nullptr);
356
357 // $wd
358 tmp = fieldFromInstruction(insn, 6, 5);
359 if (RegDecoder(MI, tmp, Address, Decoder) == MCDisassembler::Fail)
360 return MCDisassembler::Fail;
361 // $wd_in
362 if (RegDecoder(MI, tmp, Address, Decoder) == MCDisassembler::Fail)
363 return MCDisassembler::Fail;
364 // $n
365 tmp = fieldFromInstruction(insn, 16, NSize);
366 MI.addOperand(MCOperand::CreateImm(tmp));
367 // $ws
368 tmp = fieldFromInstruction(insn, 11, 5);
369 if (RegDecoder(MI, tmp, Address, Decoder) == MCDisassembler::Fail)
370 return MCDisassembler::Fail;
371 // $n2
372 MI.addOperand(MCOperand::CreateImm(0));
373
374 return MCDisassembler::Success;
375}
376
Akira Hatanaka71928e62012-04-17 18:03:21 +0000377 /// readInstruction - read four bytes from the MemoryObject
378 /// and return 32 bit word sorted according to the given endianess
379static DecodeStatus readInstruction32(const MemoryObject &region,
380 uint64_t address,
381 uint64_t &size,
382 uint32_t &insn,
Vladimir Medicdde3d582013-09-06 12:30:36 +0000383 bool isBigEndian,
384 bool IsMicroMips) {
Akira Hatanaka71928e62012-04-17 18:03:21 +0000385 uint8_t Bytes[4];
386
387 // We want to read exactly 4 Bytes of data.
Benjamin Kramer534d3a42013-05-24 10:54:58 +0000388 if (region.readBytes(address, 4, Bytes) == -1) {
Akira Hatanaka71928e62012-04-17 18:03:21 +0000389 size = 0;
390 return MCDisassembler::Fail;
391 }
392
393 if (isBigEndian) {
394 // Encoded as a big-endian 32-bit word in the stream.
395 insn = (Bytes[3] << 0) |
396 (Bytes[2] << 8) |
397 (Bytes[1] << 16) |
398 (Bytes[0] << 24);
399 }
400 else {
401 // Encoded as a small-endian 32-bit word in the stream.
Vladimir Medicdde3d582013-09-06 12:30:36 +0000402 // Little-endian byte ordering:
403 // mips32r2: 4 | 3 | 2 | 1
404 // microMIPS: 2 | 1 | 4 | 3
405 if (IsMicroMips) {
406 insn = (Bytes[2] << 0) |
407 (Bytes[3] << 8) |
408 (Bytes[0] << 16) |
409 (Bytes[1] << 24);
410 } else {
411 insn = (Bytes[0] << 0) |
412 (Bytes[1] << 8) |
413 (Bytes[2] << 16) |
414 (Bytes[3] << 24);
415 }
Akira Hatanaka71928e62012-04-17 18:03:21 +0000416 }
417
418 return MCDisassembler::Success;
419}
420
421DecodeStatus
422MipsDisassembler::getInstruction(MCInst &instr,
423 uint64_t &Size,
424 const MemoryObject &Region,
425 uint64_t Address,
426 raw_ostream &vStream,
427 raw_ostream &cStream) const {
428 uint32_t Insn;
429
430 DecodeStatus Result = readInstruction32(Region, Address, Size,
Vladimir Medicdde3d582013-09-06 12:30:36 +0000431 Insn, isBigEndian, IsMicroMips);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000432 if (Result == MCDisassembler::Fail)
433 return MCDisassembler::Fail;
434
Vladimir Medicdde3d582013-09-06 12:30:36 +0000435 if (IsMicroMips) {
436 // Calling the auto-generated decoder function.
437 Result = decodeInstruction(DecoderTableMicroMips32, instr, Insn, Address,
438 this, STI);
439 if (Result != MCDisassembler::Fail) {
440 Size = 4;
441 return Result;
442 }
443 return MCDisassembler::Fail;
444 }
445
Akira Hatanaka71928e62012-04-17 18:03:21 +0000446 // Calling the auto-generated decoder function.
Jim Grosbachecaef492012-08-14 19:06:05 +0000447 Result = decodeInstruction(DecoderTableMips32, instr, Insn, Address,
448 this, STI);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000449 if (Result != MCDisassembler::Fail) {
450 Size = 4;
451 return Result;
452 }
453
454 return MCDisassembler::Fail;
455}
456
457DecodeStatus
458Mips64Disassembler::getInstruction(MCInst &instr,
459 uint64_t &Size,
460 const MemoryObject &Region,
461 uint64_t Address,
462 raw_ostream &vStream,
463 raw_ostream &cStream) const {
464 uint32_t Insn;
465
466 DecodeStatus Result = readInstruction32(Region, Address, Size,
Vladimir Medicdde3d582013-09-06 12:30:36 +0000467 Insn, isBigEndian, false);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000468 if (Result == MCDisassembler::Fail)
469 return MCDisassembler::Fail;
470
471 // Calling the auto-generated decoder function.
Jim Grosbachecaef492012-08-14 19:06:05 +0000472 Result = decodeInstruction(DecoderTableMips6432, instr, Insn, Address,
473 this, STI);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000474 if (Result != MCDisassembler::Fail) {
475 Size = 4;
476 return Result;
477 }
478 // If we fail to decode in Mips64 decoder space we can try in Mips32
Jim Grosbachecaef492012-08-14 19:06:05 +0000479 Result = decodeInstruction(DecoderTableMips32, instr, Insn, Address,
480 this, STI);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000481 if (Result != MCDisassembler::Fail) {
482 Size = 4;
483 return Result;
484 }
485
486 return MCDisassembler::Fail;
487}
488
Akira Hatanaka9bf2b562012-07-09 18:46:47 +0000489static unsigned getReg(const void *D, unsigned RC, unsigned RegNo) {
490 const MipsDisassemblerBase *Dis = static_cast<const MipsDisassemblerBase*>(D);
Lang Hamesa1bc0f52014-04-15 04:40:56 +0000491 const MCRegisterInfo *RegInfo = Dis->getContext().getRegisterInfo();
492 return *(RegInfo->getRegClass(RC).begin() + RegNo);
Akira Hatanaka9bf2b562012-07-09 18:46:47 +0000493}
494
Reed Kotlerec8a5492013-02-14 03:05:25 +0000495static DecodeStatus DecodeCPU16RegsRegisterClass(MCInst &Inst,
496 unsigned RegNo,
497 uint64_t Address,
498 const void *Decoder) {
499
500 return MCDisassembler::Fail;
501
502}
503
Akira Hatanaka13e6ccf2013-08-06 23:08:38 +0000504static DecodeStatus DecodeGPR64RegisterClass(MCInst &Inst,
505 unsigned RegNo,
506 uint64_t Address,
507 const void *Decoder) {
Akira Hatanaka71928e62012-04-17 18:03:21 +0000508
509 if (RegNo > 31)
510 return MCDisassembler::Fail;
511
Akira Hatanaka13e6ccf2013-08-06 23:08:38 +0000512 unsigned Reg = getReg(Decoder, Mips::GPR64RegClassID, RegNo);
Akira Hatanaka9bf2b562012-07-09 18:46:47 +0000513 Inst.addOperand(MCOperand::CreateReg(Reg));
Akira Hatanaka71928e62012-04-17 18:03:21 +0000514 return MCDisassembler::Success;
515}
516
Akira Hatanaka13e6ccf2013-08-06 23:08:38 +0000517static DecodeStatus DecodeGPR32RegisterClass(MCInst &Inst,
518 unsigned RegNo,
519 uint64_t Address,
520 const void *Decoder) {
Akira Hatanaka71928e62012-04-17 18:03:21 +0000521 if (RegNo > 31)
522 return MCDisassembler::Fail;
Akira Hatanaka13e6ccf2013-08-06 23:08:38 +0000523 unsigned Reg = getReg(Decoder, Mips::GPR32RegClassID, RegNo);
Akira Hatanaka9bf2b562012-07-09 18:46:47 +0000524 Inst.addOperand(MCOperand::CreateReg(Reg));
Akira Hatanaka71928e62012-04-17 18:03:21 +0000525 return MCDisassembler::Success;
526}
527
Akira Hatanaka9bfa2e22013-08-28 00:55:15 +0000528static DecodeStatus DecodePtrRegisterClass(MCInst &Inst,
529 unsigned RegNo,
530 uint64_t Address,
531 const void *Decoder) {
532 if (static_cast<const MipsDisassembler *>(Decoder)->isN64())
533 return DecodeGPR64RegisterClass(Inst, RegNo, Address, Decoder);
534
535 return DecodeGPR32RegisterClass(Inst, RegNo, Address, Decoder);
536}
537
Akira Hatanaka654655f2013-08-14 00:53:38 +0000538static DecodeStatus DecodeDSPRRegisterClass(MCInst &Inst,
539 unsigned RegNo,
540 uint64_t Address,
541 const void *Decoder) {
Akira Hatanaka13e6ccf2013-08-06 23:08:38 +0000542 return DecodeGPR32RegisterClass(Inst, RegNo, Address, Decoder);
Akira Hatanakaecabd1a2012-09-27 02:01:10 +0000543}
544
Akira Hatanaka71928e62012-04-17 18:03:21 +0000545static DecodeStatus DecodeFGR64RegisterClass(MCInst &Inst,
546 unsigned RegNo,
547 uint64_t Address,
548 const void *Decoder) {
549 if (RegNo > 31)
550 return MCDisassembler::Fail;
551
Akira Hatanaka9bf2b562012-07-09 18:46:47 +0000552 unsigned Reg = getReg(Decoder, Mips::FGR64RegClassID, RegNo);
553 Inst.addOperand(MCOperand::CreateReg(Reg));
Akira Hatanaka71928e62012-04-17 18:03:21 +0000554 return MCDisassembler::Success;
555}
556
557static DecodeStatus DecodeFGR32RegisterClass(MCInst &Inst,
558 unsigned RegNo,
559 uint64_t Address,
560 const void *Decoder) {
561 if (RegNo > 31)
562 return MCDisassembler::Fail;
563
Akira Hatanaka9bf2b562012-07-09 18:46:47 +0000564 unsigned Reg = getReg(Decoder, Mips::FGR32RegClassID, RegNo);
565 Inst.addOperand(MCOperand::CreateReg(Reg));
Akira Hatanaka71928e62012-04-17 18:03:21 +0000566 return MCDisassembler::Success;
567}
568
Akira Hatanaka14e31a22013-08-20 22:58:56 +0000569static DecodeStatus DecodeFGRH32RegisterClass(MCInst &Inst,
570 unsigned RegNo,
571 uint64_t Address,
572 const void *Decoder) {
573 if (RegNo > 31)
574 return MCDisassembler::Fail;
575
576 unsigned Reg = getReg(Decoder, Mips::FGRH32RegClassID, RegNo);
577 Inst.addOperand(MCOperand::CreateReg(Reg));
578 return MCDisassembler::Success;
579}
580
Akira Hatanaka71928e62012-04-17 18:03:21 +0000581static DecodeStatus DecodeCCRRegisterClass(MCInst &Inst,
582 unsigned RegNo,
583 uint64_t Address,
584 const void *Decoder) {
Chad Rosier253777f2013-06-26 22:23:32 +0000585 if (RegNo > 31)
586 return MCDisassembler::Fail;
587 unsigned Reg = getReg(Decoder, Mips::CCRRegClassID, RegNo);
588 Inst.addOperand(MCOperand::CreateReg(Reg));
Akira Hatanaka71928e62012-04-17 18:03:21 +0000589 return MCDisassembler::Success;
590}
591
Akira Hatanaka1fb1b8b2013-07-26 20:13:47 +0000592static DecodeStatus DecodeFCCRegisterClass(MCInst &Inst,
593 unsigned RegNo,
594 uint64_t Address,
595 const void *Decoder) {
596 if (RegNo > 7)
597 return MCDisassembler::Fail;
598 unsigned Reg = getReg(Decoder, Mips::FCCRegClassID, RegNo);
599 Inst.addOperand(MCOperand::CreateReg(Reg));
600 return MCDisassembler::Success;
601}
602
Akira Hatanaka71928e62012-04-17 18:03:21 +0000603static DecodeStatus DecodeMem(MCInst &Inst,
604 unsigned Insn,
605 uint64_t Address,
606 const void *Decoder) {
607 int Offset = SignExtend32<16>(Insn & 0xffff);
Jim Grosbachecaef492012-08-14 19:06:05 +0000608 unsigned Reg = fieldFromInstruction(Insn, 16, 5);
609 unsigned Base = fieldFromInstruction(Insn, 21, 5);
Akira Hatanaka9bf2b562012-07-09 18:46:47 +0000610
Akira Hatanaka13e6ccf2013-08-06 23:08:38 +0000611 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
612 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000613
614 if(Inst.getOpcode() == Mips::SC){
Akira Hatanaka9bf2b562012-07-09 18:46:47 +0000615 Inst.addOperand(MCOperand::CreateReg(Reg));
Akira Hatanaka71928e62012-04-17 18:03:21 +0000616 }
617
Akira Hatanaka9bf2b562012-07-09 18:46:47 +0000618 Inst.addOperand(MCOperand::CreateReg(Reg));
619 Inst.addOperand(MCOperand::CreateReg(Base));
Akira Hatanaka71928e62012-04-17 18:03:21 +0000620 Inst.addOperand(MCOperand::CreateImm(Offset));
621
622 return MCDisassembler::Success;
623}
624
Matheus Almeidafe0bf9f2013-10-21 13:07:13 +0000625static DecodeStatus DecodeMSA128Mem(MCInst &Inst, unsigned Insn,
626 uint64_t Address, const void *Decoder) {
627 int Offset = SignExtend32<10>(fieldFromInstruction(Insn, 16, 10));
628 unsigned Reg = fieldFromInstruction(Insn, 6, 5);
629 unsigned Base = fieldFromInstruction(Insn, 11, 5);
630
631 Reg = getReg(Decoder, Mips::MSA128BRegClassID, Reg);
632 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
633
634 Inst.addOperand(MCOperand::CreateReg(Reg));
635 Inst.addOperand(MCOperand::CreateReg(Base));
Matheus Almeida6b59c442013-12-05 11:06:22 +0000636
637 // The immediate field of an LD/ST instruction is scaled which means it must
638 // be multiplied (when decoding) by the size (in bytes) of the instructions'
639 // data format.
640 // .b - 1 byte
641 // .h - 2 bytes
642 // .w - 4 bytes
643 // .d - 8 bytes
644 switch(Inst.getOpcode())
645 {
646 default:
647 assert (0 && "Unexpected instruction");
648 return MCDisassembler::Fail;
649 break;
650 case Mips::LD_B:
651 case Mips::ST_B:
652 Inst.addOperand(MCOperand::CreateImm(Offset));
653 break;
654 case Mips::LD_H:
655 case Mips::ST_H:
656 Inst.addOperand(MCOperand::CreateImm(Offset << 1));
657 break;
658 case Mips::LD_W:
659 case Mips::ST_W:
660 Inst.addOperand(MCOperand::CreateImm(Offset << 2));
661 break;
662 case Mips::LD_D:
663 case Mips::ST_D:
664 Inst.addOperand(MCOperand::CreateImm(Offset << 3));
665 break;
666 }
Matheus Almeidafe0bf9f2013-10-21 13:07:13 +0000667
668 return MCDisassembler::Success;
669}
670
Vladimir Medicdde3d582013-09-06 12:30:36 +0000671static DecodeStatus DecodeMemMMImm12(MCInst &Inst,
672 unsigned Insn,
673 uint64_t Address,
674 const void *Decoder) {
675 int Offset = SignExtend32<12>(Insn & 0x0fff);
676 unsigned Reg = fieldFromInstruction(Insn, 21, 5);
677 unsigned Base = fieldFromInstruction(Insn, 16, 5);
678
679 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
680 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
681
Zoran Jovanovic285cc282014-02-28 18:22:56 +0000682 if (Inst.getOpcode() == Mips::SC_MM)
683 Inst.addOperand(MCOperand::CreateReg(Reg));
684
Vladimir Medicdde3d582013-09-06 12:30:36 +0000685 Inst.addOperand(MCOperand::CreateReg(Reg));
686 Inst.addOperand(MCOperand::CreateReg(Base));
687 Inst.addOperand(MCOperand::CreateImm(Offset));
688
689 return MCDisassembler::Success;
690}
691
692static DecodeStatus DecodeMemMMImm16(MCInst &Inst,
693 unsigned Insn,
694 uint64_t Address,
695 const void *Decoder) {
696 int Offset = SignExtend32<16>(Insn & 0xffff);
697 unsigned Reg = fieldFromInstruction(Insn, 21, 5);
698 unsigned Base = fieldFromInstruction(Insn, 16, 5);
699
700 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
701 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
702
703 Inst.addOperand(MCOperand::CreateReg(Reg));
704 Inst.addOperand(MCOperand::CreateReg(Base));
705 Inst.addOperand(MCOperand::CreateImm(Offset));
706
707 return MCDisassembler::Success;
708}
709
Akira Hatanaka71928e62012-04-17 18:03:21 +0000710static DecodeStatus DecodeFMem(MCInst &Inst,
711 unsigned Insn,
712 uint64_t Address,
713 const void *Decoder) {
714 int Offset = SignExtend32<16>(Insn & 0xffff);
Jim Grosbachecaef492012-08-14 19:06:05 +0000715 unsigned Reg = fieldFromInstruction(Insn, 16, 5);
716 unsigned Base = fieldFromInstruction(Insn, 21, 5);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000717
Akira Hatanaka9bf2b562012-07-09 18:46:47 +0000718 Reg = getReg(Decoder, Mips::FGR64RegClassID, Reg);
Akira Hatanaka13e6ccf2013-08-06 23:08:38 +0000719 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
Akira Hatanaka9bf2b562012-07-09 18:46:47 +0000720
721 Inst.addOperand(MCOperand::CreateReg(Reg));
722 Inst.addOperand(MCOperand::CreateReg(Base));
Akira Hatanaka71928e62012-04-17 18:03:21 +0000723 Inst.addOperand(MCOperand::CreateImm(Offset));
724
725 return MCDisassembler::Success;
726}
727
728
729static DecodeStatus DecodeHWRegsRegisterClass(MCInst &Inst,
730 unsigned RegNo,
731 uint64_t Address,
732 const void *Decoder) {
733 // Currently only hardware register 29 is supported.
734 if (RegNo != 29)
735 return MCDisassembler::Fail;
736 Inst.addOperand(MCOperand::CreateReg(Mips::HWR29));
737 return MCDisassembler::Success;
738}
739
Akira Hatanaka71928e62012-04-17 18:03:21 +0000740static DecodeStatus DecodeAFGR64RegisterClass(MCInst &Inst,
741 unsigned RegNo,
742 uint64_t Address,
743 const void *Decoder) {
Akira Hatanaka9bf2b562012-07-09 18:46:47 +0000744 if (RegNo > 30 || RegNo %2)
Akira Hatanaka71928e62012-04-17 18:03:21 +0000745 return MCDisassembler::Fail;
746
Akira Hatanaka9bf2b562012-07-09 18:46:47 +0000747 ;
748 unsigned Reg = getReg(Decoder, Mips::AFGR64RegClassID, RegNo /2);
749 Inst.addOperand(MCOperand::CreateReg(Reg));
Akira Hatanaka71928e62012-04-17 18:03:21 +0000750 return MCDisassembler::Success;
751}
752
Akira Hatanaka00fcf2e2013-08-08 21:54:26 +0000753static DecodeStatus DecodeACC64DSPRegisterClass(MCInst &Inst,
754 unsigned RegNo,
755 uint64_t Address,
756 const void *Decoder) {
Akira Hatanakaecabd1a2012-09-27 02:01:10 +0000757 if (RegNo >= 4)
758 return MCDisassembler::Fail;
759
Akira Hatanaka00fcf2e2013-08-08 21:54:26 +0000760 unsigned Reg = getReg(Decoder, Mips::ACC64DSPRegClassID, RegNo);
Akira Hatanakaecabd1a2012-09-27 02:01:10 +0000761 Inst.addOperand(MCOperand::CreateReg(Reg));
762 return MCDisassembler::Success;
763}
764
Akira Hatanaka8002a3f2013-08-14 00:47:08 +0000765static DecodeStatus DecodeHI32DSPRegisterClass(MCInst &Inst,
766 unsigned RegNo,
767 uint64_t Address,
768 const void *Decoder) {
Akira Hatanaka59bfaf72013-04-18 00:52:44 +0000769 if (RegNo >= 4)
770 return MCDisassembler::Fail;
771
Akira Hatanaka8002a3f2013-08-14 00:47:08 +0000772 unsigned Reg = getReg(Decoder, Mips::HI32DSPRegClassID, RegNo);
Akira Hatanaka59bfaf72013-04-18 00:52:44 +0000773 Inst.addOperand(MCOperand::CreateReg(Reg));
774 return MCDisassembler::Success;
775}
776
Akira Hatanaka8002a3f2013-08-14 00:47:08 +0000777static DecodeStatus DecodeLO32DSPRegisterClass(MCInst &Inst,
778 unsigned RegNo,
779 uint64_t Address,
780 const void *Decoder) {
Akira Hatanaka59bfaf72013-04-18 00:52:44 +0000781 if (RegNo >= 4)
782 return MCDisassembler::Fail;
783
Akira Hatanaka8002a3f2013-08-14 00:47:08 +0000784 unsigned Reg = getReg(Decoder, Mips::LO32DSPRegClassID, RegNo);
Akira Hatanaka59bfaf72013-04-18 00:52:44 +0000785 Inst.addOperand(MCOperand::CreateReg(Reg));
786 return MCDisassembler::Success;
787}
788
Jack Carter3eb663b2013-09-26 00:09:46 +0000789static DecodeStatus DecodeMSA128BRegisterClass(MCInst &Inst,
790 unsigned RegNo,
791 uint64_t Address,
792 const void *Decoder) {
793 if (RegNo > 31)
794 return MCDisassembler::Fail;
795
796 unsigned Reg = getReg(Decoder, Mips::MSA128BRegClassID, RegNo);
797 Inst.addOperand(MCOperand::CreateReg(Reg));
798 return MCDisassembler::Success;
799}
800
Jack Carter5dc8ac92013-09-25 23:50:44 +0000801static DecodeStatus DecodeMSA128HRegisterClass(MCInst &Inst,
802 unsigned RegNo,
803 uint64_t Address,
804 const void *Decoder) {
805 if (RegNo > 31)
806 return MCDisassembler::Fail;
807
808 unsigned Reg = getReg(Decoder, Mips::MSA128HRegClassID, RegNo);
809 Inst.addOperand(MCOperand::CreateReg(Reg));
810 return MCDisassembler::Success;
811}
812
813static DecodeStatus DecodeMSA128WRegisterClass(MCInst &Inst,
814 unsigned RegNo,
815 uint64_t Address,
816 const void *Decoder) {
817 if (RegNo > 31)
818 return MCDisassembler::Fail;
819
820 unsigned Reg = getReg(Decoder, Mips::MSA128WRegClassID, RegNo);
821 Inst.addOperand(MCOperand::CreateReg(Reg));
822 return MCDisassembler::Success;
823}
824
825static DecodeStatus DecodeMSA128DRegisterClass(MCInst &Inst,
826 unsigned RegNo,
827 uint64_t Address,
828 const void *Decoder) {
829 if (RegNo > 31)
830 return MCDisassembler::Fail;
831
832 unsigned Reg = getReg(Decoder, Mips::MSA128DRegClassID, RegNo);
833 Inst.addOperand(MCOperand::CreateReg(Reg));
834 return MCDisassembler::Success;
835}
836
Matheus Almeidaa591fdc2013-10-21 12:26:50 +0000837static DecodeStatus DecodeMSACtrlRegisterClass(MCInst &Inst,
838 unsigned RegNo,
839 uint64_t Address,
840 const void *Decoder) {
841 if (RegNo > 7)
842 return MCDisassembler::Fail;
843
844 unsigned Reg = getReg(Decoder, Mips::MSACtrlRegClassID, RegNo);
845 Inst.addOperand(MCOperand::CreateReg(Reg));
846 return MCDisassembler::Success;
847}
848
Akira Hatanaka71928e62012-04-17 18:03:21 +0000849static DecodeStatus DecodeBranchTarget(MCInst &Inst,
850 unsigned Offset,
851 uint64_t Address,
852 const void *Decoder) {
853 unsigned BranchOffset = Offset & 0xffff;
854 BranchOffset = SignExtend32<18>(BranchOffset << 2) + 4;
855 Inst.addOperand(MCOperand::CreateImm(BranchOffset));
856 return MCDisassembler::Success;
857}
858
Akira Hatanaka71928e62012-04-17 18:03:21 +0000859static DecodeStatus DecodeJumpTarget(MCInst &Inst,
860 unsigned Insn,
861 uint64_t Address,
862 const void *Decoder) {
863
Jim Grosbachecaef492012-08-14 19:06:05 +0000864 unsigned JumpOffset = fieldFromInstruction(Insn, 0, 26) << 2;
Akira Hatanaka71928e62012-04-17 18:03:21 +0000865 Inst.addOperand(MCOperand::CreateImm(JumpOffset));
866 return MCDisassembler::Success;
867}
868
Zoran Jovanovic3c8869d2014-05-16 11:03:45 +0000869static DecodeStatus DecodeBranchTarget21(MCInst &Inst,
870 unsigned Offset,
871 uint64_t Address,
872 const void *Decoder) {
873 int32_t BranchOffset = SignExtend32<21>(Offset) << 2;
874
875 Inst.addOperand(MCOperand::CreateImm(BranchOffset));
876 return MCDisassembler::Success;
877}
878
879static DecodeStatus DecodeBranchTarget26(MCInst &Inst,
880 unsigned Offset,
881 uint64_t Address,
882 const void *Decoder) {
883 int32_t BranchOffset = SignExtend32<26>(Offset) << 2;
884
885 Inst.addOperand(MCOperand::CreateImm(BranchOffset));
886 return MCDisassembler::Success;
887}
888
Zoran Jovanovic8a80aa72013-11-04 14:53:22 +0000889static DecodeStatus DecodeBranchTargetMM(MCInst &Inst,
890 unsigned Offset,
891 uint64_t Address,
892 const void *Decoder) {
893 unsigned BranchOffset = Offset & 0xffff;
894 BranchOffset = SignExtend32<18>(BranchOffset << 1);
895 Inst.addOperand(MCOperand::CreateImm(BranchOffset));
896 return MCDisassembler::Success;
897}
898
Zoran Jovanovic507e0842013-10-29 16:38:59 +0000899static DecodeStatus DecodeJumpTargetMM(MCInst &Inst,
900 unsigned Insn,
901 uint64_t Address,
902 const void *Decoder) {
903 unsigned JumpOffset = fieldFromInstruction(Insn, 0, 26) << 1;
904 Inst.addOperand(MCOperand::CreateImm(JumpOffset));
905 return MCDisassembler::Success;
906}
Akira Hatanaka71928e62012-04-17 18:03:21 +0000907
908static DecodeStatus DecodeSimm16(MCInst &Inst,
909 unsigned Insn,
910 uint64_t Address,
911 const void *Decoder) {
912 Inst.addOperand(MCOperand::CreateImm(SignExtend32<16>(Insn)));
913 return MCDisassembler::Success;
914}
915
Matheus Almeida779c5932013-11-18 12:32:49 +0000916static DecodeStatus DecodeLSAImm(MCInst &Inst,
917 unsigned Insn,
918 uint64_t Address,
919 const void *Decoder) {
920 // We add one to the immediate field as it was encoded as 'imm - 1'.
921 Inst.addOperand(MCOperand::CreateImm(Insn + 1));
922 return MCDisassembler::Success;
923}
924
Akira Hatanaka71928e62012-04-17 18:03:21 +0000925static DecodeStatus DecodeInsSize(MCInst &Inst,
926 unsigned Insn,
927 uint64_t Address,
928 const void *Decoder) {
929 // First we need to grab the pos(lsb) from MCInst.
930 int Pos = Inst.getOperand(2).getImm();
931 int Size = (int) Insn - Pos + 1;
932 Inst.addOperand(MCOperand::CreateImm(SignExtend32<16>(Size)));
933 return MCDisassembler::Success;
934}
935
936static DecodeStatus DecodeExtSize(MCInst &Inst,
937 unsigned Insn,
938 uint64_t Address,
939 const void *Decoder) {
940 int Size = (int) Insn + 1;
941 Inst.addOperand(MCOperand::CreateImm(SignExtend32<16>(Size)));
942 return MCDisassembler::Success;
943}
Daniel Sandersb59e1a42014-05-15 10:45:58 +0000944
945static DecodeStatus DecodeSimm19Lsl2(MCInst &Inst, unsigned Insn,
946 uint64_t Address, const void *Decoder) {
947 Inst.addOperand(MCOperand::CreateImm(SignExtend32<19>(Insn) << 2));
948 return MCDisassembler::Success;
949}