arm: fix a similar issue with the last issue on MOVsr instructions
diff --git a/arch/ARM/ARMInstPrinter.c b/arch/ARM/ARMInstPrinter.c
index 68821d5..56b1eee 100644
--- a/arch/ARM/ARMInstPrinter.c
+++ b/arch/ARM/ARMInstPrinter.c
@@ -466,12 +466,33 @@
// Check for MOVs and print canonical forms, instead.
case ARM_MOVsr: {
// FIXME: Thumb variants?
+ unsigned int opc;
MCOperand *Dst = MCInst_getOperand(MI, 0);
MCOperand *MO1 = MCInst_getOperand(MI, 1);
MCOperand *MO2 = MCInst_getOperand(MI, 2);
MCOperand *MO3 = MCInst_getOperand(MI, 3);
- SStream_concat0(O, ARM_AM_getShiftOpcStr(ARM_AM_getSORegShOp((unsigned int)MCOperand_getImm(MO3))));
+ opc = ARM_AM_getSORegShOp((unsigned int)MCOperand_getImm(MO3));
+ SStream_concat0(O, ARM_AM_getShiftOpcStr(opc));
+ switch(opc) {
+ default:
+ break;
+ case ARM_AM_asr:
+ MCInst_setOpcodePub(MI, ARM_INS_ASR);
+ break;
+ case ARM_AM_lsl:
+ MCInst_setOpcodePub(MI, ARM_INS_LSL);
+ break;
+ case ARM_AM_lsr:
+ MCInst_setOpcodePub(MI, ARM_INS_LSR);
+ break;
+ case ARM_AM_ror:
+ MCInst_setOpcodePub(MI, ARM_INS_ROR);
+ break;
+ case ARM_AM_rrx:
+ MCInst_setOpcodePub(MI, ARM_INS_RRX);
+ break;
+ }
printSBitModifierOperand(MI, 6, O);
printPredicateOperand(MI, 4, O);
@@ -555,7 +576,7 @@
MI->flat_insn->detail->arm.op_count++;
}
- if (ARM_AM_getSORegShOp((unsigned int)MCOperand_getImm(MO2)) == ARM_AM_rrx) {
+ if (opc == ARM_AM_rrx) {
//printAnnotation(O, Annot);
return;
}
@@ -568,7 +589,7 @@
SStream_concat(O, "#%u", tmp);
if (MI->csh->detail) {
MI->flat_insn->detail->arm.operands[MI->flat_insn->detail->arm.op_count - 1].shift.type =
- (arm_shifter)ARM_AM_getSORegShOp((unsigned int)MCOperand_getImm(MO2));
+ (arm_shifter)opc;
MI->flat_insn->detail->arm.operands[MI->flat_insn->detail->arm.op_count - 1].shift.value = tmp;
}
return;