2005-09-19 David Edelsohn <edelsohn@gnu.org>
[deliverable/binutils-gdb.git] / opcodes / s390-dis.c
index 8745a8943739e10960973b7c07eb7aa71489caa5..9b0a063b93696a5e8c442e7609af42bd548ab37c 100644 (file)
@@ -1,5 +1,5 @@
 /* s390-dis.c -- Disassemble S390 instructions
-   Copyright 2000, 2001, 2002 Free Software Foundation, Inc.
+   Copyright 2000, 2001, 2002, 2003, 2005 Free Software Foundation, Inc.
    Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
 
    This file is part of GDB, GAS and the GNU binutils.
@@ -16,8 +16,8 @@
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-   02111-1307, USA.  */
+   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+   02110-1301, USA.  */
 
 #include <stdio.h>
 #include "ansidecl.h"
@@ -29,15 +29,10 @@ static int init_flag = 0;
 static int opc_index[256];
 static int current_arch_mask = 0;
 
-static void init_disasm PARAMS ((struct disassemble_info *));
-static unsigned int s390_extract_operand
-  PARAMS ((unsigned char *, const struct s390_operand *));
-
 /* Set up index table for first opcode byte.  */
 
 static void
-init_disasm (info)
-     struct disassemble_info *info;
+init_disasm (struct disassemble_info *info)
 {
   const struct s390_opcode *opcode;
   const struct s390_opcode *opcode_end;
@@ -57,7 +52,7 @@ init_disasm (info)
       current_arch_mask = 1 << S390_OPCODE_ESA;
       break;
     case bfd_mach_s390_64:
-      current_arch_mask = 1 << S390_OPCODE_ESAME;
+      current_arch_mask = 1 << S390_OPCODE_ZARCH;
       break;
     default:
       abort ();
@@ -68,9 +63,7 @@ init_disasm (info)
 /* Extracts an operand value from an instruction.  */
 
 static inline unsigned int
-s390_extract_operand (insn, operand)
-     unsigned char *insn;
-     const struct s390_operand *operand;
+s390_extract_operand (unsigned char *insn, const struct s390_operand *operand)
 {
   unsigned int val;
   int bits;
@@ -89,6 +82,10 @@ s390_extract_operand (insn, operand)
   val >>= -bits;
   val &= ((1U << (operand->bits - 1)) << 1) - 1;
 
+  /* Check for special long displacement case.  */
+  if (operand->bits == 20 && operand->shift == 20)
+    val = (val & 0xff) << 12 | (val & 0xfff00) >> 8;
+
   /* Sign extend value if the operand is signed or pc relative.  */
   if ((operand->flags & (S390_OPERAND_SIGNED | S390_OPERAND_PCREL))
       && (val & (1U << (operand->bits - 1))))
@@ -98,7 +95,7 @@ s390_extract_operand (insn, operand)
   if (operand->flags & S390_OPERAND_PCREL)
     val <<= 1;
 
-  /* Length x in an instructions has real length x+1.  */
+  /* Length x in an instructions has real length x + 1.  */
   if (operand->flags & S390_OPERAND_LENGTH)
     val++;
   return val;
@@ -107,9 +104,7 @@ s390_extract_operand (insn, operand)
 /* Print a S390 instruction.  */
 
 int
-print_insn_s390 (memaddr, info)
-     bfd_vma memaddr;
-     struct disassemble_info *info;
+print_insn_s390 (bfd_vma memaddr, struct disassemble_info *info)
 {
   bfd_byte buffer[6];
   const struct s390_opcode *opcode;
@@ -161,7 +156,7 @@ print_insn_s390 (memaddr, info)
          const unsigned char *opindex;
 
          /* Check architecture.  */
-         if (!(opcode->architecture & current_arch_mask))
+         if (!(opcode->modes & current_arch_mask))
            continue;
          /* Check signature of the opcode.  */
          if ((buffer[1] & opcode->mask[1]) != opcode->opcode[1]
@@ -211,7 +206,7 @@ print_insn_s390 (memaddr, info)
              else if (operand->flags & S390_OPERAND_SIGNED)
                (*info->fprintf_func) (info->stream, "%i", (int) value);
              else
-               (*info->fprintf_func) (info->stream, "%i", value);
+               (*info->fprintf_func) (info->stream, "%u", value);
 
              if (operand->flags & S390_OPERAND_DISP)
                {
This page took 0.023804 seconds and 4 git commands to generate.