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"
17dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/MC/MCContext.h"
18de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/MC/MCDisassembler/MCDisassembler.h"
19881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne#include "llvm/MC/MCFixedLenDisassembler.h"
2054d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne#include "llvm/MC/MCInst.h"
21881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne#include "llvm/MC/MCSubtargetInfo.h"
22881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne#include "llvm/Support/TargetRegistry.h"
23881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne
24881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborneusing namespace llvm;
25881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne
26dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define DEBUG_TYPE "xcore-disassembler"
27dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
28881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osbornetypedef MCDisassembler::DecodeStatus DecodeStatus;
29881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne
30881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osbornenamespace {
31881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne
32b4d40a04f0639fdec8329a8708565411fa53b5bcRichard Osborne/// \brief A disassembler class for XCore.
33881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborneclass XCoreDisassembler : public MCDisassembler {
34881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osbornepublic:
35dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  XCoreDisassembler(const MCSubtargetInfo &STI, MCContext &Ctx) :
36dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    MCDisassembler(STI, Ctx) {}
37881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne
3837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  DecodeStatus getInstruction(MCInst &Instr, uint64_t &Size,
3937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                              ArrayRef<uint8_t> Bytes, uint64_t Address,
4037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                              raw_ostream &VStream,
4137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                              raw_ostream &CStream) const override;
42881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne};
4354d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne}
44881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne
4537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesstatic bool readInstruction16(ArrayRef<uint8_t> Bytes, uint64_t Address,
4637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                              uint64_t &Size, uint16_t &Insn) {
4754d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  // We want to read exactly 2 Bytes of data.
4837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (Bytes.size() < 2) {
4937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    Size = 0;
5054d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne    return false;
5154d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  }
5254d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  // Encoded as a little-endian 16-bit word in the stream.
5337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  Insn = (Bytes[0] << 0) | (Bytes[1] << 8);
5454d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  return true;
5554d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne}
5654d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne
5737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesstatic bool readInstruction32(ArrayRef<uint8_t> Bytes, uint64_t Address,
5837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                              uint64_t &Size, uint32_t &Insn) {
59c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne  // We want to read exactly 4 Bytes of data.
6037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (Bytes.size() < 4) {
6137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    Size = 0;
62c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne    return false;
63c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne  }
64c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne  // Encoded as a little-endian 32-bit word in the stream.
6537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  Insn =
6637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      (Bytes[0] << 0) | (Bytes[1] << 8) | (Bytes[2] << 16) | (Bytes[3] << 24);
67c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne  return true;
68c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne}
69c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne
7054d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osbornestatic unsigned getReg(const void *D, unsigned RC, unsigned RegNo) {
7154d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  const XCoreDisassembler *Dis = static_cast<const XCoreDisassembler*>(D);
72dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  const MCRegisterInfo *RegInfo = Dis->getContext().getRegisterInfo();
73dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return *(RegInfo->getRegClass(RC).begin() + RegNo);
7454d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne}
7554d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne
7654d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osbornestatic DecodeStatus DecodeGRRegsRegisterClass(MCInst &Inst,
7754d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne                                              unsigned RegNo,
7854d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne                                              uint64_t Address,
7954d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne                                              const void *Decoder);
8054d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne
81c6ff29713d69b4a41c225cbde9c82e4a350dbfacRichard Osbornestatic DecodeStatus DecodeRRegsRegisterClass(MCInst &Inst,
82c6ff29713d69b4a41c225cbde9c82e4a350dbfacRichard Osborne                                             unsigned RegNo,
83c6ff29713d69b4a41c225cbde9c82e4a350dbfacRichard Osborne                                             uint64_t Address,
84c6ff29713d69b4a41c225cbde9c82e4a350dbfacRichard Osborne                                             const void *Decoder);
85c6ff29713d69b4a41c225cbde9c82e4a350dbfacRichard Osborne
8635150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osbornestatic DecodeStatus DecodeBitpOperand(MCInst &Inst, unsigned Val,
8735150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne                                      uint64_t Address, const void *Decoder);
8835150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne
891114b0ec15aaa22dfc0ce582820cea556600d103Richard Osbornestatic DecodeStatus DecodeNegImmOperand(MCInst &Inst, unsigned Val,
901114b0ec15aaa22dfc0ce582820cea556600d103Richard Osborne                                        uint64_t Address, const void *Decoder);
911114b0ec15aaa22dfc0ce582820cea556600d103Richard Osborne
921ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osbornestatic DecodeStatus Decode2RInstruction(MCInst &Inst,
936e43b7f6b20b39b041cf24d732ddb802bbd6471aRichard Osborne                                        unsigned Insn,
941ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne                                        uint64_t Address,
951ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne                                        const void *Decoder);
961ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne
978dc741e400213ea8183e09626f0d1f45f14e044fRichard Osbornestatic DecodeStatus Decode2RImmInstruction(MCInst &Inst,
988dc741e400213ea8183e09626f0d1f45f14e044fRichard Osborne                                           unsigned Insn,
998dc741e400213ea8183e09626f0d1f45f14e044fRichard Osborne                                           uint64_t Address,
1008dc741e400213ea8183e09626f0d1f45f14e044fRichard Osborne                                           const void *Decoder);
1018dc741e400213ea8183e09626f0d1f45f14e044fRichard Osborne
1021ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osbornestatic DecodeStatus DecodeR2RInstruction(MCInst &Inst,
1036e43b7f6b20b39b041cf24d732ddb802bbd6471aRichard Osborne                                         unsigned Insn,
1041ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne                                         uint64_t Address,
1051ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne                                         const void *Decoder);
1061ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne
1071ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osbornestatic DecodeStatus Decode2RSrcDstInstruction(MCInst &Inst,
1086e43b7f6b20b39b041cf24d732ddb802bbd6471aRichard Osborne                                              unsigned Insn,
1091ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne                                              uint64_t Address,
1101ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne                                              const void *Decoder);
1111ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne
11235150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osbornestatic DecodeStatus DecodeRUSInstruction(MCInst &Inst,
11335150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne                                         unsigned Insn,
11435150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne                                         uint64_t Address,
11535150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne                                         const void *Decoder);
11635150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne
11735150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osbornestatic DecodeStatus DecodeRUSBitpInstruction(MCInst &Inst,
11835150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne                                             unsigned Insn,
11935150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne                                             uint64_t Address,
12035150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne                                             const void *Decoder);
12135150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne
12235150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osbornestatic DecodeStatus DecodeRUSSrcDstBitpInstruction(MCInst &Inst,
12335150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne                                                   unsigned Insn,
12435150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne                                                   uint64_t Address,
12535150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne                                                   const void *Decoder);
12635150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne
127c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osbornestatic DecodeStatus DecodeL2RInstruction(MCInst &Inst,
128c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne                                         unsigned Insn,
129c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne                                         uint64_t Address,
130c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne                                         const void *Decoder);
131c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne
132c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osbornestatic DecodeStatus DecodeLR2RInstruction(MCInst &Inst,
133c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne                                          unsigned Insn,
134c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne                                          uint64_t Address,
135c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne                                          const void *Decoder);
136c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne
13762b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osbornestatic DecodeStatus Decode3RInstruction(MCInst &Inst,
13862b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne                                        unsigned Insn,
13962b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne                                        uint64_t Address,
14062b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne                                        const void *Decoder);
14162b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne
142763c858edeb76173ee4ef5ab9bf7d750db5d8c4fRichard Osbornestatic DecodeStatus Decode3RImmInstruction(MCInst &Inst,
143763c858edeb76173ee4ef5ab9bf7d750db5d8c4fRichard Osborne                                           unsigned Insn,
144763c858edeb76173ee4ef5ab9bf7d750db5d8c4fRichard Osborne                                           uint64_t Address,
145763c858edeb76173ee4ef5ab9bf7d750db5d8c4fRichard Osborne                                           const void *Decoder);
146763c858edeb76173ee4ef5ab9bf7d750db5d8c4fRichard Osborne
147a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osbornestatic DecodeStatus Decode2RUSInstruction(MCInst &Inst,
148a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne                                          unsigned Insn,
149a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne                                          uint64_t Address,
150a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne                                          const void *Decoder);
151a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne
152a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osbornestatic DecodeStatus Decode2RUSBitpInstruction(MCInst &Inst,
153a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne                                              unsigned Insn,
154a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne                                              uint64_t Address,
155a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne                                              const void *Decoder);
156a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne
157c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osbornestatic DecodeStatus DecodeL3RInstruction(MCInst &Inst,
158c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne                                         unsigned Insn,
159c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne                                         uint64_t Address,
160c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne                                         const void *Decoder);
161c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne
162c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osbornestatic DecodeStatus DecodeL3RSrcDstInstruction(MCInst &Inst,
163c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne                                               unsigned Insn,
164c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne                                               uint64_t Address,
165c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne                                               const void *Decoder);
166c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne
167b853c415c663c752c669cb191cea95542c1d21f6Richard Osbornestatic DecodeStatus DecodeL2RUSInstruction(MCInst &Inst,
168b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne                                           unsigned Insn,
169b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne                                           uint64_t Address,
170b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne                                           const void *Decoder);
171b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne
172b853c415c663c752c669cb191cea95542c1d21f6Richard Osbornestatic DecodeStatus DecodeL2RUSBitpInstruction(MCInst &Inst,
173b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne                                               unsigned Insn,
174b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne                                               uint64_t Address,
175b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne                                               const void *Decoder);
176b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne
1779e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard Osbornestatic DecodeStatus DecodeL6RInstruction(MCInst &Inst,
1789e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard Osborne                                         unsigned Insn,
1799e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard Osborne                                         uint64_t Address,
1809e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard Osborne                                         const void *Decoder);
1819e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard Osborne
1823b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osbornestatic DecodeStatus DecodeL5RInstruction(MCInst &Inst,
1833b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne                                         unsigned Insn,
1843b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne                                         uint64_t Address,
1853b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne                                         const void *Decoder);
1863b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne
187c47bd9899b639c3384268f871009259c2a94fba4Richard Osbornestatic DecodeStatus DecodeL4RSrcDstInstruction(MCInst &Inst,
188c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne                                               unsigned Insn,
189c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne                                               uint64_t Address,
190c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne                                               const void *Decoder);
191c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne
192c47bd9899b639c3384268f871009259c2a94fba4Richard Osbornestatic DecodeStatus DecodeL4RSrcDstSrcDstInstruction(MCInst &Inst,
193c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne                                                     unsigned Insn,
194c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne                                                     uint64_t Address,
195c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne                                                     const void *Decoder);
196c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne
19754d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne#include "XCoreGenDisassemblerTables.inc"
19854d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne
19954d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osbornestatic DecodeStatus DecodeGRRegsRegisterClass(MCInst &Inst,
20054d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne                                              unsigned RegNo,
20154d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne                                              uint64_t Address,
20254d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne                                              const void *Decoder)
20354d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne{
20454d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  if (RegNo > 11)
20554d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne    return MCDisassembler::Fail;
20654d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  unsigned Reg = getReg(Decoder, XCore::GRRegsRegClassID, RegNo);
2076948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createReg(Reg));
20854d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  return MCDisassembler::Success;
209881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne}
210881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne
211c6ff29713d69b4a41c225cbde9c82e4a350dbfacRichard Osbornestatic DecodeStatus DecodeRRegsRegisterClass(MCInst &Inst,
212c6ff29713d69b4a41c225cbde9c82e4a350dbfacRichard Osborne                                             unsigned RegNo,
213c6ff29713d69b4a41c225cbde9c82e4a350dbfacRichard Osborne                                             uint64_t Address,
214c6ff29713d69b4a41c225cbde9c82e4a350dbfacRichard Osborne                                             const void *Decoder)
215c6ff29713d69b4a41c225cbde9c82e4a350dbfacRichard Osborne{
216c6ff29713d69b4a41c225cbde9c82e4a350dbfacRichard Osborne  if (RegNo > 15)
217c6ff29713d69b4a41c225cbde9c82e4a350dbfacRichard Osborne    return MCDisassembler::Fail;
218c6ff29713d69b4a41c225cbde9c82e4a350dbfacRichard Osborne  unsigned Reg = getReg(Decoder, XCore::RRegsRegClassID, RegNo);
2196948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createReg(Reg));
220c6ff29713d69b4a41c225cbde9c82e4a350dbfacRichard Osborne  return MCDisassembler::Success;
221c6ff29713d69b4a41c225cbde9c82e4a350dbfacRichard Osborne}
222c6ff29713d69b4a41c225cbde9c82e4a350dbfacRichard Osborne
22335150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osbornestatic DecodeStatus DecodeBitpOperand(MCInst &Inst, unsigned Val,
22435150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne                                      uint64_t Address, const void *Decoder) {
22535150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne  if (Val > 11)
22635150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne    return MCDisassembler::Fail;
227f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  static const unsigned Values[] = {
22835150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne    32 /*bpw*/, 1, 2, 3, 4, 5, 6, 7, 8, 16, 24, 32
22935150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne  };
2306948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(Values[Val]));
23135150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne  return MCDisassembler::Success;
23235150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne}
23335150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne
2341114b0ec15aaa22dfc0ce582820cea556600d103Richard Osbornestatic DecodeStatus DecodeNegImmOperand(MCInst &Inst, unsigned Val,
2351114b0ec15aaa22dfc0ce582820cea556600d103Richard Osborne                                        uint64_t Address, const void *Decoder) {
2366948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(-(int64_t)Val));
2371114b0ec15aaa22dfc0ce582820cea556600d103Richard Osborne  return MCDisassembler::Success;
2381114b0ec15aaa22dfc0ce582820cea556600d103Richard Osborne}
2391114b0ec15aaa22dfc0ce582820cea556600d103Richard Osborne
2401ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osbornestatic DecodeStatus
2411ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard OsborneDecode2OpInstruction(unsigned Insn, unsigned &Op1, unsigned &Op2) {
24262b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  unsigned Combined = fieldFromInstruction(Insn, 6, 5);
24362b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  if (Combined < 27)
2441ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne    return MCDisassembler::Fail;
24562b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  if (fieldFromInstruction(Insn, 5, 1)) {
24662b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    if (Combined == 31)
24762b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne      return MCDisassembler::Fail;
24862b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    Combined += 5;
24962b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  }
25062b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  Combined -= 27;
2511ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  unsigned Op1High = Combined % 3;
2521ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  unsigned Op2High = Combined / 3;
2531ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  Op1 = (Op1High << 2) | fieldFromInstruction(Insn, 2, 2);
2541ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  Op2 = (Op2High << 2) | fieldFromInstruction(Insn, 0, 2);
2551ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  return MCDisassembler::Success;
2561ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne}
2571ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne
2581ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osbornestatic DecodeStatus
25962b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard OsborneDecode3OpInstruction(unsigned Insn, unsigned &Op1, unsigned &Op2,
26062b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne                     unsigned &Op3) {
26162b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  unsigned Combined = fieldFromInstruction(Insn, 6, 5);
26262b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  if (Combined >= 27)
26362b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    return MCDisassembler::Fail;
26462b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne
26562b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  unsigned Op1High = Combined % 3;
26662b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  unsigned Op2High = (Combined / 3) % 3;
26762b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  unsigned Op3High = Combined / 9;
26862b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  Op1 = (Op1High << 2) | fieldFromInstruction(Insn, 4, 2);
26962b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  Op2 = (Op2High << 2) | fieldFromInstruction(Insn, 2, 2);
27062b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  Op3 = (Op3High << 2) | fieldFromInstruction(Insn, 0, 2);
27162b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  return MCDisassembler::Success;
27262b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne}
27362b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne
27462b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osbornestatic DecodeStatus
27562b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard OsborneDecode2OpInstructionFail(MCInst &Inst, unsigned Insn, uint64_t Address,
27662b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne                         const void *Decoder) {
27762b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  // Try and decode as a 3R instruction.
27862b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  unsigned Opcode = fieldFromInstruction(Insn, 11, 5);
27962b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  switch (Opcode) {
280a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne  case 0x0:
281a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne    Inst.setOpcode(XCore::STW_2rus);
282a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne    return Decode2RUSInstruction(Inst, Insn, Address, Decoder);
283a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne  case 0x1:
284a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne    Inst.setOpcode(XCore::LDW_2rus);
285a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne    return Decode2RUSInstruction(Inst, Insn, Address, Decoder);
28662b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  case 0x2:
28762b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    Inst.setOpcode(XCore::ADD_3r);
28862b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    return Decode3RInstruction(Inst, Insn, Address, Decoder);
28962b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  case 0x3:
29062b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    Inst.setOpcode(XCore::SUB_3r);
29162b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    return Decode3RInstruction(Inst, Insn, Address, Decoder);
29262b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  case 0x4:
29362b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    Inst.setOpcode(XCore::SHL_3r);
29462b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    return Decode3RInstruction(Inst, Insn, Address, Decoder);
29562b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  case 0x5:
29662b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    Inst.setOpcode(XCore::SHR_3r);
29762b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    return Decode3RInstruction(Inst, Insn, Address, Decoder);
29862b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  case 0x6:
29962b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    Inst.setOpcode(XCore::EQ_3r);
30062b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    return Decode3RInstruction(Inst, Insn, Address, Decoder);
30162b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  case 0x7:
30262b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    Inst.setOpcode(XCore::AND_3r);
30362b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    return Decode3RInstruction(Inst, Insn, Address, Decoder);
30462b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  case 0x8:
30562b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    Inst.setOpcode(XCore::OR_3r);
30662b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    return Decode3RInstruction(Inst, Insn, Address, Decoder);
30762b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  case 0x9:
30862b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    Inst.setOpcode(XCore::LDW_3r);
30962b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    return Decode3RInstruction(Inst, Insn, Address, Decoder);
31062b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  case 0x10:
31162b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    Inst.setOpcode(XCore::LD16S_3r);
31262b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    return Decode3RInstruction(Inst, Insn, Address, Decoder);
31362b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  case 0x11:
31462b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    Inst.setOpcode(XCore::LD8U_3r);
31562b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    return Decode3RInstruction(Inst, Insn, Address, Decoder);
316a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne  case 0x12:
317a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne    Inst.setOpcode(XCore::ADD_2rus);
318a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne    return Decode2RUSInstruction(Inst, Insn, Address, Decoder);
319a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne  case 0x13:
320a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne    Inst.setOpcode(XCore::SUB_2rus);
321a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne    return Decode2RUSInstruction(Inst, Insn, Address, Decoder);
322a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne  case 0x14:
323a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne    Inst.setOpcode(XCore::SHL_2rus);
324a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne    return Decode2RUSBitpInstruction(Inst, Insn, Address, Decoder);
325a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne  case 0x15:
326a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne    Inst.setOpcode(XCore::SHR_2rus);
327a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne    return Decode2RUSBitpInstruction(Inst, Insn, Address, Decoder);
328a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne  case 0x16:
329a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne    Inst.setOpcode(XCore::EQ_2rus);
330a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne    return Decode2RUSInstruction(Inst, Insn, Address, Decoder);
331763c858edeb76173ee4ef5ab9bf7d750db5d8c4fRichard Osborne  case 0x17:
332763c858edeb76173ee4ef5ab9bf7d750db5d8c4fRichard Osborne    Inst.setOpcode(XCore::TSETR_3r);
333763c858edeb76173ee4ef5ab9bf7d750db5d8c4fRichard Osborne    return Decode3RImmInstruction(Inst, Insn, Address, Decoder);
33462b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  case 0x18:
33562b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    Inst.setOpcode(XCore::LSS_3r);
33662b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    return Decode3RInstruction(Inst, Insn, Address, Decoder);
33762b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  case 0x19:
33862b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    Inst.setOpcode(XCore::LSU_3r);
33962b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    return Decode3RInstruction(Inst, Insn, Address, Decoder);
34062b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  }
34162b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  return MCDisassembler::Fail;
34262b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne}
34362b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne
34462b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osbornestatic DecodeStatus
3451ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard OsborneDecode2RInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
3461ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne                    const void *Decoder) {
3471ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  unsigned Op1, Op2;
3481ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  DecodeStatus S = Decode2OpInstruction(Insn, Op1, Op2);
34962b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  if (S != MCDisassembler::Success)
35062b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    return Decode2OpInstructionFail(Inst, Insn, Address, Decoder);
35162b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne
35262b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
35362b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
3541ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  return S;
3551ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne}
3561ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne
3571ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osbornestatic DecodeStatus
3588dc741e400213ea8183e09626f0d1f45f14e044fRichard OsborneDecode2RImmInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
3598dc741e400213ea8183e09626f0d1f45f14e044fRichard Osborne                       const void *Decoder) {
3608dc741e400213ea8183e09626f0d1f45f14e044fRichard Osborne  unsigned Op1, Op2;
3618dc741e400213ea8183e09626f0d1f45f14e044fRichard Osborne  DecodeStatus S = Decode2OpInstruction(Insn, Op1, Op2);
3628dc741e400213ea8183e09626f0d1f45f14e044fRichard Osborne  if (S != MCDisassembler::Success)
3638dc741e400213ea8183e09626f0d1f45f14e044fRichard Osborne    return Decode2OpInstructionFail(Inst, Insn, Address, Decoder);
3648dc741e400213ea8183e09626f0d1f45f14e044fRichard Osborne
3656948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(Op1));
3668dc741e400213ea8183e09626f0d1f45f14e044fRichard Osborne  DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
3678dc741e400213ea8183e09626f0d1f45f14e044fRichard Osborne  return S;
3688dc741e400213ea8183e09626f0d1f45f14e044fRichard Osborne}
3698dc741e400213ea8183e09626f0d1f45f14e044fRichard Osborne
3708dc741e400213ea8183e09626f0d1f45f14e044fRichard Osbornestatic DecodeStatus
3711ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard OsborneDecodeR2RInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
3721ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne                     const void *Decoder) {
3731ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  unsigned Op1, Op2;
3741ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  DecodeStatus S = Decode2OpInstruction(Insn, Op2, Op1);
37562b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  if (S != MCDisassembler::Success)
37662b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    return Decode2OpInstructionFail(Inst, Insn, Address, Decoder);
37762b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne
37862b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
37962b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
3801ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  return S;
3811ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne}
3821ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne
3831ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osbornestatic DecodeStatus
3841ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard OsborneDecode2RSrcDstInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
3851ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne                          const void *Decoder) {
3861ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  unsigned Op1, Op2;
3871ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  DecodeStatus S = Decode2OpInstruction(Insn, Op1, Op2);
38862b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  if (S != MCDisassembler::Success)
38962b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    return Decode2OpInstructionFail(Inst, Insn, Address, Decoder);
39062b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne
39162b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
39262b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
39362b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
3941ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  return S;
3951ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne}
3961ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne
39735150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osbornestatic DecodeStatus
39835150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard OsborneDecodeRUSInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
39935150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne                     const void *Decoder) {
40035150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne  unsigned Op1, Op2;
40135150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne  DecodeStatus S = Decode2OpInstruction(Insn, Op1, Op2);
40262b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  if (S != MCDisassembler::Success)
40362b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    return Decode2OpInstructionFail(Inst, Insn, Address, Decoder);
40462b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne
40562b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
4066948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Inst.addOperand(MCOperand::createImm(Op2));
40735150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne  return S;
40835150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne}
40935150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne
41035150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osbornestatic DecodeStatus
41135150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard OsborneDecodeRUSBitpInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
41235150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne                         const void *Decoder) {
41335150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne  unsigned Op1, Op2;
41435150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne  DecodeStatus S = Decode2OpInstruction(Insn, Op1, Op2);
41562b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  if (S != MCDisassembler::Success)
41662b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    return Decode2OpInstructionFail(Inst, Insn, Address, Decoder);
41762b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne
41862b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
41962b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  DecodeBitpOperand(Inst, Op2, Address, Decoder);
42035150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne  return S;
42135150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne}
42235150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne
42335150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osbornestatic DecodeStatus
42435150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard OsborneDecodeRUSSrcDstBitpInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
42535150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne                               const void *Decoder) {
42635150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne  unsigned Op1, Op2;
42735150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne  DecodeStatus S = Decode2OpInstruction(Insn, Op1, Op2);
42862b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  if (S != MCDisassembler::Success)
42962b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    return Decode2OpInstructionFail(Inst, Insn, Address, Decoder);
43062b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne
43162b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
43262b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
43362b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  DecodeBitpOperand(Inst, Op2, Address, Decoder);
43435150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne  return S;
43535150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne}
43635150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne
437c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osbornestatic DecodeStatus
438c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard OsborneDecodeL2OpInstructionFail(MCInst &Inst, unsigned Insn, uint64_t Address,
439c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne                          const void *Decoder) {
440b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne  // Try and decode as a L3R / L2RUS instruction.
441c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  unsigned Opcode = fieldFromInstruction(Insn, 16, 4) |
442c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne                    fieldFromInstruction(Insn, 27, 5) << 4;
443c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  switch (Opcode) {
444c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  case 0x0c:
4451f375e5bc78647f9b29564eafdc907250ccd91edRichard Osborne    Inst.setOpcode(XCore::STW_l3r);
446c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
447c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  case 0x1c:
448c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    Inst.setOpcode(XCore::XOR_l3r);
449c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
450c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  case 0x2c:
451c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    Inst.setOpcode(XCore::ASHR_l3r);
452c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
453c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  case 0x3c:
454c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    Inst.setOpcode(XCore::LDAWF_l3r);
455c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
456c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  case 0x4c:
457c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    Inst.setOpcode(XCore::LDAWB_l3r);
458c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
459c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  case 0x5c:
460c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    Inst.setOpcode(XCore::LDA16F_l3r);
461c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
462c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  case 0x6c:
463c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    Inst.setOpcode(XCore::LDA16B_l3r);
464c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
465c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  case 0x7c:
466c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    Inst.setOpcode(XCore::MUL_l3r);
467c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
468c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  case 0x8c:
469c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    Inst.setOpcode(XCore::DIVS_l3r);
470c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
471c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  case 0x9c:
472c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    Inst.setOpcode(XCore::DIVU_l3r);
473c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
474c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  case 0x10c:
475c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    Inst.setOpcode(XCore::ST16_l3r);
476c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
477c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  case 0x11c:
478c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    Inst.setOpcode(XCore::ST8_l3r);
479c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
480b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne  case 0x12c:
481b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne    Inst.setOpcode(XCore::ASHR_l2rus);
482b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne    return DecodeL2RUSBitpInstruction(Inst, Insn, Address, Decoder);
483970a479c02a418726950580e13136acd2a2dc13fRichard Osborne  case 0x12d:
484970a479c02a418726950580e13136acd2a2dc13fRichard Osborne    Inst.setOpcode(XCore::OUTPW_l2rus);
485970a479c02a418726950580e13136acd2a2dc13fRichard Osborne    return DecodeL2RUSBitpInstruction(Inst, Insn, Address, Decoder);
486970a479c02a418726950580e13136acd2a2dc13fRichard Osborne  case 0x12e:
487970a479c02a418726950580e13136acd2a2dc13fRichard Osborne    Inst.setOpcode(XCore::INPW_l2rus);
488970a479c02a418726950580e13136acd2a2dc13fRichard Osborne    return DecodeL2RUSBitpInstruction(Inst, Insn, Address, Decoder);
489b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne  case 0x13c:
490b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne    Inst.setOpcode(XCore::LDAWF_l2rus);
491b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne    return DecodeL2RUSInstruction(Inst, Insn, Address, Decoder);
492b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne  case 0x14c:
493b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne    Inst.setOpcode(XCore::LDAWB_l2rus);
494b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne    return DecodeL2RUSInstruction(Inst, Insn, Address, Decoder);
495c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  case 0x15c:
496c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    Inst.setOpcode(XCore::CRC_l3r);
497c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    return DecodeL3RSrcDstInstruction(Inst, Insn, Address, Decoder);
498c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  case 0x18c:
499c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    Inst.setOpcode(XCore::REMS_l3r);
500c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
501c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  case 0x19c:
502c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    Inst.setOpcode(XCore::REMU_l3r);
503c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
504c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  }
505c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  return MCDisassembler::Fail;
506c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne}
507c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne
508c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osbornestatic DecodeStatus
509c47793c62c434bd27fee1d243c2081a34d4f3817Richard OsborneDecodeL2RInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
510c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne                               const void *Decoder) {
511c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne  unsigned Op1, Op2;
512c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne  DecodeStatus S = Decode2OpInstruction(fieldFromInstruction(Insn, 0, 16),
513c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne                                        Op1, Op2);
514c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  if (S != MCDisassembler::Success)
515c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    return DecodeL2OpInstructionFail(Inst, Insn, Address, Decoder);
516c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne
517c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
518c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
519c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne  return S;
520c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne}
521c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne
522c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osbornestatic DecodeStatus
523c47793c62c434bd27fee1d243c2081a34d4f3817Richard OsborneDecodeLR2RInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
524c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne                               const void *Decoder) {
525c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne  unsigned Op1, Op2;
526c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne  DecodeStatus S = Decode2OpInstruction(fieldFromInstruction(Insn, 0, 16),
527c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne                                        Op1, Op2);
528c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  if (S != MCDisassembler::Success)
529c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    return DecodeL2OpInstructionFail(Inst, Insn, Address, Decoder);
530c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne
531c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
532c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
533c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne  return S;
534c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne}
535c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne
53662b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osbornestatic DecodeStatus
53762b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard OsborneDecode3RInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
53862b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne                    const void *Decoder) {
53962b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  unsigned Op1, Op2, Op3;
54062b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  DecodeStatus S = Decode3OpInstruction(Insn, Op1, Op2, Op3);
54162b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  if (S == MCDisassembler::Success) {
54262b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
54362b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
54462b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    DecodeGRRegsRegisterClass(Inst, Op3, Address, Decoder);
54562b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  }
54662b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  return S;
54762b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne}
54862b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne
549a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osbornestatic DecodeStatus
550763c858edeb76173ee4ef5ab9bf7d750db5d8c4fRichard OsborneDecode3RImmInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
551763c858edeb76173ee4ef5ab9bf7d750db5d8c4fRichard Osborne                       const void *Decoder) {
552763c858edeb76173ee4ef5ab9bf7d750db5d8c4fRichard Osborne  unsigned Op1, Op2, Op3;
553763c858edeb76173ee4ef5ab9bf7d750db5d8c4fRichard Osborne  DecodeStatus S = Decode3OpInstruction(Insn, Op1, Op2, Op3);
554763c858edeb76173ee4ef5ab9bf7d750db5d8c4fRichard Osborne  if (S == MCDisassembler::Success) {
5556948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createImm(Op1));
556763c858edeb76173ee4ef5ab9bf7d750db5d8c4fRichard Osborne    DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
557763c858edeb76173ee4ef5ab9bf7d750db5d8c4fRichard Osborne    DecodeGRRegsRegisterClass(Inst, Op3, Address, Decoder);
558763c858edeb76173ee4ef5ab9bf7d750db5d8c4fRichard Osborne  }
559763c858edeb76173ee4ef5ab9bf7d750db5d8c4fRichard Osborne  return S;
560763c858edeb76173ee4ef5ab9bf7d750db5d8c4fRichard Osborne}
561763c858edeb76173ee4ef5ab9bf7d750db5d8c4fRichard Osborne
562763c858edeb76173ee4ef5ab9bf7d750db5d8c4fRichard Osbornestatic DecodeStatus
563a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard OsborneDecode2RUSInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
564a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne                      const void *Decoder) {
565a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne  unsigned Op1, Op2, Op3;
566a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne  DecodeStatus S = Decode3OpInstruction(Insn, Op1, Op2, Op3);
567a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne  if (S == MCDisassembler::Success) {
568a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne    DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
569a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne    DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
5706948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createImm(Op3));
571a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne  }
572a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne  return S;
573a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne}
574a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne
575a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osbornestatic DecodeStatus
576a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard OsborneDecode2RUSBitpInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
577a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne                      const void *Decoder) {
578a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne  unsigned Op1, Op2, Op3;
579a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne  DecodeStatus S = Decode3OpInstruction(Insn, Op1, Op2, Op3);
580a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne  if (S == MCDisassembler::Success) {
581a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne    DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
582a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne    DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
583a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne    DecodeBitpOperand(Inst, Op3, Address, Decoder);
584a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne  }
585a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne  return S;
586a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne}
587a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne
588c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osbornestatic DecodeStatus
589c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard OsborneDecodeL3RInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
590c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne                     const void *Decoder) {
591c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  unsigned Op1, Op2, Op3;
592c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  DecodeStatus S =
593c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    Decode3OpInstruction(fieldFromInstruction(Insn, 0, 16), Op1, Op2, Op3);
594c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  if (S == MCDisassembler::Success) {
595c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
596c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
597c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    DecodeGRRegsRegisterClass(Inst, Op3, Address, Decoder);
598c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  }
599c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  return S;
600c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne}
601c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne
602c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osbornestatic DecodeStatus
603c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard OsborneDecodeL3RSrcDstInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
604c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne                           const void *Decoder) {
605c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  unsigned Op1, Op2, Op3;
606c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  DecodeStatus S =
607c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  Decode3OpInstruction(fieldFromInstruction(Insn, 0, 16), Op1, Op2, Op3);
608c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  if (S == MCDisassembler::Success) {
609c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
610c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
611c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
612c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    DecodeGRRegsRegisterClass(Inst, Op3, Address, Decoder);
613c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  }
614c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  return S;
615c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne}
616c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne
617b853c415c663c752c669cb191cea95542c1d21f6Richard Osbornestatic DecodeStatus
618b853c415c663c752c669cb191cea95542c1d21f6Richard OsborneDecodeL2RUSInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
619b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne                       const void *Decoder) {
620b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne  unsigned Op1, Op2, Op3;
621b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne  DecodeStatus S =
622b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne  Decode3OpInstruction(fieldFromInstruction(Insn, 0, 16), Op1, Op2, Op3);
623b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne  if (S == MCDisassembler::Success) {
624b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne    DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
625b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne    DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
6266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Inst.addOperand(MCOperand::createImm(Op3));
627b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne  }
628b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne  return S;
629b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne}
630b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne
631b853c415c663c752c669cb191cea95542c1d21f6Richard Osbornestatic DecodeStatus
632b853c415c663c752c669cb191cea95542c1d21f6Richard OsborneDecodeL2RUSBitpInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
633b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne                           const void *Decoder) {
634b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne  unsigned Op1, Op2, Op3;
635b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne  DecodeStatus S =
636b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne  Decode3OpInstruction(fieldFromInstruction(Insn, 0, 16), Op1, Op2, Op3);
637b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne  if (S == MCDisassembler::Success) {
638b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne    DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
639b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne    DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
640b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne    DecodeBitpOperand(Inst, Op3, Address, Decoder);
641b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne  }
642b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne  return S;
643b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne}
644b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne
6459e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard Osbornestatic DecodeStatus
6469e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard OsborneDecodeL6RInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
6479e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard Osborne                     const void *Decoder) {
6489e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard Osborne  unsigned Op1, Op2, Op3, Op4, Op5, Op6;
6499e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard Osborne  DecodeStatus S =
6509e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard Osborne    Decode3OpInstruction(fieldFromInstruction(Insn, 0, 16), Op1, Op2, Op3);
6519e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard Osborne  if (S != MCDisassembler::Success)
6529e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard Osborne    return S;
6539e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard Osborne  S = Decode3OpInstruction(fieldFromInstruction(Insn, 16, 16), Op4, Op5, Op6);
6549e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard Osborne  if (S != MCDisassembler::Success)
6559e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard Osborne    return S;
6569e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard Osborne  DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
6579e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard Osborne  DecodeGRRegsRegisterClass(Inst, Op4, Address, Decoder);
6589e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard Osborne  DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
6599e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard Osborne  DecodeGRRegsRegisterClass(Inst, Op3, Address, Decoder);
6609e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard Osborne  DecodeGRRegsRegisterClass(Inst, Op5, Address, Decoder);
6619e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard Osborne  DecodeGRRegsRegisterClass(Inst, Op6, Address, Decoder);
6629e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard Osborne  return S;
6639e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard Osborne}
6649e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard Osborne
6653b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osbornestatic DecodeStatus
6663b6a5eefe0ab2199bc69094b390b736ae332b905Richard OsborneDecodeL5RInstructionFail(MCInst &Inst, unsigned Insn, uint64_t Address,
6673b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne                     const void *Decoder) {
6683b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne  // Try and decode as a L6R instruction.
6693b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne  Inst.clear();
6703b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne  unsigned Opcode = fieldFromInstruction(Insn, 27, 5);
6713b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne  switch (Opcode) {
6723b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne  case 0x00:
6733b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne    Inst.setOpcode(XCore::LMUL_l6r);
6743b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne    return DecodeL6RInstruction(Inst, Insn, Address, Decoder);
6753b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne  }
6763b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne  return MCDisassembler::Fail;
6773b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne}
6783b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne
6793b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osbornestatic DecodeStatus
6803b6a5eefe0ab2199bc69094b390b736ae332b905Richard OsborneDecodeL5RInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
6813b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne                     const void *Decoder) {
6823b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne  unsigned Op1, Op2, Op3, Op4, Op5;
6833b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne  DecodeStatus S =
6843b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne    Decode3OpInstruction(fieldFromInstruction(Insn, 0, 16), Op1, Op2, Op3);
6853b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne  if (S != MCDisassembler::Success)
6863b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne    return DecodeL5RInstructionFail(Inst, Insn, Address, Decoder);
6873b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne  S = Decode2OpInstruction(fieldFromInstruction(Insn, 16, 16), Op4, Op5);
6883b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne  if (S != MCDisassembler::Success)
6893b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne    return DecodeL5RInstructionFail(Inst, Insn, Address, Decoder);
6903b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne
6913b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne  DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
6923b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne  DecodeGRRegsRegisterClass(Inst, Op4, Address, Decoder);
6933b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne  DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
6943b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne  DecodeGRRegsRegisterClass(Inst, Op3, Address, Decoder);
6953b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne  DecodeGRRegsRegisterClass(Inst, Op5, Address, Decoder);
6963b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne  return S;
6973b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne}
6983b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne
699c47bd9899b639c3384268f871009259c2a94fba4Richard Osbornestatic DecodeStatus
700c47bd9899b639c3384268f871009259c2a94fba4Richard OsborneDecodeL4RSrcDstInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
701c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne                           const void *Decoder) {
702c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne  unsigned Op1, Op2, Op3;
703c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne  unsigned Op4 = fieldFromInstruction(Insn, 16, 4);
704c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne  DecodeStatus S =
705c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne    Decode3OpInstruction(fieldFromInstruction(Insn, 0, 16), Op1, Op2, Op3);
706c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne  if (S == MCDisassembler::Success) {
707c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne    DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
708c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne    S = DecodeGRRegsRegisterClass(Inst, Op4, Address, Decoder);
709c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne  }
710c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne  if (S == MCDisassembler::Success) {
711c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne    DecodeGRRegsRegisterClass(Inst, Op4, Address, Decoder);
712c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne    DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
713c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne    DecodeGRRegsRegisterClass(Inst, Op3, Address, Decoder);
714c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne  }
715c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne  return S;
716c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne}
717c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne
718c47bd9899b639c3384268f871009259c2a94fba4Richard Osbornestatic DecodeStatus
719c47bd9899b639c3384268f871009259c2a94fba4Richard OsborneDecodeL4RSrcDstSrcDstInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
720c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne                                 const void *Decoder) {
721c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne  unsigned Op1, Op2, Op3;
722c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne  unsigned Op4 = fieldFromInstruction(Insn, 16, 4);
723c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne  DecodeStatus S =
724c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne  Decode3OpInstruction(fieldFromInstruction(Insn, 0, 16), Op1, Op2, Op3);
725c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne  if (S == MCDisassembler::Success) {
726c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne    DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
727c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne    S = DecodeGRRegsRegisterClass(Inst, Op4, Address, Decoder);
728c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne  }
729c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne  if (S == MCDisassembler::Success) {
730c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne    DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
731c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne    DecodeGRRegsRegisterClass(Inst, Op4, Address, Decoder);
732c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne    DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
733c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne    DecodeGRRegsRegisterClass(Inst, Op3, Address, Decoder);
734c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne  }
735c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne  return S;
736c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne}
737c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne
73837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen HinesMCDisassembler::DecodeStatus XCoreDisassembler::getInstruction(
73937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    MCInst &instr, uint64_t &Size, ArrayRef<uint8_t> Bytes, uint64_t Address,
74037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    raw_ostream &vStream, raw_ostream &cStream) const {
741c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne  uint16_t insn16;
74254d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne
74337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (!readInstruction16(Bytes, Address, Size, insn16)) {
74454d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne    return Fail;
74554d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  }
74654d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne
74754d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  // Calling the auto-generated decoder function.
748c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne  DecodeStatus Result = decodeInstruction(DecoderTable16, instr, insn16,
749c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne                                          Address, this, STI);
75054d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  if (Result != Fail) {
75154d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne    Size = 2;
75254d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne    return Result;
75354d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  }
75454d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne
755c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne  uint32_t insn32;
756c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne
75737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (!readInstruction32(Bytes, Address, Size, insn32)) {
758c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne    return Fail;
759c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne  }
760c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne
761c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne  // Calling the auto-generated decoder function.
762c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne  Result = decodeInstruction(DecoderTable32, instr, insn32, Address, this, STI);
763c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne  if (Result != Fail) {
764c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne    Size = 4;
765c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne    return Result;
766c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne  }
767c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne
768881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne  return Fail;
769881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne}
770881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne
771881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osbornenamespace llvm {
772881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne  extern Target TheXCoreTarget;
773881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne}
774881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne
775881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osbornestatic MCDisassembler *createXCoreDisassembler(const Target &T,
776dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                               const MCSubtargetInfo &STI,
777dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                               MCContext &Ctx) {
778dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return new XCoreDisassembler(STI, Ctx);
779881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne}
780881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne
781881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborneextern "C" void LLVMInitializeXCoreDisassembler() {
782881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne  // Register the disassembler.
783881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne  TargetRegistry::RegisterMCDisassembler(TheXCoreTarget,
784881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne                                         createXCoreDisassembler);
785881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne}
786