@@ -564,8 +564,6 @@ static const struct op_code_struct {
564
564
565
565
/* prefix for register names */
566
566
#define register_prefix "r"
567
- static const char pvr_register_prefix [] = "rpvr" ;
568
-
569
567
570
568
/* #defines for valid immediate range */
571
569
#define MIN_IMM ((int) 0x80000000)
@@ -580,6 +578,7 @@ static const char pvr_register_prefix[] = "rpvr";
580
578
581
579
#define PRIreg register_prefix "%ld"
582
580
#define PRIrfsl register_prefix "fsl%ld"
581
+ #define PRIpvr register_prefix "pvr%d"
583
582
#define PRIimm "%d"
584
583
585
584
#define get_field_rd (instr ) ((instr & RD_MASK) >> RD_LOW)
@@ -593,83 +592,48 @@ static const char pvr_register_prefix[] = "rpvr";
593
592
#define get_int_field_imm (instr ) ((instr & IMM_MASK) >> IMM_LOW)
594
593
#define get_int_field_r1 (instr ) ((instr & RA_MASK) >> RA_LOW)
595
594
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 )
612
596
{
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
+ }
617
599
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
+ }
673
637
}
674
638
675
639
static unsigned long
@@ -739,6 +703,8 @@ print_insn_microblaze(bfd_vma memaddr, struct disassemble_info *info)
739
703
static bfd_vma prev_insn_addr = -1 ; /*init the prev insn addr */
740
704
static int prev_insn_vma = -1 ; /*init the prev insn vma */
741
705
int curr_insn_vma = info -> buffer_vma ;
706
+ int special ;
707
+ const char * special_name ;
742
708
743
709
info -> bytes_per_chunk = 4 ;
744
710
@@ -799,12 +765,26 @@ print_insn_microblaze(bfd_vma memaddr, struct disassemble_info *info)
799
765
op -> name , get_field_r1 (inst ), get_field_rfsl (inst ));
800
766
break ;
801
767
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
+ }
804
777
break ;
805
778
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
+ }
808
788
break ;
809
789
case INST_TYPE_RD_R1 :
810
790
fprintf_func (stream , "%s\t" PRIreg ", " PRIreg ,
0 commit comments