Added -V option to print version number.
[binutils-gdb.git] / binutils / sparc-pinsn.c
index 68d057cdc047382e8840e9d26a050f3bcdc8ec01..2430b5d4f6165748bb7d5729cbf88c514c762d79 100644 (file)
@@ -18,14 +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$ */
-
 #include "bfd.h"
 #include "sysdep.h"
 #include <stdio.h>
 #include "opcode/sparc.h"
-
-extern int fputs();
+#include "objdump.h"
 extern int print_address();
 
 static  char *reg_names[] =
@@ -181,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);
                        
@@ -241,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
@@ -269,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':
@@ -280,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 +,
@@ -303,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;
@@ -334,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.  */
@@ -392,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));