1 //===- MipsDisassembler.cpp - Disassembler for Mips -------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file is part of the Mips Disassembler.
12 //===----------------------------------------------------------------------===//
15 #include "MipsRegisterInfo.h"
16 #include "MipsSubtarget.h"
17 #include "llvm/MC/MCDisassembler.h"
18 #include "llvm/MC/MCFixedLenDisassembler.h"
19 #include "llvm/MC/MCInst.h"
20 #include "llvm/MC/MCSubtargetInfo.h"
21 #include "llvm/Support/MathExtras.h"
22 #include "llvm/Support/MemoryObject.h"
23 #include "llvm/Support/TargetRegistry.h"
27 typedef MCDisassembler::DecodeStatus DecodeStatus;
31 /// MipsDisassemblerBase - a disasembler class for Mips.
32 class MipsDisassemblerBase : public MCDisassembler {
34 /// Constructor - Initializes the disassembler.
36 MipsDisassemblerBase(const MCSubtargetInfo &STI, const MCRegisterInfo *Info,
38 MCDisassembler(STI), RegInfo(Info),
39 IsN64(STI.getFeatureBits() & Mips::FeatureN64), isBigEndian(bigEndian) {}
41 virtual ~MipsDisassemblerBase() {}
43 const MCRegisterInfo *getRegInfo() const { return RegInfo.get(); }
45 bool isN64() const { return IsN64; }
48 OwningPtr<const MCRegisterInfo> RegInfo;
54 /// MipsDisassembler - a disasembler class for Mips32.
55 class MipsDisassembler : public MipsDisassemblerBase {
58 /// Constructor - Initializes the disassembler.
60 MipsDisassembler(const MCSubtargetInfo &STI, const MCRegisterInfo *Info,
62 MipsDisassemblerBase(STI, Info, bigEndian) {
63 IsMicroMips = STI.getFeatureBits() & Mips::FeatureMicroMips;
66 /// getInstruction - See MCDisassembler.
67 virtual DecodeStatus getInstruction(MCInst &instr,
69 const MemoryObject ®ion,
72 raw_ostream &cStream) const;
76 /// Mips64Disassembler - a disasembler class for Mips64.
77 class Mips64Disassembler : public MipsDisassemblerBase {
79 /// Constructor - Initializes the disassembler.
81 Mips64Disassembler(const MCSubtargetInfo &STI, const MCRegisterInfo *Info,
83 MipsDisassemblerBase(STI, Info, bigEndian) {}
85 /// getInstruction - See MCDisassembler.
86 virtual DecodeStatus getInstruction(MCInst &instr,
88 const MemoryObject ®ion,
91 raw_ostream &cStream) const;
94 } // end anonymous namespace
96 // Forward declare these because the autogenerated code will reference them.
97 // Definitions are further down.
98 static DecodeStatus DecodeGPR64RegisterClass(MCInst &Inst,
101 const void *Decoder);
103 static DecodeStatus DecodeCPU16RegsRegisterClass(MCInst &Inst,
106 const void *Decoder);
108 static DecodeStatus DecodeGPR32RegisterClass(MCInst &Inst,
111 const void *Decoder);
113 static DecodeStatus DecodePtrRegisterClass(MCInst &Inst,
116 const void *Decoder);
118 static DecodeStatus DecodeDSPRRegisterClass(MCInst &Inst,
121 const void *Decoder);
123 static DecodeStatus DecodeFGR64RegisterClass(MCInst &Inst,
126 const void *Decoder);
128 static DecodeStatus DecodeFGR32RegisterClass(MCInst &Inst,
131 const void *Decoder);
133 static DecodeStatus DecodeFGRH32RegisterClass(MCInst &Inst,
136 const void *Decoder);
138 static DecodeStatus DecodeCCRRegisterClass(MCInst &Inst,
141 const void *Decoder);
143 static DecodeStatus DecodeFCCRegisterClass(MCInst &Inst,
146 const void *Decoder);
148 static DecodeStatus DecodeHWRegsRegisterClass(MCInst &Inst,
151 const void *Decoder);
153 static DecodeStatus DecodeAFGR64RegisterClass(MCInst &Inst,
156 const void *Decoder);
158 static DecodeStatus DecodeACC64DSPRegisterClass(MCInst &Inst,
161 const void *Decoder);
163 static DecodeStatus DecodeHI32DSPRegisterClass(MCInst &Inst,
166 const void *Decoder);
168 static DecodeStatus DecodeLO32DSPRegisterClass(MCInst &Inst,
171 const void *Decoder);
173 static DecodeStatus DecodeMSA128BRegisterClass(MCInst &Inst,
176 const void *Decoder);
178 static DecodeStatus DecodeMSA128HRegisterClass(MCInst &Inst,
181 const void *Decoder);
183 static DecodeStatus DecodeMSA128WRegisterClass(MCInst &Inst,
186 const void *Decoder);
188 static DecodeStatus DecodeMSA128DRegisterClass(MCInst &Inst,
191 const void *Decoder);
193 static DecodeStatus DecodeMSACtrlRegisterClass(MCInst &Inst,
196 const void *Decoder);
198 static DecodeStatus DecodeBranchTarget(MCInst &Inst,
201 const void *Decoder);
203 static DecodeStatus DecodeJumpTarget(MCInst &Inst,
206 const void *Decoder);
208 static DecodeStatus DecodeMem(MCInst &Inst,
211 const void *Decoder);
213 static DecodeStatus DecodeMSA128Mem(MCInst &Inst, unsigned Insn,
214 uint64_t Address, const void *Decoder);
216 static DecodeStatus DecodeMemMMImm12(MCInst &Inst,
219 const void *Decoder);
221 static DecodeStatus DecodeMemMMImm16(MCInst &Inst,
224 const void *Decoder);
226 static DecodeStatus DecodeFMem(MCInst &Inst, unsigned Insn,
228 const void *Decoder);
230 static DecodeStatus DecodeSimm16(MCInst &Inst,
233 const void *Decoder);
235 static DecodeStatus DecodeInsSize(MCInst &Inst,
238 const void *Decoder);
240 static DecodeStatus DecodeExtSize(MCInst &Inst,
243 const void *Decoder);
246 extern Target TheMipselTarget, TheMipsTarget, TheMips64Target,
250 static MCDisassembler *createMipsDisassembler(
252 const MCSubtargetInfo &STI) {
253 return new MipsDisassembler(STI, T.createMCRegInfo(""), true);
256 static MCDisassembler *createMipselDisassembler(
258 const MCSubtargetInfo &STI) {
259 return new MipsDisassembler(STI, T.createMCRegInfo(""), false);
262 static MCDisassembler *createMips64Disassembler(
264 const MCSubtargetInfo &STI) {
265 return new Mips64Disassembler(STI, T.createMCRegInfo(""), true);
268 static MCDisassembler *createMips64elDisassembler(
270 const MCSubtargetInfo &STI) {
271 return new Mips64Disassembler(STI, T.createMCRegInfo(""), false);
274 extern "C" void LLVMInitializeMipsDisassembler() {
275 // Register the disassembler.
276 TargetRegistry::RegisterMCDisassembler(TheMipsTarget,
277 createMipsDisassembler);
278 TargetRegistry::RegisterMCDisassembler(TheMipselTarget,
279 createMipselDisassembler);
280 TargetRegistry::RegisterMCDisassembler(TheMips64Target,
281 createMips64Disassembler);
282 TargetRegistry::RegisterMCDisassembler(TheMips64elTarget,
283 createMips64elDisassembler);
287 #include "MipsGenDisassemblerTables.inc"
289 /// readInstruction - read four bytes from the MemoryObject
290 /// and return 32 bit word sorted according to the given endianess
291 static DecodeStatus readInstruction32(const MemoryObject ®ion,
299 // We want to read exactly 4 Bytes of data.
300 if (region.readBytes(address, 4, Bytes) == -1) {
302 return MCDisassembler::Fail;
306 // Encoded as a big-endian 32-bit word in the stream.
307 insn = (Bytes[3] << 0) |
313 // Encoded as a small-endian 32-bit word in the stream.
314 // Little-endian byte ordering:
315 // mips32r2: 4 | 3 | 2 | 1
316 // microMIPS: 2 | 1 | 4 | 3
318 insn = (Bytes[2] << 0) |
323 insn = (Bytes[0] << 0) |
330 return MCDisassembler::Success;
334 MipsDisassembler::getInstruction(MCInst &instr,
336 const MemoryObject &Region,
338 raw_ostream &vStream,
339 raw_ostream &cStream) const {
342 DecodeStatus Result = readInstruction32(Region, Address, Size,
343 Insn, isBigEndian, IsMicroMips);
344 if (Result == MCDisassembler::Fail)
345 return MCDisassembler::Fail;
348 // Calling the auto-generated decoder function.
349 Result = decodeInstruction(DecoderTableMicroMips32, instr, Insn, Address,
351 if (Result != MCDisassembler::Fail) {
355 return MCDisassembler::Fail;
358 // Calling the auto-generated decoder function.
359 Result = decodeInstruction(DecoderTableMips32, instr, Insn, Address,
361 if (Result != MCDisassembler::Fail) {
366 return MCDisassembler::Fail;
370 Mips64Disassembler::getInstruction(MCInst &instr,
372 const MemoryObject &Region,
374 raw_ostream &vStream,
375 raw_ostream &cStream) const {
378 DecodeStatus Result = readInstruction32(Region, Address, Size,
379 Insn, isBigEndian, false);
380 if (Result == MCDisassembler::Fail)
381 return MCDisassembler::Fail;
383 // Calling the auto-generated decoder function.
384 Result = decodeInstruction(DecoderTableMips6432, instr, Insn, Address,
386 if (Result != MCDisassembler::Fail) {
390 // If we fail to decode in Mips64 decoder space we can try in Mips32
391 Result = decodeInstruction(DecoderTableMips32, instr, Insn, Address,
393 if (Result != MCDisassembler::Fail) {
398 return MCDisassembler::Fail;
401 static unsigned getReg(const void *D, unsigned RC, unsigned RegNo) {
402 const MipsDisassemblerBase *Dis = static_cast<const MipsDisassemblerBase*>(D);
403 return *(Dis->getRegInfo()->getRegClass(RC).begin() + RegNo);
406 static DecodeStatus DecodeCPU16RegsRegisterClass(MCInst &Inst,
409 const void *Decoder) {
411 return MCDisassembler::Fail;
415 static DecodeStatus DecodeGPR64RegisterClass(MCInst &Inst,
418 const void *Decoder) {
421 return MCDisassembler::Fail;
423 unsigned Reg = getReg(Decoder, Mips::GPR64RegClassID, RegNo);
424 Inst.addOperand(MCOperand::CreateReg(Reg));
425 return MCDisassembler::Success;
428 static DecodeStatus DecodeGPR32RegisterClass(MCInst &Inst,
431 const void *Decoder) {
433 return MCDisassembler::Fail;
434 unsigned Reg = getReg(Decoder, Mips::GPR32RegClassID, RegNo);
435 Inst.addOperand(MCOperand::CreateReg(Reg));
436 return MCDisassembler::Success;
439 static DecodeStatus DecodePtrRegisterClass(MCInst &Inst,
442 const void *Decoder) {
443 if (static_cast<const MipsDisassembler *>(Decoder)->isN64())
444 return DecodeGPR64RegisterClass(Inst, RegNo, Address, Decoder);
446 return DecodeGPR32RegisterClass(Inst, RegNo, Address, Decoder);
449 static DecodeStatus DecodeDSPRRegisterClass(MCInst &Inst,
452 const void *Decoder) {
453 return DecodeGPR32RegisterClass(Inst, RegNo, Address, Decoder);
456 static DecodeStatus DecodeFGR64RegisterClass(MCInst &Inst,
459 const void *Decoder) {
461 return MCDisassembler::Fail;
463 unsigned Reg = getReg(Decoder, Mips::FGR64RegClassID, RegNo);
464 Inst.addOperand(MCOperand::CreateReg(Reg));
465 return MCDisassembler::Success;
468 static DecodeStatus DecodeFGR32RegisterClass(MCInst &Inst,
471 const void *Decoder) {
473 return MCDisassembler::Fail;
475 unsigned Reg = getReg(Decoder, Mips::FGR32RegClassID, RegNo);
476 Inst.addOperand(MCOperand::CreateReg(Reg));
477 return MCDisassembler::Success;
480 static DecodeStatus DecodeFGRH32RegisterClass(MCInst &Inst,
483 const void *Decoder) {
485 return MCDisassembler::Fail;
487 unsigned Reg = getReg(Decoder, Mips::FGRH32RegClassID, RegNo);
488 Inst.addOperand(MCOperand::CreateReg(Reg));
489 return MCDisassembler::Success;
492 static DecodeStatus DecodeCCRRegisterClass(MCInst &Inst,
495 const void *Decoder) {
497 return MCDisassembler::Fail;
498 unsigned Reg = getReg(Decoder, Mips::CCRRegClassID, RegNo);
499 Inst.addOperand(MCOperand::CreateReg(Reg));
500 return MCDisassembler::Success;
503 static DecodeStatus DecodeFCCRegisterClass(MCInst &Inst,
506 const void *Decoder) {
508 return MCDisassembler::Fail;
509 unsigned Reg = getReg(Decoder, Mips::FCCRegClassID, RegNo);
510 Inst.addOperand(MCOperand::CreateReg(Reg));
511 return MCDisassembler::Success;
514 static DecodeStatus DecodeMem(MCInst &Inst,
517 const void *Decoder) {
518 int Offset = SignExtend32<16>(Insn & 0xffff);
519 unsigned Reg = fieldFromInstruction(Insn, 16, 5);
520 unsigned Base = fieldFromInstruction(Insn, 21, 5);
522 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
523 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
525 if(Inst.getOpcode() == Mips::SC){
526 Inst.addOperand(MCOperand::CreateReg(Reg));
529 Inst.addOperand(MCOperand::CreateReg(Reg));
530 Inst.addOperand(MCOperand::CreateReg(Base));
531 Inst.addOperand(MCOperand::CreateImm(Offset));
533 return MCDisassembler::Success;
536 static DecodeStatus DecodeMSA128Mem(MCInst &Inst, unsigned Insn,
537 uint64_t Address, const void *Decoder) {
538 int Offset = SignExtend32<10>(fieldFromInstruction(Insn, 16, 10));
539 unsigned Reg = fieldFromInstruction(Insn, 6, 5);
540 unsigned Base = fieldFromInstruction(Insn, 11, 5);
542 Reg = getReg(Decoder, Mips::MSA128BRegClassID, Reg);
543 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
545 Inst.addOperand(MCOperand::CreateReg(Reg));
546 Inst.addOperand(MCOperand::CreateReg(Base));
547 Inst.addOperand(MCOperand::CreateImm(Offset));
549 return MCDisassembler::Success;
552 static DecodeStatus DecodeMemMMImm12(MCInst &Inst,
555 const void *Decoder) {
556 int Offset = SignExtend32<12>(Insn & 0x0fff);
557 unsigned Reg = fieldFromInstruction(Insn, 21, 5);
558 unsigned Base = fieldFromInstruction(Insn, 16, 5);
560 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
561 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
563 Inst.addOperand(MCOperand::CreateReg(Reg));
564 Inst.addOperand(MCOperand::CreateReg(Base));
565 Inst.addOperand(MCOperand::CreateImm(Offset));
567 return MCDisassembler::Success;
570 static DecodeStatus DecodeMemMMImm16(MCInst &Inst,
573 const void *Decoder) {
574 int Offset = SignExtend32<16>(Insn & 0xffff);
575 unsigned Reg = fieldFromInstruction(Insn, 21, 5);
576 unsigned Base = fieldFromInstruction(Insn, 16, 5);
578 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
579 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
581 Inst.addOperand(MCOperand::CreateReg(Reg));
582 Inst.addOperand(MCOperand::CreateReg(Base));
583 Inst.addOperand(MCOperand::CreateImm(Offset));
585 return MCDisassembler::Success;
588 static DecodeStatus DecodeFMem(MCInst &Inst,
591 const void *Decoder) {
592 int Offset = SignExtend32<16>(Insn & 0xffff);
593 unsigned Reg = fieldFromInstruction(Insn, 16, 5);
594 unsigned Base = fieldFromInstruction(Insn, 21, 5);
596 Reg = getReg(Decoder, Mips::FGR64RegClassID, Reg);
597 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
599 Inst.addOperand(MCOperand::CreateReg(Reg));
600 Inst.addOperand(MCOperand::CreateReg(Base));
601 Inst.addOperand(MCOperand::CreateImm(Offset));
603 return MCDisassembler::Success;
607 static DecodeStatus DecodeHWRegsRegisterClass(MCInst &Inst,
610 const void *Decoder) {
611 // Currently only hardware register 29 is supported.
613 return MCDisassembler::Fail;
614 Inst.addOperand(MCOperand::CreateReg(Mips::HWR29));
615 return MCDisassembler::Success;
618 static DecodeStatus DecodeAFGR64RegisterClass(MCInst &Inst,
621 const void *Decoder) {
622 if (RegNo > 30 || RegNo %2)
623 return MCDisassembler::Fail;
626 unsigned Reg = getReg(Decoder, Mips::AFGR64RegClassID, RegNo /2);
627 Inst.addOperand(MCOperand::CreateReg(Reg));
628 return MCDisassembler::Success;
631 static DecodeStatus DecodeACC64DSPRegisterClass(MCInst &Inst,
634 const void *Decoder) {
636 return MCDisassembler::Fail;
638 unsigned Reg = getReg(Decoder, Mips::ACC64DSPRegClassID, RegNo);
639 Inst.addOperand(MCOperand::CreateReg(Reg));
640 return MCDisassembler::Success;
643 static DecodeStatus DecodeHI32DSPRegisterClass(MCInst &Inst,
646 const void *Decoder) {
648 return MCDisassembler::Fail;
650 unsigned Reg = getReg(Decoder, Mips::HI32DSPRegClassID, RegNo);
651 Inst.addOperand(MCOperand::CreateReg(Reg));
652 return MCDisassembler::Success;
655 static DecodeStatus DecodeLO32DSPRegisterClass(MCInst &Inst,
658 const void *Decoder) {
660 return MCDisassembler::Fail;
662 unsigned Reg = getReg(Decoder, Mips::LO32DSPRegClassID, RegNo);
663 Inst.addOperand(MCOperand::CreateReg(Reg));
664 return MCDisassembler::Success;
667 static DecodeStatus DecodeMSA128BRegisterClass(MCInst &Inst,
670 const void *Decoder) {
672 return MCDisassembler::Fail;
674 unsigned Reg = getReg(Decoder, Mips::MSA128BRegClassID, RegNo);
675 Inst.addOperand(MCOperand::CreateReg(Reg));
676 return MCDisassembler::Success;
679 static DecodeStatus DecodeMSA128HRegisterClass(MCInst &Inst,
682 const void *Decoder) {
684 return MCDisassembler::Fail;
686 unsigned Reg = getReg(Decoder, Mips::MSA128HRegClassID, RegNo);
687 Inst.addOperand(MCOperand::CreateReg(Reg));
688 return MCDisassembler::Success;
691 static DecodeStatus DecodeMSA128WRegisterClass(MCInst &Inst,
694 const void *Decoder) {
696 return MCDisassembler::Fail;
698 unsigned Reg = getReg(Decoder, Mips::MSA128WRegClassID, RegNo);
699 Inst.addOperand(MCOperand::CreateReg(Reg));
700 return MCDisassembler::Success;
703 static DecodeStatus DecodeMSA128DRegisterClass(MCInst &Inst,
706 const void *Decoder) {
708 return MCDisassembler::Fail;
710 unsigned Reg = getReg(Decoder, Mips::MSA128DRegClassID, RegNo);
711 Inst.addOperand(MCOperand::CreateReg(Reg));
712 return MCDisassembler::Success;
715 static DecodeStatus DecodeMSACtrlRegisterClass(MCInst &Inst,
718 const void *Decoder) {
720 return MCDisassembler::Fail;
722 unsigned Reg = getReg(Decoder, Mips::MSACtrlRegClassID, RegNo);
723 Inst.addOperand(MCOperand::CreateReg(Reg));
724 return MCDisassembler::Success;
727 static DecodeStatus DecodeBranchTarget(MCInst &Inst,
730 const void *Decoder) {
731 unsigned BranchOffset = Offset & 0xffff;
732 BranchOffset = SignExtend32<18>(BranchOffset << 2) + 4;
733 Inst.addOperand(MCOperand::CreateImm(BranchOffset));
734 return MCDisassembler::Success;
737 static DecodeStatus DecodeJumpTarget(MCInst &Inst,
740 const void *Decoder) {
742 unsigned JumpOffset = fieldFromInstruction(Insn, 0, 26) << 2;
743 Inst.addOperand(MCOperand::CreateImm(JumpOffset));
744 return MCDisassembler::Success;
748 static DecodeStatus DecodeSimm16(MCInst &Inst,
751 const void *Decoder) {
752 Inst.addOperand(MCOperand::CreateImm(SignExtend32<16>(Insn)));
753 return MCDisassembler::Success;
756 static DecodeStatus DecodeInsSize(MCInst &Inst,
759 const void *Decoder) {
760 // First we need to grab the pos(lsb) from MCInst.
761 int Pos = Inst.getOperand(2).getImm();
762 int Size = (int) Insn - Pos + 1;
763 Inst.addOperand(MCOperand::CreateImm(SignExtend32<16>(Size)));
764 return MCDisassembler::Success;
767 static DecodeStatus DecodeExtSize(MCInst &Inst,
770 const void *Decoder) {
771 int Size = (int) Insn + 1;
772 Inst.addOperand(MCOperand::CreateImm(SignExtend32<16>(Size)));
773 return MCDisassembler::Success;