From: Andreas Krebbel Date: Thu, 10 Sep 2009 08:47:20 +0000 (+0000) Subject: 2009-09-10 Andreas Krebbel X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=7330f9c3a4f7d88cc21d6a1163d0099b372799c5;p=binutils-gdb.git 2009-09-10 Andreas Krebbel * s390-dis.c (s390_extract_operand): Remove the shift for pcrel operands. (print_insn_s390): Signextend and shift pcrel operands before printing. --- diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index dc0f487257d..d30b9b93be3 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,8 @@ +2009-09-10 Andreas Krebbel + + * 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 * i386-dis.c (vex_len_table): Change VEX_LEN_AE_R_X_M0 to diff --git a/opcodes/s390-dis.c b/opcodes/s390-dis.c index e4e9cad05ce..fe208ba9ff2 100644 --- a/opcodes/s390-dis.c +++ b/opcodes/s390-dis.c @@ -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