/* disassemble an Alpha instruction */ void md_print_insn(md_inst_t inst, /* instruction to disassemble */ md_addr_t pc, /* addr of inst, used for PC-rels */ FILE *stream) /* output stream */ { enum md_opcode op; /* use stderr as default output stream */ if (!stream) stream = stderr; /* decode the instruction, assumes predecoded text segment */ MD_SET_OPCODE(op, inst); /* disassemble the instruction */ if (op <= OP_NA || op >= OP_MAX) { /* bogus instruction */ fprintf(stream, "<invalid inst: 0x%08x>", inst); } else { char *s; fprintf(stream, "%-10s", MD_OP_NAME(op)); s = MD_OP_FORMAT(op); while (*s) { switch (*s) { case 'a': fprintf(stream, "r%d", RA); break; case 'b': fprintf(stream, "r%d", RB); break; case 'c': fprintf(stream, "r%d", RC); break; case 'A': fprintf(stream, "f%d", RA); break; case 'B': fprintf(stream, "f%d", RB); break; case 'C': fprintf(stream, "f%d", RC); break; case 'o': fprintf(stream, "%d", (sword_t)SEXT(OFS)); break; case 'j': myfprintf(stream, "0x%p", pc + (SEXT(OFS) << 2) + 4); break; case 'J': myfprintf(stream, "0x%p", pc + (SEXT21(TARG) << 2) + 4); break; case 'i': fprintf(stream, "%d", (word_t)IMM); break; default: /* anything unrecognized, e.g., '.' is just passed through */ fputc(*s, stream); } s++; } } }
/* disassemble a SimpleScalar instruction */ void md_print_insn(md_inst_t inst, /* instruction to disassemble */ md_addr_t pc, /* addr of inst, used for PC-rels */ FILE *stream) /* output stream */ { enum md_opcode op; /* use stderr as default output stream */ if (!stream) stream = stderr; /* decode the instruction, assumes predecoded text segment */ MD_SET_OPCODE(op, inst); /* disassemble the instruction */ if (op == OP_NA || op >= OP_MAX) { /* bogus instruction */ fprintf(stream, "<invalid inst: 0x%08x:%08x>", inst.a, inst.b); } else { char *s; fprintf(stream, "%-10s", MD_OP_NAME(op)); s = MD_OP_FORMAT(op); while (*s) { switch (*s) { case 'd': fprintf(stream, "r%d", RD); break; case 's': fprintf(stream, "r%d", RS); break; case 't': fprintf(stream, "r%d", RT); break; case 'b': fprintf(stream, "r%d", BS); break; case 'D': fprintf(stream, "f%d", FD); break; case 'S': fprintf(stream, "f%d", FS); break; case 'T': fprintf(stream, "f%d", FT); break; case 'j': fprintf(stream, "0x%x", (pc + 8 + (OFS << 2))); break; case 'o': case 'i': fprintf(stream, "%d", IMM); break; case 'H': fprintf(stream, "%d", SHAMT); break; case 'u': fprintf(stream, "%u", UIMM); break; case 'U': fprintf(stream, "0x%x", UIMM); break; case 'J': fprintf(stream, "0x%x", ((pc & 036000000000) | (TARG << 2))); break; case 'B': fprintf(stream, "0x%x", BCODE); break; #if 0 /* FIXME: obsolete... */ case ')': /* handle pre- or post-inc/dec */ if (SS_COMP_OP == SS_COMP_NOP) fprintf(stream, ")"); else if (SS_COMP_OP == SS_COMP_POST_INC) fprintf(stream, ")+"); else if (SS_COMP_OP == SS_COMP_POST_DEC) fprintf(stream, ")-"); else if (SS_COMP_OP == SS_COMP_PRE_INC) fprintf(stream, ")^+"); else if (SS_COMP_OP == SS_COMP_PRE_DEC) fprintf(stream, ")^-"); else if (SS_COMP_OP == SS_COMP_POST_DBL_INC) fprintf(stream, ")++"); else if (SS_COMP_OP == SS_COMP_POST_DBL_DEC) fprintf(stream, ")--"); else if (SS_COMP_OP == SS_COMP_PRE_DBL_INC) fprintf(stream, ")^++"); else if (SS_COMP_OP == SS_COMP_PRE_DBL_DEC) fprintf(stream, ")^--"); else panic("bogus SS_COMP_OP"); break; #endif default: /* anything unrecognized, e.g., '.' is just passed through */ fputc(*s, stream); } s++; } } }