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