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 &region,
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