]> code.ossystems Code Review - openembedded-core.git/blob
a62ca4704a42e0cf237903042a6d2dabdd75f21f
[openembedded-core.git] /
1 config/tc-ppc.c (md_apply_fix): Sign extend fieldval under control of operand flag bits.
2
3 Upstream-Status: Backport
4
5 Signed-off-by: Zhenhua Luo <zhenhua.luo@freescale.com>
6
7 commit cf5434698882f41ddfcc469488e8a68c674aae03
8 Author: Alan Modra <amodra@bigpond.net.au>
9 Date:   Thu May 9 04:01:53 2013 +0000
10
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;
19 +       sign_extend_16:
20 +         if ((operand->flags & PPC_OPERAND_SIGNED) != 0)
21 +           fieldval = (fieldval ^ 0x8000) - 0x8000;
22           fixP->fx_no_overflow = 1;
23           break;
24  
25 @@ -6366,9 +6369,8 @@
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;
31 -         break;
32 +         fieldval = PPC_HI (value);
33 +         goto sign_extend_16;
34  
35         case BFD_RELOC_HI16_S:
36           if (fixP->fx_pcrel)
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;
43 -         break;
44 +         fieldval = PPC_HA (value);
45 +         goto sign_extend_16;
46  
47  #ifdef OBJ_ELF
48         case BFD_RELOC_PPC64_HIGHER:
49           if (fixP->fx_pcrel)
50             goto bad_pcrel;
51 -         fieldval = SEX16 (PPC_HIGHER (value));
52 -         fixP->fx_no_overflow = 1;
53 -         break;
54 +         fieldval = PPC_HIGHER (value);
55 +         goto sign_extend_16;
56  
57         case BFD_RELOC_PPC64_HIGHER_S:
58           if (fixP->fx_pcrel)
59             goto bad_pcrel;
60 -         fieldval = SEX16 (PPC_HIGHERA (value));
61 -         fixP->fx_no_overflow = 1;
62 -         break;
63 +         fieldval = PPC_HIGHERA (value);
64 +         goto sign_extend_16;
65  
66         case BFD_RELOC_PPC64_HIGHEST:
67           if (fixP->fx_pcrel)
68             goto bad_pcrel;
69 -         fieldval = SEX16 (PPC_HIGHEST (value));
70 -         fixP->fx_no_overflow = 1;
71 -         break;
72 +         fieldval = PPC_HIGHEST (value);
73 +         goto sign_extend_16;
74  
75         case BFD_RELOC_PPC64_HIGHEST_S:
76           if (fixP->fx_pcrel)
77             goto bad_pcrel;
78 -         fieldval = SEX16 (PPC_HIGHESTA (value));
79 -         fixP->fx_no_overflow = 1;
80 -         break;
81 +         fieldval = PPC_HIGHESTA (value);
82 +         goto sign_extend_16;
83  
84           /* The following relocs can't be calculated by the assembler.
85              Leave the field zero.  */