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