Print this page
libdisasm: fully decode DPI immediate
The immediate value can be rotated.  Instead of dumping the 8-bit immediate
and 4-bit rotate field, we should dump the effective immediate value (both
in decimal and hex) to ease reading the disassembly.  This matches GNU
objdump behavior.

*** 806,820 **** /* * Print the shifter as appropriate */ switch (dpi_inst.dpii_stype) { ! case ARM_DPI_SHIFTER_IMM32: ! len = snprintf(buf, buflen, ", #%d, %d", ! dpi_inst.dpii_un.dpii_im.dpisi_imm, ! dpi_inst.dpii_un.dpii_im.dpisi_rot); break; case ARM_DPI_SHIFTER_SIMM: if (dpi_inst.dpii_un.dpii_si.dpiss_code == DPI_S_NONE) { len = snprintf(buf, buflen, ", %s", arm_reg_names[dpi_inst.dpii_un.dpii_si.dpiss_targ]); break; --- 806,826 ---- /* * Print the shifter as appropriate */ switch (dpi_inst.dpii_stype) { ! case ARM_DPI_SHIFTER_IMM32: { ! uint32_t imm = dpi_inst.dpii_un.dpii_im.dpisi_imm; ! int rot = dpi_inst.dpii_un.dpii_im.dpisi_rot * 2; ! if (rot != 0) ! imm = (imm << (32 - rot)) | (imm >> rot); ! if (imm < 10) ! len = snprintf(buf, buflen, ", #%d", imm); ! else ! len = snprintf(buf, buflen, ", #%d ; %#x", imm, imm); break; + } case ARM_DPI_SHIFTER_SIMM: if (dpi_inst.dpii_un.dpii_si.dpiss_code == DPI_S_NONE) { len = snprintf(buf, buflen, ", %s", arm_reg_names[dpi_inst.dpii_un.dpii_si.dpiss_targ]); break;