17 #ifdef CAPSTONE_HAS_ARM
28 #include "../../MCInst.h"
29 #include "../../SStream.h"
30 #include "../../MCRegisterInfo.h"
31 #include "../../utils.h"
34 #define GET_SUBTARGETINFO_ENUM
35 #include "ARMGenSubtargetInfo.inc"
42 static void printOperand(
MCInst *MI,
unsigned OpNo,
SStream *O);
43 static void printSORegRegOperand(
MCInst *MI,
unsigned OpNum,
SStream *O);
44 static void printSORegImmOperand(
MCInst *MI,
unsigned OpNum,
SStream *O);
46 static void printAddrModeTBB(
MCInst *MI,
unsigned OpNum,
SStream *O);
47 static void printAddrModeTBH(
MCInst *MI,
unsigned OpNum,
SStream *O);
48 static void printAddrMode2Operand(
MCInst *MI,
unsigned OpNum,
SStream *O);
49 static void printAM2PreOrOffsetIndexOp(
MCInst *MI,
unsigned OpNum,
SStream *O);
50 static void printAddrMode2OffsetOperand(
MCInst *MI,
unsigned OpNum,
SStream *O);
51 static void printAddrMode3Operand(
MCInst *MI,
unsigned OpNum,
SStream *O,
bool AlwaysPrintImm0);
52 static void printAddrMode3OffsetOperand(
MCInst *MI,
unsigned OpNum,
SStream *O);
53 static void printAM3PreOrOffsetIndexOp(
MCInst *MI,
unsigned Op,
SStream *O,
bool AlwaysPrintImm0);
54 static void printPostIdxImm8Operand(
MCInst *MI,
unsigned OpNum,
SStream *O);
55 static void printPostIdxRegOperand(
MCInst *MI,
unsigned OpNum,
SStream *O);
56 static void printPostIdxImm8s4Operand(
MCInst *MI,
unsigned OpNum,
SStream *O);
57 static void printAddrMode5Operand(
MCInst *MI,
unsigned OpNum,
SStream *O,
bool AlwaysPrintImm0);
58 static void printAddrMode6Operand(
MCInst *MI,
unsigned OpNum,
SStream *O);
59 static void printAddrMode7Operand(
MCInst *MI,
unsigned OpNum,
SStream *O);
60 static void printAddrMode6OffsetOperand(
MCInst *MI,
unsigned OpNum,
SStream *O);
62 static void printBitfieldInvMaskImmOperand(
MCInst *MI,
unsigned OpNum,
SStream *O);
63 static void printMemBOption(
MCInst *MI,
unsigned OpNum,
SStream *O);
64 static void printShiftImmOperand(
MCInst *MI,
unsigned OpNum,
SStream *O);
65 static void printPKHLSLShiftImm(
MCInst *MI,
unsigned OpNum,
SStream *O);
66 static void printPKHASRShiftImm(
MCInst *MI,
unsigned OpNum,
SStream *O);
67 static void printAdrLabelOperand(
MCInst *MI,
unsigned OpNum,
SStream *O,
unsigned);
68 static void printThumbS4ImmOperand(
MCInst *MI,
unsigned OpNum,
SStream *O);
69 static void printThumbSRImm(
MCInst *MI,
unsigned OpNum,
SStream *O);
70 static void printThumbITMask(
MCInst *MI,
unsigned OpNum,
SStream *O);
71 static void printThumbAddrModeRROperand(
MCInst *MI,
unsigned OpNum,
SStream *O);
72 static void printThumbAddrModeImm5SOperand(
MCInst *MI,
unsigned OpNum,
SStream *O,
unsigned Scale);
73 static void printThumbAddrModeImm5S1Operand(
MCInst *MI,
unsigned OpNum,
SStream *O);
74 static void printThumbAddrModeImm5S2Operand(
MCInst *MI,
unsigned OpNum,
SStream *O);
75 static void printThumbAddrModeImm5S4Operand(
MCInst *MI,
unsigned OpNum,
SStream *O);
76 static void printThumbAddrModeSPOperand(
MCInst *MI,
unsigned OpNum,
SStream *O);
77 static void printT2SOOperand(
MCInst *MI,
unsigned OpNum,
SStream *O);
78 static void printAddrModeImm12Operand(
MCInst *MI,
unsigned OpNum,
SStream *O,
bool AlwaysPrintImm0);
79 static void printT2AddrModeImm8Operand(
MCInst *MI,
unsigned OpNum,
SStream *O,
bool);
80 static void printT2AddrModeImm8s4Operand(
MCInst *MI,
unsigned OpNum,
SStream *O,
bool);
81 static void printT2AddrModeImm0_1020s4Operand(
MCInst *MI,
unsigned OpNum,
SStream *O);
82 static void printT2AddrModeImm8OffsetOperand(
MCInst *MI,
unsigned OpNum,
SStream *O);
83 static void printT2AddrModeImm8s4OffsetOperand(
MCInst *MI,
unsigned OpNum,
SStream *O);
84 static void printT2AddrModeSoRegOperand(
MCInst *MI,
unsigned OpNum,
SStream *O);
85 static void printSetendOperand(
MCInst *MI,
unsigned OpNum,
SStream *O);
86 static void printCPSIMod(
MCInst *MI,
unsigned OpNum,
SStream *O);
87 static void printCPSIFlag(
MCInst *MI,
unsigned OpNum,
SStream *O);
88 static void printMSRMaskOperand(
MCInst *MI,
unsigned OpNum,
SStream *O);
89 static void printPredicateOperand(
MCInst *MI,
unsigned OpNum,
SStream *O);
90 static void printMandatoryPredicateOperand(
MCInst *MI,
unsigned OpNum,
SStream *O);
91 static void printSBitModifierOperand(
MCInst *MI,
unsigned OpNum,
SStream *O);
92 static void printRegisterList(
MCInst *MI,
unsigned OpNum,
SStream *O);
93 static void printNoHashImmediate(
MCInst *MI,
unsigned OpNum,
SStream *O);
94 static void printPImmediate(
MCInst *MI,
unsigned OpNum,
SStream *O);
95 static void printCImmediate(
MCInst *MI,
unsigned OpNum,
SStream *O);
96 static void printCoprocOptionImm(
MCInst *MI,
unsigned OpNum,
SStream *O);
97 static void printFPImmOperand(
MCInst *MI,
unsigned OpNum,
SStream *O);
98 static void printNEONModImmOperand(
MCInst *MI,
unsigned OpNum,
SStream *O);
99 static void printImmPlusOneOperand(
MCInst *MI,
unsigned OpNum,
SStream *O);
100 static void printRotImmOperand(
MCInst *MI,
unsigned OpNum,
SStream *O);
102 static void printThumbLdrLabelOperand(
MCInst *MI,
unsigned OpNum,
SStream *O);
103 static void printFBits16(
MCInst *MI,
unsigned OpNum,
SStream *O);
104 static void printFBits32(
MCInst *MI,
unsigned OpNum,
SStream *O);
105 static void printVectorIndex(
MCInst *MI,
unsigned OpNum,
SStream *O);
106 static void printVectorListOne(
MCInst *MI,
unsigned OpNum,
SStream *O);
109 static void printVectorListThree(
MCInst *MI,
unsigned OpNum,
SStream *O);
110 static void printVectorListFour(
MCInst *MI,
unsigned OpNum,
SStream *O);
111 static void printVectorListOneAllLanes(
MCInst *MI,
unsigned OpNum,
SStream *O);
113 static void printVectorListThreeAllLanes(
MCInst *MI,
unsigned OpNum,
SStream *O);
114 static void printVectorListFourAllLanes(
MCInst *MI,
unsigned OpNum,
SStream *O);
116 static void printVectorListThreeSpacedAllLanes(
MCInst *MI,
unsigned OpNum,
SStream *O);
117 static void printVectorListFourSpacedAllLanes(
MCInst *MI,
unsigned OpNum,
SStream *O);
118 static void printVectorListThreeSpaced(
MCInst *MI,
unsigned OpNum,
SStream *O);
119 static void printVectorListFourSpaced(
MCInst *MI,
unsigned OpNum,
SStream *O);
120 static void printBankedRegOperand(
MCInst *MI,
unsigned OpNum,
SStream *O);
121 static void printModImmOperand(
MCInst *MI,
unsigned OpNum,
SStream *O);
123 static void printInstSyncBOption(
MCInst *MI,
unsigned OpNum,
SStream *O);
125 #ifndef CAPSTONE_DIET
145 #ifndef CAPSTONE_DIET
152 MI->
flat_insn->detail->arm.operands[MI->
flat_insn->detail->arm.op_count].mem.scale = 1;
153 MI->
flat_insn->detail->arm.operands[MI->
flat_insn->detail->arm.op_count].mem.disp = 0;
155 #ifndef CAPSTONE_DIET
175 #define GET_INSTRINFO_ENUM
176 #include "ARMGenInstrInfo.inc"
179 #include "ARMGenAsmWriter.inc"
184 handle->get_regname = getRegisterName2;
187 handle->get_regname = getRegisterName;
195 static unsigned translateShiftImm(
unsigned imm)
225 MI->
flat_insn->detail->arm.operands[MI->
flat_insn->detail->arm.op_count].shift.value = translateShiftImm(ShImm);
227 MI->
flat_insn->detail->arm.operands[MI->
flat_insn->detail->arm.op_count - 1].shift.value = translateShiftImm(ShImm);
234 #ifndef CAPSTONE_DIET
239 static const name_map insn_update_flgs[] = {
279 if (mci->
writeback || (strrchr(insn_asm,
'!')) != NULL) {
280 insn->detail->arm.writeback =
true;
287 case ARM_t2LDC2L_PRE:
295 case ARM_t2LDRSB_PRE:
296 case ARM_t2LDRSH_PRE:
299 case ARM_t2STC2L_PRE:
309 case ARM_t2LDC2L_POST:
310 case ARM_t2LDC2_POST:
311 case ARM_t2LDCL_POST:
314 case ARM_t2LDRB_POST:
315 case ARM_t2LDRD_POST:
316 case ARM_t2LDRH_POST:
317 case ARM_t2LDRSB_POST:
318 case ARM_t2LDRSH_POST:
321 case ARM_t2STC2L_POST:
322 case ARM_t2STC2_POST:
323 case ARM_t2STCL_POST:
326 case ARM_t2STRB_POST:
327 case ARM_t2STRD_POST:
328 case ARM_t2STRH_POST:
330 insn->detail->arm.writeback =
true;
377 case ARM_LDRB_POST_IMM:
378 case ARM_LDR_POST_IMM:
379 case ARM_LDR_POST_REG:
380 case ARM_STRB_POST_IMM:
382 case ARM_STR_POST_IMM:
383 case ARM_STR_POST_REG:
385 insn->detail->arm.writeback =
true;
391 if (insn->detail->arm.update_flags ==
false) {
396 if (insn->id == insn_update_flgs[
i].id &&
397 !strncmp(insn_asm, insn_update_flgs[
i].
name,
398 strlen(insn_update_flgs[
i].
name))) {
399 insn->detail->arm.update_flags =
true;
401 for (j = 0;
j <
ARR_SIZE(insn->detail->regs_write);
j++) {
402 if (insn->detail->regs_write[j] == 0) {
423 insn->detail->arm.operands[0].type =
ARM_OP_REG;
424 insn->detail->arm.operands[0].reg =
ARM_REG_PC;
425 insn->detail->arm.operands[0].access =
CS_AC_WRITE;
426 insn->detail->arm.operands[1].type =
ARM_OP_REG;
427 insn->detail->arm.operands[1].reg =
ARM_REG_LR;
428 insn->detail->arm.operands[1].access =
CS_AC_READ;
429 insn->detail->arm.op_count = 2;
461 printInstruction(MI, O, MRI);
464 printPredicateOperand(MI, 1, O);
465 if (Opcode == ARM_t2HINT)
502 printSBitModifierOperand(MI, 6, O);
503 printPredicateOperand(MI, 4, O);
564 printSBitModifierOperand(MI, 5, O);
565 printPredicateOperand(MI, 3, O);
594 MI->
flat_insn->detail->arm.operands[MI->
flat_insn->detail->arm.op_count - 1].shift.type =
603 case ARM_t2STMDB_UPD:
609 printPredicateOperand(MI, 2, O);
610 if (Opcode == ARM_t2STMDB_UPD)
616 MI->
flat_insn->detail->regs_read_count++;
618 MI->
flat_insn->detail->regs_write_count++;
621 printRegisterList(MI, 4, O);
626 case ARM_STR_PRE_IMM:
631 printPredicateOperand(MI, 4, O);
635 #ifndef CAPSTONE_DIET
640 #ifndef CAPSTONE_DIET
654 case ARM_t2LDMIA_UPD:
660 printPredicateOperand(MI, 2, O);
661 if (Opcode == ARM_t2LDMIA_UPD)
668 MI->
flat_insn->detail->regs_read_count++;
670 MI->
flat_insn->detail->regs_write_count++;
673 printRegisterList(MI, 4, O);
678 case ARM_LDR_POST_IMM:
686 printPredicateOperand(MI, 5, O);
696 MI->
flat_insn->detail->regs_read_count++;
698 MI->
flat_insn->detail->regs_write_count++;
707 case ARM_VSTMSDB_UPD:
708 case ARM_VSTMDDB_UPD:
712 printPredicateOperand(MI, 2, O);
714 printRegisterList(MI, 4, O);
720 case ARM_VLDMSIA_UPD:
721 case ARM_VLDMDIA_UPD:
725 printPredicateOperand(MI, 2, O);
727 printRegisterList(MI, 4, O);
733 bool Writeback =
true;
744 printPredicateOperand(MI, 1, O);
746 printRegName(MI->
csh, O, BaseReg);
749 MI->
flat_insn->detail->arm.operands[MI->
flat_insn->detail->arm.op_count].reg = BaseReg;
758 printRegisterList(MI, 3, O);
773 bool isStore = Opcode == ARM_STREXD || Opcode == ARM_STLEXD;
792 printInstruction(&NewMI, O, MRI);
800 case ARM_t2SUBS_PC_LR: {
808 printPredicateOperand(MI, 1, O);
817 printInstruction(MI, O, MRI);
820 static void printOperand(
MCInst *MI,
unsigned OpNo,
SStream *O)
826 printRegName(MI->
csh, O,
Reg);
834 #ifndef CAPSTONE_DIET
840 #ifndef CAPSTONE_DIET
866 #define _ALIGN_DOWN(v, align_width) ((v/align_width)*align_width)
867 address = _ALIGN_DOWN(address, 4);
897 MI->
flat_insn->detail->arm.operands[MI->
flat_insn->detail->arm.op_count].mem.disp = imm;
907 static void printThumbLdrLabelOperand(
MCInst *MI,
unsigned OpNum,
SStream *O)
932 MI->
flat_insn->detail->arm.operands[MI->
flat_insn->detail->arm.op_count].mem.scale = 1;
933 MI->
flat_insn->detail->arm.operands[MI->
flat_insn->detail->arm.op_count].mem.disp = OffImm;
944 static void printSORegRegOperand(
MCInst *MI,
unsigned OpNum,
SStream *O)
976 static void printSORegImmOperand(
MCInst *MI,
unsigned OpNum,
SStream *O)
1000 static void printAM2PreOrOffsetIndexOp(
MCInst *MI,
unsigned Op,
SStream *O)
1008 set_mem_access(MI,
true);
1032 set_mem_access(MI,
false);
1047 set_mem_access(MI,
false);
1050 static void printAddrModeTBB(
MCInst *MI,
unsigned Op,
SStream *O)
1055 set_mem_access(MI,
true);
1064 set_mem_access(MI,
false);
1067 static void printAddrModeTBH(
MCInst *MI,
unsigned Op,
SStream *O)
1072 set_mem_access(MI,
true);
1083 MI->
flat_insn->detail->arm.operands[MI->
flat_insn->detail->arm.op_count].shift.value = 1;
1084 MI->
flat_insn->detail->arm.operands[MI->
flat_insn->detail->arm.op_count].mem.lshift = 1;
1086 set_mem_access(MI,
false);
1089 static void printAddrMode2Operand(
MCInst *MI,
unsigned Op,
SStream *O)
1094 printOperand(MI, Op, O);
1098 printAM2PreOrOffsetIndexOp(MI, Op, O);
1101 static void printAddrMode2OffsetOperand(
MCInst *MI,
unsigned OpNum,
SStream *O)
1117 MI->
flat_insn->detail->arm.operands[MI->
flat_insn->detail->arm.op_count].imm = ImmOffs;
1142 static void printAM3PreOrOffsetIndexOp(
MCInst *MI,
unsigned Op,
SStream *O,
1143 bool AlwaysPrintImm0)
1152 set_mem_access(MI,
true);
1164 MI->
flat_insn->detail->arm.operands[MI->
flat_insn->detail->arm.op_count].mem.scale = -1;
1165 MI->
flat_insn->detail->arm.operands[MI->
flat_insn->detail->arm.op_count].subtracted =
true;
1169 set_mem_access(MI,
false);
1176 if (AlwaysPrintImm0 || ImmOffs || (sign ==
ARM_AM_sub)) {
1186 MI->
flat_insn->detail->arm.operands[MI->
flat_insn->detail->arm.op_count].subtracted =
true;
1192 set_mem_access(MI,
false);
1195 static void printAddrMode3Operand(
MCInst *MI,
unsigned Op,
SStream *O,
1196 bool AlwaysPrintImm0)
1200 printOperand(MI, Op, O);
1204 printAM3PreOrOffsetIndexOp(MI, Op, O, AlwaysPrintImm0);
1207 static void printAddrMode3OffsetOperand(
MCInst *MI,
unsigned OpNum,
SStream *O)
1234 MI->
flat_insn->detail->arm.operands[MI->
flat_insn->detail->arm.op_count].imm = ImmOffs;
1240 static void printPostIdxImm8Operand(
MCInst *MI,
unsigned OpNum,
SStream *O)
1245 SStream_concat(O,
"#%s0x%x", ((Imm & 256) ?
"" :
"-"), (Imm & 0xff));
1247 SStream_concat(O,
"#%s%u", ((Imm & 256) ?
"" :
"-"), (Imm & 0xff));
1250 MI->
flat_insn->detail->arm.operands[MI->
flat_insn->detail->arm.op_count].imm = Imm & 0xff;
1255 static void printPostIdxRegOperand(
MCInst *MI,
unsigned OpNum,
SStream *O)
1270 static void printPostIdxImm8s4Operand(
MCInst *MI,
unsigned OpNum,
SStream *O)
1276 SStream_concat(O,
"#%s0x%x", ((Imm & 256) ?
"" :
"-"), ((Imm & 0xff) << 2));
1278 SStream_concat(O,
"#%s%u", ((Imm & 256) ?
"" :
"-"), ((Imm & 0xff) << 2));
1282 int v = (Imm & 256) ? ((Imm & 0xff) << 2) : -((Imm & 0xff) << 2);
1289 static void printAddrMode5Operand(
MCInst *MI,
unsigned OpNum,
SStream *O,
1290 bool AlwaysPrintImm0)
1298 printOperand(MI, OpNum, O);
1309 MI->
flat_insn->detail->arm.operands[MI->
flat_insn->detail->arm.op_count].mem.scale = 1;
1310 MI->
flat_insn->detail->arm.operands[MI->
flat_insn->detail->arm.op_count].mem.disp = 0;
1315 if (AlwaysPrintImm0 || ImmOffs || subtracted ==
ARM_AM_sub) {
1326 MI->
flat_insn->detail->arm.operands[MI->
flat_insn->detail->arm.op_count].mem.disp = ImmOffs * 4;
1328 MI->
flat_insn->detail->arm.operands[MI->
flat_insn->detail->arm.op_count].mem.disp = -(
int)ImmOffs * 4;
1338 static void printAddrMode6Operand(
MCInst *MI,
unsigned OpNum,
SStream *O)
1345 set_mem_access(MI,
true);
1359 set_mem_access(MI,
false);
1362 static void printAddrMode7Operand(
MCInst *MI,
unsigned OpNum,
SStream *O)
1366 set_mem_access(MI,
true);
1371 set_mem_access(MI,
false);
1374 static void printAddrMode6OffsetOperand(
MCInst *MI,
unsigned OpNum,
SStream *O)
1392 static void printBitfieldInvMaskImmOperand(
MCInst *MI,
unsigned OpNum,
SStream *O)
1417 static void printMemBOption(
MCInst *MI,
unsigned OpNum,
SStream *O)
1428 void printInstSyncBOption(
MCInst *MI,
unsigned OpNum,
SStream *O)
1434 static void printShiftImmOperand(
MCInst *MI,
unsigned OpNum,
SStream *O)
1437 bool isASR = (ShiftOp & (1 << 5)) != 0;
1438 unsigned Amt = ShiftOp & 0x1f;
1440 unsigned tmp = Amt == 0 ? 32 : Amt;
1456 MI->
flat_insn->detail->arm.operands[MI->
flat_insn->detail->arm.op_count - 1].shift.value = Amt;
1461 static void printPKHLSLShiftImm(
MCInst *MI,
unsigned OpNum,
SStream *O)
1473 MI->
flat_insn->detail->arm.operands[MI->
flat_insn->detail->arm.op_count - 1].shift.value = Imm;
1477 static void printPKHASRShiftImm(
MCInst *MI,
unsigned OpNum,
SStream *O)
1490 MI->
flat_insn->detail->arm.operands[MI->
flat_insn->detail->arm.op_count - 1].shift.value = Imm;
1495 static void printRegisterList(
MCInst *MI,
unsigned OpNum,
SStream *O)
1498 #ifndef CAPSTONE_DIET
1504 #ifndef CAPSTONE_DIET
1516 #ifndef CAPSTONE_DIET
1524 #ifndef CAPSTONE_DIET
1531 static void printGPRPairOperand(
MCInst *MI,
unsigned OpNum,
SStream *O,
1551 static void printSetendOperand(
MCInst *MI,
unsigned OpNum,
SStream *O)
1571 static void printCPSIMod(
MCInst *MI,
unsigned OpNum,
SStream *O)
1583 static void printCPSIFlag(
MCInst *MI,
unsigned OpNum,
SStream *O)
1589 for (
i = 2;
i >= 0; --
i)
1590 if (IFlags & (1 <<
i)) {
1600 MI->
flat_insn->detail->arm.cps_flag = IFlags;
1604 static void printMSRMaskOperand(
MCInst *MI,
unsigned OpNum,
SStream *O)
1612 if (FeatureBits & ARM_FeatureMClass) {
1617 if (Opcode == ARM_t2MSR_M && (FeatureBits & ARM_FeatureDSPThumb2)) {
1633 if (Opcode == ARM_t2MSR_M && (FeatureBits & ARM_HasV7Ops)) {
1666 if (!SpecRegRBit && (Mask == 8 || Mask == 4 || Mask == 12)) {
1730 static void printBankedRegOperand(
MCInst *MI,
unsigned OpNum,
SStream *O)
1736 "r8_usr",
"r9_usr",
"r10_usr",
"r11_usr",
"r12_usr",
"sp_usr",
"lr_usr",
"",
1737 "r8_fiq",
"r9_fiq",
"r10_fiq",
"r11_fiq",
"r12_fiq",
"sp_fiq",
"lr_fiq",
"",
1738 "lr_irq",
"sp_irq",
"lr_svc",
"sp_svc",
"lr_abt",
"sp_abt",
"lr_und",
"sp_und",
1739 "",
"",
"",
"",
"lr_mon",
"sp_mon",
"elr_hyp",
"sp_hyp"
1778 static void printPredicateOperand(
MCInst *MI,
unsigned OpNum,
SStream *O)
1782 if ((
unsigned)
CC == 15) {
1796 static void printMandatoryPredicateOperand(
MCInst *MI,
unsigned OpNum,
SStream *O)
1804 static void printSBitModifierOperand(
MCInst *MI,
unsigned OpNum,
SStream *O)
1811 MI->
flat_insn->detail->arm.update_flags =
true;
1815 static void printNoHashImmediate(
MCInst *MI,
unsigned OpNum,
SStream *O)
1832 static void printPImmediate(
MCInst *MI,
unsigned OpNum,
SStream *O)
1844 static void printCImmediate(
MCInst *MI,
unsigned OpNum,
SStream *O)
1856 static void printCoprocOptionImm(
MCInst *MI,
unsigned OpNum,
SStream *O)
1870 static void printAdrLabelOperand(
MCInst *MI,
unsigned OpNum,
SStream *O,
unsigned scale)
1894 MI->
flat_insn->detail->arm.operands[MI->
flat_insn->detail->arm.op_count].imm = OffImm;
1900 static void printThumbS4ImmOperand(
MCInst *MI,
unsigned OpNum,
SStream *O)
1913 static void printThumbSRImm(
MCInst *MI,
unsigned OpNum,
SStream *O)
1916 unsigned tmp = Imm == 0 ? 32 : Imm;
1927 static void printThumbITMask(
MCInst *MI,
unsigned OpNum,
SStream *O)
1932 unsigned CondBit0 = Firstcond & 1;
1937 bool T = ((Mask >>
Pos) & 1) == CondBit0;
1945 static void printThumbAddrModeRROperand(
MCInst *MI,
unsigned Op,
SStream *O)
1952 printOperand(MI, Op, O);
1957 set_mem_access(MI,
true);
1964 printRegName(MI->
csh, O, RegNum);
1966 MI->
flat_insn->detail->arm.operands[MI->
flat_insn->detail->arm.op_count].mem.index = RegNum;
1969 set_mem_access(MI,
false);
1972 static void printThumbAddrModeImm5SOperand(
MCInst *MI,
unsigned Op,
SStream *O,
1977 unsigned ImmOffs,
tmp;
1980 printOperand(MI, Op, O);
1985 set_mem_access(MI,
true);
1991 tmp = ImmOffs * Scale;
1998 set_mem_access(MI,
false);
2001 static void printThumbAddrModeImm5S1Operand(
MCInst *MI,
unsigned Op,
SStream *O)
2003 printThumbAddrModeImm5SOperand(MI, Op, O, 1);
2006 static void printThumbAddrModeImm5S2Operand(
MCInst *MI,
unsigned Op,
SStream *O)
2008 printThumbAddrModeImm5SOperand(MI, Op, O, 2);
2011 static void printThumbAddrModeImm5S4Operand(
MCInst *MI,
unsigned Op,
SStream *O)
2013 printThumbAddrModeImm5SOperand(MI, Op, O, 4);
2016 static void printThumbAddrModeSPOperand(
MCInst *MI,
unsigned Op,
SStream *O)
2018 printThumbAddrModeImm5SOperand(MI, Op, O, 4);
2025 static void printT2SOOperand(
MCInst *MI,
unsigned OpNum,
SStream *O)
2031 printRegName(MI->
csh, O,
Reg);
2045 static void printAddrModeImm12Operand(
MCInst *MI,
unsigned OpNum,
2046 SStream *O,
bool AlwaysPrintImm0)
2054 printOperand(MI, OpNum, O);
2059 set_mem_access(MI,
true);
2075 }
else if (AlwaysPrintImm0 || OffImm > 0) {
2089 MI->
flat_insn->detail->arm.operands[MI->
flat_insn->detail->arm.op_count].mem.disp = OffImm;
2091 set_mem_access(MI,
false);
2094 static void printT2AddrModeImm8Operand(
MCInst *MI,
unsigned OpNum,
SStream *O,
2095 bool AlwaysPrintImm0)
2103 set_mem_access(MI,
true);
2117 else if (AlwaysPrintImm0 || OffImm > 0) {
2125 MI->
flat_insn->detail->arm.operands[MI->
flat_insn->detail->arm.op_count].mem.disp = OffImm;
2127 set_mem_access(MI,
false);
2130 static void printT2AddrModeImm8s4Operand(
MCInst *MI,
2131 unsigned OpNum,
SStream *O,
bool AlwaysPrintImm0)
2139 printOperand(MI, OpNum, O);
2144 set_mem_access(MI,
true);
2159 }
else if (AlwaysPrintImm0 || OffImm > 0) {
2166 MI->
flat_insn->detail->arm.operands[MI->
flat_insn->detail->arm.op_count].mem.disp = OffImm;
2169 set_mem_access(MI,
false);
2172 static void printT2AddrModeImm0_1020s4Operand(
MCInst *MI,
unsigned OpNum,
SStream *O)
2179 set_mem_access(MI,
true);
2191 set_mem_access(MI,
false);
2194 static void printT2AddrModeImm8OffsetOperand(
MCInst *MI,
2211 MI->
flat_insn->detail->arm.operands[MI->
flat_insn->detail->arm.op_count].imm = OffImm;
2217 static void printT2AddrModeImm8s4OffsetOperand(
MCInst *MI,
2237 MI->
flat_insn->detail->arm.operands[MI->
flat_insn->detail->arm.op_count].imm = OffImm;
2243 static void printT2AddrModeSoRegOperand(
MCInst *MI,
2252 set_mem_access(MI,
true);
2270 MI->
flat_insn->detail->arm.operands[MI->
flat_insn->detail->arm.op_count].shift.value = ShAmt;
2275 set_mem_access(MI,
false);
2278 static void printFPImmOperand(
MCInst *MI,
unsigned OpNum,
SStream *O)
2282 #if defined(_KERNEL_MODE)
2295 static void printNEONModImmOperand(
MCInst *MI,
unsigned OpNum,
SStream *O)
2311 static void printImmPlusOneOperand(
MCInst *MI,
unsigned OpNum,
SStream *O)
2317 MI->
flat_insn->detail->arm.operands[MI->
flat_insn->detail->arm.op_count].imm = Imm + 1;
2322 static void printRotImmOperand(
MCInst *MI,
unsigned OpNum,
SStream *O)
2336 MI->
flat_insn->detail->arm.operands[MI->
flat_insn->detail->arm.op_count - 1].shift.value = Imm * 8;
2340 static void printModImmOperand(
MCInst *MI,
unsigned OpNum,
SStream *O)
2347 bool PrintUnsigned =
false;
2355 PrintUnsigned =
true;
2359 Rotated =
rotr32(Bits, Rot);
2362 if (PrintUnsigned) {
2367 }
else if (Rotated >= 0) {
2377 MI->
flat_insn->detail->arm.operands[MI->
flat_insn->detail->arm.op_count].imm = Rotated;
2395 static void printFBits16(
MCInst *MI,
unsigned OpNum,
SStream *O)
2409 static void printFBits32(
MCInst *MI,
unsigned OpNum,
SStream *O)
2423 static void printVectorIndex(
MCInst *MI,
unsigned OpNum,
SStream *O)
2435 static void printVectorListOne(
MCInst *MI,
unsigned OpNum,
SStream *O)
2440 #ifndef CAPSTONE_DIET
2448 #ifndef CAPSTONE_DIET
2453 #ifndef CAPSTONE_DIET
2460 static void printVectorListTwo(
MCInst *MI,
unsigned OpNum,
2463 #ifndef CAPSTONE_DIET
2470 #ifndef CAPSTONE_DIET
2475 printRegName(MI->
csh, O, Reg0);
2479 #ifndef CAPSTONE_DIET
2485 printRegName(MI->
csh, O, Reg1);
2489 #ifndef CAPSTONE_DIET
2496 #ifndef CAPSTONE_DIET
2501 static void printVectorListTwoSpaced(
MCInst *MI,
unsigned OpNum,
2504 #ifndef CAPSTONE_DIET
2511 #ifndef CAPSTONE_DIET
2516 printRegName(MI->
csh, O, Reg0);
2520 #ifndef CAPSTONE_DIET
2526 printRegName(MI->
csh, O, Reg1);
2530 #ifndef CAPSTONE_DIET
2537 #ifndef CAPSTONE_DIET
2542 static void printVectorListThree(
MCInst *MI,
unsigned OpNum,
SStream *O)
2544 #ifndef CAPSTONE_DIET
2558 #ifndef CAPSTONE_DIET
2568 #ifndef CAPSTONE_DIET
2578 #ifndef CAPSTONE_DIET
2585 #ifndef CAPSTONE_DIET
2590 static void printVectorListFour(
MCInst *MI,
unsigned OpNum,
SStream *O)
2592 #ifndef CAPSTONE_DIET
2606 #ifndef CAPSTONE_DIET
2616 #ifndef CAPSTONE_DIET
2626 #ifndef CAPSTONE_DIET
2636 #ifndef CAPSTONE_DIET
2643 #ifndef CAPSTONE_DIET
2648 static void printVectorListOneAllLanes(
MCInst *MI,
unsigned OpNum,
SStream *O)
2650 #ifndef CAPSTONE_DIET
2661 #ifndef CAPSTONE_DIET
2668 #ifndef CAPSTONE_DIET
2673 static void printVectorListTwoAllLanes(
MCInst *MI,
unsigned OpNum,
2676 #ifndef CAPSTONE_DIET
2683 #ifndef CAPSTONE_DIET
2688 printRegName(MI->
csh, O, Reg0);
2692 #ifndef CAPSTONE_DIET
2698 printRegName(MI->
csh, O, Reg1);
2702 #ifndef CAPSTONE_DIET
2709 #ifndef CAPSTONE_DIET
2714 static void printVectorListThreeAllLanes(
MCInst *MI,
unsigned OpNum,
SStream *O)
2716 #ifndef CAPSTONE_DIET
2730 #ifndef CAPSTONE_DIET
2740 #ifndef CAPSTONE_DIET
2750 #ifndef CAPSTONE_DIET
2757 #ifndef CAPSTONE_DIET
2762 static void printVectorListFourAllLanes(
MCInst *MI,
unsigned OpNum,
SStream *O)
2764 #ifndef CAPSTONE_DIET
2778 #ifndef CAPSTONE_DIET
2788 #ifndef CAPSTONE_DIET
2798 #ifndef CAPSTONE_DIET
2808 #ifndef CAPSTONE_DIET
2815 #ifndef CAPSTONE_DIET
2820 static void printVectorListTwoSpacedAllLanes(
MCInst *MI,
2823 #ifndef CAPSTONE_DIET
2830 #ifndef CAPSTONE_DIET
2835 printRegName(MI->
csh, O, Reg0);
2839 #ifndef CAPSTONE_DIET
2845 printRegName(MI->
csh, O, Reg1);
2849 #ifndef CAPSTONE_DIET
2856 #ifndef CAPSTONE_DIET
2861 static void printVectorListThreeSpacedAllLanes(
MCInst *MI,
2864 #ifndef CAPSTONE_DIET
2878 #ifndef CAPSTONE_DIET
2888 #ifndef CAPSTONE_DIET
2898 #ifndef CAPSTONE_DIET
2905 #ifndef CAPSTONE_DIET
2910 static void printVectorListFourSpacedAllLanes(
MCInst *MI,
2913 #ifndef CAPSTONE_DIET
2927 #ifndef CAPSTONE_DIET
2937 #ifndef CAPSTONE_DIET
2947 #ifndef CAPSTONE_DIET
2957 #ifndef CAPSTONE_DIET
2964 #ifndef CAPSTONE_DIET
2969 static void printVectorListThreeSpaced(
MCInst *MI,
unsigned OpNum,
SStream *O)
2971 #ifndef CAPSTONE_DIET
2985 #ifndef CAPSTONE_DIET
2995 #ifndef CAPSTONE_DIET
3005 #ifndef CAPSTONE_DIET
3012 #ifndef CAPSTONE_DIET
3017 static void printVectorListFourSpaced(
MCInst *MI,
unsigned OpNum,
SStream *O)
3019 #ifndef CAPSTONE_DIET
3033 #ifndef CAPSTONE_DIET
3043 #ifndef CAPSTONE_DIET
3053 #ifndef CAPSTONE_DIET
3063 #ifndef CAPSTONE_DIET
3070 #ifndef CAPSTONE_DIET
3078 MI->
flat_insn->detail->arm.vector_data = vd;
3101 MI->
flat_insn->detail->arm.usermode =
true;