1 //===-- ARMDisassembler.cpp - Disassembler for ARM/Thumb ISA --------------===// 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 /* Capstone Disassembly Engine */ 11 /* By Nguyen Anh Quynh <aquynh (at) gmail.com>, 2013-2014 */ 12 13 #ifdef CAPSTONE_HAS_ARM 14 15 #include <stdio.h> 16 #include <string.h> 17 #include <stdlib.h> 18 #include <platform.h> 19 20 #include "ARMAddressingModes.h" 21 #include "ARMBaseInfo.h" 22 #include "../../MCFixedLenDisassembler.h" 23 #include "../../MCInst.h" 24 #include "../../MCInstrDesc.h" 25 #include "../../MCRegisterInfo.h" 26 #include "../../LEB128.h" 27 #include "../../MCDisassembler.h" 28 #include "../../cs_priv.h" 29 #include "../../utils.h" 30 31 #include "ARMDisassembler.h" 32 33 //#define GET_REGINFO_ENUM 34 //#include "X86GenRegisterInfo.inc" 35 36 #define GET_SUBTARGETINFO_ENUM 37 #include "ARMGenSubtargetInfo.inc" 38 39 #define GET_INSTRINFO_MC_DESC 40 #include "ARMGenInstrInfo.inc" 41 42 #define GET_INSTRINFO_ENUM 43 #include "ARMGenInstrInfo.inc" 44 45 static bool ITStatus_push_back(ARM_ITStatus *it, char v) 46 { 47 if (it->size >= sizeof(it->ITStates)) { 48 // TODO: consider warning user. 49 it->size = 0; 50 } 51 it->ITStates[it->size] = v; 52 it->size++; 53 54 return true; 55 } 56 57 // Returns true if the current instruction is in an IT block 58 static bool ITStatus_instrInITBlock(ARM_ITStatus *it) 59 { 60 //return !ITStates.empty(); 61 return (it->size > 0); 62 } 63 64 // Returns true if current instruction is the last instruction in an IT block 65 static bool ITStatus_instrLastInITBlock(ARM_ITStatus *it) 66 { 67 return (it->size == 1); 68 } 69 70 // Handles the condition code status of instructions in IT blocks 71 72 // Returns the condition code for instruction in IT block 73 static unsigned ITStatus_getITCC(ARM_ITStatus *it) 74 { 75 unsigned CC = ARMCC_AL; 76 if (ITStatus_instrInITBlock(it)) 77 //CC = ITStates.back(); 78 CC = it->ITStates[it->size-1]; 79 return CC; 80 } 81 82 // Advances the IT block state to the next T or E 83 static void ITStatus_advanceITState(ARM_ITStatus *it) 84 { 85 //ITStates.pop_back(); 86 it->size--; 87 } 88 89 // Called when decoding an IT instruction. Sets the IT state for the following 90 // instructions that for the IT block. Firstcond and Mask correspond to the 91 // fields in the IT instruction encoding. 92 static void ITStatus_setITState(ARM_ITStatus *it, char Firstcond, char Mask) 93 { 94 // (3 - the number of trailing zeros) is the number of then / else. 95 unsigned CondBit0 = Firstcond & 1; 96 unsigned NumTZ = CountTrailingZeros_32(Mask); 97 unsigned char CCBits = (unsigned char)Firstcond & 0xf; 98 unsigned Pos; 99 //assert(NumTZ <= 3 && "Invalid IT mask!"); 100 // push condition codes onto the stack the correct order for the pops 101 for (Pos = NumTZ+1; Pos <= 3; ++Pos) { 102 bool T = ((Mask >> Pos) & 1) == (int)CondBit0; 103 if (T) 104 ITStatus_push_back(it, CCBits); 105 else 106 ITStatus_push_back(it, CCBits ^ 1); 107 } 108 ITStatus_push_back(it, CCBits); 109 } 110 111 /// ThumbDisassembler - Thumb disassembler for all Thumb platforms. 112 113 static bool Check(DecodeStatus *Out, DecodeStatus In) 114 { 115 switch (In) { 116 case MCDisassembler_Success: 117 // Out stays the same. 118 return true; 119 case MCDisassembler_SoftFail: 120 *Out = In; 121 return true; 122 case MCDisassembler_Fail: 123 *Out = In; 124 return false; 125 default: // never reached 126 return false; 127 } 128 } 129 130 // Forward declare these because the autogenerated code will reference them. 131 // Definitions are further down. 132 static DecodeStatus DecodeGPRRegisterClass(MCInst *Inst, unsigned RegNo, 133 uint64_t Address, const void *Decoder); 134 static DecodeStatus DecodeGPRnopcRegisterClass(MCInst *Inst, 135 unsigned RegNo, uint64_t Address, const void *Decoder); 136 static DecodeStatus DecodeGPRwithAPSRRegisterClass(MCInst *Inst, 137 unsigned RegNo, uint64_t Address, const void *Decoder); 138 static DecodeStatus DecodetGPRRegisterClass(MCInst *Inst, unsigned RegNo, 139 uint64_t Address, const void *Decoder); 140 static DecodeStatus DecodetcGPRRegisterClass(MCInst *Inst, unsigned RegNo, 141 uint64_t Address, const void *Decoder); 142 static DecodeStatus DecoderGPRRegisterClass(MCInst *Inst, unsigned RegNo, 143 uint64_t Address, const void *Decoder); 144 static DecodeStatus DecodeGPRPairRegisterClass(MCInst *Inst, unsigned RegNo, 145 uint64_t Address, const void *Decoder); 146 static DecodeStatus DecodeSPRRegisterClass(MCInst *Inst, unsigned RegNo, 147 uint64_t Address, const void *Decoder); 148 static DecodeStatus DecodeDPRRegisterClass(MCInst *Inst, unsigned RegNo, 149 uint64_t Address, const void *Decoder); 150 static DecodeStatus DecodeDPR_8RegisterClass(MCInst *Inst, unsigned RegNo, 151 uint64_t Address, const void *Decoder); 152 static DecodeStatus DecodeDPR_VFP2RegisterClass(MCInst *Inst, 153 unsigned RegNo, uint64_t Address, const void *Decoder); 154 static DecodeStatus DecodeQPRRegisterClass(MCInst *Inst, unsigned RegNo, 155 uint64_t Address, const void *Decoder); 156 static DecodeStatus DecodeDPairRegisterClass(MCInst *Inst, unsigned RegNo, 157 uint64_t Address, const void *Decoder); 158 static DecodeStatus DecodeDPairSpacedRegisterClass(MCInst *Inst, 159 unsigned RegNo, uint64_t Address, const void *Decoder); 160 static DecodeStatus DecodePredicateOperand(MCInst *Inst, unsigned Val, 161 uint64_t Address, const void *Decoder); 162 static DecodeStatus DecodeCCOutOperand(MCInst *Inst, unsigned Val, 163 uint64_t Address, const void *Decoder); 164 static DecodeStatus DecodeSOImmOperand(MCInst *Inst, unsigned Val, 165 uint64_t Address, const void *Decoder); 166 static DecodeStatus DecodeRegListOperand(MCInst *Inst, unsigned Val, 167 uint64_t Address, const void *Decoder); 168 static DecodeStatus DecodeSPRRegListOperand(MCInst *Inst, unsigned Val, 169 uint64_t Address, const void *Decoder); 170 static DecodeStatus DecodeDPRRegListOperand(MCInst *Inst, unsigned Val, 171 uint64_t Address, const void *Decoder); 172 static DecodeStatus DecodeBitfieldMaskOperand(MCInst *Inst, unsigned Insn, 173 uint64_t Address, const void *Decoder); 174 static DecodeStatus DecodeCopMemInstruction(MCInst *Inst, unsigned Insn, 175 uint64_t Address, const void *Decoder); 176 static DecodeStatus DecodeAddrMode2IdxInstruction(MCInst *Inst, 177 unsigned Insn, uint64_t Address, const void *Decoder); 178 static DecodeStatus DecodeSORegMemOperand(MCInst *Inst, unsigned Insn, 179 uint64_t Address, const void *Decoder); 180 static DecodeStatus DecodeAddrMode3Instruction(MCInst *Inst,unsigned Insn, 181 uint64_t Address, const void *Decoder); 182 static DecodeStatus DecodeSORegImmOperand(MCInst *Inst, unsigned Insn, 183 uint64_t Address, const void *Decoder); 184 static DecodeStatus DecodeSORegRegOperand(MCInst *Inst, unsigned Insn, 185 uint64_t Address, const void *Decoder); 186 static DecodeStatus DecodeMemMultipleWritebackInstruction(MCInst * Inst, 187 unsigned Insn, uint64_t Adddress, const void *Decoder); 188 static DecodeStatus DecodeT2MOVTWInstruction(MCInst *Inst, unsigned Insn, 189 uint64_t Address, const void *Decoder); 190 static DecodeStatus DecodeArmMOVTWInstruction(MCInst *Inst, unsigned Insn, 191 uint64_t Address, const void *Decoder); 192 static DecodeStatus DecodeSMLAInstruction(MCInst *Inst, unsigned Insn, 193 uint64_t Address, const void *Decoder); 194 static DecodeStatus DecodeCPSInstruction(MCInst *Inst, unsigned Insn, 195 uint64_t Address, const void *Decoder); 196 static DecodeStatus DecodeT2CPSInstruction(MCInst *Inst, unsigned Insn, 197 uint64_t Address, const void *Decoder); 198 static DecodeStatus DecodeAddrModeImm12Operand(MCInst *Inst, unsigned Val, 199 uint64_t Address, const void *Decoder); 200 static DecodeStatus DecodeAddrMode5Operand(MCInst *Inst, unsigned Val, 201 uint64_t Address, const void *Decoder); 202 static DecodeStatus DecodeAddrMode7Operand(MCInst *Inst, unsigned Val, 203 uint64_t Address, const void *Decoder); 204 static DecodeStatus DecodeT2BInstruction(MCInst *Inst, unsigned Insn, 205 uint64_t Address, const void *Decoder); 206 static DecodeStatus DecodeBranchImmInstruction(MCInst *Inst,unsigned Insn, 207 uint64_t Address, const void *Decoder); 208 static DecodeStatus DecodeAddrMode6Operand(MCInst *Inst, unsigned Val, 209 uint64_t Address, const void *Decoder); 210 static DecodeStatus DecodeVLDST1Instruction(MCInst *Inst, unsigned Val, 211 uint64_t Address, const void *Decoder); 212 static DecodeStatus DecodeVLDST2Instruction(MCInst *Inst, unsigned Val, 213 uint64_t Address, const void *Decoder); 214 static DecodeStatus DecodeVLDST3Instruction(MCInst *Inst, unsigned Val, 215 uint64_t Address, const void *Decoder); 216 static DecodeStatus DecodeVLDST4Instruction(MCInst *Inst, unsigned Val, 217 uint64_t Address, const void *Decoder); 218 static DecodeStatus DecodeVLDInstruction(MCInst *Inst, unsigned Val, 219 uint64_t Address, const void *Decoder); 220 static DecodeStatus DecodeVSTInstruction(MCInst *Inst, unsigned Val, 221 uint64_t Address, const void *Decoder); 222 static DecodeStatus DecodeVLD1DupInstruction(MCInst *Inst, unsigned Val, 223 uint64_t Address, const void *Decoder); 224 static DecodeStatus DecodeVLD2DupInstruction(MCInst *Inst, unsigned Val, 225 uint64_t Address, const void *Decoder); 226 static DecodeStatus DecodeVLD3DupInstruction(MCInst *Inst, unsigned Val, 227 uint64_t Address, const void *Decoder); 228 static DecodeStatus DecodeVLD4DupInstruction(MCInst *Inst, unsigned Val, 229 uint64_t Address, const void *Decoder); 230 static DecodeStatus DecodeNEONModImmInstruction(MCInst *Inst,unsigned Val, 231 uint64_t Address, const void *Decoder); 232 static DecodeStatus DecodeVSHLMaxInstruction(MCInst *Inst, unsigned Val, 233 uint64_t Address, const void *Decoder); 234 static DecodeStatus DecodeShiftRight8Imm(MCInst *Inst, unsigned Val, 235 uint64_t Address, const void *Decoder); 236 static DecodeStatus DecodeShiftRight16Imm(MCInst *Inst, unsigned Val, 237 uint64_t Address, const void *Decoder); 238 static DecodeStatus DecodeShiftRight32Imm(MCInst *Inst, unsigned Val, 239 uint64_t Address, const void *Decoder); 240 static DecodeStatus DecodeShiftRight64Imm(MCInst *Inst, unsigned Val, 241 uint64_t Address, const void *Decoder); 242 static DecodeStatus DecodeTBLInstruction(MCInst *Inst, unsigned Insn, 243 uint64_t Address, const void *Decoder); 244 static DecodeStatus DecodePostIdxReg(MCInst *Inst, unsigned Insn, 245 uint64_t Address, const void *Decoder); 246 static DecodeStatus DecodeCoprocessor(MCInst *Inst, unsigned Insn, 247 uint64_t Address, const void *Decoder); 248 static DecodeStatus DecodeMemBarrierOption(MCInst *Inst, unsigned Insn, 249 uint64_t Address, const void *Decoder); 250 static DecodeStatus DecodeInstSyncBarrierOption(MCInst *Inst, unsigned Insn, 251 uint64_t Address, const void *Decoder); 252 static DecodeStatus DecodeMSRMask(MCInst *Inst, unsigned Insn, 253 uint64_t Address, const void *Decoder); 254 static DecodeStatus DecodeDoubleRegLoad(MCInst *Inst, unsigned Insn, 255 uint64_t Address, const void *Decoder); 256 static DecodeStatus DecodeDoubleRegStore(MCInst *Inst, unsigned Insn, 257 uint64_t Address, const void *Decoder); 258 static DecodeStatus DecodeLDRPreImm(MCInst *Inst, unsigned Insn, 259 uint64_t Address, const void *Decoder); 260 static DecodeStatus DecodeLDRPreReg(MCInst *Inst, unsigned Insn, 261 uint64_t Address, const void *Decoder); 262 static DecodeStatus DecodeSTRPreImm(MCInst *Inst, unsigned Insn, 263 uint64_t Address, const void *Decoder); 264 static DecodeStatus DecodeSTRPreReg(MCInst *Inst, unsigned Insn, 265 uint64_t Address, const void *Decoder); 266 static DecodeStatus DecodeVLD1LN(MCInst *Inst, unsigned Insn, 267 uint64_t Address, const void *Decoder); 268 static DecodeStatus DecodeVLD2LN(MCInst *Inst, unsigned Insn, 269 uint64_t Address, const void *Decoder); 270 static DecodeStatus DecodeVLD3LN(MCInst *Inst, unsigned Insn, 271 uint64_t Address, const void *Decoder); 272 static DecodeStatus DecodeVLD4LN(MCInst *Inst, unsigned Insn, 273 uint64_t Address, const void *Decoder); 274 static DecodeStatus DecodeVST1LN(MCInst *Inst, unsigned Insn, 275 uint64_t Address, const void *Decoder); 276 static DecodeStatus DecodeVST2LN(MCInst *Inst, unsigned Insn, 277 uint64_t Address, const void *Decoder); 278 static DecodeStatus DecodeVST3LN(MCInst *Inst, unsigned Insn, 279 uint64_t Address, const void *Decoder); 280 static DecodeStatus DecodeVST4LN(MCInst *Inst, unsigned Insn, 281 uint64_t Address, const void *Decoder); 282 static DecodeStatus DecodeVMOVSRR(MCInst *Inst, unsigned Insn, 283 uint64_t Address, const void *Decoder); 284 static DecodeStatus DecodeVMOVRRS(MCInst *Inst, unsigned Insn, 285 uint64_t Address, const void *Decoder); 286 static DecodeStatus DecodeSwap(MCInst *Inst, unsigned Insn, 287 uint64_t Address, const void *Decoder); 288 static DecodeStatus DecodeVCVTD(MCInst *Inst, unsigned Insn, 289 uint64_t Address, const void *Decoder); 290 static DecodeStatus DecodeVCVTQ(MCInst *Inst, unsigned Insn, 291 uint64_t Address, const void *Decoder); 292 static DecodeStatus DecodeThumbAddSpecialReg(MCInst *Inst, uint16_t Insn, 293 uint64_t Address, const void *Decoder); 294 static DecodeStatus DecodeThumbBROperand(MCInst *Inst, unsigned Val, 295 uint64_t Address, const void *Decoder); 296 static DecodeStatus DecodeT2BROperand(MCInst *Inst, unsigned Val, 297 uint64_t Address, const void *Decoder); 298 static DecodeStatus DecodeThumbCmpBROperand(MCInst *Inst, unsigned Val, 299 uint64_t Address, const void *Decoder); 300 static DecodeStatus DecodeThumbAddrModeRR(MCInst *Inst, unsigned Val, 301 uint64_t Address, const void *Decoder); 302 static DecodeStatus DecodeThumbAddrModeIS(MCInst *Inst, unsigned Val, 303 uint64_t Address, const void *Decoder); 304 static DecodeStatus DecodeThumbAddrModePC(MCInst *Inst, unsigned Val, 305 uint64_t Address, const void *Decoder); 306 static DecodeStatus DecodeThumbAddrModeSP(MCInst *Inst, unsigned Val, 307 uint64_t Address, const void *Decoder); 308 static DecodeStatus DecodeT2AddrModeSOReg(MCInst *Inst, unsigned Val, 309 uint64_t Address, const void *Decoder); 310 static DecodeStatus DecodeT2LoadShift(MCInst *Inst, unsigned Val, 311 uint64_t Address, const void *Decoder); 312 static DecodeStatus DecodeT2LoadImm8(MCInst *Inst, unsigned Insn, 313 uint64_t Address, const void* Decoder); 314 static DecodeStatus DecodeT2LoadImm12(MCInst *Inst, unsigned Insn, 315 uint64_t Address, const void* Decoder); 316 static DecodeStatus DecodeT2LoadT(MCInst *Inst, unsigned Insn, 317 uint64_t Address, const void* Decoder); 318 static DecodeStatus DecodeT2LoadLabel(MCInst *Inst, unsigned Insn, 319 uint64_t Address, const void* Decoder); 320 static DecodeStatus DecodeT2Imm8S4(MCInst *Inst, unsigned Val, 321 uint64_t Address, const void *Decoder); 322 static DecodeStatus DecodeT2AddrModeImm8s4(MCInst *Inst, unsigned Val, 323 uint64_t Address, const void *Decoder); 324 static DecodeStatus DecodeT2AddrModeImm0_1020s4(MCInst *Inst,unsigned Val, 325 uint64_t Address, const void *Decoder); 326 static DecodeStatus DecodeT2Imm8(MCInst *Inst, unsigned Val, 327 uint64_t Address, const void *Decoder); 328 static DecodeStatus DecodeT2AddrModeImm8(MCInst *Inst, unsigned Val, 329 uint64_t Address, const void *Decoder); 330 static DecodeStatus DecodeThumbAddSPImm(MCInst *Inst, uint16_t Val, 331 uint64_t Address, const void *Decoder); 332 static DecodeStatus DecodeThumbAddSPReg(MCInst *Inst, uint16_t Insn, 333 uint64_t Address, const void *Decoder); 334 static DecodeStatus DecodeThumbCPS(MCInst *Inst, uint16_t Insn, 335 uint64_t Address, const void *Decoder); 336 static DecodeStatus DecodeQADDInstruction(MCInst *Inst, unsigned Insn, 337 uint64_t Address, const void *Decoder); 338 static DecodeStatus DecodeThumbBLXOffset(MCInst *Inst, unsigned Insn, 339 uint64_t Address, const void *Decoder); 340 static DecodeStatus DecodeT2AddrModeImm12(MCInst *Inst, unsigned Val, 341 uint64_t Address, const void *Decoder); 342 static DecodeStatus DecodeThumbTableBranch(MCInst *Inst, unsigned Val, 343 uint64_t Address, const void *Decoder); 344 static DecodeStatus DecodeThumb2BCCInstruction(MCInst *Inst, unsigned Val, 345 uint64_t Address, const void *Decoder); 346 static DecodeStatus DecodeT2SOImm(MCInst *Inst, unsigned Val, 347 uint64_t Address, const void *Decoder); 348 static DecodeStatus DecodeThumbBCCTargetOperand(MCInst *Inst,unsigned Val, 349 uint64_t Address, const void *Decoder); 350 static DecodeStatus DecodeThumbBLTargetOperand(MCInst *Inst, unsigned Val, 351 uint64_t Address, const void *Decoder); 352 static DecodeStatus DecodeIT(MCInst *Inst, unsigned Val, 353 uint64_t Address, const void *Decoder); 354 static DecodeStatus DecodeT2LDRDPreInstruction(MCInst *Inst,unsigned Insn, 355 uint64_t Address, const void *Decoder); 356 static DecodeStatus DecodeT2STRDPreInstruction(MCInst *Inst,unsigned Insn, 357 uint64_t Address, const void *Decoder); 358 static DecodeStatus DecodeT2Adr(MCInst *Inst, uint32_t Val, 359 uint64_t Address, const void *Decoder); 360 static DecodeStatus DecodeT2LdStPre(MCInst *Inst, unsigned Val, 361 uint64_t Address, const void *Decoder); 362 static DecodeStatus DecodeT2ShifterImmOperand(MCInst *Inst, uint32_t Val, 363 uint64_t Address, const void *Decoder); 364 365 static DecodeStatus DecodeLDR(MCInst *Inst, unsigned Val, 366 uint64_t Address, const void *Decoder); 367 static DecodeStatus DecodeMRRC2(MCInst *Inst, unsigned Val, 368 uint64_t Address, const void *Decoder); 369 370 // Hacky: enable all features for disassembler 371 uint64_t ARM_getFeatureBits(unsigned int mode) 372 { 373 uint64_t Bits = (uint64_t)-1; // everything by default 374 375 // FIXME: ARM_FeatureVFPOnlySP is conflicting with everything else?? 376 Bits &= (~ARM_FeatureVFPOnlySP); 377 378 // FIXME: no Armv8 support? 379 //Bits -= ARM_HasV7Ops; 380 //Bits &= ~ARM_FeatureMP; 381 if ((mode & CS_MODE_V8) == 0) 382 Bits &= ~ARM_HasV8Ops; 383 //Bits &= ~ARM_HasV6Ops; 384 385 if ((mode & CS_MODE_MCLASS) == 0) 386 Bits &= (~ARM_FeatureMClass); 387 388 // some features are mutually exclusive 389 if (mode & CS_MODE_THUMB) { 390 //Bits &= ~ARM_HasV6Ops; 391 //Bits &= ~ARM_FeatureCRC; 392 //Bits &= ~ARM_HasV5TEOps; 393 //Bits &= ~ARM_HasV4TOps; 394 //Bits &= ~ARM_HasV6T2Ops; 395 //Bits &= ~ARM_FeatureDB; 396 //Bits &= ~ARM_FeatureHWDivARM; 397 //Bits &= ~ARM_FeatureNaClTrap; 398 //Bits &= ~ARM_FeatureMClass; 399 // ArmV8 400 } else { // ARM mode 401 Bits &= ~ARM_ModeThumb; 402 Bits &= ~ARM_FeatureThumb2; 403 } 404 405 return Bits; 406 } 407 408 #include "ARMGenDisassemblerTables.inc" 409 410 static DecodeStatus DecodePredicateOperand(MCInst *Inst, unsigned Val, 411 uint64_t Address, const void *Decoder) 412 { 413 if (Val == 0xF) return MCDisassembler_Fail; 414 // AL predicate is not allowed on Thumb1 branches. 415 if (MCInst_getOpcode(Inst) == ARM_tBcc && Val == 0xE) 416 return MCDisassembler_Fail; 417 MCOperand_CreateImm0(Inst, Val); 418 if (Val == ARMCC_AL) { 419 MCOperand_CreateReg0(Inst, 0); 420 } else 421 MCOperand_CreateReg0(Inst, ARM_CPSR); 422 return MCDisassembler_Success; 423 } 424 425 #define GET_REGINFO_MC_DESC 426 #include "ARMGenRegisterInfo.inc" 427 void ARM_init(MCRegisterInfo *MRI) 428 { 429 /* 430 InitMCRegisterInfo(ARMRegDesc, 289, 431 RA, PC, 432 ARMMCRegisterClasses, 100, 433 ARMRegUnitRoots, 77, ARMRegDiffLists, ARMRegStrings, 434 ARMSubRegIdxLists, 57, 435 ARMSubRegIdxRanges, ARMRegEncodingTable); 436 */ 437 438 MCRegisterInfo_InitMCRegisterInfo(MRI, ARMRegDesc, 289, 439 0, 0, 440 ARMMCRegisterClasses, 100, 441 0, 0, ARMRegDiffLists, 0, 442 ARMSubRegIdxLists, 57, 443 0); 444 } 445 446 static DecodeStatus _ARM_getInstruction(cs_struct *ud, MCInst *MI, const uint8_t *code, size_t code_len, 447 uint16_t *Size, uint64_t Address) 448 { 449 uint32_t insn, i; 450 uint8_t bytes[4]; 451 DecodeStatus result; 452 453 if (code_len < 4) 454 // not enough data 455 return MCDisassembler_Fail; 456 457 if (MI->flat_insn->detail) { 458 memset(&MI->flat_insn->detail->arm, 0, sizeof(cs_arm)); 459 for (i = 0; i < ARR_SIZE(MI->flat_insn->detail->arm.operands); i++) 460 MI->flat_insn->detail->arm.operands[i].vector_index = -1; 461 } 462 463 memcpy(bytes, code, 4); 464 465 if (ud->big_endian) 466 insn = (bytes[3] << 0) | 467 (bytes[2] << 8) | 468 (bytes[1] << 16) | 469 (bytes[0] << 24); 470 else 471 insn = (bytes[3] << 24) | 472 (bytes[2] << 16) | 473 (bytes[1] << 8) | 474 (bytes[0] << 0); 475 476 // Calling the auto-generated decoder function. 477 result = decodeInstruction_4(DecoderTableARM32, MI, insn, Address, NULL, ud->mode); 478 if (result != MCDisassembler_Fail) { 479 *Size = 4; 480 return result; 481 } 482 483 // VFP and NEON instructions, similarly, are shared between ARM 484 // and Thumb modes. 485 MCInst_clear(MI); 486 result = decodeInstruction_4(DecoderTableVFP32, MI, insn, Address, NULL, ud->mode); 487 if (result != MCDisassembler_Fail) { 488 *Size = 4; 489 return result; 490 } 491 492 MCInst_clear(MI); 493 result = decodeInstruction_4(DecoderTableVFPV832, MI, insn, Address, NULL, ud->mode); 494 if (result != MCDisassembler_Fail) { 495 *Size = 4; 496 return result; 497 } 498 499 MCInst_clear(MI); 500 result = decodeInstruction_4(DecoderTableNEONData32, MI, insn, Address, NULL, ud->mode); 501 if (result != MCDisassembler_Fail) { 502 *Size = 4; 503 // Add a fake predicate operand, because we share these instruction 504 // definitions with Thumb2 where these instructions are predicable. 505 if (!DecodePredicateOperand(MI, 0xE, Address, NULL)) 506 return MCDisassembler_Fail; 507 return result; 508 } 509 510 MCInst_clear(MI); 511 result = decodeInstruction_4(DecoderTableNEONLoadStore32, MI, insn, Address, NULL, ud->mode); 512 if (result != MCDisassembler_Fail) { 513 *Size = 4; 514 // Add a fake predicate operand, because we share these instruction 515 // definitions with Thumb2 where these instructions are predicable. 516 if (!DecodePredicateOperand(MI, 0xE, Address, NULL)) 517 return MCDisassembler_Fail; 518 return result; 519 } 520 521 MCInst_clear(MI); 522 result = decodeInstruction_4(DecoderTableNEONDup32, MI, insn, Address, NULL, ud->mode); 523 if (result != MCDisassembler_Fail) { 524 *Size = 4; 525 // Add a fake predicate operand, because we share these instruction 526 // definitions with Thumb2 where these instructions are predicable. 527 if (!DecodePredicateOperand(MI, 0xE, Address, NULL)) 528 return MCDisassembler_Fail; 529 return result; 530 } 531 532 MCInst_clear(MI); 533 result = decodeInstruction_4(DecoderTablev8NEON32, MI, insn, Address, NULL, ud->mode); 534 if (result != MCDisassembler_Fail) { 535 *Size = 4; 536 return result; 537 } 538 539 MCInst_clear(MI); 540 result = decodeInstruction_4(DecoderTablev8Crypto32, MI, insn, Address, NULL, ud->mode); 541 if (result != MCDisassembler_Fail) { 542 *Size = 4; 543 return result; 544 } 545 546 MCInst_clear(MI); 547 *Size = 0; 548 return MCDisassembler_Fail; 549 } 550 551 // Thumb1 instructions don't have explicit S bits. Rather, they 552 // implicitly set CPSR. Since it's not represented in the encoding, the 553 // auto-generated decoder won't inject the CPSR operand. We need to fix 554 // that as a post-pass. 555 static void AddThumb1SBit(MCInst *MI, bool InITBlock) 556 { 557 MCOperandInfo *OpInfo = ARMInsts[MCInst_getOpcode(MI)].OpInfo; 558 unsigned short NumOps = ARMInsts[MCInst_getOpcode(MI)].NumOperands; 559 unsigned i; 560 561 for (i = 0; i < NumOps; ++i) { 562 if (i == MCInst_getNumOperands(MI)) break; 563 if (MCOperandInfo_isOptionalDef(&OpInfo[i]) && OpInfo[i].RegClass == ARM_CCRRegClassID) { 564 if (i > 0 && MCOperandInfo_isPredicate(&OpInfo[i-1])) continue; 565 MCInst_insert0(MI, i, MCOperand_CreateReg1(MI, InITBlock ? 0 : ARM_CPSR)); 566 return; 567 } 568 } 569 570 //MI.insert(I, MCOperand_CreateReg0(Inst, InITBlock ? 0 : ARM_CPSR)); 571 MCInst_insert0(MI, i, MCOperand_CreateReg1(MI, InITBlock ? 0 : ARM_CPSR)); 572 } 573 574 // Most Thumb instructions don't have explicit predicates in the 575 // encoding, but rather get their predicates from IT context. We need 576 // to fix up the predicate operands using this context information as a 577 // post-pass. 578 static DecodeStatus AddThumbPredicate(cs_struct *ud, MCInst *MI) 579 { 580 DecodeStatus S = MCDisassembler_Success; 581 MCOperandInfo *OpInfo; 582 unsigned short NumOps; 583 unsigned int i; 584 unsigned CC; 585 586 // A few instructions actually have predicates encoded in them. Don't 587 // try to overwrite it if we're seeing one of those. 588 switch (MCInst_getOpcode(MI)) { 589 case ARM_tBcc: 590 case ARM_t2Bcc: 591 case ARM_tCBZ: 592 case ARM_tCBNZ: 593 case ARM_tCPS: 594 case ARM_t2CPS3p: 595 case ARM_t2CPS2p: 596 case ARM_t2CPS1p: 597 case ARM_tMOVSr: 598 case ARM_tSETEND: 599 // Some instructions (mostly conditional branches) are not 600 // allowed in IT blocks. 601 if (ITStatus_instrInITBlock(&(ud->ITBlock))) 602 S = MCDisassembler_SoftFail; 603 else 604 return MCDisassembler_Success; 605 break; 606 case ARM_tB: 607 case ARM_t2B: 608 case ARM_t2TBB: 609 case ARM_t2TBH: 610 // Some instructions (mostly unconditional branches) can 611 // only appears at the end of, or outside of, an IT. 612 //if (ITBlock.instrInITBlock() && !ITBlock.instrLastInITBlock()) 613 if (ITStatus_instrInITBlock(&(ud->ITBlock)) && !ITStatus_instrLastInITBlock(&(ud->ITBlock))) 614 S = MCDisassembler_SoftFail; 615 break; 616 default: 617 break; 618 } 619 620 // If we're in an IT block, base the predicate on that. Otherwise, 621 // assume a predicate of AL. 622 CC = ITStatus_getITCC(&(ud->ITBlock)); 623 if (CC == 0xF) 624 CC = ARMCC_AL; 625 if (ITStatus_instrInITBlock(&(ud->ITBlock))) 626 ITStatus_advanceITState(&(ud->ITBlock)); 627 628 OpInfo = ARMInsts[MCInst_getOpcode(MI)].OpInfo; 629 NumOps = ARMInsts[MCInst_getOpcode(MI)].NumOperands; 630 631 for (i = 0; i < NumOps; ++i) { 632 if (i == MCInst_getNumOperands(MI)) break; 633 if (MCOperandInfo_isPredicate(&OpInfo[i])) { 634 MCInst_insert0(MI, i, MCOperand_CreateImm1(MI, CC)); 635 if (CC == ARMCC_AL) 636 MCInst_insert0(MI, i+1, MCOperand_CreateReg1(MI, 0)); 637 else 638 MCInst_insert0(MI, i+1, MCOperand_CreateReg1(MI, ARM_CPSR)); 639 return S; 640 } 641 } 642 643 MCInst_insert0(MI, i, MCOperand_CreateImm1(MI, CC)); 644 if (CC == ARMCC_AL) 645 MCInst_insert0(MI, i+1, MCOperand_CreateReg1(MI, 0)); 646 else 647 MCInst_insert0(MI, i+1, MCOperand_CreateReg1(MI, ARM_CPSR)); 648 649 return S; 650 } 651 652 // Thumb VFP instructions are a special case. Because we share their 653 // encodings between ARM and Thumb modes, and they are predicable in ARM 654 // mode, the auto-generated decoder will give them an (incorrect) 655 // predicate operand. We need to rewrite these operands based on the IT 656 // context as a post-pass. 657 static void UpdateThumbVFPPredicate(cs_struct *ud, MCInst *MI) 658 { 659 unsigned CC; 660 unsigned short NumOps; 661 MCOperandInfo *OpInfo; 662 unsigned i; 663 664 CC = ITStatus_getITCC(&(ud->ITBlock)); 665 if (ITStatus_instrInITBlock(&(ud->ITBlock))) 666 ITStatus_advanceITState(&(ud->ITBlock)); 667 668 OpInfo = ARMInsts[MCInst_getOpcode(MI)].OpInfo; 669 NumOps = ARMInsts[MCInst_getOpcode(MI)].NumOperands; 670 671 for (i = 0; i < NumOps; ++i) { 672 if (MCOperandInfo_isPredicate(&OpInfo[i])) { 673 MCOperand_setImm(MCInst_getOperand(MI, i), CC); 674 if (CC == ARMCC_AL) 675 MCOperand_setReg(MCInst_getOperand(MI, i+1), 0); 676 else 677 MCOperand_setReg(MCInst_getOperand(MI, i+1), ARM_CPSR); 678 return; 679 } 680 } 681 } 682 683 static DecodeStatus _Thumb_getInstruction(cs_struct *ud, MCInst *MI, const uint8_t *code, size_t code_len, 684 uint16_t *Size, uint64_t Address) 685 { 686 uint8_t bytes[4]; 687 uint16_t insn16; 688 DecodeStatus result; 689 bool InITBlock; 690 unsigned Firstcond, Mask; 691 uint32_t NEONLdStInsn, insn32, NEONDataInsn, NEONCryptoInsn, NEONv8Insn; 692 size_t i; 693 694 // We want to read exactly 2 bytes of data. 695 if (code_len < 2) 696 // not enough data 697 return MCDisassembler_Fail; 698 699 if (MI->flat_insn->detail) { 700 memset(&MI->flat_insn->detail->arm, 0, sizeof(cs_arm)); 701 for (i = 0; i < ARR_SIZE(MI->flat_insn->detail->arm.operands); i++) 702 MI->flat_insn->detail->arm.operands[i].vector_index = -1; 703 } 704 705 memcpy(bytes, code, 2); 706 707 if (ud->big_endian) 708 insn16 = (bytes[0] << 8) | bytes[1]; 709 else 710 insn16 = (bytes[1] << 8) | bytes[0]; 711 712 result = decodeInstruction_2(DecoderTableThumb16, MI, insn16, Address, NULL, ud->mode); 713 if (result != MCDisassembler_Fail) { 714 *Size = 2; 715 Check(&result, AddThumbPredicate(ud, MI)); 716 return result; 717 } 718 719 MCInst_clear(MI); 720 result = decodeInstruction_2(DecoderTableThumbSBit16, MI, insn16, Address, NULL, ud->mode); 721 if (result) { 722 *Size = 2; 723 InITBlock = ITStatus_instrInITBlock(&(ud->ITBlock)); 724 Check(&result, AddThumbPredicate(ud, MI)); 725 AddThumb1SBit(MI, InITBlock); 726 return result; 727 } 728 729 MCInst_clear(MI); 730 result = decodeInstruction_2(DecoderTableThumb216, MI, insn16, Address, NULL, ud->mode); 731 if (result != MCDisassembler_Fail) { 732 *Size = 2; 733 734 // Nested IT blocks are UNPREDICTABLE. Must be checked before we add 735 // the Thumb predicate. 736 if (MCInst_getOpcode(MI) == ARM_t2IT && ITStatus_instrInITBlock(&(ud->ITBlock))) 737 return MCDisassembler_SoftFail; 738 Check(&result, AddThumbPredicate(ud, MI)); 739 740 // If we find an IT instruction, we need to parse its condition 741 // code and mask operands so that we can apply them correctly 742 // to the subsequent instructions. 743 if (MCInst_getOpcode(MI) == ARM_t2IT) { 744 745 Firstcond = (unsigned int)MCOperand_getImm(MCInst_getOperand(MI, 0)); 746 Mask = (unsigned int)MCOperand_getImm(MCInst_getOperand(MI, 1)); 747 ITStatus_setITState(&(ud->ITBlock), (char)Firstcond, (char)Mask); 748 } 749 750 return result; 751 } 752 753 // We want to read exactly 4 bytes of data. 754 if (code_len < 4) 755 // not enough data 756 return MCDisassembler_Fail; 757 758 memcpy(bytes, code, 4); 759 760 if (ud->big_endian) 761 insn32 = (bytes[3] << 0) | 762 (bytes[2] << 8) | 763 (bytes[1] << 16) | 764 (bytes[0] << 24); 765 else 766 insn32 = (bytes[3] << 8) | 767 (bytes[2] << 0) | 768 (bytes[1] << 24) | 769 (bytes[0] << 16); 770 771 MCInst_clear(MI); 772 result = decodeInstruction_4(DecoderTableThumb32, MI, insn32, Address, NULL, ud->mode); 773 if (result != MCDisassembler_Fail) { 774 *Size = 4; 775 InITBlock = ITStatus_instrInITBlock(&(ud->ITBlock)); 776 Check(&result, AddThumbPredicate(ud, MI)); 777 AddThumb1SBit(MI, InITBlock); 778 return result; 779 } 780 781 MCInst_clear(MI); 782 result = decodeInstruction_4(DecoderTableThumb232, MI, insn32, Address, NULL, ud->mode); 783 if (result != MCDisassembler_Fail) { 784 *Size = 4; 785 Check(&result, AddThumbPredicate(ud, MI)); 786 return result; 787 } 788 789 MCInst_clear(MI); 790 result = decodeInstruction_4(DecoderTableVFP32, MI, insn32, Address, NULL, ud->mode); 791 if (result != MCDisassembler_Fail) { 792 *Size = 4; 793 UpdateThumbVFPPredicate(ud, MI); 794 return result; 795 } 796 797 if (fieldFromInstruction_4(insn32, 28, 4) == 0xE) { 798 MCInst_clear(MI); 799 result = decodeInstruction_4(DecoderTableVFP32, MI, insn32, Address, NULL, ud->mode); 800 if (result != MCDisassembler_Fail) { 801 *Size = 4; 802 UpdateThumbVFPPredicate(ud, MI); 803 return result; 804 } 805 } 806 807 MCInst_clear(MI); 808 result = decodeInstruction_4(DecoderTableVFPV832, MI, insn32, Address, NULL, ud->mode); 809 if (result != MCDisassembler_Fail) { 810 *Size = 4; 811 return result; 812 } 813 814 if (fieldFromInstruction_4(insn32, 28, 4) == 0xE) { 815 MCInst_clear(MI); 816 result = decodeInstruction_4(DecoderTableNEONDup32, MI, insn32, Address, NULL, ud->mode); 817 if (result != MCDisassembler_Fail) { 818 *Size = 4; 819 Check(&result, AddThumbPredicate(ud, MI)); 820 return result; 821 } 822 } 823 824 if (fieldFromInstruction_4(insn32, 24, 8) == 0xF9) { 825 MCInst_clear(MI); 826 NEONLdStInsn = insn32; 827 NEONLdStInsn &= 0xF0FFFFFF; 828 NEONLdStInsn |= 0x04000000; 829 result = decodeInstruction_4(DecoderTableNEONLoadStore32, MI, NEONLdStInsn, Address, NULL, ud->mode); 830 if (result != MCDisassembler_Fail) { 831 *Size = 4; 832 Check(&result, AddThumbPredicate(ud, MI)); 833 return result; 834 } 835 } 836 837 if (fieldFromInstruction_4(insn32, 24, 4) == 0xF) { 838 MCInst_clear(MI); 839 NEONDataInsn = insn32; 840 NEONDataInsn &= 0xF0FFFFFF; // Clear bits 27-24 841 NEONDataInsn |= (NEONDataInsn & 0x10000000) >> 4; // Move bit 28 to bit 24 842 NEONDataInsn |= 0x12000000; // Set bits 28 and 25 843 result = decodeInstruction_4(DecoderTableNEONData32, MI, NEONDataInsn, Address, NULL, ud->mode); 844 if (result != MCDisassembler_Fail) { 845 *Size = 4; 846 Check(&result, AddThumbPredicate(ud, MI)); 847 return result; 848 } 849 } 850 851 MCInst_clear(MI); 852 NEONCryptoInsn = insn32; 853 NEONCryptoInsn &= 0xF0FFFFFF; // Clear bits 27-24 854 NEONCryptoInsn |= (NEONCryptoInsn & 0x10000000) >> 4; // Move bit 28 to bit 24 855 NEONCryptoInsn |= 0x12000000; // Set bits 28 and 25 856 result = decodeInstruction_4(DecoderTablev8Crypto32, MI, NEONCryptoInsn, 857 Address, NULL, ud->mode); 858 if (result != MCDisassembler_Fail) { 859 *Size = 4; 860 return result; 861 } 862 863 MCInst_clear(MI); 864 NEONv8Insn = insn32; 865 NEONv8Insn &= 0xF3FFFFFF; // Clear bits 27-26 866 result = decodeInstruction_4(DecoderTablev8NEON32, MI, NEONv8Insn, Address, NULL, ud->mode); 867 if (result != MCDisassembler_Fail) { 868 *Size = 4; 869 return result; 870 } 871 872 MCInst_clear(MI); 873 *Size = 0; 874 return MCDisassembler_Fail; 875 } 876 877 bool Thumb_getInstruction(csh ud, const uint8_t *code, size_t code_len, MCInst *instr, 878 uint16_t *size, uint64_t address, void *info) 879 { 880 DecodeStatus status = _Thumb_getInstruction((cs_struct *)ud, instr, code, code_len, size, address); 881 882 //return status == MCDisassembler_Success; 883 return status != MCDisassembler_Fail; 884 } 885 886 bool ARM_getInstruction(csh ud, const uint8_t *code, size_t code_len, MCInst *instr, 887 uint16_t *size, uint64_t address, void *info) 888 { 889 DecodeStatus status = _ARM_getInstruction((cs_struct *)ud, instr, code, code_len, size, address); 890 891 //return status == MCDisassembler_Success; 892 return status != MCDisassembler_Fail; 893 } 894 895 static const uint16_t GPRDecoderTable[] = { 896 ARM_R0, ARM_R1, ARM_R2, ARM_R3, 897 ARM_R4, ARM_R5, ARM_R6, ARM_R7, 898 ARM_R8, ARM_R9, ARM_R10, ARM_R11, 899 ARM_R12, ARM_SP, ARM_LR, ARM_PC 900 }; 901 902 static DecodeStatus DecodeGPRRegisterClass(MCInst *Inst, unsigned RegNo, 903 uint64_t Address, const void *Decoder) 904 { 905 unsigned Register; 906 if (RegNo > 15) 907 return MCDisassembler_Fail; 908 909 Register = GPRDecoderTable[RegNo]; 910 MCOperand_CreateReg0(Inst, Register); 911 return MCDisassembler_Success; 912 } 913 914 static DecodeStatus DecodeGPRnopcRegisterClass(MCInst *Inst, unsigned RegNo, 915 uint64_t Address, const void *Decoder) 916 { 917 DecodeStatus S = MCDisassembler_Success; 918 919 if (RegNo == 15) 920 S = MCDisassembler_SoftFail; 921 922 Check(&S, DecodeGPRRegisterClass(Inst, RegNo, Address, Decoder)); 923 924 return S; 925 } 926 927 static DecodeStatus DecodeGPRwithAPSRRegisterClass(MCInst *Inst, unsigned RegNo, 928 uint64_t Address, const void *Decoder) 929 { 930 DecodeStatus S = MCDisassembler_Success; 931 932 if (RegNo == 15) { 933 MCOperand_CreateReg0(Inst, ARM_APSR_NZCV); 934 return MCDisassembler_Success; 935 } 936 937 Check(&S, DecodeGPRRegisterClass(Inst, RegNo, Address, Decoder)); 938 return S; 939 } 940 941 static DecodeStatus DecodetGPRRegisterClass(MCInst *Inst, unsigned RegNo, 942 uint64_t Address, const void *Decoder) 943 { 944 if (RegNo > 7) 945 return MCDisassembler_Fail; 946 return DecodeGPRRegisterClass(Inst, RegNo, Address, Decoder); 947 } 948 949 static const uint16_t GPRPairDecoderTable[] = { 950 ARM_R0_R1, ARM_R2_R3, ARM_R4_R5, ARM_R6_R7, 951 ARM_R8_R9, ARM_R10_R11, ARM_R12_SP 952 }; 953 954 static DecodeStatus DecodeGPRPairRegisterClass(MCInst *Inst, unsigned RegNo, 955 uint64_t Address, const void *Decoder) 956 { 957 unsigned RegisterPair; 958 DecodeStatus S = MCDisassembler_Success; 959 960 if (RegNo > 13) 961 return MCDisassembler_Fail; 962 963 if ((RegNo & 1) || RegNo == 0xe) 964 S = MCDisassembler_SoftFail; 965 966 RegisterPair = GPRPairDecoderTable[RegNo/2]; 967 MCOperand_CreateReg0(Inst, RegisterPair); 968 return S; 969 } 970 971 static DecodeStatus DecodetcGPRRegisterClass(MCInst *Inst, unsigned RegNo, 972 uint64_t Address, const void *Decoder) 973 { 974 unsigned Register = 0; 975 switch (RegNo) { 976 case 0: 977 Register = ARM_R0; 978 break; 979 case 1: 980 Register = ARM_R1; 981 break; 982 case 2: 983 Register = ARM_R2; 984 break; 985 case 3: 986 Register = ARM_R3; 987 break; 988 case 9: 989 Register = ARM_R9; 990 break; 991 case 12: 992 Register = ARM_R12; 993 break; 994 default: 995 return MCDisassembler_Fail; 996 } 997 998 MCOperand_CreateReg0(Inst, Register); 999 return MCDisassembler_Success; 1000 } 1001 1002 static DecodeStatus DecoderGPRRegisterClass(MCInst *Inst, unsigned RegNo, 1003 uint64_t Address, const void *Decoder) 1004 { 1005 DecodeStatus S = MCDisassembler_Success; 1006 if (RegNo == 13 || RegNo == 15) 1007 S = MCDisassembler_SoftFail; 1008 Check(&S, DecodeGPRRegisterClass(Inst, RegNo, Address, Decoder)); 1009 return S; 1010 } 1011 1012 static const uint16_t SPRDecoderTable[] = { 1013 ARM_S0, ARM_S1, ARM_S2, ARM_S3, 1014 ARM_S4, ARM_S5, ARM_S6, ARM_S7, 1015 ARM_S8, ARM_S9, ARM_S10, ARM_S11, 1016 ARM_S12, ARM_S13, ARM_S14, ARM_S15, 1017 ARM_S16, ARM_S17, ARM_S18, ARM_S19, 1018 ARM_S20, ARM_S21, ARM_S22, ARM_S23, 1019 ARM_S24, ARM_S25, ARM_S26, ARM_S27, 1020 ARM_S28, ARM_S29, ARM_S30, ARM_S31 1021 }; 1022 1023 static DecodeStatus DecodeSPRRegisterClass(MCInst *Inst, unsigned RegNo, 1024 uint64_t Address, const void *Decoder) 1025 { 1026 unsigned Register; 1027 if (RegNo > 31) 1028 return MCDisassembler_Fail; 1029 1030 Register = SPRDecoderTable[RegNo]; 1031 MCOperand_CreateReg0(Inst, Register); 1032 return MCDisassembler_Success; 1033 } 1034 1035 static const uint16_t DPRDecoderTable[] = { 1036 ARM_D0, ARM_D1, ARM_D2, ARM_D3, 1037 ARM_D4, ARM_D5, ARM_D6, ARM_D7, 1038 ARM_D8, ARM_D9, ARM_D10, ARM_D11, 1039 ARM_D12, ARM_D13, ARM_D14, ARM_D15, 1040 ARM_D16, ARM_D17, ARM_D18, ARM_D19, 1041 ARM_D20, ARM_D21, ARM_D22, ARM_D23, 1042 ARM_D24, ARM_D25, ARM_D26, ARM_D27, 1043 ARM_D28, ARM_D29, ARM_D30, ARM_D31 1044 }; 1045 1046 static DecodeStatus DecodeDPRRegisterClass(MCInst *Inst, unsigned RegNo, 1047 uint64_t Address, const void *Decoder) 1048 { 1049 unsigned Register = 0; 1050 if (RegNo > 31) 1051 return MCDisassembler_Fail; 1052 1053 Register = DPRDecoderTable[RegNo]; 1054 MCOperand_CreateReg0(Inst, Register); 1055 return MCDisassembler_Success; 1056 } 1057 1058 static DecodeStatus DecodeDPR_8RegisterClass(MCInst *Inst, unsigned RegNo, 1059 uint64_t Address, const void *Decoder) 1060 { 1061 if (RegNo > 7) 1062 return MCDisassembler_Fail; 1063 return DecodeDPRRegisterClass(Inst, RegNo, Address, Decoder); 1064 } 1065 1066 static DecodeStatus 1067 DecodeDPR_VFP2RegisterClass(MCInst *Inst, unsigned RegNo, 1068 uint64_t Address, const void *Decoder) 1069 { 1070 if (RegNo > 15) 1071 return MCDisassembler_Fail; 1072 return DecodeDPRRegisterClass(Inst, RegNo, Address, Decoder); 1073 } 1074 1075 static const uint16_t QPRDecoderTable[] = { 1076 ARM_Q0, ARM_Q1, ARM_Q2, ARM_Q3, 1077 ARM_Q4, ARM_Q5, ARM_Q6, ARM_Q7, 1078 ARM_Q8, ARM_Q9, ARM_Q10, ARM_Q11, 1079 ARM_Q12, ARM_Q13, ARM_Q14, ARM_Q15 1080 }; 1081 1082 static DecodeStatus DecodeQPRRegisterClass(MCInst *Inst, unsigned RegNo, 1083 uint64_t Address, const void *Decoder) 1084 { 1085 unsigned Register; 1086 if (RegNo > 31 || (RegNo & 1) != 0) 1087 return MCDisassembler_Fail; 1088 RegNo >>= 1; 1089 1090 Register = QPRDecoderTable[RegNo]; 1091 MCOperand_CreateReg0(Inst, Register); 1092 return MCDisassembler_Success; 1093 } 1094 1095 static const uint16_t DPairDecoderTable[] = { 1096 ARM_Q0, ARM_D1_D2, ARM_Q1, ARM_D3_D4, ARM_Q2, ARM_D5_D6, 1097 ARM_Q3, ARM_D7_D8, ARM_Q4, ARM_D9_D10, ARM_Q5, ARM_D11_D12, 1098 ARM_Q6, ARM_D13_D14, ARM_Q7, ARM_D15_D16, ARM_Q8, ARM_D17_D18, 1099 ARM_Q9, ARM_D19_D20, ARM_Q10, ARM_D21_D22, ARM_Q11, ARM_D23_D24, 1100 ARM_Q12, ARM_D25_D26, ARM_Q13, ARM_D27_D28, ARM_Q14, ARM_D29_D30, 1101 ARM_Q15 1102 }; 1103 1104 static DecodeStatus DecodeDPairRegisterClass(MCInst *Inst, unsigned RegNo, 1105 uint64_t Address, const void *Decoder) 1106 { 1107 unsigned Register; 1108 if (RegNo > 30) 1109 return MCDisassembler_Fail; 1110 1111 Register = DPairDecoderTable[RegNo]; 1112 MCOperand_CreateReg0(Inst, Register); 1113 return MCDisassembler_Success; 1114 } 1115 1116 static const uint16_t DPairSpacedDecoderTable[] = { 1117 ARM_D0_D2, ARM_D1_D3, ARM_D2_D4, ARM_D3_D5, 1118 ARM_D4_D6, ARM_D5_D7, ARM_D6_D8, ARM_D7_D9, 1119 ARM_D8_D10, ARM_D9_D11, ARM_D10_D12, ARM_D11_D13, 1120 ARM_D12_D14, ARM_D13_D15, ARM_D14_D16, ARM_D15_D17, 1121 ARM_D16_D18, ARM_D17_D19, ARM_D18_D20, ARM_D19_D21, 1122 ARM_D20_D22, ARM_D21_D23, ARM_D22_D24, ARM_D23_D25, 1123 ARM_D24_D26, ARM_D25_D27, ARM_D26_D28, ARM_D27_D29, 1124 ARM_D28_D30, ARM_D29_D31 1125 }; 1126 1127 static DecodeStatus DecodeDPairSpacedRegisterClass(MCInst *Inst, 1128 unsigned RegNo, uint64_t Address, const void *Decoder) 1129 { 1130 unsigned Register; 1131 if (RegNo > 29) 1132 return MCDisassembler_Fail; 1133 1134 Register = DPairSpacedDecoderTable[RegNo]; 1135 MCOperand_CreateReg0(Inst, Register); 1136 return MCDisassembler_Success; 1137 } 1138 1139 static DecodeStatus DecodeCCOutOperand(MCInst *Inst, unsigned Val, 1140 uint64_t Address, const void *Decoder) 1141 { 1142 if (Val) 1143 MCOperand_CreateReg0(Inst, ARM_CPSR); 1144 else 1145 MCOperand_CreateReg0(Inst, 0); 1146 return MCDisassembler_Success; 1147 } 1148 1149 static DecodeStatus DecodeSOImmOperand(MCInst *Inst, unsigned Val, 1150 uint64_t Address, const void *Decoder) 1151 { 1152 uint32_t imm = Val & 0xFF; 1153 uint32_t rot = (Val & 0xF00) >> 7; 1154 uint32_t rot_imm = (imm >> rot) | (imm << ((32-rot) & 0x1F)); 1155 MCOperand_CreateImm0(Inst, rot_imm); 1156 return MCDisassembler_Success; 1157 } 1158 1159 static DecodeStatus DecodeSORegImmOperand(MCInst *Inst, unsigned Val, 1160 uint64_t Address, const void *Decoder) 1161 { 1162 DecodeStatus S = MCDisassembler_Success; 1163 ARM_AM_ShiftOpc Shift; 1164 unsigned Op; 1165 unsigned Rm = fieldFromInstruction_4(Val, 0, 4); 1166 unsigned type = fieldFromInstruction_4(Val, 5, 2); 1167 unsigned imm = fieldFromInstruction_4(Val, 7, 5); 1168 1169 // Register-immediate 1170 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder))) 1171 return MCDisassembler_Fail; 1172 1173 Shift = ARM_AM_lsl; 1174 switch (type) { 1175 case 0: 1176 Shift = ARM_AM_lsl; 1177 break; 1178 case 1: 1179 Shift = ARM_AM_lsr; 1180 break; 1181 case 2: 1182 Shift = ARM_AM_asr; 1183 break; 1184 case 3: 1185 Shift = ARM_AM_ror; 1186 break; 1187 } 1188 1189 if (Shift == ARM_AM_ror && imm == 0) 1190 Shift = ARM_AM_rrx; 1191 1192 Op = Shift | (imm << 3); 1193 MCOperand_CreateImm0(Inst, Op); 1194 1195 return S; 1196 } 1197 1198 static DecodeStatus DecodeSORegRegOperand(MCInst *Inst, unsigned Val, 1199 uint64_t Address, const void *Decoder) 1200 { 1201 DecodeStatus S = MCDisassembler_Success; 1202 ARM_AM_ShiftOpc Shift; 1203 1204 unsigned Rm = fieldFromInstruction_4(Val, 0, 4); 1205 unsigned type = fieldFromInstruction_4(Val, 5, 2); 1206 unsigned Rs = fieldFromInstruction_4(Val, 8, 4); 1207 1208 // Register-register 1209 if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rm, Address, Decoder))) 1210 return MCDisassembler_Fail; 1211 if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rs, Address, Decoder))) 1212 return MCDisassembler_Fail; 1213 1214 Shift = ARM_AM_lsl; 1215 switch (type) { 1216 case 0: 1217 Shift = ARM_AM_lsl; 1218 break; 1219 case 1: 1220 Shift = ARM_AM_lsr; 1221 break; 1222 case 2: 1223 Shift = ARM_AM_asr; 1224 break; 1225 case 3: 1226 Shift = ARM_AM_ror; 1227 break; 1228 } 1229 1230 MCOperand_CreateImm0(Inst, Shift); 1231 1232 return S; 1233 } 1234 1235 static DecodeStatus DecodeRegListOperand(MCInst *Inst, unsigned Val, 1236 uint64_t Address, const void *Decoder) 1237 { 1238 unsigned i; 1239 DecodeStatus S = MCDisassembler_Success; 1240 unsigned opcode; 1241 1242 bool NeedDisjointWriteback = false; 1243 unsigned WritebackReg = 0; 1244 1245 opcode = MCInst_getOpcode(Inst); 1246 switch (opcode) { 1247 default: 1248 break; 1249 case ARM_LDMIA_UPD: 1250 case ARM_LDMDB_UPD: 1251 case ARM_LDMIB_UPD: 1252 case ARM_LDMDA_UPD: 1253 case ARM_t2LDMIA_UPD: 1254 case ARM_t2LDMDB_UPD: 1255 case ARM_t2STMIA_UPD: 1256 case ARM_t2STMDB_UPD: 1257 NeedDisjointWriteback = true; 1258 WritebackReg = MCOperand_getReg(MCInst_getOperand(Inst, 0)); 1259 break; 1260 } 1261 1262 // Empty register lists are not allowed. 1263 if (Val == 0) return MCDisassembler_Fail; 1264 for (i = 0; i < 16; ++i) { 1265 if (Val & (1 << i)) { 1266 if (!Check(&S, DecodeGPRRegisterClass(Inst, i, Address, Decoder))) 1267 return MCDisassembler_Fail; 1268 // Writeback not allowed if Rn is in the target list. 1269 if (NeedDisjointWriteback && WritebackReg == MCOperand_getReg(&(Inst->Operands[Inst->size-1]))) 1270 Check(&S, MCDisassembler_SoftFail); 1271 } 1272 } 1273 1274 if (opcode == ARM_t2LDMIA_UPD && WritebackReg == ARM_SP) { 1275 if (Val & (1 << 13) || ((Val & (1 << 15)) && (Val & (1 << 14)))) { 1276 // invalid thumb2 pop 1277 // needs no sp in reglist and not both pc and lr set at the same time 1278 return MCDisassembler_Fail; 1279 } 1280 } 1281 1282 return S; 1283 } 1284 1285 static DecodeStatus DecodeSPRRegListOperand(MCInst *Inst, unsigned Val, 1286 uint64_t Address, const void *Decoder) 1287 { 1288 DecodeStatus S = MCDisassembler_Success; 1289 unsigned i; 1290 unsigned Vd = fieldFromInstruction_4(Val, 8, 5); 1291 unsigned regs = fieldFromInstruction_4(Val, 0, 8); 1292 1293 // In case of unpredictable encoding, tweak the operands. 1294 if (regs == 0 || (Vd + regs) > 32) { 1295 regs = Vd + regs > 32 ? 32 - Vd : regs; 1296 regs = (1u > regs? 1u : regs); 1297 S = MCDisassembler_SoftFail; 1298 } 1299 1300 if (!Check(&S, DecodeSPRRegisterClass(Inst, Vd, Address, Decoder))) 1301 return MCDisassembler_Fail; 1302 for (i = 0; i < (regs - 1); ++i) { 1303 if (!Check(&S, DecodeSPRRegisterClass(Inst, ++Vd, Address, Decoder))) 1304 return MCDisassembler_Fail; 1305 } 1306 1307 return S; 1308 } 1309 1310 static DecodeStatus DecodeDPRRegListOperand(MCInst *Inst, unsigned Val, 1311 uint64_t Address, const void *Decoder) 1312 { 1313 DecodeStatus S = MCDisassembler_Success; 1314 unsigned i; 1315 unsigned Vd = fieldFromInstruction_4(Val, 8, 5); 1316 unsigned regs = fieldFromInstruction_4(Val, 1, 7); 1317 1318 // In case of unpredictable encoding, tweak the operands. 1319 if (regs == 0 || regs > 16 || (Vd + regs) > 32) { 1320 regs = Vd + regs > 32 ? 32 - Vd : regs; 1321 regs = (1u > regs? 1u : regs); 1322 regs = (16u > regs? regs : 16u); 1323 S = MCDisassembler_SoftFail; 1324 } 1325 1326 if (!Check(&S, DecodeDPRRegisterClass(Inst, Vd, Address, Decoder))) 1327 return MCDisassembler_Fail; 1328 1329 for (i = 0; i < (regs - 1); ++i) { 1330 if (!Check(&S, DecodeDPRRegisterClass(Inst, ++Vd, Address, Decoder))) 1331 return MCDisassembler_Fail; 1332 } 1333 1334 return S; 1335 } 1336 1337 static DecodeStatus DecodeBitfieldMaskOperand(MCInst *Inst, unsigned Val, 1338 uint64_t Address, const void *Decoder) 1339 { 1340 // This operand encodes a mask of contiguous zeros between a specified MSB 1341 // and LSB. To decode it, we create the mask of all bits MSB-and-lower, 1342 // the mask of all bits LSB-and-lower, and then xor them to create 1343 // the mask of that's all ones on [msb, lsb]. Finally we not it to 1344 // create the final mask. 1345 unsigned msb = fieldFromInstruction_4(Val, 5, 5); 1346 unsigned lsb = fieldFromInstruction_4(Val, 0, 5); 1347 uint32_t lsb_mask, msb_mask; 1348 1349 DecodeStatus S = MCDisassembler_Success; 1350 if (lsb > msb) { 1351 Check(&S, MCDisassembler_SoftFail); 1352 // The check above will cause the warning for the "potentially undefined 1353 // instruction encoding" but we can't build a bad MCOperand value here 1354 // with a lsb > msb or else printing the MCInst will cause a crash. 1355 lsb = msb; 1356 } 1357 1358 msb_mask = 0xFFFFFFFF; 1359 if (msb != 31) msb_mask = (1U << (msb+1)) - 1; 1360 lsb_mask = (1U << lsb) - 1; 1361 1362 MCOperand_CreateImm0(Inst, ~(msb_mask ^ lsb_mask)); 1363 return S; 1364 } 1365 1366 static DecodeStatus DecodeCopMemInstruction(MCInst *Inst, unsigned Insn, 1367 uint64_t Address, const void *Decoder) 1368 { 1369 DecodeStatus S = MCDisassembler_Success; 1370 1371 unsigned pred = fieldFromInstruction_4(Insn, 28, 4); 1372 unsigned CRd = fieldFromInstruction_4(Insn, 12, 4); 1373 unsigned coproc = fieldFromInstruction_4(Insn, 8, 4); 1374 unsigned imm = fieldFromInstruction_4(Insn, 0, 8); 1375 unsigned Rn = fieldFromInstruction_4(Insn, 16, 4); 1376 unsigned U = fieldFromInstruction_4(Insn, 23, 1); 1377 1378 switch (MCInst_getOpcode(Inst)) { 1379 case ARM_LDC_OFFSET: 1380 case ARM_LDC_PRE: 1381 case ARM_LDC_POST: 1382 case ARM_LDC_OPTION: 1383 case ARM_LDCL_OFFSET: 1384 case ARM_LDCL_PRE: 1385 case ARM_LDCL_POST: 1386 case ARM_LDCL_OPTION: 1387 case ARM_STC_OFFSET: 1388 case ARM_STC_PRE: 1389 case ARM_STC_POST: 1390 case ARM_STC_OPTION: 1391 case ARM_STCL_OFFSET: 1392 case ARM_STCL_PRE: 1393 case ARM_STCL_POST: 1394 case ARM_STCL_OPTION: 1395 case ARM_t2LDC_OFFSET: 1396 case ARM_t2LDC_PRE: 1397 case ARM_t2LDC_POST: 1398 case ARM_t2LDC_OPTION: 1399 case ARM_t2LDCL_OFFSET: 1400 case ARM_t2LDCL_PRE: 1401 case ARM_t2LDCL_POST: 1402 case ARM_t2LDCL_OPTION: 1403 case ARM_t2STC_OFFSET: 1404 case ARM_t2STC_PRE: 1405 case ARM_t2STC_POST: 1406 case ARM_t2STC_OPTION: 1407 case ARM_t2STCL_OFFSET: 1408 case ARM_t2STCL_PRE: 1409 case ARM_t2STCL_POST: 1410 case ARM_t2STCL_OPTION: 1411 if (coproc == 0xA || coproc == 0xB) 1412 return MCDisassembler_Fail; 1413 break; 1414 default: 1415 break; 1416 } 1417 1418 MCOperand_CreateImm0(Inst, coproc); 1419 MCOperand_CreateImm0(Inst, CRd); 1420 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 1421 return MCDisassembler_Fail; 1422 1423 switch (MCInst_getOpcode(Inst)) { 1424 case ARM_t2LDC2_OFFSET: 1425 case ARM_t2LDC2L_OFFSET: 1426 case ARM_t2LDC2_PRE: 1427 case ARM_t2LDC2L_PRE: 1428 case ARM_t2STC2_OFFSET: 1429 case ARM_t2STC2L_OFFSET: 1430 case ARM_t2STC2_PRE: 1431 case ARM_t2STC2L_PRE: 1432 case ARM_LDC2_OFFSET: 1433 case ARM_LDC2L_OFFSET: 1434 case ARM_LDC2_PRE: 1435 case ARM_LDC2L_PRE: 1436 case ARM_STC2_OFFSET: 1437 case ARM_STC2L_OFFSET: 1438 case ARM_STC2_PRE: 1439 case ARM_STC2L_PRE: 1440 case ARM_t2LDC_OFFSET: 1441 case ARM_t2LDCL_OFFSET: 1442 case ARM_t2LDC_PRE: 1443 case ARM_t2LDCL_PRE: 1444 case ARM_t2STC_OFFSET: 1445 case ARM_t2STCL_OFFSET: 1446 case ARM_t2STC_PRE: 1447 case ARM_t2STCL_PRE: 1448 case ARM_LDC_OFFSET: 1449 case ARM_LDCL_OFFSET: 1450 case ARM_LDC_PRE: 1451 case ARM_LDCL_PRE: 1452 case ARM_STC_OFFSET: 1453 case ARM_STCL_OFFSET: 1454 case ARM_STC_PRE: 1455 case ARM_STCL_PRE: 1456 imm = ARM_AM_getAM5Opc(U ? ARM_AM_add : ARM_AM_sub, (unsigned char)imm); 1457 MCOperand_CreateImm0(Inst, imm); 1458 break; 1459 case ARM_t2LDC2_POST: 1460 case ARM_t2LDC2L_POST: 1461 case ARM_t2STC2_POST: 1462 case ARM_t2STC2L_POST: 1463 case ARM_LDC2_POST: 1464 case ARM_LDC2L_POST: 1465 case ARM_STC2_POST: 1466 case ARM_STC2L_POST: 1467 case ARM_t2LDC_POST: 1468 case ARM_t2LDCL_POST: 1469 case ARM_t2STC_POST: 1470 case ARM_t2STCL_POST: 1471 case ARM_LDC_POST: 1472 case ARM_LDCL_POST: 1473 case ARM_STC_POST: 1474 case ARM_STCL_POST: 1475 imm |= U << 8; 1476 // fall through. 1477 default: 1478 // The 'option' variant doesn't encode 'U' in the immediate since 1479 // the immediate is unsigned [0,255]. 1480 MCOperand_CreateImm0(Inst, imm); 1481 break; 1482 } 1483 1484 switch (MCInst_getOpcode(Inst)) { 1485 case ARM_LDC_OFFSET: 1486 case ARM_LDC_PRE: 1487 case ARM_LDC_POST: 1488 case ARM_LDC_OPTION: 1489 case ARM_LDCL_OFFSET: 1490 case ARM_LDCL_PRE: 1491 case ARM_LDCL_POST: 1492 case ARM_LDCL_OPTION: 1493 case ARM_STC_OFFSET: 1494 case ARM_STC_PRE: 1495 case ARM_STC_POST: 1496 case ARM_STC_OPTION: 1497 case ARM_STCL_OFFSET: 1498 case ARM_STCL_PRE: 1499 case ARM_STCL_POST: 1500 case ARM_STCL_OPTION: 1501 if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder))) 1502 return MCDisassembler_Fail; 1503 break; 1504 default: 1505 break; 1506 } 1507 1508 return S; 1509 } 1510 1511 static DecodeStatus DecodeAddrMode2IdxInstruction(MCInst *Inst, unsigned Insn, 1512 uint64_t Address, const void *Decoder) 1513 { 1514 DecodeStatus S = MCDisassembler_Success; 1515 ARM_AM_AddrOpc Op; 1516 ARM_AM_ShiftOpc Opc; 1517 bool writeback; 1518 unsigned Rn = fieldFromInstruction_4(Insn, 16, 4); 1519 unsigned Rt = fieldFromInstruction_4(Insn, 12, 4); 1520 unsigned Rm = fieldFromInstruction_4(Insn, 0, 4); 1521 unsigned imm = fieldFromInstruction_4(Insn, 0, 12); 1522 unsigned pred = fieldFromInstruction_4(Insn, 28, 4); 1523 unsigned reg = fieldFromInstruction_4(Insn, 25, 1); 1524 unsigned P = fieldFromInstruction_4(Insn, 24, 1); 1525 unsigned W = fieldFromInstruction_4(Insn, 21, 1); 1526 unsigned idx_mode = 0, amt, tmp; 1527 1528 // On stores, the writeback operand precedes Rt. 1529 switch (MCInst_getOpcode(Inst)) { 1530 case ARM_STR_POST_IMM: 1531 case ARM_STR_POST_REG: 1532 case ARM_STRB_POST_IMM: 1533 case ARM_STRB_POST_REG: 1534 case ARM_STRT_POST_REG: 1535 case ARM_STRT_POST_IMM: 1536 case ARM_STRBT_POST_REG: 1537 case ARM_STRBT_POST_IMM: 1538 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 1539 return MCDisassembler_Fail; 1540 break; 1541 default: 1542 break; 1543 } 1544 1545 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder))) 1546 return MCDisassembler_Fail; 1547 1548 // On loads, the writeback operand comes after Rt. 1549 switch (MCInst_getOpcode(Inst)) { 1550 case ARM_LDR_POST_IMM: 1551 case ARM_LDR_POST_REG: 1552 case ARM_LDRB_POST_IMM: 1553 case ARM_LDRB_POST_REG: 1554 case ARM_LDRBT_POST_REG: 1555 case ARM_LDRBT_POST_IMM: 1556 case ARM_LDRT_POST_REG: 1557 case ARM_LDRT_POST_IMM: 1558 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 1559 return MCDisassembler_Fail; 1560 break; 1561 default: 1562 break; 1563 } 1564 1565 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 1566 return MCDisassembler_Fail; 1567 1568 Op = ARM_AM_add; 1569 if (!fieldFromInstruction_4(Insn, 23, 1)) 1570 Op = ARM_AM_sub; 1571 1572 writeback = (P == 0) || (W == 1); 1573 if (P && writeback) 1574 idx_mode = ARMII_IndexModePre; 1575 else if (!P && writeback) 1576 idx_mode = ARMII_IndexModePost; 1577 1578 if (writeback && (Rn == 15 || Rn == Rt)) 1579 S = MCDisassembler_SoftFail; // UNPREDICTABLE 1580 1581 if (reg) { 1582 if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rm, Address, Decoder))) 1583 return MCDisassembler_Fail; 1584 Opc = ARM_AM_lsl; 1585 switch( fieldFromInstruction_4(Insn, 5, 2)) { 1586 case 0: 1587 Opc = ARM_AM_lsl; 1588 break; 1589 case 1: 1590 Opc = ARM_AM_lsr; 1591 break; 1592 case 2: 1593 Opc = ARM_AM_asr; 1594 break; 1595 case 3: 1596 Opc = ARM_AM_ror; 1597 break; 1598 default: 1599 return MCDisassembler_Fail; 1600 } 1601 amt = fieldFromInstruction_4(Insn, 7, 5); 1602 if (Opc == ARM_AM_ror && amt == 0) 1603 Opc = ARM_AM_rrx; 1604 imm = ARM_AM_getAM2Opc(Op, amt, Opc, idx_mode); 1605 1606 MCOperand_CreateImm0(Inst, imm); 1607 } else { 1608 MCOperand_CreateReg0(Inst, 0); 1609 tmp = ARM_AM_getAM2Opc(Op, imm, ARM_AM_lsl, idx_mode); 1610 MCOperand_CreateImm0(Inst, tmp); 1611 } 1612 1613 if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder))) 1614 return MCDisassembler_Fail; 1615 1616 return S; 1617 } 1618 1619 static DecodeStatus DecodeSORegMemOperand(MCInst *Inst, unsigned Val, 1620 uint64_t Address, const void *Decoder) 1621 { 1622 DecodeStatus S = MCDisassembler_Success; 1623 ARM_AM_ShiftOpc ShOp; 1624 unsigned shift; 1625 unsigned Rn = fieldFromInstruction_4(Val, 13, 4); 1626 unsigned Rm = fieldFromInstruction_4(Val, 0, 4); 1627 unsigned type = fieldFromInstruction_4(Val, 5, 2); 1628 unsigned imm = fieldFromInstruction_4(Val, 7, 5); 1629 unsigned U = fieldFromInstruction_4(Val, 12, 1); 1630 1631 ShOp = ARM_AM_lsl; 1632 switch (type) { 1633 case 0: 1634 ShOp = ARM_AM_lsl; 1635 break; 1636 case 1: 1637 ShOp = ARM_AM_lsr; 1638 break; 1639 case 2: 1640 ShOp = ARM_AM_asr; 1641 break; 1642 case 3: 1643 ShOp = ARM_AM_ror; 1644 break; 1645 } 1646 1647 if (ShOp == ARM_AM_ror && imm == 0) 1648 ShOp = ARM_AM_rrx; 1649 1650 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 1651 return MCDisassembler_Fail; 1652 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder))) 1653 return MCDisassembler_Fail; 1654 if (U) 1655 shift = ARM_AM_getAM2Opc(ARM_AM_add, imm, ShOp, 0); 1656 else 1657 shift = ARM_AM_getAM2Opc(ARM_AM_sub, imm, ShOp, 0); 1658 MCOperand_CreateImm0(Inst, shift); 1659 1660 return S; 1661 } 1662 1663 static DecodeStatus DecodeAddrMode3Instruction(MCInst *Inst, unsigned Insn, 1664 uint64_t Address, const void *Decoder) 1665 { 1666 DecodeStatus S = MCDisassembler_Success; 1667 1668 unsigned Rt = fieldFromInstruction_4(Insn, 12, 4); 1669 unsigned Rn = fieldFromInstruction_4(Insn, 16, 4); 1670 unsigned Rm = fieldFromInstruction_4(Insn, 0, 4); 1671 unsigned type = fieldFromInstruction_4(Insn, 22, 1); 1672 unsigned imm = fieldFromInstruction_4(Insn, 8, 4); 1673 unsigned U = ((~fieldFromInstruction_4(Insn, 23, 1)) & 1) << 8; 1674 unsigned pred = fieldFromInstruction_4(Insn, 28, 4); 1675 unsigned W = fieldFromInstruction_4(Insn, 21, 1); 1676 unsigned P = fieldFromInstruction_4(Insn, 24, 1); 1677 unsigned Rt2 = Rt + 1; 1678 1679 bool writeback = (W == 1) | (P == 0); 1680 1681 // For {LD,ST}RD, Rt must be even, else undefined. 1682 switch (MCInst_getOpcode(Inst)) { 1683 case ARM_STRD: 1684 case ARM_STRD_PRE: 1685 case ARM_STRD_POST: 1686 case ARM_LDRD: 1687 case ARM_LDRD_PRE: 1688 case ARM_LDRD_POST: 1689 if (Rt & 0x1) S = MCDisassembler_SoftFail; 1690 break; 1691 default: 1692 break; 1693 } 1694 switch (MCInst_getOpcode(Inst)) { 1695 case ARM_STRD: 1696 case ARM_STRD_PRE: 1697 case ARM_STRD_POST: 1698 if (P == 0 && W == 1) 1699 S = MCDisassembler_SoftFail; 1700 1701 if (writeback && (Rn == 15 || Rn == Rt || Rn == Rt2)) 1702 S = MCDisassembler_SoftFail; 1703 if (type && Rm == 15) 1704 S = MCDisassembler_SoftFail; 1705 if (Rt2 == 15) 1706 S = MCDisassembler_SoftFail; 1707 if (!type && fieldFromInstruction_4(Insn, 8, 4)) 1708 S = MCDisassembler_SoftFail; 1709 break; 1710 case ARM_STRH: 1711 case ARM_STRH_PRE: 1712 case ARM_STRH_POST: 1713 if (Rt == 15) 1714 S = MCDisassembler_SoftFail; 1715 if (writeback && (Rn == 15 || Rn == Rt)) 1716 S = MCDisassembler_SoftFail; 1717 if (!type && Rm == 15) 1718 S = MCDisassembler_SoftFail; 1719 break; 1720 case ARM_LDRD: 1721 case ARM_LDRD_PRE: 1722 case ARM_LDRD_POST: 1723 if (type && Rn == 15){ 1724 if (Rt2 == 15) 1725 S = MCDisassembler_SoftFail; 1726 break; 1727 } 1728 if (P == 0 && W == 1) 1729 S = MCDisassembler_SoftFail; 1730 if (!type && (Rt2 == 15 || Rm == 15 || Rm == Rt || Rm == Rt2)) 1731 S = MCDisassembler_SoftFail; 1732 if (!type && writeback && Rn == 15) 1733 S = MCDisassembler_SoftFail; 1734 if (writeback && (Rn == Rt || Rn == Rt2)) 1735 S = MCDisassembler_SoftFail; 1736 break; 1737 case ARM_LDRH: 1738 case ARM_LDRH_PRE: 1739 case ARM_LDRH_POST: 1740 if (type && Rn == 15){ 1741 if (Rt == 15) 1742 S = MCDisassembler_SoftFail; 1743 break; 1744 } 1745 if (Rt == 15) 1746 S = MCDisassembler_SoftFail; 1747 if (!type && Rm == 15) 1748 S = MCDisassembler_SoftFail; 1749 if (!type && writeback && (Rn == 15 || Rn == Rt)) 1750 S = MCDisassembler_SoftFail; 1751 break; 1752 case ARM_LDRSH: 1753 case ARM_LDRSH_PRE: 1754 case ARM_LDRSH_POST: 1755 case ARM_LDRSB: 1756 case ARM_LDRSB_PRE: 1757 case ARM_LDRSB_POST: 1758 if (type && Rn == 15){ 1759 if (Rt == 15) 1760 S = MCDisassembler_SoftFail; 1761 break; 1762 } 1763 if (type && (Rt == 15 || (writeback && Rn == Rt))) 1764 S = MCDisassembler_SoftFail; 1765 if (!type && (Rt == 15 || Rm == 15)) 1766 S = MCDisassembler_SoftFail; 1767 if (!type && writeback && (Rn == 15 || Rn == Rt)) 1768 S = MCDisassembler_SoftFail; 1769 break; 1770 default: 1771 break; 1772 } 1773 1774 if (writeback) { // Writeback 1775 Inst->writeback = true; 1776 if (P) 1777 U |= ARMII_IndexModePre << 9; 1778 else 1779 U |= ARMII_IndexModePost << 9; 1780 1781 // On stores, the writeback operand precedes Rt. 1782 switch (MCInst_getOpcode(Inst)) { 1783 case ARM_STRD: 1784 case ARM_STRD_PRE: 1785 case ARM_STRD_POST: 1786 case ARM_STRH: 1787 case ARM_STRH_PRE: 1788 case ARM_STRH_POST: 1789 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 1790 return MCDisassembler_Fail; 1791 break; 1792 default: 1793 break; 1794 } 1795 } 1796 1797 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder))) 1798 return MCDisassembler_Fail; 1799 switch (MCInst_getOpcode(Inst)) { 1800 case ARM_STRD: 1801 case ARM_STRD_PRE: 1802 case ARM_STRD_POST: 1803 case ARM_LDRD: 1804 case ARM_LDRD_PRE: 1805 case ARM_LDRD_POST: 1806 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt+1, Address, Decoder))) 1807 return MCDisassembler_Fail; 1808 break; 1809 default: 1810 break; 1811 } 1812 1813 if (writeback) { 1814 // On loads, the writeback operand comes after Rt. 1815 switch (MCInst_getOpcode(Inst)) { 1816 case ARM_LDRD: 1817 case ARM_LDRD_PRE: 1818 case ARM_LDRD_POST: 1819 case ARM_LDRH: 1820 case ARM_LDRH_PRE: 1821 case ARM_LDRH_POST: 1822 case ARM_LDRSH: 1823 case ARM_LDRSH_PRE: 1824 case ARM_LDRSH_POST: 1825 case ARM_LDRSB: 1826 case ARM_LDRSB_PRE: 1827 case ARM_LDRSB_POST: 1828 case ARM_LDRHTr: 1829 case ARM_LDRSBTr: 1830 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 1831 return MCDisassembler_Fail; 1832 break; 1833 default: 1834 break; 1835 } 1836 } 1837 1838 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 1839 return MCDisassembler_Fail; 1840 1841 if (type) { 1842 MCOperand_CreateReg0(Inst, 0); 1843 MCOperand_CreateImm0(Inst, U | (imm << 4) | Rm); 1844 } else { 1845 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder))) 1846 return MCDisassembler_Fail; 1847 MCOperand_CreateImm0(Inst, U); 1848 } 1849 1850 if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder))) 1851 return MCDisassembler_Fail; 1852 1853 return S; 1854 } 1855 1856 static DecodeStatus DecodeRFEInstruction(MCInst *Inst, unsigned Insn, 1857 uint64_t Address, const void *Decoder) 1858 { 1859 DecodeStatus S = MCDisassembler_Success; 1860 1861 unsigned Rn = fieldFromInstruction_4(Insn, 16, 4); 1862 unsigned mode = fieldFromInstruction_4(Insn, 23, 2); 1863 1864 switch (mode) { 1865 case 0: 1866 mode = ARM_AM_da; 1867 break; 1868 case 1: 1869 mode = ARM_AM_ia; 1870 break; 1871 case 2: 1872 mode = ARM_AM_db; 1873 break; 1874 case 3: 1875 mode = ARM_AM_ib; 1876 break; 1877 } 1878 1879 MCOperand_CreateImm0(Inst, mode); 1880 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 1881 return MCDisassembler_Fail; 1882 1883 return S; 1884 } 1885 1886 static DecodeStatus DecodeQADDInstruction(MCInst *Inst, unsigned Insn, 1887 uint64_t Address, const void *Decoder) 1888 { 1889 DecodeStatus S = MCDisassembler_Success; 1890 1891 unsigned Rd = fieldFromInstruction_4(Insn, 12, 4); 1892 unsigned Rm = fieldFromInstruction_4(Insn, 0, 4); 1893 unsigned Rn = fieldFromInstruction_4(Insn, 16, 4); 1894 unsigned pred = fieldFromInstruction_4(Insn, 28, 4); 1895 1896 if (pred == 0xF) 1897 return DecodeCPSInstruction(Inst, Insn, Address, Decoder); 1898 1899 if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rd, Address, Decoder))) 1900 return MCDisassembler_Fail; 1901 if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rm, Address, Decoder))) 1902 return MCDisassembler_Fail; 1903 if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rn, Address, Decoder))) 1904 return MCDisassembler_Fail; 1905 if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder))) 1906 return MCDisassembler_Fail; 1907 return S; 1908 } 1909 1910 static DecodeStatus DecodeMemMultipleWritebackInstruction(MCInst *Inst, 1911 unsigned Insn, uint64_t Address, const void *Decoder) 1912 { 1913 DecodeStatus S = MCDisassembler_Success; 1914 1915 unsigned Rn = fieldFromInstruction_4(Insn, 16, 4); 1916 unsigned pred = fieldFromInstruction_4(Insn, 28, 4); 1917 unsigned reglist = fieldFromInstruction_4(Insn, 0, 16); 1918 1919 if (pred == 0xF) { 1920 // Ambiguous with RFE and SRS 1921 switch (MCInst_getOpcode(Inst)) { 1922 case ARM_LDMDA: 1923 MCInst_setOpcode(Inst, ARM_RFEDA); 1924 break; 1925 case ARM_LDMDA_UPD: 1926 MCInst_setOpcode(Inst, ARM_RFEDA_UPD); 1927 break; 1928 case ARM_LDMDB: 1929 MCInst_setOpcode(Inst, ARM_RFEDB); 1930 break; 1931 case ARM_LDMDB_UPD: 1932 MCInst_setOpcode(Inst, ARM_RFEDB_UPD); 1933 break; 1934 case ARM_LDMIA: 1935 MCInst_setOpcode(Inst, ARM_RFEIA); 1936 break; 1937 case ARM_LDMIA_UPD: 1938 MCInst_setOpcode(Inst, ARM_RFEIA_UPD); 1939 break; 1940 case ARM_LDMIB: 1941 MCInst_setOpcode(Inst, ARM_RFEIB); 1942 break; 1943 case ARM_LDMIB_UPD: 1944 MCInst_setOpcode(Inst, ARM_RFEIB_UPD); 1945 break; 1946 case ARM_STMDA: 1947 MCInst_setOpcode(Inst, ARM_SRSDA); 1948 break; 1949 case ARM_STMDA_UPD: 1950 MCInst_setOpcode(Inst, ARM_SRSDA_UPD); 1951 break; 1952 case ARM_STMDB: 1953 MCInst_setOpcode(Inst, ARM_SRSDB); 1954 break; 1955 case ARM_STMDB_UPD: 1956 MCInst_setOpcode(Inst, ARM_SRSDB_UPD); 1957 break; 1958 case ARM_STMIA: 1959 MCInst_setOpcode(Inst, ARM_SRSIA); 1960 break; 1961 case ARM_STMIA_UPD: 1962 MCInst_setOpcode(Inst, ARM_SRSIA_UPD); 1963 break; 1964 case ARM_STMIB: 1965 MCInst_setOpcode(Inst, ARM_SRSIB); 1966 break; 1967 case ARM_STMIB_UPD: 1968 MCInst_setOpcode(Inst, ARM_SRSIB_UPD); 1969 break; 1970 default: 1971 return MCDisassembler_Fail; 1972 } 1973 1974 // For stores (which become SRS's, the only operand is the mode. 1975 if (fieldFromInstruction_4(Insn, 20, 1) == 0) { 1976 // Check SRS encoding constraints 1977 if (!(fieldFromInstruction_4(Insn, 22, 1) == 1 && 1978 fieldFromInstruction_4(Insn, 20, 1) == 0)) 1979 return MCDisassembler_Fail; 1980 1981 MCOperand_CreateImm0(Inst, fieldFromInstruction_4(Insn, 0, 4)); 1982 return S; 1983 } 1984 1985 return DecodeRFEInstruction(Inst, Insn, Address, Decoder); 1986 } 1987 1988 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 1989 return MCDisassembler_Fail; 1990 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 1991 return MCDisassembler_Fail; // Tied 1992 if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder))) 1993 return MCDisassembler_Fail; 1994 if (!Check(&S, DecodeRegListOperand(Inst, reglist, Address, Decoder))) 1995 return MCDisassembler_Fail; 1996 1997 return S; 1998 } 1999 2000 static DecodeStatus DecodeCPSInstruction(MCInst *Inst, unsigned Insn, 2001 uint64_t Address, const void *Decoder) 2002 { 2003 unsigned imod = fieldFromInstruction_4(Insn, 18, 2); 2004 unsigned M = fieldFromInstruction_4(Insn, 17, 1); 2005 unsigned iflags = fieldFromInstruction_4(Insn, 6, 3); 2006 unsigned mode = fieldFromInstruction_4(Insn, 0, 5); 2007 2008 DecodeStatus S = MCDisassembler_Success; 2009 2010 // This decoder is called from multiple location that do not check 2011 // the full encoding is valid before they do. 2012 if (fieldFromInstruction_4(Insn, 5, 1) != 0 || 2013 fieldFromInstruction_4(Insn, 16, 1) != 0 || 2014 fieldFromInstruction_4(Insn, 20, 8) != 0x10) 2015 return MCDisassembler_Fail; 2016 2017 // imod == '01' --> UNPREDICTABLE 2018 // NOTE: Even though this is technically UNPREDICTABLE, we choose to 2019 // return failure here. The '01' imod value is unprintable, so there's 2020 // nothing useful we could do even if we returned UNPREDICTABLE. 2021 2022 if (imod == 1) return MCDisassembler_Fail; 2023 2024 if (imod && M) { 2025 MCInst_setOpcode(Inst, ARM_CPS3p); 2026 MCOperand_CreateImm0(Inst, imod); 2027 MCOperand_CreateImm0(Inst, iflags); 2028 MCOperand_CreateImm0(Inst, mode); 2029 } else if (imod && !M) { 2030 MCInst_setOpcode(Inst, ARM_CPS2p); 2031 MCOperand_CreateImm0(Inst, imod); 2032 MCOperand_CreateImm0(Inst, iflags); 2033 if (mode) S = MCDisassembler_SoftFail; 2034 } else if (!imod && M) { 2035 MCInst_setOpcode(Inst, ARM_CPS1p); 2036 MCOperand_CreateImm0(Inst, mode); 2037 if (iflags) S = MCDisassembler_SoftFail; 2038 } else { 2039 // imod == '00' && M == '0' --> UNPREDICTABLE 2040 MCInst_setOpcode(Inst, ARM_CPS1p); 2041 MCOperand_CreateImm0(Inst, mode); 2042 S = MCDisassembler_SoftFail; 2043 } 2044 2045 return S; 2046 } 2047 2048 static DecodeStatus DecodeT2CPSInstruction(MCInst *Inst, unsigned Insn, 2049 uint64_t Address, const void *Decoder) 2050 { 2051 unsigned imod = fieldFromInstruction_4(Insn, 9, 2); 2052 unsigned M = fieldFromInstruction_4(Insn, 8, 1); 2053 unsigned iflags = fieldFromInstruction_4(Insn, 5, 3); 2054 unsigned mode = fieldFromInstruction_4(Insn, 0, 5); 2055 2056 DecodeStatus S = MCDisassembler_Success; 2057 2058 // imod == '01' --> UNPREDICTABLE 2059 // NOTE: Even though this is technically UNPREDICTABLE, we choose to 2060 // return failure here. The '01' imod value is unprintable, so there's 2061 // nothing useful we could do even if we returned UNPREDICTABLE. 2062 2063 if (imod == 1) return MCDisassembler_Fail; 2064 2065 if (imod && M) { 2066 MCInst_setOpcode(Inst, ARM_t2CPS3p); 2067 MCOperand_CreateImm0(Inst, imod); 2068 MCOperand_CreateImm0(Inst, iflags); 2069 MCOperand_CreateImm0(Inst, mode); 2070 } else if (imod && !M) { 2071 MCInst_setOpcode(Inst, ARM_t2CPS2p); 2072 MCOperand_CreateImm0(Inst, imod); 2073 MCOperand_CreateImm0(Inst, iflags); 2074 if (mode) S = MCDisassembler_SoftFail; 2075 } else if (!imod && M) { 2076 MCInst_setOpcode(Inst, ARM_t2CPS1p); 2077 MCOperand_CreateImm0(Inst, mode); 2078 if (iflags) S = MCDisassembler_SoftFail; 2079 } else { 2080 // imod == '00' && M == '0' --> this is a HINT instruction 2081 int imm = fieldFromInstruction_4(Insn, 0, 8); 2082 // HINT are defined only for immediate in [0..4] 2083 if(imm > 4) return MCDisassembler_Fail; 2084 MCInst_setOpcode(Inst, ARM_t2HINT); 2085 MCOperand_CreateImm0(Inst, imm); 2086 } 2087 2088 return S; 2089 } 2090 2091 static DecodeStatus DecodeT2MOVTWInstruction(MCInst *Inst, unsigned Insn, 2092 uint64_t Address, const void *Decoder) 2093 { 2094 DecodeStatus S = MCDisassembler_Success; 2095 2096 unsigned Rd = fieldFromInstruction_4(Insn, 8, 4); 2097 unsigned imm = 0; 2098 2099 imm |= (fieldFromInstruction_4(Insn, 0, 8) << 0); 2100 imm |= (fieldFromInstruction_4(Insn, 12, 3) << 8); 2101 imm |= (fieldFromInstruction_4(Insn, 16, 4) << 12); 2102 imm |= (fieldFromInstruction_4(Insn, 26, 1) << 11); 2103 2104 if (MCInst_getOpcode(Inst) == ARM_t2MOVTi16) 2105 if (!Check(&S, DecoderGPRRegisterClass(Inst, Rd, Address, Decoder))) 2106 return MCDisassembler_Fail; 2107 if (!Check(&S, DecoderGPRRegisterClass(Inst, Rd, Address, Decoder))) 2108 return MCDisassembler_Fail; 2109 2110 MCOperand_CreateImm0(Inst, imm); 2111 2112 return S; 2113 } 2114 2115 static DecodeStatus DecodeArmMOVTWInstruction(MCInst *Inst, unsigned Insn, 2116 uint64_t Address, const void *Decoder) 2117 { 2118 DecodeStatus S = MCDisassembler_Success; 2119 2120 unsigned Rd = fieldFromInstruction_4(Insn, 12, 4); 2121 unsigned pred = fieldFromInstruction_4(Insn, 28, 4); 2122 unsigned imm = 0; 2123 2124 imm |= (fieldFromInstruction_4(Insn, 0, 12) << 0); 2125 imm |= (fieldFromInstruction_4(Insn, 16, 4) << 12); 2126 2127 if (MCInst_getOpcode(Inst) == ARM_MOVTi16) 2128 if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rd, Address, Decoder))) 2129 return MCDisassembler_Fail; 2130 2131 if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rd, Address, Decoder))) 2132 return MCDisassembler_Fail; 2133 2134 MCOperand_CreateImm0(Inst, imm); 2135 2136 if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder))) 2137 return MCDisassembler_Fail; 2138 2139 return S; 2140 } 2141 2142 static DecodeStatus DecodeSMLAInstruction(MCInst *Inst, unsigned Insn, 2143 uint64_t Address, const void *Decoder) 2144 { 2145 DecodeStatus S = MCDisassembler_Success; 2146 2147 unsigned Rd = fieldFromInstruction_4(Insn, 16, 4); 2148 unsigned Rn = fieldFromInstruction_4(Insn, 0, 4); 2149 unsigned Rm = fieldFromInstruction_4(Insn, 8, 4); 2150 unsigned Ra = fieldFromInstruction_4(Insn, 12, 4); 2151 unsigned pred = fieldFromInstruction_4(Insn, 28, 4); 2152 2153 if (pred == 0xF) 2154 return DecodeCPSInstruction(Inst, Insn, Address, Decoder); 2155 2156 if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rd, Address, Decoder))) 2157 return MCDisassembler_Fail; 2158 if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rn, Address, Decoder))) 2159 return MCDisassembler_Fail; 2160 if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rm, Address, Decoder))) 2161 return MCDisassembler_Fail; 2162 if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Ra, Address, Decoder))) 2163 return MCDisassembler_Fail; 2164 2165 if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder))) 2166 return MCDisassembler_Fail; 2167 2168 return S; 2169 } 2170 2171 static DecodeStatus DecodeAddrModeImm12Operand(MCInst *Inst, unsigned Val, 2172 uint64_t Address, const void *Decoder) 2173 { 2174 DecodeStatus S = MCDisassembler_Success; 2175 2176 unsigned add = fieldFromInstruction_4(Val, 12, 1); 2177 unsigned imm = fieldFromInstruction_4(Val, 0, 12); 2178 unsigned Rn = fieldFromInstruction_4(Val, 13, 4); 2179 2180 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 2181 return MCDisassembler_Fail; 2182 2183 if (!add) imm *= (unsigned int)-1; 2184 if (imm == 0 && !add) imm = (unsigned int)INT32_MIN; 2185 MCOperand_CreateImm0(Inst, imm); 2186 //if (Rn == 15) 2187 // tryAddingPcLoadReferenceComment(Address, Address + imm + 8, Decoder); 2188 2189 return S; 2190 } 2191 2192 static DecodeStatus DecodeAddrMode5Operand(MCInst *Inst, unsigned Val, 2193 uint64_t Address, const void *Decoder) 2194 { 2195 DecodeStatus S = MCDisassembler_Success; 2196 2197 unsigned Rn = fieldFromInstruction_4(Val, 9, 4); 2198 unsigned U = fieldFromInstruction_4(Val, 8, 1); 2199 unsigned imm = fieldFromInstruction_4(Val, 0, 8); 2200 2201 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 2202 return MCDisassembler_Fail; 2203 2204 if (U) 2205 MCOperand_CreateImm0(Inst, ARM_AM_getAM5Opc(ARM_AM_add, (unsigned char)imm)); 2206 else 2207 MCOperand_CreateImm0(Inst, ARM_AM_getAM5Opc(ARM_AM_sub, (unsigned char)imm)); 2208 2209 return S; 2210 } 2211 2212 static DecodeStatus DecodeAddrMode7Operand(MCInst *Inst, unsigned Val, 2213 uint64_t Address, const void *Decoder) 2214 { 2215 return DecodeGPRRegisterClass(Inst, Val, Address, Decoder); 2216 } 2217 2218 static DecodeStatus DecodeT2BInstruction(MCInst *Inst, unsigned Insn, 2219 uint64_t Address, const void *Decoder) 2220 { 2221 DecodeStatus Status = MCDisassembler_Success; 2222 2223 // Note the J1 and J2 values are from the encoded instruction. So here 2224 // change them to I1 and I2 values via as documented: 2225 // I1 = NOT(J1 EOR S); 2226 // I2 = NOT(J2 EOR S); 2227 // and build the imm32 with one trailing zero as documented: 2228 // imm32 = SignExtend(S:I1:I2:imm10:imm11:'0', 32); 2229 unsigned S = fieldFromInstruction_4(Insn, 26, 1); 2230 unsigned J1 = fieldFromInstruction_4(Insn, 13, 1); 2231 unsigned J2 = fieldFromInstruction_4(Insn, 11, 1); 2232 unsigned I1 = !(J1 ^ S); 2233 unsigned I2 = !(J2 ^ S); 2234 unsigned imm10 = fieldFromInstruction_4(Insn, 16, 10); 2235 unsigned imm11 = fieldFromInstruction_4(Insn, 0, 11); 2236 unsigned tmp = (S << 23) | (I1 << 22) | (I2 << 21) | (imm10 << 11) | imm11; 2237 int imm32 = SignExtend32(tmp << 1, 25); 2238 MCOperand_CreateImm0(Inst, imm32); 2239 2240 return Status; 2241 } 2242 2243 static DecodeStatus DecodeBranchImmInstruction(MCInst *Inst, unsigned Insn, 2244 uint64_t Address, const void *Decoder) 2245 { 2246 DecodeStatus S = MCDisassembler_Success; 2247 2248 unsigned pred = fieldFromInstruction_4(Insn, 28, 4); 2249 unsigned imm = fieldFromInstruction_4(Insn, 0, 24) << 2; 2250 2251 if (pred == 0xF) { 2252 MCInst_setOpcode(Inst, ARM_BLXi); 2253 imm |= fieldFromInstruction_4(Insn, 24, 1) << 1; 2254 MCOperand_CreateImm0(Inst, SignExtend32(imm, 26)); 2255 return S; 2256 } 2257 2258 MCOperand_CreateImm0(Inst, SignExtend32(imm, 26)); 2259 if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder))) 2260 return MCDisassembler_Fail; 2261 2262 return S; 2263 } 2264 2265 2266 static DecodeStatus DecodeAddrMode6Operand(MCInst *Inst, unsigned Val, 2267 uint64_t Address, const void *Decoder) 2268 { 2269 DecodeStatus S = MCDisassembler_Success; 2270 2271 unsigned Rm = fieldFromInstruction_4(Val, 0, 4); 2272 unsigned align = fieldFromInstruction_4(Val, 4, 2); 2273 2274 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder))) 2275 return MCDisassembler_Fail; 2276 if (!align) 2277 MCOperand_CreateImm0(Inst, 0); 2278 else 2279 MCOperand_CreateImm0(Inst, 4 << align); 2280 2281 return S; 2282 } 2283 2284 static DecodeStatus DecodeVLDInstruction(MCInst *Inst, unsigned Insn, 2285 uint64_t Address, const void *Decoder) 2286 { 2287 DecodeStatus S = MCDisassembler_Success; 2288 unsigned wb, Rn, Rm; 2289 unsigned Rd = fieldFromInstruction_4(Insn, 12, 4); 2290 Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4; 2291 wb = fieldFromInstruction_4(Insn, 16, 4); 2292 Rn = fieldFromInstruction_4(Insn, 16, 4); 2293 Rn |= fieldFromInstruction_4(Insn, 4, 2) << 4; 2294 Rm = fieldFromInstruction_4(Insn, 0, 4); 2295 2296 // First output register 2297 switch (MCInst_getOpcode(Inst)) { 2298 case ARM_VLD1q16: case ARM_VLD1q32: case ARM_VLD1q64: case ARM_VLD1q8: 2299 case ARM_VLD1q16wb_fixed: case ARM_VLD1q16wb_register: 2300 case ARM_VLD1q32wb_fixed: case ARM_VLD1q32wb_register: 2301 case ARM_VLD1q64wb_fixed: case ARM_VLD1q64wb_register: 2302 case ARM_VLD1q8wb_fixed: case ARM_VLD1q8wb_register: 2303 case ARM_VLD2d16: case ARM_VLD2d32: case ARM_VLD2d8: 2304 case ARM_VLD2d16wb_fixed: case ARM_VLD2d16wb_register: 2305 case ARM_VLD2d32wb_fixed: case ARM_VLD2d32wb_register: 2306 case ARM_VLD2d8wb_fixed: case ARM_VLD2d8wb_register: 2307 if (!Check(&S, DecodeDPairRegisterClass(Inst, Rd, Address, Decoder))) 2308 return MCDisassembler_Fail; 2309 break; 2310 case ARM_VLD2b16: 2311 case ARM_VLD2b32: 2312 case ARM_VLD2b8: 2313 case ARM_VLD2b16wb_fixed: 2314 case ARM_VLD2b16wb_register: 2315 case ARM_VLD2b32wb_fixed: 2316 case ARM_VLD2b32wb_register: 2317 case ARM_VLD2b8wb_fixed: 2318 case ARM_VLD2b8wb_register: 2319 if (!Check(&S, DecodeDPairSpacedRegisterClass(Inst, Rd, Address, Decoder))) 2320 return MCDisassembler_Fail; 2321 break; 2322 default: 2323 if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder))) 2324 return MCDisassembler_Fail; 2325 } 2326 2327 // Second output register 2328 switch (MCInst_getOpcode(Inst)) { 2329 case ARM_VLD3d8: 2330 case ARM_VLD3d16: 2331 case ARM_VLD3d32: 2332 case ARM_VLD3d8_UPD: 2333 case ARM_VLD3d16_UPD: 2334 case ARM_VLD3d32_UPD: 2335 case ARM_VLD4d8: 2336 case ARM_VLD4d16: 2337 case ARM_VLD4d32: 2338 case ARM_VLD4d8_UPD: 2339 case ARM_VLD4d16_UPD: 2340 case ARM_VLD4d32_UPD: 2341 if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd+1)%32, Address, Decoder))) 2342 return MCDisassembler_Fail; 2343 break; 2344 case ARM_VLD3q8: 2345 case ARM_VLD3q16: 2346 case ARM_VLD3q32: 2347 case ARM_VLD3q8_UPD: 2348 case ARM_VLD3q16_UPD: 2349 case ARM_VLD3q32_UPD: 2350 case ARM_VLD4q8: 2351 case ARM_VLD4q16: 2352 case ARM_VLD4q32: 2353 case ARM_VLD4q8_UPD: 2354 case ARM_VLD4q16_UPD: 2355 case ARM_VLD4q32_UPD: 2356 if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd+2)%32, Address, Decoder))) 2357 return MCDisassembler_Fail; 2358 default: 2359 break; 2360 } 2361 2362 // Third output register 2363 switch(MCInst_getOpcode(Inst)) { 2364 case ARM_VLD3d8: 2365 case ARM_VLD3d16: 2366 case ARM_VLD3d32: 2367 case ARM_VLD3d8_UPD: 2368 case ARM_VLD3d16_UPD: 2369 case ARM_VLD3d32_UPD: 2370 case ARM_VLD4d8: 2371 case ARM_VLD4d16: 2372 case ARM_VLD4d32: 2373 case ARM_VLD4d8_UPD: 2374 case ARM_VLD4d16_UPD: 2375 case ARM_VLD4d32_UPD: 2376 if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd+2)%32, Address, Decoder))) 2377 return MCDisassembler_Fail; 2378 break; 2379 case ARM_VLD3q8: 2380 case ARM_VLD3q16: 2381 case ARM_VLD3q32: 2382 case ARM_VLD3q8_UPD: 2383 case ARM_VLD3q16_UPD: 2384 case ARM_VLD3q32_UPD: 2385 case ARM_VLD4q8: 2386 case ARM_VLD4q16: 2387 case ARM_VLD4q32: 2388 case ARM_VLD4q8_UPD: 2389 case ARM_VLD4q16_UPD: 2390 case ARM_VLD4q32_UPD: 2391 if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd+4)%32, Address, Decoder))) 2392 return MCDisassembler_Fail; 2393 break; 2394 default: 2395 break; 2396 } 2397 2398 // Fourth output register 2399 switch (MCInst_getOpcode(Inst)) { 2400 case ARM_VLD4d8: 2401 case ARM_VLD4d16: 2402 case ARM_VLD4d32: 2403 case ARM_VLD4d8_UPD: 2404 case ARM_VLD4d16_UPD: 2405 case ARM_VLD4d32_UPD: 2406 if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd+3)%32, Address, Decoder))) 2407 return MCDisassembler_Fail; 2408 break; 2409 case ARM_VLD4q8: 2410 case ARM_VLD4q16: 2411 case ARM_VLD4q32: 2412 case ARM_VLD4q8_UPD: 2413 case ARM_VLD4q16_UPD: 2414 case ARM_VLD4q32_UPD: 2415 if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd+6)%32, Address, Decoder))) 2416 return MCDisassembler_Fail; 2417 break; 2418 default: 2419 break; 2420 } 2421 2422 // Writeback operand 2423 switch (MCInst_getOpcode(Inst)) { 2424 case ARM_VLD1d8wb_fixed: 2425 case ARM_VLD1d16wb_fixed: 2426 case ARM_VLD1d32wb_fixed: 2427 case ARM_VLD1d64wb_fixed: 2428 case ARM_VLD1d8wb_register: 2429 case ARM_VLD1d16wb_register: 2430 case ARM_VLD1d32wb_register: 2431 case ARM_VLD1d64wb_register: 2432 case ARM_VLD1q8wb_fixed: 2433 case ARM_VLD1q16wb_fixed: 2434 case ARM_VLD1q32wb_fixed: 2435 case ARM_VLD1q64wb_fixed: 2436 case ARM_VLD1q8wb_register: 2437 case ARM_VLD1q16wb_register: 2438 case ARM_VLD1q32wb_register: 2439 case ARM_VLD1q64wb_register: 2440 case ARM_VLD1d8Twb_fixed: 2441 case ARM_VLD1d8Twb_register: 2442 case ARM_VLD1d16Twb_fixed: 2443 case ARM_VLD1d16Twb_register: 2444 case ARM_VLD1d32Twb_fixed: 2445 case ARM_VLD1d32Twb_register: 2446 case ARM_VLD1d64Twb_fixed: 2447 case ARM_VLD1d64Twb_register: 2448 case ARM_VLD1d8Qwb_fixed: 2449 case ARM_VLD1d8Qwb_register: 2450 case ARM_VLD1d16Qwb_fixed: 2451 case ARM_VLD1d16Qwb_register: 2452 case ARM_VLD1d32Qwb_fixed: 2453 case ARM_VLD1d32Qwb_register: 2454 case ARM_VLD1d64Qwb_fixed: 2455 case ARM_VLD1d64Qwb_register: 2456 case ARM_VLD2d8wb_fixed: 2457 case ARM_VLD2d16wb_fixed: 2458 case ARM_VLD2d32wb_fixed: 2459 case ARM_VLD2q8wb_fixed: 2460 case ARM_VLD2q16wb_fixed: 2461 case ARM_VLD2q32wb_fixed: 2462 case ARM_VLD2d8wb_register: 2463 case ARM_VLD2d16wb_register: 2464 case ARM_VLD2d32wb_register: 2465 case ARM_VLD2q8wb_register: 2466 case ARM_VLD2q16wb_register: 2467 case ARM_VLD2q32wb_register: 2468 case ARM_VLD2b8wb_fixed: 2469 case ARM_VLD2b16wb_fixed: 2470 case ARM_VLD2b32wb_fixed: 2471 case ARM_VLD2b8wb_register: 2472 case ARM_VLD2b16wb_register: 2473 case ARM_VLD2b32wb_register: 2474 MCOperand_CreateImm0(Inst, 0); 2475 break; 2476 case ARM_VLD3d8_UPD: 2477 case ARM_VLD3d16_UPD: 2478 case ARM_VLD3d32_UPD: 2479 case ARM_VLD3q8_UPD: 2480 case ARM_VLD3q16_UPD: 2481 case ARM_VLD3q32_UPD: 2482 case ARM_VLD4d8_UPD: 2483 case ARM_VLD4d16_UPD: 2484 case ARM_VLD4d32_UPD: 2485 case ARM_VLD4q8_UPD: 2486 case ARM_VLD4q16_UPD: 2487 case ARM_VLD4q32_UPD: 2488 if (!Check(&S, DecodeGPRRegisterClass(Inst, wb, Address, Decoder))) 2489 return MCDisassembler_Fail; 2490 break; 2491 default: 2492 break; 2493 } 2494 2495 // AddrMode6 Base (register+alignment) 2496 if (!Check(&S, DecodeAddrMode6Operand(Inst, Rn, Address, Decoder))) 2497 return MCDisassembler_Fail; 2498 2499 // AddrMode6 Offset (register) 2500 switch (MCInst_getOpcode(Inst)) { 2501 default: 2502 // The below have been updated to have explicit am6offset split 2503 // between fixed and register offset. For those instructions not 2504 // yet updated, we need to add an additional reg0 operand for the 2505 // fixed variant. 2506 // 2507 // The fixed offset encodes as Rm == 0xd, so we check for that. 2508 if (Rm == 0xd) { 2509 MCOperand_CreateReg0(Inst, 0); 2510 break; 2511 } 2512 // Fall through to handle the register offset variant. 2513 case ARM_VLD1d8wb_fixed: 2514 case ARM_VLD1d16wb_fixed: 2515 case ARM_VLD1d32wb_fixed: 2516 case ARM_VLD1d64wb_fixed: 2517 case ARM_VLD1d8Twb_fixed: 2518 case ARM_VLD1d16Twb_fixed: 2519 case ARM_VLD1d32Twb_fixed: 2520 case ARM_VLD1d64Twb_fixed: 2521 case ARM_VLD1d8Qwb_fixed: 2522 case ARM_VLD1d16Qwb_fixed: 2523 case ARM_VLD1d32Qwb_fixed: 2524 case ARM_VLD1d64Qwb_fixed: 2525 case ARM_VLD1d8wb_register: 2526 case ARM_VLD1d16wb_register: 2527 case ARM_VLD1d32wb_register: 2528 case ARM_VLD1d64wb_register: 2529 case ARM_VLD1q8wb_fixed: 2530 case ARM_VLD1q16wb_fixed: 2531 case ARM_VLD1q32wb_fixed: 2532 case ARM_VLD1q64wb_fixed: 2533 case ARM_VLD1q8wb_register: 2534 case ARM_VLD1q16wb_register: 2535 case ARM_VLD1q32wb_register: 2536 case ARM_VLD1q64wb_register: 2537 // The fixed offset post-increment encodes Rm == 0xd. The no-writeback 2538 // variant encodes Rm == 0xf. Anything else is a register offset post- 2539 // increment and we need to add the register operand to the instruction. 2540 if (Rm != 0xD && Rm != 0xF && 2541 !Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder))) 2542 return MCDisassembler_Fail; 2543 break; 2544 case ARM_VLD2d8wb_fixed: 2545 case ARM_VLD2d16wb_fixed: 2546 case ARM_VLD2d32wb_fixed: 2547 case ARM_VLD2b8wb_fixed: 2548 case ARM_VLD2b16wb_fixed: 2549 case ARM_VLD2b32wb_fixed: 2550 case ARM_VLD2q8wb_fixed: 2551 case ARM_VLD2q16wb_fixed: 2552 case ARM_VLD2q32wb_fixed: 2553 break; 2554 } 2555 2556 return S; 2557 } 2558 2559 static DecodeStatus DecodeVLDST1Instruction(MCInst *Inst, unsigned Insn, 2560 uint64_t Address, const void *Decoder) 2561 { 2562 unsigned load; 2563 unsigned type = fieldFromInstruction_4(Insn, 8, 4); 2564 unsigned align = fieldFromInstruction_4(Insn, 4, 2); 2565 if (type == 6 && (align & 2)) return MCDisassembler_Fail; 2566 if (type == 7 && (align & 2)) return MCDisassembler_Fail; 2567 if (type == 10 && align == 3) return MCDisassembler_Fail; 2568 2569 load = fieldFromInstruction_4(Insn, 21, 1); 2570 return load ? DecodeVLDInstruction(Inst, Insn, Address, Decoder) 2571 : DecodeVSTInstruction(Inst, Insn, Address, Decoder); 2572 } 2573 2574 static DecodeStatus DecodeVLDST2Instruction(MCInst *Inst, unsigned Insn, 2575 uint64_t Address, const void *Decoder) 2576 { 2577 unsigned type, align, load; 2578 unsigned size = fieldFromInstruction_4(Insn, 6, 2); 2579 if (size == 3) return MCDisassembler_Fail; 2580 2581 type = fieldFromInstruction_4(Insn, 8, 4); 2582 align = fieldFromInstruction_4(Insn, 4, 2); 2583 if (type == 8 && align == 3) return MCDisassembler_Fail; 2584 if (type == 9 && align == 3) return MCDisassembler_Fail; 2585 2586 load = fieldFromInstruction_4(Insn, 21, 1); 2587 return load ? DecodeVLDInstruction(Inst, Insn, Address, Decoder) 2588 : DecodeVSTInstruction(Inst, Insn, Address, Decoder); 2589 } 2590 2591 static DecodeStatus DecodeVLDST3Instruction(MCInst *Inst, unsigned Insn, 2592 uint64_t Address, const void *Decoder) 2593 { 2594 unsigned align, load; 2595 unsigned size = fieldFromInstruction_4(Insn, 6, 2); 2596 if (size == 3) return MCDisassembler_Fail; 2597 2598 align = fieldFromInstruction_4(Insn, 4, 2); 2599 if (align & 2) return MCDisassembler_Fail; 2600 2601 load = fieldFromInstruction_4(Insn, 21, 1); 2602 return load ? DecodeVLDInstruction(Inst, Insn, Address, Decoder) 2603 : DecodeVSTInstruction(Inst, Insn, Address, Decoder); 2604 } 2605 2606 static DecodeStatus DecodeVLDST4Instruction(MCInst *Inst, unsigned Insn, 2607 uint64_t Address, const void *Decoder) 2608 { 2609 unsigned load; 2610 unsigned size = fieldFromInstruction_4(Insn, 6, 2); 2611 if (size == 3) return MCDisassembler_Fail; 2612 2613 load = fieldFromInstruction_4(Insn, 21, 1); 2614 return load ? DecodeVLDInstruction(Inst, Insn, Address, Decoder) 2615 : DecodeVSTInstruction(Inst, Insn, Address, Decoder); 2616 } 2617 2618 static DecodeStatus DecodeVSTInstruction(MCInst *Inst, unsigned Insn, 2619 uint64_t Address, const void *Decoder) 2620 { 2621 DecodeStatus S = MCDisassembler_Success; 2622 unsigned wb, Rn, Rm; 2623 unsigned Rd = fieldFromInstruction_4(Insn, 12, 4); 2624 Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4; 2625 wb = fieldFromInstruction_4(Insn, 16, 4); 2626 Rn = fieldFromInstruction_4(Insn, 16, 4); 2627 Rn |= fieldFromInstruction_4(Insn, 4, 2) << 4; 2628 Rm = fieldFromInstruction_4(Insn, 0, 4); 2629 2630 // Writeback Operand 2631 switch (MCInst_getOpcode(Inst)) { 2632 case ARM_VST1d8wb_fixed: 2633 case ARM_VST1d16wb_fixed: 2634 case ARM_VST1d32wb_fixed: 2635 case ARM_VST1d64wb_fixed: 2636 case ARM_VST1d8wb_register: 2637 case ARM_VST1d16wb_register: 2638 case ARM_VST1d32wb_register: 2639 case ARM_VST1d64wb_register: 2640 case ARM_VST1q8wb_fixed: 2641 case ARM_VST1q16wb_fixed: 2642 case ARM_VST1q32wb_fixed: 2643 case ARM_VST1q64wb_fixed: 2644 case ARM_VST1q8wb_register: 2645 case ARM_VST1q16wb_register: 2646 case ARM_VST1q32wb_register: 2647 case ARM_VST1q64wb_register: 2648 case ARM_VST1d8Twb_fixed: 2649 case ARM_VST1d16Twb_fixed: 2650 case ARM_VST1d32Twb_fixed: 2651 case ARM_VST1d64Twb_fixed: 2652 case ARM_VST1d8Twb_register: 2653 case ARM_VST1d16Twb_register: 2654 case ARM_VST1d32Twb_register: 2655 case ARM_VST1d64Twb_register: 2656 case ARM_VST1d8Qwb_fixed: 2657 case ARM_VST1d16Qwb_fixed: 2658 case ARM_VST1d32Qwb_fixed: 2659 case ARM_VST1d64Qwb_fixed: 2660 case ARM_VST1d8Qwb_register: 2661 case ARM_VST1d16Qwb_register: 2662 case ARM_VST1d32Qwb_register: 2663 case ARM_VST1d64Qwb_register: 2664 case ARM_VST2d8wb_fixed: 2665 case ARM_VST2d16wb_fixed: 2666 case ARM_VST2d32wb_fixed: 2667 case ARM_VST2d8wb_register: 2668 case ARM_VST2d16wb_register: 2669 case ARM_VST2d32wb_register: 2670 case ARM_VST2q8wb_fixed: 2671 case ARM_VST2q16wb_fixed: 2672 case ARM_VST2q32wb_fixed: 2673 case ARM_VST2q8wb_register: 2674 case ARM_VST2q16wb_register: 2675 case ARM_VST2q32wb_register: 2676 case ARM_VST2b8wb_fixed: 2677 case ARM_VST2b16wb_fixed: 2678 case ARM_VST2b32wb_fixed: 2679 case ARM_VST2b8wb_register: 2680 case ARM_VST2b16wb_register: 2681 case ARM_VST2b32wb_register: 2682 if (Rm == 0xF) 2683 return MCDisassembler_Fail; 2684 MCOperand_CreateImm0(Inst, 0); 2685 break; 2686 case ARM_VST3d8_UPD: 2687 case ARM_VST3d16_UPD: 2688 case ARM_VST3d32_UPD: 2689 case ARM_VST3q8_UPD: 2690 case ARM_VST3q16_UPD: 2691 case ARM_VST3q32_UPD: 2692 case ARM_VST4d8_UPD: 2693 case ARM_VST4d16_UPD: 2694 case ARM_VST4d32_UPD: 2695 case ARM_VST4q8_UPD: 2696 case ARM_VST4q16_UPD: 2697 case ARM_VST4q32_UPD: 2698 if (!Check(&S, DecodeGPRRegisterClass(Inst, wb, Address, Decoder))) 2699 return MCDisassembler_Fail; 2700 break; 2701 default: 2702 break; 2703 } 2704 2705 // AddrMode6 Base (register+alignment) 2706 if (!Check(&S, DecodeAddrMode6Operand(Inst, Rn, Address, Decoder))) 2707 return MCDisassembler_Fail; 2708 2709 // AddrMode6 Offset (register) 2710 switch (MCInst_getOpcode(Inst)) { 2711 default: 2712 if (Rm == 0xD) 2713 MCOperand_CreateReg0(Inst, 0); 2714 else if (Rm != 0xF) { 2715 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder))) 2716 return MCDisassembler_Fail; 2717 } 2718 break; 2719 case ARM_VST1d8wb_fixed: 2720 case ARM_VST1d16wb_fixed: 2721 case ARM_VST1d32wb_fixed: 2722 case ARM_VST1d64wb_fixed: 2723 case ARM_VST1q8wb_fixed: 2724 case ARM_VST1q16wb_fixed: 2725 case ARM_VST1q32wb_fixed: 2726 case ARM_VST1q64wb_fixed: 2727 case ARM_VST1d8Twb_fixed: 2728 case ARM_VST1d16Twb_fixed: 2729 case ARM_VST1d32Twb_fixed: 2730 case ARM_VST1d64Twb_fixed: 2731 case ARM_VST1d8Qwb_fixed: 2732 case ARM_VST1d16Qwb_fixed: 2733 case ARM_VST1d32Qwb_fixed: 2734 case ARM_VST1d64Qwb_fixed: 2735 case ARM_VST2d8wb_fixed: 2736 case ARM_VST2d16wb_fixed: 2737 case ARM_VST2d32wb_fixed: 2738 case ARM_VST2q8wb_fixed: 2739 case ARM_VST2q16wb_fixed: 2740 case ARM_VST2q32wb_fixed: 2741 case ARM_VST2b8wb_fixed: 2742 case ARM_VST2b16wb_fixed: 2743 case ARM_VST2b32wb_fixed: 2744 break; 2745 } 2746 2747 2748 // First input register 2749 switch (MCInst_getOpcode(Inst)) { 2750 case ARM_VST1q16: 2751 case ARM_VST1q32: 2752 case ARM_VST1q64: 2753 case ARM_VST1q8: 2754 case ARM_VST1q16wb_fixed: 2755 case ARM_VST1q16wb_register: 2756 case ARM_VST1q32wb_fixed: 2757 case ARM_VST1q32wb_register: 2758 case ARM_VST1q64wb_fixed: 2759 case ARM_VST1q64wb_register: 2760 case ARM_VST1q8wb_fixed: 2761 case ARM_VST1q8wb_register: 2762 case ARM_VST2d16: 2763 case ARM_VST2d32: 2764 case ARM_VST2d8: 2765 case ARM_VST2d16wb_fixed: 2766 case ARM_VST2d16wb_register: 2767 case ARM_VST2d32wb_fixed: 2768 case ARM_VST2d32wb_register: 2769 case ARM_VST2d8wb_fixed: 2770 case ARM_VST2d8wb_register: 2771 if (!Check(&S, DecodeDPairRegisterClass(Inst, Rd, Address, Decoder))) 2772 return MCDisassembler_Fail; 2773 break; 2774 case ARM_VST2b16: 2775 case ARM_VST2b32: 2776 case ARM_VST2b8: 2777 case ARM_VST2b16wb_fixed: 2778 case ARM_VST2b16wb_register: 2779 case ARM_VST2b32wb_fixed: 2780 case ARM_VST2b32wb_register: 2781 case ARM_VST2b8wb_fixed: 2782 case ARM_VST2b8wb_register: 2783 if (!Check(&S, DecodeDPairSpacedRegisterClass(Inst, Rd, Address, Decoder))) 2784 return MCDisassembler_Fail; 2785 break; 2786 default: 2787 if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder))) 2788 return MCDisassembler_Fail; 2789 } 2790 2791 // Second input register 2792 switch (MCInst_getOpcode(Inst)) { 2793 case ARM_VST3d8: 2794 case ARM_VST3d16: 2795 case ARM_VST3d32: 2796 case ARM_VST3d8_UPD: 2797 case ARM_VST3d16_UPD: 2798 case ARM_VST3d32_UPD: 2799 case ARM_VST4d8: 2800 case ARM_VST4d16: 2801 case ARM_VST4d32: 2802 case ARM_VST4d8_UPD: 2803 case ARM_VST4d16_UPD: 2804 case ARM_VST4d32_UPD: 2805 if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd+1)%32, Address, Decoder))) 2806 return MCDisassembler_Fail; 2807 break; 2808 case ARM_VST3q8: 2809 case ARM_VST3q16: 2810 case ARM_VST3q32: 2811 case ARM_VST3q8_UPD: 2812 case ARM_VST3q16_UPD: 2813 case ARM_VST3q32_UPD: 2814 case ARM_VST4q8: 2815 case ARM_VST4q16: 2816 case ARM_VST4q32: 2817 case ARM_VST4q8_UPD: 2818 case ARM_VST4q16_UPD: 2819 case ARM_VST4q32_UPD: 2820 if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd+2)%32, Address, Decoder))) 2821 return MCDisassembler_Fail; 2822 break; 2823 default: 2824 break; 2825 } 2826 2827 // Third input register 2828 switch (MCInst_getOpcode(Inst)) { 2829 case ARM_VST3d8: 2830 case ARM_VST3d16: 2831 case ARM_VST3d32: 2832 case ARM_VST3d8_UPD: 2833 case ARM_VST3d16_UPD: 2834 case ARM_VST3d32_UPD: 2835 case ARM_VST4d8: 2836 case ARM_VST4d16: 2837 case ARM_VST4d32: 2838 case ARM_VST4d8_UPD: 2839 case ARM_VST4d16_UPD: 2840 case ARM_VST4d32_UPD: 2841 if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd+2)%32, Address, Decoder))) 2842 return MCDisassembler_Fail; 2843 break; 2844 case ARM_VST3q8: 2845 case ARM_VST3q16: 2846 case ARM_VST3q32: 2847 case ARM_VST3q8_UPD: 2848 case ARM_VST3q16_UPD: 2849 case ARM_VST3q32_UPD: 2850 case ARM_VST4q8: 2851 case ARM_VST4q16: 2852 case ARM_VST4q32: 2853 case ARM_VST4q8_UPD: 2854 case ARM_VST4q16_UPD: 2855 case ARM_VST4q32_UPD: 2856 if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd+4)%32, Address, Decoder))) 2857 return MCDisassembler_Fail; 2858 break; 2859 default: 2860 break; 2861 } 2862 2863 // Fourth input register 2864 switch (MCInst_getOpcode(Inst)) { 2865 case ARM_VST4d8: 2866 case ARM_VST4d16: 2867 case ARM_VST4d32: 2868 case ARM_VST4d8_UPD: 2869 case ARM_VST4d16_UPD: 2870 case ARM_VST4d32_UPD: 2871 if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd+3)%32, Address, Decoder))) 2872 return MCDisassembler_Fail; 2873 break; 2874 case ARM_VST4q8: 2875 case ARM_VST4q16: 2876 case ARM_VST4q32: 2877 case ARM_VST4q8_UPD: 2878 case ARM_VST4q16_UPD: 2879 case ARM_VST4q32_UPD: 2880 if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd+6)%32, Address, Decoder))) 2881 return MCDisassembler_Fail; 2882 break; 2883 default: 2884 break; 2885 } 2886 2887 return S; 2888 } 2889 2890 static DecodeStatus DecodeVLD1DupInstruction(MCInst *Inst, unsigned Insn, 2891 uint64_t Address, const void *Decoder) 2892 { 2893 DecodeStatus S = MCDisassembler_Success; 2894 unsigned Rn, Rm, align, size; 2895 unsigned Rd = fieldFromInstruction_4(Insn, 12, 4); 2896 Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4; 2897 Rn = fieldFromInstruction_4(Insn, 16, 4); 2898 Rm = fieldFromInstruction_4(Insn, 0, 4); 2899 align = fieldFromInstruction_4(Insn, 4, 1); 2900 size = fieldFromInstruction_4(Insn, 6, 2); 2901 2902 if (size == 0 && align == 1) 2903 return MCDisassembler_Fail; 2904 align *= (1 << size); 2905 2906 switch (MCInst_getOpcode(Inst)) { 2907 case ARM_VLD1DUPq16: case ARM_VLD1DUPq32: case ARM_VLD1DUPq8: 2908 case ARM_VLD1DUPq16wb_fixed: case ARM_VLD1DUPq16wb_register: 2909 case ARM_VLD1DUPq32wb_fixed: case ARM_VLD1DUPq32wb_register: 2910 case ARM_VLD1DUPq8wb_fixed: case ARM_VLD1DUPq8wb_register: 2911 if (!Check(&S, DecodeDPairRegisterClass(Inst, Rd, Address, Decoder))) 2912 return MCDisassembler_Fail; 2913 break; 2914 default: 2915 if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder))) 2916 return MCDisassembler_Fail; 2917 break; 2918 } 2919 if (Rm != 0xF) { 2920 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 2921 return MCDisassembler_Fail; 2922 } 2923 2924 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 2925 return MCDisassembler_Fail; 2926 MCOperand_CreateImm0(Inst, align); 2927 2928 // The fixed offset post-increment encodes Rm == 0xd. The no-writeback 2929 // variant encodes Rm == 0xf. Anything else is a register offset post- 2930 // increment and we need to add the register operand to the instruction. 2931 if (Rm != 0xD && Rm != 0xF && 2932 !Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder))) 2933 return MCDisassembler_Fail; 2934 2935 return S; 2936 } 2937 2938 static DecodeStatus DecodeVLD2DupInstruction(MCInst *Inst, unsigned Insn, 2939 uint64_t Address, const void *Decoder) 2940 { 2941 DecodeStatus S = MCDisassembler_Success; 2942 unsigned Rn, Rm, align, size; 2943 unsigned Rd = fieldFromInstruction_4(Insn, 12, 4); 2944 Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4; 2945 Rn = fieldFromInstruction_4(Insn, 16, 4); 2946 Rm = fieldFromInstruction_4(Insn, 0, 4); 2947 align = fieldFromInstruction_4(Insn, 4, 1); 2948 size = 1 << fieldFromInstruction_4(Insn, 6, 2); 2949 align *= 2*size; 2950 2951 switch (MCInst_getOpcode(Inst)) { 2952 case ARM_VLD2DUPd16: case ARM_VLD2DUPd32: case ARM_VLD2DUPd8: 2953 case ARM_VLD2DUPd16wb_fixed: case ARM_VLD2DUPd16wb_register: 2954 case ARM_VLD2DUPd32wb_fixed: case ARM_VLD2DUPd32wb_register: 2955 case ARM_VLD2DUPd8wb_fixed: case ARM_VLD2DUPd8wb_register: 2956 if (!Check(&S, DecodeDPairRegisterClass(Inst, Rd, Address, Decoder))) 2957 return MCDisassembler_Fail; 2958 break; 2959 case ARM_VLD2DUPd16x2: case ARM_VLD2DUPd32x2: case ARM_VLD2DUPd8x2: 2960 case ARM_VLD2DUPd16x2wb_fixed: case ARM_VLD2DUPd16x2wb_register: 2961 case ARM_VLD2DUPd32x2wb_fixed: case ARM_VLD2DUPd32x2wb_register: 2962 case ARM_VLD2DUPd8x2wb_fixed: case ARM_VLD2DUPd8x2wb_register: 2963 if (!Check(&S, DecodeDPairSpacedRegisterClass(Inst, Rd, Address, Decoder))) 2964 return MCDisassembler_Fail; 2965 break; 2966 default: 2967 if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder))) 2968 return MCDisassembler_Fail; 2969 break; 2970 } 2971 2972 if (Rm != 0xF) 2973 MCOperand_CreateImm0(Inst, 0); 2974 2975 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 2976 return MCDisassembler_Fail; 2977 MCOperand_CreateImm0(Inst, align); 2978 2979 if (Rm != 0xD && Rm != 0xF) { 2980 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder))) 2981 return MCDisassembler_Fail; 2982 } 2983 2984 return S; 2985 } 2986 2987 static DecodeStatus DecodeVLD3DupInstruction(MCInst *Inst, unsigned Insn, 2988 uint64_t Address, const void *Decoder) 2989 { 2990 DecodeStatus S = MCDisassembler_Success; 2991 unsigned Rn, Rm, inc; 2992 unsigned Rd = fieldFromInstruction_4(Insn, 12, 4); 2993 Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4; 2994 Rn = fieldFromInstruction_4(Insn, 16, 4); 2995 Rm = fieldFromInstruction_4(Insn, 0, 4); 2996 inc = fieldFromInstruction_4(Insn, 5, 1) + 1; 2997 2998 if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder))) 2999 return MCDisassembler_Fail; 3000 if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd+inc)%32, Address, Decoder))) 3001 return MCDisassembler_Fail; 3002 if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd+2*inc)%32, Address, Decoder))) 3003 return MCDisassembler_Fail; 3004 if (Rm != 0xF) { 3005 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 3006 return MCDisassembler_Fail; 3007 } 3008 3009 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 3010 return MCDisassembler_Fail; 3011 MCOperand_CreateImm0(Inst, 0); 3012 3013 if (Rm == 0xD) 3014 MCOperand_CreateReg0(Inst, 0); 3015 else if (Rm != 0xF) { 3016 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder))) 3017 return MCDisassembler_Fail; 3018 } 3019 3020 return S; 3021 } 3022 3023 static DecodeStatus DecodeVLD4DupInstruction(MCInst *Inst, unsigned Insn, 3024 uint64_t Address, const void *Decoder) 3025 { 3026 DecodeStatus S = MCDisassembler_Success; 3027 unsigned Rn, Rm, size, inc, align; 3028 unsigned Rd = fieldFromInstruction_4(Insn, 12, 4); 3029 Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4; 3030 Rn = fieldFromInstruction_4(Insn, 16, 4); 3031 Rm = fieldFromInstruction_4(Insn, 0, 4); 3032 size = fieldFromInstruction_4(Insn, 6, 2); 3033 inc = fieldFromInstruction_4(Insn, 5, 1) + 1; 3034 align = fieldFromInstruction_4(Insn, 4, 1); 3035 3036 if (size == 0x3) { 3037 if (align == 0) 3038 return MCDisassembler_Fail; 3039 align = 16; 3040 } else { 3041 if (size == 2) { 3042 align *= 8; 3043 } else { 3044 size = 1 << size; 3045 align *= 4 * size; 3046 } 3047 } 3048 3049 if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder))) 3050 return MCDisassembler_Fail; 3051 if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd+inc)%32, Address, Decoder))) 3052 return MCDisassembler_Fail; 3053 if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd+2*inc)%32, Address, Decoder))) 3054 return MCDisassembler_Fail; 3055 if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd+3*inc)%32, Address, Decoder))) 3056 return MCDisassembler_Fail; 3057 if (Rm != 0xF) { 3058 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 3059 return MCDisassembler_Fail; 3060 } 3061 3062 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 3063 return MCDisassembler_Fail; 3064 MCOperand_CreateImm0(Inst, align); 3065 3066 if (Rm == 0xD) 3067 MCOperand_CreateReg0(Inst, 0); 3068 else if (Rm != 0xF) { 3069 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder))) 3070 return MCDisassembler_Fail; 3071 } 3072 3073 return S; 3074 } 3075 3076 static DecodeStatus DecodeNEONModImmInstruction(MCInst *Inst, unsigned Insn, 3077 uint64_t Address, const void *Decoder) 3078 { 3079 DecodeStatus S = MCDisassembler_Success; 3080 unsigned imm, Q; 3081 unsigned Rd = fieldFromInstruction_4(Insn, 12, 4); 3082 Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4; 3083 imm = fieldFromInstruction_4(Insn, 0, 4); 3084 imm |= fieldFromInstruction_4(Insn, 16, 3) << 4; 3085 imm |= fieldFromInstruction_4(Insn, 24, 1) << 7; 3086 imm |= fieldFromInstruction_4(Insn, 8, 4) << 8; 3087 imm |= fieldFromInstruction_4(Insn, 5, 1) << 12; 3088 Q = fieldFromInstruction_4(Insn, 6, 1); 3089 3090 if (Q) { 3091 if (!Check(&S, DecodeQPRRegisterClass(Inst, Rd, Address, Decoder))) 3092 return MCDisassembler_Fail; 3093 } else { 3094 if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder))) 3095 return MCDisassembler_Fail; 3096 } 3097 3098 MCOperand_CreateImm0(Inst, imm); 3099 3100 switch (MCInst_getOpcode(Inst)) { 3101 case ARM_VORRiv4i16: 3102 case ARM_VORRiv2i32: 3103 case ARM_VBICiv4i16: 3104 case ARM_VBICiv2i32: 3105 if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder))) 3106 return MCDisassembler_Fail; 3107 break; 3108 case ARM_VORRiv8i16: 3109 case ARM_VORRiv4i32: 3110 case ARM_VBICiv8i16: 3111 case ARM_VBICiv4i32: 3112 if (!Check(&S, DecodeQPRRegisterClass(Inst, Rd, Address, Decoder))) 3113 return MCDisassembler_Fail; 3114 break; 3115 default: 3116 break; 3117 } 3118 3119 return S; 3120 } 3121 3122 static DecodeStatus DecodeVSHLMaxInstruction(MCInst *Inst, unsigned Insn, 3123 uint64_t Address, const void *Decoder) 3124 { 3125 DecodeStatus S = MCDisassembler_Success; 3126 unsigned Rm, size; 3127 unsigned Rd = fieldFromInstruction_4(Insn, 12, 4); 3128 Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4; 3129 Rm = fieldFromInstruction_4(Insn, 0, 4); 3130 Rm |= fieldFromInstruction_4(Insn, 5, 1) << 4; 3131 size = fieldFromInstruction_4(Insn, 18, 2); 3132 3133 if (!Check(&S, DecodeQPRRegisterClass(Inst, Rd, Address, Decoder))) 3134 return MCDisassembler_Fail; 3135 if (!Check(&S, DecodeDPRRegisterClass(Inst, Rm, Address, Decoder))) 3136 return MCDisassembler_Fail; 3137 MCOperand_CreateImm0(Inst, 8 << size); 3138 3139 return S; 3140 } 3141 3142 static DecodeStatus DecodeShiftRight8Imm(MCInst *Inst, unsigned Val, 3143 uint64_t Address, const void *Decoder) 3144 { 3145 MCOperand_CreateImm0(Inst, 8 - Val); 3146 return MCDisassembler_Success; 3147 } 3148 3149 static DecodeStatus DecodeShiftRight16Imm(MCInst *Inst, unsigned Val, 3150 uint64_t Address, const void *Decoder) 3151 { 3152 MCOperand_CreateImm0(Inst, 16 - Val); 3153 return MCDisassembler_Success; 3154 } 3155 3156 static DecodeStatus DecodeShiftRight32Imm(MCInst *Inst, unsigned Val, 3157 uint64_t Address, const void *Decoder) 3158 { 3159 MCOperand_CreateImm0(Inst, 32 - Val); 3160 return MCDisassembler_Success; 3161 } 3162 3163 static DecodeStatus DecodeShiftRight64Imm(MCInst *Inst, unsigned Val, 3164 uint64_t Address, const void *Decoder) 3165 { 3166 MCOperand_CreateImm0(Inst, 64 - Val); 3167 return MCDisassembler_Success; 3168 } 3169 3170 static DecodeStatus DecodeTBLInstruction(MCInst *Inst, unsigned Insn, 3171 uint64_t Address, const void *Decoder) 3172 { 3173 DecodeStatus S = MCDisassembler_Success; 3174 unsigned Rn, Rm, op; 3175 unsigned Rd = fieldFromInstruction_4(Insn, 12, 4); 3176 Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4; 3177 Rn = fieldFromInstruction_4(Insn, 16, 4); 3178 Rn |= fieldFromInstruction_4(Insn, 7, 1) << 4; 3179 Rm = fieldFromInstruction_4(Insn, 0, 4); 3180 Rm |= fieldFromInstruction_4(Insn, 5, 1) << 4; 3181 op = fieldFromInstruction_4(Insn, 6, 1); 3182 3183 if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder))) 3184 return MCDisassembler_Fail; 3185 if (op) { 3186 if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder))) 3187 return MCDisassembler_Fail; // Writeback 3188 } 3189 3190 switch (MCInst_getOpcode(Inst)) { 3191 case ARM_VTBL2: 3192 case ARM_VTBX2: 3193 if (!Check(&S, DecodeDPairRegisterClass(Inst, Rn, Address, Decoder))) 3194 return MCDisassembler_Fail; 3195 break; 3196 default: 3197 if (!Check(&S, DecodeDPRRegisterClass(Inst, Rn, Address, Decoder))) 3198 return MCDisassembler_Fail; 3199 } 3200 3201 if (!Check(&S, DecodeDPRRegisterClass(Inst, Rm, Address, Decoder))) 3202 return MCDisassembler_Fail; 3203 3204 return S; 3205 } 3206 3207 static DecodeStatus DecodeThumbAddSpecialReg(MCInst *Inst, uint16_t Insn, 3208 uint64_t Address, const void *Decoder) 3209 { 3210 DecodeStatus S = MCDisassembler_Success; 3211 3212 unsigned dst = fieldFromInstruction_2(Insn, 8, 3); 3213 unsigned imm = fieldFromInstruction_2(Insn, 0, 8); 3214 3215 if (!Check(&S, DecodetGPRRegisterClass(Inst, dst, Address, Decoder))) 3216 return MCDisassembler_Fail; 3217 3218 switch(MCInst_getOpcode(Inst)) { 3219 default: 3220 return MCDisassembler_Fail; 3221 case ARM_tADR: 3222 break; // tADR does not explicitly represent the PC as an operand. 3223 case ARM_tADDrSPi: 3224 MCOperand_CreateReg0(Inst, ARM_SP); 3225 break; 3226 } 3227 3228 MCOperand_CreateImm0(Inst, imm); 3229 return S; 3230 } 3231 3232 static DecodeStatus DecodeThumbBROperand(MCInst *Inst, unsigned Val, 3233 uint64_t Address, const void *Decoder) 3234 { 3235 MCOperand_CreateImm0(Inst, SignExtend32(Val << 1, 12)); 3236 return MCDisassembler_Success; 3237 } 3238 3239 static DecodeStatus DecodeT2BROperand(MCInst *Inst, unsigned Val, 3240 uint64_t Address, const void *Decoder) 3241 { 3242 MCOperand_CreateImm0(Inst, SignExtend32(Val, 21)); 3243 return MCDisassembler_Success; 3244 } 3245 3246 static DecodeStatus DecodeThumbCmpBROperand(MCInst *Inst, unsigned Val, 3247 uint64_t Address, const void *Decoder) 3248 { 3249 MCOperand_CreateImm0(Inst, Val << 1); 3250 return MCDisassembler_Success; 3251 } 3252 3253 static DecodeStatus DecodeThumbAddrModeRR(MCInst *Inst, unsigned Val, 3254 uint64_t Address, const void *Decoder) 3255 { 3256 DecodeStatus S = MCDisassembler_Success; 3257 3258 unsigned Rn = fieldFromInstruction_4(Val, 0, 3); 3259 unsigned Rm = fieldFromInstruction_4(Val, 3, 3); 3260 3261 if (!Check(&S, DecodetGPRRegisterClass(Inst, Rn, Address, Decoder))) 3262 return MCDisassembler_Fail; 3263 if (!Check(&S, DecodetGPRRegisterClass(Inst, Rm, Address, Decoder))) 3264 return MCDisassembler_Fail; 3265 3266 return S; 3267 } 3268 3269 static DecodeStatus DecodeThumbAddrModeIS(MCInst *Inst, unsigned Val, 3270 uint64_t Address, const void *Decoder) 3271 { 3272 DecodeStatus S = MCDisassembler_Success; 3273 3274 unsigned Rn = fieldFromInstruction_4(Val, 0, 3); 3275 unsigned imm = fieldFromInstruction_4(Val, 3, 5); 3276 3277 if (!Check(&S, DecodetGPRRegisterClass(Inst, Rn, Address, Decoder))) 3278 return MCDisassembler_Fail; 3279 MCOperand_CreateImm0(Inst, imm); 3280 3281 return S; 3282 } 3283 3284 static DecodeStatus DecodeThumbAddrModePC(MCInst *Inst, unsigned Val, 3285 uint64_t Address, const void *Decoder) 3286 { 3287 unsigned imm = Val << 2; 3288 3289 MCOperand_CreateImm0(Inst, imm); 3290 //tryAddingPcLoadReferenceComment(Address, (Address & ~2u) + imm + 4, Decoder); 3291 3292 return MCDisassembler_Success; 3293 } 3294 3295 static DecodeStatus DecodeThumbAddrModeSP(MCInst *Inst, unsigned Val, 3296 uint64_t Address, const void *Decoder) 3297 { 3298 MCOperand_CreateReg0(Inst, ARM_SP); 3299 MCOperand_CreateImm0(Inst, Val); 3300 3301 return MCDisassembler_Success; 3302 } 3303 3304 static DecodeStatus DecodeT2AddrModeSOReg(MCInst *Inst, unsigned Val, 3305 uint64_t Address, const void *Decoder) 3306 { 3307 DecodeStatus S = MCDisassembler_Success; 3308 3309 unsigned Rn = fieldFromInstruction_4(Val, 6, 4); 3310 unsigned Rm = fieldFromInstruction_4(Val, 2, 4); 3311 unsigned imm = fieldFromInstruction_4(Val, 0, 2); 3312 3313 // Thumb stores cannot use PC as dest register. 3314 switch (MCInst_getOpcode(Inst)) { 3315 case ARM_t2STRHs: 3316 case ARM_t2STRBs: 3317 case ARM_t2STRs: 3318 if (Rn == 15) 3319 return MCDisassembler_Fail; 3320 default: 3321 break; 3322 } 3323 3324 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 3325 return MCDisassembler_Fail; 3326 if (!Check(&S, DecoderGPRRegisterClass(Inst, Rm, Address, Decoder))) 3327 return MCDisassembler_Fail; 3328 MCOperand_CreateImm0(Inst, imm); 3329 3330 return S; 3331 } 3332 3333 static DecodeStatus DecodeT2LoadShift(MCInst *Inst, unsigned Insn, 3334 uint64_t Address, const void *Decoder) 3335 { 3336 DecodeStatus S = MCDisassembler_Success; 3337 unsigned addrmode; 3338 unsigned Rt = fieldFromInstruction_4(Insn, 12, 4); 3339 unsigned Rn = fieldFromInstruction_4(Insn, 16, 4); 3340 3341 if (Rn == 15) { 3342 switch (MCInst_getOpcode(Inst)) { 3343 case ARM_t2LDRBs: 3344 MCInst_setOpcode(Inst, ARM_t2LDRBpci); 3345 break; 3346 case ARM_t2LDRHs: 3347 MCInst_setOpcode(Inst, ARM_t2LDRHpci); 3348 break; 3349 case ARM_t2LDRSHs: 3350 MCInst_setOpcode(Inst, ARM_t2LDRSHpci); 3351 break; 3352 case ARM_t2LDRSBs: 3353 MCInst_setOpcode(Inst, ARM_t2LDRSBpci); 3354 break; 3355 case ARM_t2LDRs: 3356 MCInst_setOpcode(Inst, ARM_t2LDRpci); 3357 break; 3358 case ARM_t2PLDs: 3359 MCInst_setOpcode(Inst, ARM_t2PLDpci); 3360 break; 3361 case ARM_t2PLIs: 3362 MCInst_setOpcode(Inst, ARM_t2PLIpci); 3363 break; 3364 default: 3365 return MCDisassembler_Fail; 3366 } 3367 3368 return DecodeT2LoadLabel(Inst, Insn, Address, Decoder); 3369 } 3370 3371 if (Rt == 15) { 3372 switch (MCInst_getOpcode(Inst)) { 3373 case ARM_t2LDRSHs: 3374 return MCDisassembler_Fail; 3375 case ARM_t2LDRHs: 3376 // FIXME: this instruction is only available with MP extensions, 3377 // this should be checked first but we don't have access to the 3378 // feature bits here. 3379 MCInst_setOpcode(Inst, ARM_t2PLDWs); 3380 break; 3381 default: 3382 break; 3383 } 3384 } 3385 3386 switch (MCInst_getOpcode(Inst)) { 3387 case ARM_t2PLDs: 3388 case ARM_t2PLDWs: 3389 case ARM_t2PLIs: 3390 break; 3391 default: 3392 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder))) 3393 return MCDisassembler_Fail; 3394 } 3395 3396 addrmode = fieldFromInstruction_4(Insn, 4, 2); 3397 addrmode |= fieldFromInstruction_4(Insn, 0, 4) << 2; 3398 addrmode |= fieldFromInstruction_4(Insn, 16, 4) << 6; 3399 if (!Check(&S, DecodeT2AddrModeSOReg(Inst, addrmode, Address, Decoder))) 3400 return MCDisassembler_Fail; 3401 3402 return S; 3403 } 3404 3405 static DecodeStatus DecodeT2LoadImm8(MCInst *Inst, unsigned Insn, 3406 uint64_t Address, const void* Decoder) 3407 { 3408 DecodeStatus S = MCDisassembler_Success; 3409 3410 unsigned Rn = fieldFromInstruction_4(Insn, 16, 4); 3411 unsigned Rt = fieldFromInstruction_4(Insn, 12, 4); 3412 unsigned U = fieldFromInstruction_4(Insn, 9, 1); 3413 unsigned imm = fieldFromInstruction_4(Insn, 0, 8); 3414 imm |= (U << 8); 3415 imm |= (Rn << 9); 3416 3417 if (Rn == 15) { 3418 switch (MCInst_getOpcode(Inst)) { 3419 case ARM_t2LDRi8: 3420 MCInst_setOpcode(Inst, ARM_t2LDRpci); 3421 break; 3422 case ARM_t2LDRBi8: 3423 MCInst_setOpcode(Inst, ARM_t2LDRBpci); 3424 break; 3425 case ARM_t2LDRSBi8: 3426 MCInst_setOpcode(Inst, ARM_t2LDRSBpci); 3427 break; 3428 case ARM_t2LDRHi8: 3429 MCInst_setOpcode(Inst, ARM_t2LDRHpci); 3430 break; 3431 case ARM_t2LDRSHi8: 3432 MCInst_setOpcode(Inst, ARM_t2LDRSHpci); 3433 break; 3434 case ARM_t2PLDi8: 3435 MCInst_setOpcode(Inst, ARM_t2PLDpci); 3436 break; 3437 case ARM_t2PLIi8: 3438 MCInst_setOpcode(Inst, ARM_t2PLIpci); 3439 break; 3440 default: 3441 return MCDisassembler_Fail; 3442 } 3443 return DecodeT2LoadLabel(Inst, Insn, Address, Decoder); 3444 } 3445 3446 if (Rt == 15) { 3447 switch (MCInst_getOpcode(Inst)) { 3448 case ARM_t2LDRSHi8: 3449 return MCDisassembler_Fail; 3450 default: 3451 break; 3452 } 3453 } 3454 3455 switch (MCInst_getOpcode(Inst)) { 3456 case ARM_t2PLDi8: 3457 case ARM_t2PLIi8: 3458 case ARM_t2PLDWi8: 3459 break; 3460 default: 3461 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder))) 3462 return MCDisassembler_Fail; 3463 } 3464 3465 if (!Check(&S, DecodeT2AddrModeImm8(Inst, imm, Address, Decoder))) 3466 return MCDisassembler_Fail; 3467 return S; 3468 } 3469 3470 static DecodeStatus DecodeT2LoadImm12(MCInst *Inst, unsigned Insn, 3471 uint64_t Address, const void* Decoder) 3472 { 3473 DecodeStatus S = MCDisassembler_Success; 3474 3475 unsigned Rn = fieldFromInstruction_4(Insn, 16, 4); 3476 unsigned Rt = fieldFromInstruction_4(Insn, 12, 4); 3477 unsigned imm = fieldFromInstruction_4(Insn, 0, 12); 3478 imm |= (Rn << 13); 3479 3480 if (Rn == 15) { 3481 switch (MCInst_getOpcode(Inst)) { 3482 case ARM_t2LDRi12: 3483 MCInst_setOpcode(Inst, ARM_t2LDRpci); 3484 break; 3485 case ARM_t2LDRHi12: 3486 MCInst_setOpcode(Inst, ARM_t2LDRHpci); 3487 break; 3488 case ARM_t2LDRSHi12: 3489 MCInst_setOpcode(Inst, ARM_t2LDRSHpci); 3490 break; 3491 case ARM_t2LDRBi12: 3492 MCInst_setOpcode(Inst, ARM_t2LDRBpci); 3493 break; 3494 case ARM_t2LDRSBi12: 3495 MCInst_setOpcode(Inst, ARM_t2LDRSBpci); 3496 break; 3497 case ARM_t2PLDi12: 3498 MCInst_setOpcode(Inst, ARM_t2PLDpci); 3499 break; 3500 case ARM_t2PLIi12: 3501 MCInst_setOpcode(Inst, ARM_t2PLIpci); 3502 break; 3503 default: 3504 return MCDisassembler_Fail; 3505 } 3506 return DecodeT2LoadLabel(Inst, Insn, Address, Decoder); 3507 } 3508 3509 if (Rt == 15) { 3510 switch (MCInst_getOpcode(Inst)) { 3511 case ARM_t2LDRSHi12: 3512 return MCDisassembler_Fail; 3513 case ARM_t2LDRHi12: 3514 MCInst_setOpcode(Inst, ARM_t2PLDi12); 3515 break; 3516 default: 3517 break; 3518 } 3519 } 3520 3521 switch (MCInst_getOpcode(Inst)) { 3522 case ARM_t2PLDi12: 3523 case ARM_t2PLDWi12: 3524 case ARM_t2PLIi12: 3525 break; 3526 default: 3527 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder))) 3528 return MCDisassembler_Fail; 3529 } 3530 3531 if (!Check(&S, DecodeT2AddrModeImm12(Inst, imm, Address, Decoder))) 3532 return MCDisassembler_Fail; 3533 return S; 3534 } 3535 3536 static DecodeStatus DecodeT2LoadT(MCInst *Inst, unsigned Insn, 3537 uint64_t Address, const void* Decoder) 3538 { 3539 DecodeStatus S = MCDisassembler_Success; 3540 3541 unsigned Rn = fieldFromInstruction_4(Insn, 16, 4); 3542 unsigned Rt = fieldFromInstruction_4(Insn, 12, 4); 3543 unsigned imm = fieldFromInstruction_4(Insn, 0, 8); 3544 imm |= (Rn << 9); 3545 3546 if (Rn == 15) { 3547 switch (MCInst_getOpcode(Inst)) { 3548 case ARM_t2LDRT: 3549 MCInst_setOpcode(Inst, ARM_t2LDRpci); 3550 break; 3551 case ARM_t2LDRBT: 3552 MCInst_setOpcode(Inst, ARM_t2LDRBpci); 3553 break; 3554 case ARM_t2LDRHT: 3555 MCInst_setOpcode(Inst, ARM_t2LDRHpci); 3556 break; 3557 case ARM_t2LDRSBT: 3558 MCInst_setOpcode(Inst, ARM_t2LDRSBpci); 3559 break; 3560 case ARM_t2LDRSHT: 3561 MCInst_setOpcode(Inst, ARM_t2LDRSHpci); 3562 break; 3563 default: 3564 return MCDisassembler_Fail; 3565 } 3566 return DecodeT2LoadLabel(Inst, Insn, Address, Decoder); 3567 } 3568 3569 if (!Check(&S, DecoderGPRRegisterClass(Inst, Rt, Address, Decoder))) 3570 return MCDisassembler_Fail; 3571 if (!Check(&S, DecodeT2AddrModeImm8(Inst, imm, Address, Decoder))) 3572 return MCDisassembler_Fail; 3573 return S; 3574 } 3575 3576 static DecodeStatus DecodeT2LoadLabel(MCInst *Inst, unsigned Insn, 3577 uint64_t Address, const void* Decoder) 3578 { 3579 DecodeStatus S = MCDisassembler_Success; 3580 3581 unsigned Rt = fieldFromInstruction_4(Insn, 12, 4); 3582 unsigned U = fieldFromInstruction_4(Insn, 23, 1); 3583 int imm = fieldFromInstruction_4(Insn, 0, 12); 3584 3585 if (Rt == 15) { 3586 switch (MCInst_getOpcode(Inst)) { 3587 case ARM_t2LDRBpci: 3588 case ARM_t2LDRHpci: 3589 MCInst_setOpcode(Inst, ARM_t2PLDpci); 3590 break; 3591 case ARM_t2LDRSBpci: 3592 MCInst_setOpcode(Inst, ARM_t2PLIpci); 3593 break; 3594 case ARM_t2LDRSHpci: 3595 return MCDisassembler_Fail; 3596 default: 3597 break; 3598 } 3599 } 3600 3601 switch(MCInst_getOpcode(Inst)) { 3602 case ARM_t2PLDpci: 3603 case ARM_t2PLIpci: 3604 break; 3605 default: 3606 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder))) 3607 return MCDisassembler_Fail; 3608 } 3609 3610 if (!U) { 3611 // Special case for #-0. 3612 if (imm == 0) 3613 imm = INT32_MIN; 3614 else 3615 imm = -imm; 3616 } 3617 MCOperand_CreateImm0(Inst, imm); 3618 3619 return S; 3620 } 3621 3622 static DecodeStatus DecodeT2Imm8S4(MCInst *Inst, unsigned Val, 3623 uint64_t Address, const void *Decoder) 3624 { 3625 if (Val == 0) 3626 MCOperand_CreateImm0(Inst, INT32_MIN); 3627 else { 3628 int imm = Val & 0xFF; 3629 3630 if (!(Val & 0x100)) imm *= -1; 3631 MCOperand_CreateImm0(Inst, imm * 4); 3632 } 3633 3634 return MCDisassembler_Success; 3635 } 3636 3637 static DecodeStatus DecodeT2AddrModeImm8s4(MCInst *Inst, unsigned Val, 3638 uint64_t Address, const void *Decoder) 3639 { 3640 DecodeStatus S = MCDisassembler_Success; 3641 3642 unsigned Rn = fieldFromInstruction_4(Val, 9, 4); 3643 unsigned imm = fieldFromInstruction_4(Val, 0, 9); 3644 3645 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 3646 return MCDisassembler_Fail; 3647 if (!Check(&S, DecodeT2Imm8S4(Inst, imm, Address, Decoder))) 3648 return MCDisassembler_Fail; 3649 3650 return S; 3651 } 3652 3653 static DecodeStatus DecodeT2AddrModeImm0_1020s4(MCInst *Inst,unsigned Val, 3654 uint64_t Address, const void *Decoder) 3655 { 3656 DecodeStatus S = MCDisassembler_Success; 3657 3658 unsigned Rn = fieldFromInstruction_4(Val, 8, 4); 3659 unsigned imm = fieldFromInstruction_4(Val, 0, 8); 3660 3661 if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rn, Address, Decoder))) 3662 return MCDisassembler_Fail; 3663 3664 MCOperand_CreateImm0(Inst, imm); 3665 3666 return S; 3667 } 3668 3669 static DecodeStatus DecodeT2Imm8(MCInst *Inst, unsigned Val, 3670 uint64_t Address, const void *Decoder) 3671 { 3672 int imm = Val & 0xFF; 3673 if (Val == 0) 3674 imm = INT32_MIN; 3675 else if (!(Val & 0x100)) 3676 imm *= -1; 3677 MCOperand_CreateImm0(Inst, imm); 3678 3679 return MCDisassembler_Success; 3680 } 3681 3682 static DecodeStatus DecodeT2AddrModeImm8(MCInst *Inst, unsigned Val, 3683 uint64_t Address, const void *Decoder) 3684 { 3685 DecodeStatus S = MCDisassembler_Success; 3686 3687 unsigned Rn = fieldFromInstruction_4(Val, 9, 4); 3688 unsigned imm = fieldFromInstruction_4(Val, 0, 9); 3689 3690 // Thumb stores cannot use PC as dest register. 3691 switch (MCInst_getOpcode(Inst)) { 3692 case ARM_t2STRT: 3693 case ARM_t2STRBT: 3694 case ARM_t2STRHT: 3695 case ARM_t2STRi8: 3696 case ARM_t2STRHi8: 3697 case ARM_t2STRBi8: 3698 if (Rn == 15) 3699 return MCDisassembler_Fail; 3700 break; 3701 default: 3702 break; 3703 } 3704 3705 // Some instructions always use an additive offset. 3706 switch (MCInst_getOpcode(Inst)) { 3707 case ARM_t2LDRT: 3708 case ARM_t2LDRBT: 3709 case ARM_t2LDRHT: 3710 case ARM_t2LDRSBT: 3711 case ARM_t2LDRSHT: 3712 case ARM_t2STRT: 3713 case ARM_t2STRBT: 3714 case ARM_t2STRHT: 3715 imm |= 0x100; 3716 break; 3717 default: 3718 break; 3719 } 3720 3721 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 3722 return MCDisassembler_Fail; 3723 if (!Check(&S, DecodeT2Imm8(Inst, imm, Address, Decoder))) 3724 return MCDisassembler_Fail; 3725 3726 return S; 3727 } 3728 3729 static DecodeStatus DecodeT2LdStPre(MCInst *Inst, unsigned Insn, 3730 uint64_t Address, const void *Decoder) 3731 { 3732 DecodeStatus S = MCDisassembler_Success; 3733 unsigned load; 3734 unsigned Rt = fieldFromInstruction_4(Insn, 12, 4); 3735 unsigned Rn = fieldFromInstruction_4(Insn, 16, 4); 3736 unsigned addr = fieldFromInstruction_4(Insn, 0, 8); 3737 addr |= fieldFromInstruction_4(Insn, 9, 1) << 8; 3738 addr |= Rn << 9; 3739 load = fieldFromInstruction_4(Insn, 20, 1); 3740 3741 if (Rn == 15) { 3742 switch (MCInst_getOpcode(Inst)) { 3743 case ARM_t2LDR_PRE: 3744 case ARM_t2LDR_POST: 3745 MCInst_setOpcode(Inst, ARM_t2LDRpci); 3746 break; 3747 case ARM_t2LDRB_PRE: 3748 case ARM_t2LDRB_POST: 3749 MCInst_setOpcode(Inst, ARM_t2LDRBpci); 3750 break; 3751 case ARM_t2LDRH_PRE: 3752 case ARM_t2LDRH_POST: 3753 MCInst_setOpcode(Inst, ARM_t2LDRHpci); 3754 break; 3755 case ARM_t2LDRSB_PRE: 3756 case ARM_t2LDRSB_POST: 3757 if (Rt == 15) 3758 MCInst_setOpcode(Inst, ARM_t2PLIpci); 3759 else 3760 MCInst_setOpcode(Inst, ARM_t2LDRSBpci); 3761 break; 3762 case ARM_t2LDRSH_PRE: 3763 case ARM_t2LDRSH_POST: 3764 MCInst_setOpcode(Inst, ARM_t2LDRSHpci); 3765 break; 3766 default: 3767 return MCDisassembler_Fail; 3768 } 3769 return DecodeT2LoadLabel(Inst, Insn, Address, Decoder); 3770 } 3771 3772 if (!load) { 3773 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 3774 return MCDisassembler_Fail; 3775 } 3776 3777 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder))) 3778 return MCDisassembler_Fail; 3779 3780 if (load) { 3781 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 3782 return MCDisassembler_Fail; 3783 } 3784 3785 if (!Check(&S, DecodeT2AddrModeImm8(Inst, addr, Address, Decoder))) 3786 return MCDisassembler_Fail; 3787 3788 return S; 3789 } 3790 3791 static DecodeStatus DecodeT2AddrModeImm12(MCInst *Inst, unsigned Val, 3792 uint64_t Address, const void *Decoder) 3793 { 3794 DecodeStatus S = MCDisassembler_Success; 3795 3796 unsigned Rn = fieldFromInstruction_4(Val, 13, 4); 3797 unsigned imm = fieldFromInstruction_4(Val, 0, 12); 3798 3799 // Thumb stores cannot use PC as dest register. 3800 switch (MCInst_getOpcode(Inst)) { 3801 case ARM_t2STRi12: 3802 case ARM_t2STRBi12: 3803 case ARM_t2STRHi12: 3804 if (Rn == 15) 3805 return MCDisassembler_Fail; 3806 default: 3807 break; 3808 } 3809 3810 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 3811 return MCDisassembler_Fail; 3812 MCOperand_CreateImm0(Inst, imm); 3813 3814 return S; 3815 } 3816 3817 static DecodeStatus DecodeThumbAddSPImm(MCInst *Inst, uint16_t Insn, 3818 uint64_t Address, const void *Decoder) 3819 { 3820 unsigned imm = fieldFromInstruction_2(Insn, 0, 7); 3821 3822 MCOperand_CreateReg0(Inst, ARM_SP); 3823 MCOperand_CreateReg0(Inst, ARM_SP); 3824 MCOperand_CreateImm0(Inst, imm); 3825 3826 return MCDisassembler_Success; 3827 } 3828 3829 static DecodeStatus DecodeThumbAddSPReg(MCInst *Inst, uint16_t Insn, 3830 uint64_t Address, const void *Decoder) 3831 { 3832 DecodeStatus S = MCDisassembler_Success; 3833 3834 if (MCInst_getOpcode(Inst) == ARM_tADDrSP) { 3835 unsigned Rdm = fieldFromInstruction_2(Insn, 0, 3); 3836 Rdm |= fieldFromInstruction_2(Insn, 7, 1) << 3; 3837 3838 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rdm, Address, Decoder))) 3839 return MCDisassembler_Fail; 3840 MCOperand_CreateReg0(Inst, ARM_SP); 3841 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rdm, Address, Decoder))) 3842 return MCDisassembler_Fail; 3843 } else if (MCInst_getOpcode(Inst) == ARM_tADDspr) { 3844 unsigned Rm = fieldFromInstruction_2(Insn, 3, 4); 3845 3846 MCOperand_CreateReg0(Inst, ARM_SP); 3847 MCOperand_CreateReg0(Inst, ARM_SP); 3848 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder))) 3849 return MCDisassembler_Fail; 3850 } 3851 3852 return S; 3853 } 3854 3855 static DecodeStatus DecodeThumbCPS(MCInst *Inst, uint16_t Insn, 3856 uint64_t Address, const void *Decoder) 3857 { 3858 unsigned imod = fieldFromInstruction_2(Insn, 4, 1) | 0x2; 3859 unsigned flags = fieldFromInstruction_2(Insn, 0, 3); 3860 3861 MCOperand_CreateImm0(Inst, imod); 3862 MCOperand_CreateImm0(Inst, flags); 3863 3864 return MCDisassembler_Success; 3865 } 3866 3867 static DecodeStatus DecodePostIdxReg(MCInst *Inst, unsigned Insn, 3868 uint64_t Address, const void *Decoder) 3869 { 3870 DecodeStatus S = MCDisassembler_Success; 3871 unsigned Rm = fieldFromInstruction_4(Insn, 0, 4); 3872 unsigned add = fieldFromInstruction_4(Insn, 4, 1); 3873 3874 if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rm, Address, Decoder))) 3875 return MCDisassembler_Fail; 3876 MCOperand_CreateImm0(Inst, add); 3877 3878 return S; 3879 } 3880 3881 static DecodeStatus DecodeThumbBLXOffset(MCInst *Inst, unsigned Val, 3882 uint64_t Address, const void *Decoder) 3883 { 3884 // Val is passed in as S:J1:J2:imm10H:imm10L:'0' 3885 // Note only one trailing zero not two. Also the J1 and J2 values are from 3886 // the encoded instruction. So here change to I1 and I2 values via: 3887 // I1 = NOT(J1 EOR S); 3888 // I2 = NOT(J2 EOR S); 3889 // and build the imm32 with two trailing zeros as documented: 3890 // imm32 = SignExtend(S:I1:I2:imm10H:imm10L:'00', 32); 3891 unsigned S = (Val >> 23) & 1; 3892 unsigned J1 = (Val >> 22) & 1; 3893 unsigned J2 = (Val >> 21) & 1; 3894 unsigned I1 = !(J1 ^ S); 3895 unsigned I2 = !(J2 ^ S); 3896 unsigned tmp = (Val & ~0x600000) | (I1 << 22) | (I2 << 21); 3897 int imm32 = SignExtend32(tmp << 1, 25); 3898 3899 MCOperand_CreateImm0(Inst, imm32); 3900 return MCDisassembler_Success; 3901 } 3902 3903 static DecodeStatus DecodeCoprocessor(MCInst *Inst, unsigned Val, 3904 uint64_t Address, const void *Decoder) 3905 { 3906 if (Val == 0xA || Val == 0xB) 3907 return MCDisassembler_Fail; 3908 3909 MCOperand_CreateImm0(Inst, Val); 3910 return MCDisassembler_Success; 3911 } 3912 3913 static DecodeStatus DecodeThumbTableBranch(MCInst *Inst, unsigned Insn, 3914 uint64_t Address, const void *Decoder) 3915 { 3916 DecodeStatus S = MCDisassembler_Success; 3917 3918 unsigned Rn = fieldFromInstruction_4(Insn, 16, 4); 3919 unsigned Rm = fieldFromInstruction_4(Insn, 0, 4); 3920 3921 if (Rn == ARM_SP) S = MCDisassembler_SoftFail; 3922 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 3923 return MCDisassembler_Fail; 3924 if (!Check(&S, DecoderGPRRegisterClass(Inst, Rm, Address, Decoder))) 3925 return MCDisassembler_Fail; 3926 return S; 3927 } 3928 3929 static DecodeStatus DecodeThumb2BCCInstruction(MCInst *Inst, unsigned Insn, 3930 uint64_t Address, const void *Decoder) 3931 { 3932 DecodeStatus S = MCDisassembler_Success; 3933 unsigned brtarget; 3934 unsigned pred = fieldFromInstruction_4(Insn, 22, 4); 3935 if (pred == 0xE || pred == 0xF) { 3936 unsigned imm; 3937 unsigned opc = fieldFromInstruction_4(Insn, 4, 28); 3938 switch (opc) { 3939 default: 3940 return MCDisassembler_Fail; 3941 case 0xf3bf8f4: 3942 MCInst_setOpcode(Inst, ARM_t2DSB); 3943 break; 3944 case 0xf3bf8f5: 3945 MCInst_setOpcode(Inst, ARM_t2DMB); 3946 break; 3947 case 0xf3bf8f6: 3948 MCInst_setOpcode(Inst, ARM_t2ISB); 3949 break; 3950 } 3951 3952 imm = fieldFromInstruction_4(Insn, 0, 4); 3953 return DecodeMemBarrierOption(Inst, imm, Address, Decoder); 3954 } 3955 3956 brtarget = fieldFromInstruction_4(Insn, 0, 11) << 1; 3957 brtarget |= fieldFromInstruction_4(Insn, 11, 1) << 19; 3958 brtarget |= fieldFromInstruction_4(Insn, 13, 1) << 18; 3959 brtarget |= fieldFromInstruction_4(Insn, 16, 6) << 12; 3960 brtarget |= fieldFromInstruction_4(Insn, 26, 1) << 20; 3961 3962 if (!Check(&S, DecodeT2BROperand(Inst, brtarget, Address, Decoder))) 3963 return MCDisassembler_Fail; 3964 if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder))) 3965 return MCDisassembler_Fail; 3966 3967 return S; 3968 } 3969 3970 // Decode a shifted immediate operand. These basically consist 3971 // of an 8-bit value, and a 4-bit directive that specifies either 3972 // a splat operation or a rotation. 3973 static DecodeStatus DecodeT2SOImm(MCInst *Inst, unsigned Val, 3974 uint64_t Address, const void *Decoder) 3975 { 3976 unsigned ctrl = fieldFromInstruction_4(Val, 10, 2); 3977 if (ctrl == 0) { 3978 unsigned byte = fieldFromInstruction_4(Val, 8, 2); 3979 unsigned imm = fieldFromInstruction_4(Val, 0, 8); 3980 switch (byte) { 3981 case 0: 3982 MCOperand_CreateImm0(Inst, imm); 3983 break; 3984 case 1: 3985 MCOperand_CreateImm0(Inst, (imm << 16) | imm); 3986 break; 3987 case 2: 3988 MCOperand_CreateImm0(Inst, (imm << 24) | (imm << 8)); 3989 break; 3990 case 3: 3991 MCOperand_CreateImm0(Inst, (imm << 24) | (imm << 16) | (imm << 8) | imm); 3992 break; 3993 } 3994 } else { 3995 unsigned unrot = fieldFromInstruction_4(Val, 0, 7) | 0x80; 3996 unsigned rot = fieldFromInstruction_4(Val, 7, 5); 3997 unsigned imm = (unrot >> rot) | (unrot << ((32-rot)&31)); 3998 MCOperand_CreateImm0(Inst, imm); 3999 } 4000 4001 return MCDisassembler_Success; 4002 } 4003 4004 static DecodeStatus DecodeThumbBCCTargetOperand(MCInst *Inst, unsigned Val, 4005 uint64_t Address, const void *Decoder) 4006 { 4007 MCOperand_CreateImm0(Inst, SignExtend32(Val << 1, 9)); 4008 return MCDisassembler_Success; 4009 } 4010 4011 static DecodeStatus DecodeThumbBLTargetOperand(MCInst *Inst, unsigned Val, 4012 uint64_t Address, const void *Decoder) 4013 { 4014 // Val is passed in as S:J1:J2:imm10:imm11 4015 // Note no trailing zero after imm11. Also the J1 and J2 values are from 4016 // the encoded instruction. So here change to I1 and I2 values via: 4017 // I1 = NOT(J1 EOR S); 4018 // I2 = NOT(J2 EOR S); 4019 // and build the imm32 with one trailing zero as documented: 4020 // imm32 = SignExtend(S:I1:I2:imm10:imm11:'0', 32); 4021 unsigned S = (Val >> 23) & 1; 4022 unsigned J1 = (Val >> 22) & 1; 4023 unsigned J2 = (Val >> 21) & 1; 4024 unsigned I1 = !(J1 ^ S); 4025 unsigned I2 = !(J2 ^ S); 4026 unsigned tmp = (Val & ~0x600000) | (I1 << 22) | (I2 << 21); 4027 int imm32 = SignExtend32(tmp << 1, 25); 4028 4029 MCOperand_CreateImm0(Inst, imm32); 4030 return MCDisassembler_Success; 4031 } 4032 4033 static DecodeStatus DecodeMemBarrierOption(MCInst *Inst, unsigned Val, 4034 uint64_t Address, const void *Decoder) 4035 { 4036 if (Val & ~0xf) 4037 return MCDisassembler_Fail; 4038 4039 MCOperand_CreateImm0(Inst, Val); 4040 return MCDisassembler_Success; 4041 } 4042 4043 static DecodeStatus DecodeInstSyncBarrierOption(MCInst *Inst, unsigned Val, 4044 uint64_t Address, const void *Decoder) 4045 { 4046 if (Val & ~0xf) 4047 return MCDisassembler_Fail; 4048 4049 MCOperand_CreateImm0(Inst, Val); 4050 return MCDisassembler_Success; 4051 } 4052 4053 static DecodeStatus DecodeMSRMask(MCInst *Inst, unsigned Val, 4054 uint64_t Address, const void *Decoder) 4055 { 4056 uint64_t FeatureBits = ARM_getFeatureBits(Inst->csh->mode); 4057 if (FeatureBits & ARM_FeatureMClass) { 4058 unsigned ValLow = Val & 0xff; 4059 4060 // Validate the SYSm value first. 4061 switch (ValLow) { 4062 case 0: // apsr 4063 case 1: // iapsr 4064 case 2: // eapsr 4065 case 3: // xpsr 4066 case 5: // ipsr 4067 case 6: // epsr 4068 case 7: // iepsr 4069 case 8: // msp 4070 case 9: // psp 4071 case 16: // primask 4072 case 20: // control 4073 break; 4074 case 17: // basepri 4075 case 18: // basepri_max 4076 case 19: // faultmask 4077 if (!(FeatureBits & ARM_HasV7Ops)) 4078 // Values basepri, basepri_max and faultmask are only valid for v7m. 4079 return MCDisassembler_Fail; 4080 break; 4081 default: 4082 return MCDisassembler_Fail; 4083 } 4084 4085 // The ARMv7-M architecture has an additional 2-bit mask value in the MSR 4086 // instruction (bits {11,10}). The mask is used only with apsr, iapsr, 4087 // eapsr and xpsr, it has to be 0b10 in other cases. Bit mask{1} indicates 4088 // if the NZCVQ bits should be moved by the instruction. Bit mask{0} 4089 // indicates the move for the GE{3:0} bits, the mask{0} bit can be set 4090 // only if the processor includes the DSP extension. 4091 if ((FeatureBits & ARM_HasV7Ops) && MCInst_getOpcode(Inst) == ARM_t2MSR_M) { 4092 unsigned Mask = (Val >> 10) & 3; 4093 if (Mask == 0 || (Mask != 2 && ValLow > 3) || 4094 (!(FeatureBits & ARM_FeatureDSPThumb2) && Mask == 1)) 4095 return MCDisassembler_Fail; 4096 } 4097 } else { 4098 // A/R class 4099 if (Val == 0) 4100 return MCDisassembler_Fail; 4101 } 4102 4103 MCOperand_CreateImm0(Inst, Val); 4104 return MCDisassembler_Success; 4105 } 4106 4107 static DecodeStatus DecodeDoubleRegLoad(MCInst *Inst, unsigned Insn, 4108 uint64_t Address, const void *Decoder) 4109 { 4110 DecodeStatus S = MCDisassembler_Success; 4111 4112 unsigned Rt = fieldFromInstruction_4(Insn, 12, 4); 4113 unsigned Rn = fieldFromInstruction_4(Insn, 16, 4); 4114 unsigned pred = fieldFromInstruction_4(Insn, 28, 4); 4115 4116 if (Rn == 0xF) 4117 S = MCDisassembler_SoftFail; 4118 4119 if (!Check(&S, DecodeGPRPairRegisterClass(Inst, Rt, Address, Decoder))) 4120 return MCDisassembler_Fail; 4121 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 4122 return MCDisassembler_Fail; 4123 if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder))) 4124 return MCDisassembler_Fail; 4125 4126 return S; 4127 } 4128 4129 static DecodeStatus DecodeDoubleRegStore(MCInst *Inst, unsigned Insn, 4130 uint64_t Address, const void *Decoder) 4131 { 4132 DecodeStatus S = MCDisassembler_Success; 4133 4134 unsigned Rd = fieldFromInstruction_4(Insn, 12, 4); 4135 unsigned Rt = fieldFromInstruction_4(Insn, 0, 4); 4136 unsigned Rn = fieldFromInstruction_4(Insn, 16, 4); 4137 unsigned pred = fieldFromInstruction_4(Insn, 28, 4); 4138 4139 if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rd, Address, Decoder))) 4140 return MCDisassembler_Fail; 4141 4142 if (Rn == 0xF || Rd == Rn || Rd == Rt || Rd == Rt+1) 4143 S = MCDisassembler_SoftFail; 4144 4145 if (!Check(&S, DecodeGPRPairRegisterClass(Inst, Rt, Address, Decoder))) 4146 return MCDisassembler_Fail; 4147 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 4148 return MCDisassembler_Fail; 4149 if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder))) 4150 return MCDisassembler_Fail; 4151 4152 return S; 4153 } 4154 4155 static DecodeStatus DecodeLDRPreImm(MCInst *Inst, unsigned Insn, 4156 uint64_t Address, const void *Decoder) 4157 { 4158 DecodeStatus S = MCDisassembler_Success; 4159 unsigned pred; 4160 unsigned Rn = fieldFromInstruction_4(Insn, 16, 4); 4161 unsigned Rt = fieldFromInstruction_4(Insn, 12, 4); 4162 unsigned imm = fieldFromInstruction_4(Insn, 0, 12); 4163 imm |= fieldFromInstruction_4(Insn, 16, 4) << 13; 4164 imm |= fieldFromInstruction_4(Insn, 23, 1) << 12; 4165 pred = fieldFromInstruction_4(Insn, 28, 4); 4166 4167 if (Rn == 0xF || Rn == Rt) S = MCDisassembler_SoftFail; 4168 4169 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder))) 4170 return MCDisassembler_Fail; 4171 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 4172 return MCDisassembler_Fail; 4173 if (!Check(&S, DecodeAddrModeImm12Operand(Inst, imm, Address, Decoder))) 4174 return MCDisassembler_Fail; 4175 if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder))) 4176 return MCDisassembler_Fail; 4177 4178 return S; 4179 } 4180 4181 static DecodeStatus DecodeLDRPreReg(MCInst *Inst, unsigned Insn, 4182 uint64_t Address, const void *Decoder) 4183 { 4184 DecodeStatus S = MCDisassembler_Success; 4185 unsigned pred, Rm; 4186 unsigned Rn = fieldFromInstruction_4(Insn, 16, 4); 4187 unsigned Rt = fieldFromInstruction_4(Insn, 12, 4); 4188 unsigned imm = fieldFromInstruction_4(Insn, 0, 12); 4189 imm |= fieldFromInstruction_4(Insn, 16, 4) << 13; 4190 imm |= fieldFromInstruction_4(Insn, 23, 1) << 12; 4191 pred = fieldFromInstruction_4(Insn, 28, 4); 4192 Rm = fieldFromInstruction_4(Insn, 0, 4); 4193 4194 if (Rn == 0xF || Rn == Rt) S = MCDisassembler_SoftFail; 4195 if (Rm == 0xF) S = MCDisassembler_SoftFail; 4196 4197 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder))) 4198 return MCDisassembler_Fail; 4199 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 4200 return MCDisassembler_Fail; 4201 if (!Check(&S, DecodeSORegMemOperand(Inst, imm, Address, Decoder))) 4202 return MCDisassembler_Fail; 4203 if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder))) 4204 return MCDisassembler_Fail; 4205 4206 return S; 4207 } 4208 4209 static DecodeStatus DecodeSTRPreImm(MCInst *Inst, unsigned Insn, 4210 uint64_t Address, const void *Decoder) 4211 { 4212 DecodeStatus S = MCDisassembler_Success; 4213 unsigned pred; 4214 unsigned Rn = fieldFromInstruction_4(Insn, 16, 4); 4215 unsigned Rt = fieldFromInstruction_4(Insn, 12, 4); 4216 unsigned imm = fieldFromInstruction_4(Insn, 0, 12); 4217 imm |= fieldFromInstruction_4(Insn, 16, 4) << 13; 4218 imm |= fieldFromInstruction_4(Insn, 23, 1) << 12; 4219 pred = fieldFromInstruction_4(Insn, 28, 4); 4220 4221 if (Rn == 0xF || Rn == Rt) S = MCDisassembler_SoftFail; 4222 4223 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 4224 return MCDisassembler_Fail; 4225 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder))) 4226 return MCDisassembler_Fail; 4227 if (!Check(&S, DecodeAddrModeImm12Operand(Inst, imm, Address, Decoder))) 4228 return MCDisassembler_Fail; 4229 if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder))) 4230 return MCDisassembler_Fail; 4231 4232 return S; 4233 } 4234 4235 static DecodeStatus DecodeSTRPreReg(MCInst *Inst, unsigned Insn, 4236 uint64_t Address, const void *Decoder) 4237 { 4238 DecodeStatus S = MCDisassembler_Success; 4239 unsigned pred; 4240 unsigned Rn = fieldFromInstruction_4(Insn, 16, 4); 4241 unsigned Rt = fieldFromInstruction_4(Insn, 12, 4); 4242 unsigned imm = fieldFromInstruction_4(Insn, 0, 12); 4243 imm |= fieldFromInstruction_4(Insn, 16, 4) << 13; 4244 imm |= fieldFromInstruction_4(Insn, 23, 1) << 12; 4245 pred = fieldFromInstruction_4(Insn, 28, 4); 4246 4247 if (Rn == 0xF || Rn == Rt) S = MCDisassembler_SoftFail; 4248 4249 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 4250 return MCDisassembler_Fail; 4251 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder))) 4252 return MCDisassembler_Fail; 4253 if (!Check(&S, DecodeSORegMemOperand(Inst, imm, Address, Decoder))) 4254 return MCDisassembler_Fail; 4255 if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder))) 4256 return MCDisassembler_Fail; 4257 4258 return S; 4259 } 4260 4261 static DecodeStatus DecodeVLD1LN(MCInst *Inst, unsigned Insn, 4262 uint64_t Address, const void *Decoder) 4263 { 4264 DecodeStatus S = MCDisassembler_Success; 4265 unsigned size, align = 0, index = 0; 4266 unsigned Rn = fieldFromInstruction_4(Insn, 16, 4); 4267 unsigned Rm = fieldFromInstruction_4(Insn, 0, 4); 4268 unsigned Rd = fieldFromInstruction_4(Insn, 12, 4); 4269 Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4; 4270 size = fieldFromInstruction_4(Insn, 10, 2); 4271 4272 switch (size) { 4273 default: 4274 return MCDisassembler_Fail; 4275 case 0: 4276 if (fieldFromInstruction_4(Insn, 4, 1)) 4277 return MCDisassembler_Fail; // UNDEFINED 4278 index = fieldFromInstruction_4(Insn, 5, 3); 4279 break; 4280 case 1: 4281 if (fieldFromInstruction_4(Insn, 5, 1)) 4282 return MCDisassembler_Fail; // UNDEFINED 4283 index = fieldFromInstruction_4(Insn, 6, 2); 4284 if (fieldFromInstruction_4(Insn, 4, 1)) 4285 align = 2; 4286 break; 4287 case 2: 4288 if (fieldFromInstruction_4(Insn, 6, 1)) 4289 return MCDisassembler_Fail; // UNDEFINED 4290 index = fieldFromInstruction_4(Insn, 7, 1); 4291 4292 switch (fieldFromInstruction_4(Insn, 4, 2)) { 4293 case 0 : 4294 align = 0; break; 4295 case 3: 4296 align = 4; break; 4297 default: 4298 return MCDisassembler_Fail; 4299 } 4300 break; 4301 } 4302 4303 if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder))) 4304 return MCDisassembler_Fail; 4305 if (Rm != 0xF) { // Writeback 4306 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 4307 return MCDisassembler_Fail; 4308 } 4309 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 4310 return MCDisassembler_Fail; 4311 MCOperand_CreateImm0(Inst, align); 4312 if (Rm != 0xF) { 4313 if (Rm != 0xD) { 4314 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder))) 4315 return MCDisassembler_Fail; 4316 } else 4317 MCOperand_CreateReg0(Inst, 0); 4318 } 4319 4320 if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder))) 4321 return MCDisassembler_Fail; 4322 MCOperand_CreateImm0(Inst, index); 4323 4324 return S; 4325 } 4326 4327 static DecodeStatus DecodeVST1LN(MCInst *Inst, unsigned Insn, 4328 uint64_t Address, const void *Decoder) 4329 { 4330 DecodeStatus S = MCDisassembler_Success; 4331 unsigned size, align = 0, index = 0; 4332 unsigned Rn = fieldFromInstruction_4(Insn, 16, 4); 4333 unsigned Rm = fieldFromInstruction_4(Insn, 0, 4); 4334 unsigned Rd = fieldFromInstruction_4(Insn, 12, 4); 4335 Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4; 4336 size = fieldFromInstruction_4(Insn, 10, 2); 4337 4338 switch (size) { 4339 default: 4340 return MCDisassembler_Fail; 4341 case 0: 4342 if (fieldFromInstruction_4(Insn, 4, 1)) 4343 return MCDisassembler_Fail; // UNDEFINED 4344 index = fieldFromInstruction_4(Insn, 5, 3); 4345 break; 4346 case 1: 4347 if (fieldFromInstruction_4(Insn, 5, 1)) 4348 return MCDisassembler_Fail; // UNDEFINED 4349 index = fieldFromInstruction_4(Insn, 6, 2); 4350 if (fieldFromInstruction_4(Insn, 4, 1)) 4351 align = 2; 4352 break; 4353 case 2: 4354 if (fieldFromInstruction_4(Insn, 6, 1)) 4355 return MCDisassembler_Fail; // UNDEFINED 4356 index = fieldFromInstruction_4(Insn, 7, 1); 4357 4358 switch (fieldFromInstruction_4(Insn, 4, 2)) { 4359 case 0: 4360 align = 0; break; 4361 case 3: 4362 align = 4; break; 4363 default: 4364 return MCDisassembler_Fail; 4365 } 4366 break; 4367 } 4368 4369 if (Rm != 0xF) { // Writeback 4370 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 4371 return MCDisassembler_Fail; 4372 } 4373 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 4374 return MCDisassembler_Fail; 4375 MCOperand_CreateImm0(Inst, align); 4376 if (Rm != 0xF) { 4377 if (Rm != 0xD) { 4378 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder))) 4379 return MCDisassembler_Fail; 4380 } else 4381 MCOperand_CreateReg0(Inst, 0); 4382 } 4383 4384 if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder))) 4385 return MCDisassembler_Fail; 4386 MCOperand_CreateImm0(Inst, index); 4387 4388 return S; 4389 } 4390 4391 static DecodeStatus DecodeVLD2LN(MCInst *Inst, unsigned Insn, 4392 uint64_t Address, const void *Decoder) 4393 { 4394 DecodeStatus S = MCDisassembler_Success; 4395 unsigned size, align = 0, index = 0, inc = 1; 4396 unsigned Rn = fieldFromInstruction_4(Insn, 16, 4); 4397 unsigned Rm = fieldFromInstruction_4(Insn, 0, 4); 4398 unsigned Rd = fieldFromInstruction_4(Insn, 12, 4); 4399 Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4; 4400 size = fieldFromInstruction_4(Insn, 10, 2); 4401 4402 switch (size) { 4403 default: 4404 return MCDisassembler_Fail; 4405 case 0: 4406 index = fieldFromInstruction_4(Insn, 5, 3); 4407 if (fieldFromInstruction_4(Insn, 4, 1)) 4408 align = 2; 4409 break; 4410 case 1: 4411 index = fieldFromInstruction_4(Insn, 6, 2); 4412 if (fieldFromInstruction_4(Insn, 4, 1)) 4413 align = 4; 4414 if (fieldFromInstruction_4(Insn, 5, 1)) 4415 inc = 2; 4416 break; 4417 case 2: 4418 if (fieldFromInstruction_4(Insn, 5, 1)) 4419 return MCDisassembler_Fail; // UNDEFINED 4420 index = fieldFromInstruction_4(Insn, 7, 1); 4421 if (fieldFromInstruction_4(Insn, 4, 1) != 0) 4422 align = 8; 4423 if (fieldFromInstruction_4(Insn, 6, 1)) 4424 inc = 2; 4425 break; 4426 } 4427 4428 if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder))) 4429 return MCDisassembler_Fail; 4430 if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd+inc, Address, Decoder))) 4431 return MCDisassembler_Fail; 4432 if (Rm != 0xF) { // Writeback 4433 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 4434 return MCDisassembler_Fail; 4435 } 4436 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 4437 return MCDisassembler_Fail; 4438 MCOperand_CreateImm0(Inst, align); 4439 if (Rm != 0xF) { 4440 if (Rm != 0xD) { 4441 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder))) 4442 return MCDisassembler_Fail; 4443 } else 4444 MCOperand_CreateReg0(Inst, 0); 4445 } 4446 4447 if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder))) 4448 return MCDisassembler_Fail; 4449 if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd+inc, Address, Decoder))) 4450 return MCDisassembler_Fail; 4451 MCOperand_CreateImm0(Inst, index); 4452 4453 return S; 4454 } 4455 4456 static DecodeStatus DecodeVST2LN(MCInst *Inst, unsigned Insn, 4457 uint64_t Address, const void *Decoder) 4458 { 4459 DecodeStatus S = MCDisassembler_Success; 4460 unsigned size, align = 0, index = 0, inc = 1; 4461 unsigned Rn = fieldFromInstruction_4(Insn, 16, 4); 4462 unsigned Rm = fieldFromInstruction_4(Insn, 0, 4); 4463 unsigned Rd = fieldFromInstruction_4(Insn, 12, 4); 4464 Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4; 4465 size = fieldFromInstruction_4(Insn, 10, 2); 4466 4467 switch (size) { 4468 default: 4469 return MCDisassembler_Fail; 4470 case 0: 4471 index = fieldFromInstruction_4(Insn, 5, 3); 4472 if (fieldFromInstruction_4(Insn, 4, 1)) 4473 align = 2; 4474 break; 4475 case 1: 4476 index = fieldFromInstruction_4(Insn, 6, 2); 4477 if (fieldFromInstruction_4(Insn, 4, 1)) 4478 align = 4; 4479 if (fieldFromInstruction_4(Insn, 5, 1)) 4480 inc = 2; 4481 break; 4482 case 2: 4483 if (fieldFromInstruction_4(Insn, 5, 1)) 4484 return MCDisassembler_Fail; // UNDEFINED 4485 index = fieldFromInstruction_4(Insn, 7, 1); 4486 if (fieldFromInstruction_4(Insn, 4, 1) != 0) 4487 align = 8; 4488 if (fieldFromInstruction_4(Insn, 6, 1)) 4489 inc = 2; 4490 break; 4491 } 4492 4493 if (Rm != 0xF) { // Writeback 4494 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 4495 return MCDisassembler_Fail; 4496 } 4497 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 4498 return MCDisassembler_Fail; 4499 MCOperand_CreateImm0(Inst, align); 4500 if (Rm != 0xF) { 4501 if (Rm != 0xD) { 4502 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder))) 4503 return MCDisassembler_Fail; 4504 } else 4505 MCOperand_CreateReg0(Inst, 0); 4506 } 4507 4508 if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder))) 4509 return MCDisassembler_Fail; 4510 if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd+inc, Address, Decoder))) 4511 return MCDisassembler_Fail; 4512 MCOperand_CreateImm0(Inst, index); 4513 4514 return S; 4515 } 4516 4517 static DecodeStatus DecodeVLD3LN(MCInst *Inst, unsigned Insn, 4518 uint64_t Address, const void *Decoder) 4519 { 4520 DecodeStatus S = MCDisassembler_Success; 4521 unsigned size, align = 0, index = 0, inc = 1; 4522 unsigned Rn = fieldFromInstruction_4(Insn, 16, 4); 4523 unsigned Rm = fieldFromInstruction_4(Insn, 0, 4); 4524 unsigned Rd = fieldFromInstruction_4(Insn, 12, 4); 4525 Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4; 4526 size = fieldFromInstruction_4(Insn, 10, 2); 4527 4528 switch (size) { 4529 default: 4530 return MCDisassembler_Fail; 4531 case 0: 4532 if (fieldFromInstruction_4(Insn, 4, 1)) 4533 return MCDisassembler_Fail; // UNDEFINED 4534 index = fieldFromInstruction_4(Insn, 5, 3); 4535 break; 4536 case 1: 4537 if (fieldFromInstruction_4(Insn, 4, 1)) 4538 return MCDisassembler_Fail; // UNDEFINED 4539 index = fieldFromInstruction_4(Insn, 6, 2); 4540 if (fieldFromInstruction_4(Insn, 5, 1)) 4541 inc = 2; 4542 break; 4543 case 2: 4544 if (fieldFromInstruction_4(Insn, 4, 2)) 4545 return MCDisassembler_Fail; // UNDEFINED 4546 index = fieldFromInstruction_4(Insn, 7, 1); 4547 if (fieldFromInstruction_4(Insn, 6, 1)) 4548 inc = 2; 4549 break; 4550 } 4551 4552 if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder))) 4553 return MCDisassembler_Fail; 4554 if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd+inc, Address, Decoder))) 4555 return MCDisassembler_Fail; 4556 if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd+2*inc, Address, Decoder))) 4557 return MCDisassembler_Fail; 4558 4559 if (Rm != 0xF) { // Writeback 4560 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 4561 return MCDisassembler_Fail; 4562 } 4563 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 4564 return MCDisassembler_Fail; 4565 MCOperand_CreateImm0(Inst, align); 4566 if (Rm != 0xF) { 4567 if (Rm != 0xD) { 4568 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder))) 4569 return MCDisassembler_Fail; 4570 } else 4571 MCOperand_CreateReg0(Inst, 0); 4572 } 4573 4574 if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder))) 4575 return MCDisassembler_Fail; 4576 if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd+inc, Address, Decoder))) 4577 return MCDisassembler_Fail; 4578 if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd+2*inc, Address, Decoder))) 4579 return MCDisassembler_Fail; 4580 MCOperand_CreateImm0(Inst, index); 4581 4582 return S; 4583 } 4584 4585 static DecodeStatus DecodeVST3LN(MCInst *Inst, unsigned Insn, 4586 uint64_t Address, const void *Decoder) 4587 { 4588 DecodeStatus S = MCDisassembler_Success; 4589 unsigned size, align = 0, index = 0, inc = 1; 4590 unsigned Rn = fieldFromInstruction_4(Insn, 16, 4); 4591 unsigned Rm = fieldFromInstruction_4(Insn, 0, 4); 4592 unsigned Rd = fieldFromInstruction_4(Insn, 12, 4); 4593 Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4; 4594 size = fieldFromInstruction_4(Insn, 10, 2); 4595 4596 switch (size) { 4597 default: 4598 return MCDisassembler_Fail; 4599 case 0: 4600 if (fieldFromInstruction_4(Insn, 4, 1)) 4601 return MCDisassembler_Fail; // UNDEFINED 4602 index = fieldFromInstruction_4(Insn, 5, 3); 4603 break; 4604 case 1: 4605 if (fieldFromInstruction_4(Insn, 4, 1)) 4606 return MCDisassembler_Fail; // UNDEFINED 4607 index = fieldFromInstruction_4(Insn, 6, 2); 4608 if (fieldFromInstruction_4(Insn, 5, 1)) 4609 inc = 2; 4610 break; 4611 case 2: 4612 if (fieldFromInstruction_4(Insn, 4, 2)) 4613 return MCDisassembler_Fail; // UNDEFINED 4614 index = fieldFromInstruction_4(Insn, 7, 1); 4615 if (fieldFromInstruction_4(Insn, 6, 1)) 4616 inc = 2; 4617 break; 4618 } 4619 4620 if (Rm != 0xF) { // Writeback 4621 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 4622 return MCDisassembler_Fail; 4623 } 4624 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 4625 return MCDisassembler_Fail; 4626 MCOperand_CreateImm0(Inst, align); 4627 if (Rm != 0xF) { 4628 if (Rm != 0xD) { 4629 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder))) 4630 return MCDisassembler_Fail; 4631 } else 4632 MCOperand_CreateReg0(Inst, 0); 4633 } 4634 4635 if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder))) 4636 return MCDisassembler_Fail; 4637 if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd+inc, Address, Decoder))) 4638 return MCDisassembler_Fail; 4639 if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd+2*inc, Address, Decoder))) 4640 return MCDisassembler_Fail; 4641 MCOperand_CreateImm0(Inst, index); 4642 4643 return S; 4644 } 4645 4646 static DecodeStatus DecodeVLD4LN(MCInst *Inst, unsigned Insn, 4647 uint64_t Address, const void *Decoder) 4648 { 4649 DecodeStatus S = MCDisassembler_Success; 4650 unsigned size, align = 0, index = 0, inc = 1; 4651 unsigned Rn = fieldFromInstruction_4(Insn, 16, 4); 4652 unsigned Rm = fieldFromInstruction_4(Insn, 0, 4); 4653 unsigned Rd = fieldFromInstruction_4(Insn, 12, 4); 4654 Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4; 4655 size = fieldFromInstruction_4(Insn, 10, 2); 4656 4657 switch (size) { 4658 default: 4659 return MCDisassembler_Fail; 4660 case 0: 4661 if (fieldFromInstruction_4(Insn, 4, 1)) 4662 align = 4; 4663 index = fieldFromInstruction_4(Insn, 5, 3); 4664 break; 4665 case 1: 4666 if (fieldFromInstruction_4(Insn, 4, 1)) 4667 align = 8; 4668 index = fieldFromInstruction_4(Insn, 6, 2); 4669 if (fieldFromInstruction_4(Insn, 5, 1)) 4670 inc = 2; 4671 break; 4672 case 2: 4673 switch (fieldFromInstruction_4(Insn, 4, 2)) { 4674 case 0: 4675 align = 0; break; 4676 case 3: 4677 return MCDisassembler_Fail; 4678 default: 4679 align = 4 << fieldFromInstruction_4(Insn, 4, 2); break; 4680 } 4681 4682 index = fieldFromInstruction_4(Insn, 7, 1); 4683 if (fieldFromInstruction_4(Insn, 6, 1)) 4684 inc = 2; 4685 break; 4686 } 4687 4688 if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder))) 4689 return MCDisassembler_Fail; 4690 if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd+inc, Address, Decoder))) 4691 return MCDisassembler_Fail; 4692 if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd+2*inc, Address, Decoder))) 4693 return MCDisassembler_Fail; 4694 if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd+3*inc, Address, Decoder))) 4695 return MCDisassembler_Fail; 4696 4697 if (Rm != 0xF) { // Writeback 4698 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 4699 return MCDisassembler_Fail; 4700 } 4701 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 4702 return MCDisassembler_Fail; 4703 MCOperand_CreateImm0(Inst, align); 4704 if (Rm != 0xF) { 4705 if (Rm != 0xD) { 4706 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder))) 4707 return MCDisassembler_Fail; 4708 } else 4709 MCOperand_CreateReg0(Inst, 0); 4710 } 4711 4712 if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder))) 4713 return MCDisassembler_Fail; 4714 if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd+inc, Address, Decoder))) 4715 return MCDisassembler_Fail; 4716 if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd+2*inc, Address, Decoder))) 4717 return MCDisassembler_Fail; 4718 if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd+3*inc, Address, Decoder))) 4719 return MCDisassembler_Fail; 4720 MCOperand_CreateImm0(Inst, index); 4721 4722 return S; 4723 } 4724 4725 static DecodeStatus DecodeVST4LN(MCInst *Inst, unsigned Insn, 4726 uint64_t Address, const void *Decoder) 4727 { 4728 DecodeStatus S = MCDisassembler_Success; 4729 unsigned size, align = 0, index = 0, inc = 1; 4730 unsigned Rn = fieldFromInstruction_4(Insn, 16, 4); 4731 unsigned Rm = fieldFromInstruction_4(Insn, 0, 4); 4732 unsigned Rd = fieldFromInstruction_4(Insn, 12, 4); 4733 Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4; 4734 size = fieldFromInstruction_4(Insn, 10, 2); 4735 4736 switch (size) { 4737 default: 4738 return MCDisassembler_Fail; 4739 case 0: 4740 if (fieldFromInstruction_4(Insn, 4, 1)) 4741 align = 4; 4742 index = fieldFromInstruction_4(Insn, 5, 3); 4743 break; 4744 case 1: 4745 if (fieldFromInstruction_4(Insn, 4, 1)) 4746 align = 8; 4747 index = fieldFromInstruction_4(Insn, 6, 2); 4748 if (fieldFromInstruction_4(Insn, 5, 1)) 4749 inc = 2; 4750 break; 4751 case 2: 4752 switch (fieldFromInstruction_4(Insn, 4, 2)) { 4753 case 0: 4754 align = 0; break; 4755 case 3: 4756 return MCDisassembler_Fail; 4757 default: 4758 align = 4 << fieldFromInstruction_4(Insn, 4, 2); break; 4759 } 4760 4761 index = fieldFromInstruction_4(Insn, 7, 1); 4762 if (fieldFromInstruction_4(Insn, 6, 1)) 4763 inc = 2; 4764 break; 4765 } 4766 4767 if (Rm != 0xF) { // Writeback 4768 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 4769 return MCDisassembler_Fail; 4770 } 4771 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) 4772 return MCDisassembler_Fail; 4773 MCOperand_CreateImm0(Inst, align); 4774 if (Rm != 0xF) { 4775 if (Rm != 0xD) { 4776 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder))) 4777 return MCDisassembler_Fail; 4778 } else 4779 MCOperand_CreateReg0(Inst, 0); 4780 } 4781 4782 if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder))) 4783 return MCDisassembler_Fail; 4784 if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd+inc, Address, Decoder))) 4785 return MCDisassembler_Fail; 4786 if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd+2*inc, Address, Decoder))) 4787 return MCDisassembler_Fail; 4788 if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd+3*inc, Address, Decoder))) 4789 return MCDisassembler_Fail; 4790 MCOperand_CreateImm0(Inst, index); 4791 4792 return S; 4793 } 4794 4795 static DecodeStatus DecodeVMOVSRR(MCInst *Inst, unsigned Insn, 4796 uint64_t Address, const void *Decoder) 4797 { 4798 DecodeStatus S = MCDisassembler_Success; 4799 unsigned Rt = fieldFromInstruction_4(Insn, 12, 4); 4800 unsigned Rt2 = fieldFromInstruction_4(Insn, 16, 4); 4801 unsigned Rm = fieldFromInstruction_4(Insn, 5, 1); 4802 unsigned pred = fieldFromInstruction_4(Insn, 28, 4); 4803 Rm |= fieldFromInstruction_4(Insn, 0, 4) << 1; 4804 4805 if (Rt == 0xF || Rt2 == 0xF || Rm == 0x1F) 4806 S = MCDisassembler_SoftFail; 4807 4808 if (!Check(&S, DecodeSPRRegisterClass(Inst, Rm , Address, Decoder))) 4809 return MCDisassembler_Fail; 4810 if (!Check(&S, DecodeSPRRegisterClass(Inst, Rm+1, Address, Decoder))) 4811 return MCDisassembler_Fail; 4812 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt , Address, Decoder))) 4813 return MCDisassembler_Fail; 4814 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt2 , Address, Decoder))) 4815 return MCDisassembler_Fail; 4816 if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder))) 4817 return MCDisassembler_Fail; 4818 4819 return S; 4820 } 4821 4822 static DecodeStatus DecodeVMOVRRS(MCInst *Inst, unsigned Insn, 4823 uint64_t Address, const void *Decoder) 4824 { 4825 DecodeStatus S = MCDisassembler_Success; 4826 unsigned Rt = fieldFromInstruction_4(Insn, 12, 4); 4827 unsigned Rt2 = fieldFromInstruction_4(Insn, 16, 4); 4828 unsigned Rm = fieldFromInstruction_4(Insn, 5, 1); 4829 unsigned pred = fieldFromInstruction_4(Insn, 28, 4); 4830 Rm |= fieldFromInstruction_4(Insn, 0, 4) << 1; 4831 4832 if (Rt == 0xF || Rt2 == 0xF || Rm == 0x1F) 4833 S = MCDisassembler_SoftFail; 4834 4835 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt , Address, Decoder))) 4836 return MCDisassembler_Fail; 4837 if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt2 , Address, Decoder))) 4838 return MCDisassembler_Fail; 4839 if (!Check(&S, DecodeSPRRegisterClass(Inst, Rm , Address, Decoder))) 4840 return MCDisassembler_Fail; 4841 if (!Check(&S, DecodeSPRRegisterClass(Inst, Rm+1, Address, Decoder))) 4842 return MCDisassembler_Fail; 4843 if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder))) 4844 return MCDisassembler_Fail; 4845 4846 return S; 4847 } 4848 4849 static DecodeStatus DecodeIT(MCInst *Inst, unsigned Insn, 4850 uint64_t Address, const void *Decoder) 4851 { 4852 DecodeStatus S = MCDisassembler_Success; 4853 unsigned pred = fieldFromInstruction_4(Insn, 4, 4); 4854 unsigned mask = fieldFromInstruction_4(Insn, 0, 4); 4855 4856 if (pred == 0xF) { 4857 pred = 0xE; 4858 S = MCDisassembler_SoftFail; 4859 } 4860 4861 if (mask == 0x0) 4862 return MCDisassembler_Fail; 4863 4864 MCOperand_CreateImm0(Inst, pred); 4865 MCOperand_CreateImm0(Inst, mask); 4866 return S; 4867 } 4868 4869 static DecodeStatus DecodeT2LDRDPreInstruction(MCInst *Inst, unsigned Insn, 4870 uint64_t Address, const void *Decoder) 4871 { 4872 DecodeStatus S = MCDisassembler_Success; 4873 4874 unsigned Rt = fieldFromInstruction_4(Insn, 12, 4); 4875 unsigned Rt2 = fieldFromInstruction_4(Insn, 8, 4); 4876 unsigned Rn = fieldFromInstruction_4(Insn, 16, 4); 4877 unsigned addr = fieldFromInstruction_4(Insn, 0, 8); 4878 unsigned W = fieldFromInstruction_4(Insn, 21, 1); 4879 unsigned U = fieldFromInstruction_4(Insn, 23, 1); 4880 unsigned P = fieldFromInstruction_4(Insn, 24, 1); 4881 bool writeback = (W == 1) | (P == 0); 4882 4883 addr |= (U << 8) | (Rn << 9); 4884 4885 if (writeback && (Rn == Rt || Rn == Rt2)) 4886 Check(&S, MCDisassembler_SoftFail); 4887 if (Rt == Rt2) 4888 Check(&S, MCDisassembler_SoftFail); 4889 4890 // Rt 4891 if (!Check(&S, DecoderGPRRegisterClass(Inst, Rt, Address, Decoder))) 4892 return MCDisassembler_Fail; 4893 // Rt2 4894 if (!Check(&S, DecoderGPRRegisterClass(Inst, Rt2, Address, Decoder))) 4895 return MCDisassembler_Fail; 4896 // Writeback operand 4897 if (!Check(&S, DecoderGPRRegisterClass(Inst, Rn, Address, Decoder))) 4898 return MCDisassembler_Fail; 4899 // addr 4900 if (!Check(&S, DecodeT2AddrModeImm8s4(Inst, addr, Address, Decoder))) 4901 return MCDisassembler_Fail; 4902 4903 return S; 4904 } 4905 4906 static DecodeStatus DecodeT2STRDPreInstruction(MCInst *Inst, unsigned Insn, 4907 uint64_t Address, const void *Decoder) 4908 { 4909 DecodeStatus S = MCDisassembler_Success; 4910 4911 unsigned Rt = fieldFromInstruction_4(Insn, 12, 4); 4912 unsigned Rt2 = fieldFromInstruction_4(Insn, 8, 4); 4913 unsigned Rn = fieldFromInstruction_4(Insn, 16, 4); 4914 unsigned addr = fieldFromInstruction_4(Insn, 0, 8); 4915 unsigned W = fieldFromInstruction_4(Insn, 21, 1); 4916 unsigned U = fieldFromInstruction_4(Insn, 23, 1); 4917 unsigned P = fieldFromInstruction_4(Insn, 24, 1); 4918 bool writeback = (W == 1) | (P == 0); 4919 4920 addr |= (U << 8) | (Rn << 9); 4921 4922 if (writeback && (Rn == Rt || Rn == Rt2)) 4923 Check(&S, MCDisassembler_SoftFail); 4924 4925 // Writeback operand 4926 if (!Check(&S, DecoderGPRRegisterClass(Inst, Rn, Address, Decoder))) 4927 return MCDisassembler_Fail; 4928 // Rt 4929 if (!Check(&S, DecoderGPRRegisterClass(Inst, Rt, Address, Decoder))) 4930 return MCDisassembler_Fail; 4931 // Rt2 4932 if (!Check(&S, DecoderGPRRegisterClass(Inst, Rt2, Address, Decoder))) 4933 return MCDisassembler_Fail; 4934 // addr 4935 if (!Check(&S, DecodeT2AddrModeImm8s4(Inst, addr, Address, Decoder))) 4936 return MCDisassembler_Fail; 4937 4938 return S; 4939 } 4940 4941 static DecodeStatus DecodeT2Adr(MCInst *Inst, uint32_t Insn, 4942 uint64_t Address, const void *Decoder) 4943 { 4944 unsigned Val; 4945 unsigned sign1 = fieldFromInstruction_4(Insn, 21, 1); 4946 unsigned sign2 = fieldFromInstruction_4(Insn, 23, 1); 4947 if (sign1 != sign2) return MCDisassembler_Fail; 4948 4949 Val = fieldFromInstruction_4(Insn, 0, 8); 4950 Val |= fieldFromInstruction_4(Insn, 12, 3) << 8; 4951 Val |= fieldFromInstruction_4(Insn, 26, 1) << 11; 4952 Val |= sign1 << 12; 4953 MCOperand_CreateImm0(Inst, SignExtend32(Val, 13)); 4954 4955 return MCDisassembler_Success; 4956 } 4957 4958 static DecodeStatus DecodeT2ShifterImmOperand(MCInst *Inst, uint32_t Val, 4959 uint64_t Address, const void *Decoder) 4960 { 4961 DecodeStatus S = MCDisassembler_Success; 4962 4963 // Shift of "asr #32" is not allowed in Thumb2 mode. 4964 if (Val == 0x20) S = MCDisassembler_SoftFail; 4965 MCOperand_CreateImm0(Inst, Val); 4966 return S; 4967 } 4968 4969 static DecodeStatus DecodeSwap(MCInst *Inst, unsigned Insn, 4970 uint64_t Address, const void *Decoder) 4971 { 4972 DecodeStatus S; 4973 4974 unsigned Rt = fieldFromInstruction_4(Insn, 12, 4); 4975 unsigned Rt2 = fieldFromInstruction_4(Insn, 0, 4); 4976 unsigned Rn = fieldFromInstruction_4(Insn, 16, 4); 4977 unsigned pred = fieldFromInstruction_4(Insn, 28, 4); 4978 4979 if (pred == 0xF) 4980 return DecodeCPSInstruction(Inst, Insn, Address, Decoder); 4981 4982 S = MCDisassembler_Success; 4983 4984 if (Rt == Rn || Rn == Rt2) 4985 S = MCDisassembler_SoftFail; 4986 4987 if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rt, Address, Decoder))) 4988 return MCDisassembler_Fail; 4989 if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rt2, Address, Decoder))) 4990 return MCDisassembler_Fail; 4991 if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rn, Address, Decoder))) 4992 return MCDisassembler_Fail; 4993 if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder))) 4994 return MCDisassembler_Fail; 4995 4996 return S; 4997 } 4998 4999 static DecodeStatus DecodeVCVTD(MCInst *Inst, unsigned Insn, 5000 uint64_t Address, const void *Decoder) 5001 { 5002 DecodeStatus S = MCDisassembler_Success; 5003 unsigned Vm, imm, cmode, op; 5004 unsigned Vd = (fieldFromInstruction_4(Insn, 12, 4) << 0); 5005 Vd |= (fieldFromInstruction_4(Insn, 22, 1) << 4); 5006 Vm = (fieldFromInstruction_4(Insn, 0, 4) << 0); 5007 Vm |= (fieldFromInstruction_4(Insn, 5, 1) << 4); 5008 imm = fieldFromInstruction_4(Insn, 16, 6); 5009 cmode = fieldFromInstruction_4(Insn, 8, 4); 5010 op = fieldFromInstruction_4(Insn, 5, 1); 5011 5012 // VMOVv2f32 is ambiguous with these decodings. 5013 if (!(imm & 0x38) && cmode == 0xF) { 5014 if (op == 1) return MCDisassembler_Fail; 5015 MCInst_setOpcode(Inst, ARM_VMOVv2f32); 5016 return DecodeNEONModImmInstruction(Inst, Insn, Address, Decoder); 5017 } 5018 5019 if (!(imm & 0x20)) return MCDisassembler_Fail; 5020 5021 if (!Check(&S, DecodeDPRRegisterClass(Inst, Vd, Address, Decoder))) 5022 return MCDisassembler_Fail; 5023 if (!Check(&S, DecodeDPRRegisterClass(Inst, Vm, Address, Decoder))) 5024 return MCDisassembler_Fail; 5025 MCOperand_CreateImm0(Inst, 64 - imm); 5026 5027 return S; 5028 } 5029 5030 static DecodeStatus DecodeVCVTQ(MCInst *Inst, unsigned Insn, 5031 uint64_t Address, const void *Decoder) 5032 { 5033 DecodeStatus S = MCDisassembler_Success; 5034 unsigned Vm, imm, cmode, op; 5035 unsigned Vd = (fieldFromInstruction_4(Insn, 12, 4) << 0); 5036 Vd |= (fieldFromInstruction_4(Insn, 22, 1) << 4); 5037 Vm = (fieldFromInstruction_4(Insn, 0, 4) << 0); 5038 Vm |= (fieldFromInstruction_4(Insn, 5, 1) << 4); 5039 imm = fieldFromInstruction_4(Insn, 16, 6); 5040 cmode = fieldFromInstruction_4(Insn, 8, 4); 5041 op = fieldFromInstruction_4(Insn, 5, 1); 5042 5043 // VMOVv4f32 is ambiguous with these decodings. 5044 if (!(imm & 0x38) && cmode == 0xF) { 5045 if (op == 1) return MCDisassembler_Fail; 5046 MCInst_setOpcode(Inst, ARM_VMOVv4f32); 5047 return DecodeNEONModImmInstruction(Inst, Insn, Address, Decoder); 5048 } 5049 5050 if (!(imm & 0x20)) return MCDisassembler_Fail; 5051 5052 if (!Check(&S, DecodeQPRRegisterClass(Inst, Vd, Address, Decoder))) 5053 return MCDisassembler_Fail; 5054 if (!Check(&S, DecodeQPRRegisterClass(Inst, Vm, Address, Decoder))) 5055 return MCDisassembler_Fail; 5056 MCOperand_CreateImm0(Inst, 64 - imm); 5057 5058 return S; 5059 } 5060 5061 static DecodeStatus DecodeLDR(MCInst *Inst, unsigned Val, 5062 uint64_t Address, const void *Decoder) 5063 { 5064 DecodeStatus S = MCDisassembler_Success; 5065 unsigned Cond; 5066 unsigned Rn = fieldFromInstruction_4(Val, 16, 4); 5067 unsigned Rt = fieldFromInstruction_4(Val, 12, 4); 5068 unsigned Rm = fieldFromInstruction_4(Val, 0, 4); 5069 Rm |= (fieldFromInstruction_4(Val, 23, 1) << 4); 5070 Cond = fieldFromInstruction_4(Val, 28, 4); 5071 5072 if (fieldFromInstruction_4(Val, 8, 4) != 0 || Rn == Rt) 5073 S = MCDisassembler_SoftFail; 5074 5075 if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rt, Address, Decoder))) 5076 return MCDisassembler_Fail; 5077 if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rn, Address, Decoder))) 5078 return MCDisassembler_Fail; 5079 if (!Check(&S, DecodeAddrMode7Operand(Inst, Rn, Address, Decoder))) 5080 return MCDisassembler_Fail; 5081 if (!Check(&S, DecodePostIdxReg(Inst, Rm, Address, Decoder))) 5082 return MCDisassembler_Fail; 5083 if (!Check(&S, DecodePredicateOperand(Inst, Cond, Address, Decoder))) 5084 return MCDisassembler_Fail; 5085 5086 return S; 5087 } 5088 5089 static DecodeStatus DecodeMRRC2(MCInst *Inst, unsigned Val, 5090 uint64_t Address, const void *Decoder) 5091 { 5092 5093 DecodeStatus S = MCDisassembler_Success; 5094 5095 unsigned CRm = fieldFromInstruction_4(Val, 0, 4); 5096 unsigned opc1 = fieldFromInstruction_4(Val, 4, 4); 5097 unsigned cop = fieldFromInstruction_4(Val, 8, 4); 5098 unsigned Rt = fieldFromInstruction_4(Val, 12, 4); 5099 unsigned Rt2 = fieldFromInstruction_4(Val, 16, 4); 5100 5101 if ((cop & ~0x1) == 0xa) 5102 return MCDisassembler_Fail; 5103 5104 if (Rt == Rt2) 5105 S = MCDisassembler_SoftFail; 5106 5107 MCOperand_CreateImm0(Inst, cop); 5108 MCOperand_CreateImm0(Inst, opc1); 5109 if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rt, Address, Decoder))) 5110 return MCDisassembler_Fail; 5111 if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rt2, Address, Decoder))) 5112 return MCDisassembler_Fail; 5113 MCOperand_CreateImm0(Inst, CRm); 5114 5115 return S; 5116 } 5117 5118 #endif 5119