This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] S/390: Fix objdump output of larl operand - take 2


Hi,

my former patch replaced the int data type with 'long' what fixes the
problem on 64bit but does not help on 32bit.

The better approach is anyway to do the shift when printing the
operand and leave all the bit fiddling at 32bit in order to make it
faster on 32 bit cross compile environments.

That patch makes http://sourceware.org/ml/binutils/2009-09/msg00232.html
obsolete.

Tested on s390x and s390 this time.

Bye,

-Andreas-


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.


Index: opcodes/s390-dis.c
===================================================================
--- opcodes/s390-dis.c.orig	2009-09-10 10:03:00.000000000 +0200
+++ opcodes/s390-dis.c	2009-09-10 10:14:21.000000000 +0200
@@ -81,6 +81,10 @@ init_disasm (struct disassemble_info *in
 }
 
 /* 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 *ins
       && (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
 	      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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]