2009-09-10 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
authorAndreas Krebbel <Andreas.Krebbel@de.ibm.com>
Thu, 10 Sep 2009 08:47:20 +0000 (08:47 +0000)
committerAndreas Krebbel <Andreas.Krebbel@de.ibm.com>
Thu, 10 Sep 2009 08:47:20 +0000 (08:47 +0000)
* s390-dis.c (s390_extract_operand): Remove the shift for pcrel operands.
(print_insn_s390): Signextend and shift pcrel operands before printing.

opcodes/ChangeLog
opcodes/s390-dis.c

index dc0f487..d30b9b9 100644 (file)
@@ -1,3 +1,8 @@
+2009-09-10  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>
+       
+       * s390-dis.c (s390_extract_operand): Remove the shift for pcrel operands.
+       (print_insn_s390): Signextend and shift pcrel operands before printing.
+
 2009-09-09  H.J. Lu  <hongjiu.lu@intel.com>
 
        * i386-dis.c (vex_len_table): Change VEX_LEN_AE_R_X_M0 to
index e4e9cad..fe208ba 100644 (file)
@@ -81,6 +81,10 @@ init_disasm (struct disassemble_info *info)
 }
 
 /* Extracts an operand value from an instruction.  */
+/* We do not perform the shift operation for larl-type address
+   operands here since that would lead to an overflow of the 32 bit
+   integer value.  Instead the shift operation is done when printing
+   the operand in print_insn_s390.  */
 
 static inline unsigned int
 s390_extract_operand (unsigned char *insn, const struct s390_operand *operand)
@@ -111,10 +115,6 @@ s390_extract_operand (unsigned char *insn, const struct s390_operand *operand)
       && (val & (1U << (operand->bits - 1))))
     val |= (-1U << (operand->bits - 1)) << 1;
 
-  /* Double value if the operand is pc relative.  */
-  if (operand->flags & S390_OPERAND_PCREL)
-    val <<= 1;
-
   /* Length x in an instructions has real length x + 1.  */
   if (operand->flags & S390_OPERAND_LENGTH)
     val++;
@@ -222,7 +222,8 @@ print_insn_s390 (bfd_vma memaddr, struct disassemble_info *info)
              else if (operand->flags & S390_OPERAND_CR)
                (*info->fprintf_func) (info->stream, "%%c%i", value);
              else if (operand->flags & S390_OPERAND_PCREL)
-               (*info->print_address_func) (memaddr + (int) value, info);
+               (*info->print_address_func) (memaddr +
+                                            (((long long)(int)value) << 1), info);
              else if (operand->flags & S390_OPERAND_SIGNED)
                (*info->fprintf_func) (info->stream, "%i", (int) value);
              else