1 //===- XCoreDisassembler.cpp - Disassembler for XCore -----------*- 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 XCore Disassembler.
12 //===----------------------------------------------------------------------===//
15 #include "XCoreRegisterInfo.h"
16 #include "llvm/MC/MCDisassembler.h"
17 #include "llvm/MC/MCFixedLenDisassembler.h"
18 #include "llvm/MC/MCInst.h"
19 #include "llvm/MC/MCSubtargetInfo.h"
20 #include "llvm/Support/MemoryObject.h"
21 #include "llvm/Support/TargetRegistry.h"
25 typedef MCDisassembler::DecodeStatus DecodeStatus;
29 /// XCoreDisassembler - a disasembler class for XCore.
30 class XCoreDisassembler : public MCDisassembler {
31 const MCRegisterInfo *RegInfo;
33 /// Constructor - Initializes the disassembler.
35 XCoreDisassembler(const MCSubtargetInfo &STI, const MCRegisterInfo *Info) :
36 MCDisassembler(STI), RegInfo(Info) {}
38 /// getInstruction - See MCDisassembler.
39 virtual DecodeStatus getInstruction(MCInst &instr,
41 const MemoryObject ®ion,
44 raw_ostream &cStream) const;
46 const MCRegisterInfo *getRegInfo() const { return RegInfo; }
50 static bool readInstruction16(const MemoryObject ®ion,
56 // We want to read exactly 2 Bytes of data.
57 if (region.readBytes(address, 2, Bytes, NULL) == -1) {
61 // Encoded as a little-endian 16-bit word in the stream.
62 insn = (Bytes[0] << 0) | (Bytes[1] << 8);
66 static unsigned getReg(const void *D, unsigned RC, unsigned RegNo) {
67 const XCoreDisassembler *Dis = static_cast<const XCoreDisassembler*>(D);
68 return *(Dis->getRegInfo()->getRegClass(RC).begin() + RegNo);
72 static DecodeStatus DecodeGRRegsRegisterClass(MCInst &Inst,
77 #include "XCoreGenDisassemblerTables.inc"
79 static DecodeStatus DecodeGRRegsRegisterClass(MCInst &Inst,
85 return MCDisassembler::Fail;
86 unsigned Reg = getReg(Decoder, XCore::GRRegsRegClassID, RegNo);
87 Inst.addOperand(MCOperand::CreateReg(Reg));
88 return MCDisassembler::Success;
91 MCDisassembler::DecodeStatus
92 XCoreDisassembler::getInstruction(MCInst &instr,
94 const MemoryObject &Region,
97 raw_ostream &cStream) const {
100 if (!readInstruction16(Region, Address, Size, low)) {
104 // Calling the auto-generated decoder function.
105 DecodeStatus Result = decodeInstruction(DecoderTable16, instr, low, Address,
107 if (Result != Fail) {
116 extern Target TheXCoreTarget;
119 static MCDisassembler *createXCoreDisassembler(const Target &T,
120 const MCSubtargetInfo &STI) {
121 return new XCoreDisassembler(STI, T.createMCRegInfo(""));
124 extern "C" void LLVMInitializeXCoreDisassembler() {
125 // Register the disassembler.
126 TargetRegistry::RegisterMCDisassembler(TheXCoreTarget,
127 createXCoreDisassembler);