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.

Split Close
Expand all
Collapse all
          --- old/usr/src/lib/libdisasm/common/dis_arm.c
          +++ new/usr/src/lib/libdisasm/common/dis_arm.c
↓ open down ↓ 800 lines elided ↑ open up ↑
 801  801  
 802  802          if (len >= buflen)
 803  803                  return (-1);
 804  804          buflen -= len;
 805  805          buf += len;
 806  806  
 807  807          /*
 808  808           * Print the shifter as appropriate
 809  809           */
 810  810          switch (dpi_inst.dpii_stype) {
 811      -        case ARM_DPI_SHIFTER_IMM32:
 812      -                len = snprintf(buf, buflen, ", #%d, %d",
 813      -                    dpi_inst.dpii_un.dpii_im.dpisi_imm,
 814      -                    dpi_inst.dpii_un.dpii_im.dpisi_rot);
      811 +        case ARM_DPI_SHIFTER_IMM32: {
      812 +                uint32_t imm = dpi_inst.dpii_un.dpii_im.dpisi_imm;
      813 +                int rot = dpi_inst.dpii_un.dpii_im.dpisi_rot * 2;
      814 +                if (rot != 0)
      815 +                        imm = (imm << (32 - rot)) | (imm >> rot);
      816 +                if (imm < 10)
      817 +                        len = snprintf(buf, buflen, ", #%d", imm);
      818 +                else
      819 +                        len = snprintf(buf, buflen, ", #%d  ; %#x", imm, imm);
 815  820                  break;
      821 +        }
 816  822          case ARM_DPI_SHIFTER_SIMM:
 817  823                  if (dpi_inst.dpii_un.dpii_si.dpiss_code == DPI_S_NONE) {
 818  824                          len = snprintf(buf, buflen, ", %s",
 819  825                              arm_reg_names[dpi_inst.dpii_un.dpii_si.dpiss_targ]);
 820  826                          break;
 821  827                  }
 822  828                  if (dpi_inst.dpii_un.dpii_si.dpiss_code == DPI_S_RRX) {
 823  829                          len = snprintf(buf, buflen, ", %s RRX",
 824  830                              arm_reg_names[dpi_inst.dpii_un.dpii_si.dpiss_targ]);
 825  831                          break;
↓ open down ↓ 1725 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX