* crx-dis.c (enum REG_ARG_TYPE): New, replacing COP_ARG_TYPE.

(getregliststring): Support HI/LO and user registers.
This commit is contained in:
Tomer Levi 2004-10-27 10:24:01 +00:00
parent 9268a8d21a
commit a58a37627f
1 changed files with 58 additions and 41 deletions

View File

@ -65,18 +65,19 @@ const cinv_entry crx_cinvs[] =
{"[b,d,u]", 13}, {"[b,d,i]", 14}, {"[b,d,i,u]", 15} {"[b,d,u]", 13}, {"[b,d,i]", 14}, {"[b,d,i,u]", 15}
}; };
/* Enum to distinguish CO-Processor [special] registers arguments /* Enum to distinguish different registers argument types. */
from general purpose regidters. */ typedef enum REG_ARG_TYPE
typedef enum COP_ARG_TYPE
{ {
/* Not a CO-Processor argument (probably a general purpose reg.). */ /* General purpose register (r<N>). */
NO_COP_ARG = 0, REG_ARG = 0,
/* A CO-Processor argument (c<N>). */ /* User register (u<N>). */
USER_REG_ARG,
/* CO-Processor register (c<N>). */
COP_ARG, COP_ARG,
/* A CO-Processor special argument (cs<N>). */ /* CO-Processor special register (cs<N>). */
COPS_ARG COPS_ARG
} }
COP_ARG_TYPE; REG_ARG_TYPE;
/* Number of valid 'cinv' instruction options. */ /* Number of valid 'cinv' instruction options. */
int NUMCINVS = ((sizeof crx_cinvs)/(sizeof crx_cinvs[0])); int NUMCINVS = ((sizeof crx_cinvs)/(sizeof crx_cinvs[0]));
@ -104,7 +105,7 @@ static char *getcopregname (copreg, reg_type);
static char * getprocregname (int); static char * getprocregname (int);
static char *gettrapstring (unsigned); static char *gettrapstring (unsigned);
static char *getcinvstring (unsigned); static char *getcinvstring (unsigned);
static void getregliststring (int, char *, enum COP_ARG_TYPE); static void getregliststring (int, char *, enum REG_ARG_TYPE);
static wordU get_word_at_PC (bfd_vma, struct disassemble_info *); static wordU get_word_at_PC (bfd_vma, struct disassemble_info *);
static void get_words_at_PC (bfd_vma, struct disassemble_info *); static void get_words_at_PC (bfd_vma, struct disassemble_info *);
static unsigned long build_mask (void); static unsigned long build_mask (void);
@ -240,7 +241,7 @@ powerof2 (int x)
/* Transform a register bit mask to a register list. */ /* Transform a register bit mask to a register list. */
void void
getregliststring (int trap, char *string, enum COP_ARG_TYPE core_cop) getregliststring (int mask, char *string, enum REG_ARG_TYPE core_cop)
{ {
char temp_string[5]; char temp_string[5];
int i; int i;
@ -248,15 +249,29 @@ getregliststring (int trap, char *string, enum COP_ARG_TYPE core_cop)
string[0] = '{'; string[0] = '{';
string[1] = '\0'; string[1] = '\0';
/* A zero mask means HI/LO registers. */
if (mask == 0)
{
if (core_cop == USER_REG_ARG)
strcat (string, "ulo,uhi");
else
strcat (string, "lo,hi");
}
else
{
for (i = 0; i < 16; i++) for (i = 0; i < 16; i++)
{ {
if (trap & 0x1) if (mask & 0x1)
{ {
switch (core_cop) switch (core_cop)
{ {
case NO_COP_ARG: case REG_ARG:
sprintf (temp_string, "r%d", i); sprintf (temp_string, "r%d", i);
break; break;
case USER_REG_ARG:
sprintf (temp_string, "u%d", i);
break;
case COP_ARG: case COP_ARG:
sprintf (temp_string, "c%d", i); sprintf (temp_string, "c%d", i);
break; break;
@ -267,10 +282,11 @@ getregliststring (int trap, char *string, enum COP_ARG_TYPE core_cop)
break; break;
} }
strcat (string, temp_string); strcat (string, temp_string);
if (trap & 0xfffe) if (mask & 0xfffe)
strcat (string, ","); strcat (string, ",");
} }
trap = trap >> 1; mask >>= 1;
}
} }
strcat (string, "}"); strcat (string, "}");
@ -515,16 +531,17 @@ print_arg (argument *a, struct disassemble_info *info)
else if (INST_HAS_REG_LIST) else if (INST_HAS_REG_LIST)
{ {
COP_ARG_TYPE cop_ins = IS_INSN_TYPE (COP_REG_INS) ? REG_ARG_TYPE reg_arg_type = IS_INSN_TYPE (COP_REG_INS) ?
COP_ARG : IS_INSN_TYPE (COPS_REG_INS) ? COP_ARG : IS_INSN_TYPE (COPS_REG_INS) ?
COPS_ARG : NO_COP_ARG; COPS_ARG : (instruction->flags & USER_REG) ?
USER_REG_ARG : REG_ARG;
if (cop_ins != NO_COP_ARG) if ((reg_arg_type == COP_ARG) || (reg_arg_type == COPS_ARG))
{ {
/* Check for proper argument number. */ /* Check for proper argument number. */
if (processing_argument_number == 2) if (processing_argument_number == 2)
{ {
getregliststring (a->constant, string, cop_ins); getregliststring (a->constant, string, reg_arg_type);
func (stream, "%s", string); func (stream, "%s", string);
} }
else else
@ -532,7 +549,7 @@ print_arg (argument *a, struct disassemble_info *info)
} }
else else
{ {
getregliststring (a->constant, string, cop_ins); getregliststring (a->constant, string, reg_arg_type);
func (stream, "%s", string); func (stream, "%s", string);
} }
} }