[PATCH/RFA] Print some basic float info in VAX disassembler

Jason R Thorpe thorpej@wasabisystems.com
Sat Apr 27 22:33:00 GMT 2002


Nothing really special, mostly just adds e.g. [d-float] or [g-float],
etc. after the raw bits; I'm not making any attempt to actually deocde
them yet :-)

OK to commit?

        * vax-dis.c: Update copyright years.
        (print_insn_arg): Pass the insn info to print_insn_mode. 
        (print_insn_mode): Print some basic info about floating
        point values.

-- 
        -- Jason R. Thorpe <thorpej@wasabisystems.com>
-------------- next part --------------
Index: vax-dis.c
===================================================================
RCS file: /cvs/src/src/opcodes/vax-dis.c,v
retrieving revision 1.6
diff -c -r1.6 vax-dis.c
*** vax-dis.c	20 Sep 2001 15:28:25 -0000	1.6
--- vax-dis.c	28 Apr 2002 05:15:02 -0000
***************
*** 1,5 ****
  /* Print VAX instructions.
!    Copyright 1995, 1998, 2000, 2001 Free Software Foundation, Inc.
     Contributed by Pauline Middelink <middelin@polyware.iaf.nl>
  
  This program is free software; you can redistribute it and/or modify
--- 1,5 ----
  /* Print VAX instructions.
!    Copyright 1995, 1998, 2000, 2001, 2002 Free Software Foundation, Inc.
     Contributed by Pauline Middelink <middelin@polyware.iaf.nl>
  
  This program is free software; you can redistribute it and/or modify
***************
*** 25,31 ****
  static int print_insn_arg
    PARAMS ((const char *, unsigned char *, bfd_vma, disassemble_info *));
  static int print_insn_mode
!   PARAMS ((int, unsigned char *, bfd_vma, disassemble_info *));
  
  
  static char *reg_names[] =
--- 25,31 ----
  static int print_insn_arg
    PARAMS ((const char *, unsigned char *, bfd_vma, disassemble_info *));
  static int print_insn_mode
!   PARAMS ((const char *, int, unsigned char *, bfd_vma, disassemble_info *));
  
  
  static char *reg_names[] =
***************
*** 223,233 ****
        return p - p0;
      }
  
!   return print_insn_mode (arg_len, p0, addr, info);
  }
  
  static int
! print_insn_mode (size, p0, addr, info)
       int size;
       unsigned char *p0;
       bfd_vma addr;		/* PC for this arg to be relative to */
--- 223,234 ----
        return p - p0;
      }
  
!   return print_insn_mode (d, arg_len, p0, addr, info);
  }
  
  static int
! print_insn_mode (d, size, p0, addr, info)
!      const char *d;
       int size;
       unsigned char *p0;
       bfd_vma addr;		/* PC for this arg to be relative to */
***************
*** 245,254 ****
      case 0x10:
      case 0x20:
      case 0x30: /* literal mode			$number */
!       (*info->fprintf_func) (info->stream, "$0x%x", mode);
        break;
      case 0x40: /* index:			base-addr[Rn] */
!       p += print_insn_mode (size, p0 + 1, addr + 1, info);
        (*info->fprintf_func) (info->stream, "[%s]", reg_names[reg]);
        break;
      case 0x50: /* register:			Rn */
--- 246,258 ----
      case 0x10:
      case 0x20:
      case 0x30: /* literal mode			$number */
!       if (d[1] == 'd' || d[1] == 'f' || d[1] == 'g' || d[1] == 'h')
! 	(*info->fprintf_func) (info->stream, "$0x%x [%c-float]", mode, d[1]);
!       else
!         (*info->fprintf_func) (info->stream, "$0x%x", mode);
        break;
      case 0x40: /* index:			base-addr[Rn] */
!       p += print_insn_mode (d, size, p0 + 1, addr + 1, info);
        (*info->fprintf_func) (info->stream, "[%s]", reg_names[reg]);
        break;
      case 0x50: /* register:			Rn */
***************
*** 267,274 ****
  
  	  FETCH_DATA (info, p + size);
  	  (*info->fprintf_func) (info->stream, "$0x");
! 	  for (i = 0; i < size; i++)
! 	    (*info->fprintf_func) (info->stream, "%02x", p[size - i - 1]);
  	  p += size;
  	}
        else
--- 271,300 ----
  
  	  FETCH_DATA (info, p + size);
  	  (*info->fprintf_func) (info->stream, "$0x");
! 	  if (d[1] == 'd' || d[1] == 'f' || d[1] == 'g' || d[1] == 'h')
! 	    {
! 	      int float_word;
! 
! 	      float_word = p[0] | (p[1] << 8);
! 	      if ((d[1] == 'd' || d[1] == 'f')
! 		  && (float_word & 0xff80) == 0x8000)
! 		{
! 		  (*info->fprintf_func) (info->stream, "[invalid %c-float]",
! 					 d[1]);
! 		}
! 	      else
! 		{
! 	          for (i = 0; i < size; i++)
! 		    (*info->fprintf_func) (info->stream, "%02x",
! 		                           p[size - i - 1]);
! 	          (*info->fprintf_func) (info->stream, " [%c-float]", d[1]);
! 		}
! 	    }
! 	  else
! 	    {
! 	      for (i = 0; i < size; i++)
! 	        (*info->fprintf_func) (info->stream, "%02x", p[size - i - 1]);
! 	    }
  	  p += size;
  	}
        else


More information about the Binutils mailing list