Added -V option to print version number.
[binutils-gdb.git] / binutils / sparc-pinsn.c
index 64eee5ae51f8a660114364d82836e5b8941a02e3..2430b5d4f6165748bb7d5729cbf88c514c762d79 100644 (file)
@@ -1,12 +1,12 @@
 /* disassemble sparc instructions for objdump
-   Copyright (C) 1986, 1987, 1989 Free Software Foundation, Inc.
+   Copyright (C) 1986, 1987, 1989, 1991 Free Software Foundation, Inc.
 
 
 This file is part of the binutils.
 
 The binutils are free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 1, or (at your option)
+the Free Software Foundation; either version 2, or (at your option)
 any later version.
 
 The binutils are distributed in the hope that they will be useful,
@@ -18,53 +18,11 @@ You should have received a copy of the GNU General Public License
 along with the binutils; see the file COPYING.  If not, write to
 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
-/* $Id$
-   $Log$
-   Revision 1.4  1991/05/22 01:17:48  rich
-   v9 stuff.
-
- * Revision 1.3  1991/05/19  08:00:57  rich
- * Updated to relect a gdb change in sparc-opcode.h.
- *
- * Revision 1.2  1991/04/18  21:14:21  steve
- * Send the right # of args to an fprintf
- *
- * Revision 1.1.1.1  1991/03/21  21:26:56  gumby
- * Back from Intel with Steve
- *
- * Revision 1.1  1991/03/21  21:26:55  gumby
- * Initial revision
- *
- * Revision 1.1  1991/03/13  00:34:40  chrisb
- * Initial revision
- *
- * Revision 1.3  1991/03/09  04:36:31  rich
- *  Modified Files:
- *     sparc-pinsn.c ostrip.c objdump.c m68k-pinsn.c i960-pinsn.c
- *     binutils.h
- *
- * Pulled sysdep.h out of bfd.h.
- *
- * Revision 1.2  1991/03/08  21:54:53  rich
- *  Modified Files:
- *     Makefile ar.c binutils.h bucomm.c copy.c cplus-dem.c getopt.c
- *     i960-pinsn.c m68k-pinsn.c nm.c objdump.c sparc-opcode.h
- *     sparc-pinsn.c strip.c
- *
- * Verifying Portland tree with steve's last changes.  Also, some partial
- * porting.
- *
- * Revision 1.1  1991/02/22  16:48:04  sac
- * Initial revision
- *
-*/
-
-#include <stdio.h>
-#include "sysdep.h"
 #include "bfd.h"
-#include "sparc-opcode.h"
-
-extern int fputs();
+#include "sysdep.h"
+#include <stdio.h>
+#include "opcode/sparc.h"
+#include "objdump.h"
 extern int print_address();
 
 static  char *reg_names[] =
@@ -129,7 +87,7 @@ union sparc_insn
        unsigned int op2:3;
        unsigned int p:1;
        unsigned int DISP21:21;
-#define        disp21  branch.DISP21
+#define        disp21  branch2.DISP21
       } branch2;
 #endif /* NO_V9 */
 
@@ -137,8 +95,8 @@ union sparc_insn
     struct
       {
        unsigned int _OP:2;
-       unsigned int DISP30:30;
-#define        disp30  call.DISP30
+       unsigned int _DISP30:30;
+#define        disp30  call._DISP30
       } call;
   };
 
@@ -220,32 +178,34 @@ memcpy(&insn,buffer, sizeof (insn));
 
            if (opcode->args[0] != ',')
              fputs (" ", stream);
-           for (s = opcode->args; *s != '\0'; ++s) {
-               while (*s == ',') {
-                       fputs (",", stream);
-                       ++s;
-
-                       switch (*s) {
-                       case 'a':
-                               fputs ("a", stream);
-                               ++s;
-                               continue;
+           for (s = opcode->args; *s != '\0'; ++s)
+             {
+               while (*s == ',')
+                 {
+                   fputs (",", stream);
+                   ++s;
+
+                   switch (*s) {
+                   case 'a':
+                     fputs ("a", stream);
+                     ++s;
+                     continue;
 #ifndef NO_V9
-                       case 'N':
-                               fputs("pn", stream);
-                               ++s;
-                               continue;
-
-                       case 'T':
-                               fputs("pt", stream);
-                               ++s;
-                               continue;
-#endif /* NO_V9 */
-
-                       default:
-                               break;
-                       } /* switch on arg */
-               } /* while there are comma started args */
+                   case 'N':
+                     fputs("pn", stream);
+                     ++s;
+                     continue;
+
+                   case 'T':
+                     fputs("pt", stream);
+                     ++s;
+                     continue;
+#endif                         /* NO_V9 */
+
+                   default:
+                     break;
+                   }           /* switch on arg */
+                 }             /* while there are comma started args */
 
                fputs (" ", stream);
                        
@@ -280,14 +240,30 @@ memcpy(&insn,buffer, sizeof (insn));
 
 #define        freg(n) fprintf (stream, "%%%s", freg_names[n])
                  case 'e':
+                 case 'v':     /* double/even */
+                 case 'V':     /* quad/multiple of 4 */
                    freg (insn.rs1);
                    break;
 
                  case 'f':
+                 case 'B':     /* double/even */
+                 case 'R':     /* quad/multiple of 4 */
                    freg (insn.rs2);
                    break;
 
+#ifndef NO_V9
+/* Somebody who know needs to define rs3.
+                 case 'j':
+                 case 'u':     * double/even *
+                 case 'U':     * quad/multiple of 4 *
+                   freg (insn.rs3);
+                   break;
+*/
+#endif                         /* NO_V9 */
+
                  case 'g':
+                 case 'H':     /* double/even */
+                 case 'J':     /* quad/multiple of 4 */
                    freg (insn.rd);
                    break;
 #undef freg
@@ -308,7 +284,7 @@ memcpy(&insn,buffer, sizeof (insn));
 
                  case 'h':
                    fprintf (stream, "%%hi(%#x)",
-                                     (unsigned int) insn.imm22 << 10);
+                            (unsigned int) insn.imm22 << 10);
                    break;
 
                  case 'i':
@@ -319,7 +295,7 @@ memcpy(&insn,buffer, sizeof (insn));
 
                      /* Check to see whether we have a 1+i, and take
                         note of that fact.
-
+                        
                         Note: because of the way we sort the table,
                         we will be matching 1+i rather than i+1,
                         so it is OK to assume that i is after +,
@@ -342,28 +318,43 @@ memcpy(&insn,buffer, sizeof (insn));
                                   stream);
                    break;
 
-                 case 'K':
+                 case 'G':
                    print_address ((bfd_vma)
                                   (memaddr
-                                   + (((int) insn.disp21 << 11) >> 11) * 4),
+                                   /* We use only 19 of the 21 bits.  */
+                                   + (((int) insn.disp21 << 13) >> 13) * 4),
                                   stream);
                    break;
 
-           case 'Y':
+                 case 'Y':
                    fputs ("%amr", stream);
                    break;
 
-#endif /* NO_V9 */
+                 case '6':
+                 case '7':
+                 case '8':
+                 case '9':
+                   fprintf (stream, "fcc%c", *s - '6' + '0');
+                   break;
+
+                 case 'z':
+                   fputs ("icc", stream);
+                   break;
+
+                 case 'Z':
+                   fputs ("xcc", stream);
+                   break;
+#endif                         /* NO_V9 */
 
-           case 'M':
+                 case 'M':
                    fprintf(stream, "%%asr%d", insn.rs1);
                    break;
                    
-           case 'm':
+                 case 'm':
                    fprintf(stream, "%%asr%d", insn.rd);
                    break;
                    
-           case 'L':
+                 case 'L':
                    print_address ((bfd_vma) memaddr + insn.disp30 * 4,
                                   stream);
                    break;
@@ -373,7 +364,7 @@ memcpy(&insn,buffer, sizeof (insn));
                      /* Special case for `unimp'.  Don't try to turn
                         it's operand into a function offset.  */
                      fprintf (stream, "%#x",
-                                       (unsigned) (((int) insn.disp22 << 10) >> 10));
+                              (unsigned) (((int) insn.disp22 << 10) >> 10));
                    else
                      /* We cannot trust the compiler to sign-extend
                         when extracting the bitfield, hence the shifts.  */
@@ -431,7 +422,7 @@ memcpy(&insn,buffer, sizeof (insn));
          if (imm_added_to_rs1)
            {
              union sparc_insn prev_insn;
-             int errcode;
+             int errcode = 0;
 
              memcpy(&prev_insn, buffer -4,  sizeof (prev_insn));