Skip to content

Commit a45e0b5

Browse files
committed
disas/microblaze: Split get_field_special
Extract the raw special index and a function to lookup a name. Signed-off-by: Richard Henderson <[email protected]> Reviewed-by: Pierrick Bouvier <[email protected]> Message-Id: <[email protected]>
1 parent b35ab13 commit a45e0b5

File tree

1 file changed

+61
-81
lines changed

1 file changed

+61
-81
lines changed

disas/microblaze.c

Lines changed: 61 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -564,8 +564,6 @@ static const struct op_code_struct {
564564

565565
/* prefix for register names */
566566
#define register_prefix "r"
567-
static const char pvr_register_prefix[] = "rpvr";
568-
569567

570568
/* #defines for valid immediate range */
571569
#define MIN_IMM ((int) 0x80000000)
@@ -580,6 +578,7 @@ static const char pvr_register_prefix[] = "rpvr";
580578

581579
#define PRIreg register_prefix "%ld"
582580
#define PRIrfsl register_prefix "fsl%ld"
581+
#define PRIpvr register_prefix "pvr%d"
583582
#define PRIimm "%d"
584583

585584
#define get_field_rd(instr) ((instr & RD_MASK) >> RD_LOW)
@@ -593,83 +592,48 @@ static const char pvr_register_prefix[] = "rpvr";
593592
#define get_int_field_imm(instr) ((instr & IMM_MASK) >> IMM_LOW)
594593
#define get_int_field_r1(instr) ((instr & RA_MASK) >> RA_LOW)
595594

596-
/*
597-
char *
598-
get_field_special (instr)
599-
long instr;
600-
{
601-
char tmpstr[25];
602-
603-
snprintf(tmpstr, sizeof(tmpstr), "%s%s", register_prefix,
604-
(((instr & IMM_MASK) >> IMM_LOW) & REG_MSR_MASK) == 0 ? "pc" : "msr");
605-
606-
return(strdup(tmpstr));
607-
}
608-
*/
609-
610-
static char *
611-
get_field_special(long instr, const struct op_code_struct *op)
595+
static int get_field_special(long instr, const struct op_code_struct *op)
612596
{
613-
char tmpstr[25];
614-
char spr[6];
615-
616-
switch ( (((instr & IMM_MASK) >> IMM_LOW) ^ op->immval_mask) ) {
597+
return ((instr & IMM_MASK) >> IMM_LOW) ^ op->immval_mask;
598+
}
617599

618-
case REG_MSR_MASK :
619-
strcpy(spr, "msr");
620-
break;
621-
case REG_PC_MASK :
622-
strcpy(spr, "pc");
623-
break;
624-
case REG_EAR_MASK :
625-
strcpy(spr, "ear");
626-
break;
627-
case REG_ESR_MASK :
628-
strcpy(spr, "esr");
629-
break;
630-
case REG_FSR_MASK :
631-
strcpy(spr, "fsr");
632-
break;
633-
case REG_BTR_MASK :
634-
strcpy(spr, "btr");
635-
break;
636-
case REG_EDR_MASK :
637-
strcpy(spr, "edr");
638-
break;
639-
case REG_PID_MASK :
640-
strcpy(spr, "pid");
641-
break;
642-
case REG_ZPR_MASK :
643-
strcpy(spr, "zpr");
644-
break;
645-
case REG_TLBX_MASK :
646-
strcpy(spr, "tlbx");
647-
break;
648-
case REG_TLBLO_MASK :
649-
strcpy(spr, "tlblo");
650-
break;
651-
case REG_TLBHI_MASK :
652-
strcpy(spr, "tlbhi");
653-
break;
654-
case REG_TLBSX_MASK :
655-
strcpy(spr, "tlbsx");
656-
break;
657-
default :
658-
{
659-
if ( ((((instr & IMM_MASK) >> IMM_LOW) ^ op->immval_mask) & 0xE000) == REG_PVR_MASK) {
660-
snprintf(tmpstr, sizeof(tmpstr), "%s%u", pvr_register_prefix,
661-
(unsigned short)(((instr & IMM_MASK) >> IMM_LOW) ^
662-
op->immval_mask) ^ REG_PVR_MASK);
663-
return(strdup(tmpstr));
664-
} else {
665-
strcpy(spr, "pc");
666-
}
667-
}
668-
break;
669-
}
670-
671-
snprintf(tmpstr, sizeof(tmpstr), "%s%s", register_prefix, spr);
672-
return(strdup(tmpstr));
600+
/* Returns NULL for PVR registers, which should be rendered differently. */
601+
static const char *get_special_name(int special)
602+
{
603+
switch (special) {
604+
case REG_MSR_MASK:
605+
return register_prefix "msr";
606+
case REG_PC_MASK:
607+
return register_prefix "pc";
608+
case REG_EAR_MASK:
609+
return register_prefix "ear";
610+
case REG_ESR_MASK:
611+
return register_prefix "esr";
612+
case REG_FSR_MASK:
613+
return register_prefix "fsr";
614+
case REG_BTR_MASK:
615+
return register_prefix "btr";
616+
case REG_EDR_MASK:
617+
return register_prefix "edr";
618+
case REG_PID_MASK:
619+
return register_prefix "pid";
620+
case REG_ZPR_MASK:
621+
return register_prefix "zpr";
622+
case REG_TLBX_MASK:
623+
return register_prefix "tlbx";
624+
case REG_TLBLO_MASK:
625+
return register_prefix "tlblo";
626+
case REG_TLBHI_MASK:
627+
return register_prefix "tlbhi";
628+
case REG_TLBSX_MASK:
629+
return register_prefix "tlbsx";
630+
default:
631+
if ((special & 0xE000) == REG_PVR_MASK) {
632+
/* pvr register */
633+
return NULL;
634+
}
635+
return register_prefix "pc";
636+
}
673637
}
674638

675639
static unsigned long
@@ -739,6 +703,8 @@ print_insn_microblaze(bfd_vma memaddr, struct disassemble_info *info)
739703
static bfd_vma prev_insn_addr = -1; /*init the prev insn addr */
740704
static int prev_insn_vma = -1; /*init the prev insn vma */
741705
int curr_insn_vma = info->buffer_vma;
706+
int special;
707+
const char *special_name;
742708

743709
info->bytes_per_chunk = 4;
744710

@@ -799,12 +765,26 @@ print_insn_microblaze(bfd_vma memaddr, struct disassemble_info *info)
799765
op->name, get_field_r1(inst), get_field_rfsl(inst));
800766
break;
801767
case INST_TYPE_RD_SPECIAL:
802-
fprintf_func(stream, "%s\t" PRIreg ", %s",
803-
op->name, get_field_rd(inst), get_field_special(inst, op));
768+
special = get_field_special(inst, op);
769+
special_name = get_special_name(special);
770+
if (special_name) {
771+
fprintf_func(stream, "%s\t" PRIreg ", %s",
772+
op->name, get_field_rd(inst), special_name);
773+
} else {
774+
fprintf_func(stream, "%s\t" PRIreg ", " PRIpvr,
775+
op->name, get_field_rd(inst), special ^ REG_PVR_MASK);
776+
}
804777
break;
805778
case INST_TYPE_SPECIAL_R1:
806-
fprintf_func(stream, "%s\t%s, " PRIreg,
807-
op->name, get_field_special(inst, op), get_field_r1(inst));
779+
special = get_field_special(inst, op);
780+
special_name = get_special_name(special);
781+
if (special_name) {
782+
fprintf_func(stream, "%s\t%s, " PRIreg,
783+
op->name, special_name, get_field_r1(inst));
784+
} else {
785+
fprintf_func(stream, "%s\t" PRIpvr ", " PRIreg,
786+
op->name, special ^ REG_PVR_MASK, get_field_r1(inst));
787+
}
808788
break;
809789
case INST_TYPE_RD_R1:
810790
fprintf_func(stream, "%s\t" PRIreg ", " PRIreg,

0 commit comments

Comments
 (0)