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] |
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] |