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"
18881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne#include "llvm/MC/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/MemoryObject.h"
23881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne#include "llvm/Support/TargetRegistry.h"
24881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne
25881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborneusing namespace llvm;
26881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne
27dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define DEBUG_TYPE "xcore-disassembler"
28dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
29881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osbornetypedef MCDisassembler::DecodeStatus DecodeStatus;
30881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne
31881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osbornenamespace {
32881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne
33b4d40a04f0639fdec8329a8708565411fa53b5bcRichard Osborne/// \brief A disassembler class for XCore.
34881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborneclass XCoreDisassembler : public MCDisassembler {
35881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osbornepublic:
36dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  XCoreDisassembler(const MCSubtargetInfo &STI, MCContext &Ctx) :
37dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    MCDisassembler(STI, Ctx) {}
38881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne
39b4d40a04f0639fdec8329a8708565411fa53b5bcRichard Osborne  /// \brief See MCDisassembler.
40881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne  virtual DecodeStatus getInstruction(MCInst &instr,
41881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne                                      uint64_t &size,
42881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne                                      const MemoryObject &region,
43881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne                                      uint64_t address,
44881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne                                      raw_ostream &vStream,
45dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                      raw_ostream &cStream) const override;
4654d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne
47881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne};
4854d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne}
49881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne
5054d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osbornestatic bool readInstruction16(const MemoryObject &region,
5154d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne                              uint64_t address,
5254d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne                              uint64_t &size,
5354d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne                              uint16_t &insn) {
5454d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  uint8_t Bytes[4];
5554d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne
5654d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  // We want to read exactly 2 Bytes of data.
5749a6a8d8f2994249c81b7914b07015714748a55cBenjamin Kramer  if (region.readBytes(address, 2, Bytes) == -1) {
5854d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne    size = 0;
5954d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne    return false;
6054d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  }
6154d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  // Encoded as a little-endian 16-bit word in the stream.
6254d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  insn = (Bytes[0] <<  0) | (Bytes[1] <<  8);
6354d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  return true;
6454d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne}
6554d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne
66c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osbornestatic bool readInstruction32(const MemoryObject &region,
67c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne                              uint64_t address,
68c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne                              uint64_t &size,
69c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne                              uint32_t &insn) {
70c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne  uint8_t Bytes[4];
71c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne
72c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne  // We want to read exactly 4 Bytes of data.
7349a6a8d8f2994249c81b7914b07015714748a55cBenjamin Kramer  if (region.readBytes(address, 4, Bytes) == -1) {
74c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne    size = 0;
75c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne    return false;
76c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne  }
77c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne  // Encoded as a little-endian 32-bit word in the stream.
78c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne  insn = (Bytes[0] << 0) | (Bytes[1] << 8) | (Bytes[2] << 16) |
79c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne         (Bytes[3] << 24);
80c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne  return true;
81c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne}
82c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne
8354d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osbornestatic unsigned getReg(const void *D, unsigned RC, unsigned RegNo) {
8454d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  const XCoreDisassembler *Dis = static_cast<const XCoreDisassembler*>(D);
85dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  const MCRegisterInfo *RegInfo = Dis->getContext().getRegisterInfo();
86dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return *(RegInfo->getRegClass(RC).begin() + RegNo);
8754d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne}
8854d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne
8954d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osbornestatic DecodeStatus DecodeGRRegsRegisterClass(MCInst &Inst,
9054d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne                                              unsigned RegNo,
9154d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne                                              uint64_t Address,
9254d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne                                              const void *Decoder);
9354d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne
94c6ff29713d69b4a41c225cbde9c82e4a350dbfacRichard Osbornestatic DecodeStatus DecodeRRegsRegisterClass(MCInst &Inst,
95c6ff29713d69b4a41c225cbde9c82e4a350dbfacRichard Osborne                                             unsigned RegNo,
96c6ff29713d69b4a41c225cbde9c82e4a350dbfacRichard Osborne                                             uint64_t Address,
97c6ff29713d69b4a41c225cbde9c82e4a350dbfacRichard Osborne                                             const void *Decoder);
98c6ff29713d69b4a41c225cbde9c82e4a350dbfacRichard Osborne
9935150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osbornestatic DecodeStatus DecodeBitpOperand(MCInst &Inst, unsigned Val,
10035150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne                                      uint64_t Address, const void *Decoder);
10135150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne
1021114b0ec15aaa22dfc0ce582820cea556600d103Richard Osbornestatic DecodeStatus DecodeNegImmOperand(MCInst &Inst, unsigned Val,
1031114b0ec15aaa22dfc0ce582820cea556600d103Richard Osborne                                        uint64_t Address, const void *Decoder);
1041114b0ec15aaa22dfc0ce582820cea556600d103Richard Osborne
1051ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osbornestatic DecodeStatus Decode2RInstruction(MCInst &Inst,
1066e43b7f6b20b39b041cf24d732ddb802bbd6471aRichard Osborne                                        unsigned Insn,
1071ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne                                        uint64_t Address,
1081ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne                                        const void *Decoder);
1091ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne
1108dc741e400213ea8183e09626f0d1f45f14e044fRichard Osbornestatic DecodeStatus Decode2RImmInstruction(MCInst &Inst,
1118dc741e400213ea8183e09626f0d1f45f14e044fRichard Osborne                                           unsigned Insn,
1128dc741e400213ea8183e09626f0d1f45f14e044fRichard Osborne                                           uint64_t Address,
1138dc741e400213ea8183e09626f0d1f45f14e044fRichard Osborne                                           const void *Decoder);
1148dc741e400213ea8183e09626f0d1f45f14e044fRichard Osborne
1151ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osbornestatic DecodeStatus DecodeR2RInstruction(MCInst &Inst,
1166e43b7f6b20b39b041cf24d732ddb802bbd6471aRichard Osborne                                         unsigned Insn,
1171ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne                                         uint64_t Address,
1181ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne                                         const void *Decoder);
1191ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne
1201ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osbornestatic DecodeStatus Decode2RSrcDstInstruction(MCInst &Inst,
1216e43b7f6b20b39b041cf24d732ddb802bbd6471aRichard Osborne                                              unsigned Insn,
1221ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne                                              uint64_t Address,
1231ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne                                              const void *Decoder);
1241ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne
12535150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osbornestatic DecodeStatus DecodeRUSInstruction(MCInst &Inst,
12635150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne                                         unsigned Insn,
12735150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne                                         uint64_t Address,
12835150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne                                         const void *Decoder);
12935150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne
13035150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osbornestatic DecodeStatus DecodeRUSBitpInstruction(MCInst &Inst,
13135150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne                                             unsigned Insn,
13235150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne                                             uint64_t Address,
13335150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne                                             const void *Decoder);
13435150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne
13535150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osbornestatic DecodeStatus DecodeRUSSrcDstBitpInstruction(MCInst &Inst,
13635150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne                                                   unsigned Insn,
13735150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne                                                   uint64_t Address,
13835150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne                                                   const void *Decoder);
13935150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne
140c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osbornestatic DecodeStatus DecodeL2RInstruction(MCInst &Inst,
141c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne                                         unsigned Insn,
142c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne                                         uint64_t Address,
143c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne                                         const void *Decoder);
144c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne
145c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osbornestatic DecodeStatus DecodeLR2RInstruction(MCInst &Inst,
146c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne                                          unsigned Insn,
147c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne                                          uint64_t Address,
148c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne                                          const void *Decoder);
149c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne
15062b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osbornestatic DecodeStatus Decode3RInstruction(MCInst &Inst,
15162b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne                                        unsigned Insn,
15262b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne                                        uint64_t Address,
15362b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne                                        const void *Decoder);
15462b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne
155763c858edeb76173ee4ef5ab9bf7d750db5d8c4fRichard Osbornestatic DecodeStatus Decode3RImmInstruction(MCInst &Inst,
156763c858edeb76173ee4ef5ab9bf7d750db5d8c4fRichard Osborne                                           unsigned Insn,
157763c858edeb76173ee4ef5ab9bf7d750db5d8c4fRichard Osborne                                           uint64_t Address,
158763c858edeb76173ee4ef5ab9bf7d750db5d8c4fRichard Osborne                                           const void *Decoder);
159763c858edeb76173ee4ef5ab9bf7d750db5d8c4fRichard Osborne
160a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osbornestatic DecodeStatus Decode2RUSInstruction(MCInst &Inst,
161a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne                                          unsigned Insn,
162a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne                                          uint64_t Address,
163a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne                                          const void *Decoder);
164a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne
165a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osbornestatic DecodeStatus Decode2RUSBitpInstruction(MCInst &Inst,
166a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne                                              unsigned Insn,
167a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne                                              uint64_t Address,
168a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne                                              const void *Decoder);
169a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne
170c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osbornestatic DecodeStatus DecodeL3RInstruction(MCInst &Inst,
171c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne                                         unsigned Insn,
172c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne                                         uint64_t Address,
173c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne                                         const void *Decoder);
174c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne
175c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osbornestatic DecodeStatus DecodeL3RSrcDstInstruction(MCInst &Inst,
176c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne                                               unsigned Insn,
177c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne                                               uint64_t Address,
178c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne                                               const void *Decoder);
179c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne
180b853c415c663c752c669cb191cea95542c1d21f6Richard Osbornestatic DecodeStatus DecodeL2RUSInstruction(MCInst &Inst,
181b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne                                           unsigned Insn,
182b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne                                           uint64_t Address,
183b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne                                           const void *Decoder);
184b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne
185b853c415c663c752c669cb191cea95542c1d21f6Richard Osbornestatic DecodeStatus DecodeL2RUSBitpInstruction(MCInst &Inst,
186b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne                                               unsigned Insn,
187b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne                                               uint64_t Address,
188b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne                                               const void *Decoder);
189b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne
1909e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard Osbornestatic DecodeStatus DecodeL6RInstruction(MCInst &Inst,
1919e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard Osborne                                         unsigned Insn,
1929e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard Osborne                                         uint64_t Address,
1939e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard Osborne                                         const void *Decoder);
1949e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard Osborne
1953b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osbornestatic DecodeStatus DecodeL5RInstruction(MCInst &Inst,
1963b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne                                         unsigned Insn,
1973b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne                                         uint64_t Address,
1983b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne                                         const void *Decoder);
1993b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne
200c47bd9899b639c3384268f871009259c2a94fba4Richard Osbornestatic DecodeStatus DecodeL4RSrcDstInstruction(MCInst &Inst,
201c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne                                               unsigned Insn,
202c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne                                               uint64_t Address,
203c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne                                               const void *Decoder);
204c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne
205c47bd9899b639c3384268f871009259c2a94fba4Richard Osbornestatic DecodeStatus DecodeL4RSrcDstSrcDstInstruction(MCInst &Inst,
206c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne                                                     unsigned Insn,
207c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne                                                     uint64_t Address,
208c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne                                                     const void *Decoder);
209c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne
21054d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne#include "XCoreGenDisassemblerTables.inc"
21154d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne
21254d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osbornestatic DecodeStatus DecodeGRRegsRegisterClass(MCInst &Inst,
21354d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne                                              unsigned RegNo,
21454d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne                                              uint64_t Address,
21554d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne                                              const void *Decoder)
21654d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne{
21754d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  if (RegNo > 11)
21854d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne    return MCDisassembler::Fail;
21954d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  unsigned Reg = getReg(Decoder, XCore::GRRegsRegClassID, RegNo);
22054d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  Inst.addOperand(MCOperand::CreateReg(Reg));
22154d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  return MCDisassembler::Success;
222881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne}
223881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne
224c6ff29713d69b4a41c225cbde9c82e4a350dbfacRichard Osbornestatic DecodeStatus DecodeRRegsRegisterClass(MCInst &Inst,
225c6ff29713d69b4a41c225cbde9c82e4a350dbfacRichard Osborne                                             unsigned RegNo,
226c6ff29713d69b4a41c225cbde9c82e4a350dbfacRichard Osborne                                             uint64_t Address,
227c6ff29713d69b4a41c225cbde9c82e4a350dbfacRichard Osborne                                             const void *Decoder)
228c6ff29713d69b4a41c225cbde9c82e4a350dbfacRichard Osborne{
229c6ff29713d69b4a41c225cbde9c82e4a350dbfacRichard Osborne  if (RegNo > 15)
230c6ff29713d69b4a41c225cbde9c82e4a350dbfacRichard Osborne    return MCDisassembler::Fail;
231c6ff29713d69b4a41c225cbde9c82e4a350dbfacRichard Osborne  unsigned Reg = getReg(Decoder, XCore::RRegsRegClassID, RegNo);
232c6ff29713d69b4a41c225cbde9c82e4a350dbfacRichard Osborne  Inst.addOperand(MCOperand::CreateReg(Reg));
233c6ff29713d69b4a41c225cbde9c82e4a350dbfacRichard Osborne  return MCDisassembler::Success;
234c6ff29713d69b4a41c225cbde9c82e4a350dbfacRichard Osborne}
235c6ff29713d69b4a41c225cbde9c82e4a350dbfacRichard Osborne
23635150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osbornestatic DecodeStatus DecodeBitpOperand(MCInst &Inst, unsigned Val,
23735150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne                                      uint64_t Address, const void *Decoder) {
23835150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne  if (Val > 11)
23935150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne    return MCDisassembler::Fail;
24035150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne  static unsigned Values[] = {
24135150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne    32 /*bpw*/, 1, 2, 3, 4, 5, 6, 7, 8, 16, 24, 32
24235150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne  };
24335150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne  Inst.addOperand(MCOperand::CreateImm(Values[Val]));
24435150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne  return MCDisassembler::Success;
24535150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne}
24635150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne
2471114b0ec15aaa22dfc0ce582820cea556600d103Richard Osbornestatic DecodeStatus DecodeNegImmOperand(MCInst &Inst, unsigned Val,
2481114b0ec15aaa22dfc0ce582820cea556600d103Richard Osborne                                        uint64_t Address, const void *Decoder) {
2491114b0ec15aaa22dfc0ce582820cea556600d103Richard Osborne  Inst.addOperand(MCOperand::CreateImm(-(int64_t)Val));
2501114b0ec15aaa22dfc0ce582820cea556600d103Richard Osborne  return MCDisassembler::Success;
2511114b0ec15aaa22dfc0ce582820cea556600d103Richard Osborne}
2521114b0ec15aaa22dfc0ce582820cea556600d103Richard Osborne
2531ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osbornestatic DecodeStatus
2541ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard OsborneDecode2OpInstruction(unsigned Insn, unsigned &Op1, unsigned &Op2) {
25562b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  unsigned Combined = fieldFromInstruction(Insn, 6, 5);
25662b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  if (Combined < 27)
2571ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne    return MCDisassembler::Fail;
25862b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  if (fieldFromInstruction(Insn, 5, 1)) {
25962b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    if (Combined == 31)
26062b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne      return MCDisassembler::Fail;
26162b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    Combined += 5;
26262b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  }
26362b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  Combined -= 27;
2641ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  unsigned Op1High = Combined % 3;
2651ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  unsigned Op2High = Combined / 3;
2661ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  Op1 = (Op1High << 2) | fieldFromInstruction(Insn, 2, 2);
2671ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  Op2 = (Op2High << 2) | fieldFromInstruction(Insn, 0, 2);
2681ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  return MCDisassembler::Success;
2691ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne}
2701ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne
2711ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osbornestatic DecodeStatus
27262b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard OsborneDecode3OpInstruction(unsigned Insn, unsigned &Op1, unsigned &Op2,
27362b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne                     unsigned &Op3) {
27462b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  unsigned Combined = fieldFromInstruction(Insn, 6, 5);
27562b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  if (Combined >= 27)
27662b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    return MCDisassembler::Fail;
27762b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne
27862b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  unsigned Op1High = Combined % 3;
27962b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  unsigned Op2High = (Combined / 3) % 3;
28062b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  unsigned Op3High = Combined / 9;
28162b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  Op1 = (Op1High << 2) | fieldFromInstruction(Insn, 4, 2);
28262b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  Op2 = (Op2High << 2) | fieldFromInstruction(Insn, 2, 2);
28362b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  Op3 = (Op3High << 2) | fieldFromInstruction(Insn, 0, 2);
28462b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  return MCDisassembler::Success;
28562b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne}
28662b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne
28762b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osbornestatic DecodeStatus
28862b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard OsborneDecode2OpInstructionFail(MCInst &Inst, unsigned Insn, uint64_t Address,
28962b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne                         const void *Decoder) {
29062b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  // Try and decode as a 3R instruction.
29162b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  unsigned Opcode = fieldFromInstruction(Insn, 11, 5);
29262b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  switch (Opcode) {
293a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne  case 0x0:
294a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne    Inst.setOpcode(XCore::STW_2rus);
295a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne    return Decode2RUSInstruction(Inst, Insn, Address, Decoder);
296a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne  case 0x1:
297a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne    Inst.setOpcode(XCore::LDW_2rus);
298a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne    return Decode2RUSInstruction(Inst, Insn, Address, Decoder);
29962b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  case 0x2:
30062b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    Inst.setOpcode(XCore::ADD_3r);
30162b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    return Decode3RInstruction(Inst, Insn, Address, Decoder);
30262b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  case 0x3:
30362b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    Inst.setOpcode(XCore::SUB_3r);
30462b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    return Decode3RInstruction(Inst, Insn, Address, Decoder);
30562b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  case 0x4:
30662b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    Inst.setOpcode(XCore::SHL_3r);
30762b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    return Decode3RInstruction(Inst, Insn, Address, Decoder);
30862b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  case 0x5:
30962b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    Inst.setOpcode(XCore::SHR_3r);
31062b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    return Decode3RInstruction(Inst, Insn, Address, Decoder);
31162b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  case 0x6:
31262b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    Inst.setOpcode(XCore::EQ_3r);
31362b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    return Decode3RInstruction(Inst, Insn, Address, Decoder);
31462b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  case 0x7:
31562b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    Inst.setOpcode(XCore::AND_3r);
31662b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    return Decode3RInstruction(Inst, Insn, Address, Decoder);
31762b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  case 0x8:
31862b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    Inst.setOpcode(XCore::OR_3r);
31962b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    return Decode3RInstruction(Inst, Insn, Address, Decoder);
32062b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  case 0x9:
32162b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    Inst.setOpcode(XCore::LDW_3r);
32262b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    return Decode3RInstruction(Inst, Insn, Address, Decoder);
32362b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  case 0x10:
32462b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    Inst.setOpcode(XCore::LD16S_3r);
32562b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    return Decode3RInstruction(Inst, Insn, Address, Decoder);
32662b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  case 0x11:
32762b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    Inst.setOpcode(XCore::LD8U_3r);
32862b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    return Decode3RInstruction(Inst, Insn, Address, Decoder);
329a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne  case 0x12:
330a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne    Inst.setOpcode(XCore::ADD_2rus);
331a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne    return Decode2RUSInstruction(Inst, Insn, Address, Decoder);
332a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne  case 0x13:
333a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne    Inst.setOpcode(XCore::SUB_2rus);
334a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne    return Decode2RUSInstruction(Inst, Insn, Address, Decoder);
335a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne  case 0x14:
336a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne    Inst.setOpcode(XCore::SHL_2rus);
337a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne    return Decode2RUSBitpInstruction(Inst, Insn, Address, Decoder);
338a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne  case 0x15:
339a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne    Inst.setOpcode(XCore::SHR_2rus);
340a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne    return Decode2RUSBitpInstruction(Inst, Insn, Address, Decoder);
341a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne  case 0x16:
342a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne    Inst.setOpcode(XCore::EQ_2rus);
343a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne    return Decode2RUSInstruction(Inst, Insn, Address, Decoder);
344763c858edeb76173ee4ef5ab9bf7d750db5d8c4fRichard Osborne  case 0x17:
345763c858edeb76173ee4ef5ab9bf7d750db5d8c4fRichard Osborne    Inst.setOpcode(XCore::TSETR_3r);
346763c858edeb76173ee4ef5ab9bf7d750db5d8c4fRichard Osborne    return Decode3RImmInstruction(Inst, Insn, Address, Decoder);
34762b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  case 0x18:
34862b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    Inst.setOpcode(XCore::LSS_3r);
34962b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    return Decode3RInstruction(Inst, Insn, Address, Decoder);
35062b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  case 0x19:
35162b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    Inst.setOpcode(XCore::LSU_3r);
35262b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    return Decode3RInstruction(Inst, Insn, Address, Decoder);
35362b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  }
35462b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  return MCDisassembler::Fail;
35562b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne}
35662b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne
35762b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osbornestatic DecodeStatus
3581ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard OsborneDecode2RInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
3591ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne                    const void *Decoder) {
3601ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  unsigned Op1, Op2;
3611ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  DecodeStatus S = Decode2OpInstruction(Insn, Op1, Op2);
36262b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  if (S != MCDisassembler::Success)
36362b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    return Decode2OpInstructionFail(Inst, Insn, Address, Decoder);
36462b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne
36562b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
36662b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
3671ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  return S;
3681ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne}
3691ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne
3701ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osbornestatic DecodeStatus
3718dc741e400213ea8183e09626f0d1f45f14e044fRichard OsborneDecode2RImmInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
3728dc741e400213ea8183e09626f0d1f45f14e044fRichard Osborne                       const void *Decoder) {
3738dc741e400213ea8183e09626f0d1f45f14e044fRichard Osborne  unsigned Op1, Op2;
3748dc741e400213ea8183e09626f0d1f45f14e044fRichard Osborne  DecodeStatus S = Decode2OpInstruction(Insn, Op1, Op2);
3758dc741e400213ea8183e09626f0d1f45f14e044fRichard Osborne  if (S != MCDisassembler::Success)
3768dc741e400213ea8183e09626f0d1f45f14e044fRichard Osborne    return Decode2OpInstructionFail(Inst, Insn, Address, Decoder);
3778dc741e400213ea8183e09626f0d1f45f14e044fRichard Osborne
3788dc741e400213ea8183e09626f0d1f45f14e044fRichard Osborne  Inst.addOperand(MCOperand::CreateImm(Op1));
3798dc741e400213ea8183e09626f0d1f45f14e044fRichard Osborne  DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
3808dc741e400213ea8183e09626f0d1f45f14e044fRichard Osborne  return S;
3818dc741e400213ea8183e09626f0d1f45f14e044fRichard Osborne}
3828dc741e400213ea8183e09626f0d1f45f14e044fRichard Osborne
3838dc741e400213ea8183e09626f0d1f45f14e044fRichard Osbornestatic DecodeStatus
3841ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard OsborneDecodeR2RInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
3851ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne                     const void *Decoder) {
3861ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  unsigned Op1, Op2;
3871ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  DecodeStatus S = Decode2OpInstruction(Insn, Op2, Op1);
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, Op2, Address, Decoder);
3931ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  return S;
3941ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne}
3951ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne
3961ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osbornestatic DecodeStatus
3971ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard OsborneDecode2RSrcDstInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
3981ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne                          const void *Decoder) {
3991ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  unsigned Op1, Op2;
4001ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  DecodeStatus S = Decode2OpInstruction(Insn, Op1, Op2);
40162b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  if (S != MCDisassembler::Success)
40262b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    return Decode2OpInstructionFail(Inst, Insn, Address, Decoder);
40362b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne
40462b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
40562b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
40662b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
4071ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne  return S;
4081ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne}
4091ffe48a84b398e8cebbdc7a47bedb57e1e67e63fRichard Osborne
41035150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osbornestatic DecodeStatus
41135150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard OsborneDecodeRUSInstruction(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  Inst.addOperand(MCOperand::CreateImm(Op2));
42035150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne  return S;
42135150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne}
42235150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne
42335150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osbornestatic DecodeStatus
42435150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard OsborneDecodeRUSBitpInstruction(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  DecodeBitpOperand(Inst, Op2, Address, Decoder);
43335150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne  return S;
43435150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne}
43535150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne
43635150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osbornestatic DecodeStatus
43735150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard OsborneDecodeRUSSrcDstBitpInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
43835150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne                               const void *Decoder) {
43935150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne  unsigned Op1, Op2;
44035150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne  DecodeStatus S = Decode2OpInstruction(Insn, Op1, Op2);
44162b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  if (S != MCDisassembler::Success)
44262b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    return Decode2OpInstructionFail(Inst, Insn, Address, Decoder);
44362b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne
44462b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
44562b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
44662b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  DecodeBitpOperand(Inst, Op2, Address, Decoder);
44735150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne  return S;
44835150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne}
44935150cbf4166ae8d69032d355f1e8d83b4a6eb3cRichard Osborne
450c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osbornestatic DecodeStatus
451c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard OsborneDecodeL2OpInstructionFail(MCInst &Inst, unsigned Insn, uint64_t Address,
452c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne                          const void *Decoder) {
453b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne  // Try and decode as a L3R / L2RUS instruction.
454c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  unsigned Opcode = fieldFromInstruction(Insn, 16, 4) |
455c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne                    fieldFromInstruction(Insn, 27, 5) << 4;
456c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  switch (Opcode) {
457c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  case 0x0c:
4581f375e5bc78647f9b29564eafdc907250ccd91edRichard Osborne    Inst.setOpcode(XCore::STW_l3r);
459c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
460c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  case 0x1c:
461c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    Inst.setOpcode(XCore::XOR_l3r);
462c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
463c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  case 0x2c:
464c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    Inst.setOpcode(XCore::ASHR_l3r);
465c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
466c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  case 0x3c:
467c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    Inst.setOpcode(XCore::LDAWF_l3r);
468c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
469c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  case 0x4c:
470c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    Inst.setOpcode(XCore::LDAWB_l3r);
471c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
472c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  case 0x5c:
473c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    Inst.setOpcode(XCore::LDA16F_l3r);
474c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
475c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  case 0x6c:
476c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    Inst.setOpcode(XCore::LDA16B_l3r);
477c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
478c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  case 0x7c:
479c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    Inst.setOpcode(XCore::MUL_l3r);
480c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
481c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  case 0x8c:
482c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    Inst.setOpcode(XCore::DIVS_l3r);
483c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
484c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  case 0x9c:
485c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    Inst.setOpcode(XCore::DIVU_l3r);
486c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
487c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  case 0x10c:
488c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    Inst.setOpcode(XCore::ST16_l3r);
489c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
490c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  case 0x11c:
491c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    Inst.setOpcode(XCore::ST8_l3r);
492c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
493b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne  case 0x12c:
494b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne    Inst.setOpcode(XCore::ASHR_l2rus);
495b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne    return DecodeL2RUSBitpInstruction(Inst, Insn, Address, Decoder);
496970a479c02a418726950580e13136acd2a2dc13fRichard Osborne  case 0x12d:
497970a479c02a418726950580e13136acd2a2dc13fRichard Osborne    Inst.setOpcode(XCore::OUTPW_l2rus);
498970a479c02a418726950580e13136acd2a2dc13fRichard Osborne    return DecodeL2RUSBitpInstruction(Inst, Insn, Address, Decoder);
499970a479c02a418726950580e13136acd2a2dc13fRichard Osborne  case 0x12e:
500970a479c02a418726950580e13136acd2a2dc13fRichard Osborne    Inst.setOpcode(XCore::INPW_l2rus);
501970a479c02a418726950580e13136acd2a2dc13fRichard Osborne    return DecodeL2RUSBitpInstruction(Inst, Insn, Address, Decoder);
502b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne  case 0x13c:
503b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne    Inst.setOpcode(XCore::LDAWF_l2rus);
504b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne    return DecodeL2RUSInstruction(Inst, Insn, Address, Decoder);
505b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne  case 0x14c:
506b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne    Inst.setOpcode(XCore::LDAWB_l2rus);
507b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne    return DecodeL2RUSInstruction(Inst, Insn, Address, Decoder);
508c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  case 0x15c:
509c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    Inst.setOpcode(XCore::CRC_l3r);
510c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    return DecodeL3RSrcDstInstruction(Inst, Insn, Address, Decoder);
511c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  case 0x18c:
512c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    Inst.setOpcode(XCore::REMS_l3r);
513c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
514c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  case 0x19c:
515c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    Inst.setOpcode(XCore::REMU_l3r);
516c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
517c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  }
518c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  return MCDisassembler::Fail;
519c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne}
520c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne
521c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osbornestatic DecodeStatus
522c47793c62c434bd27fee1d243c2081a34d4f3817Richard OsborneDecodeL2RInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
523c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne                               const void *Decoder) {
524c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne  unsigned Op1, Op2;
525c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne  DecodeStatus S = Decode2OpInstruction(fieldFromInstruction(Insn, 0, 16),
526c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne                                        Op1, Op2);
527c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  if (S != MCDisassembler::Success)
528c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    return DecodeL2OpInstructionFail(Inst, Insn, Address, Decoder);
529c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne
530c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
531c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
532c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne  return S;
533c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne}
534c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne
535c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osbornestatic DecodeStatus
536c47793c62c434bd27fee1d243c2081a34d4f3817Richard OsborneDecodeLR2RInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
537c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne                               const void *Decoder) {
538c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne  unsigned Op1, Op2;
539c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne  DecodeStatus S = Decode2OpInstruction(fieldFromInstruction(Insn, 0, 16),
540c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne                                        Op1, Op2);
541c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  if (S != MCDisassembler::Success)
542c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    return DecodeL2OpInstructionFail(Inst, Insn, Address, Decoder);
543c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne
544c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
545c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
546c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne  return S;
547c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne}
548c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne
54962b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osbornestatic DecodeStatus
55062b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard OsborneDecode3RInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
55162b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne                    const void *Decoder) {
55262b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  unsigned Op1, Op2, Op3;
55362b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  DecodeStatus S = Decode3OpInstruction(Insn, Op1, Op2, Op3);
55462b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  if (S == MCDisassembler::Success) {
55562b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
55662b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
55762b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne    DecodeGRRegsRegisterClass(Inst, Op3, Address, Decoder);
55862b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  }
55962b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne  return S;
56062b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne}
56162b8786d12ceacafd665d4a1fbb6e90af0ec368cRichard Osborne
562a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osbornestatic DecodeStatus
563763c858edeb76173ee4ef5ab9bf7d750db5d8c4fRichard OsborneDecode3RImmInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
564763c858edeb76173ee4ef5ab9bf7d750db5d8c4fRichard Osborne                       const void *Decoder) {
565763c858edeb76173ee4ef5ab9bf7d750db5d8c4fRichard Osborne  unsigned Op1, Op2, Op3;
566763c858edeb76173ee4ef5ab9bf7d750db5d8c4fRichard Osborne  DecodeStatus S = Decode3OpInstruction(Insn, Op1, Op2, Op3);
567763c858edeb76173ee4ef5ab9bf7d750db5d8c4fRichard Osborne  if (S == MCDisassembler::Success) {
568763c858edeb76173ee4ef5ab9bf7d750db5d8c4fRichard Osborne    Inst.addOperand(MCOperand::CreateImm(Op1));
569763c858edeb76173ee4ef5ab9bf7d750db5d8c4fRichard Osborne    DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
570763c858edeb76173ee4ef5ab9bf7d750db5d8c4fRichard Osborne    DecodeGRRegsRegisterClass(Inst, Op3, Address, Decoder);
571763c858edeb76173ee4ef5ab9bf7d750db5d8c4fRichard Osborne  }
572763c858edeb76173ee4ef5ab9bf7d750db5d8c4fRichard Osborne  return S;
573763c858edeb76173ee4ef5ab9bf7d750db5d8c4fRichard Osborne}
574763c858edeb76173ee4ef5ab9bf7d750db5d8c4fRichard Osborne
575763c858edeb76173ee4ef5ab9bf7d750db5d8c4fRichard Osbornestatic DecodeStatus
576a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard OsborneDecode2RUSInstruction(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    Inst.addOperand(MCOperand::CreateImm(Op3));
584a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne  }
585a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne  return S;
586a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne}
587a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne
588a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osbornestatic DecodeStatus
589a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard OsborneDecode2RUSBitpInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
590a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne                      const void *Decoder) {
591a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne  unsigned Op1, Op2, Op3;
592a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne  DecodeStatus S = Decode3OpInstruction(Insn, Op1, Op2, Op3);
593a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne  if (S == MCDisassembler::Success) {
594a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne    DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
595a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne    DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
596a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne    DecodeBitpOperand(Inst, Op3, Address, Decoder);
597a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne  }
598a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne  return S;
599a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne}
600a68c64fbb2f1bee7f9313f3ee19c35677563f974Richard Osborne
601c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osbornestatic DecodeStatus
602c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard OsborneDecodeL3RInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
603c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne                     const void *Decoder) {
604c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  unsigned Op1, Op2, Op3;
605c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  DecodeStatus S =
606c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    Decode3OpInstruction(fieldFromInstruction(Insn, 0, 16), Op1, Op2, Op3);
607c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  if (S == MCDisassembler::Success) {
608c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
609c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
610c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    DecodeGRRegsRegisterClass(Inst, Op3, Address, Decoder);
611c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  }
612c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  return S;
613c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne}
614c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne
615c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osbornestatic DecodeStatus
616c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard OsborneDecodeL3RSrcDstInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
617c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne                           const void *Decoder) {
618c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  unsigned Op1, Op2, Op3;
619c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  DecodeStatus S =
620c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  Decode3OpInstruction(fieldFromInstruction(Insn, 0, 16), Op1, Op2, Op3);
621c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  if (S == MCDisassembler::Success) {
622c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
623c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
624c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
625c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne    DecodeGRRegsRegisterClass(Inst, Op3, Address, Decoder);
626c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  }
627c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne  return S;
628c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne}
629c78ec6b6bc05572aed6af1eee4349d76a68ded18Richard Osborne
630b853c415c663c752c669cb191cea95542c1d21f6Richard Osbornestatic DecodeStatus
631b853c415c663c752c669cb191cea95542c1d21f6Richard OsborneDecodeL2RUSInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
632b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne                       const void *Decoder) {
633b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne  unsigned Op1, Op2, Op3;
634b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne  DecodeStatus S =
635b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne  Decode3OpInstruction(fieldFromInstruction(Insn, 0, 16), Op1, Op2, Op3);
636b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne  if (S == MCDisassembler::Success) {
637b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne    DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
638b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne    DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
639b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne    Inst.addOperand(MCOperand::CreateImm(Op3));
640b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne  }
641b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne  return S;
642b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne}
643b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne
644b853c415c663c752c669cb191cea95542c1d21f6Richard Osbornestatic DecodeStatus
645b853c415c663c752c669cb191cea95542c1d21f6Richard OsborneDecodeL2RUSBitpInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
646b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne                           const void *Decoder) {
647b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne  unsigned Op1, Op2, Op3;
648b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne  DecodeStatus S =
649b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne  Decode3OpInstruction(fieldFromInstruction(Insn, 0, 16), Op1, Op2, Op3);
650b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne  if (S == MCDisassembler::Success) {
651b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne    DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
652b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne    DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
653b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne    DecodeBitpOperand(Inst, Op3, Address, Decoder);
654b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne  }
655b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne  return S;
656b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne}
657b853c415c663c752c669cb191cea95542c1d21f6Richard Osborne
6589e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard Osbornestatic DecodeStatus
6599e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard OsborneDecodeL6RInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
6609e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard Osborne                     const void *Decoder) {
6619e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard Osborne  unsigned Op1, Op2, Op3, Op4, Op5, Op6;
6629e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard Osborne  DecodeStatus S =
6639e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard Osborne    Decode3OpInstruction(fieldFromInstruction(Insn, 0, 16), Op1, Op2, Op3);
6649e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard Osborne  if (S != MCDisassembler::Success)
6659e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard Osborne    return S;
6669e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard Osborne  S = Decode3OpInstruction(fieldFromInstruction(Insn, 16, 16), Op4, Op5, Op6);
6679e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard Osborne  if (S != MCDisassembler::Success)
6689e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard Osborne    return S;
6699e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard Osborne  DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
6709e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard Osborne  DecodeGRRegsRegisterClass(Inst, Op4, Address, Decoder);
6719e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard Osborne  DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
6729e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard Osborne  DecodeGRRegsRegisterClass(Inst, Op3, Address, Decoder);
6739e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard Osborne  DecodeGRRegsRegisterClass(Inst, Op5, Address, Decoder);
6749e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard Osborne  DecodeGRRegsRegisterClass(Inst, Op6, Address, Decoder);
6759e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard Osborne  return S;
6769e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard Osborne}
6779e6a5a37460ff82ad4e3a7aea1c45e2c934ab25bRichard Osborne
6783b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osbornestatic DecodeStatus
6793b6a5eefe0ab2199bc69094b390b736ae332b905Richard OsborneDecodeL5RInstructionFail(MCInst &Inst, unsigned Insn, uint64_t Address,
6803b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne                     const void *Decoder) {
6813b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne  // Try and decode as a L6R instruction.
6823b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne  Inst.clear();
6833b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne  unsigned Opcode = fieldFromInstruction(Insn, 27, 5);
6843b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne  switch (Opcode) {
6853b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne  case 0x00:
6863b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne    Inst.setOpcode(XCore::LMUL_l6r);
6873b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne    return DecodeL6RInstruction(Inst, Insn, Address, Decoder);
6883b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne  }
6893b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne  return MCDisassembler::Fail;
6903b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne}
6913b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne
6923b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osbornestatic DecodeStatus
6933b6a5eefe0ab2199bc69094b390b736ae332b905Richard OsborneDecodeL5RInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
6943b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne                     const void *Decoder) {
6953b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne  unsigned Op1, Op2, Op3, Op4, Op5;
6963b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne  DecodeStatus S =
6973b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne    Decode3OpInstruction(fieldFromInstruction(Insn, 0, 16), Op1, Op2, Op3);
6983b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne  if (S != MCDisassembler::Success)
6993b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne    return DecodeL5RInstructionFail(Inst, Insn, Address, Decoder);
7003b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne  S = Decode2OpInstruction(fieldFromInstruction(Insn, 16, 16), Op4, Op5);
7013b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne  if (S != MCDisassembler::Success)
7023b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne    return DecodeL5RInstructionFail(Inst, Insn, Address, Decoder);
7033b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne
7043b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne  DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
7053b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne  DecodeGRRegsRegisterClass(Inst, Op4, Address, Decoder);
7063b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne  DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
7073b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne  DecodeGRRegsRegisterClass(Inst, Op3, Address, Decoder);
7083b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne  DecodeGRRegsRegisterClass(Inst, Op5, Address, Decoder);
7093b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne  return S;
7103b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne}
7113b6a5eefe0ab2199bc69094b390b736ae332b905Richard Osborne
712c47bd9899b639c3384268f871009259c2a94fba4Richard Osbornestatic DecodeStatus
713c47bd9899b639c3384268f871009259c2a94fba4Richard OsborneDecodeL4RSrcDstInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
714c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne                           const void *Decoder) {
715c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne  unsigned Op1, Op2, Op3;
716c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne  unsigned Op4 = fieldFromInstruction(Insn, 16, 4);
717c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne  DecodeStatus S =
718c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne    Decode3OpInstruction(fieldFromInstruction(Insn, 0, 16), Op1, Op2, Op3);
719c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne  if (S == MCDisassembler::Success) {
720c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne    DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
721c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne    S = DecodeGRRegsRegisterClass(Inst, Op4, Address, Decoder);
722c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne  }
723c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne  if (S == MCDisassembler::Success) {
724c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne    DecodeGRRegsRegisterClass(Inst, Op4, Address, Decoder);
725c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne    DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
726c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne    DecodeGRRegsRegisterClass(Inst, Op3, Address, Decoder);
727c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne  }
728c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne  return S;
729c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne}
730c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne
731c47bd9899b639c3384268f871009259c2a94fba4Richard Osbornestatic DecodeStatus
732c47bd9899b639c3384268f871009259c2a94fba4Richard OsborneDecodeL4RSrcDstSrcDstInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
733c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne                                 const void *Decoder) {
734c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne  unsigned Op1, Op2, Op3;
735c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne  unsigned Op4 = fieldFromInstruction(Insn, 16, 4);
736c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne  DecodeStatus S =
737c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne  Decode3OpInstruction(fieldFromInstruction(Insn, 0, 16), Op1, Op2, Op3);
738c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne  if (S == MCDisassembler::Success) {
739c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne    DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
740c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne    S = DecodeGRRegsRegisterClass(Inst, Op4, Address, Decoder);
741c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne  }
742c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne  if (S == MCDisassembler::Success) {
743c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne    DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
744c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne    DecodeGRRegsRegisterClass(Inst, Op4, Address, Decoder);
745c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne    DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
746c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne    DecodeGRRegsRegisterClass(Inst, Op3, Address, Decoder);
747c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne  }
748c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne  return S;
749c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne}
750c47bd9899b639c3384268f871009259c2a94fba4Richard Osborne
751881e3cca66c64a57ff431a4f6d1136dd6017c137Richard OsborneMCDisassembler::DecodeStatus
752881e3cca66c64a57ff431a4f6d1136dd6017c137Richard OsborneXCoreDisassembler::getInstruction(MCInst &instr,
753881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne                                  uint64_t &Size,
754881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne                                  const MemoryObject &Region,
755881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne                                  uint64_t Address,
756881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne                                  raw_ostream &vStream,
757881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne                                  raw_ostream &cStream) const {
758c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne  uint16_t insn16;
75954d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne
760c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne  if (!readInstruction16(Region, Address, Size, insn16)) {
76154d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne    return Fail;
76254d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  }
76354d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne
76454d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  // Calling the auto-generated decoder function.
765c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne  DecodeStatus Result = decodeInstruction(DecoderTable16, instr, insn16,
766c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne                                          Address, this, STI);
76754d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  if (Result != Fail) {
76854d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne    Size = 2;
76954d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne    return Result;
77054d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne  }
77154d6266e9baa8c2796c4a95c35897b5c67d8d910Richard Osborne
772c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne  uint32_t insn32;
773c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne
774c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne  if (!readInstruction32(Region, Address, Size, insn32)) {
775c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne    return Fail;
776c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne  }
777c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne
778c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne  // Calling the auto-generated decoder function.
779c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne  Result = decodeInstruction(DecoderTable32, instr, insn32, Address, this, STI);
780c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne  if (Result != Fail) {
781c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne    Size = 4;
782c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne    return Result;
783c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne  }
784c47793c62c434bd27fee1d243c2081a34d4f3817Richard Osborne
785881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne  return Fail;
786881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne}
787881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne
788881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osbornenamespace llvm {
789881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne  extern Target TheXCoreTarget;
790881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne}
791881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne
792881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osbornestatic MCDisassembler *createXCoreDisassembler(const Target &T,
793dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                               const MCSubtargetInfo &STI,
794dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                               MCContext &Ctx) {
795dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return new XCoreDisassembler(STI, Ctx);
796881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne}
797881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne
798881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborneextern "C" void LLVMInitializeXCoreDisassembler() {
799881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne  // Register the disassembler.
800881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne  TargetRegistry::RegisterMCDisassembler(TheXCoreTarget,
801881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne                                         createXCoreDisassembler);
802881e3cca66c64a57ff431a4f6d1136dd6017c137Richard Osborne}
803