struct memory_operand *mo = (struct memory_operand *) opr;
(*info->fprintf_func) (info->stream, "%c", mo->indirect ? '[' : '(');
- if (mo->base_offset != 0)
- {
- (*info->fprintf_func) (info->stream, "%d", mo->base_offset);
- }
- else if (mo->n_regs > 0)
- {
- const char *fmt;
- switch (mo->mutation)
- {
- case OPND_RM_PRE_DEC:
- fmt = "-%s";
- break;
- case OPND_RM_PRE_INC:
- fmt = "+%s";
- break;
- case OPND_RM_POST_DEC:
- fmt = "%s-";
- break;
- case OPND_RM_POST_INC:
- fmt = "%s+";
- break;
- case OPND_RM_NONE:
- default:
- fmt = "%s";
- break;
- }
- (*info->fprintf_func) (info->stream, fmt,
- registers[mo->regs[0]].name);
- used_reg = 1;
- }
+ const char *fmt;
+ assert (mo->mutation == OPND_RM_NONE || mo->n_regs == 1);
+ switch (mo->mutation)
+ {
+ case OPND_RM_PRE_DEC:
+ fmt = "-%s";
+ break;
+ case OPND_RM_PRE_INC:
+ fmt = "+%s";
+ break;
+ case OPND_RM_POST_DEC:
+ fmt = "%s-";
+ break;
+ case OPND_RM_POST_INC:
+ fmt = "%s+";
+ break;
+ case OPND_RM_NONE:
+ default:
+ if (mo->n_regs < 2)
+ (*info->fprintf_func) (info->stream, (mo->n_regs == 0) ? "%d" : "%d,", mo->base_offset);
+ fmt = "%s";
+ break;
+ }
+ if (mo->n_regs > 0)
+ (*info->fprintf_func) (info->stream, fmt,
+ registers[mo->regs[0]].name);
+ used_reg = 1;
if (mo->n_regs > used_reg)
{
print_insn_s12z (bfd_vma memaddr, struct disassemble_info* info)
{
int o;
- enum operator operator = OP_INVALID;
+ enum optr operator = OP_INVALID;
int n_operands = 0;
/* The longest instruction in S12Z can have 6 operands.
(struct mem_read_abstraction_base *) &mra);
(info->fprintf_func) (info->stream, "%s", mnemonics[(long)operator]);
-
+
/* Ship out size sufficies for those instructions which
need them. */
if (osize == -1)
bool suffix = false;
for (o = 0; o < n_operands; ++o)
{
- if (operands[o]->osize != -1)
+ if (operands[o] && operands[o]->osize != -1)
{
if (!suffix)
{