opcodes: style m68k disassembler output

This commit is contained in:
Andreas Schwab 2023-02-14 18:07:19 +01:00 committed by Andreas Schwab
parent 19005d1989
commit c22ff44927

View File

@ -213,7 +213,8 @@ fetch_data (struct disassemble_info *info, bfd_byte *addr)
/* This function is used to print to the bit-bucket. */
static int
dummy_printer (FILE *file ATTRIBUTE_UNUSED,
dummy_printer (void *file ATTRIBUTE_UNUSED,
enum disassembler_style style ATTRIBUTE_UNUSED,
const char *format ATTRIBUTE_UNUSED,
...)
{
@ -510,18 +511,39 @@ print_base (int regno, bfd_vma disp, disassemble_info *info)
{
if (regno == -1)
{
(*info->fprintf_func) (info->stream, "%%pc@(");
(*info->fprintf_styled_func) (info->stream, dis_style_register, "%%pc");
(*info->fprintf_styled_func) (info->stream, dis_style_text, "@(");
(*info->print_address_func) (disp, info);
}
else
{
if (regno == -2)
(*info->fprintf_func) (info->stream, "@(");
else if (regno == -3)
(*info->fprintf_func) (info->stream, "%%zpc@(");
else
(*info->fprintf_func) (info->stream, "%s@(", reg_names[regno]);
(*info->fprintf_func) (info->stream, "%" PRIx64, (uint64_t) disp);
if (regno == -3)
(*info->fprintf_styled_func) (info->stream, dis_style_register,
"%%zpc");
else if (regno != -2)
(*info->fprintf_styled_func) (info->stream, dis_style_register,
"%s", reg_names[regno]);
(*info->fprintf_styled_func) (info->stream, dis_style_text, "@(");
(*info->fprintf_styled_func) (info->stream, dis_style_immediate,
"%" PRIx64, (uint64_t) disp);
}
}
/* Print the index register of an indexed argument, as encoded in the
extension word. */
static void
print_index_register (int ext, disassemble_info *info)
{
(*info->fprintf_styled_func) (info->stream, dis_style_register,
"%s", reg_names[(ext >> 12) & 0xf]);
(*info->fprintf_styled_func) (info->stream, dis_style_text,
":%c", ext & 0x800 ? 'l' : 'w');
if ((ext >> 9) & 3)
{
(*info->fprintf_styled_func) (info->stream, dis_style_text, ":");
(*info->fprintf_styled_func) (info->stream, dis_style_immediate,
"%d", 1 << ((ext >> 9) & 3));
}
}
@ -537,20 +559,12 @@ print_indexed (int basereg,
disassemble_info *info)
{
int word;
static char *const scales[] = { "", ":2", ":4", ":8" };
bfd_vma base_disp;
bfd_vma outer_disp;
char buf[40];
bool print_index = true;
NEXTWORD (p, word, NULL);
/* Generate the text for the index register.
Where this will be output is not yet determined. */
sprintf (buf, "%s:%c%s",
reg_names[(word >> 12) & 0xf],
(word & 0x800) ? 'l' : 'w',
scales[(word >> 9) & 3]);
/* Handle the 68000 style of indexing. */
if ((word & 0x100) == 0)
@ -561,7 +575,9 @@ print_indexed (int basereg,
if (basereg == -1)
base_disp += addr;
print_base (basereg, base_disp, info);
(*info->fprintf_func) (info->stream, ",%s)", buf);
(*info->fprintf_styled_func) (info->stream, dis_style_text, ",");
print_index_register (word, info);
(*info->fprintf_styled_func) (info->stream, dis_style_text, ")");
return p;
}
@ -575,7 +591,7 @@ print_indexed (int basereg,
basereg = -2;
}
if (word & 0100)
buf[0] = '\0';
print_index = false;
base_disp = 0;
switch ((word >> 4) & 3)
{
@ -592,9 +608,12 @@ print_indexed (int basereg,
if ((word & 7) == 0)
{
print_base (basereg, base_disp, info);
if (buf[0] != '\0')
(*info->fprintf_func) (info->stream, ",%s", buf);
(*info->fprintf_func) (info->stream, ")");
if (print_index)
{
(*info->fprintf_styled_func) (info->stream, dis_style_text, ",");
print_index_register (word, info);
}
(*info->fprintf_styled_func) (info->stream, dis_style_text, ")");
return p;
}
@ -610,15 +629,22 @@ print_indexed (int basereg,
}
print_base (basereg, base_disp, info);
if ((word & 4) == 0 && buf[0] != '\0')
if ((word & 4) == 0 && print_index)
{
(*info->fprintf_func) (info->stream, ",%s", buf);
buf[0] = '\0';
(*info->fprintf_styled_func) (info->stream, dis_style_text, ",");
print_index_register (word, info);
print_index = false;
}
(*info->fprintf_func) (info->stream, ")@(%" PRIx64, (uint64_t) outer_disp);
if (buf[0] != '\0')
(*info->fprintf_func) (info->stream, ",%s", buf);
(*info->fprintf_func) (info->stream, ")");
(*info->fprintf_styled_func) (info->stream, dis_style_text,
")@(");
(*info->fprintf_styled_func) (info->stream, dis_style_address_offset,
"%" PRIx64, (uint64_t) outer_disp);
if (print_index)
{
(*info->fprintf_styled_func) (info->stream, dis_style_text, ",");
print_index_register (word, info);
}
(*info->fprintf_styled_func) (info->stream, dis_style_text, ")");
return p;
}
@ -660,14 +686,17 @@ print_insn_arg (const char *d,
{
static char *const cacheFieldName[] = { "nc", "dc", "ic", "bc" };
FETCH_ARG (2, val);
(*info->fprintf_func) (info->stream, "%s", cacheFieldName[val]);
(*info->fprintf_styled_func) (info->stream, dis_style_sub_mnemonic,
"%s", cacheFieldName[val]);
break;
}
case 'a': /* Address register indirect only. Cf. case '+'. */
{
FETCH_ARG (3, val);
(*info->fprintf_func) (info->stream, "%s@", reg_names[val + 8]);
(*info->fprintf_styled_func) (info->stream, dis_style_register, "%s",
reg_names[val + 8]);
(*info->fprintf_styled_func) (info->stream, dis_style_text, "@");
break;
}
@ -679,27 +708,27 @@ print_insn_arg (const char *d,
}
case 'C':
(*info->fprintf_func) (info->stream, "%%ccr");
(*info->fprintf_styled_func) (info->stream, dis_style_register, "%%ccr");
break;
case 'S':
(*info->fprintf_func) (info->stream, "%%sr");
(*info->fprintf_styled_func) (info->stream, dis_style_register, "%%sr");
break;
case 'U':
(*info->fprintf_func) (info->stream, "%%usp");
(*info->fprintf_styled_func) (info->stream, dis_style_register, "%%usp");
break;
case 'E':
(*info->fprintf_func) (info->stream, "%%acc");
(*info->fprintf_styled_func) (info->stream, dis_style_register, "%%acc");
break;
case 'G':
(*info->fprintf_func) (info->stream, "%%macsr");
(*info->fprintf_styled_func) (info->stream, dis_style_register, "%%macsr");
break;
case 'H':
(*info->fprintf_func) (info->stream, "%%mask");
(*info->fprintf_styled_func) (info->stream, dis_style_register, "%%mask");
break;
case 'J':
@ -749,7 +778,8 @@ print_insn_arg (const char *d,
for (regno = ARRAY_SIZE (names_v4e); --regno >= 0;)
if (names_v4e[regno].value == val)
{
(*info->fprintf_func) (info->stream, "%s", names_v4e[regno].name);
(*info->fprintf_styled_func) (info->stream, dis_style_register,
"%s", names_v4e[regno].name);
break;
}
if (regno >= 0)
@ -758,11 +788,12 @@ print_insn_arg (const char *d,
for (regno = ARRAY_SIZE (names) - 1; regno >= 0; regno--)
if (names[regno].value == val)
{
(*info->fprintf_func) (info->stream, "%s", names[regno].name);
(*info->fprintf_styled_func) (info->stream, dis_style_register,
"%s", names[regno].name);
break;
}
if (regno < 0)
(*info->fprintf_func) (info->stream, "0x%x", val);
(*info->fprintf_styled_func) (info->stream, dis_style_text, "0x%x", val);
}
break;
@ -771,7 +802,8 @@ print_insn_arg (const char *d,
/* 0 means 8, except for the bkpt instruction... */
if (val == 0 && d[1] != 's')
val = 8;
(*info->fprintf_func) (info->stream, "#%d", val);
(*info->fprintf_styled_func) (info->stream, dis_style_immediate,
"#%d", val);
break;
case 'x':
@ -779,17 +811,20 @@ print_insn_arg (const char *d,
/* 0 means -1. */
if (val == 0)
val = -1;
(*info->fprintf_func) (info->stream, "#%d", val);
(*info->fprintf_styled_func) (info->stream, dis_style_immediate,
"#%d", val);
break;
case 'j':
FETCH_ARG (3, val);
(*info->fprintf_func) (info->stream, "#%d", val+1);
(*info->fprintf_styled_func) (info->stream, dis_style_immediate,
"#%d", val+1);
break;
case 'K':
FETCH_ARG (9, val);
(*info->fprintf_func) (info->stream, "#%d", val);
(*info->fprintf_styled_func) (info->stream, dis_style_immediate,
"#%d", val);
break;
case 'M':
@ -798,80 +833,108 @@ print_insn_arg (const char *d,
static char *const scalefactor_name[] = { "<<", ">>" };
FETCH_ARG (1, val);
(*info->fprintf_func) (info->stream, "%s", scalefactor_name[val]);
(*info->fprintf_styled_func) (info->stream, dis_style_sub_mnemonic,
"%s", scalefactor_name[val]);
}
else
{
FETCH_ARG (8, val);
if (val & 0x80)
val = val - 0x100;
(*info->fprintf_func) (info->stream, "#%d", val);
(*info->fprintf_styled_func) (info->stream, dis_style_immediate,
"#%d", val);
}
break;
case 'T':
FETCH_ARG (4, val);
(*info->fprintf_func) (info->stream, "#%d", val);
(*info->fprintf_styled_func) (info->stream, dis_style_immediate,
"#%d", val);
break;
case 'D':
FETCH_ARG (3, val);
(*info->fprintf_func) (info->stream, "%s", reg_names[val]);
(*info->fprintf_styled_func) (info->stream, dis_style_register,
"%s", reg_names[val]);
break;
case 'A':
FETCH_ARG (3, val);
(*info->fprintf_func) (info->stream, "%s", reg_names[val + 010]);
(*info->fprintf_styled_func) (info->stream, dis_style_register,
"%s", reg_names[val + 010]);
break;
case 'R':
FETCH_ARG (4, val);
(*info->fprintf_func) (info->stream, "%s", reg_names[val]);
(*info->fprintf_styled_func) (info->stream, dis_style_register,
"%s", reg_names[val]);
break;
case 'r':
FETCH_ARG (4, regno);
if (regno > 7)
(*info->fprintf_func) (info->stream, "%s@", reg_names[regno]);
{
(*info->fprintf_styled_func) (info->stream, dis_style_register,
"%s", reg_names[regno]);
(*info->fprintf_styled_func) (info->stream, dis_style_text, "@");
}
else
(*info->fprintf_func) (info->stream, "@(%s)", reg_names[regno]);
{
(*info->fprintf_styled_func) (info->stream, dis_style_text, "@(");
(*info->fprintf_styled_func) (info->stream, dis_style_register,
"%s", reg_names[regno]);
(*info->fprintf_styled_func) (info->stream, dis_style_text, ")");
}
break;
case 'F':
FETCH_ARG (3, val);
(*info->fprintf_func) (info->stream, "%%fp%d", val);
(*info->fprintf_styled_func) (info->stream, dis_style_register,
"%%fp%d", val);
break;
case 'O':
FETCH_ARG (6, val);
if (val & 0x20)
(*info->fprintf_func) (info->stream, "%s", reg_names[val & 7]);
(*info->fprintf_styled_func) (info->stream, dis_style_register,
"%s", reg_names[val & 7]);
else
(*info->fprintf_func) (info->stream, "%d", val);
(*info->fprintf_styled_func) (info->stream, dis_style_immediate,
"%d", val);
break;
case '+':
FETCH_ARG (3, val);
(*info->fprintf_func) (info->stream, "%s@+", reg_names[val + 8]);
(*info->fprintf_styled_func) (info->stream, dis_style_register,
"%s", reg_names[val + 8]);
(*info->fprintf_styled_func) (info->stream, dis_style_text, "@+");
break;
case '-':
FETCH_ARG (3, val);
(*info->fprintf_func) (info->stream, "%s@-", reg_names[val + 8]);
(*info->fprintf_styled_func) (info->stream, dis_style_register,
"%s", reg_names[val + 8]);
(*info->fprintf_styled_func) (info->stream, dis_style_text, "@-");
break;
case 'k':
if (place == 'k')
{
FETCH_ARG (3, val);
(*info->fprintf_func) (info->stream, "{%s}", reg_names[val]);
(*info->fprintf_styled_func) (info->stream, dis_style_text, "{");
(*info->fprintf_styled_func) (info->stream, dis_style_register,
"%s", reg_names[val]);
(*info->fprintf_styled_func) (info->stream, dis_style_text, "}");
}
else if (place == 'C')
{
FETCH_ARG (7, val);
if (val > 63) /* This is a signed constant. */
val -= 128;
(*info->fprintf_func) (info->stream, "{#%d}", val);
(*info->fprintf_styled_func) (info->stream, dis_style_text, "{");
(*info->fprintf_styled_func) (info->stream, dis_style_immediate,
"#%d", val);
(*info->fprintf_styled_func) (info->stream, dis_style_text, "}");
}
else
return PRINT_INSN_ARG_INVALID_OPERAND;
@ -897,7 +960,8 @@ print_insn_arg (const char *d,
else
return PRINT_INSN_ARG_INVALID_OP_TABLE;
(*info->fprintf_func) (info->stream, "#%d", val);
(*info->fprintf_styled_func) (info->stream, dis_style_immediate,
"#%d", val);
break;
case 'B':
@ -936,31 +1000,41 @@ print_insn_arg (const char *d,
NEXTWORD (p, val, PRINT_INSN_ARG_MEMORY_ERROR);
FETCH_ARG (3, val1);
(*info->fprintf_func) (info->stream, "%s@(%d)", reg_names[val1 + 8], val);
(*info->fprintf_styled_func) (info->stream, dis_style_register,
"%s", reg_names[val1 + 8]);
(*info->fprintf_styled_func) (info->stream, dis_style_text, "@(");
(*info->fprintf_styled_func) (info->stream, dis_style_address_offset,
"%d", val);
(*info->fprintf_styled_func) (info->stream, dis_style_text, ")");
break;
}
case 's':
FETCH_ARG (3, val);
(*info->fprintf_func) (info->stream, "%s", fpcr_names[val]);
(*info->fprintf_styled_func) (info->stream, dis_style_register,
"%s", fpcr_names[val]);
break;
case 'e':
FETCH_ARG (2, val);
(*info->fprintf_func) (info->stream, "%%acc%d", val);
(*info->fprintf_styled_func) (info->stream, dis_style_register,
"%%acc%d", val);
break;
case 'g':
FETCH_ARG (1, val);
(*info->fprintf_func) (info->stream, "%%accext%s", val == 0 ? "01" : "23");
(*info->fprintf_styled_func) (info->stream, dis_style_register,
"%%accext%s", val == 0 ? "01" : "23");
break;
case 'i':
FETCH_ARG (2, val);
if (val == 1)
(*info->fprintf_func) (info->stream, "<<");
(*info->fprintf_styled_func) (info->stream, dis_style_sub_mnemonic,
"<<");
else if (val == 3)
(*info->fprintf_func) (info->stream, ">>");
(*info->fprintf_styled_func) (info->stream, dis_style_sub_mnemonic,
">>");
else
return PRINT_INSN_ARG_INVALID_OPERAND;
break;
@ -971,7 +1045,8 @@ print_insn_arg (const char *d,
if (val < 0)
return PRINT_INSN_ARG_MEMORY_ERROR;
if (val != 1) /* Unusual coprocessor ID? */
(*info->fprintf_func) (info->stream, "(cpid=%d) ", val);
(*info->fprintf_styled_func) (info->stream, dis_style_text,
"(cpid=%d) ", val);
break;
case '4':
@ -1022,28 +1097,41 @@ print_insn_arg (const char *d,
switch (val >> 3)
{
case 0:
(*info->fprintf_func) (info->stream, "%s", reg_names[val]);
(*info->fprintf_styled_func) (info->stream, dis_style_register,
"%s", reg_names[val]);
break;
case 1:
(*info->fprintf_func) (info->stream, "%s", regname);
(*info->fprintf_styled_func) (info->stream, dis_style_register,
"%s", regname);
break;
case 2:
(*info->fprintf_func) (info->stream, "%s@", regname);
(*info->fprintf_styled_func) (info->stream, dis_style_register,
"%s", regname);
(*info->fprintf_styled_func) (info->stream, dis_style_text, "@");
break;
case 3:
(*info->fprintf_func) (info->stream, "%s@+", regname);
(*info->fprintf_styled_func) (info->stream, dis_style_register,
"%s", regname);
(*info->fprintf_styled_func) (info->stream, dis_style_text, "@+");
break;
case 4:
(*info->fprintf_func) (info->stream, "%s@-", regname);
(*info->fprintf_styled_func) (info->stream, dis_style_register,
"%s", regname);
(*info->fprintf_styled_func) (info->stream, dis_style_text, "@-");
break;
case 5:
NEXTWORD (p, val, PRINT_INSN_ARG_MEMORY_ERROR);
(*info->fprintf_func) (info->stream, "%s@(%d)", regname, val);
(*info->fprintf_styled_func) (info->stream, dis_style_register,
"%s", regname);
(*info->fprintf_styled_func) (info->stream, dis_style_text, "@(");
(*info->fprintf_styled_func) (info->stream, dis_style_address_offset,
"%d", val);
(*info->fprintf_styled_func) (info->stream, dis_style_text, ")");
break;
case 6:
@ -1067,9 +1155,11 @@ print_insn_arg (const char *d,
case 2:
NEXTWORD (p, val, PRINT_INSN_ARG_MEMORY_ERROR);
(*info->fprintf_func) (info->stream, "%%pc@(");
(*info->fprintf_styled_func) (info->stream, dis_style_register,
"%%pc");
(*info->fprintf_styled_func) (info->stream, dis_style_text, "@(");
(*info->print_address_func) (addr + val, info);
(*info->fprintf_func) (info->stream, ")");
(*info->fprintf_styled_func) (info->stream, dis_style_text, ")");
break;
case 3:
@ -1117,9 +1207,11 @@ print_insn_arg (const char *d,
return PRINT_INSN_ARG_INVALID_OPERAND;
}
if (flt_p) /* Print a float? */
(*info->fprintf_func) (info->stream, "#0e%g", flval);
(*info->fprintf_styled_func) (info->stream, dis_style_immediate,
"#0e%g", flval);
else
(*info->fprintf_func) (info->stream, "#%d", val);
(*info->fprintf_styled_func) (info->stream, dis_style_immediate,
"#%d", val);
break;
default:
@ -1134,7 +1226,7 @@ print_insn_arg (const char *d,
{
FETCH_ARG (1, val);
if (val)
info->fprintf_func (info->stream, "&");
info->fprintf_styled_func (info->stream, dis_style_text, "&");
}
break;
@ -1150,7 +1242,8 @@ print_insn_arg (const char *d,
p = p1 > p ? p1 : p;
if (val == 0)
{
(*info->fprintf_func) (info->stream, "#0");
(*info->fprintf_styled_func) (info->stream, dis_style_immediate,
"#0");
break;
}
if (*d == 'l')
@ -1170,15 +1263,22 @@ print_insn_arg (const char *d,
int first_regno;
if (doneany)
(*info->fprintf_func) (info->stream, "/");
(*info->fprintf_styled_func) (info->stream, dis_style_text,
"/");
doneany = 1;
(*info->fprintf_func) (info->stream, "%s", reg_names[regno]);
(*info->fprintf_styled_func) (info->stream, dis_style_register,
"%s", reg_names[regno]);
first_regno = regno;
while (val & (1 << (regno + 1)))
++regno;
if (regno > first_regno)
(*info->fprintf_func) (info->stream, "-%s",
reg_names[regno]);
{
(*info->fprintf_styled_func) (info->stream,
dis_style_text, "-");
(*info->fprintf_styled_func) (info->stream,
dis_style_register, "%s",
reg_names[regno]);
}
}
}
else if (place == '3')
@ -1189,7 +1289,8 @@ print_insn_arg (const char *d,
FETCH_ARG (8, val);
if (val == 0)
{
(*info->fprintf_func) (info->stream, "#0");
(*info->fprintf_styled_func) (info->stream, dis_style_immediate,
"#0");
break;
}
if (*d == 'l')
@ -1208,21 +1309,30 @@ print_insn_arg (const char *d,
{
int first_regno;
if (doneany)
(*info->fprintf_func) (info->stream, "/");
(*info->fprintf_styled_func) (info->stream, dis_style_text,
"/");
doneany = 1;
(*info->fprintf_func) (info->stream, "%%fp%d", regno);
(*info->fprintf_styled_func) (info->stream, dis_style_register,
"%%fp%d", regno);
first_regno = regno;
while (val & (1 << (regno + 1)))
++regno;
if (regno > first_regno)
(*info->fprintf_func) (info->stream, "-%%fp%d", regno);
{
(*info->fprintf_styled_func) (info->stream,
dis_style_text, "-");
(*info->fprintf_styled_func) (info->stream,
dis_style_register,
"%%fp%d", regno);
}
}
}
else if (place == '8')
{
FETCH_ARG (3, val);
/* fmoveml for FP status registers. */
(*info->fprintf_func) (info->stream, "%s", fpcr_names[val]);
(*info->fprintf_styled_func) (info->stream, dis_style_register,
"%s", fpcr_names[val]);
}
else
return PRINT_INSN_ARG_INVALID_OP_TABLE;
@ -1261,16 +1371,18 @@ print_insn_arg (const char *d,
{
int break_reg = ((buffer[3] >> 2) & 7);
(*info->fprintf_func)
(info->stream, val == 0x1c ? "%%bad%d" : "%%bac%d",
break_reg);
(*info->fprintf_styled_func)
(info->stream, dis_style_register,
val == 0x1c ? "%%bad%d" : "%%bac%d", break_reg);
}
break;
default:
(*info->fprintf_func) (info->stream, "<mmu register %d>", val);
(*info->fprintf_styled_func) (info->stream, dis_style_text,
"<mmu register %d>", val);
}
if (name)
(*info->fprintf_func) (info->stream, "%s", name);
(*info->fprintf_styled_func) (info->stream, dis_style_register,
"%s", name);
}
break;
@ -1280,17 +1392,20 @@ print_insn_arg (const char *d,
FETCH_ARG (5, fc);
if (fc == 1)
(*info->fprintf_func) (info->stream, "%%dfc");
(*info->fprintf_styled_func) (info->stream, dis_style_register,
"%%dfc");
else if (fc == 0)
(*info->fprintf_func) (info->stream, "%%sfc");
(*info->fprintf_styled_func) (info->stream, dis_style_register,
"%%sfc");
else
/* xgettext:c-format */
(*info->fprintf_func) (info->stream, _("<function code %d>"), fc);
(*info->fprintf_styled_func) (info->stream, dis_style_text,
_("<function code %d>"), fc);
}
break;
case 'V':
(*info->fprintf_func) (info->stream, "%%val");
(*info->fprintf_styled_func) (info->stream, dis_style_register, "%%val");
break;
case 't':
@ -1298,7 +1413,8 @@ print_insn_arg (const char *d,
int level;
FETCH_ARG (3, level);
(*info->fprintf_func) (info->stream, "%d", level);
(*info->fprintf_styled_func) (info->stream, dis_style_immediate,
"%d", level);
}
break;
@ -1313,9 +1429,9 @@ print_insn_arg (const char *d,
is_upper = 1;
reg &= 0xf;
}
(*info->fprintf_func) (info->stream, "%s%s",
reg_half_names[reg],
is_upper ? "u" : "l");
(*info->fprintf_styled_func) (info->stream, dis_style_register, "%s%s",
reg_half_names[reg],
is_upper ? "u" : "l");
}
break;
@ -1342,7 +1458,7 @@ match_insn_m68k (bfd_vma memaddr,
struct private *priv = (struct private *) info->private_data;
bfd_byte *buffer = priv->the_buffer;
fprintf_ftype save_printer = info->fprintf_func;
fprintf_styled_ftype save_printer = info->fprintf_styled_func;
void (* save_print_address) (bfd_vma, struct disassemble_info *)
= info->print_address_func;
@ -1423,7 +1539,7 @@ match_insn_m68k (bfd_vma memaddr,
save_p = p;
info->print_address_func = dummy_print_address;
info->fprintf_func = (fprintf_ftype) dummy_printer;
info->fprintf_styled_func = dummy_printer;
/* We scan the operands twice. The first time we don't print anything,
but look for errors. */
@ -1436,7 +1552,7 @@ match_insn_m68k (bfd_vma memaddr,
else if (eaten == PRINT_INSN_ARG_INVALID_OPERAND
|| eaten == PRINT_INSN_ARG_MEMORY_ERROR)
{
info->fprintf_func = save_printer;
info->fprintf_styled_func = save_printer;
info->print_address_func = save_print_address;
return eaten == PRINT_INSN_ARG_MEMORY_ERROR ? -1 : 0;
}
@ -1444,26 +1560,26 @@ match_insn_m68k (bfd_vma memaddr,
{
/* We must restore the print functions before trying to print the
error message. */
info->fprintf_func = save_printer;
info->fprintf_styled_func = save_printer;
info->print_address_func = save_print_address;
info->fprintf_func (info->stream,
/* xgettext:c-format */
_("<internal error in opcode table: %s %s>\n"),
best->name, best->args);
info->fprintf_styled_func (info->stream, dis_style_text,
/* xgettext:c-format */
_("<internal error in opcode table: %s %s>\n"),
best->name, best->args);
return 2;
}
}
p = save_p;
info->fprintf_func = save_printer;
info->fprintf_styled_func = save_printer;
info->print_address_func = save_print_address;
d = args;
info->fprintf_func (info->stream, "%s", best->name);
info->fprintf_styled_func (info->stream, dis_style_mnemonic, "%s", best->name);
if (*d)
info->fprintf_func (info->stream, " ");
info->fprintf_styled_func (info->stream, dis_style_text, " ");
while (*d)
{
@ -1471,7 +1587,7 @@ match_insn_m68k (bfd_vma memaddr,
d += 2;
if (*d && *(d - 2) != 'I' && *d != 'k')
info->fprintf_func (info->stream, ",");
info->fprintf_styled_func (info->stream, dis_style_text, ",");
}
return p - buffer;
@ -1638,8 +1754,14 @@ print_insn_m68k (bfd_vma memaddr, disassemble_info *info)
}
if (val == 0)
/* Handle undefined instructions. */
info->fprintf_func (info->stream, ".short 0x%04x", (buffer[0] << 8) + buffer[1]);
{
/* Handle undefined instructions. */
info->fprintf_styled_func (info->stream, dis_style_assembler_directive,
".short");
info->fprintf_styled_func (info->stream, dis_style_text, " ");
info->fprintf_styled_func (info->stream, dis_style_immediate,
"0x%04x", (buffer[0] << 8) + buffer[1]);
}
return val ? val : 2;
}