XCoreDisassembler.cpp revision 35150cbf4166ae8d69032d355f1e8d83b4a6eb3c
1881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne//===- XCoreDisassembler.cpp - Disassembler for XCore -----------*- C++ -*-===//
2881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne//
3881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne//                     The LLVM Compiler Infrastructure
4881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne//
5881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne// This file is distributed under the University of Illinois Open Source
6881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne// License. See LICENSE.TXT for details.
7881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne//
8881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne//===----------------------------------------------------------------------===//
9b4d40a04f0639fdec8329a8708565411fa53b5bcRichard Osborne///
10b4d40a04f0639fdec8329a8708565411fa53b5bcRichard Osborne/// \file
11b4d40a04f0639fdec8329a8708565411fa53b5bcRichard Osborne/// \brief This file is part of the XCore Disassembler.
12b4d40a04f0639fdec8329a8708565411fa53b5bcRichard Osborne///
13881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne//===----------------------------------------------------------------------===//
14881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne
1554d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne#include "XCore.h"
1654d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne#include "XCoreRegisterInfo.h"
17881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne#include "llvm/MC/MCDisassembler.h"
18881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne#include "llvm/MC/MCFixedLenDisassembler.h"
1954d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne#include "llvm/MC/MCInst.h"
20881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne#include "llvm/MC/MCSubtargetInfo.h"
21881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne#include "llvm/Support/MemoryObject.h"
22881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne#include "llvm/Support/TargetRegistry.h"
23881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne
24881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborneusing namespace llvm;
25881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne
26881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osbornetypedef MCDisassembler::DecodeStatus DecodeStatus;
27881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne
28881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osbornenamespace {
29881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne
30b4d40a04f0639fdec8329a8708565411fa53b5bcRichard Osborne/// \brief A disassembler class for XCore.
31881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborneclass XCoreDisassembler : public MCDisassembler {
3254d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  const MCRegisterInfo *RegInfo;
33881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osbornepublic:
3454d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  XCoreDisassembler(const MCSubtargetInfo &STI, const MCRegisterInfo *Info) :
3554d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne    MCDisassembler(STI), RegInfo(Info) {}
36881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne
37b4d40a04f0639fdec8329a8708565411fa53b5bcRichard Osborne  /// \brief See MCDisassembler.
38881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne  virtual DecodeStatus getInstruction(MCInst &instr,
39881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne                                      uint64_t &size,
40881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne                                      const MemoryObject &region,
41881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne                                      uint64_t address,
42881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne                                      raw_ostream &vStream,
43881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne                                      raw_ostream &cStream) const;
4454d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne
4554d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  const MCRegisterInfo *getRegInfo() const { return RegInfo; }
46881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne};
4754d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne}
48881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne
4954d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osbornestatic bool readInstruction16(const MemoryObject &region,
5054d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne                              uint64_t address,
5154d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne                              uint64_t &size,
5254d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne                              uint16_t &insn) {
5354d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  uint8_t Bytes[4];
5454d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne
5554d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  // We want to read exactly 2 Bytes of data.
5654d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  if (region.readBytes(address, 2, Bytes, NULL) == -1) {
5754d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne    size = 0;
5854d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne    return false;
5954d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  }
6054d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  // Encoded as a little-endian 16-bit word in the stream.
6154d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  insn = (Bytes[0] <<  0) | (Bytes[1] <<  8);
6254d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  return true;
6354d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne}
6454d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne
6554d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osbornestatic unsigned getReg(const void *D, unsigned RC, unsigned RegNo) {
6654d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  const XCoreDisassembler *Dis = static_cast<const XCoreDisassembler*>(D);
6754d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  return *(Dis->getRegInfo()->getRegClass(RC).begin() + RegNo);
6854d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne}
6954d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne
7054d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osbornestatic DecodeStatus DecodeGRRegsRegisterClass(MCInst &Inst,
7154d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne                                              unsigned RegNo,
7254d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne                                              uint64_t Address,
7354d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne                                              const void *Decoder);
7454d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne
7535150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osbornestatic DecodeStatus DecodeBitpOperand(MCInst &Inst, unsigned Val,
7635150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne                                      uint64_t Address, const void *Decoder);
7735150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne
781ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osbornestatic DecodeStatus Decode2RInstruction(MCInst &Inst,
791ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne                                        unsigned RegNo,
801ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne                                        uint64_t Address,
811ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne                                        const void *Decoder);
821ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne
831ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osbornestatic DecodeStatus DecodeR2RInstruction(MCInst &Inst,
841ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne                                         unsigned RegNo,
851ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne                                         uint64_t Address,
861ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne                                         const void *Decoder);
871ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne
881ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osbornestatic DecodeStatus Decode2RSrcDstInstruction(MCInst &Inst,
891ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne                                              unsigned RegNo,
901ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne                                              uint64_t Address,
911ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne                                              const void *Decoder);
921ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne
9335150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osbornestatic DecodeStatus DecodeRUSInstruction(MCInst &Inst,
9435150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne                                         unsigned Insn,
9535150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne                                         uint64_t Address,
9635150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne                                         const void *Decoder);
9735150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne
9835150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osbornestatic DecodeStatus DecodeRUSBitpInstruction(MCInst &Inst,
9935150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne                                             unsigned Insn,
10035150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne                                             uint64_t Address,
10135150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne                                             const void *Decoder);
10235150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne
10335150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osbornestatic DecodeStatus DecodeRUSSrcDstBitpInstruction(MCInst &Inst,
10435150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne                                                   unsigned Insn,
10535150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne                                                   uint64_t Address,
10635150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne                                                   const void *Decoder);
10735150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne
10854d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne#include "XCoreGenDisassemblerTables.inc"
10954d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne
11054d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osbornestatic DecodeStatus DecodeGRRegsRegisterClass(MCInst &Inst,
11154d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne                                              unsigned RegNo,
11254d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne                                              uint64_t Address,
11354d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne                                              const void *Decoder)
11454d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne{
11554d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  if (RegNo > 11)
11654d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne    return MCDisassembler::Fail;
11754d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  unsigned Reg = getReg(Decoder, XCore::GRRegsRegClassID, RegNo);
11854d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  Inst.addOperand(MCOperand::CreateReg(Reg));
11954d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  return MCDisassembler::Success;
120881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne}
121881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne
12235150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osbornestatic DecodeStatus DecodeBitpOperand(MCInst &Inst, unsigned Val,
12335150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne                                      uint64_t Address, const void *Decoder) {
12435150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne  if (Val > 11)
12535150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne    return MCDisassembler::Fail;
12635150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne  static unsigned Values[] = {
12735150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne    32 /*bpw*/, 1, 2, 3, 4, 5, 6, 7, 8, 16, 24, 32
12835150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne  };
12935150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne  Inst.addOperand(MCOperand::CreateImm(Values[Val]));
13035150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne  return MCDisassembler::Success;
13135150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne}
13235150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne
1331ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osbornestatic DecodeStatus
1341ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard OsborneDecode2OpInstruction(unsigned Insn, unsigned &Op1, unsigned &Op2) {
1351ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  unsigned Combined = fieldFromInstruction(Insn, 6, 5) +
1361ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne                      fieldFromInstruction(Insn, 5, 1) * 5 - 27;
1371ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  if (Combined >= 9)
1381ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne    return MCDisassembler::Fail;
1391ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne
1401ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  unsigned Op1High = Combined % 3;
1411ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  unsigned Op2High = Combined / 3;
1421ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  Op1 = (Op1High << 2) | fieldFromInstruction(Insn, 2, 2);
1431ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  Op2 = (Op2High << 2) | fieldFromInstruction(Insn, 0, 2);
1441ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  return MCDisassembler::Success;
1451ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne}
1461ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne
1471ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osbornestatic DecodeStatus
1481ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard OsborneDecode2RInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
1491ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne                    const void *Decoder) {
1501ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  unsigned Op1, Op2;
1511ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  DecodeStatus S = Decode2OpInstruction(Insn, Op1, Op2);
1521ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  if (S == MCDisassembler::Success) {
1531ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne    DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
1541ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne    DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
1551ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  }
1561ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  return S;
1571ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne}
1581ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne
1591ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osbornestatic DecodeStatus
1601ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard OsborneDecodeR2RInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
1611ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne                     const void *Decoder) {
1621ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  unsigned Op1, Op2;
1631ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  DecodeStatus S = Decode2OpInstruction(Insn, Op2, Op1);
1641ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  if (S == MCDisassembler::Success) {
1651ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne    DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
1661ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne    DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
1671ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  }
1681ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  return S;
1691ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne}
1701ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne
1711ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osbornestatic DecodeStatus
1721ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard OsborneDecode2RSrcDstInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
1731ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne                          const void *Decoder) {
1741ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  unsigned Op1, Op2;
1751ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  DecodeStatus S = Decode2OpInstruction(Insn, Op1, Op2);
1761ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  if (S == MCDisassembler::Success) {
1771ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne    DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
1781ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne    DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
1791ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne    DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
1801ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  }
1811ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  return S;
1821ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne}
1831ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne
18435150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osbornestatic DecodeStatus
18535150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard OsborneDecodeRUSInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
18635150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne                     const void *Decoder) {
18735150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne  unsigned Op1, Op2;
18835150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne  DecodeStatus S = Decode2OpInstruction(Insn, Op1, Op2);
18935150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne  if (S == MCDisassembler::Success) {
19035150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne    DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
19135150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne    Inst.addOperand(MCOperand::CreateImm(Op2));
19235150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne  }
19335150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne  return S;
19435150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne}
19535150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne
19635150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osbornestatic DecodeStatus
19735150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard OsborneDecodeRUSBitpInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
19835150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne                         const void *Decoder) {
19935150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne  unsigned Op1, Op2;
20035150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne  DecodeStatus S = Decode2OpInstruction(Insn, Op1, Op2);
20135150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne  if (S == MCDisassembler::Success) {
20235150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne    DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
20335150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne    DecodeBitpOperand(Inst, Op2, Address, Decoder);
20435150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne  }
20535150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne  return S;
20635150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne}
20735150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne
20835150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osbornestatic DecodeStatus
20935150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard OsborneDecodeRUSSrcDstBitpInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
21035150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne                               const void *Decoder) {
21135150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne  unsigned Op1, Op2;
21235150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne  DecodeStatus S = Decode2OpInstruction(Insn, Op1, Op2);
21335150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne  if (S == MCDisassembler::Success) {
21435150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne    DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
21535150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne    DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
21635150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne    DecodeBitpOperand(Inst, Op2, Address, Decoder);
21735150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne  }
21835150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne  return S;
21935150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne}
22035150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne
221881e3cca66c64a57ff431a4f6d1136dd6017c137Richard OsborneMCDisassembler::DecodeStatus
222881e3cca66c64a57ff431a4f6d1136dd6017c137Richard OsborneXCoreDisassembler::getInstruction(MCInst &instr,
223881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne                                  uint64_t &Size,
224881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne                                  const MemoryObject &Region,
225881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne                                  uint64_t Address,
226881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne                                  raw_ostream &vStream,
227881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne                                  raw_ostream &cStream) const {
22854d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  uint16_t low;
22954d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne
23054d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  if (!readInstruction16(Region, Address, Size, low)) {
23154d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne    return Fail;
23254d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  }
23354d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne
23454d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  // Calling the auto-generated decoder function.
23554d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  DecodeStatus Result = decodeInstruction(DecoderTable16, instr, low, Address,
23654d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne                             this, STI);
23754d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  if (Result != Fail) {
23854d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne    Size = 2;
23954d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne    return Result;
24054d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  }
24154d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne
242881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne  return Fail;
243881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne}
244881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne
245881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osbornenamespace llvm {
246881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne  extern Target TheXCoreTarget;
247881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne}
248881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne
249881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osbornestatic MCDisassembler *createXCoreDisassembler(const Target &T,
250881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne                                               const MCSubtargetInfo &STI) {
25154d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  return new XCoreDisassembler(STI, T.createMCRegInfo(""));
252881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne}
253881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne
254881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborneextern "C" void LLVMInitializeXCoreDisassembler() {
255881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne  // Register the disassembler.
256881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne  TargetRegistry::RegisterMCDisassembler(TheXCoreTarget,
257881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne                                         createXCoreDisassembler);
258881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne}
259