1 config/tc-ppc.c (md_apply_fix): Sign extend fieldval under control of operand flag bits.
3 Upstream-Status: Backport
5 Signed-off-by: Zhenhua Luo <zhenhua.luo@freescale.com>
7 commit cf5434698882f41ddfcc469488e8a68c674aae03
8 Author: Alan Modra <amodra@bigpond.net.au>
9 Date: Thu May 9 04:01:53 2013 +0000
11 --- binutils-2.23.2/gas/config/tc-ppc.c.orig 2013-06-02 21:53:24.000000000 -0500
12 +++ binutils-2.23.2/gas/config/tc-ppc.c 2013-06-02 22:03:00.000000000 -0500
13 @@ -6355,7 +6355,10 @@
14 case BFD_RELOC_LO16_PCREL:
15 case BFD_RELOC_PPC_VLE_LO16A:
16 case BFD_RELOC_PPC_VLE_LO16D:
17 - fieldval = SEX16 (value);
18 + fieldval = value & 0xffff;
20 + if ((operand->flags & PPC_OPERAND_SIGNED) != 0)
21 + fieldval = (fieldval ^ 0x8000) - 0x8000;
22 fixP->fx_no_overflow = 1;
26 case BFD_RELOC_HI16_PCREL:
27 case BFD_RELOC_PPC_VLE_HI16A:
28 case BFD_RELOC_PPC_VLE_HI16D:
29 - fieldval = SEX16 (PPC_HI (value));
30 - fixP->fx_no_overflow = 1;
32 + fieldval = PPC_HI (value);
33 + goto sign_extend_16;
35 case BFD_RELOC_HI16_S:
37 @@ -6377,38 +6379,33 @@
38 case BFD_RELOC_HI16_S_PCREL:
39 case BFD_RELOC_PPC_VLE_HA16A:
40 case BFD_RELOC_PPC_VLE_HA16D:
41 - fieldval = SEX16 (PPC_HA (value));
42 - fixP->fx_no_overflow = 1;
44 + fieldval = PPC_HA (value);
45 + goto sign_extend_16;
48 case BFD_RELOC_PPC64_HIGHER:
51 - fieldval = SEX16 (PPC_HIGHER (value));
52 - fixP->fx_no_overflow = 1;
54 + fieldval = PPC_HIGHER (value);
55 + goto sign_extend_16;
57 case BFD_RELOC_PPC64_HIGHER_S:
60 - fieldval = SEX16 (PPC_HIGHERA (value));
61 - fixP->fx_no_overflow = 1;
63 + fieldval = PPC_HIGHERA (value);
64 + goto sign_extend_16;
66 case BFD_RELOC_PPC64_HIGHEST:
69 - fieldval = SEX16 (PPC_HIGHEST (value));
70 - fixP->fx_no_overflow = 1;
72 + fieldval = PPC_HIGHEST (value);
73 + goto sign_extend_16;
75 case BFD_RELOC_PPC64_HIGHEST_S:
78 - fieldval = SEX16 (PPC_HIGHESTA (value));
79 - fixP->fx_no_overflow = 1;
81 + fieldval = PPC_HIGHESTA (value);
82 + goto sign_extend_16;
84 /* The following relocs can't be calculated by the assembler.
85 Leave the field zero. */