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.


 791                 break;
 792         default:
 793                 len = snprintf(buf, buflen,
 794                     "%s%s%s %s, %s", arm_dpi_opnames[dpi_inst.dpii_op],
 795                     arm_cond_names[dpi_inst.dpii_cond],
 796                     dpi_inst.dpii_sbit != 0 ? "S" : "",
 797                     arm_reg_names[dpi_inst.dpii_rd],
 798                     arm_reg_names[dpi_inst.dpii_rn]);
 799                 break;
 800         }
 801 
 802         if (len >= buflen)
 803                 return (-1);
 804         buflen -= len;
 805         buf += len;
 806 
 807         /*
 808          * Print the shifter as appropriate
 809          */
 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);





 815                 break;

 816         case ARM_DPI_SHIFTER_SIMM:
 817                 if (dpi_inst.dpii_un.dpii_si.dpiss_code == DPI_S_NONE) {
 818                         len = snprintf(buf, buflen, ", %s",
 819                             arm_reg_names[dpi_inst.dpii_un.dpii_si.dpiss_targ]);
 820                         break;
 821                 }
 822                 if (dpi_inst.dpii_un.dpii_si.dpiss_code == DPI_S_RRX) {
 823                         len = snprintf(buf, buflen, ", %s RRX",
 824                             arm_reg_names[dpi_inst.dpii_un.dpii_si.dpiss_targ]);
 825                         break;
 826                 }
 827                 len = snprintf(buf, buflen, ", %s, %s #%d",
 828                     arm_reg_names[dpi_inst.dpii_un.dpii_si.dpiss_targ],
 829                     arm_dpi_shifts[dpi_inst.dpii_un.dpii_si.dpiss_code],
 830                     dpi_inst.dpii_un.dpii_si.dpiss_imm);
 831                 break;
 832         case ARM_DPI_SHIFTER_SREG:
 833                 len = snprintf(buf, buflen, ", %s, %s %s",
 834                     arm_reg_names[dpi_inst.dpii_un.dpii_ri.dpisr_targ],
 835                     arm_dpi_shifts[dpi_inst.dpii_un.dpii_ri.dpisr_code],




 791                 break;
 792         default:
 793                 len = snprintf(buf, buflen,
 794                     "%s%s%s %s, %s", arm_dpi_opnames[dpi_inst.dpii_op],
 795                     arm_cond_names[dpi_inst.dpii_cond],
 796                     dpi_inst.dpii_sbit != 0 ? "S" : "",
 797                     arm_reg_names[dpi_inst.dpii_rd],
 798                     arm_reg_names[dpi_inst.dpii_rn]);
 799                 break;
 800         }
 801 
 802         if (len >= buflen)
 803                 return (-1);
 804         buflen -= len;
 805         buf += len;
 806 
 807         /*
 808          * Print the shifter as appropriate
 809          */
 810         switch (dpi_inst.dpii_stype) {
 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);
 820                 break;
 821         }
 822         case ARM_DPI_SHIFTER_SIMM:
 823                 if (dpi_inst.dpii_un.dpii_si.dpiss_code == DPI_S_NONE) {
 824                         len = snprintf(buf, buflen, ", %s",
 825                             arm_reg_names[dpi_inst.dpii_un.dpii_si.dpiss_targ]);
 826                         break;
 827                 }
 828                 if (dpi_inst.dpii_un.dpii_si.dpiss_code == DPI_S_RRX) {
 829                         len = snprintf(buf, buflen, ", %s RRX",
 830                             arm_reg_names[dpi_inst.dpii_un.dpii_si.dpiss_targ]);
 831                         break;
 832                 }
 833                 len = snprintf(buf, buflen, ", %s, %s #%d",
 834                     arm_reg_names[dpi_inst.dpii_un.dpii_si.dpiss_targ],
 835                     arm_dpi_shifts[dpi_inst.dpii_un.dpii_si.dpiss_code],
 836                     dpi_inst.dpii_un.dpii_si.dpiss_imm);
 837                 break;
 838         case ARM_DPI_SHIFTER_SREG:
 839                 len = snprintf(buf, buflen, ", %s, %s %s",
 840                     arm_reg_names[dpi_inst.dpii_un.dpii_ri.dpisr_targ],
 841                     arm_dpi_shifts[dpi_inst.dpii_un.dpii_ri.dpisr_code],