/* Disassembler code for Renesas RX.
- Copyright (C) 2008-2019 Free Software Foundation, Inc.
+ Copyright (C) 2008-2021 Free Software Foundation, Inc.
Contributed by Red Hat.
Written by DJ Delorie.
"psw", "pc", "usp", "fpsw", NULL, NULL, NULL, NULL,
"bpsw", "bpc", "isp", "fintv", "intb", "extb", NULL, NULL,
"a0", "a1", NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
};
static char const * condition_names[] =
{
"c", "z", "s", "o", "", "", "", "",
"", "", "", "", "", "", "", "",
- "i", "u", "", "", "", "", "", ""
- "", "", "", "", "", "", "", "",
+ "i", "u", "", "", "", "", "", "",
+ "", "", "", "", "", "", "", ""
};
static const char * double_register_names[] =
{
"dr0", "dr1", "dr2", "dr3", "dr4", "dr5", "dr6", "dr7",
- "dr8", "dr9", "dr10", "dr11", "dr12", "dr13", "dr14", "dr15",
+ "dr8", "dr9", "dr10", "dr11", "dr12", "dr13", "dr14", "dr15"
};
static const char * double_register_high_names[] =
{
"drh0", "drh1", "drh2", "drh3", "drh4", "drh5", "drh6", "drh7",
- "drh8", "drh9", "drh10", "drh11", "drh12", "drh13", "drh14", "drh15",
+ "drh8", "drh9", "drh10", "drh11", "drh12", "drh13", "drh14", "drh15"
};
static const char * double_register_low_names[] =
{
"drl0", "drl1", "drl2", "drl3", "drl4", "drl5", "drl6", "drl7",
- "drl8", "drl9", "drl10", "drl11", "drl12", "drl13", "drl14", "drl15",
+ "drl8", "drl9", "drl10", "drl11", "drl12", "drl13", "drl14", "drl15"
};
static const char * double_control_register_names[] =
{
- "dpsw", "dcmr", "decnt", "depc",
+ "dpsw", "dcmr", "decnt", "depc"
};
static const char * double_condition_names[] =
{
- "", "un", "eq", "", "lt", "", "le",
+ "", "un", "eq", "", "lt", "", "le"
};
static inline const char *
{
if (reg < ARRAY_SIZE (register_names))
return register_names[reg];
- return _("<inavlid register number>");
+ return _("<invalid register number>");
}
static inline const char *
{
if (cond < ARRAY_SIZE (condition_names))
return condition_names[cond];
- return _("<inavlid condition code>");
+ return _("<invalid condition code>");
}
static inline const char *
{
if (flag < ARRAY_SIZE (flag_names))
return flag_names[flag];
- return _("<inavlid flag>");
+ return _("<invalid flag>");
}
static inline const char *
{
if (reg < ARRAY_SIZE (double_register_names))
return double_register_names[reg];
- return _("<inavlid register number>");
+ return _("<invalid register number>");
}
static inline const char *
{
if (reg < ARRAY_SIZE (double_register_high_names))
return double_register_high_names[reg];
- return _("<inavlid register number>");
+ return _("<invalid register number>");
}
static inline const char *
{
if (reg < ARRAY_SIZE (double_register_low_names))
return double_register_low_names[reg];
- return _("<inavlid register number>");
+ return _("<invalid register number>");
}
static inline const char *
{
if (reg < ARRAY_SIZE (double_control_register_names))
return double_control_register_names[reg];
- return _("<inavlid register number>");
+ return _("<invalid register number>");
}
static inline const char *
{
if (cond < ARRAY_SIZE (double_condition_names))
return double_condition_names[cond];
- return _("<inavlid condition code>");
+ return _("<invalid condition code>");
+}
+
+static inline const char *
+get_opsize_name (unsigned int opsize)
+{
+ if (opsize < ARRAY_SIZE (opsize_names))
+ return opsize_names[opsize];
+ return _("<invalid opsize>");
+}
+
+static inline const char *
+get_size_name (unsigned int size)
+{
+ if (size < ARRAY_SIZE (size_names))
+ return size_names[size];
+ return _("<invalid size>");
}
break;
case 's':
- PR (PS, "%s", opsize_names[opcode.size]);
+ PR (PS, "%s", get_opsize_name (opcode.size));
break;
case 'b':
s ++;
- if (*s == 'f') {
- int imm = opcode.op[2].addend;
- int slsb, dlsb, width;
- dlsb = (imm >> 5) & 0x1f;
- slsb = (imm & 0x1f);
- slsb = (slsb >= 0x10?(slsb ^ 0x1f) + 1:slsb);
- slsb = dlsb - slsb;
- slsb = (slsb < 0?-slsb:slsb);
- width = ((imm >> 10) & 0x1f) - dlsb;
- PR (PS, "#%d, #%d, #%d, %s, %s",
- slsb, dlsb, width,
- register_names[opcode.op[1].reg],
- register_names[opcode.op[0].reg]);
- }
+ if (*s == 'f')
+ {
+ int imm = opcode.op[2].addend;
+ int slsb, dlsb, width;
+
+ dlsb = (imm >> 5) & 0x1f;
+ slsb = (imm & 0x1f);
+ slsb = (slsb >= 0x10?(slsb ^ 0x1f) + 1:slsb);
+ slsb = dlsb - slsb;
+ slsb = (slsb < 0?-slsb:slsb);
+ width = ((imm >> 10) & 0x1f) - dlsb;
+ PR (PS, "#%d, #%d, #%d, %s, %s",
+ slsb, dlsb, width,
+ get_register_name (opcode.op[1].reg),
+ get_register_name (opcode.op[0].reg));
+ }
break;
case '0':
case '1':
case '2':
- oper = opcode.op + *s - '0';
+ oper = opcode.op + (*s - '0');
if (do_size)
{
if (oper->type == RX_Operand_Indirect || oper->type == RX_Operand_Zero_Indirect)
- PR (PS, "%s", size_names[oper->size]);
+ PR (PS, "%s", get_size_name (oper->size));
}
else
switch (oper->type)