mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-24 02:24:46 +08:00
opcodes: style m68k disassembler output
This commit is contained in:
parent
19005d1989
commit
c22ff44927
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user