131d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu//===-- MBlazeDisassembler.cpp - Disassembler for MicroBlaze -------------===// 2a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck// 3a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck// The LLVM Compiler Infrastructure 4a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck// 5a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck// This file is distributed under the University of Illinois Open Source 6a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck// License. See LICENSE.TXT for details. 7a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck// 8a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck//===----------------------------------------------------------------------===// 9a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck// 10a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck// This file is part of the MBlaze Disassembler. It contains code to translate 11a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck// the data produced by the decoder into MCInsts. 12a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck// 13a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck//===----------------------------------------------------------------------===// 14a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 15a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck#include "MBlazeDisassembler.h" 16d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "MBlaze.h" 17a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck#include "llvm/MC/MCDisassembler.h" 18a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck#include "llvm/MC/MCInst.h" 197fb12ef5a62ae5eef35374d00f62efe9fbdc0d2eBenjamin Kramer#include "llvm/MC/MCInstrDesc.h" 20a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck#include "llvm/Support/Debug.h" 21a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck#include "llvm/Support/MemoryObject.h" 223e74d6fdd248e20a280f1dff3da9a6c689c2c4c3Evan Cheng#include "llvm/Support/TargetRegistry.h" 23a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck#include "llvm/Support/raw_ostream.h" 24a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 25a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck// #include "MBlazeGenDecoderTables.inc" 26a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck// #include "MBlazeGenRegisterNames.inc" 27a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 28c60f9b752381baa6c4b80c0739034660f1748c84Evan Chengnamespace llvm { 291a2f9886a2a60dbd41216468a240446bbfed3e76Benjamin Kramerextern const MCInstrDesc MBlazeInsts[]; 30c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng} 31c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng 32a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peckusing namespace llvm; 33a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 34b78ca423844f19f4a838abb49b4b4fa7ae499707Craig Topperconst uint16_t UNSUPPORTED = -1; 35a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 36b78ca423844f19f4a838abb49b4b4fa7ae499707Craig Topperstatic const uint16_t mblazeBinary2Opcode[] = { 37a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck MBlaze::ADD, MBlaze::RSUB, MBlaze::ADDC, MBlaze::RSUBC, //00,01,02,03 38a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck MBlaze::ADDK, MBlaze::RSUBK, MBlaze::ADDKC, MBlaze::RSUBKC, //04,05,06,07 39a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck MBlaze::ADDI, MBlaze::RSUBI, MBlaze::ADDIC, MBlaze::RSUBIC, //08,09,0A,0B 40a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck MBlaze::ADDIK, MBlaze::RSUBIK, MBlaze::ADDIKC, MBlaze::RSUBIKC, //0C,0D,0E,0F 41a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 42a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck MBlaze::MUL, MBlaze::BSRL, MBlaze::IDIV, MBlaze::GETD, //10,11,12,13 43a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck UNSUPPORTED, UNSUPPORTED, MBlaze::FADD, UNSUPPORTED, //14,15,16,17 44a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck MBlaze::MULI, MBlaze::BSRLI, UNSUPPORTED, MBlaze::GET, //18,19,1A,1B 45a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck UNSUPPORTED, UNSUPPORTED, UNSUPPORTED, UNSUPPORTED, //1C,1D,1E,1F 46a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 47a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck MBlaze::OR, MBlaze::AND, MBlaze::XOR, MBlaze::ANDN, //20,21,22,23 48a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck MBlaze::SEXT8, MBlaze::MFS, MBlaze::BR, MBlaze::BEQ, //24,25,26,27 49a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck MBlaze::ORI, MBlaze::ANDI, MBlaze::XORI, MBlaze::ANDNI, //28,29,2A,2B 50a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck MBlaze::IMM, MBlaze::RTSD, MBlaze::BRI, MBlaze::BEQI, //2C,2D,2E,2F 51a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 52a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck MBlaze::LBU, MBlaze::LHU, MBlaze::LW, UNSUPPORTED, //30,31,32,33 53a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck MBlaze::SB, MBlaze::SH, MBlaze::SW, UNSUPPORTED, //34,35,36,37 54a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck MBlaze::LBUI, MBlaze::LHUI, MBlaze::LWI, UNSUPPORTED, //38,39,3A,3B 55a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck MBlaze::SBI, MBlaze::SHI, MBlaze::SWI, UNSUPPORTED, //3C,3D,3E,3F 56a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck}; 57a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 580a67d92938d77b6a8cde6e1676750264b274cebcWesley Peckstatic unsigned getRD(uint32_t insn) { 59d1200aa4f8b9043bbb63d6076feb82c759a6585aEvan Cheng if (!isMBlazeRegister((insn>>21)&0x1F)) 60e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck return UNSUPPORTED; 61617793d1d6fa28eb47d4fc04d265a6eace6c758cEvan Cheng return getMBlazeRegisterFromNumbering((insn>>21)&0x1F); 62a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck} 63a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 640a67d92938d77b6a8cde6e1676750264b274cebcWesley Peckstatic unsigned getRA(uint32_t insn) { 65617793d1d6fa28eb47d4fc04d265a6eace6c758cEvan Cheng if (!getMBlazeRegisterFromNumbering((insn>>16)&0x1F)) 66e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck return UNSUPPORTED; 67617793d1d6fa28eb47d4fc04d265a6eace6c758cEvan Cheng return getMBlazeRegisterFromNumbering((insn>>16)&0x1F); 68a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck} 69a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 700a67d92938d77b6a8cde6e1676750264b274cebcWesley Peckstatic unsigned getRB(uint32_t insn) { 71617793d1d6fa28eb47d4fc04d265a6eace6c758cEvan Cheng if (!getMBlazeRegisterFromNumbering((insn>>11)&0x1F)) 72e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck return UNSUPPORTED; 73617793d1d6fa28eb47d4fc04d265a6eace6c758cEvan Cheng return getMBlazeRegisterFromNumbering((insn>>11)&0x1F); 74a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck} 75a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 760a67d92938d77b6a8cde6e1676750264b274cebcWesley Peckstatic int64_t getRS(uint32_t insn) { 77d1200aa4f8b9043bbb63d6076feb82c759a6585aEvan Cheng if (!isSpecialMBlazeRegister(insn&0x3FFF)) 78e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck return UNSUPPORTED; 79d1200aa4f8b9043bbb63d6076feb82c759a6585aEvan Cheng return getSpecialMBlazeRegisterFromNumbering(insn&0x3FFF); 80a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck} 81a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 820a67d92938d77b6a8cde6e1676750264b274cebcWesley Peckstatic int64_t getIMM(uint32_t insn) { 83a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck int16_t val = (insn & 0xFFFF); 84a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck return val; 85a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck} 86a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 870a67d92938d77b6a8cde6e1676750264b274cebcWesley Peckstatic int64_t getSHT(uint32_t insn) { 88a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck int16_t val = (insn & 0x1F); 89a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck return val; 90a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck} 91a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 920a67d92938d77b6a8cde6e1676750264b274cebcWesley Peckstatic unsigned getFLAGS(int32_t insn) { 93a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck return (insn & 0x7FF); 94a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck} 95a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 960a67d92938d77b6a8cde6e1676750264b274cebcWesley Peckstatic int64_t getFSL(uint32_t insn) { 97a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck int16_t val = (insn & 0xF); 98a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck return val; 99a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck} 100a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 101a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peckstatic unsigned decodeMUL(uint32_t insn) { 102a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck switch (getFLAGS(insn)) { 103a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck default: return UNSUPPORTED; 104a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0: return MBlaze::MUL; 105a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 1: return MBlaze::MULH; 106a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 2: return MBlaze::MULHSU; 107a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 3: return MBlaze::MULHU; 108a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck } 109a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck} 110a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 111a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peckstatic unsigned decodeSEXT(uint32_t insn) { 112ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck switch (insn&0x7FF) { 113a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck default: return UNSUPPORTED; 114a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x60: return MBlaze::SEXT8; 115a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x68: return MBlaze::WIC; 116a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x64: return MBlaze::WDC; 117a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x66: return MBlaze::WDCC; 118a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x74: return MBlaze::WDCF; 119a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x61: return MBlaze::SEXT16; 120a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x41: return MBlaze::SRL; 121a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x21: return MBlaze::SRC; 122a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x01: return MBlaze::SRA; 1234c729f115212f6d9a7781745598ddcbd38959521Wesley Peck case 0xE0: return MBlaze::CLZ; 124a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck } 125a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck} 126a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 127a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peckstatic unsigned decodeBEQ(uint32_t insn) { 128ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck switch ((insn>>21)&0x1F) { 129a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck default: return UNSUPPORTED; 130a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x00: return MBlaze::BEQ; 131a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x10: return MBlaze::BEQD; 132a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x05: return MBlaze::BGE; 133a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x15: return MBlaze::BGED; 134a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x04: return MBlaze::BGT; 135a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x14: return MBlaze::BGTD; 136a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x03: return MBlaze::BLE; 137a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x13: return MBlaze::BLED; 138a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x02: return MBlaze::BLT; 139a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x12: return MBlaze::BLTD; 140a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x01: return MBlaze::BNE; 141a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x11: return MBlaze::BNED; 142a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck } 143a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck} 144a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 145a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peckstatic unsigned decodeBEQI(uint32_t insn) { 146ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck switch ((insn>>21)&0x1F) { 147a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck default: return UNSUPPORTED; 148a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x00: return MBlaze::BEQI; 149a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x10: return MBlaze::BEQID; 150a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x05: return MBlaze::BGEI; 151a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x15: return MBlaze::BGEID; 152a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x04: return MBlaze::BGTI; 153a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x14: return MBlaze::BGTID; 154a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x03: return MBlaze::BLEI; 155a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x13: return MBlaze::BLEID; 156a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x02: return MBlaze::BLTI; 157a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x12: return MBlaze::BLTID; 158a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x01: return MBlaze::BNEI; 159a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x11: return MBlaze::BNEID; 160a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck } 161a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck} 162a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 163a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peckstatic unsigned decodeBR(uint32_t insn) { 164a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck switch ((insn>>16)&0x1F) { 165a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck default: return UNSUPPORTED; 166a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x00: return MBlaze::BR; 167a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x08: return MBlaze::BRA; 168a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x0C: return MBlaze::BRK; 169a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x10: return MBlaze::BRD; 170a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x14: return MBlaze::BRLD; 171a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x18: return MBlaze::BRAD; 172a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x1C: return MBlaze::BRALD; 173a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck } 174a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck} 175a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 176a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peckstatic unsigned decodeBRI(uint32_t insn) { 1774c729f115212f6d9a7781745598ddcbd38959521Wesley Peck switch (insn&0x3FFFFFF) { 1784c729f115212f6d9a7781745598ddcbd38959521Wesley Peck default: break; 1794c729f115212f6d9a7781745598ddcbd38959521Wesley Peck case 0x0020004: return MBlaze::IDMEMBAR; 1804c729f115212f6d9a7781745598ddcbd38959521Wesley Peck case 0x0220004: return MBlaze::DMEMBAR; 1814c729f115212f6d9a7781745598ddcbd38959521Wesley Peck case 0x0420004: return MBlaze::IMEMBAR; 1824c729f115212f6d9a7781745598ddcbd38959521Wesley Peck } 1834c729f115212f6d9a7781745598ddcbd38959521Wesley Peck 184a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck switch ((insn>>16)&0x1F) { 185a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck default: return UNSUPPORTED; 186a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x00: return MBlaze::BRI; 187a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x08: return MBlaze::BRAI; 188a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x0C: return MBlaze::BRKI; 189a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x10: return MBlaze::BRID; 190a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x14: return MBlaze::BRLID; 191a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x18: return MBlaze::BRAID; 192a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x1C: return MBlaze::BRALID; 193a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck } 194a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck} 195a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 196a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peckstatic unsigned decodeBSRL(uint32_t insn) { 197a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck switch ((insn>>9)&0x3) { 198a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck default: return UNSUPPORTED; 199a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x2: return MBlaze::BSLL; 200a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x1: return MBlaze::BSRA; 201a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x0: return MBlaze::BSRL; 202a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck } 203a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck} 204a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 205a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peckstatic unsigned decodeBSRLI(uint32_t insn) { 206a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck switch ((insn>>9)&0x3) { 207a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck default: return UNSUPPORTED; 208a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x2: return MBlaze::BSLLI; 209a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x1: return MBlaze::BSRAI; 210a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x0: return MBlaze::BSRLI; 211a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck } 212a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck} 213a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 214a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peckstatic unsigned decodeRSUBK(uint32_t insn) { 215a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck switch (getFLAGS(insn)) { 216a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck default: return UNSUPPORTED; 217a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x0: return MBlaze::RSUBK; 218a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x1: return MBlaze::CMP; 219a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x3: return MBlaze::CMPU; 220a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck } 221a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck} 222a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 223a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peckstatic unsigned decodeFADD(uint32_t insn) { 224a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck switch (getFLAGS(insn)) { 225a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck default: return UNSUPPORTED; 226a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x000: return MBlaze::FADD; 227a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x080: return MBlaze::FRSUB; 228a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x100: return MBlaze::FMUL; 229a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x180: return MBlaze::FDIV; 230a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x200: return MBlaze::FCMP_UN; 231a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x210: return MBlaze::FCMP_LT; 232a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x220: return MBlaze::FCMP_EQ; 233a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x230: return MBlaze::FCMP_LE; 234a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x240: return MBlaze::FCMP_GT; 235a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x250: return MBlaze::FCMP_NE; 236a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x260: return MBlaze::FCMP_GE; 237a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x280: return MBlaze::FLT; 238a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x300: return MBlaze::FINT; 239a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x380: return MBlaze::FSQRT; 240a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck } 241a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck} 242a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 243a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peckstatic unsigned decodeGET(uint32_t insn) { 244a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck switch ((insn>>10)&0x3F) { 245a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck default: return UNSUPPORTED; 246a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x00: return MBlaze::GET; 247a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x01: return MBlaze::EGET; 248a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x02: return MBlaze::AGET; 249a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x03: return MBlaze::EAGET; 250a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x04: return MBlaze::TGET; 251a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x05: return MBlaze::TEGET; 252a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x06: return MBlaze::TAGET; 253a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x07: return MBlaze::TEAGET; 254a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x08: return MBlaze::CGET; 255a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x09: return MBlaze::ECGET; 256a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x0A: return MBlaze::CAGET; 257a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x0B: return MBlaze::ECAGET; 258a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x0C: return MBlaze::TCGET; 259a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x0D: return MBlaze::TECGET; 260a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x0E: return MBlaze::TCAGET; 261a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x0F: return MBlaze::TECAGET; 262a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x10: return MBlaze::NGET; 263a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x11: return MBlaze::NEGET; 264a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x12: return MBlaze::NAGET; 265a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x13: return MBlaze::NEAGET; 266a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x14: return MBlaze::TNGET; 267a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x15: return MBlaze::TNEGET; 268a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x16: return MBlaze::TNAGET; 269a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x17: return MBlaze::TNEAGET; 270a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x18: return MBlaze::NCGET; 271a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x19: return MBlaze::NECGET; 272a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x1A: return MBlaze::NCAGET; 273a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x1B: return MBlaze::NECAGET; 274a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x1C: return MBlaze::TNCGET; 275a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x1D: return MBlaze::TNECGET; 276a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x1E: return MBlaze::TNCAGET; 277a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x1F: return MBlaze::TNECAGET; 278a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x20: return MBlaze::PUT; 279a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x22: return MBlaze::APUT; 280a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x24: return MBlaze::TPUT; 281a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x26: return MBlaze::TAPUT; 282a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x28: return MBlaze::CPUT; 283a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x2A: return MBlaze::CAPUT; 284a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x2C: return MBlaze::TCPUT; 285a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x2E: return MBlaze::TCAPUT; 286a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x30: return MBlaze::NPUT; 287a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x32: return MBlaze::NAPUT; 288a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x34: return MBlaze::TNPUT; 289a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x36: return MBlaze::TNAPUT; 290a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x38: return MBlaze::NCPUT; 291a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x3A: return MBlaze::NCAPUT; 292a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x3C: return MBlaze::TNCPUT; 293a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x3E: return MBlaze::TNCAPUT; 294a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck } 295a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck} 296a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 297a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peckstatic unsigned decodeGETD(uint32_t insn) { 298a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck switch ((insn>>5)&0x3F) { 299a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck default: return UNSUPPORTED; 300a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x00: return MBlaze::GETD; 301a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x01: return MBlaze::EGETD; 302a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x02: return MBlaze::AGETD; 303a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x03: return MBlaze::EAGETD; 304a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x04: return MBlaze::TGETD; 305a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x05: return MBlaze::TEGETD; 306a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x06: return MBlaze::TAGETD; 307a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x07: return MBlaze::TEAGETD; 308a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x08: return MBlaze::CGETD; 309a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x09: return MBlaze::ECGETD; 310a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x0A: return MBlaze::CAGETD; 311a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x0B: return MBlaze::ECAGETD; 312a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x0C: return MBlaze::TCGETD; 313a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x0D: return MBlaze::TECGETD; 314a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x0E: return MBlaze::TCAGETD; 315a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x0F: return MBlaze::TECAGETD; 316a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x10: return MBlaze::NGETD; 317a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x11: return MBlaze::NEGETD; 318a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x12: return MBlaze::NAGETD; 319a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x13: return MBlaze::NEAGETD; 320a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x14: return MBlaze::TNGETD; 321a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x15: return MBlaze::TNEGETD; 322a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x16: return MBlaze::TNAGETD; 323a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x17: return MBlaze::TNEAGETD; 324a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x18: return MBlaze::NCGETD; 325a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x19: return MBlaze::NECGETD; 326a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x1A: return MBlaze::NCAGETD; 327a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x1B: return MBlaze::NECAGETD; 328a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x1C: return MBlaze::TNCGETD; 329a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x1D: return MBlaze::TNECGETD; 330a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x1E: return MBlaze::TNCAGETD; 331a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x1F: return MBlaze::TNECAGETD; 332a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x20: return MBlaze::PUTD; 333a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x22: return MBlaze::APUTD; 334a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x24: return MBlaze::TPUTD; 335a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x26: return MBlaze::TAPUTD; 336a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x28: return MBlaze::CPUTD; 337a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x2A: return MBlaze::CAPUTD; 338a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x2C: return MBlaze::TCPUTD; 339a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x2E: return MBlaze::TCAPUTD; 340a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x30: return MBlaze::NPUTD; 341a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x32: return MBlaze::NAPUTD; 342a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x34: return MBlaze::TNPUTD; 343a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x36: return MBlaze::TNAPUTD; 344a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x38: return MBlaze::NCPUTD; 345a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x3A: return MBlaze::NCAPUTD; 346a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x3C: return MBlaze::TNCPUTD; 347a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x3E: return MBlaze::TNCAPUTD; 348a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck } 349a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck} 350a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 351a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peckstatic unsigned decodeIDIV(uint32_t insn) { 352a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck switch (insn&0x3) { 353a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck default: return UNSUPPORTED; 354a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x0: return MBlaze::IDIV; 355a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x2: return MBlaze::IDIVU; 356a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck } 357a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck} 358a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 359ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peckstatic unsigned decodeLBU(uint32_t insn) { 360ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck switch ((insn>>9)&0x1) { 361ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck default: return UNSUPPORTED; 362ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck case 0x0: return MBlaze::LBU; 363ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck case 0x1: return MBlaze::LBUR; 364ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck } 365ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck} 366ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck 367ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peckstatic unsigned decodeLHU(uint32_t insn) { 368ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck switch ((insn>>9)&0x1) { 369ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck default: return UNSUPPORTED; 370ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck case 0x0: return MBlaze::LHU; 371ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck case 0x1: return MBlaze::LHUR; 372ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck } 373ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck} 374ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck 375a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peckstatic unsigned decodeLW(uint32_t insn) { 376a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck switch ((insn>>9)&0x3) { 377a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck default: return UNSUPPORTED; 378a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x0: return MBlaze::LW; 379a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x1: return MBlaze::LWR; 380a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x2: return MBlaze::LWX; 381a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck } 382a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck} 383a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 384ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peckstatic unsigned decodeSB(uint32_t insn) { 385ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck switch ((insn>>9)&0x1) { 386ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck default: return UNSUPPORTED; 387ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck case 0x0: return MBlaze::SB; 388ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck case 0x1: return MBlaze::SBR; 389ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck } 390ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck} 391ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck 392ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peckstatic unsigned decodeSH(uint32_t insn) { 393ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck switch ((insn>>9)&0x1) { 394ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck default: return UNSUPPORTED; 395ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck case 0x0: return MBlaze::SH; 396ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck case 0x1: return MBlaze::SHR; 397ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck } 398ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck} 399ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck 400a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peckstatic unsigned decodeSW(uint32_t insn) { 401a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck switch ((insn>>9)&0x3) { 402a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck default: return UNSUPPORTED; 403a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x0: return MBlaze::SW; 404a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x1: return MBlaze::SWR; 405a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x2: return MBlaze::SWX; 406a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck } 407a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck} 408a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 409a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peckstatic unsigned decodeMFS(uint32_t insn) { 410a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck switch ((insn>>15)&0x1) { 411a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck default: return UNSUPPORTED; 412a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x0: 413ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck switch ((insn>>16)&0x1) { 414a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck default: return UNSUPPORTED; 415ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck case 0x0: return MBlaze::MSRSET; 416ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck case 0x1: return MBlaze::MSRCLR; 417a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck } 418a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x1: 419a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck switch ((insn>>14)&0x1) { 420a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck default: return UNSUPPORTED; 421a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x0: return MBlaze::MFS; 422a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x1: return MBlaze::MTS; 423a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck } 424a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck } 425a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck} 426a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 427a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peckstatic unsigned decodeOR(uint32_t insn) { 428a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck switch (getFLAGS(insn)) { 429a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck default: return UNSUPPORTED; 430a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x000: return MBlaze::OR; 431a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x400: return MBlaze::PCMPBF; 432a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck } 433a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck} 434a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 435a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peckstatic unsigned decodeXOR(uint32_t insn) { 436a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck switch (getFLAGS(insn)) { 437a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck default: return UNSUPPORTED; 438ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck case 0x000: return MBlaze::XOR; 439a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x400: return MBlaze::PCMPEQ; 440a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck } 441a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck} 442a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 443a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peckstatic unsigned decodeANDN(uint32_t insn) { 444a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck switch (getFLAGS(insn)) { 445a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck default: return UNSUPPORTED; 446ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck case 0x000: return MBlaze::ANDN; 447a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x400: return MBlaze::PCMPNE; 448a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck } 449a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck} 450a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 451a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peckstatic unsigned decodeRTSD(uint32_t insn) { 452a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck switch ((insn>>21)&0x1F) { 453a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck default: return UNSUPPORTED; 454a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x10: return MBlaze::RTSD; 455a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x11: return MBlaze::RTID; 456a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x12: return MBlaze::RTBD; 457a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case 0x14: return MBlaze::RTED; 458a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck } 459a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck} 460a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 4610a67d92938d77b6a8cde6e1676750264b274cebcWesley Peckstatic unsigned getOPCODE(uint32_t insn) { 462a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck unsigned opcode = mblazeBinary2Opcode[ (insn>>26)&0x3F ]; 463a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck switch (opcode) { 464a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case MBlaze::MUL: return decodeMUL(insn); 465a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case MBlaze::SEXT8: return decodeSEXT(insn); 466a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case MBlaze::BEQ: return decodeBEQ(insn); 467a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case MBlaze::BEQI: return decodeBEQI(insn); 468a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case MBlaze::BR: return decodeBR(insn); 469a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case MBlaze::BRI: return decodeBRI(insn); 470a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case MBlaze::BSRL: return decodeBSRL(insn); 471a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case MBlaze::BSRLI: return decodeBSRLI(insn); 472a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case MBlaze::RSUBK: return decodeRSUBK(insn); 473a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case MBlaze::FADD: return decodeFADD(insn); 474a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case MBlaze::GET: return decodeGET(insn); 475a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case MBlaze::GETD: return decodeGETD(insn); 476a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case MBlaze::IDIV: return decodeIDIV(insn); 477ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck case MBlaze::LBU: return decodeLBU(insn); 478ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck case MBlaze::LHU: return decodeLHU(insn); 479a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case MBlaze::LW: return decodeLW(insn); 480ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck case MBlaze::SB: return decodeSB(insn); 481ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck case MBlaze::SH: return decodeSH(insn); 482a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case MBlaze::SW: return decodeSW(insn); 483a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case MBlaze::MFS: return decodeMFS(insn); 484a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case MBlaze::OR: return decodeOR(insn); 485a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case MBlaze::XOR: return decodeXOR(insn); 486a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case MBlaze::ANDN: return decodeANDN(insn); 487a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case MBlaze::RTSD: return decodeRTSD(insn); 488a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck default: return opcode; 489a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck } 490a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck} 491a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 492a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck// 493a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck// Public interface for the disassembler 494a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck// 495a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 49683e3f67fb68d497b600da83a62f000fcce7868a9Owen AndersonMCDisassembler::DecodeStatus MBlazeDisassembler::getInstruction(MCInst &instr, 497a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck uint64_t &size, 498adef06a71458ded0716935a61b3d43d164d4df12Derek Schuff const MemoryObject ®ion, 499a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck uint64_t address, 50098c5ddabca1debf935a07d14d0cbc9732374bdb8Owen Anderson raw_ostream &vStream, 50198c5ddabca1debf935a07d14d0cbc9732374bdb8Owen Anderson raw_ostream &cStream) const { 502a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck // The machine instruction. 503a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck uint32_t insn; 504e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck uint64_t read; 505a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck uint8_t bytes[4]; 506ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck 507e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck // By default we consume 1 byte on failure 508e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck size = 1; 50990eff7337d36b0398a22eac29da87c9c07b03b78Wesley Peck 510a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck // We want to read exactly 4 bytes of data. 511e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck if (region.readBytes(address, 4, (uint8_t*)bytes, &read) == -1 || read < 4) 51283e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson return Fail; 513a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 514a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck // Encoded as a big-endian 32-bit word in the stream. 515a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck insn = (bytes[0]<<24) | (bytes[1]<<16) | (bytes[2]<< 8) | (bytes[3]<<0); 516a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 517a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck // Get the MCInst opcode from the binary instruction and make sure 518a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck // that it is a valid instruction. 5190a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck unsigned opcode = getOPCODE(insn); 5200a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck if (opcode == UNSUPPORTED) 52183e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson return Fail; 522a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 523a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck instr.setOpcode(opcode); 524a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 525e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck unsigned RD = getRD(insn); 526e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck unsigned RA = getRA(insn); 527e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck unsigned RB = getRB(insn); 528e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck unsigned RS = getRS(insn); 529e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck 530a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck uint64_t tsFlags = MBlazeInsts[opcode].TSFlags; 5310a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck switch ((tsFlags & MBlazeII::FormMask)) { 532e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck default: 53383e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson return Fail; 534a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 5354c729f115212f6d9a7781745598ddcbd38959521Wesley Peck case MBlazeII::FC: 5364c729f115212f6d9a7781745598ddcbd38959521Wesley Peck break; 5374c729f115212f6d9a7781745598ddcbd38959521Wesley Peck 538ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck case MBlazeII::FRRRR: 539e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck if (RD == UNSUPPORTED || RA == UNSUPPORTED || RB == UNSUPPORTED) 54083e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson return Fail; 541e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck instr.addOperand(MCOperand::CreateReg(RD)); 542e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck instr.addOperand(MCOperand::CreateReg(RB)); 543e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck instr.addOperand(MCOperand::CreateReg(RA)); 544ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck break; 545ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck 546a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case MBlazeII::FRRR: 547e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck if (RD == UNSUPPORTED || RA == UNSUPPORTED || RB == UNSUPPORTED) 54883e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson return Fail; 549e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck instr.addOperand(MCOperand::CreateReg(RD)); 550e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck instr.addOperand(MCOperand::CreateReg(RA)); 551e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck instr.addOperand(MCOperand::CreateReg(RB)); 552a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck break; 553a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 5544c729f115212f6d9a7781745598ddcbd38959521Wesley Peck case MBlazeII::FRR: 5554c729f115212f6d9a7781745598ddcbd38959521Wesley Peck if (RD == UNSUPPORTED || RA == UNSUPPORTED) 5564c729f115212f6d9a7781745598ddcbd38959521Wesley Peck return Fail; 5574c729f115212f6d9a7781745598ddcbd38959521Wesley Peck instr.addOperand(MCOperand::CreateReg(RD)); 5584c729f115212f6d9a7781745598ddcbd38959521Wesley Peck instr.addOperand(MCOperand::CreateReg(RA)); 5594c729f115212f6d9a7781745598ddcbd38959521Wesley Peck break; 5604c729f115212f6d9a7781745598ddcbd38959521Wesley Peck 561ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck case MBlazeII::FRI: 562ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck switch (opcode) { 563e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck default: 56483e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson return Fail; 565ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck case MBlaze::MFS: 566e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck if (RD == UNSUPPORTED) 56783e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson return Fail; 568e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck instr.addOperand(MCOperand::CreateReg(RD)); 569ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck instr.addOperand(MCOperand::CreateImm(insn&0x3FFF)); 570ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck break; 571ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck case MBlaze::MTS: 572e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck if (RA == UNSUPPORTED) 57383e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson return Fail; 574ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck instr.addOperand(MCOperand::CreateImm(insn&0x3FFF)); 575e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck instr.addOperand(MCOperand::CreateReg(RA)); 576ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck break; 577ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck case MBlaze::MSRSET: 578ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck case MBlaze::MSRCLR: 579e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck if (RD == UNSUPPORTED) 58083e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson return Fail; 581e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck instr.addOperand(MCOperand::CreateReg(RD)); 582ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck instr.addOperand(MCOperand::CreateImm(insn&0x7FFF)); 583ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck break; 584ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck } 585ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck break; 586ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck 587a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case MBlazeII::FRRI: 588e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck if (RD == UNSUPPORTED || RA == UNSUPPORTED) 58983e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson return Fail; 590e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck instr.addOperand(MCOperand::CreateReg(RD)); 591e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck instr.addOperand(MCOperand::CreateReg(RA)); 592ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck switch (opcode) { 593ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck default: 594ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck instr.addOperand(MCOperand::CreateImm(getIMM(insn))); 595ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck break; 596ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck case MBlaze::BSRLI: 597ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck case MBlaze::BSRAI: 598ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck case MBlaze::BSLLI: 599ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck instr.addOperand(MCOperand::CreateImm(insn&0x1F)); 600ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck break; 601ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck } 602a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck break; 603a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 604a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case MBlazeII::FCRR: 605e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck if (RA == UNSUPPORTED || RB == UNSUPPORTED) 60683e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson return Fail; 607e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck instr.addOperand(MCOperand::CreateReg(RA)); 608e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck instr.addOperand(MCOperand::CreateReg(RB)); 609a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck break; 610a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 611a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case MBlazeII::FCRI: 612e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck if (RA == UNSUPPORTED) 61383e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson return Fail; 614e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck instr.addOperand(MCOperand::CreateReg(RA)); 6150a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck instr.addOperand(MCOperand::CreateImm(getIMM(insn))); 616a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck break; 617a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 618a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case MBlazeII::FRCR: 619e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck if (RD == UNSUPPORTED || RB == UNSUPPORTED) 62083e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson return Fail; 621e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck instr.addOperand(MCOperand::CreateReg(RD)); 622e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck instr.addOperand(MCOperand::CreateReg(RB)); 623a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck break; 624a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 625a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case MBlazeII::FRCI: 626e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck if (RD == UNSUPPORTED) 62783e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson return Fail; 628e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck instr.addOperand(MCOperand::CreateReg(RD)); 6290a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck instr.addOperand(MCOperand::CreateImm(getIMM(insn))); 630a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck break; 631a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 632a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case MBlazeII::FCCR: 633e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck if (RB == UNSUPPORTED) 63483e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson return Fail; 635e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck instr.addOperand(MCOperand::CreateReg(RB)); 636a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck break; 637a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 638a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case MBlazeII::FCCI: 6390a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck instr.addOperand(MCOperand::CreateImm(getIMM(insn))); 640a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck break; 641a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 642a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case MBlazeII::FRRCI: 643e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck if (RD == UNSUPPORTED || RA == UNSUPPORTED) 64483e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson return Fail; 645e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck instr.addOperand(MCOperand::CreateReg(RD)); 646e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck instr.addOperand(MCOperand::CreateReg(RA)); 6470a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck instr.addOperand(MCOperand::CreateImm(getSHT(insn))); 648a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck break; 649a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 650a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case MBlazeII::FRRC: 651e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck if (RD == UNSUPPORTED || RA == UNSUPPORTED) 65283e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson return Fail; 653e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck instr.addOperand(MCOperand::CreateReg(RD)); 654e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck instr.addOperand(MCOperand::CreateReg(RA)); 655a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck break; 656a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 657a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case MBlazeII::FRCX: 658e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck if (RD == UNSUPPORTED) 65983e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson return Fail; 660e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck instr.addOperand(MCOperand::CreateReg(RD)); 6610a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck instr.addOperand(MCOperand::CreateImm(getFSL(insn))); 662a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck break; 663a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 664a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case MBlazeII::FRCS: 665e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck if (RD == UNSUPPORTED || RS == UNSUPPORTED) 66683e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson return Fail; 667e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck instr.addOperand(MCOperand::CreateReg(RD)); 668e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck instr.addOperand(MCOperand::CreateReg(RS)); 669a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck break; 670a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 671a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case MBlazeII::FCRCS: 672e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck if (RS == UNSUPPORTED || RA == UNSUPPORTED) 67383e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson return Fail; 674e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck instr.addOperand(MCOperand::CreateReg(RS)); 675e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck instr.addOperand(MCOperand::CreateReg(RA)); 676a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck break; 677a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 678a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case MBlazeII::FCRCX: 679e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck if (RA == UNSUPPORTED) 68083e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson return Fail; 681e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck instr.addOperand(MCOperand::CreateReg(RA)); 6820a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck instr.addOperand(MCOperand::CreateImm(getFSL(insn))); 683a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck break; 684a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 685a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case MBlazeII::FCX: 6860a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck instr.addOperand(MCOperand::CreateImm(getFSL(insn))); 687a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck break; 688a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 689a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case MBlazeII::FCR: 690e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck if (RB == UNSUPPORTED) 69183e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson return Fail; 692e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck instr.addOperand(MCOperand::CreateReg(RB)); 693a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck break; 694a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 695a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck case MBlazeII::FRIR: 696e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck if (RD == UNSUPPORTED || RA == UNSUPPORTED) 69783e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson return Fail; 698e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck instr.addOperand(MCOperand::CreateReg(RD)); 6990a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck instr.addOperand(MCOperand::CreateImm(getIMM(insn))); 700e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck instr.addOperand(MCOperand::CreateReg(RA)); 701a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck break; 702a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck } 703a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 704e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck // We always consume 4 bytes of data on success 705e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck size = 4; 706e53060fdf436ae4a88f1d27328803f7d82811120Wesley Peck 70783e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson return Success; 708a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck} 709a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 710b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloystatic MCDisassembler *createMBlazeDisassembler(const Target &T, 711b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy const MCSubtargetInfo &STI) { 712b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy return new MBlazeDisassembler(STI); 713a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck} 714a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck 715ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peckextern "C" void LLVMInitializeMBlazeDisassembler() { 716a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck // Register the disassembler. 717ec57d53342827a17022b710cba9a9f4420d9ddceWesley Peck TargetRegistry::RegisterMCDisassembler(TheMBlazeTarget, 718a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck createMBlazeDisassembler); 719a06038369b830bb83742b6b39775f39dd9e69ae2Wesley Peck} 720