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