blob: 958712602b4b89a11e3076e3b2db20808aeb095d [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 Jovanovic8a80aa72013-11-04 14:53:22 +0000208// DecodeBranchTargetMM - Decode microMIPS branch offset, which is
209// shifted left by 1 bit.
210static DecodeStatus DecodeBranchTargetMM(MCInst &Inst,
211 unsigned Offset,
212 uint64_t Address,
213 const void *Decoder);
214
Zoran Jovanovic507e0842013-10-29 16:38:59 +0000215// DecodeJumpTargetMM - Decode microMIPS jump target, which is
216// shifted left by 1 bit.
217static DecodeStatus DecodeJumpTargetMM(MCInst &Inst,
218 unsigned Insn,
219 uint64_t Address,
220 const void *Decoder);
221
Akira Hatanaka71928e62012-04-17 18:03:21 +0000222static DecodeStatus DecodeMem(MCInst &Inst,
223 unsigned Insn,
224 uint64_t Address,
225 const void *Decoder);
226
Matheus Almeidafe0bf9f2013-10-21 13:07:13 +0000227static DecodeStatus DecodeMSA128Mem(MCInst &Inst, unsigned Insn,
228 uint64_t Address, const void *Decoder);
229
Vladimir Medicdde3d582013-09-06 12:30:36 +0000230static DecodeStatus DecodeMemMMImm12(MCInst &Inst,
231 unsigned Insn,
232 uint64_t Address,
233 const void *Decoder);
234
235static DecodeStatus DecodeMemMMImm16(MCInst &Inst,
236 unsigned Insn,
237 uint64_t Address,
238 const void *Decoder);
239
Akira Hatanaka71928e62012-04-17 18:03:21 +0000240static DecodeStatus DecodeFMem(MCInst &Inst, unsigned Insn,
241 uint64_t Address,
242 const void *Decoder);
243
244static DecodeStatus DecodeSimm16(MCInst &Inst,
245 unsigned Insn,
246 uint64_t Address,
247 const void *Decoder);
248
Matheus Almeida779c5932013-11-18 12:32:49 +0000249// Decode the immediate field of an LSA instruction which
250// is off by one.
251static DecodeStatus DecodeLSAImm(MCInst &Inst,
252 unsigned Insn,
253 uint64_t Address,
254 const void *Decoder);
255
Akira Hatanaka71928e62012-04-17 18:03:21 +0000256static DecodeStatus DecodeInsSize(MCInst &Inst,
257 unsigned Insn,
258 uint64_t Address,
259 const void *Decoder);
260
261static DecodeStatus DecodeExtSize(MCInst &Inst,
262 unsigned Insn,
263 uint64_t Address,
264 const void *Decoder);
265
Daniel Sandersb59e1a42014-05-15 10:45:58 +0000266static DecodeStatus DecodeSimm19Lsl2(MCInst &Inst, unsigned Insn,
267 uint64_t Address, const void *Decoder);
268
Daniel Sandersb50ccf82014-04-01 10:35:28 +0000269/// INSVE_[BHWD] have an implicit operand that the generated decoder doesn't
270/// handle.
271template <typename InsnType>
272static DecodeStatus DecodeINSVE_DF(MCInst &MI, InsnType insn, uint64_t Address,
273 const void *Decoder);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000274namespace llvm {
275extern Target TheMipselTarget, TheMipsTarget, TheMips64Target,
276 TheMips64elTarget;
277}
278
279static MCDisassembler *createMipsDisassembler(
280 const Target &T,
Lang Hamesa1bc0f52014-04-15 04:40:56 +0000281 const MCSubtargetInfo &STI,
282 MCContext &Ctx) {
283 return new MipsDisassembler(STI, Ctx, true);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000284}
285
286static MCDisassembler *createMipselDisassembler(
287 const Target &T,
Lang Hamesa1bc0f52014-04-15 04:40:56 +0000288 const MCSubtargetInfo &STI,
289 MCContext &Ctx) {
290 return new MipsDisassembler(STI, Ctx, false);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000291}
292
293static MCDisassembler *createMips64Disassembler(
294 const Target &T,
Lang Hamesa1bc0f52014-04-15 04:40:56 +0000295 const MCSubtargetInfo &STI,
296 MCContext &Ctx) {
297 return new Mips64Disassembler(STI, Ctx, true);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000298}
299
300static MCDisassembler *createMips64elDisassembler(
301 const Target &T,
Lang Hamesa1bc0f52014-04-15 04:40:56 +0000302 const MCSubtargetInfo &STI,
303 MCContext &Ctx) {
304 return new Mips64Disassembler(STI, Ctx, false);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000305}
306
307extern "C" void LLVMInitializeMipsDisassembler() {
308 // Register the disassembler.
309 TargetRegistry::RegisterMCDisassembler(TheMipsTarget,
310 createMipsDisassembler);
311 TargetRegistry::RegisterMCDisassembler(TheMipselTarget,
312 createMipselDisassembler);
313 TargetRegistry::RegisterMCDisassembler(TheMips64Target,
314 createMips64Disassembler);
315 TargetRegistry::RegisterMCDisassembler(TheMips64elTarget,
316 createMips64elDisassembler);
317}
318
Akira Hatanaka71928e62012-04-17 18:03:21 +0000319#include "MipsGenDisassemblerTables.inc"
320
Daniel Sandersb50ccf82014-04-01 10:35:28 +0000321template <typename InsnType>
322static DecodeStatus DecodeINSVE_DF(MCInst &MI, InsnType insn, uint64_t Address,
323 const void *Decoder) {
324 typedef DecodeStatus (*DecodeFN)(MCInst &, unsigned, uint64_t, const void *);
325 // The size of the n field depends on the element size
326 // The register class also depends on this.
327 InsnType tmp = fieldFromInstruction(insn, 17, 5);
328 unsigned NSize = 0;
329 DecodeFN RegDecoder = nullptr;
330 if ((tmp & 0x18) == 0x00) { // INSVE_B
331 NSize = 4;
332 RegDecoder = DecodeMSA128BRegisterClass;
333 } else if ((tmp & 0x1c) == 0x10) { // INSVE_H
334 NSize = 3;
335 RegDecoder = DecodeMSA128HRegisterClass;
336 } else if ((tmp & 0x1e) == 0x18) { // INSVE_W
337 NSize = 2;
338 RegDecoder = DecodeMSA128WRegisterClass;
339 } else if ((tmp & 0x1f) == 0x1c) { // INSVE_D
340 NSize = 1;
341 RegDecoder = DecodeMSA128DRegisterClass;
342 } else
343 llvm_unreachable("Invalid encoding");
344
345 assert(NSize != 0 && RegDecoder != nullptr);
346
347 // $wd
348 tmp = fieldFromInstruction(insn, 6, 5);
349 if (RegDecoder(MI, tmp, Address, Decoder) == MCDisassembler::Fail)
350 return MCDisassembler::Fail;
351 // $wd_in
352 if (RegDecoder(MI, tmp, Address, Decoder) == MCDisassembler::Fail)
353 return MCDisassembler::Fail;
354 // $n
355 tmp = fieldFromInstruction(insn, 16, NSize);
356 MI.addOperand(MCOperand::CreateImm(tmp));
357 // $ws
358 tmp = fieldFromInstruction(insn, 11, 5);
359 if (RegDecoder(MI, tmp, Address, Decoder) == MCDisassembler::Fail)
360 return MCDisassembler::Fail;
361 // $n2
362 MI.addOperand(MCOperand::CreateImm(0));
363
364 return MCDisassembler::Success;
365}
366
Akira Hatanaka71928e62012-04-17 18:03:21 +0000367 /// readInstruction - read four bytes from the MemoryObject
368 /// and return 32 bit word sorted according to the given endianess
369static DecodeStatus readInstruction32(const MemoryObject &region,
370 uint64_t address,
371 uint64_t &size,
372 uint32_t &insn,
Vladimir Medicdde3d582013-09-06 12:30:36 +0000373 bool isBigEndian,
374 bool IsMicroMips) {
Akira Hatanaka71928e62012-04-17 18:03:21 +0000375 uint8_t Bytes[4];
376
377 // We want to read exactly 4 Bytes of data.
Benjamin Kramer534d3a42013-05-24 10:54:58 +0000378 if (region.readBytes(address, 4, Bytes) == -1) {
Akira Hatanaka71928e62012-04-17 18:03:21 +0000379 size = 0;
380 return MCDisassembler::Fail;
381 }
382
383 if (isBigEndian) {
384 // Encoded as a big-endian 32-bit word in the stream.
385 insn = (Bytes[3] << 0) |
386 (Bytes[2] << 8) |
387 (Bytes[1] << 16) |
388 (Bytes[0] << 24);
389 }
390 else {
391 // Encoded as a small-endian 32-bit word in the stream.
Vladimir Medicdde3d582013-09-06 12:30:36 +0000392 // Little-endian byte ordering:
393 // mips32r2: 4 | 3 | 2 | 1
394 // microMIPS: 2 | 1 | 4 | 3
395 if (IsMicroMips) {
396 insn = (Bytes[2] << 0) |
397 (Bytes[3] << 8) |
398 (Bytes[0] << 16) |
399 (Bytes[1] << 24);
400 } else {
401 insn = (Bytes[0] << 0) |
402 (Bytes[1] << 8) |
403 (Bytes[2] << 16) |
404 (Bytes[3] << 24);
405 }
Akira Hatanaka71928e62012-04-17 18:03:21 +0000406 }
407
408 return MCDisassembler::Success;
409}
410
411DecodeStatus
412MipsDisassembler::getInstruction(MCInst &instr,
413 uint64_t &Size,
414 const MemoryObject &Region,
415 uint64_t Address,
416 raw_ostream &vStream,
417 raw_ostream &cStream) const {
418 uint32_t Insn;
419
420 DecodeStatus Result = readInstruction32(Region, Address, Size,
Vladimir Medicdde3d582013-09-06 12:30:36 +0000421 Insn, isBigEndian, IsMicroMips);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000422 if (Result == MCDisassembler::Fail)
423 return MCDisassembler::Fail;
424
Vladimir Medicdde3d582013-09-06 12:30:36 +0000425 if (IsMicroMips) {
426 // Calling the auto-generated decoder function.
427 Result = decodeInstruction(DecoderTableMicroMips32, instr, Insn, Address,
428 this, STI);
429 if (Result != MCDisassembler::Fail) {
430 Size = 4;
431 return Result;
432 }
433 return MCDisassembler::Fail;
434 }
435
Akira Hatanaka71928e62012-04-17 18:03:21 +0000436 // Calling the auto-generated decoder function.
Jim Grosbachecaef492012-08-14 19:06:05 +0000437 Result = decodeInstruction(DecoderTableMips32, instr, Insn, Address,
438 this, STI);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000439 if (Result != MCDisassembler::Fail) {
440 Size = 4;
441 return Result;
442 }
443
444 return MCDisassembler::Fail;
445}
446
447DecodeStatus
448Mips64Disassembler::getInstruction(MCInst &instr,
449 uint64_t &Size,
450 const MemoryObject &Region,
451 uint64_t Address,
452 raw_ostream &vStream,
453 raw_ostream &cStream) const {
454 uint32_t Insn;
455
456 DecodeStatus Result = readInstruction32(Region, Address, Size,
Vladimir Medicdde3d582013-09-06 12:30:36 +0000457 Insn, isBigEndian, false);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000458 if (Result == MCDisassembler::Fail)
459 return MCDisassembler::Fail;
460
461 // Calling the auto-generated decoder function.
Jim Grosbachecaef492012-08-14 19:06:05 +0000462 Result = decodeInstruction(DecoderTableMips6432, instr, Insn, Address,
463 this, STI);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000464 if (Result != MCDisassembler::Fail) {
465 Size = 4;
466 return Result;
467 }
468 // If we fail to decode in Mips64 decoder space we can try in Mips32
Jim Grosbachecaef492012-08-14 19:06:05 +0000469 Result = decodeInstruction(DecoderTableMips32, instr, Insn, Address,
470 this, STI);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000471 if (Result != MCDisassembler::Fail) {
472 Size = 4;
473 return Result;
474 }
475
476 return MCDisassembler::Fail;
477}
478
Akira Hatanaka9bf2b562012-07-09 18:46:47 +0000479static unsigned getReg(const void *D, unsigned RC, unsigned RegNo) {
480 const MipsDisassemblerBase *Dis = static_cast<const MipsDisassemblerBase*>(D);
Lang Hamesa1bc0f52014-04-15 04:40:56 +0000481 const MCRegisterInfo *RegInfo = Dis->getContext().getRegisterInfo();
482 return *(RegInfo->getRegClass(RC).begin() + RegNo);
Akira Hatanaka9bf2b562012-07-09 18:46:47 +0000483}
484
Reed Kotlerec8a5492013-02-14 03:05:25 +0000485static DecodeStatus DecodeCPU16RegsRegisterClass(MCInst &Inst,
486 unsigned RegNo,
487 uint64_t Address,
488 const void *Decoder) {
489
490 return MCDisassembler::Fail;
491
492}
493
Akira Hatanaka13e6ccf2013-08-06 23:08:38 +0000494static DecodeStatus DecodeGPR64RegisterClass(MCInst &Inst,
495 unsigned RegNo,
496 uint64_t Address,
497 const void *Decoder) {
Akira Hatanaka71928e62012-04-17 18:03:21 +0000498
499 if (RegNo > 31)
500 return MCDisassembler::Fail;
501
Akira Hatanaka13e6ccf2013-08-06 23:08:38 +0000502 unsigned Reg = getReg(Decoder, Mips::GPR64RegClassID, RegNo);
Akira Hatanaka9bf2b562012-07-09 18:46:47 +0000503 Inst.addOperand(MCOperand::CreateReg(Reg));
Akira Hatanaka71928e62012-04-17 18:03:21 +0000504 return MCDisassembler::Success;
505}
506
Akira Hatanaka13e6ccf2013-08-06 23:08:38 +0000507static DecodeStatus DecodeGPR32RegisterClass(MCInst &Inst,
508 unsigned RegNo,
509 uint64_t Address,
510 const void *Decoder) {
Akira Hatanaka71928e62012-04-17 18:03:21 +0000511 if (RegNo > 31)
512 return MCDisassembler::Fail;
Akira Hatanaka13e6ccf2013-08-06 23:08:38 +0000513 unsigned Reg = getReg(Decoder, Mips::GPR32RegClassID, RegNo);
Akira Hatanaka9bf2b562012-07-09 18:46:47 +0000514 Inst.addOperand(MCOperand::CreateReg(Reg));
Akira Hatanaka71928e62012-04-17 18:03:21 +0000515 return MCDisassembler::Success;
516}
517
Akira Hatanaka9bfa2e22013-08-28 00:55:15 +0000518static DecodeStatus DecodePtrRegisterClass(MCInst &Inst,
519 unsigned RegNo,
520 uint64_t Address,
521 const void *Decoder) {
522 if (static_cast<const MipsDisassembler *>(Decoder)->isN64())
523 return DecodeGPR64RegisterClass(Inst, RegNo, Address, Decoder);
524
525 return DecodeGPR32RegisterClass(Inst, RegNo, Address, Decoder);
526}
527
Akira Hatanaka654655f2013-08-14 00:53:38 +0000528static DecodeStatus DecodeDSPRRegisterClass(MCInst &Inst,
529 unsigned RegNo,
530 uint64_t Address,
531 const void *Decoder) {
Akira Hatanaka13e6ccf2013-08-06 23:08:38 +0000532 return DecodeGPR32RegisterClass(Inst, RegNo, Address, Decoder);
Akira Hatanakaecabd1a2012-09-27 02:01:10 +0000533}
534
Akira Hatanaka71928e62012-04-17 18:03:21 +0000535static DecodeStatus DecodeFGR64RegisterClass(MCInst &Inst,
536 unsigned RegNo,
537 uint64_t Address,
538 const void *Decoder) {
539 if (RegNo > 31)
540 return MCDisassembler::Fail;
541
Akira Hatanaka9bf2b562012-07-09 18:46:47 +0000542 unsigned Reg = getReg(Decoder, Mips::FGR64RegClassID, RegNo);
543 Inst.addOperand(MCOperand::CreateReg(Reg));
Akira Hatanaka71928e62012-04-17 18:03:21 +0000544 return MCDisassembler::Success;
545}
546
547static DecodeStatus DecodeFGR32RegisterClass(MCInst &Inst,
548 unsigned RegNo,
549 uint64_t Address,
550 const void *Decoder) {
551 if (RegNo > 31)
552 return MCDisassembler::Fail;
553
Akira Hatanaka9bf2b562012-07-09 18:46:47 +0000554 unsigned Reg = getReg(Decoder, Mips::FGR32RegClassID, RegNo);
555 Inst.addOperand(MCOperand::CreateReg(Reg));
Akira Hatanaka71928e62012-04-17 18:03:21 +0000556 return MCDisassembler::Success;
557}
558
Akira Hatanaka14e31a22013-08-20 22:58:56 +0000559static DecodeStatus DecodeFGRH32RegisterClass(MCInst &Inst,
560 unsigned RegNo,
561 uint64_t Address,
562 const void *Decoder) {
563 if (RegNo > 31)
564 return MCDisassembler::Fail;
565
566 unsigned Reg = getReg(Decoder, Mips::FGRH32RegClassID, RegNo);
567 Inst.addOperand(MCOperand::CreateReg(Reg));
568 return MCDisassembler::Success;
569}
570
Akira Hatanaka71928e62012-04-17 18:03:21 +0000571static DecodeStatus DecodeCCRRegisterClass(MCInst &Inst,
572 unsigned RegNo,
573 uint64_t Address,
574 const void *Decoder) {
Chad Rosier253777f2013-06-26 22:23:32 +0000575 if (RegNo > 31)
576 return MCDisassembler::Fail;
577 unsigned Reg = getReg(Decoder, Mips::CCRRegClassID, RegNo);
578 Inst.addOperand(MCOperand::CreateReg(Reg));
Akira Hatanaka71928e62012-04-17 18:03:21 +0000579 return MCDisassembler::Success;
580}
581
Akira Hatanaka1fb1b8b2013-07-26 20:13:47 +0000582static DecodeStatus DecodeFCCRegisterClass(MCInst &Inst,
583 unsigned RegNo,
584 uint64_t Address,
585 const void *Decoder) {
586 if (RegNo > 7)
587 return MCDisassembler::Fail;
588 unsigned Reg = getReg(Decoder, Mips::FCCRegClassID, RegNo);
589 Inst.addOperand(MCOperand::CreateReg(Reg));
590 return MCDisassembler::Success;
591}
592
Akira Hatanaka71928e62012-04-17 18:03:21 +0000593static DecodeStatus DecodeMem(MCInst &Inst,
594 unsigned Insn,
595 uint64_t Address,
596 const void *Decoder) {
597 int Offset = SignExtend32<16>(Insn & 0xffff);
Jim Grosbachecaef492012-08-14 19:06:05 +0000598 unsigned Reg = fieldFromInstruction(Insn, 16, 5);
599 unsigned Base = fieldFromInstruction(Insn, 21, 5);
Akira Hatanaka9bf2b562012-07-09 18:46:47 +0000600
Akira Hatanaka13e6ccf2013-08-06 23:08:38 +0000601 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
602 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000603
604 if(Inst.getOpcode() == Mips::SC){
Akira Hatanaka9bf2b562012-07-09 18:46:47 +0000605 Inst.addOperand(MCOperand::CreateReg(Reg));
Akira Hatanaka71928e62012-04-17 18:03:21 +0000606 }
607
Akira Hatanaka9bf2b562012-07-09 18:46:47 +0000608 Inst.addOperand(MCOperand::CreateReg(Reg));
609 Inst.addOperand(MCOperand::CreateReg(Base));
Akira Hatanaka71928e62012-04-17 18:03:21 +0000610 Inst.addOperand(MCOperand::CreateImm(Offset));
611
612 return MCDisassembler::Success;
613}
614
Matheus Almeidafe0bf9f2013-10-21 13:07:13 +0000615static DecodeStatus DecodeMSA128Mem(MCInst &Inst, unsigned Insn,
616 uint64_t Address, const void *Decoder) {
617 int Offset = SignExtend32<10>(fieldFromInstruction(Insn, 16, 10));
618 unsigned Reg = fieldFromInstruction(Insn, 6, 5);
619 unsigned Base = fieldFromInstruction(Insn, 11, 5);
620
621 Reg = getReg(Decoder, Mips::MSA128BRegClassID, Reg);
622 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
623
624 Inst.addOperand(MCOperand::CreateReg(Reg));
625 Inst.addOperand(MCOperand::CreateReg(Base));
Matheus Almeida6b59c442013-12-05 11:06:22 +0000626
627 // The immediate field of an LD/ST instruction is scaled which means it must
628 // be multiplied (when decoding) by the size (in bytes) of the instructions'
629 // data format.
630 // .b - 1 byte
631 // .h - 2 bytes
632 // .w - 4 bytes
633 // .d - 8 bytes
634 switch(Inst.getOpcode())
635 {
636 default:
637 assert (0 && "Unexpected instruction");
638 return MCDisassembler::Fail;
639 break;
640 case Mips::LD_B:
641 case Mips::ST_B:
642 Inst.addOperand(MCOperand::CreateImm(Offset));
643 break;
644 case Mips::LD_H:
645 case Mips::ST_H:
646 Inst.addOperand(MCOperand::CreateImm(Offset << 1));
647 break;
648 case Mips::LD_W:
649 case Mips::ST_W:
650 Inst.addOperand(MCOperand::CreateImm(Offset << 2));
651 break;
652 case Mips::LD_D:
653 case Mips::ST_D:
654 Inst.addOperand(MCOperand::CreateImm(Offset << 3));
655 break;
656 }
Matheus Almeidafe0bf9f2013-10-21 13:07:13 +0000657
658 return MCDisassembler::Success;
659}
660
Vladimir Medicdde3d582013-09-06 12:30:36 +0000661static DecodeStatus DecodeMemMMImm12(MCInst &Inst,
662 unsigned Insn,
663 uint64_t Address,
664 const void *Decoder) {
665 int Offset = SignExtend32<12>(Insn & 0x0fff);
666 unsigned Reg = fieldFromInstruction(Insn, 21, 5);
667 unsigned Base = fieldFromInstruction(Insn, 16, 5);
668
669 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
670 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
671
Zoran Jovanovic285cc282014-02-28 18:22:56 +0000672 if (Inst.getOpcode() == Mips::SC_MM)
673 Inst.addOperand(MCOperand::CreateReg(Reg));
674
Vladimir Medicdde3d582013-09-06 12:30:36 +0000675 Inst.addOperand(MCOperand::CreateReg(Reg));
676 Inst.addOperand(MCOperand::CreateReg(Base));
677 Inst.addOperand(MCOperand::CreateImm(Offset));
678
679 return MCDisassembler::Success;
680}
681
682static DecodeStatus DecodeMemMMImm16(MCInst &Inst,
683 unsigned Insn,
684 uint64_t Address,
685 const void *Decoder) {
686 int Offset = SignExtend32<16>(Insn & 0xffff);
687 unsigned Reg = fieldFromInstruction(Insn, 21, 5);
688 unsigned Base = fieldFromInstruction(Insn, 16, 5);
689
690 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
691 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
692
693 Inst.addOperand(MCOperand::CreateReg(Reg));
694 Inst.addOperand(MCOperand::CreateReg(Base));
695 Inst.addOperand(MCOperand::CreateImm(Offset));
696
697 return MCDisassembler::Success;
698}
699
Akira Hatanaka71928e62012-04-17 18:03:21 +0000700static DecodeStatus DecodeFMem(MCInst &Inst,
701 unsigned Insn,
702 uint64_t Address,
703 const void *Decoder) {
704 int Offset = SignExtend32<16>(Insn & 0xffff);
Jim Grosbachecaef492012-08-14 19:06:05 +0000705 unsigned Reg = fieldFromInstruction(Insn, 16, 5);
706 unsigned Base = fieldFromInstruction(Insn, 21, 5);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000707
Akira Hatanaka9bf2b562012-07-09 18:46:47 +0000708 Reg = getReg(Decoder, Mips::FGR64RegClassID, Reg);
Akira Hatanaka13e6ccf2013-08-06 23:08:38 +0000709 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
Akira Hatanaka9bf2b562012-07-09 18:46:47 +0000710
711 Inst.addOperand(MCOperand::CreateReg(Reg));
712 Inst.addOperand(MCOperand::CreateReg(Base));
Akira Hatanaka71928e62012-04-17 18:03:21 +0000713 Inst.addOperand(MCOperand::CreateImm(Offset));
714
715 return MCDisassembler::Success;
716}
717
718
719static DecodeStatus DecodeHWRegsRegisterClass(MCInst &Inst,
720 unsigned RegNo,
721 uint64_t Address,
722 const void *Decoder) {
723 // Currently only hardware register 29 is supported.
724 if (RegNo != 29)
725 return MCDisassembler::Fail;
726 Inst.addOperand(MCOperand::CreateReg(Mips::HWR29));
727 return MCDisassembler::Success;
728}
729
Akira Hatanaka71928e62012-04-17 18:03:21 +0000730static DecodeStatus DecodeAFGR64RegisterClass(MCInst &Inst,
731 unsigned RegNo,
732 uint64_t Address,
733 const void *Decoder) {
Akira Hatanaka9bf2b562012-07-09 18:46:47 +0000734 if (RegNo > 30 || RegNo %2)
Akira Hatanaka71928e62012-04-17 18:03:21 +0000735 return MCDisassembler::Fail;
736
Akira Hatanaka9bf2b562012-07-09 18:46:47 +0000737 ;
738 unsigned Reg = getReg(Decoder, Mips::AFGR64RegClassID, RegNo /2);
739 Inst.addOperand(MCOperand::CreateReg(Reg));
Akira Hatanaka71928e62012-04-17 18:03:21 +0000740 return MCDisassembler::Success;
741}
742
Akira Hatanaka00fcf2e2013-08-08 21:54:26 +0000743static DecodeStatus DecodeACC64DSPRegisterClass(MCInst &Inst,
744 unsigned RegNo,
745 uint64_t Address,
746 const void *Decoder) {
Akira Hatanakaecabd1a2012-09-27 02:01:10 +0000747 if (RegNo >= 4)
748 return MCDisassembler::Fail;
749
Akira Hatanaka00fcf2e2013-08-08 21:54:26 +0000750 unsigned Reg = getReg(Decoder, Mips::ACC64DSPRegClassID, RegNo);
Akira Hatanakaecabd1a2012-09-27 02:01:10 +0000751 Inst.addOperand(MCOperand::CreateReg(Reg));
752 return MCDisassembler::Success;
753}
754
Akira Hatanaka8002a3f2013-08-14 00:47:08 +0000755static DecodeStatus DecodeHI32DSPRegisterClass(MCInst &Inst,
756 unsigned RegNo,
757 uint64_t Address,
758 const void *Decoder) {
Akira Hatanaka59bfaf72013-04-18 00:52:44 +0000759 if (RegNo >= 4)
760 return MCDisassembler::Fail;
761
Akira Hatanaka8002a3f2013-08-14 00:47:08 +0000762 unsigned Reg = getReg(Decoder, Mips::HI32DSPRegClassID, RegNo);
Akira Hatanaka59bfaf72013-04-18 00:52:44 +0000763 Inst.addOperand(MCOperand::CreateReg(Reg));
764 return MCDisassembler::Success;
765}
766
Akira Hatanaka8002a3f2013-08-14 00:47:08 +0000767static DecodeStatus DecodeLO32DSPRegisterClass(MCInst &Inst,
768 unsigned RegNo,
769 uint64_t Address,
770 const void *Decoder) {
Akira Hatanaka59bfaf72013-04-18 00:52:44 +0000771 if (RegNo >= 4)
772 return MCDisassembler::Fail;
773
Akira Hatanaka8002a3f2013-08-14 00:47:08 +0000774 unsigned Reg = getReg(Decoder, Mips::LO32DSPRegClassID, RegNo);
Akira Hatanaka59bfaf72013-04-18 00:52:44 +0000775 Inst.addOperand(MCOperand::CreateReg(Reg));
776 return MCDisassembler::Success;
777}
778
Jack Carter3eb663b2013-09-26 00:09:46 +0000779static DecodeStatus DecodeMSA128BRegisterClass(MCInst &Inst,
780 unsigned RegNo,
781 uint64_t Address,
782 const void *Decoder) {
783 if (RegNo > 31)
784 return MCDisassembler::Fail;
785
786 unsigned Reg = getReg(Decoder, Mips::MSA128BRegClassID, RegNo);
787 Inst.addOperand(MCOperand::CreateReg(Reg));
788 return MCDisassembler::Success;
789}
790
Jack Carter5dc8ac92013-09-25 23:50:44 +0000791static DecodeStatus DecodeMSA128HRegisterClass(MCInst &Inst,
792 unsigned RegNo,
793 uint64_t Address,
794 const void *Decoder) {
795 if (RegNo > 31)
796 return MCDisassembler::Fail;
797
798 unsigned Reg = getReg(Decoder, Mips::MSA128HRegClassID, RegNo);
799 Inst.addOperand(MCOperand::CreateReg(Reg));
800 return MCDisassembler::Success;
801}
802
803static DecodeStatus DecodeMSA128WRegisterClass(MCInst &Inst,
804 unsigned RegNo,
805 uint64_t Address,
806 const void *Decoder) {
807 if (RegNo > 31)
808 return MCDisassembler::Fail;
809
810 unsigned Reg = getReg(Decoder, Mips::MSA128WRegClassID, RegNo);
811 Inst.addOperand(MCOperand::CreateReg(Reg));
812 return MCDisassembler::Success;
813}
814
815static DecodeStatus DecodeMSA128DRegisterClass(MCInst &Inst,
816 unsigned RegNo,
817 uint64_t Address,
818 const void *Decoder) {
819 if (RegNo > 31)
820 return MCDisassembler::Fail;
821
822 unsigned Reg = getReg(Decoder, Mips::MSA128DRegClassID, RegNo);
823 Inst.addOperand(MCOperand::CreateReg(Reg));
824 return MCDisassembler::Success;
825}
826
Matheus Almeidaa591fdc2013-10-21 12:26:50 +0000827static DecodeStatus DecodeMSACtrlRegisterClass(MCInst &Inst,
828 unsigned RegNo,
829 uint64_t Address,
830 const void *Decoder) {
831 if (RegNo > 7)
832 return MCDisassembler::Fail;
833
834 unsigned Reg = getReg(Decoder, Mips::MSACtrlRegClassID, RegNo);
835 Inst.addOperand(MCOperand::CreateReg(Reg));
836 return MCDisassembler::Success;
837}
838
Akira Hatanaka71928e62012-04-17 18:03:21 +0000839static DecodeStatus DecodeBranchTarget(MCInst &Inst,
840 unsigned Offset,
841 uint64_t Address,
842 const void *Decoder) {
843 unsigned BranchOffset = Offset & 0xffff;
844 BranchOffset = SignExtend32<18>(BranchOffset << 2) + 4;
845 Inst.addOperand(MCOperand::CreateImm(BranchOffset));
846 return MCDisassembler::Success;
847}
848
Akira Hatanaka71928e62012-04-17 18:03:21 +0000849static DecodeStatus DecodeJumpTarget(MCInst &Inst,
850 unsigned Insn,
851 uint64_t Address,
852 const void *Decoder) {
853
Jim Grosbachecaef492012-08-14 19:06:05 +0000854 unsigned JumpOffset = fieldFromInstruction(Insn, 0, 26) << 2;
Akira Hatanaka71928e62012-04-17 18:03:21 +0000855 Inst.addOperand(MCOperand::CreateImm(JumpOffset));
856 return MCDisassembler::Success;
857}
858
Zoran Jovanovic8a80aa72013-11-04 14:53:22 +0000859static DecodeStatus DecodeBranchTargetMM(MCInst &Inst,
860 unsigned Offset,
861 uint64_t Address,
862 const void *Decoder) {
863 unsigned BranchOffset = Offset & 0xffff;
864 BranchOffset = SignExtend32<18>(BranchOffset << 1);
865 Inst.addOperand(MCOperand::CreateImm(BranchOffset));
866 return MCDisassembler::Success;
867}
868
Zoran Jovanovic507e0842013-10-29 16:38:59 +0000869static DecodeStatus DecodeJumpTargetMM(MCInst &Inst,
870 unsigned Insn,
871 uint64_t Address,
872 const void *Decoder) {
873 unsigned JumpOffset = fieldFromInstruction(Insn, 0, 26) << 1;
874 Inst.addOperand(MCOperand::CreateImm(JumpOffset));
875 return MCDisassembler::Success;
876}
Akira Hatanaka71928e62012-04-17 18:03:21 +0000877
878static DecodeStatus DecodeSimm16(MCInst &Inst,
879 unsigned Insn,
880 uint64_t Address,
881 const void *Decoder) {
882 Inst.addOperand(MCOperand::CreateImm(SignExtend32<16>(Insn)));
883 return MCDisassembler::Success;
884}
885
Matheus Almeida779c5932013-11-18 12:32:49 +0000886static DecodeStatus DecodeLSAImm(MCInst &Inst,
887 unsigned Insn,
888 uint64_t Address,
889 const void *Decoder) {
890 // We add one to the immediate field as it was encoded as 'imm - 1'.
891 Inst.addOperand(MCOperand::CreateImm(Insn + 1));
892 return MCDisassembler::Success;
893}
894
Akira Hatanaka71928e62012-04-17 18:03:21 +0000895static DecodeStatus DecodeInsSize(MCInst &Inst,
896 unsigned Insn,
897 uint64_t Address,
898 const void *Decoder) {
899 // First we need to grab the pos(lsb) from MCInst.
900 int Pos = Inst.getOperand(2).getImm();
901 int Size = (int) Insn - Pos + 1;
902 Inst.addOperand(MCOperand::CreateImm(SignExtend32<16>(Size)));
903 return MCDisassembler::Success;
904}
905
906static DecodeStatus DecodeExtSize(MCInst &Inst,
907 unsigned Insn,
908 uint64_t Address,
909 const void *Decoder) {
910 int Size = (int) Insn + 1;
911 Inst.addOperand(MCOperand::CreateImm(SignExtend32<16>(Size)));
912 return MCDisassembler::Success;
913}
Daniel Sandersb59e1a42014-05-15 10:45:58 +0000914
915static DecodeStatus DecodeSimm19Lsl2(MCInst &Inst, unsigned Insn,
916 uint64_t Address, const void *Decoder) {
917 Inst.addOperand(MCOperand::CreateImm(SignExtend32<19>(Insn) << 2));
918 return MCDisassembler::Success;
919}