Home | History | Annotate | Download | only in Mips
      1 //===- 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 /* Capstone Disassembly Engine */
     15 /* By Nguyen Anh Quynh <aquynh (at) gmail.com>, 2013-2014 */
     16 
     17 #ifdef CAPSTONE_HAS_MIPS
     18 
     19 #include <stdio.h>
     20 #include <string.h>
     21 
     22 #include <platform.h>
     23 
     24 #include "../../utils.h"
     25 
     26 #include "../../MCInst.h"
     27 #include "../../MCRegisterInfo.h"
     28 #include "../../SStream.h"
     29 
     30 #include "../../MathExtras.h"
     31 
     32 //#include "Mips.h"
     33 //#include "MipsRegisterInfo.h"
     34 //#include "MipsSubtarget.h"
     35 #include "../../MCFixedLenDisassembler.h"
     36 #include "../../MCInst.h"
     37 //#include "llvm/MC/MCSubtargetInfo.h"
     38 #include "../../MCRegisterInfo.h"
     39 #include "../../MCDisassembler.h"
     40 
     41 // Forward declare these because the autogenerated code will reference them.
     42 // Definitions are further down.
     43 static DecodeStatus DecodeGPR64RegisterClass(MCInst *Inst,
     44 		unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder);
     45 
     46 static DecodeStatus DecodeCPU16RegsRegisterClass(MCInst *Inst,
     47 		unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder);
     48 
     49 static DecodeStatus DecodeGPR32RegisterClass(MCInst *Inst,
     50 		unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder);
     51 
     52 static DecodeStatus DecodePtrRegisterClass(MCInst *Inst,
     53 		unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder);
     54 
     55 static DecodeStatus DecodeDSPRRegisterClass(MCInst *Inst,
     56 		unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder);
     57 
     58 static DecodeStatus DecodeFGR64RegisterClass(MCInst *Inst,
     59 		unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder);
     60 
     61 static DecodeStatus DecodeFGR32RegisterClass(MCInst *Inst,
     62 		unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder);
     63 
     64 static DecodeStatus DecodeCCRRegisterClass(MCInst *Inst,
     65 		unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder);
     66 
     67 static DecodeStatus DecodeFCCRegisterClass(MCInst *Inst,
     68 		unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder);
     69 
     70 static DecodeStatus DecodeCCRegisterClass(MCInst *Inst,
     71 		unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder);
     72 
     73 static DecodeStatus DecodeFGRCCRegisterClass(MCInst *Inst,
     74 		unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder);
     75 
     76 static DecodeStatus DecodeHWRegsRegisterClass(MCInst *Inst,
     77 		unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder);
     78 
     79 static DecodeStatus DecodeAFGR64RegisterClass(MCInst *Inst,
     80 		unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder);
     81 
     82 static DecodeStatus DecodeACC64DSPRegisterClass(MCInst *Inst,
     83 		unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder);
     84 
     85 static DecodeStatus DecodeHI32DSPRegisterClass(MCInst *Inst,
     86 		unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder);
     87 
     88 static DecodeStatus DecodeLO32DSPRegisterClass(MCInst *Inst,
     89 		unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder);
     90 
     91 static DecodeStatus DecodeMSA128BRegisterClass(MCInst *Inst,
     92 		unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder);
     93 
     94 static DecodeStatus DecodeMSA128HRegisterClass(MCInst *Inst,
     95 		unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder);
     96 
     97 static DecodeStatus DecodeMSA128WRegisterClass(MCInst *Inst,
     98 		unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder);
     99 
    100 static DecodeStatus DecodeMSA128DRegisterClass(MCInst *Inst,
    101 		unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder);
    102 
    103 static DecodeStatus DecodeMSACtrlRegisterClass(MCInst *Inst,
    104 		unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder);
    105 
    106 static DecodeStatus DecodeCOP2RegisterClass(MCInst *Inst,
    107 		unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder);
    108 
    109 static DecodeStatus DecodeBranchTarget(MCInst *Inst,
    110 		unsigned Offset, uint64_t Address, MCRegisterInfo *Decoder);
    111 
    112 static DecodeStatus DecodeJumpTarget(MCInst *Inst,
    113 		unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder);
    114 
    115 static DecodeStatus DecodeBranchTarget21(MCInst *Inst,
    116 		unsigned Offset, uint64_t Address, MCRegisterInfo *Decoder);
    117 
    118 static DecodeStatus DecodeBranchTarget26(MCInst *Inst,
    119 		unsigned Offset, uint64_t Address, MCRegisterInfo *Decoder);
    120 
    121 // DecodeBranchTargetMM - Decode microMIPS branch offset, which is
    122 // shifted left by 1 bit.
    123 static DecodeStatus DecodeBranchTargetMM(MCInst *Inst,
    124 		unsigned Offset, uint64_t Address, MCRegisterInfo *Decoder);
    125 
    126 // DecodeJumpTargetMM - Decode microMIPS jump target, which is
    127 // shifted left by 1 bit.
    128 static DecodeStatus DecodeJumpTargetMM(MCInst *Inst,
    129 		unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder);
    130 
    131 static DecodeStatus DecodeMem(MCInst *Inst,
    132 		unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder);
    133 
    134 static DecodeStatus DecodeCachePref(MCInst *Inst,
    135 		unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder);
    136 
    137 static DecodeStatus DecodeMSA128Mem(MCInst *Inst,
    138 		unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder);
    139 
    140 static DecodeStatus DecodeMemMMImm12(MCInst *Inst,
    141 		unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder);
    142 
    143 static DecodeStatus DecodeMemMMImm16(MCInst *Inst,
    144 		unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder);
    145 
    146 static DecodeStatus DecodeFMem(MCInst *Inst, unsigned Insn,
    147 		uint64_t Address, MCRegisterInfo *Decoder);
    148 
    149 static DecodeStatus DecodeCOP2Mem(MCInst *Inst, unsigned Insn,
    150 		uint64_t Address, MCRegisterInfo *Decoder);
    151 
    152 static DecodeStatus DecodeCOP3Mem(MCInst *Inst, unsigned Insn,
    153 		uint64_t Address, MCRegisterInfo *Decoder);
    154 
    155 static DecodeStatus DecodeSpecial3LlSc(MCInst *Inst,
    156 		unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder);
    157 
    158 static DecodeStatus DecodeSimm16(MCInst *Inst,
    159 		unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder);
    160 
    161 // Decode the immediate field of an LSA instruction which
    162 // is off by one.
    163 static DecodeStatus DecodeLSAImm(MCInst *Inst,
    164 		unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder);
    165 
    166 static DecodeStatus DecodeInsSize(MCInst *Inst,
    167 		unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder);
    168 
    169 static DecodeStatus DecodeExtSize(MCInst *Inst,
    170 		unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder);
    171 
    172 static DecodeStatus DecodeSimm19Lsl2(MCInst *Inst,
    173 		unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder);
    174 
    175 static DecodeStatus DecodeSimm18Lsl3(MCInst *Inst,
    176 		unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder);
    177 
    178 /// INSVE_[BHWD] have an implicit operand that the generated decoder doesn't
    179 /// handle.
    180 static DecodeStatus DecodeINSVE_DF_4(MCInst *MI,
    181 		uint32_t insn, uint64_t Address, MCRegisterInfo *Decoder);
    182 
    183 static DecodeStatus DecodeAddiGroupBranch_4(MCInst *MI,
    184 		uint32_t insn, uint64_t Address, MCRegisterInfo *Decoder);
    185 
    186 static DecodeStatus DecodeDaddiGroupBranch_4(MCInst *MI,
    187 		uint32_t insn, uint64_t Address, MCRegisterInfo *Decoder);
    188 
    189 static DecodeStatus DecodeBlezlGroupBranch_4(MCInst *MI,
    190 		uint32_t insn, uint64_t Address, MCRegisterInfo *Decoder);
    191 
    192 static DecodeStatus DecodeBgtzlGroupBranch_4(MCInst *MI,
    193 		uint32_t insn, uint64_t Address, MCRegisterInfo *Decoder);
    194 
    195 static DecodeStatus DecodeBgtzGroupBranch_4(MCInst *MI,
    196 		uint32_t insn, uint64_t Address, MCRegisterInfo *Decoder);
    197 
    198 static DecodeStatus DecodeBlezGroupBranch_4(MCInst *MI,
    199 		uint32_t insn, uint64_t Address, MCRegisterInfo *Decoder);
    200 
    201 
    202 #define GET_SUBTARGETINFO_ENUM
    203 #include "MipsGenSubtargetInfo.inc"
    204 
    205 // Hacky: enable all features for disassembler
    206 static uint64_t getFeatureBits(int mode)
    207 {
    208 	uint64_t Bits = (uint64_t)-1;	// include every features at first
    209 
    210 	// By default we do not support Mips1
    211 	Bits &= ~Mips_FeatureMips1;
    212 
    213 	// No MicroMips
    214 	Bits &= ~Mips_FeatureMicroMips;
    215 
    216 	// ref: MipsGenDisassemblerTables.inc::checkDecoderPredicate()
    217 	// some features are mutually execlusive
    218 	if (mode & CS_MODE_16) {
    219 		//Bits &= ~Mips_FeatureMips32r2;
    220 		//Bits &= ~Mips_FeatureMips32;
    221 		//Bits &= ~Mips_FeatureFPIdx;
    222 		//Bits &= ~Mips_FeatureBitCount;
    223 		//Bits &= ~Mips_FeatureSwap;
    224 		//Bits &= ~Mips_FeatureSEInReg;
    225 		//Bits &= ~Mips_FeatureMips64r2;
    226 		//Bits &= ~Mips_FeatureFP64Bit;
    227 	} else if (mode & CS_MODE_32) {
    228 		Bits &= ~Mips_FeatureMips16;
    229 		Bits &= ~Mips_FeatureFP64Bit;
    230 		Bits &= ~Mips_FeatureMips64r2;
    231 		Bits &= ~Mips_FeatureMips32r6;
    232 		Bits &= ~Mips_FeatureMips64r6;
    233 	} else if (mode & CS_MODE_64) {
    234 		Bits &= ~Mips_FeatureMips16;
    235 		Bits &= ~Mips_FeatureMips64r6;
    236 		Bits &= ~Mips_FeatureMips32r6;
    237 	} else if (mode & CS_MODE_MIPS32R6) {
    238 		Bits |= Mips_FeatureMips32r6;
    239 		Bits &= ~Mips_FeatureMips16;
    240 		Bits &= ~Mips_FeatureFP64Bit;
    241 		Bits &= ~Mips_FeatureMips64r6;
    242 		Bits &= ~Mips_FeatureMips64r2;
    243 	}
    244 
    245 	if (mode & CS_MODE_MICRO) {
    246 		Bits |= Mips_FeatureMicroMips;
    247 		Bits &= ~Mips_FeatureMips4_32r2;
    248 		Bits &= ~Mips_FeatureMips2;
    249 	}
    250 
    251 	return Bits;
    252 }
    253 
    254 #include "MipsGenDisassemblerTables.inc"
    255 
    256 #define GET_REGINFO_ENUM
    257 #include "MipsGenRegisterInfo.inc"
    258 
    259 #define GET_REGINFO_MC_DESC
    260 #include "MipsGenRegisterInfo.inc"
    261 
    262 #define GET_INSTRINFO_ENUM
    263 #include "MipsGenInstrInfo.inc"
    264 
    265 void Mips_init(MCRegisterInfo *MRI)
    266 {
    267 	// InitMCRegisterInfo(MipsRegDesc, 394, RA, PC,
    268 	// 		MipsMCRegisterClasses, 48,
    269 	// 		MipsRegUnitRoots,
    270 	// 		273,
    271 	// 		MipsRegDiffLists,
    272 	// 		MipsRegStrings,
    273 	// 		MipsSubRegIdxLists,
    274 	// 		12,
    275 	// 		MipsSubRegIdxRanges,
    276 	// 		MipsRegEncodingTable);
    277 
    278 	MCRegisterInfo_InitMCRegisterInfo(MRI, MipsRegDesc, 394,
    279 			0, 0,
    280 			MipsMCRegisterClasses, 48,
    281 			0, 0,
    282 			MipsRegDiffLists,
    283 			0,
    284 			MipsSubRegIdxLists, 12,
    285 			0);
    286 }
    287 
    288 /// readInstruction - read four bytes from the MemoryObject
    289 /// and return 32 bit word sorted according to the given endianess
    290 static DecodeStatus readInstruction32(unsigned char *code, uint32_t *insn, bool isBigEndian, bool isMicroMips)
    291 {
    292 	// We want to read exactly 4 Bytes of data.
    293 	if (isBigEndian) {
    294 		// Encoded as a big-endian 32-bit word in the stream.
    295 		*insn = (code[3] <<  0) |
    296 			(code[2] <<  8) |
    297 			(code[1] << 16) |
    298 			(code[0] << 24);
    299 	} else {
    300 		// Encoded as a small-endian 32-bit word in the stream.
    301 		// Little-endian byte ordering:
    302 		//   mips32r2:   4 | 3 | 2 | 1
    303 		//   microMIPS:  2 | 1 | 4 | 3
    304 		if (isMicroMips) {
    305 			*insn = (code[2] <<  0) |
    306 				(code[3] <<  8) |
    307 				(code[0] << 16) |
    308 				(code[1] << 24);
    309 		} else {
    310 			*insn = (code[0] <<  0) |
    311 				(code[1] <<  8) |
    312 				(code[2] << 16) |
    313 				(code[3] << 24);
    314 		}
    315 	}
    316 
    317 	return MCDisassembler_Success;
    318 }
    319 
    320 static DecodeStatus MipsDisassembler_getInstruction(int mode, MCInst *instr,
    321 		const uint8_t *code, size_t code_len,
    322 		uint16_t *Size,
    323 		uint64_t Address, bool isBigEndian, MCRegisterInfo *MRI)
    324 {
    325 	uint32_t Insn;
    326 	DecodeStatus Result;
    327 
    328 	if (code_len < 4)
    329 		// not enough data
    330 		return MCDisassembler_Fail;
    331 
    332 	if (instr->flat_insn->detail) {
    333 		memset(instr->flat_insn->detail, 0, sizeof(cs_detail));
    334 	}
    335 
    336 	Result = readInstruction32((unsigned char*)code, &Insn, isBigEndian,
    337 			mode & CS_MODE_MICRO);
    338 	if (Result == MCDisassembler_Fail)
    339 		return MCDisassembler_Fail;
    340 
    341 	if (mode & CS_MODE_MICRO) {
    342 		// Calling the auto-generated decoder function.
    343 		Result = decodeInstruction(DecoderTableMicroMips32, instr, Insn, Address, MRI, mode);
    344 		if (Result != MCDisassembler_Fail) {
    345 			*Size = 4;
    346 			return Result;
    347 		}
    348 		return MCDisassembler_Fail;
    349 	}
    350 
    351 #if 0
    352 	// TODO: properly handle this in the future with MIPS1/2 modes
    353 	if (((mode & CS_MODE_32) == 0) && ((mode & CS_MODE_MIPS3) == 0)) {	// COP3
    354 		// DEBUG(dbgs() << "Trying COP3_ table (32-bit opcodes):\n");
    355 		Result = decodeInstruction(DecoderTableCOP3_32, instr, Insn, Address, MRI, mode);
    356 		if (Result != MCDisassembler_Fail) {
    357 			*Size = 4;
    358 			return Result;
    359 		}
    360 	}
    361 #endif
    362 
    363 	if (((mode & CS_MODE_MIPS32R6) != 0) && ((mode & CS_MODE_MIPSGP64) != 0)) {
    364 		// DEBUG(dbgs() << "Trying Mips32r6_64r6 (GPR64) table (32-bit opcodes):\n");
    365 		Result = decodeInstruction(DecoderTableMips32r6_64r6_GP6432, instr, Insn,
    366 				Address, MRI, mode);
    367 		if (Result != MCDisassembler_Fail) {
    368 			*Size = 4;
    369 			return Result;
    370 		}
    371 	}
    372 
    373 	if ((mode & CS_MODE_MIPS32R6) != 0) {
    374 		// DEBUG(dbgs() << "Trying Mips32r6_64r6 table (32-bit opcodes):\n");
    375 		Result = decodeInstruction(DecoderTableMips32r6_64r632, instr, Insn,
    376 				Address, MRI, mode);
    377 		if (Result != MCDisassembler_Fail) {
    378 			*Size = 4;
    379 			return Result;
    380 		}
    381 	}
    382 
    383 	// Calling the auto-generated decoder function.
    384 	Result = decodeInstruction(DecoderTableMips32, instr, Insn, Address, MRI, mode);
    385 	if (Result != MCDisassembler_Fail) {
    386 		*Size = 4;
    387 		return Result;
    388 	}
    389 
    390 	return MCDisassembler_Fail;
    391 }
    392 
    393 bool Mips_getInstruction(csh ud, const uint8_t *code, size_t code_len, MCInst *instr,
    394 		uint16_t *size, uint64_t address, void *info)
    395 {
    396 	cs_struct *handle = (cs_struct *)(uintptr_t)ud;
    397 
    398 	DecodeStatus status = MipsDisassembler_getInstruction(handle->mode, instr,
    399 			code, code_len,
    400 			size,
    401 			address, handle->big_endian, (MCRegisterInfo *)info);
    402 
    403 	return status == MCDisassembler_Success;
    404 }
    405 
    406 static DecodeStatus Mips64Disassembler_getInstruction(int mode, MCInst *instr,
    407 		const uint8_t *code, size_t code_len,
    408 		uint16_t *Size,
    409 		uint64_t Address, bool isBigEndian, MCRegisterInfo *MRI)
    410 {
    411 	uint32_t Insn;
    412 	DecodeStatus Result;
    413 
    414 	if (code_len < 4)
    415 		// not enough data
    416 		return MCDisassembler_Fail;
    417 
    418 	if (instr->flat_insn->detail) {
    419 		memset(instr->flat_insn->detail, 0, sizeof(cs_detail));
    420 	}
    421 
    422 	Result = readInstruction32((unsigned char*)code, &Insn, isBigEndian, false);
    423 	if (Result == MCDisassembler_Fail)
    424 		return MCDisassembler_Fail;
    425 
    426 	if (instr->flat_insn->detail) {
    427 		memset(instr->flat_insn->detail, 0, sizeof(cs_detail));
    428 	}
    429 
    430 	// Calling the auto-generated decoder function.
    431 	Result = decodeInstruction(DecoderTableMips6432, instr, Insn, Address, MRI, mode);
    432 	if (Result != MCDisassembler_Fail) {
    433 		*Size = 4;
    434 		return Result;
    435 	}
    436 
    437 	// If we fail to decode in Mips64 decoder space we can try in Mips32
    438 	Result = decodeInstruction(DecoderTableMips32, instr, Insn, Address, MRI, mode);
    439 	if (Result != MCDisassembler_Fail) {
    440 		*Size = 4;
    441 		return Result;
    442 	}
    443 
    444 	return MCDisassembler_Fail;
    445 }
    446 
    447 bool Mips64_getInstruction(csh ud, const uint8_t *code, size_t code_len, MCInst *instr,
    448 		uint16_t *size, uint64_t address, void *info)
    449 {
    450 	cs_struct *handle = (cs_struct *)(uintptr_t)ud;
    451 
    452 	DecodeStatus status = Mips64Disassembler_getInstruction(handle->mode, instr,
    453 			code, code_len,
    454 			size,
    455 			address, handle->big_endian, (MCRegisterInfo *)info);
    456 
    457 	return status == MCDisassembler_Success;
    458 }
    459 
    460 static unsigned getReg(MCRegisterInfo *MRI, unsigned RC, unsigned RegNo)
    461 {
    462 	//MipsDisassemblerBase *Dis = static_cast<const MipsDisassemblerBase*>(D);
    463 	//return *(Dis->getRegInfo()->getRegClass(RC).begin() + RegNo);
    464 	MCRegisterClass *rc = MCRegisterInfo_getRegClass(MRI, RC);
    465 	return rc->RegsBegin[RegNo];
    466 }
    467 
    468 static DecodeStatus DecodeINSVE_DF_4(MCInst *MI, uint32_t insn,
    469 		uint64_t Address, MCRegisterInfo *Decoder)
    470 {
    471 	typedef DecodeStatus (*DecodeFN)(MCInst *, unsigned, uint64_t, MCRegisterInfo *);
    472 	// The size of the n field depends on the element size
    473 	// The register class also depends on this.
    474 	uint32_t tmp = fieldFromInstruction(insn, 17, 5);
    475 	unsigned NSize = 0;
    476 	DecodeFN RegDecoder = NULL;
    477 
    478 	if ((tmp & 0x18) == 0x00) { // INSVE_B
    479 		NSize = 4;
    480 		RegDecoder = DecodeMSA128BRegisterClass;
    481 	} else if ((tmp & 0x1c) == 0x10) { // INSVE_H
    482 		NSize = 3;
    483 		RegDecoder = DecodeMSA128HRegisterClass;
    484 	} else if ((tmp & 0x1e) == 0x18) { // INSVE_W
    485 		NSize = 2;
    486 		RegDecoder = DecodeMSA128WRegisterClass;
    487 	} else if ((tmp & 0x1f) == 0x1c) { // INSVE_D
    488 		NSize = 1;
    489 		RegDecoder = DecodeMSA128DRegisterClass;
    490 	} //else llvm_unreachable("Invalid encoding");
    491 
    492 	//assert(NSize != 0 && RegDecoder != nullptr);
    493 	if (NSize == 0 || RegDecoder == NULL)
    494 		return MCDisassembler_Fail;
    495 
    496 	if (RegDecoder == NULL)
    497 		return MCDisassembler_Fail;
    498 
    499 	// $wd
    500 	tmp = fieldFromInstruction(insn, 6, 5);
    501 	if (RegDecoder(MI, tmp, Address, Decoder) == MCDisassembler_Fail)
    502 		return MCDisassembler_Fail;
    503 
    504 	// $wd_in
    505 	if (RegDecoder(MI, tmp, Address, Decoder) == MCDisassembler_Fail)
    506 		return MCDisassembler_Fail;
    507 
    508 	// $n
    509 	tmp = fieldFromInstruction(insn, 16, NSize);
    510 	MCOperand_CreateImm0(MI, tmp);
    511 
    512 	// $ws
    513 	tmp = fieldFromInstruction(insn, 11, 5);
    514 	if (RegDecoder(MI, tmp, Address, Decoder) == MCDisassembler_Fail)
    515 		return MCDisassembler_Fail;
    516 
    517 	// $n2
    518 	MCOperand_CreateImm0(MI, 0);
    519 
    520 	return MCDisassembler_Success;
    521 }
    522 
    523 static DecodeStatus DecodeAddiGroupBranch_4(MCInst *MI, uint32_t insn,
    524 		uint64_t Address, MCRegisterInfo *Decoder)
    525 {
    526 	// If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled
    527 	// (otherwise we would have matched the ADDI instruction from the earlier
    528 	// ISA's instead).
    529 	//
    530 	// We have:
    531 	//    0b001000 sssss ttttt iiiiiiiiiiiiiiii
    532 	//      BOVC if rs >= rt
    533 	//      BEQZALC if rs == 0 && rt != 0
    534 	//      BEQC if rs < rt && rs != 0
    535 
    536 	uint32_t Rs = fieldFromInstruction(insn, 21, 5);
    537 	uint32_t Rt = fieldFromInstruction(insn, 16, 5);
    538 	uint32_t Imm = (uint32_t)SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4;
    539 	bool HasRs = false;
    540 
    541 	if (Rs >= Rt) {
    542 		MCInst_setOpcode(MI, Mips_BOVC);
    543 		HasRs = true;
    544 	} else if (Rs != 0 && Rs < Rt) {
    545 		MCInst_setOpcode(MI, Mips_BEQC);
    546 		HasRs = true;
    547 	} else
    548 		MCInst_setOpcode(MI, Mips_BEQZALC);
    549 
    550 	if (HasRs)
    551 		MCOperand_CreateReg0(MI, getReg(Decoder, Mips_GPR32RegClassID, Rs));
    552 
    553 	MCOperand_CreateReg0(MI, getReg(Decoder, Mips_GPR32RegClassID, Rt));
    554 	MCOperand_CreateImm0(MI, Imm);
    555 
    556 	return MCDisassembler_Success;
    557 }
    558 
    559 static DecodeStatus DecodeDaddiGroupBranch_4(MCInst *MI, uint32_t insn,
    560 		uint64_t Address, MCRegisterInfo *Decoder)
    561 {
    562 	// If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled
    563 	// (otherwise we would have matched the ADDI instruction from the earlier
    564 	// ISA's instead).
    565 	//
    566 	// We have:
    567 	//    0b011000 sssss ttttt iiiiiiiiiiiiiiii
    568 	//      BNVC if rs >= rt
    569 	//      BNEZALC if rs == 0 && rt != 0
    570 	//      BNEC if rs < rt && rs != 0
    571 
    572 	uint32_t Rs = fieldFromInstruction(insn, 21, 5);
    573 	uint32_t Rt = fieldFromInstruction(insn, 16, 5);
    574 	uint32_t Imm = (uint32_t)SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4;
    575 	bool HasRs = false;
    576 
    577 	if (Rs >= Rt) {
    578 		MCInst_setOpcode(MI, Mips_BNVC);
    579 		HasRs = true;
    580 	} else if (Rs != 0 && Rs < Rt) {
    581 		MCInst_setOpcode(MI, Mips_BNEC);
    582 		HasRs = true;
    583 	} else
    584 		MCInst_setOpcode(MI, Mips_BNEZALC);
    585 
    586 	if (HasRs)
    587 		MCOperand_CreateReg0(MI, getReg(Decoder, Mips_GPR32RegClassID, Rs));
    588 
    589 	MCOperand_CreateReg0(MI, getReg(Decoder, Mips_GPR32RegClassID, Rt));
    590 	MCOperand_CreateImm0(MI, Imm);
    591 
    592 	return MCDisassembler_Success;
    593 }
    594 
    595 static DecodeStatus DecodeBlezlGroupBranch_4(MCInst *MI, uint32_t insn,
    596 		uint64_t Address, MCRegisterInfo *Decoder)
    597 {
    598 	// If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled
    599 	// (otherwise we would have matched the BLEZL instruction from the earlier
    600 	// ISA's instead).
    601 	//
    602 	// We have:
    603 	//    0b010110 sssss ttttt iiiiiiiiiiiiiiii
    604 	//      Invalid if rs == 0
    605 	//      BLEZC   if rs == 0  && rt != 0
    606 	//      BGEZC   if rs == rt && rt != 0
    607 	//      BGEC    if rs != rt && rs != 0  && rt != 0
    608 
    609 	uint32_t Rs = fieldFromInstruction(insn, 21, 5);
    610 	uint32_t Rt = fieldFromInstruction(insn, 16, 5);
    611 	uint32_t Imm = (uint32_t)SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4;
    612 	bool HasRs = false;
    613 
    614 	if (Rt == 0)
    615 		return MCDisassembler_Fail;
    616 	else if (Rs == 0)
    617 		MCInst_setOpcode(MI, Mips_BLEZC);
    618 	else if (Rs == Rt)
    619 		MCInst_setOpcode(MI, Mips_BGEZC);
    620 	else {
    621 		HasRs = true;
    622 		MCInst_setOpcode(MI, Mips_BGEC);
    623 	}
    624 
    625 	if (HasRs)
    626 		MCOperand_CreateReg0(MI, getReg(Decoder, Mips_GPR32RegClassID, Rs));
    627 
    628 	MCOperand_CreateReg0(MI, getReg(Decoder, Mips_GPR32RegClassID, Rt));
    629 
    630 	MCOperand_CreateImm0(MI, Imm);
    631 
    632 	return MCDisassembler_Success;
    633 }
    634 
    635 static DecodeStatus DecodeBgtzlGroupBranch_4(MCInst *MI, uint32_t insn,
    636 		uint64_t Address, MCRegisterInfo *Decoder)
    637 {
    638 	// If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled
    639 	// (otherwise we would have matched the BGTZL instruction from the earlier
    640 	// ISA's instead).
    641 	//
    642 	// We have:
    643 	//    0b010111 sssss ttttt iiiiiiiiiiiiiiii
    644 	//      Invalid if rs == 0
    645 	//      BGTZC   if rs == 0  && rt != 0
    646 	//      BLTZC   if rs == rt && rt != 0
    647 	//      BLTC    if rs != rt && rs != 0  && rt != 0
    648 
    649 	bool HasRs = false;
    650 
    651 	uint32_t Rs = fieldFromInstruction(insn, 21, 5);
    652 	uint32_t Rt = fieldFromInstruction(insn, 16, 5);
    653 	uint32_t Imm = (uint32_t)SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4;
    654 
    655 	if (Rt == 0)
    656 		return MCDisassembler_Fail;
    657 	else if (Rs == 0)
    658 		MCInst_setOpcode(MI, Mips_BGTZC);
    659 	else if (Rs == Rt)
    660 		MCInst_setOpcode(MI, Mips_BLTZC);
    661 	else {
    662 		MCInst_setOpcode(MI, Mips_BLTC);
    663 		HasRs = true;
    664 	}
    665 
    666 	if (HasRs)
    667 		MCOperand_CreateReg0(MI, getReg(Decoder, Mips_GPR32RegClassID, Rs));
    668 
    669 	MCOperand_CreateReg0(MI, getReg(Decoder, Mips_GPR32RegClassID, Rt));
    670 	MCOperand_CreateImm0(MI, Imm);
    671 
    672 	return MCDisassembler_Success;
    673 }
    674 
    675 static DecodeStatus DecodeBgtzGroupBranch_4(MCInst *MI, uint32_t insn,
    676 		uint64_t Address, MCRegisterInfo *Decoder)
    677 {
    678 	// If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled
    679 	// (otherwise we would have matched the BGTZ instruction from the earlier
    680 	// ISA's instead).
    681 	//
    682 	// We have:
    683 	//    0b000111 sssss ttttt iiiiiiiiiiiiiiii
    684 	//      BGTZ    if rt == 0
    685 	//      BGTZALC if rs == 0 && rt != 0
    686 	//      BLTZALC if rs != 0 && rs == rt
    687 	//      BLTUC   if rs != 0 && rs != rt
    688 
    689 	uint32_t Rs = fieldFromInstruction(insn, 21, 5);
    690 	uint32_t Rt = fieldFromInstruction(insn, 16, 5);
    691 	uint32_t Imm = (uint32_t)SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4;
    692 	bool HasRs = false;
    693 	bool HasRt = false;
    694 
    695 	if (Rt == 0) {
    696 		MCInst_setOpcode(MI, Mips_BGTZ);
    697 		HasRs = true;
    698 	} else if (Rs == 0) {
    699 		MCInst_setOpcode(MI, Mips_BGTZALC);
    700 		HasRt = true;
    701 	} else if (Rs == Rt) {
    702 		MCInst_setOpcode(MI, Mips_BLTZALC);
    703 		HasRs = true;
    704 	} else {
    705 		MCInst_setOpcode(MI, Mips_BLTUC);
    706 		HasRs = true;
    707 		HasRt = true;
    708 	}
    709 
    710 	if (HasRs)
    711 		MCOperand_CreateReg0(MI, getReg(Decoder, Mips_GPR32RegClassID, Rs));
    712 
    713 	if (HasRt)
    714 		MCOperand_CreateReg0(MI, getReg(Decoder, Mips_GPR32RegClassID, Rt));
    715 
    716 	MCOperand_CreateImm0(MI, Imm);
    717 
    718 	return MCDisassembler_Success;
    719 }
    720 
    721 static DecodeStatus DecodeBlezGroupBranch_4(MCInst *MI, uint32_t insn,
    722 		uint64_t Address, MCRegisterInfo *Decoder)
    723 {
    724 	// If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled
    725 	// (otherwise we would have matched the BLEZL instruction from the earlier
    726 	// ISA's instead).
    727 	//
    728 	// We have:
    729 	//    0b000110 sssss ttttt iiiiiiiiiiiiiiii
    730 	//      Invalid   if rs == 0
    731 	//      BLEZALC   if rs == 0  && rt != 0
    732 	//      BGEZALC   if rs == rt && rt != 0
    733 	//      BGEUC     if rs != rt && rs != 0  && rt != 0
    734 
    735 	uint32_t Rs = fieldFromInstruction(insn, 21, 5);
    736 	uint32_t Rt = fieldFromInstruction(insn, 16, 5);
    737 	uint32_t Imm = (uint32_t)SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4;
    738 	bool HasRs = false;
    739 
    740 	if (Rt == 0)
    741 		return MCDisassembler_Fail;
    742 	else if (Rs == 0)
    743 		MCInst_setOpcode(MI, Mips_BLEZALC);
    744 	else if (Rs == Rt)
    745 		MCInst_setOpcode(MI, Mips_BGEZALC);
    746 	else {
    747 		HasRs = true;
    748 		MCInst_setOpcode(MI, Mips_BGEUC);
    749 	}
    750 
    751 	if (HasRs)
    752 		MCOperand_CreateReg0(MI, getReg(Decoder, Mips_GPR32RegClassID, Rs));
    753 
    754 	MCOperand_CreateReg0(MI, getReg(Decoder, Mips_GPR32RegClassID, Rt));
    755 
    756 	MCOperand_CreateImm0(MI, Imm);
    757 
    758 	return MCDisassembler_Success;
    759 }
    760 
    761 static DecodeStatus DecodeCPU16RegsRegisterClass(MCInst *Inst,
    762 		unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder)
    763 {
    764 	return MCDisassembler_Fail;
    765 }
    766 
    767 static DecodeStatus DecodeGPR64RegisterClass(MCInst *Inst,
    768 		unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder)
    769 {
    770 	unsigned Reg;
    771 
    772 	if (RegNo > 31)
    773 		return MCDisassembler_Fail;
    774 
    775 	Reg = getReg(Decoder, Mips_GPR64RegClassID, RegNo);
    776 	MCOperand_CreateReg0(Inst, Reg);
    777 	return MCDisassembler_Success;
    778 }
    779 
    780 static DecodeStatus DecodeGPR32RegisterClass(MCInst *Inst,
    781 		unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder)
    782 {
    783 	unsigned Reg;
    784 
    785 	if (RegNo > 31)
    786 		return MCDisassembler_Fail;
    787 
    788 	Reg = getReg(Decoder, Mips_GPR32RegClassID, RegNo);
    789 	MCOperand_CreateReg0(Inst, Reg);
    790 	return MCDisassembler_Success;
    791 }
    792 
    793 static DecodeStatus DecodePtrRegisterClass(MCInst *Inst,
    794 		unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder)
    795 {
    796 	if (Inst->csh->mode & CS_MODE_64)
    797 		return DecodeGPR64RegisterClass(Inst, RegNo, Address, Decoder);
    798 
    799 	return DecodeGPR32RegisterClass(Inst, RegNo, Address, Decoder);
    800 }
    801 
    802 static DecodeStatus DecodeDSPRRegisterClass(MCInst *Inst,
    803 		unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder)
    804 {
    805 	return DecodeGPR32RegisterClass(Inst, RegNo, Address, Decoder);
    806 }
    807 
    808 static DecodeStatus DecodeFGR64RegisterClass(MCInst *Inst,
    809 		unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder)
    810 {
    811 	unsigned Reg;
    812 
    813 	if (RegNo > 31)
    814 		return MCDisassembler_Fail;
    815 
    816 	Reg = getReg(Decoder, Mips_FGR64RegClassID, RegNo);
    817 	MCOperand_CreateReg0(Inst, Reg);
    818 	return MCDisassembler_Success;
    819 }
    820 
    821 static DecodeStatus DecodeFGR32RegisterClass(MCInst *Inst,
    822 		unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder)
    823 {
    824 	unsigned Reg;
    825 
    826 	if (RegNo > 31)
    827 		return MCDisassembler_Fail;
    828 
    829 	Reg = getReg(Decoder, Mips_FGR32RegClassID, RegNo);
    830 	MCOperand_CreateReg0(Inst, Reg);
    831 	return MCDisassembler_Success;
    832 }
    833 
    834 static DecodeStatus DecodeCCRRegisterClass(MCInst *Inst,
    835 		unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder)
    836 {
    837 	unsigned Reg;
    838 
    839 	if (RegNo > 31)
    840 		return MCDisassembler_Fail;
    841 
    842 	Reg = getReg(Decoder, Mips_CCRRegClassID, RegNo);
    843 	MCOperand_CreateReg0(Inst, Reg);
    844 	return MCDisassembler_Success;
    845 }
    846 
    847 static DecodeStatus DecodeFCCRegisterClass(MCInst *Inst,
    848 		unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder)
    849 {
    850 	unsigned Reg;
    851 
    852 	if (RegNo > 7)
    853 		return MCDisassembler_Fail;
    854 
    855 	Reg = getReg(Decoder, Mips_FCCRegClassID, RegNo);
    856 	MCOperand_CreateReg0(Inst, Reg);
    857 	return MCDisassembler_Success;
    858 }
    859 
    860 static DecodeStatus DecodeCCRegisterClass(MCInst *Inst,
    861 		unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder)
    862 {
    863 	unsigned Reg;
    864 
    865 	if (RegNo > 7)
    866 		return MCDisassembler_Fail;
    867 
    868 	Reg = getReg(Decoder, Mips_CCRegClassID, RegNo);
    869 	MCOperand_CreateReg0(Inst, Reg);
    870 	return MCDisassembler_Success;
    871 }
    872 
    873 static DecodeStatus DecodeFGRCCRegisterClass(MCInst *Inst,
    874 		unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder)
    875 {
    876 	unsigned Reg;
    877 
    878 	if (RegNo > 31)
    879 		return MCDisassembler_Fail;
    880 
    881 	Reg = getReg(Decoder, Mips_FGRCCRegClassID, RegNo);
    882 	MCOperand_CreateReg0(Inst, Reg);
    883 	return MCDisassembler_Success;
    884 }
    885 
    886 static DecodeStatus DecodeMem(MCInst *Inst,
    887 		unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder)
    888 {
    889 	int Offset = SignExtend32(Insn & 0xffff, 16);
    890 	unsigned Reg = fieldFromInstruction(Insn, 16, 5);
    891 	unsigned Base = fieldFromInstruction(Insn, 21, 5);
    892 
    893 	Reg = getReg(Decoder, Mips_GPR32RegClassID, Reg);
    894 	Base = getReg(Decoder, Mips_GPR32RegClassID, Base);
    895 
    896 	if (MCInst_getOpcode(Inst) == Mips_SC){
    897 		MCOperand_CreateReg0(Inst, Reg);
    898 	}
    899 
    900 	MCOperand_CreateReg0(Inst, Reg);
    901 	MCOperand_CreateReg0(Inst, Base);
    902 	MCOperand_CreateImm0(Inst, Offset);
    903 
    904 	return MCDisassembler_Success;
    905 }
    906 
    907 static DecodeStatus DecodeCachePref(MCInst *Inst,
    908 		unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder)
    909 {
    910 	int Offset = SignExtend32(Insn & 0xffff, 16);
    911 	unsigned Hint = fieldFromInstruction(Insn, 16, 5);
    912 	unsigned Base = fieldFromInstruction(Insn, 21, 5);
    913 
    914 	Base = getReg(Decoder, Mips_GPR32RegClassID, Base);
    915 
    916 	MCOperand_CreateReg0(Inst, Base);
    917 	MCOperand_CreateImm0(Inst, Offset);
    918 	MCOperand_CreateImm0(Inst, Hint);
    919 
    920 	return MCDisassembler_Success;
    921 }
    922 
    923 static DecodeStatus DecodeMSA128Mem(MCInst *Inst, unsigned Insn,
    924 		uint64_t Address, MCRegisterInfo *Decoder)
    925 {
    926 	int Offset = SignExtend32(fieldFromInstruction(Insn, 16, 10), 10);
    927 	unsigned Reg = fieldFromInstruction(Insn, 6, 5);
    928 	unsigned Base = fieldFromInstruction(Insn, 11, 5);
    929 
    930 	Reg = getReg(Decoder, Mips_MSA128BRegClassID, Reg);
    931 	Base = getReg(Decoder, Mips_GPR32RegClassID, Base);
    932 
    933 	MCOperand_CreateReg0(Inst, Reg);
    934 	MCOperand_CreateReg0(Inst, Base);
    935 	// MCOperand_CreateImm0(Inst, Offset);
    936 
    937 	// The immediate field of an LD/ST instruction is scaled which means it must
    938 	// be multiplied (when decoding) by the size (in bytes) of the instructions'
    939 	// data format.
    940 	// .b - 1 byte
    941 	// .h - 2 bytes
    942 	// .w - 4 bytes
    943 	// .d - 8 bytes
    944 	switch(MCInst_getOpcode(Inst)) {
    945 		default:
    946 			//assert (0 && "Unexpected instruction");
    947 			return MCDisassembler_Fail;
    948 			break;
    949 		case Mips_LD_B:
    950 		case Mips_ST_B:
    951 			MCOperand_CreateImm0(Inst, Offset);
    952 			break;
    953 		case Mips_LD_H:
    954 		case Mips_ST_H:
    955 			MCOperand_CreateImm0(Inst, Offset * 2);
    956 			break;
    957 		case Mips_LD_W:
    958 		case Mips_ST_W:
    959 			MCOperand_CreateImm0(Inst, Offset * 4);
    960 			break;
    961 		case Mips_LD_D:
    962 		case Mips_ST_D:
    963 			MCOperand_CreateImm0(Inst, Offset * 8);
    964 			break;
    965 	}
    966 
    967 	return MCDisassembler_Success;
    968 }
    969 
    970 static DecodeStatus DecodeMemMMImm12(MCInst *Inst,
    971 		unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder)
    972 {
    973 	int Offset = SignExtend32(Insn & 0x0fff, 12);
    974 	unsigned Reg = fieldFromInstruction(Insn, 21, 5);
    975 	unsigned Base = fieldFromInstruction(Insn, 16, 5);
    976 
    977 	Reg = getReg(Decoder, Mips_GPR32RegClassID, Reg);
    978 	Base = getReg(Decoder, Mips_GPR32RegClassID, Base);
    979 
    980 	if (MCInst_getOpcode(Inst) == Mips_SC_MM)
    981 		MCOperand_CreateReg0(Inst, Reg);
    982 
    983 	MCOperand_CreateReg0(Inst, Reg);
    984 	MCOperand_CreateReg0(Inst, Base);
    985 	MCOperand_CreateImm0(Inst, Offset);
    986 
    987 	return MCDisassembler_Success;
    988 }
    989 
    990 static DecodeStatus DecodeMemMMImm16(MCInst *Inst,
    991 		unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder)
    992 {
    993 	int Offset = SignExtend32(Insn & 0xffff, 16);
    994 	unsigned Reg = fieldFromInstruction(Insn, 21, 5);
    995 	unsigned Base = fieldFromInstruction(Insn, 16, 5);
    996 
    997 	Reg = getReg(Decoder, Mips_GPR32RegClassID, Reg);
    998 	Base = getReg(Decoder, Mips_GPR32RegClassID, Base);
    999 
   1000 	MCOperand_CreateReg0(Inst, Reg);
   1001 	MCOperand_CreateReg0(Inst, Base);
   1002 	MCOperand_CreateImm0(Inst, Offset);
   1003 
   1004 	return MCDisassembler_Success;
   1005 }
   1006 
   1007 static DecodeStatus DecodeFMem(MCInst *Inst,
   1008 		unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder)
   1009 {
   1010 	int Offset = SignExtend32(Insn & 0xffff, 16);
   1011 	unsigned Reg = fieldFromInstruction(Insn, 16, 5);
   1012 	unsigned Base = fieldFromInstruction(Insn, 21, 5);
   1013 
   1014 	Reg = getReg(Decoder, Mips_FGR64RegClassID, Reg);
   1015 	Base = getReg(Decoder, Mips_GPR32RegClassID, Base);
   1016 
   1017 	MCOperand_CreateReg0(Inst, Reg);
   1018 	MCOperand_CreateReg0(Inst, Base);
   1019 	MCOperand_CreateImm0(Inst, Offset);
   1020 
   1021 	return MCDisassembler_Success;
   1022 }
   1023 
   1024 static DecodeStatus DecodeCOP2Mem(MCInst *Inst,
   1025 		unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder)
   1026 {
   1027 	int Offset = SignExtend32(Insn & 0xffff, 16);
   1028 	unsigned Reg = fieldFromInstruction(Insn, 16, 5);
   1029 	unsigned Base = fieldFromInstruction(Insn, 21, 5);
   1030 
   1031 	Reg = getReg(Decoder, Mips_COP2RegClassID, Reg);
   1032 	Base = getReg(Decoder, Mips_GPR32RegClassID, Base);
   1033 
   1034 	MCOperand_CreateReg0(Inst, Reg);
   1035 	MCOperand_CreateReg0(Inst, Base);
   1036 	MCOperand_CreateImm0(Inst, Offset);
   1037 
   1038 	return MCDisassembler_Success;
   1039 }
   1040 
   1041 static DecodeStatus DecodeCOP3Mem(MCInst *Inst,
   1042 		unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder)
   1043 {
   1044 	int Offset = SignExtend32(Insn & 0xffff, 16);
   1045 	unsigned Reg = fieldFromInstruction(Insn, 16, 5);
   1046 	unsigned Base = fieldFromInstruction(Insn, 21, 5);
   1047 
   1048 	Reg = getReg(Decoder, Mips_COP3RegClassID, Reg);
   1049 	Base = getReg(Decoder, Mips_GPR32RegClassID, Base);
   1050 
   1051 	MCOperand_CreateReg0(Inst, Reg);
   1052 	MCOperand_CreateReg0(Inst, Base);
   1053 	MCOperand_CreateImm0(Inst, Offset);
   1054 
   1055 	return MCDisassembler_Success;
   1056 }
   1057 
   1058 static DecodeStatus DecodeSpecial3LlSc(MCInst *Inst,
   1059 		unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder)
   1060 {
   1061 	int64_t Offset = SignExtend64((Insn >> 7) & 0x1ff, 9);
   1062 	unsigned Rt = fieldFromInstruction(Insn, 16, 5);
   1063 	unsigned Base = fieldFromInstruction(Insn, 21, 5);
   1064 
   1065 	Rt = getReg(Decoder, Mips_GPR32RegClassID, Rt);
   1066 	Base = getReg(Decoder, Mips_GPR32RegClassID, Base);
   1067 
   1068 	if (MCInst_getOpcode(Inst) == Mips_SC_R6 ||
   1069 			MCInst_getOpcode(Inst) == Mips_SCD_R6) {
   1070 		MCOperand_CreateReg0(Inst, Rt);
   1071 	}
   1072 
   1073 	MCOperand_CreateReg0(Inst, Rt);
   1074 	MCOperand_CreateReg0(Inst, Base);
   1075 	MCOperand_CreateImm0(Inst, Offset);
   1076 
   1077 	return MCDisassembler_Success;
   1078 }
   1079 
   1080 static DecodeStatus DecodeHWRegsRegisterClass(MCInst *Inst,
   1081 		unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder)
   1082 {
   1083 	// Currently only hardware register 29 is supported.
   1084 	if (RegNo != 29)
   1085 		return  MCDisassembler_Fail;
   1086 
   1087 	MCOperand_CreateReg0(Inst, Mips_HWR29);
   1088 
   1089 	return MCDisassembler_Success;
   1090 }
   1091 
   1092 static DecodeStatus DecodeAFGR64RegisterClass(MCInst *Inst,
   1093 		unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder)
   1094 {
   1095 	unsigned Reg;
   1096 
   1097 	if (RegNo > 30 || RegNo % 2)
   1098 		return MCDisassembler_Fail;
   1099 
   1100 	Reg = getReg(Decoder, Mips_AFGR64RegClassID, RegNo /2);
   1101 	MCOperand_CreateReg0(Inst, Reg);
   1102 
   1103 	return MCDisassembler_Success;
   1104 }
   1105 
   1106 static DecodeStatus DecodeACC64DSPRegisterClass(MCInst *Inst,
   1107 		unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder)
   1108 {
   1109 	unsigned Reg;
   1110 
   1111 	if (RegNo >= 4)
   1112 		return MCDisassembler_Fail;
   1113 
   1114 	Reg = getReg(Decoder, Mips_ACC64DSPRegClassID, RegNo);
   1115 	MCOperand_CreateReg0(Inst, Reg);
   1116 	return MCDisassembler_Success;
   1117 }
   1118 
   1119 static DecodeStatus DecodeHI32DSPRegisterClass(MCInst *Inst,
   1120 		unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder)
   1121 {
   1122 	unsigned Reg;
   1123 
   1124 	if (RegNo >= 4)
   1125 		return MCDisassembler_Fail;
   1126 
   1127 	Reg = getReg(Decoder, Mips_HI32DSPRegClassID, RegNo);
   1128 	MCOperand_CreateReg0(Inst, Reg);
   1129 
   1130 	return MCDisassembler_Success;
   1131 }
   1132 
   1133 static DecodeStatus DecodeLO32DSPRegisterClass(MCInst *Inst,
   1134 		unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder)
   1135 {
   1136 	unsigned Reg;
   1137 
   1138 	if (RegNo >= 4)
   1139 		return MCDisassembler_Fail;
   1140 
   1141 	Reg = getReg(Decoder, Mips_LO32DSPRegClassID, RegNo);
   1142 	MCOperand_CreateReg0(Inst, Reg);
   1143 
   1144 	return MCDisassembler_Success;
   1145 }
   1146 
   1147 static DecodeStatus DecodeMSA128BRegisterClass(MCInst *Inst,
   1148 		unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder)
   1149 {
   1150 	unsigned Reg;
   1151 
   1152 	if (RegNo > 31)
   1153 		return MCDisassembler_Fail;
   1154 
   1155 	Reg = getReg(Decoder, Mips_MSA128BRegClassID, RegNo);
   1156 	MCOperand_CreateReg0(Inst, Reg);
   1157 
   1158 	return MCDisassembler_Success;
   1159 }
   1160 
   1161 static DecodeStatus DecodeMSA128HRegisterClass(MCInst *Inst,
   1162 		unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder)
   1163 {
   1164 	unsigned Reg;
   1165 
   1166 	if (RegNo > 31)
   1167 		return MCDisassembler_Fail;
   1168 
   1169 	Reg = getReg(Decoder, Mips_MSA128HRegClassID, RegNo);
   1170 	MCOperand_CreateReg0(Inst, Reg);
   1171 
   1172 	return MCDisassembler_Success;
   1173 }
   1174 
   1175 static DecodeStatus DecodeMSA128WRegisterClass(MCInst *Inst,
   1176 		unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder)
   1177 {
   1178 	unsigned Reg;
   1179 
   1180 	if (RegNo > 31)
   1181 		return MCDisassembler_Fail;
   1182 
   1183 	Reg = getReg(Decoder, Mips_MSA128WRegClassID, RegNo);
   1184 	MCOperand_CreateReg0(Inst, Reg);
   1185 
   1186 	return MCDisassembler_Success;
   1187 }
   1188 
   1189 static DecodeStatus DecodeMSA128DRegisterClass(MCInst *Inst,
   1190 		unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder)
   1191 {
   1192 	unsigned Reg;
   1193 
   1194 	if (RegNo > 31)
   1195 		return MCDisassembler_Fail;
   1196 
   1197 	Reg = getReg(Decoder, Mips_MSA128DRegClassID, RegNo);
   1198 	MCOperand_CreateReg0(Inst, Reg);
   1199 
   1200 	return MCDisassembler_Success;
   1201 }
   1202 
   1203 static DecodeStatus DecodeMSACtrlRegisterClass(MCInst *Inst,
   1204 		unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder)
   1205 {
   1206 	unsigned Reg;
   1207 
   1208 	if (RegNo > 7)
   1209 		return MCDisassembler_Fail;
   1210 
   1211 	Reg = getReg(Decoder, Mips_MSACtrlRegClassID, RegNo);
   1212 	MCOperand_CreateReg0(Inst, Reg);
   1213 
   1214 	return MCDisassembler_Success;
   1215 }
   1216 
   1217 static DecodeStatus DecodeCOP2RegisterClass(MCInst *Inst,
   1218 		unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder)
   1219 {
   1220 	unsigned Reg;
   1221 
   1222 	if (RegNo > 31)
   1223 		return MCDisassembler_Fail;
   1224 
   1225 	Reg = getReg(Decoder, Mips_COP2RegClassID, RegNo);
   1226 	MCOperand_CreateReg0(Inst, Reg);
   1227 
   1228 	return MCDisassembler_Success;
   1229 }
   1230 
   1231 static DecodeStatus DecodeBranchTarget(MCInst *Inst,
   1232 		unsigned Offset, uint64_t Address, MCRegisterInfo *Decoder)
   1233 {
   1234 	uint64_t TargetAddress = (SignExtend32(Offset, 16) * 4) + Address + 4;
   1235 	MCOperand_CreateImm0(Inst, TargetAddress);
   1236 
   1237 	return MCDisassembler_Success;
   1238 }
   1239 
   1240 static DecodeStatus DecodeJumpTarget(MCInst *Inst,
   1241 		unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder)
   1242 {
   1243 	uint64_t TargetAddress = (fieldFromInstruction(Insn, 0, 26) << 2) | ((Address + 4) & ~0x0FFFFFFF);
   1244 	MCOperand_CreateImm0(Inst, TargetAddress);
   1245 
   1246 	return MCDisassembler_Success;
   1247 }
   1248 
   1249 static DecodeStatus DecodeBranchTarget21(MCInst *Inst,
   1250 		unsigned Offset, uint64_t Address, MCRegisterInfo *Decoder)
   1251 {
   1252 	int32_t BranchOffset = SignExtend32(Offset, 21) * 4;
   1253 
   1254 	MCOperand_CreateImm0(Inst, BranchOffset);
   1255 
   1256 	return MCDisassembler_Success;
   1257 }
   1258 
   1259 static DecodeStatus DecodeBranchTarget26(MCInst *Inst,
   1260 		unsigned Offset, uint64_t Address, MCRegisterInfo *Decoder)
   1261 {
   1262 	int32_t BranchOffset = SignExtend32(Offset, 26) * 4;
   1263 
   1264 	MCOperand_CreateImm0(Inst, BranchOffset);
   1265 	return MCDisassembler_Success;
   1266 }
   1267 
   1268 static DecodeStatus DecodeBranchTargetMM(MCInst *Inst,
   1269 		unsigned Offset, uint64_t Address, MCRegisterInfo *Decoder)
   1270 {
   1271 	int32_t BranchOffset = SignExtend32(Offset, 16) * 2;
   1272 	MCOperand_CreateImm0(Inst, BranchOffset);
   1273 
   1274 	return MCDisassembler_Success;
   1275 }
   1276 
   1277 static DecodeStatus DecodeJumpTargetMM(MCInst *Inst,
   1278 		unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder)
   1279 {
   1280 	unsigned JumpOffset = fieldFromInstruction(Insn, 0, 26) << 1;
   1281 	MCOperand_CreateImm0(Inst, JumpOffset);
   1282 
   1283 	return MCDisassembler_Success;
   1284 }
   1285 
   1286 static DecodeStatus DecodeSimm16(MCInst *Inst,
   1287 		unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder)
   1288 {
   1289 	MCOperand_CreateImm0(Inst, SignExtend32(Insn, 16));
   1290 	return MCDisassembler_Success;
   1291 }
   1292 
   1293 static DecodeStatus DecodeLSAImm(MCInst *Inst,
   1294 		unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder)
   1295 {
   1296 	// We add one to the immediate field as it was encoded as 'imm - 1'.
   1297 	MCOperand_CreateImm0(Inst, Insn + 1);
   1298 	return MCDisassembler_Success;
   1299 }
   1300 
   1301 static DecodeStatus DecodeInsSize(MCInst *Inst,
   1302 		unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder)
   1303 {
   1304 	// First we need to grab the pos(lsb) from MCInst.
   1305 	int Pos = (int)MCOperand_getImm(MCInst_getOperand(Inst, 2));
   1306 	int Size = (int) Insn - Pos + 1;
   1307 	MCOperand_CreateImm0(Inst, SignExtend32(Size, 16));
   1308 	return MCDisassembler_Success;
   1309 }
   1310 
   1311 static DecodeStatus DecodeExtSize(MCInst *Inst,
   1312 		unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder)
   1313 {
   1314 	int Size = (int) Insn  + 1;
   1315 	MCOperand_CreateImm0(Inst, SignExtend32(Size, 16));
   1316 	return MCDisassembler_Success;
   1317 }
   1318 
   1319 static DecodeStatus DecodeSimm19Lsl2(MCInst *Inst,
   1320 		unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder)
   1321 {
   1322 	MCOperand_CreateImm0(Inst, SignExtend32(Insn, 19) * 4);
   1323 	return MCDisassembler_Success;
   1324 }
   1325 
   1326 static DecodeStatus DecodeSimm18Lsl3(MCInst *Inst,
   1327 		unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder)
   1328 {
   1329 	MCOperand_CreateImm0(Inst, SignExtend32(Insn, 18) * 8);
   1330 	return MCDisassembler_Success;
   1331 }
   1332 
   1333 #endif
   1334