1e31735a5SRichard Osborne //===- XCoreDisassembler.cpp - Disassembler for XCore -----------*- C++ -*-===//
2e31735a5SRichard Osborne //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6e31735a5SRichard Osborne //
7e31735a5SRichard Osborne //===----------------------------------------------------------------------===//
84e1e14bcSRichard Osborne ///
94e1e14bcSRichard Osborne /// \file
105f8f34e4SAdrian Prantl /// This file is part of the XCore Disassembler.
114e1e14bcSRichard Osborne ///
12e31735a5SRichard Osborne //===----------------------------------------------------------------------===//
13e31735a5SRichard Osborne 
145f7d4ab5SRichard Trieu #include "TargetInfo/XCoreTargetInfo.h"
151b5562adSRichard Osborne #include "XCore.h"
161b5562adSRichard Osborne #include "XCoreRegisterInfo.h"
17a1bc0f56SLang Hames #include "llvm/MC/MCContext.h"
18*c644488aSSheng #include "llvm/MC/MCDecoderOps.h"
19f57c1977SBenjamin Kramer #include "llvm/MC/MCDisassembler/MCDisassembler.h"
201b5562adSRichard Osborne #include "llvm/MC/MCInst.h"
21e31735a5SRichard Osborne #include "llvm/MC/MCSubtargetInfo.h"
2289b57061SReid Kleckner #include "llvm/MC/TargetRegistry.h"
23e31735a5SRichard Osborne 
24e31735a5SRichard Osborne using namespace llvm;
25e31735a5SRichard Osborne 
26e96dd897SChandler Carruth #define DEBUG_TYPE "xcore-disassembler"
27e96dd897SChandler Carruth 
28e31735a5SRichard Osborne typedef MCDisassembler::DecodeStatus DecodeStatus;
29e31735a5SRichard Osborne 
30e31735a5SRichard Osborne namespace {
31e31735a5SRichard Osborne 
325f8f34e4SAdrian Prantl /// A disassembler class for XCore.
33e31735a5SRichard Osborne class XCoreDisassembler : public MCDisassembler {
34e31735a5SRichard Osborne public:
XCoreDisassembler(const MCSubtargetInfo & STI,MCContext & Ctx)35a1bc0f56SLang Hames   XCoreDisassembler(const MCSubtargetInfo &STI, MCContext &Ctx) :
36a1bc0f56SLang Hames     MCDisassembler(STI, Ctx) {}
37e31735a5SRichard Osborne 
384aa6bea7SRafael Espindola   DecodeStatus getInstruction(MCInst &Instr, uint64_t &Size,
397fc5b874SRafael Espindola                               ArrayRef<uint8_t> Bytes, uint64_t Address,
404aa6bea7SRafael Espindola                               raw_ostream &CStream) const override;
411b5562adSRichard Osborne };
42f00654e3SAlexander Kornienko }
431b5562adSRichard Osborne 
readInstruction16(ArrayRef<uint8_t> Bytes,uint64_t Address,uint64_t & Size,uint16_t & Insn)447fc5b874SRafael Espindola static bool readInstruction16(ArrayRef<uint8_t> Bytes, uint64_t Address,
454aa6bea7SRafael Espindola                               uint64_t &Size, uint16_t &Insn) {
461b5562adSRichard Osborne   // We want to read exactly 2 Bytes of data.
477fc5b874SRafael Espindola   if (Bytes.size() < 2) {
484aa6bea7SRafael Espindola     Size = 0;
491b5562adSRichard Osborne     return false;
501b5562adSRichard Osborne   }
511b5562adSRichard Osborne   // Encoded as a little-endian 16-bit word in the stream.
524aa6bea7SRafael Espindola   Insn = (Bytes[0] << 0) | (Bytes[1] << 8);
531b5562adSRichard Osborne   return true;
541b5562adSRichard Osborne }
551b5562adSRichard Osborne 
readInstruction32(ArrayRef<uint8_t> Bytes,uint64_t Address,uint64_t & Size,uint32_t & Insn)567fc5b874SRafael Espindola static bool readInstruction32(ArrayRef<uint8_t> Bytes, uint64_t Address,
574aa6bea7SRafael Espindola                               uint64_t &Size, uint32_t &Insn) {
58459e35c2SRichard Osborne   // We want to read exactly 4 Bytes of data.
597fc5b874SRafael Espindola   if (Bytes.size() < 4) {
604aa6bea7SRafael Espindola     Size = 0;
61459e35c2SRichard Osborne     return false;
62459e35c2SRichard Osborne   }
63459e35c2SRichard Osborne   // Encoded as a little-endian 32-bit word in the stream.
644aa6bea7SRafael Espindola   Insn =
654aa6bea7SRafael Espindola       (Bytes[0] << 0) | (Bytes[1] << 8) | (Bytes[2] << 16) | (Bytes[3] << 24);
66459e35c2SRichard Osborne   return true;
67459e35c2SRichard Osborne }
68459e35c2SRichard Osborne 
getReg(const MCDisassembler * D,unsigned RC,unsigned RegNo)694ae9745aSMaksim Panchenko static unsigned getReg(const MCDisassembler *D, unsigned RC, unsigned RegNo) {
704ae9745aSMaksim Panchenko   const MCRegisterInfo *RegInfo = D->getContext().getRegisterInfo();
71a1bc0f56SLang Hames   return *(RegInfo->getRegClass(RC).begin() + RegNo);
721b5562adSRichard Osborne }
731b5562adSRichard Osborne 
744ae9745aSMaksim Panchenko static DecodeStatus DecodeGRRegsRegisterClass(MCInst &Inst, unsigned RegNo,
751b5562adSRichard Osborne                                               uint64_t Address,
764ae9745aSMaksim Panchenko                                               const MCDisassembler *Decoder);
771b5562adSRichard Osborne 
784ae9745aSMaksim Panchenko static DecodeStatus DecodeRRegsRegisterClass(MCInst &Inst, unsigned RegNo,
79f18d95f7SRichard Osborne                                              uint64_t Address,
804ae9745aSMaksim Panchenko                                              const MCDisassembler *Decoder);
81f18d95f7SRichard Osborne 
82041071c5SRichard Osborne static DecodeStatus DecodeBitpOperand(MCInst &Inst, unsigned Val,
834ae9745aSMaksim Panchenko                                       uint64_t Address,
844ae9745aSMaksim Panchenko                                       const MCDisassembler *Decoder);
85041071c5SRichard Osborne 
8653a04fe2SRichard Osborne static DecodeStatus DecodeNegImmOperand(MCInst &Inst, unsigned Val,
873a0d5cc3SRichard Osborne                                         uint64_t Address,
884ae9745aSMaksim Panchenko                                         const MCDisassembler *Decoder);
893a0d5cc3SRichard Osborne 
904ae9745aSMaksim Panchenko static DecodeStatus Decode2RInstruction(MCInst &Inst, unsigned Insn,
9153fff945SRichard Osborne                                         uint64_t Address,
924ae9745aSMaksim Panchenko                                         const MCDisassembler *Decoder);
9353fff945SRichard Osborne 
944ae9745aSMaksim Panchenko static DecodeStatus Decode2RImmInstruction(MCInst &Inst, unsigned Insn,
953a0d5cc3SRichard Osborne                                            uint64_t Address,
964ae9745aSMaksim Panchenko                                            const MCDisassembler *Decoder);
973a0d5cc3SRichard Osborne 
984ae9745aSMaksim Panchenko static DecodeStatus DecodeR2RInstruction(MCInst &Inst, unsigned Insn,
993a0d5cc3SRichard Osborne                                          uint64_t Address,
1004ae9745aSMaksim Panchenko                                          const MCDisassembler *Decoder);
1013a0d5cc3SRichard Osborne 
1024ae9745aSMaksim Panchenko static DecodeStatus Decode2RSrcDstInstruction(MCInst &Inst, unsigned Insn,
103041071c5SRichard Osborne                                               uint64_t Address,
1044ae9745aSMaksim Panchenko                                               const MCDisassembler *Decoder);
105041071c5SRichard Osborne 
1064ae9745aSMaksim Panchenko static DecodeStatus DecodeRUSInstruction(MCInst &Inst, unsigned Insn,
107041071c5SRichard Osborne                                          uint64_t Address,
1084ae9745aSMaksim Panchenko                                          const MCDisassembler *Decoder);
109041071c5SRichard Osborne 
1104ae9745aSMaksim Panchenko static DecodeStatus DecodeRUSBitpInstruction(MCInst &Inst, unsigned Insn,
111041071c5SRichard Osborne                                              uint64_t Address,
1124ae9745aSMaksim Panchenko                                              const MCDisassembler *Decoder);
113041071c5SRichard Osborne 
1144ae9745aSMaksim Panchenko static DecodeStatus
1154ae9745aSMaksim Panchenko DecodeRUSSrcDstBitpInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
1164ae9745aSMaksim Panchenko                                const MCDisassembler *Decoder);
117459e35c2SRichard Osborne 
1184ae9745aSMaksim Panchenko static DecodeStatus DecodeL2RInstruction(MCInst &Inst, unsigned Insn,
119459e35c2SRichard Osborne                                          uint64_t Address,
1204ae9745aSMaksim Panchenko                                          const MCDisassembler *Decoder);
121459e35c2SRichard Osborne 
1224ae9745aSMaksim Panchenko static DecodeStatus DecodeLR2RInstruction(MCInst &Inst, unsigned Insn,
1233fb73952SRichard Osborne                                           uint64_t Address,
1244ae9745aSMaksim Panchenko                                           const MCDisassembler *Decoder);
1253fb73952SRichard Osborne 
1264ae9745aSMaksim Panchenko static DecodeStatus Decode3RInstruction(MCInst &Inst, unsigned Insn,
127f5a3ffcbSRichard Osborne                                         uint64_t Address,
1284ae9745aSMaksim Panchenko                                         const MCDisassembler *Decoder);
129f5a3ffcbSRichard Osborne 
1304ae9745aSMaksim Panchenko static DecodeStatus Decode3RImmInstruction(MCInst &Inst, unsigned Insn,
131f063fceeSRichard Osborne                                            uint64_t Address,
1324ae9745aSMaksim Panchenko                                            const MCDisassembler *Decoder);
133f063fceeSRichard Osborne 
1344ae9745aSMaksim Panchenko static DecodeStatus Decode2RUSInstruction(MCInst &Inst, unsigned Insn,
135f063fceeSRichard Osborne                                           uint64_t Address,
1364ae9745aSMaksim Panchenko                                           const MCDisassembler *Decoder);
137f063fceeSRichard Osborne 
1384ae9745aSMaksim Panchenko static DecodeStatus Decode2RUSBitpInstruction(MCInst &Inst, unsigned Insn,
1399fbf57b2SRichard Osborne                                               uint64_t Address,
1404ae9745aSMaksim Panchenko                                               const MCDisassembler *Decoder);
1419fbf57b2SRichard Osborne 
1424ae9745aSMaksim Panchenko static DecodeStatus DecodeL3RInstruction(MCInst &Inst, unsigned Insn,
1439fbf57b2SRichard Osborne                                          uint64_t Address,
1444ae9745aSMaksim Panchenko                                          const MCDisassembler *Decoder);
1459fbf57b2SRichard Osborne 
1464ae9745aSMaksim Panchenko static DecodeStatus DecodeL3RSrcDstInstruction(MCInst &Inst, unsigned Insn,
1474e697248SRichard Osborne                                                uint64_t Address,
1484ae9745aSMaksim Panchenko                                                const MCDisassembler *Decoder);
1494e697248SRichard Osborne 
1504ae9745aSMaksim Panchenko static DecodeStatus DecodeL2RUSInstruction(MCInst &Inst, unsigned Insn,
1514e697248SRichard Osborne                                            uint64_t Address,
1524ae9745aSMaksim Panchenko                                            const MCDisassembler *Decoder);
1534e697248SRichard Osborne 
1544ae9745aSMaksim Panchenko static DecodeStatus DecodeL2RUSBitpInstruction(MCInst &Inst, unsigned Insn,
15554e31182SRichard Osborne                                                uint64_t Address,
1564ae9745aSMaksim Panchenko                                                const MCDisassembler *Decoder);
15754e31182SRichard Osborne 
1584ae9745aSMaksim Panchenko static DecodeStatus DecodeL6RInstruction(MCInst &Inst, unsigned Insn,
159a19fa86aSRichard Osborne                                          uint64_t Address,
1604ae9745aSMaksim Panchenko                                          const MCDisassembler *Decoder);
161a19fa86aSRichard Osborne 
1624ae9745aSMaksim Panchenko static DecodeStatus DecodeL5RInstruction(MCInst &Inst, unsigned Insn,
1636b86eec8SRichard Osborne                                          uint64_t Address,
1644ae9745aSMaksim Panchenko                                          const MCDisassembler *Decoder);
1656b86eec8SRichard Osborne 
1664ae9745aSMaksim Panchenko static DecodeStatus DecodeL4RSrcDstInstruction(MCInst &Inst, unsigned Insn,
1676b86eec8SRichard Osborne                                                uint64_t Address,
1684ae9745aSMaksim Panchenko                                                const MCDisassembler *Decoder);
1694ae9745aSMaksim Panchenko 
1704ae9745aSMaksim Panchenko static DecodeStatus
1714ae9745aSMaksim Panchenko DecodeL4RSrcDstSrcDstInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
1724ae9745aSMaksim Panchenko                                  const MCDisassembler *Decoder);
1736b86eec8SRichard Osborne 
1741b5562adSRichard Osborne #include "XCoreGenDisassemblerTables.inc"
1751b5562adSRichard Osborne 
DecodeGRRegsRegisterClass(MCInst & Inst,unsigned RegNo,uint64_t Address,const MCDisassembler * Decoder)1764ae9745aSMaksim Panchenko static DecodeStatus DecodeGRRegsRegisterClass(MCInst &Inst, unsigned RegNo,
1771b5562adSRichard Osborne                                               uint64_t Address,
1784ae9745aSMaksim Panchenko                                               const MCDisassembler *Decoder) {
1791b5562adSRichard Osborne   if (RegNo > 11)
1801b5562adSRichard Osborne     return MCDisassembler::Fail;
1811b5562adSRichard Osborne   unsigned Reg = getReg(Decoder, XCore::GRRegsRegClassID, RegNo);
182e9119e41SJim Grosbach   Inst.addOperand(MCOperand::createReg(Reg));
1831b5562adSRichard Osborne   return MCDisassembler::Success;
184e31735a5SRichard Osborne }
185e31735a5SRichard Osborne 
DecodeRRegsRegisterClass(MCInst & Inst,unsigned RegNo,uint64_t Address,const MCDisassembler * Decoder)1864ae9745aSMaksim Panchenko static DecodeStatus DecodeRRegsRegisterClass(MCInst &Inst, unsigned RegNo,
187f18d95f7SRichard Osborne                                              uint64_t Address,
1884ae9745aSMaksim Panchenko                                              const MCDisassembler *Decoder) {
189f18d95f7SRichard Osborne   if (RegNo > 15)
190f18d95f7SRichard Osborne     return MCDisassembler::Fail;
191f18d95f7SRichard Osborne   unsigned Reg = getReg(Decoder, XCore::RRegsRegClassID, RegNo);
192e9119e41SJim Grosbach   Inst.addOperand(MCOperand::createReg(Reg));
193f18d95f7SRichard Osborne   return MCDisassembler::Success;
194f18d95f7SRichard Osborne }
195f18d95f7SRichard Osborne 
DecodeBitpOperand(MCInst & Inst,unsigned Val,uint64_t Address,const MCDisassembler * Decoder)196041071c5SRichard Osborne static DecodeStatus DecodeBitpOperand(MCInst &Inst, unsigned Val,
1974ae9745aSMaksim Panchenko                                       uint64_t Address,
1984ae9745aSMaksim Panchenko                                       const MCDisassembler *Decoder) {
199041071c5SRichard Osborne   if (Val > 11)
200041071c5SRichard Osborne     return MCDisassembler::Fail;
2012626094fSCraig Topper   static const unsigned Values[] = {
202041071c5SRichard Osborne     32 /*bpw*/, 1, 2, 3, 4, 5, 6, 7, 8, 16, 24, 32
203041071c5SRichard Osborne   };
204e9119e41SJim Grosbach   Inst.addOperand(MCOperand::createImm(Values[Val]));
205041071c5SRichard Osborne   return MCDisassembler::Success;
206041071c5SRichard Osborne }
207041071c5SRichard Osborne 
DecodeNegImmOperand(MCInst & Inst,unsigned Val,uint64_t Address,const MCDisassembler * Decoder)20853a04fe2SRichard Osborne static DecodeStatus DecodeNegImmOperand(MCInst &Inst, unsigned Val,
2094ae9745aSMaksim Panchenko                                         uint64_t Address,
2104ae9745aSMaksim Panchenko                                         const MCDisassembler *Decoder) {
211e9119e41SJim Grosbach   Inst.addOperand(MCOperand::createImm(-(int64_t)Val));
21253a04fe2SRichard Osborne   return MCDisassembler::Success;
21353a04fe2SRichard Osborne }
21453a04fe2SRichard Osborne 
2153a0d5cc3SRichard Osborne static DecodeStatus
Decode2OpInstruction(unsigned Insn,unsigned & Op1,unsigned & Op2)2163a0d5cc3SRichard Osborne Decode2OpInstruction(unsigned Insn, unsigned &Op1, unsigned &Op2) {
2173fb73952SRichard Osborne   unsigned Combined = fieldFromInstruction(Insn, 6, 5);
2183fb73952SRichard Osborne   if (Combined < 27)
2193a0d5cc3SRichard Osborne     return MCDisassembler::Fail;
2203fb73952SRichard Osborne   if (fieldFromInstruction(Insn, 5, 1)) {
2213fb73952SRichard Osborne     if (Combined == 31)
2223fb73952SRichard Osborne       return MCDisassembler::Fail;
2233fb73952SRichard Osborne     Combined += 5;
2243fb73952SRichard Osborne   }
2253fb73952SRichard Osborne   Combined -= 27;
2263a0d5cc3SRichard Osborne   unsigned Op1High = Combined % 3;
2273a0d5cc3SRichard Osborne   unsigned Op2High = Combined / 3;
2283a0d5cc3SRichard Osborne   Op1 = (Op1High << 2) | fieldFromInstruction(Insn, 2, 2);
2293a0d5cc3SRichard Osborne   Op2 = (Op2High << 2) | fieldFromInstruction(Insn, 0, 2);
2303a0d5cc3SRichard Osborne   return MCDisassembler::Success;
2313a0d5cc3SRichard Osborne }
2323a0d5cc3SRichard Osborne 
2333a0d5cc3SRichard Osborne static DecodeStatus
Decode3OpInstruction(unsigned Insn,unsigned & Op1,unsigned & Op2,unsigned & Op3)2343fb73952SRichard Osborne Decode3OpInstruction(unsigned Insn, unsigned &Op1, unsigned &Op2,
2353fb73952SRichard Osborne                      unsigned &Op3) {
2363fb73952SRichard Osborne   unsigned Combined = fieldFromInstruction(Insn, 6, 5);
2373fb73952SRichard Osborne   if (Combined >= 27)
2383fb73952SRichard Osborne     return MCDisassembler::Fail;
2393fb73952SRichard Osborne 
2403fb73952SRichard Osborne   unsigned Op1High = Combined % 3;
2413fb73952SRichard Osborne   unsigned Op2High = (Combined / 3) % 3;
2423fb73952SRichard Osborne   unsigned Op3High = Combined / 9;
2433fb73952SRichard Osborne   Op1 = (Op1High << 2) | fieldFromInstruction(Insn, 4, 2);
2443fb73952SRichard Osborne   Op2 = (Op2High << 2) | fieldFromInstruction(Insn, 2, 2);
2453fb73952SRichard Osborne   Op3 = (Op3High << 2) | fieldFromInstruction(Insn, 0, 2);
2463fb73952SRichard Osborne   return MCDisassembler::Success;
2473fb73952SRichard Osborne }
2483fb73952SRichard Osborne 
Decode2OpInstructionFail(MCInst & Inst,unsigned Insn,uint64_t Address,const MCDisassembler * Decoder)2494ae9745aSMaksim Panchenko static DecodeStatus Decode2OpInstructionFail(MCInst &Inst, unsigned Insn,
2504ae9745aSMaksim Panchenko                                              uint64_t Address,
2514ae9745aSMaksim Panchenko                                              const MCDisassembler *Decoder) {
2523fb73952SRichard Osborne   // Try and decode as a 3R instruction.
2533fb73952SRichard Osborne   unsigned Opcode = fieldFromInstruction(Insn, 11, 5);
2543fb73952SRichard Osborne   switch (Opcode) {
255f063fceeSRichard Osborne   case 0x0:
256f063fceeSRichard Osborne     Inst.setOpcode(XCore::STW_2rus);
257f063fceeSRichard Osborne     return Decode2RUSInstruction(Inst, Insn, Address, Decoder);
258f063fceeSRichard Osborne   case 0x1:
259f063fceeSRichard Osborne     Inst.setOpcode(XCore::LDW_2rus);
260f063fceeSRichard Osborne     return Decode2RUSInstruction(Inst, Insn, Address, Decoder);
2613fb73952SRichard Osborne   case 0x2:
2623fb73952SRichard Osborne     Inst.setOpcode(XCore::ADD_3r);
2633fb73952SRichard Osborne     return Decode3RInstruction(Inst, Insn, Address, Decoder);
2643fb73952SRichard Osborne   case 0x3:
2653fb73952SRichard Osborne     Inst.setOpcode(XCore::SUB_3r);
2663fb73952SRichard Osborne     return Decode3RInstruction(Inst, Insn, Address, Decoder);
2673fb73952SRichard Osborne   case 0x4:
2683fb73952SRichard Osborne     Inst.setOpcode(XCore::SHL_3r);
2693fb73952SRichard Osborne     return Decode3RInstruction(Inst, Insn, Address, Decoder);
2703fb73952SRichard Osborne   case 0x5:
2713fb73952SRichard Osborne     Inst.setOpcode(XCore::SHR_3r);
2723fb73952SRichard Osborne     return Decode3RInstruction(Inst, Insn, Address, Decoder);
2733fb73952SRichard Osborne   case 0x6:
2743fb73952SRichard Osborne     Inst.setOpcode(XCore::EQ_3r);
2753fb73952SRichard Osborne     return Decode3RInstruction(Inst, Insn, Address, Decoder);
2763fb73952SRichard Osborne   case 0x7:
2773fb73952SRichard Osborne     Inst.setOpcode(XCore::AND_3r);
2783fb73952SRichard Osborne     return Decode3RInstruction(Inst, Insn, Address, Decoder);
2793fb73952SRichard Osborne   case 0x8:
2803fb73952SRichard Osborne     Inst.setOpcode(XCore::OR_3r);
2813fb73952SRichard Osborne     return Decode3RInstruction(Inst, Insn, Address, Decoder);
2823fb73952SRichard Osborne   case 0x9:
2833fb73952SRichard Osborne     Inst.setOpcode(XCore::LDW_3r);
2843fb73952SRichard Osborne     return Decode3RInstruction(Inst, Insn, Address, Decoder);
2853fb73952SRichard Osborne   case 0x10:
2863fb73952SRichard Osborne     Inst.setOpcode(XCore::LD16S_3r);
2873fb73952SRichard Osborne     return Decode3RInstruction(Inst, Insn, Address, Decoder);
2883fb73952SRichard Osborne   case 0x11:
2893fb73952SRichard Osborne     Inst.setOpcode(XCore::LD8U_3r);
2903fb73952SRichard Osborne     return Decode3RInstruction(Inst, Insn, Address, Decoder);
291f063fceeSRichard Osborne   case 0x12:
292f063fceeSRichard Osborne     Inst.setOpcode(XCore::ADD_2rus);
293f063fceeSRichard Osborne     return Decode2RUSInstruction(Inst, Insn, Address, Decoder);
294f063fceeSRichard Osborne   case 0x13:
295f063fceeSRichard Osborne     Inst.setOpcode(XCore::SUB_2rus);
296f063fceeSRichard Osborne     return Decode2RUSInstruction(Inst, Insn, Address, Decoder);
297f063fceeSRichard Osborne   case 0x14:
298f063fceeSRichard Osborne     Inst.setOpcode(XCore::SHL_2rus);
299f063fceeSRichard Osborne     return Decode2RUSBitpInstruction(Inst, Insn, Address, Decoder);
300f063fceeSRichard Osborne   case 0x15:
301f063fceeSRichard Osborne     Inst.setOpcode(XCore::SHR_2rus);
302f063fceeSRichard Osborne     return Decode2RUSBitpInstruction(Inst, Insn, Address, Decoder);
303f063fceeSRichard Osborne   case 0x16:
304f063fceeSRichard Osborne     Inst.setOpcode(XCore::EQ_2rus);
305f063fceeSRichard Osborne     return Decode2RUSInstruction(Inst, Insn, Address, Decoder);
306f5a3ffcbSRichard Osborne   case 0x17:
307f5a3ffcbSRichard Osborne     Inst.setOpcode(XCore::TSETR_3r);
308f5a3ffcbSRichard Osborne     return Decode3RImmInstruction(Inst, Insn, Address, Decoder);
3093fb73952SRichard Osborne   case 0x18:
3103fb73952SRichard Osborne     Inst.setOpcode(XCore::LSS_3r);
3113fb73952SRichard Osborne     return Decode3RInstruction(Inst, Insn, Address, Decoder);
3123fb73952SRichard Osborne   case 0x19:
3133fb73952SRichard Osborne     Inst.setOpcode(XCore::LSU_3r);
3143fb73952SRichard Osborne     return Decode3RInstruction(Inst, Insn, Address, Decoder);
3153fb73952SRichard Osborne   }
3163fb73952SRichard Osborne   return MCDisassembler::Fail;
3173fb73952SRichard Osborne }
3183fb73952SRichard Osborne 
Decode2RInstruction(MCInst & Inst,unsigned Insn,uint64_t Address,const MCDisassembler * Decoder)3194ae9745aSMaksim Panchenko static DecodeStatus Decode2RInstruction(MCInst &Inst, unsigned Insn,
3204ae9745aSMaksim Panchenko                                         uint64_t Address,
3214ae9745aSMaksim Panchenko                                         const MCDisassembler *Decoder) {
3223a0d5cc3SRichard Osborne   unsigned Op1, Op2;
3233a0d5cc3SRichard Osborne   DecodeStatus S = Decode2OpInstruction(Insn, Op1, Op2);
3243fb73952SRichard Osborne   if (S != MCDisassembler::Success)
3253fb73952SRichard Osborne     return Decode2OpInstructionFail(Inst, Insn, Address, Decoder);
3263fb73952SRichard Osborne 
3273a0d5cc3SRichard Osborne   DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
3283a0d5cc3SRichard Osborne   DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
3293a0d5cc3SRichard Osborne   return S;
3303a0d5cc3SRichard Osborne }
3313a0d5cc3SRichard Osborne 
Decode2RImmInstruction(MCInst & Inst,unsigned Insn,uint64_t Address,const MCDisassembler * Decoder)3324ae9745aSMaksim Panchenko static DecodeStatus Decode2RImmInstruction(MCInst &Inst, unsigned Insn,
3334ae9745aSMaksim Panchenko                                            uint64_t Address,
3344ae9745aSMaksim Panchenko                                            const MCDisassembler *Decoder) {
33553fff945SRichard Osborne   unsigned Op1, Op2;
33653fff945SRichard Osborne   DecodeStatus S = Decode2OpInstruction(Insn, Op1, Op2);
33753fff945SRichard Osborne   if (S != MCDisassembler::Success)
33853fff945SRichard Osborne     return Decode2OpInstructionFail(Inst, Insn, Address, Decoder);
33953fff945SRichard Osborne 
340e9119e41SJim Grosbach   Inst.addOperand(MCOperand::createImm(Op1));
34153fff945SRichard Osborne   DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
34253fff945SRichard Osborne   return S;
34353fff945SRichard Osborne }
34453fff945SRichard Osborne 
DecodeR2RInstruction(MCInst & Inst,unsigned Insn,uint64_t Address,const MCDisassembler * Decoder)3454ae9745aSMaksim Panchenko static DecodeStatus DecodeR2RInstruction(MCInst &Inst, unsigned Insn,
3464ae9745aSMaksim Panchenko                                          uint64_t Address,
3474ae9745aSMaksim Panchenko                                          const MCDisassembler *Decoder) {
3483a0d5cc3SRichard Osborne   unsigned Op1, Op2;
3493a0d5cc3SRichard Osborne   DecodeStatus S = Decode2OpInstruction(Insn, Op2, Op1);
3503fb73952SRichard Osborne   if (S != MCDisassembler::Success)
3513fb73952SRichard Osborne     return Decode2OpInstructionFail(Inst, Insn, Address, Decoder);
3523fb73952SRichard Osborne 
3533a0d5cc3SRichard Osborne   DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
3543a0d5cc3SRichard Osborne   DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
3553a0d5cc3SRichard Osborne   return S;
3563a0d5cc3SRichard Osborne }
3573a0d5cc3SRichard Osborne 
Decode2RSrcDstInstruction(MCInst & Inst,unsigned Insn,uint64_t Address,const MCDisassembler * Decoder)3584ae9745aSMaksim Panchenko static DecodeStatus Decode2RSrcDstInstruction(MCInst &Inst, unsigned Insn,
3594ae9745aSMaksim Panchenko                                               uint64_t Address,
3604ae9745aSMaksim Panchenko                                               const MCDisassembler *Decoder) {
3613a0d5cc3SRichard Osborne   unsigned Op1, Op2;
3623a0d5cc3SRichard Osborne   DecodeStatus S = Decode2OpInstruction(Insn, Op1, Op2);
3633fb73952SRichard Osborne   if (S != MCDisassembler::Success)
3643fb73952SRichard Osborne     return Decode2OpInstructionFail(Inst, Insn, Address, Decoder);
3653fb73952SRichard Osborne 
3663a0d5cc3SRichard Osborne   DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
3673a0d5cc3SRichard Osborne   DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
3683a0d5cc3SRichard Osborne   DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
3693a0d5cc3SRichard Osborne   return S;
3703a0d5cc3SRichard Osborne }
3713a0d5cc3SRichard Osborne 
DecodeRUSInstruction(MCInst & Inst,unsigned Insn,uint64_t Address,const MCDisassembler * Decoder)3724ae9745aSMaksim Panchenko static DecodeStatus DecodeRUSInstruction(MCInst &Inst, unsigned Insn,
3734ae9745aSMaksim Panchenko                                          uint64_t Address,
3744ae9745aSMaksim Panchenko                                          const MCDisassembler *Decoder) {
375041071c5SRichard Osborne   unsigned Op1, Op2;
376041071c5SRichard Osborne   DecodeStatus S = Decode2OpInstruction(Insn, Op1, Op2);
3773fb73952SRichard Osborne   if (S != MCDisassembler::Success)
3783fb73952SRichard Osborne     return Decode2OpInstructionFail(Inst, Insn, Address, Decoder);
3793fb73952SRichard Osborne 
380041071c5SRichard Osborne   DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
381e9119e41SJim Grosbach   Inst.addOperand(MCOperand::createImm(Op2));
382041071c5SRichard Osborne   return S;
383041071c5SRichard Osborne }
384041071c5SRichard Osborne 
DecodeRUSBitpInstruction(MCInst & Inst,unsigned Insn,uint64_t Address,const MCDisassembler * Decoder)3854ae9745aSMaksim Panchenko static DecodeStatus DecodeRUSBitpInstruction(MCInst &Inst, unsigned Insn,
3864ae9745aSMaksim Panchenko                                              uint64_t Address,
3874ae9745aSMaksim Panchenko                                              const MCDisassembler *Decoder) {
388041071c5SRichard Osborne   unsigned Op1, Op2;
389041071c5SRichard Osborne   DecodeStatus S = Decode2OpInstruction(Insn, Op1, Op2);
3903fb73952SRichard Osborne   if (S != MCDisassembler::Success)
3913fb73952SRichard Osborne     return Decode2OpInstructionFail(Inst, Insn, Address, Decoder);
3923fb73952SRichard Osborne 
393041071c5SRichard Osborne   DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
394041071c5SRichard Osborne   DecodeBitpOperand(Inst, Op2, Address, Decoder);
395041071c5SRichard Osborne   return S;
396041071c5SRichard Osborne }
397041071c5SRichard Osborne 
398041071c5SRichard Osborne static DecodeStatus
DecodeRUSSrcDstBitpInstruction(MCInst & Inst,unsigned Insn,uint64_t Address,const MCDisassembler * Decoder)399041071c5SRichard Osborne DecodeRUSSrcDstBitpInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
4004ae9745aSMaksim Panchenko                                const MCDisassembler *Decoder) {
401041071c5SRichard Osborne   unsigned Op1, Op2;
402041071c5SRichard Osborne   DecodeStatus S = Decode2OpInstruction(Insn, Op1, Op2);
4033fb73952SRichard Osborne   if (S != MCDisassembler::Success)
4043fb73952SRichard Osborne     return Decode2OpInstructionFail(Inst, Insn, Address, Decoder);
4053fb73952SRichard Osborne 
406041071c5SRichard Osborne   DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
407041071c5SRichard Osborne   DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
408041071c5SRichard Osborne   DecodeBitpOperand(Inst, Op2, Address, Decoder);
409041071c5SRichard Osborne   return S;
410041071c5SRichard Osborne }
411041071c5SRichard Osborne 
DecodeL2OpInstructionFail(MCInst & Inst,unsigned Insn,uint64_t Address,const MCDisassembler * Decoder)4124ae9745aSMaksim Panchenko static DecodeStatus DecodeL2OpInstructionFail(MCInst &Inst, unsigned Insn,
4134ae9745aSMaksim Panchenko                                               uint64_t Address,
4144ae9745aSMaksim Panchenko                                               const MCDisassembler *Decoder) {
4154e697248SRichard Osborne   // Try and decode as a L3R / L2RUS instruction.
4169fbf57b2SRichard Osborne   unsigned Opcode = fieldFromInstruction(Insn, 16, 4) |
4179fbf57b2SRichard Osborne                     fieldFromInstruction(Insn, 27, 5) << 4;
4189fbf57b2SRichard Osborne   switch (Opcode) {
4199fbf57b2SRichard Osborne   case 0x0c:
420a520a7dcSRichard Osborne     Inst.setOpcode(XCore::STW_l3r);
4219fbf57b2SRichard Osborne     return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
4229fbf57b2SRichard Osborne   case 0x1c:
4239fbf57b2SRichard Osborne     Inst.setOpcode(XCore::XOR_l3r);
4249fbf57b2SRichard Osborne     return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
4259fbf57b2SRichard Osborne   case 0x2c:
4269fbf57b2SRichard Osborne     Inst.setOpcode(XCore::ASHR_l3r);
4279fbf57b2SRichard Osborne     return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
4289fbf57b2SRichard Osborne   case 0x3c:
4299fbf57b2SRichard Osborne     Inst.setOpcode(XCore::LDAWF_l3r);
4309fbf57b2SRichard Osborne     return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
4319fbf57b2SRichard Osborne   case 0x4c:
4329fbf57b2SRichard Osborne     Inst.setOpcode(XCore::LDAWB_l3r);
4339fbf57b2SRichard Osborne     return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
4349fbf57b2SRichard Osborne   case 0x5c:
4359fbf57b2SRichard Osborne     Inst.setOpcode(XCore::LDA16F_l3r);
4369fbf57b2SRichard Osborne     return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
4379fbf57b2SRichard Osborne   case 0x6c:
4389fbf57b2SRichard Osborne     Inst.setOpcode(XCore::LDA16B_l3r);
4399fbf57b2SRichard Osborne     return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
4409fbf57b2SRichard Osborne   case 0x7c:
4419fbf57b2SRichard Osborne     Inst.setOpcode(XCore::MUL_l3r);
4429fbf57b2SRichard Osborne     return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
4439fbf57b2SRichard Osborne   case 0x8c:
4449fbf57b2SRichard Osborne     Inst.setOpcode(XCore::DIVS_l3r);
4459fbf57b2SRichard Osborne     return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
4469fbf57b2SRichard Osborne   case 0x9c:
4479fbf57b2SRichard Osborne     Inst.setOpcode(XCore::DIVU_l3r);
4489fbf57b2SRichard Osborne     return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
4499fbf57b2SRichard Osborne   case 0x10c:
4509fbf57b2SRichard Osborne     Inst.setOpcode(XCore::ST16_l3r);
4519fbf57b2SRichard Osborne     return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
4529fbf57b2SRichard Osborne   case 0x11c:
4539fbf57b2SRichard Osborne     Inst.setOpcode(XCore::ST8_l3r);
4549fbf57b2SRichard Osborne     return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
4554e697248SRichard Osborne   case 0x12c:
4564e697248SRichard Osborne     Inst.setOpcode(XCore::ASHR_l2rus);
4574e697248SRichard Osborne     return DecodeL2RUSBitpInstruction(Inst, Insn, Address, Decoder);
458038d24f9SRichard Osborne   case 0x12d:
459038d24f9SRichard Osborne     Inst.setOpcode(XCore::OUTPW_l2rus);
460038d24f9SRichard Osborne     return DecodeL2RUSBitpInstruction(Inst, Insn, Address, Decoder);
461038d24f9SRichard Osborne   case 0x12e:
462038d24f9SRichard Osborne     Inst.setOpcode(XCore::INPW_l2rus);
463038d24f9SRichard Osborne     return DecodeL2RUSBitpInstruction(Inst, Insn, Address, Decoder);
4644e697248SRichard Osborne   case 0x13c:
4654e697248SRichard Osborne     Inst.setOpcode(XCore::LDAWF_l2rus);
4664e697248SRichard Osborne     return DecodeL2RUSInstruction(Inst, Insn, Address, Decoder);
4674e697248SRichard Osborne   case 0x14c:
4684e697248SRichard Osborne     Inst.setOpcode(XCore::LDAWB_l2rus);
4694e697248SRichard Osborne     return DecodeL2RUSInstruction(Inst, Insn, Address, Decoder);
4709fbf57b2SRichard Osborne   case 0x15c:
4719fbf57b2SRichard Osborne     Inst.setOpcode(XCore::CRC_l3r);
4729fbf57b2SRichard Osborne     return DecodeL3RSrcDstInstruction(Inst, Insn, Address, Decoder);
4739fbf57b2SRichard Osborne   case 0x18c:
4749fbf57b2SRichard Osborne     Inst.setOpcode(XCore::REMS_l3r);
4759fbf57b2SRichard Osborne     return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
4769fbf57b2SRichard Osborne   case 0x19c:
4779fbf57b2SRichard Osborne     Inst.setOpcode(XCore::REMU_l3r);
4789fbf57b2SRichard Osborne     return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
4799fbf57b2SRichard Osborne   }
4809fbf57b2SRichard Osborne   return MCDisassembler::Fail;
4819fbf57b2SRichard Osborne }
4829fbf57b2SRichard Osborne 
DecodeL2RInstruction(MCInst & Inst,unsigned Insn,uint64_t Address,const MCDisassembler * Decoder)4834ae9745aSMaksim Panchenko static DecodeStatus DecodeL2RInstruction(MCInst &Inst, unsigned Insn,
4844ae9745aSMaksim Panchenko                                          uint64_t Address,
4854ae9745aSMaksim Panchenko                                          const MCDisassembler *Decoder) {
486459e35c2SRichard Osborne   unsigned Op1, Op2;
487459e35c2SRichard Osborne   DecodeStatus S = Decode2OpInstruction(fieldFromInstruction(Insn, 0, 16),
488459e35c2SRichard Osborne                                         Op1, Op2);
4899fbf57b2SRichard Osborne   if (S != MCDisassembler::Success)
4909fbf57b2SRichard Osborne     return DecodeL2OpInstructionFail(Inst, Insn, Address, Decoder);
4919fbf57b2SRichard Osborne 
492459e35c2SRichard Osborne   DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
493459e35c2SRichard Osborne   DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
494459e35c2SRichard Osborne   return S;
495459e35c2SRichard Osborne }
496459e35c2SRichard Osborne 
DecodeLR2RInstruction(MCInst & Inst,unsigned Insn,uint64_t Address,const MCDisassembler * Decoder)4974ae9745aSMaksim Panchenko static DecodeStatus DecodeLR2RInstruction(MCInst &Inst, unsigned Insn,
4984ae9745aSMaksim Panchenko                                           uint64_t Address,
4994ae9745aSMaksim Panchenko                                           const MCDisassembler *Decoder) {
500459e35c2SRichard Osborne   unsigned Op1, Op2;
501459e35c2SRichard Osborne   DecodeStatus S = Decode2OpInstruction(fieldFromInstruction(Insn, 0, 16),
502459e35c2SRichard Osborne                                         Op1, Op2);
5039fbf57b2SRichard Osborne   if (S != MCDisassembler::Success)
5049fbf57b2SRichard Osborne     return DecodeL2OpInstructionFail(Inst, Insn, Address, Decoder);
5059fbf57b2SRichard Osborne 
506459e35c2SRichard Osborne   DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
507459e35c2SRichard Osborne   DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
508459e35c2SRichard Osborne   return S;
509459e35c2SRichard Osborne }
510459e35c2SRichard Osborne 
Decode3RInstruction(MCInst & Inst,unsigned Insn,uint64_t Address,const MCDisassembler * Decoder)5114ae9745aSMaksim Panchenko static DecodeStatus Decode3RInstruction(MCInst &Inst, unsigned Insn,
5124ae9745aSMaksim Panchenko                                         uint64_t Address,
5134ae9745aSMaksim Panchenko                                         const MCDisassembler *Decoder) {
5143fb73952SRichard Osborne   unsigned Op1, Op2, Op3;
5153fb73952SRichard Osborne   DecodeStatus S = Decode3OpInstruction(Insn, Op1, Op2, Op3);
5163fb73952SRichard Osborne   if (S == MCDisassembler::Success) {
5173fb73952SRichard Osborne     DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
5183fb73952SRichard Osborne     DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
5193fb73952SRichard Osborne     DecodeGRRegsRegisterClass(Inst, Op3, Address, Decoder);
5203fb73952SRichard Osborne   }
5213fb73952SRichard Osborne   return S;
5223fb73952SRichard Osborne }
5233fb73952SRichard Osborne 
Decode3RImmInstruction(MCInst & Inst,unsigned Insn,uint64_t Address,const MCDisassembler * Decoder)5244ae9745aSMaksim Panchenko static DecodeStatus Decode3RImmInstruction(MCInst &Inst, unsigned Insn,
5254ae9745aSMaksim Panchenko                                            uint64_t Address,
5264ae9745aSMaksim Panchenko                                            const MCDisassembler *Decoder) {
527f5a3ffcbSRichard Osborne   unsigned Op1, Op2, Op3;
528f5a3ffcbSRichard Osborne   DecodeStatus S = Decode3OpInstruction(Insn, Op1, Op2, Op3);
529f5a3ffcbSRichard Osborne   if (S == MCDisassembler::Success) {
530e9119e41SJim Grosbach     Inst.addOperand(MCOperand::createImm(Op1));
531f5a3ffcbSRichard Osborne     DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
532f5a3ffcbSRichard Osborne     DecodeGRRegsRegisterClass(Inst, Op3, Address, Decoder);
533f5a3ffcbSRichard Osborne   }
534f5a3ffcbSRichard Osborne   return S;
535f5a3ffcbSRichard Osborne }
536f5a3ffcbSRichard Osborne 
Decode2RUSInstruction(MCInst & Inst,unsigned Insn,uint64_t Address,const MCDisassembler * Decoder)5374ae9745aSMaksim Panchenko static DecodeStatus Decode2RUSInstruction(MCInst &Inst, unsigned Insn,
5384ae9745aSMaksim Panchenko                                           uint64_t Address,
5394ae9745aSMaksim Panchenko                                           const MCDisassembler *Decoder) {
540f063fceeSRichard Osborne   unsigned Op1, Op2, Op3;
541f063fceeSRichard Osborne   DecodeStatus S = Decode3OpInstruction(Insn, Op1, Op2, Op3);
542f063fceeSRichard Osborne   if (S == MCDisassembler::Success) {
543f063fceeSRichard Osborne     DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
544f063fceeSRichard Osborne     DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
545e9119e41SJim Grosbach     Inst.addOperand(MCOperand::createImm(Op3));
546f063fceeSRichard Osborne   }
547f063fceeSRichard Osborne   return S;
548f063fceeSRichard Osborne }
549f063fceeSRichard Osborne 
Decode2RUSBitpInstruction(MCInst & Inst,unsigned Insn,uint64_t Address,const MCDisassembler * Decoder)5504ae9745aSMaksim Panchenko static DecodeStatus Decode2RUSBitpInstruction(MCInst &Inst, unsigned Insn,
5514ae9745aSMaksim Panchenko                                               uint64_t Address,
5524ae9745aSMaksim Panchenko                                               const MCDisassembler *Decoder) {
553f063fceeSRichard Osborne   unsigned Op1, Op2, Op3;
554f063fceeSRichard Osborne   DecodeStatus S = Decode3OpInstruction(Insn, Op1, Op2, Op3);
555f063fceeSRichard Osborne   if (S == MCDisassembler::Success) {
556f063fceeSRichard Osborne     DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
557f063fceeSRichard Osborne     DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
558f063fceeSRichard Osborne     DecodeBitpOperand(Inst, Op3, Address, Decoder);
559f063fceeSRichard Osborne   }
560f063fceeSRichard Osborne   return S;
561f063fceeSRichard Osborne }
562f063fceeSRichard Osborne 
DecodeL3RInstruction(MCInst & Inst,unsigned Insn,uint64_t Address,const MCDisassembler * Decoder)5634ae9745aSMaksim Panchenko static DecodeStatus DecodeL3RInstruction(MCInst &Inst, unsigned Insn,
5644ae9745aSMaksim Panchenko                                          uint64_t Address,
5654ae9745aSMaksim Panchenko                                          const MCDisassembler *Decoder) {
5669fbf57b2SRichard Osborne   unsigned Op1, Op2, Op3;
5679fbf57b2SRichard Osborne   DecodeStatus S =
5689fbf57b2SRichard Osborne     Decode3OpInstruction(fieldFromInstruction(Insn, 0, 16), Op1, Op2, Op3);
5699fbf57b2SRichard Osborne   if (S == MCDisassembler::Success) {
5709fbf57b2SRichard Osborne     DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
5719fbf57b2SRichard Osborne     DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
5729fbf57b2SRichard Osborne     DecodeGRRegsRegisterClass(Inst, Op3, Address, Decoder);
5739fbf57b2SRichard Osborne   }
5749fbf57b2SRichard Osborne   return S;
5759fbf57b2SRichard Osborne }
5769fbf57b2SRichard Osborne 
DecodeL3RSrcDstInstruction(MCInst & Inst,unsigned Insn,uint64_t Address,const MCDisassembler * Decoder)5774ae9745aSMaksim Panchenko static DecodeStatus DecodeL3RSrcDstInstruction(MCInst &Inst, unsigned Insn,
5784ae9745aSMaksim Panchenko                                                uint64_t Address,
5794ae9745aSMaksim Panchenko                                                const MCDisassembler *Decoder) {
5809fbf57b2SRichard Osborne   unsigned Op1, Op2, Op3;
5819fbf57b2SRichard Osborne   DecodeStatus S =
5829fbf57b2SRichard Osborne   Decode3OpInstruction(fieldFromInstruction(Insn, 0, 16), Op1, Op2, Op3);
5839fbf57b2SRichard Osborne   if (S == MCDisassembler::Success) {
5849fbf57b2SRichard Osborne     DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
5859fbf57b2SRichard Osborne     DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
5869fbf57b2SRichard Osborne     DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
5879fbf57b2SRichard Osborne     DecodeGRRegsRegisterClass(Inst, Op3, Address, Decoder);
5889fbf57b2SRichard Osborne   }
5899fbf57b2SRichard Osborne   return S;
5909fbf57b2SRichard Osborne }
5919fbf57b2SRichard Osborne 
DecodeL2RUSInstruction(MCInst & Inst,unsigned Insn,uint64_t Address,const MCDisassembler * Decoder)5924ae9745aSMaksim Panchenko static DecodeStatus DecodeL2RUSInstruction(MCInst &Inst, unsigned Insn,
5934ae9745aSMaksim Panchenko                                            uint64_t Address,
5944ae9745aSMaksim Panchenko                                            const MCDisassembler *Decoder) {
5954e697248SRichard Osborne   unsigned Op1, Op2, Op3;
5964e697248SRichard Osborne   DecodeStatus S =
5974e697248SRichard Osborne   Decode3OpInstruction(fieldFromInstruction(Insn, 0, 16), Op1, Op2, Op3);
5984e697248SRichard Osborne   if (S == MCDisassembler::Success) {
5994e697248SRichard Osborne     DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
6004e697248SRichard Osborne     DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
601e9119e41SJim Grosbach     Inst.addOperand(MCOperand::createImm(Op3));
6024e697248SRichard Osborne   }
6034e697248SRichard Osborne   return S;
6044e697248SRichard Osborne }
6054e697248SRichard Osborne 
DecodeL2RUSBitpInstruction(MCInst & Inst,unsigned Insn,uint64_t Address,const MCDisassembler * Decoder)6064ae9745aSMaksim Panchenko static DecodeStatus DecodeL2RUSBitpInstruction(MCInst &Inst, unsigned Insn,
6074ae9745aSMaksim Panchenko                                                uint64_t Address,
6084ae9745aSMaksim Panchenko                                                const MCDisassembler *Decoder) {
6094e697248SRichard Osborne   unsigned Op1, Op2, Op3;
6104e697248SRichard Osborne   DecodeStatus S =
6114e697248SRichard Osborne   Decode3OpInstruction(fieldFromInstruction(Insn, 0, 16), Op1, Op2, Op3);
6124e697248SRichard Osborne   if (S == MCDisassembler::Success) {
6134e697248SRichard Osborne     DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
6144e697248SRichard Osborne     DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
6154e697248SRichard Osborne     DecodeBitpOperand(Inst, Op3, Address, Decoder);
6164e697248SRichard Osborne   }
6174e697248SRichard Osborne   return S;
6184e697248SRichard Osborne }
6194e697248SRichard Osborne 
DecodeL6RInstruction(MCInst & Inst,unsigned Insn,uint64_t Address,const MCDisassembler * Decoder)6204ae9745aSMaksim Panchenko static DecodeStatus DecodeL6RInstruction(MCInst &Inst, unsigned Insn,
6214ae9745aSMaksim Panchenko                                          uint64_t Address,
6224ae9745aSMaksim Panchenko                                          const MCDisassembler *Decoder) {
62354e31182SRichard Osborne   unsigned Op1, Op2, Op3, Op4, Op5, Op6;
62454e31182SRichard Osborne   DecodeStatus S =
62554e31182SRichard Osborne     Decode3OpInstruction(fieldFromInstruction(Insn, 0, 16), Op1, Op2, Op3);
62654e31182SRichard Osborne   if (S != MCDisassembler::Success)
62754e31182SRichard Osborne     return S;
62854e31182SRichard Osborne   S = Decode3OpInstruction(fieldFromInstruction(Insn, 16, 16), Op4, Op5, Op6);
62954e31182SRichard Osborne   if (S != MCDisassembler::Success)
63054e31182SRichard Osborne     return S;
63154e31182SRichard Osborne   DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
63254e31182SRichard Osborne   DecodeGRRegsRegisterClass(Inst, Op4, Address, Decoder);
63354e31182SRichard Osborne   DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
63454e31182SRichard Osborne   DecodeGRRegsRegisterClass(Inst, Op3, Address, Decoder);
63554e31182SRichard Osborne   DecodeGRRegsRegisterClass(Inst, Op5, Address, Decoder);
63654e31182SRichard Osborne   DecodeGRRegsRegisterClass(Inst, Op6, Address, Decoder);
63754e31182SRichard Osborne   return S;
63854e31182SRichard Osborne }
63954e31182SRichard Osborne 
DecodeL5RInstructionFail(MCInst & Inst,unsigned Insn,uint64_t Address,const MCDisassembler * Decoder)6404ae9745aSMaksim Panchenko static DecodeStatus DecodeL5RInstructionFail(MCInst &Inst, unsigned Insn,
6414ae9745aSMaksim Panchenko                                              uint64_t Address,
6424ae9745aSMaksim Panchenko                                              const MCDisassembler *Decoder) {
643a19fa86aSRichard Osborne   // Try and decode as a L6R instruction.
644a19fa86aSRichard Osborne   Inst.clear();
645a19fa86aSRichard Osborne   unsigned Opcode = fieldFromInstruction(Insn, 27, 5);
646a19fa86aSRichard Osborne   switch (Opcode) {
647a19fa86aSRichard Osborne   case 0x00:
648a19fa86aSRichard Osborne     Inst.setOpcode(XCore::LMUL_l6r);
649a19fa86aSRichard Osborne     return DecodeL6RInstruction(Inst, Insn, Address, Decoder);
650a19fa86aSRichard Osborne   }
651a19fa86aSRichard Osborne   return MCDisassembler::Fail;
652a19fa86aSRichard Osborne }
653a19fa86aSRichard Osborne 
DecodeL5RInstruction(MCInst & Inst,unsigned Insn,uint64_t Address,const MCDisassembler * Decoder)6544ae9745aSMaksim Panchenko static DecodeStatus DecodeL5RInstruction(MCInst &Inst, unsigned Insn,
6554ae9745aSMaksim Panchenko                                          uint64_t Address,
6564ae9745aSMaksim Panchenko                                          const MCDisassembler *Decoder) {
657a19fa86aSRichard Osborne   unsigned Op1, Op2, Op3, Op4, Op5;
658a19fa86aSRichard Osborne   DecodeStatus S =
659a19fa86aSRichard Osborne     Decode3OpInstruction(fieldFromInstruction(Insn, 0, 16), Op1, Op2, Op3);
660a19fa86aSRichard Osborne   if (S != MCDisassembler::Success)
661a19fa86aSRichard Osborne     return DecodeL5RInstructionFail(Inst, Insn, Address, Decoder);
662a19fa86aSRichard Osborne   S = Decode2OpInstruction(fieldFromInstruction(Insn, 16, 16), Op4, Op5);
663a19fa86aSRichard Osborne   if (S != MCDisassembler::Success)
664a19fa86aSRichard Osborne     return DecodeL5RInstructionFail(Inst, Insn, Address, Decoder);
665a19fa86aSRichard Osborne 
666a19fa86aSRichard Osborne   DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
667a19fa86aSRichard Osborne   DecodeGRRegsRegisterClass(Inst, Op4, Address, Decoder);
668a19fa86aSRichard Osborne   DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
669a19fa86aSRichard Osborne   DecodeGRRegsRegisterClass(Inst, Op3, Address, Decoder);
670a19fa86aSRichard Osborne   DecodeGRRegsRegisterClass(Inst, Op5, Address, Decoder);
671a19fa86aSRichard Osborne   return S;
672a19fa86aSRichard Osborne }
673a19fa86aSRichard Osborne 
DecodeL4RSrcDstInstruction(MCInst & Inst,unsigned Insn,uint64_t Address,const MCDisassembler * Decoder)6744ae9745aSMaksim Panchenko static DecodeStatus DecodeL4RSrcDstInstruction(MCInst &Inst, unsigned Insn,
6754ae9745aSMaksim Panchenko                                                uint64_t Address,
6764ae9745aSMaksim Panchenko                                                const MCDisassembler *Decoder) {
6776b86eec8SRichard Osborne   unsigned Op1, Op2, Op3;
6786b86eec8SRichard Osborne   unsigned Op4 = fieldFromInstruction(Insn, 16, 4);
6796b86eec8SRichard Osborne   DecodeStatus S =
6806b86eec8SRichard Osborne     Decode3OpInstruction(fieldFromInstruction(Insn, 0, 16), Op1, Op2, Op3);
6816b86eec8SRichard Osborne   if (S == MCDisassembler::Success) {
6826b86eec8SRichard Osborne     DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
6836b86eec8SRichard Osborne     S = DecodeGRRegsRegisterClass(Inst, Op4, Address, Decoder);
6846b86eec8SRichard Osborne   }
6856b86eec8SRichard Osborne   if (S == MCDisassembler::Success) {
6866b86eec8SRichard Osborne     DecodeGRRegsRegisterClass(Inst, Op4, Address, Decoder);
6876b86eec8SRichard Osborne     DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
6886b86eec8SRichard Osborne     DecodeGRRegsRegisterClass(Inst, Op3, Address, Decoder);
6896b86eec8SRichard Osborne   }
6906b86eec8SRichard Osborne   return S;
6916b86eec8SRichard Osborne }
6926b86eec8SRichard Osborne 
6936b86eec8SRichard Osborne static DecodeStatus
DecodeL4RSrcDstSrcDstInstruction(MCInst & Inst,unsigned Insn,uint64_t Address,const MCDisassembler * Decoder)6946b86eec8SRichard Osborne DecodeL4RSrcDstSrcDstInstruction(MCInst &Inst, unsigned Insn, uint64_t Address,
6954ae9745aSMaksim Panchenko                                  const MCDisassembler *Decoder) {
6966b86eec8SRichard Osborne   unsigned Op1, Op2, Op3;
6976b86eec8SRichard Osborne   unsigned Op4 = fieldFromInstruction(Insn, 16, 4);
6986b86eec8SRichard Osborne   DecodeStatus S =
6996b86eec8SRichard Osborne   Decode3OpInstruction(fieldFromInstruction(Insn, 0, 16), Op1, Op2, Op3);
7006b86eec8SRichard Osborne   if (S == MCDisassembler::Success) {
7016b86eec8SRichard Osborne     DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
7026b86eec8SRichard Osborne     S = DecodeGRRegsRegisterClass(Inst, Op4, Address, Decoder);
7036b86eec8SRichard Osborne   }
7046b86eec8SRichard Osborne   if (S == MCDisassembler::Success) {
7056b86eec8SRichard Osborne     DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
7066b86eec8SRichard Osborne     DecodeGRRegsRegisterClass(Inst, Op4, Address, Decoder);
7076b86eec8SRichard Osborne     DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
7086b86eec8SRichard Osborne     DecodeGRRegsRegisterClass(Inst, Op3, Address, Decoder);
7096b86eec8SRichard Osborne   }
7106b86eec8SRichard Osborne   return S;
7116b86eec8SRichard Osborne }
7126b86eec8SRichard Osborne 
7136fdd6a7bSFangrui Song MCDisassembler::DecodeStatus
getInstruction(MCInst & instr,uint64_t & Size,ArrayRef<uint8_t> Bytes,uint64_t Address,raw_ostream & cStream) const7146fdd6a7bSFangrui Song XCoreDisassembler::getInstruction(MCInst &instr, uint64_t &Size,
7156fdd6a7bSFangrui Song                                   ArrayRef<uint8_t> Bytes, uint64_t Address,
7166fdd6a7bSFangrui Song                                   raw_ostream &cStream) const {
717459e35c2SRichard Osborne   uint16_t insn16;
7181b5562adSRichard Osborne 
7197fc5b874SRafael Espindola   if (!readInstruction16(Bytes, Address, Size, insn16)) {
7201b5562adSRichard Osborne     return Fail;
7211b5562adSRichard Osborne   }
7221b5562adSRichard Osborne 
7231b5562adSRichard Osborne   // Calling the auto-generated decoder function.
724459e35c2SRichard Osborne   DecodeStatus Result = decodeInstruction(DecoderTable16, instr, insn16,
725459e35c2SRichard Osborne                                           Address, this, STI);
7261b5562adSRichard Osborne   if (Result != Fail) {
7271b5562adSRichard Osborne     Size = 2;
7281b5562adSRichard Osborne     return Result;
7291b5562adSRichard Osborne   }
7301b5562adSRichard Osborne 
731459e35c2SRichard Osborne   uint32_t insn32;
732459e35c2SRichard Osborne 
7337fc5b874SRafael Espindola   if (!readInstruction32(Bytes, Address, Size, insn32)) {
734459e35c2SRichard Osborne     return Fail;
735459e35c2SRichard Osborne   }
736459e35c2SRichard Osborne 
737459e35c2SRichard Osborne   // Calling the auto-generated decoder function.
738459e35c2SRichard Osborne   Result = decodeInstruction(DecoderTable32, instr, insn32, Address, this, STI);
739459e35c2SRichard Osborne   if (Result != Fail) {
740459e35c2SRichard Osborne     Size = 4;
741459e35c2SRichard Osborne     return Result;
742459e35c2SRichard Osborne   }
743459e35c2SRichard Osborne 
744e31735a5SRichard Osborne   return Fail;
745e31735a5SRichard Osborne }
746e31735a5SRichard Osborne 
createXCoreDisassembler(const Target & T,const MCSubtargetInfo & STI,MCContext & Ctx)747e31735a5SRichard Osborne static MCDisassembler *createXCoreDisassembler(const Target &T,
748a1bc0f56SLang Hames                                                const MCSubtargetInfo &STI,
749a1bc0f56SLang Hames                                                MCContext &Ctx) {
750a1bc0f56SLang Hames   return new XCoreDisassembler(STI, Ctx);
751e31735a5SRichard Osborne }
752e31735a5SRichard Osborne 
LLVMInitializeXCoreDisassembler()7530dbcb363STom Stellard extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeXCoreDisassembler() {
754e31735a5SRichard Osborne   // Register the disassembler.
755caec5559SMehdi Amini   TargetRegistry::RegisterMCDisassembler(getTheXCoreTarget(),
756e31735a5SRichard Osborne                                          createXCoreDisassembler);
757e31735a5SRichard Osborne }
758