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 // DecodeJumpTargetMM - Decode microMIPS jump target, which is
209 // shifted left by 1 bit.
210 static DecodeStatus DecodeJumpTargetMM(MCInst &Inst,
213 const void *Decoder);
215 static DecodeStatus DecodeMem(MCInst &Inst,
218 const void *Decoder);
220 static DecodeStatus DecodeMSA128Mem(MCInst &Inst, unsigned Insn,
221 uint64_t Address, const void *Decoder);
223 static DecodeStatus DecodeMemMMImm12(MCInst &Inst,
226 const void *Decoder);
228 static DecodeStatus DecodeMemMMImm16(MCInst &Inst,
231 const void *Decoder);
233 static DecodeStatus DecodeFMem(MCInst &Inst, unsigned Insn,
235 const void *Decoder);
237 static DecodeStatus DecodeSimm16(MCInst &Inst,
240 const void *Decoder);
242 static DecodeStatus DecodeInsSize(MCInst &Inst,
245 const void *Decoder);
247 static DecodeStatus DecodeExtSize(MCInst &Inst,
250 const void *Decoder);
253 extern Target TheMipselTarget, TheMipsTarget, TheMips64Target,
257 static MCDisassembler *createMipsDisassembler(
259 const MCSubtargetInfo &STI) {
260 return new MipsDisassembler(STI, T.createMCRegInfo(""), true);
263 static MCDisassembler *createMipselDisassembler(
265 const MCSubtargetInfo &STI) {
266 return new MipsDisassembler(STI, T.createMCRegInfo(""), false);
269 static MCDisassembler *createMips64Disassembler(
271 const MCSubtargetInfo &STI) {
272 return new Mips64Disassembler(STI, T.createMCRegInfo(""), true);
275 static MCDisassembler *createMips64elDisassembler(
277 const MCSubtargetInfo &STI) {
278 return new Mips64Disassembler(STI, T.createMCRegInfo(""), false);
281 extern "C" void LLVMInitializeMipsDisassembler() {
282 // Register the disassembler.
283 TargetRegistry::RegisterMCDisassembler(TheMipsTarget,
284 createMipsDisassembler);
285 TargetRegistry::RegisterMCDisassembler(TheMipselTarget,
286 createMipselDisassembler);
287 TargetRegistry::RegisterMCDisassembler(TheMips64Target,
288 createMips64Disassembler);
289 TargetRegistry::RegisterMCDisassembler(TheMips64elTarget,
290 createMips64elDisassembler);
294 #include "MipsGenDisassemblerTables.inc"
296 /// readInstruction - read four bytes from the MemoryObject
297 /// and return 32 bit word sorted according to the given endianess
298 static DecodeStatus readInstruction32(const MemoryObject ®ion,
306 // We want to read exactly 4 Bytes of data.
307 if (region.readBytes(address, 4, Bytes) == -1) {
309 return MCDisassembler::Fail;
313 // Encoded as a big-endian 32-bit word in the stream.
314 insn = (Bytes[3] << 0) |
320 // Encoded as a small-endian 32-bit word in the stream.
321 // Little-endian byte ordering:
322 // mips32r2: 4 | 3 | 2 | 1
323 // microMIPS: 2 | 1 | 4 | 3
325 insn = (Bytes[2] << 0) |
330 insn = (Bytes[0] << 0) |
337 return MCDisassembler::Success;
341 MipsDisassembler::getInstruction(MCInst &instr,
343 const MemoryObject &Region,
345 raw_ostream &vStream,
346 raw_ostream &cStream) const {
349 DecodeStatus Result = readInstruction32(Region, Address, Size,
350 Insn, isBigEndian, IsMicroMips);
351 if (Result == MCDisassembler::Fail)
352 return MCDisassembler::Fail;
355 // Calling the auto-generated decoder function.
356 Result = decodeInstruction(DecoderTableMicroMips32, instr, Insn, Address,
358 if (Result != MCDisassembler::Fail) {
362 return MCDisassembler::Fail;
365 // Calling the auto-generated decoder function.
366 Result = decodeInstruction(DecoderTableMips32, instr, Insn, Address,
368 if (Result != MCDisassembler::Fail) {
373 return MCDisassembler::Fail;
377 Mips64Disassembler::getInstruction(MCInst &instr,
379 const MemoryObject &Region,
381 raw_ostream &vStream,
382 raw_ostream &cStream) const {
385 DecodeStatus Result = readInstruction32(Region, Address, Size,
386 Insn, isBigEndian, false);
387 if (Result == MCDisassembler::Fail)
388 return MCDisassembler::Fail;
390 // Calling the auto-generated decoder function.
391 Result = decodeInstruction(DecoderTableMips6432, instr, Insn, Address,
393 if (Result != MCDisassembler::Fail) {
397 // If we fail to decode in Mips64 decoder space we can try in Mips32
398 Result = decodeInstruction(DecoderTableMips32, instr, Insn, Address,
400 if (Result != MCDisassembler::Fail) {
405 return MCDisassembler::Fail;
408 static unsigned getReg(const void *D, unsigned RC, unsigned RegNo) {
409 const MipsDisassemblerBase *Dis = static_cast<const MipsDisassemblerBase*>(D);
410 return *(Dis->getRegInfo()->getRegClass(RC).begin() + RegNo);
413 static DecodeStatus DecodeCPU16RegsRegisterClass(MCInst &Inst,
416 const void *Decoder) {
418 return MCDisassembler::Fail;
422 static DecodeStatus DecodeGPR64RegisterClass(MCInst &Inst,
425 const void *Decoder) {
428 return MCDisassembler::Fail;
430 unsigned Reg = getReg(Decoder, Mips::GPR64RegClassID, RegNo);
431 Inst.addOperand(MCOperand::CreateReg(Reg));
432 return MCDisassembler::Success;
435 static DecodeStatus DecodeGPR32RegisterClass(MCInst &Inst,
438 const void *Decoder) {
440 return MCDisassembler::Fail;
441 unsigned Reg = getReg(Decoder, Mips::GPR32RegClassID, RegNo);
442 Inst.addOperand(MCOperand::CreateReg(Reg));
443 return MCDisassembler::Success;
446 static DecodeStatus DecodePtrRegisterClass(MCInst &Inst,
449 const void *Decoder) {
450 if (static_cast<const MipsDisassembler *>(Decoder)->isN64())
451 return DecodeGPR64RegisterClass(Inst, RegNo, Address, Decoder);
453 return DecodeGPR32RegisterClass(Inst, RegNo, Address, Decoder);
456 static DecodeStatus DecodeDSPRRegisterClass(MCInst &Inst,
459 const void *Decoder) {
460 return DecodeGPR32RegisterClass(Inst, RegNo, Address, Decoder);
463 static DecodeStatus DecodeFGR64RegisterClass(MCInst &Inst,
466 const void *Decoder) {
468 return MCDisassembler::Fail;
470 unsigned Reg = getReg(Decoder, Mips::FGR64RegClassID, RegNo);
471 Inst.addOperand(MCOperand::CreateReg(Reg));
472 return MCDisassembler::Success;
475 static DecodeStatus DecodeFGR32RegisterClass(MCInst &Inst,
478 const void *Decoder) {
480 return MCDisassembler::Fail;
482 unsigned Reg = getReg(Decoder, Mips::FGR32RegClassID, RegNo);
483 Inst.addOperand(MCOperand::CreateReg(Reg));
484 return MCDisassembler::Success;
487 static DecodeStatus DecodeFGRH32RegisterClass(MCInst &Inst,
490 const void *Decoder) {
492 return MCDisassembler::Fail;
494 unsigned Reg = getReg(Decoder, Mips::FGRH32RegClassID, RegNo);
495 Inst.addOperand(MCOperand::CreateReg(Reg));
496 return MCDisassembler::Success;
499 static DecodeStatus DecodeCCRRegisterClass(MCInst &Inst,
502 const void *Decoder) {
504 return MCDisassembler::Fail;
505 unsigned Reg = getReg(Decoder, Mips::CCRRegClassID, RegNo);
506 Inst.addOperand(MCOperand::CreateReg(Reg));
507 return MCDisassembler::Success;
510 static DecodeStatus DecodeFCCRegisterClass(MCInst &Inst,
513 const void *Decoder) {
515 return MCDisassembler::Fail;
516 unsigned Reg = getReg(Decoder, Mips::FCCRegClassID, RegNo);
517 Inst.addOperand(MCOperand::CreateReg(Reg));
518 return MCDisassembler::Success;
521 static DecodeStatus DecodeMem(MCInst &Inst,
524 const void *Decoder) {
525 int Offset = SignExtend32<16>(Insn & 0xffff);
526 unsigned Reg = fieldFromInstruction(Insn, 16, 5);
527 unsigned Base = fieldFromInstruction(Insn, 21, 5);
529 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
530 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
532 if(Inst.getOpcode() == Mips::SC){
533 Inst.addOperand(MCOperand::CreateReg(Reg));
536 Inst.addOperand(MCOperand::CreateReg(Reg));
537 Inst.addOperand(MCOperand::CreateReg(Base));
538 Inst.addOperand(MCOperand::CreateImm(Offset));
540 return MCDisassembler::Success;
543 static DecodeStatus DecodeMSA128Mem(MCInst &Inst, unsigned Insn,
544 uint64_t Address, const void *Decoder) {
545 int Offset = SignExtend32<10>(fieldFromInstruction(Insn, 16, 10));
546 unsigned Reg = fieldFromInstruction(Insn, 6, 5);
547 unsigned Base = fieldFromInstruction(Insn, 11, 5);
549 Reg = getReg(Decoder, Mips::MSA128BRegClassID, Reg);
550 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
552 Inst.addOperand(MCOperand::CreateReg(Reg));
553 Inst.addOperand(MCOperand::CreateReg(Base));
554 Inst.addOperand(MCOperand::CreateImm(Offset));
556 return MCDisassembler::Success;
559 static DecodeStatus DecodeMemMMImm12(MCInst &Inst,
562 const void *Decoder) {
563 int Offset = SignExtend32<12>(Insn & 0x0fff);
564 unsigned Reg = fieldFromInstruction(Insn, 21, 5);
565 unsigned Base = fieldFromInstruction(Insn, 16, 5);
567 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
568 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
570 Inst.addOperand(MCOperand::CreateReg(Reg));
571 Inst.addOperand(MCOperand::CreateReg(Base));
572 Inst.addOperand(MCOperand::CreateImm(Offset));
574 return MCDisassembler::Success;
577 static DecodeStatus DecodeMemMMImm16(MCInst &Inst,
580 const void *Decoder) {
581 int Offset = SignExtend32<16>(Insn & 0xffff);
582 unsigned Reg = fieldFromInstruction(Insn, 21, 5);
583 unsigned Base = fieldFromInstruction(Insn, 16, 5);
585 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
586 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
588 Inst.addOperand(MCOperand::CreateReg(Reg));
589 Inst.addOperand(MCOperand::CreateReg(Base));
590 Inst.addOperand(MCOperand::CreateImm(Offset));
592 return MCDisassembler::Success;
595 static DecodeStatus DecodeFMem(MCInst &Inst,
598 const void *Decoder) {
599 int Offset = SignExtend32<16>(Insn & 0xffff);
600 unsigned Reg = fieldFromInstruction(Insn, 16, 5);
601 unsigned Base = fieldFromInstruction(Insn, 21, 5);
603 Reg = getReg(Decoder, Mips::FGR64RegClassID, Reg);
604 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
606 Inst.addOperand(MCOperand::CreateReg(Reg));
607 Inst.addOperand(MCOperand::CreateReg(Base));
608 Inst.addOperand(MCOperand::CreateImm(Offset));
610 return MCDisassembler::Success;
614 static DecodeStatus DecodeHWRegsRegisterClass(MCInst &Inst,
617 const void *Decoder) {
618 // Currently only hardware register 29 is supported.
620 return MCDisassembler::Fail;
621 Inst.addOperand(MCOperand::CreateReg(Mips::HWR29));
622 return MCDisassembler::Success;
625 static DecodeStatus DecodeAFGR64RegisterClass(MCInst &Inst,
628 const void *Decoder) {
629 if (RegNo > 30 || RegNo %2)
630 return MCDisassembler::Fail;
633 unsigned Reg = getReg(Decoder, Mips::AFGR64RegClassID, RegNo /2);
634 Inst.addOperand(MCOperand::CreateReg(Reg));
635 return MCDisassembler::Success;
638 static DecodeStatus DecodeACC64DSPRegisterClass(MCInst &Inst,
641 const void *Decoder) {
643 return MCDisassembler::Fail;
645 unsigned Reg = getReg(Decoder, Mips::ACC64DSPRegClassID, RegNo);
646 Inst.addOperand(MCOperand::CreateReg(Reg));
647 return MCDisassembler::Success;
650 static DecodeStatus DecodeHI32DSPRegisterClass(MCInst &Inst,
653 const void *Decoder) {
655 return MCDisassembler::Fail;
657 unsigned Reg = getReg(Decoder, Mips::HI32DSPRegClassID, RegNo);
658 Inst.addOperand(MCOperand::CreateReg(Reg));
659 return MCDisassembler::Success;
662 static DecodeStatus DecodeLO32DSPRegisterClass(MCInst &Inst,
665 const void *Decoder) {
667 return MCDisassembler::Fail;
669 unsigned Reg = getReg(Decoder, Mips::LO32DSPRegClassID, RegNo);
670 Inst.addOperand(MCOperand::CreateReg(Reg));
671 return MCDisassembler::Success;
674 static DecodeStatus DecodeMSA128BRegisterClass(MCInst &Inst,
677 const void *Decoder) {
679 return MCDisassembler::Fail;
681 unsigned Reg = getReg(Decoder, Mips::MSA128BRegClassID, RegNo);
682 Inst.addOperand(MCOperand::CreateReg(Reg));
683 return MCDisassembler::Success;
686 static DecodeStatus DecodeMSA128HRegisterClass(MCInst &Inst,
689 const void *Decoder) {
691 return MCDisassembler::Fail;
693 unsigned Reg = getReg(Decoder, Mips::MSA128HRegClassID, RegNo);
694 Inst.addOperand(MCOperand::CreateReg(Reg));
695 return MCDisassembler::Success;
698 static DecodeStatus DecodeMSA128WRegisterClass(MCInst &Inst,
701 const void *Decoder) {
703 return MCDisassembler::Fail;
705 unsigned Reg = getReg(Decoder, Mips::MSA128WRegClassID, RegNo);
706 Inst.addOperand(MCOperand::CreateReg(Reg));
707 return MCDisassembler::Success;
710 static DecodeStatus DecodeMSA128DRegisterClass(MCInst &Inst,
713 const void *Decoder) {
715 return MCDisassembler::Fail;
717 unsigned Reg = getReg(Decoder, Mips::MSA128DRegClassID, RegNo);
718 Inst.addOperand(MCOperand::CreateReg(Reg));
719 return MCDisassembler::Success;
722 static DecodeStatus DecodeMSACtrlRegisterClass(MCInst &Inst,
725 const void *Decoder) {
727 return MCDisassembler::Fail;
729 unsigned Reg = getReg(Decoder, Mips::MSACtrlRegClassID, RegNo);
730 Inst.addOperand(MCOperand::CreateReg(Reg));
731 return MCDisassembler::Success;
734 static DecodeStatus DecodeBranchTarget(MCInst &Inst,
737 const void *Decoder) {
738 unsigned BranchOffset = Offset & 0xffff;
739 BranchOffset = SignExtend32<18>(BranchOffset << 2) + 4;
740 Inst.addOperand(MCOperand::CreateImm(BranchOffset));
741 return MCDisassembler::Success;
744 static DecodeStatus DecodeJumpTarget(MCInst &Inst,
747 const void *Decoder) {
749 unsigned JumpOffset = fieldFromInstruction(Insn, 0, 26) << 2;
750 Inst.addOperand(MCOperand::CreateImm(JumpOffset));
751 return MCDisassembler::Success;
754 static DecodeStatus DecodeJumpTargetMM(MCInst &Inst,
757 const void *Decoder) {
758 unsigned JumpOffset = fieldFromInstruction(Insn, 0, 26) << 1;
759 Inst.addOperand(MCOperand::CreateImm(JumpOffset));
760 return MCDisassembler::Success;
763 static DecodeStatus DecodeSimm16(MCInst &Inst,
766 const void *Decoder) {
767 Inst.addOperand(MCOperand::CreateImm(SignExtend32<16>(Insn)));
768 return MCDisassembler::Success;
771 static DecodeStatus DecodeInsSize(MCInst &Inst,
774 const void *Decoder) {
775 // First we need to grab the pos(lsb) from MCInst.
776 int Pos = Inst.getOperand(2).getImm();
777 int Size = (int) Insn - Pos + 1;
778 Inst.addOperand(MCOperand::CreateImm(SignExtend32<16>(Size)));
779 return MCDisassembler::Success;
782 static DecodeStatus DecodeExtSize(MCInst &Inst,
785 const void *Decoder) {
786 int Size = (int) Insn + 1;
787 Inst.addOperand(MCOperand::CreateImm(SignExtend32<16>(Size)));
788 return MCDisassembler::Success;