summaryrefslogtreecommitdiffstats
path: root/meta/recipes-devtools/binutils/binutils-2.23.2/backport/0002-config-tc-ppc.c-md_apply_fix-Sign-extend-fieldval-un.patch
blob: a62ca4704a42e0cf237903042a6d2dabdd75f21f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
config/tc-ppc.c (md_apply_fix): Sign extend fieldval under control of operand flag bits.

Upstream-Status: Backport

Signed-off-by: Zhenhua Luo <zhenhua.luo@freescale.com>

commit cf5434698882f41ddfcc469488e8a68c674aae03
Author: Alan Modra <amodra@bigpond.net.au>
Date:   Thu May 9 04:01:53 2013 +0000

--- binutils-2.23.2/gas/config/tc-ppc.c.orig	2013-06-02 21:53:24.000000000 -0500
+++ binutils-2.23.2/gas/config/tc-ppc.c	2013-06-02 22:03:00.000000000 -0500
@@ -6355,7 +6355,10 @@
 	case BFD_RELOC_LO16_PCREL:
 	case BFD_RELOC_PPC_VLE_LO16A:
 	case BFD_RELOC_PPC_VLE_LO16D:
-	  fieldval = SEX16 (value);
+	  fieldval = value & 0xffff;
+	sign_extend_16:
+	  if ((operand->flags & PPC_OPERAND_SIGNED) != 0)
+	    fieldval = (fieldval ^ 0x8000) - 0x8000;
 	  fixP->fx_no_overflow = 1;
 	  break;
 
@@ -6366,9 +6369,8 @@
 	case BFD_RELOC_HI16_PCREL:
 	case BFD_RELOC_PPC_VLE_HI16A:
 	case BFD_RELOC_PPC_VLE_HI16D:
-	  fieldval = SEX16 (PPC_HI (value));
-	  fixP->fx_no_overflow = 1;
-	  break;
+	  fieldval = PPC_HI (value);
+	  goto sign_extend_16;
 
 	case BFD_RELOC_HI16_S:
 	  if (fixP->fx_pcrel)
@@ -6377,38 +6379,33 @@
 	case BFD_RELOC_HI16_S_PCREL:
 	case BFD_RELOC_PPC_VLE_HA16A:
 	case BFD_RELOC_PPC_VLE_HA16D:
-	  fieldval = SEX16 (PPC_HA (value));
-	  fixP->fx_no_overflow = 1;
-	  break;
+	  fieldval = PPC_HA (value);
+	  goto sign_extend_16;
 
 #ifdef OBJ_ELF
 	case BFD_RELOC_PPC64_HIGHER:
 	  if (fixP->fx_pcrel)
 	    goto bad_pcrel;
-	  fieldval = SEX16 (PPC_HIGHER (value));
-	  fixP->fx_no_overflow = 1;
-	  break;
+	  fieldval = PPC_HIGHER (value);
+	  goto sign_extend_16;
 
 	case BFD_RELOC_PPC64_HIGHER_S:
 	  if (fixP->fx_pcrel)
 	    goto bad_pcrel;
-	  fieldval = SEX16 (PPC_HIGHERA (value));
-	  fixP->fx_no_overflow = 1;
-	  break;
+	  fieldval = PPC_HIGHERA (value);
+	  goto sign_extend_16;
 
 	case BFD_RELOC_PPC64_HIGHEST:
 	  if (fixP->fx_pcrel)
 	    goto bad_pcrel;
-	  fieldval = SEX16 (PPC_HIGHEST (value));
-	  fixP->fx_no_overflow = 1;
-	  break;
+	  fieldval = PPC_HIGHEST (value);
+	  goto sign_extend_16;
 
 	case BFD_RELOC_PPC64_HIGHEST_S:
 	  if (fixP->fx_pcrel)
 	    goto bad_pcrel;
-	  fieldval = SEX16 (PPC_HIGHESTA (value));
-	  fixP->fx_no_overflow = 1;
-	  break;
+	  fieldval = PPC_HIGHESTA (value);
+	  goto sign_extend_16;
 
 	  /* The following relocs can't be calculated by the assembler.
 	     Leave the field zero.  */
OpenPOWER on IntegriCloud