blob: 9560f3fc52477e235fbb4a66d407e89a6a8b094f [file] [log] [blame]
Akira Hatanaka71928e62012-04-17 18:03:21 +00001//===- MipsDisassembler.cpp - Disassembler for Mips -------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file is part of the Mips Disassembler.
11//
12//===----------------------------------------------------------------------===//
13
14#include "Mips.h"
Akira Hatanaka9bf2b562012-07-09 18:46:47 +000015#include "MipsRegisterInfo.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000016#include "MipsSubtarget.h"
Akira Hatanaka71928e62012-04-17 18:03:21 +000017#include "llvm/MC/MCDisassembler.h"
Jim Grosbachecaef492012-08-14 19:06:05 +000018#include "llvm/MC/MCFixedLenDisassembler.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000019#include "llvm/MC/MCInst.h"
20#include "llvm/MC/MCSubtargetInfo.h"
21#include "llvm/Support/MathExtras.h"
Akira Hatanaka71928e62012-04-17 18:03:21 +000022#include "llvm/Support/MemoryObject.h"
23#include "llvm/Support/TargetRegistry.h"
Akira Hatanaka71928e62012-04-17 18:03:21 +000024
Akira Hatanaka71928e62012-04-17 18:03:21 +000025using namespace llvm;
26
27typedef MCDisassembler::DecodeStatus DecodeStatus;
28
Benjamin Kramercb3e98c2012-05-01 14:34:24 +000029namespace {
30
Akira Hatanaka9bf2b562012-07-09 18:46:47 +000031/// MipsDisassemblerBase - a disasembler class for Mips.
32class MipsDisassemblerBase : public MCDisassembler {
Akira Hatanaka71928e62012-04-17 18:03:21 +000033public:
34 /// Constructor - Initializes the disassembler.
35 ///
Akira Hatanaka9bf2b562012-07-09 18:46:47 +000036 MipsDisassemblerBase(const MCSubtargetInfo &STI, const MCRegisterInfo *Info,
37 bool bigEndian) :
38 MCDisassembler(STI), RegInfo(Info), isBigEndian(bigEndian) {}
Akira Hatanaka71928e62012-04-17 18:03:21 +000039
Akira Hatanaka9bf2b562012-07-09 18:46:47 +000040 virtual ~MipsDisassemblerBase() {}
Akira Hatanaka71928e62012-04-17 18:03:21 +000041
Akira Hatanaka9bf2b562012-07-09 18:46:47 +000042 const MCRegisterInfo *getRegInfo() const { return RegInfo; }
43
Akira Hatanaka71928e62012-04-17 18:03:21 +000044private:
Akira Hatanaka9bf2b562012-07-09 18:46:47 +000045 const MCRegisterInfo *RegInfo;
46protected:
Akira Hatanaka71928e62012-04-17 18:03:21 +000047 bool isBigEndian;
48};
49
Akira Hatanaka9bf2b562012-07-09 18:46:47 +000050/// MipsDisassembler - a disasembler class for Mips32.
51class MipsDisassembler : public MipsDisassemblerBase {
52public:
53 /// Constructor - Initializes the disassembler.
54 ///
55 MipsDisassembler(const MCSubtargetInfo &STI, const MCRegisterInfo *Info,
56 bool bigEndian) :
57 MipsDisassemblerBase(STI, Info, bigEndian) {}
58
59 /// getInstruction - See MCDisassembler.
60 virtual DecodeStatus getInstruction(MCInst &instr,
61 uint64_t &size,
62 const MemoryObject &region,
63 uint64_t address,
64 raw_ostream &vStream,
65 raw_ostream &cStream) const;
66};
67
Akira Hatanaka71928e62012-04-17 18:03:21 +000068
69/// Mips64Disassembler - a disasembler class for Mips64.
Akira Hatanaka9bf2b562012-07-09 18:46:47 +000070class Mips64Disassembler : public MipsDisassemblerBase {
Akira Hatanaka71928e62012-04-17 18:03:21 +000071public:
72 /// Constructor - Initializes the disassembler.
73 ///
Akira Hatanaka9bf2b562012-07-09 18:46:47 +000074 Mips64Disassembler(const MCSubtargetInfo &STI, const MCRegisterInfo *Info,
75 bool bigEndian) :
76 MipsDisassemblerBase(STI, Info, bigEndian) {}
Akira Hatanaka71928e62012-04-17 18:03:21 +000077
78 /// getInstruction - See MCDisassembler.
Akira Hatanaka9bf2b562012-07-09 18:46:47 +000079 virtual DecodeStatus getInstruction(MCInst &instr,
80 uint64_t &size,
81 const MemoryObject &region,
82 uint64_t address,
83 raw_ostream &vStream,
84 raw_ostream &cStream) const;
Akira Hatanaka71928e62012-04-17 18:03:21 +000085};
86
Benjamin Kramercb3e98c2012-05-01 14:34:24 +000087} // end anonymous namespace
88
Akira Hatanaka71928e62012-04-17 18:03:21 +000089// Forward declare these because the autogenerated code will reference them.
90// Definitions are further down.
91static DecodeStatus DecodeCPU64RegsRegisterClass(MCInst &Inst,
92 unsigned RegNo,
93 uint64_t Address,
94 const void *Decoder);
95
96static DecodeStatus DecodeCPURegsRegisterClass(MCInst &Inst,
97 unsigned RegNo,
98 uint64_t Address,
99 const void *Decoder);
100
Akira Hatanakaecabd1a2012-09-27 02:01:10 +0000101static DecodeStatus DecodeDSPRegsRegisterClass(MCInst &Inst,
102 unsigned RegNo,
103 uint64_t Address,
104 const void *Decoder);
105
Akira Hatanaka71928e62012-04-17 18:03:21 +0000106static DecodeStatus DecodeFGR64RegisterClass(MCInst &Inst,
107 unsigned RegNo,
108 uint64_t Address,
109 const void *Decoder);
110
111static DecodeStatus DecodeFGR32RegisterClass(MCInst &Inst,
112 unsigned RegNo,
113 uint64_t Address,
114 const void *Decoder);
115
116static DecodeStatus DecodeCCRRegisterClass(MCInst &Inst,
117 unsigned RegNo,
118 uint64_t Address,
119 const void *Decoder);
120
121static DecodeStatus DecodeHWRegsRegisterClass(MCInst &Inst,
122 unsigned Insn,
123 uint64_t Address,
124 const void *Decoder);
125
126static DecodeStatus DecodeAFGR64RegisterClass(MCInst &Inst,
127 unsigned RegNo,
128 uint64_t Address,
129 const void *Decoder);
130
Jack Carter2a74a87b2013-01-17 00:28:20 +0000131static DecodeStatus DecodeHWRegs64RegisterClass(MCInst &Inst,
132 unsigned Insn,
133 uint64_t Address,
134 const void *Decoder);
135
Akira Hatanakaecabd1a2012-09-27 02:01:10 +0000136static DecodeStatus DecodeACRegsRegisterClass(MCInst &Inst,
137 unsigned RegNo,
138 uint64_t Address,
139 const void *Decoder);
140
Akira Hatanaka71928e62012-04-17 18:03:21 +0000141static DecodeStatus DecodeBranchTarget(MCInst &Inst,
142 unsigned Offset,
143 uint64_t Address,
144 const void *Decoder);
145
146static DecodeStatus DecodeBC1(MCInst &Inst,
147 unsigned Insn,
148 uint64_t Address,
149 const void *Decoder);
150
151
152static DecodeStatus DecodeJumpTarget(MCInst &Inst,
153 unsigned Insn,
154 uint64_t Address,
155 const void *Decoder);
156
157static DecodeStatus DecodeMem(MCInst &Inst,
158 unsigned Insn,
159 uint64_t Address,
160 const void *Decoder);
161
162static DecodeStatus DecodeFMem(MCInst &Inst, unsigned Insn,
163 uint64_t Address,
164 const void *Decoder);
165
166static DecodeStatus DecodeSimm16(MCInst &Inst,
167 unsigned Insn,
168 uint64_t Address,
169 const void *Decoder);
170
171static DecodeStatus DecodeCondCode(MCInst &Inst,
172 unsigned Insn,
173 uint64_t Address,
174 const void *Decoder);
175
176static DecodeStatus DecodeInsSize(MCInst &Inst,
177 unsigned Insn,
178 uint64_t Address,
179 const void *Decoder);
180
181static DecodeStatus DecodeExtSize(MCInst &Inst,
182 unsigned Insn,
183 uint64_t Address,
184 const void *Decoder);
185
186namespace llvm {
187extern Target TheMipselTarget, TheMipsTarget, TheMips64Target,
188 TheMips64elTarget;
189}
190
191static MCDisassembler *createMipsDisassembler(
192 const Target &T,
193 const MCSubtargetInfo &STI) {
Akira Hatanaka9bf2b562012-07-09 18:46:47 +0000194 return new MipsDisassembler(STI, T.createMCRegInfo(""), true);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000195}
196
197static MCDisassembler *createMipselDisassembler(
198 const Target &T,
199 const MCSubtargetInfo &STI) {
Akira Hatanaka9bf2b562012-07-09 18:46:47 +0000200 return new MipsDisassembler(STI, T.createMCRegInfo(""), false);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000201}
202
203static MCDisassembler *createMips64Disassembler(
204 const Target &T,
205 const MCSubtargetInfo &STI) {
Akira Hatanaka9bf2b562012-07-09 18:46:47 +0000206 return new Mips64Disassembler(STI, T.createMCRegInfo(""), true);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000207}
208
209static MCDisassembler *createMips64elDisassembler(
210 const Target &T,
211 const MCSubtargetInfo &STI) {
Akira Hatanaka9bf2b562012-07-09 18:46:47 +0000212 return new Mips64Disassembler(STI, T.createMCRegInfo(""), false);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000213}
214
215extern "C" void LLVMInitializeMipsDisassembler() {
216 // Register the disassembler.
217 TargetRegistry::RegisterMCDisassembler(TheMipsTarget,
218 createMipsDisassembler);
219 TargetRegistry::RegisterMCDisassembler(TheMipselTarget,
220 createMipselDisassembler);
221 TargetRegistry::RegisterMCDisassembler(TheMips64Target,
222 createMips64Disassembler);
223 TargetRegistry::RegisterMCDisassembler(TheMips64elTarget,
224 createMips64elDisassembler);
225}
226
227
228#include "MipsGenDisassemblerTables.inc"
229
230 /// readInstruction - read four bytes from the MemoryObject
231 /// and return 32 bit word sorted according to the given endianess
232static DecodeStatus readInstruction32(const MemoryObject &region,
233 uint64_t address,
234 uint64_t &size,
235 uint32_t &insn,
236 bool isBigEndian) {
237 uint8_t Bytes[4];
238
239 // We want to read exactly 4 Bytes of data.
240 if (region.readBytes(address, 4, (uint8_t*)Bytes, NULL) == -1) {
241 size = 0;
242 return MCDisassembler::Fail;
243 }
244
245 if (isBigEndian) {
246 // Encoded as a big-endian 32-bit word in the stream.
247 insn = (Bytes[3] << 0) |
248 (Bytes[2] << 8) |
249 (Bytes[1] << 16) |
250 (Bytes[0] << 24);
251 }
252 else {
253 // Encoded as a small-endian 32-bit word in the stream.
254 insn = (Bytes[0] << 0) |
255 (Bytes[1] << 8) |
256 (Bytes[2] << 16) |
257 (Bytes[3] << 24);
258 }
259
260 return MCDisassembler::Success;
261}
262
263DecodeStatus
264MipsDisassembler::getInstruction(MCInst &instr,
265 uint64_t &Size,
266 const MemoryObject &Region,
267 uint64_t Address,
268 raw_ostream &vStream,
269 raw_ostream &cStream) const {
270 uint32_t Insn;
271
272 DecodeStatus Result = readInstruction32(Region, Address, Size,
273 Insn, isBigEndian);
274 if (Result == MCDisassembler::Fail)
275 return MCDisassembler::Fail;
276
277 // Calling the auto-generated decoder function.
Jim Grosbachecaef492012-08-14 19:06:05 +0000278 Result = decodeInstruction(DecoderTableMips32, instr, Insn, Address,
279 this, STI);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000280 if (Result != MCDisassembler::Fail) {
281 Size = 4;
282 return Result;
283 }
284
285 return MCDisassembler::Fail;
286}
287
288DecodeStatus
289Mips64Disassembler::getInstruction(MCInst &instr,
290 uint64_t &Size,
291 const MemoryObject &Region,
292 uint64_t Address,
293 raw_ostream &vStream,
294 raw_ostream &cStream) const {
295 uint32_t Insn;
296
297 DecodeStatus Result = readInstruction32(Region, Address, Size,
298 Insn, isBigEndian);
299 if (Result == MCDisassembler::Fail)
300 return MCDisassembler::Fail;
301
302 // Calling the auto-generated decoder function.
Jim Grosbachecaef492012-08-14 19:06:05 +0000303 Result = decodeInstruction(DecoderTableMips6432, instr, Insn, Address,
304 this, STI);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000305 if (Result != MCDisassembler::Fail) {
306 Size = 4;
307 return Result;
308 }
309 // If we fail to decode in Mips64 decoder space we can try in Mips32
Jim Grosbachecaef492012-08-14 19:06:05 +0000310 Result = decodeInstruction(DecoderTableMips32, instr, Insn, Address,
311 this, STI);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000312 if (Result != MCDisassembler::Fail) {
313 Size = 4;
314 return Result;
315 }
316
317 return MCDisassembler::Fail;
318}
319
Akira Hatanaka9bf2b562012-07-09 18:46:47 +0000320static unsigned getReg(const void *D, unsigned RC, unsigned RegNo) {
321 const MipsDisassemblerBase *Dis = static_cast<const MipsDisassemblerBase*>(D);
322 return *(Dis->getRegInfo()->getRegClass(RC).begin() + RegNo);
323}
324
Akira Hatanaka71928e62012-04-17 18:03:21 +0000325static DecodeStatus DecodeCPU64RegsRegisterClass(MCInst &Inst,
326 unsigned RegNo,
327 uint64_t Address,
328 const void *Decoder) {
329
330 if (RegNo > 31)
331 return MCDisassembler::Fail;
332
Akira Hatanaka9bf2b562012-07-09 18:46:47 +0000333 unsigned Reg = getReg(Decoder, Mips::CPU64RegsRegClassID, RegNo);
334 Inst.addOperand(MCOperand::CreateReg(Reg));
Akira Hatanaka71928e62012-04-17 18:03:21 +0000335 return MCDisassembler::Success;
336}
337
338static DecodeStatus DecodeCPURegsRegisterClass(MCInst &Inst,
339 unsigned RegNo,
340 uint64_t Address,
341 const void *Decoder) {
342 if (RegNo > 31)
343 return MCDisassembler::Fail;
Akira Hatanaka9bf2b562012-07-09 18:46:47 +0000344 unsigned Reg = getReg(Decoder, Mips::CPURegsRegClassID, RegNo);
345 Inst.addOperand(MCOperand::CreateReg(Reg));
Akira Hatanaka71928e62012-04-17 18:03:21 +0000346 return MCDisassembler::Success;
347}
348
Akira Hatanakaecabd1a2012-09-27 02:01:10 +0000349static DecodeStatus DecodeDSPRegsRegisterClass(MCInst &Inst,
350 unsigned RegNo,
351 uint64_t Address,
352 const void *Decoder) {
353 return DecodeCPURegsRegisterClass(Inst, RegNo, Address, Decoder);
354}
355
Akira Hatanaka71928e62012-04-17 18:03:21 +0000356static DecodeStatus DecodeFGR64RegisterClass(MCInst &Inst,
357 unsigned RegNo,
358 uint64_t Address,
359 const void *Decoder) {
360 if (RegNo > 31)
361 return MCDisassembler::Fail;
362
Akira Hatanaka9bf2b562012-07-09 18:46:47 +0000363 unsigned Reg = getReg(Decoder, Mips::FGR64RegClassID, RegNo);
364 Inst.addOperand(MCOperand::CreateReg(Reg));
Akira Hatanaka71928e62012-04-17 18:03:21 +0000365 return MCDisassembler::Success;
366}
367
368static DecodeStatus DecodeFGR32RegisterClass(MCInst &Inst,
369 unsigned RegNo,
370 uint64_t Address,
371 const void *Decoder) {
372 if (RegNo > 31)
373 return MCDisassembler::Fail;
374
Akira Hatanaka9bf2b562012-07-09 18:46:47 +0000375 unsigned Reg = getReg(Decoder, Mips::FGR32RegClassID, RegNo);
376 Inst.addOperand(MCOperand::CreateReg(Reg));
Akira Hatanaka71928e62012-04-17 18:03:21 +0000377 return MCDisassembler::Success;
378}
379
380static DecodeStatus DecodeCCRRegisterClass(MCInst &Inst,
381 unsigned RegNo,
382 uint64_t Address,
383 const void *Decoder) {
384 Inst.addOperand(MCOperand::CreateReg(RegNo));
385 return MCDisassembler::Success;
386}
387
388static DecodeStatus DecodeMem(MCInst &Inst,
389 unsigned Insn,
390 uint64_t Address,
391 const void *Decoder) {
392 int Offset = SignExtend32<16>(Insn & 0xffff);
Jim Grosbachecaef492012-08-14 19:06:05 +0000393 unsigned Reg = fieldFromInstruction(Insn, 16, 5);
394 unsigned Base = fieldFromInstruction(Insn, 21, 5);
Akira Hatanaka9bf2b562012-07-09 18:46:47 +0000395
396 Reg = getReg(Decoder, Mips::CPURegsRegClassID, Reg);
397 Base = getReg(Decoder, Mips::CPURegsRegClassID, Base);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000398
399 if(Inst.getOpcode() == Mips::SC){
Akira Hatanaka9bf2b562012-07-09 18:46:47 +0000400 Inst.addOperand(MCOperand::CreateReg(Reg));
Akira Hatanaka71928e62012-04-17 18:03:21 +0000401 }
402
Akira Hatanaka9bf2b562012-07-09 18:46:47 +0000403 Inst.addOperand(MCOperand::CreateReg(Reg));
404 Inst.addOperand(MCOperand::CreateReg(Base));
Akira Hatanaka71928e62012-04-17 18:03:21 +0000405 Inst.addOperand(MCOperand::CreateImm(Offset));
406
407 return MCDisassembler::Success;
408}
409
410static DecodeStatus DecodeFMem(MCInst &Inst,
411 unsigned Insn,
412 uint64_t Address,
413 const void *Decoder) {
414 int Offset = SignExtend32<16>(Insn & 0xffff);
Jim Grosbachecaef492012-08-14 19:06:05 +0000415 unsigned Reg = fieldFromInstruction(Insn, 16, 5);
416 unsigned Base = fieldFromInstruction(Insn, 21, 5);
Akira Hatanaka71928e62012-04-17 18:03:21 +0000417
Akira Hatanaka9bf2b562012-07-09 18:46:47 +0000418 Reg = getReg(Decoder, Mips::FGR64RegClassID, Reg);
419 Base = getReg(Decoder, Mips::CPURegsRegClassID, Base);
420
421 Inst.addOperand(MCOperand::CreateReg(Reg));
422 Inst.addOperand(MCOperand::CreateReg(Base));
Akira Hatanaka71928e62012-04-17 18:03:21 +0000423 Inst.addOperand(MCOperand::CreateImm(Offset));
424
425 return MCDisassembler::Success;
426}
427
428
429static DecodeStatus DecodeHWRegsRegisterClass(MCInst &Inst,
430 unsigned RegNo,
431 uint64_t Address,
432 const void *Decoder) {
433 // Currently only hardware register 29 is supported.
434 if (RegNo != 29)
435 return MCDisassembler::Fail;
436 Inst.addOperand(MCOperand::CreateReg(Mips::HWR29));
437 return MCDisassembler::Success;
438}
439
440static DecodeStatus DecodeCondCode(MCInst &Inst,
441 unsigned Insn,
442 uint64_t Address,
443 const void *Decoder) {
444 int CondCode = Insn & 0xf;
445 Inst.addOperand(MCOperand::CreateImm(CondCode));
446 return MCDisassembler::Success;
447}
448
449static DecodeStatus DecodeAFGR64RegisterClass(MCInst &Inst,
450 unsigned RegNo,
451 uint64_t Address,
452 const void *Decoder) {
Akira Hatanaka9bf2b562012-07-09 18:46:47 +0000453 if (RegNo > 30 || RegNo %2)
Akira Hatanaka71928e62012-04-17 18:03:21 +0000454 return MCDisassembler::Fail;
455
Akira Hatanaka9bf2b562012-07-09 18:46:47 +0000456 ;
457 unsigned Reg = getReg(Decoder, Mips::AFGR64RegClassID, RegNo /2);
458 Inst.addOperand(MCOperand::CreateReg(Reg));
Akira Hatanaka71928e62012-04-17 18:03:21 +0000459 return MCDisassembler::Success;
460}
461
Jack Carter2a74a87b2013-01-17 00:28:20 +0000462static DecodeStatus DecodeHWRegs64RegisterClass(MCInst &Inst,
463 unsigned RegNo,
464 uint64_t Address,
465 const void *Decoder) {
466 //Currently only hardware register 29 is supported
467 if (RegNo != 29)
468 return MCDisassembler::Fail;
469 Inst.addOperand(MCOperand::CreateReg(Mips::HWR29_64));
470 return MCDisassembler::Success;
471}
472
Akira Hatanakaecabd1a2012-09-27 02:01:10 +0000473static DecodeStatus DecodeACRegsRegisterClass(MCInst &Inst,
474 unsigned RegNo,
475 uint64_t Address,
476 const void *Decoder) {
477 if (RegNo >= 4)
478 return MCDisassembler::Fail;
479
480 unsigned Reg = getReg(Decoder, Mips::ACRegsRegClassID, RegNo);
481 Inst.addOperand(MCOperand::CreateReg(Reg));
482 return MCDisassembler::Success;
483}
484
Akira Hatanaka71928e62012-04-17 18:03:21 +0000485static DecodeStatus DecodeBranchTarget(MCInst &Inst,
486 unsigned Offset,
487 uint64_t Address,
488 const void *Decoder) {
489 unsigned BranchOffset = Offset & 0xffff;
490 BranchOffset = SignExtend32<18>(BranchOffset << 2) + 4;
491 Inst.addOperand(MCOperand::CreateImm(BranchOffset));
492 return MCDisassembler::Success;
493}
494
495static DecodeStatus DecodeBC1(MCInst &Inst,
496 unsigned Insn,
497 uint64_t Address,
498 const void *Decoder) {
499 unsigned BranchOffset = Insn & 0xffff;
500 BranchOffset = SignExtend32<18>(BranchOffset << 2) + 4;
501 Inst.addOperand(MCOperand::CreateImm(BranchOffset));
502 return MCDisassembler::Success;
503}
504
505static DecodeStatus DecodeJumpTarget(MCInst &Inst,
506 unsigned Insn,
507 uint64_t Address,
508 const void *Decoder) {
509
Jim Grosbachecaef492012-08-14 19:06:05 +0000510 unsigned JumpOffset = fieldFromInstruction(Insn, 0, 26) << 2;
Akira Hatanaka71928e62012-04-17 18:03:21 +0000511 Inst.addOperand(MCOperand::CreateImm(JumpOffset));
512 return MCDisassembler::Success;
513}
514
515
516static DecodeStatus DecodeSimm16(MCInst &Inst,
517 unsigned Insn,
518 uint64_t Address,
519 const void *Decoder) {
520 Inst.addOperand(MCOperand::CreateImm(SignExtend32<16>(Insn)));
521 return MCDisassembler::Success;
522}
523
524static DecodeStatus DecodeInsSize(MCInst &Inst,
525 unsigned Insn,
526 uint64_t Address,
527 const void *Decoder) {
528 // First we need to grab the pos(lsb) from MCInst.
529 int Pos = Inst.getOperand(2).getImm();
530 int Size = (int) Insn - Pos + 1;
531 Inst.addOperand(MCOperand::CreateImm(SignExtend32<16>(Size)));
532 return MCDisassembler::Success;
533}
534
535static DecodeStatus DecodeExtSize(MCInst &Inst,
536 unsigned Insn,
537 uint64_t Address,
538 const void *Decoder) {
539 int Size = (int) Insn + 1;
540 Inst.addOperand(MCOperand::CreateImm(SignExtend32<16>(Size)));
541 return MCDisassembler::Success;
542}