* config/tc-ppc.c (md_apply_fix): Sign extend fieldval under
control of operand flag bits.
This commit is contained in:
parent
8f979b3d59
commit
da8094d796
|
@ -1,3 +1,8 @@
|
||||||
|
2013-05-09 Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
|
* config/tc-ppc.c (md_apply_fix): Sign extend fieldval under
|
||||||
|
control of operand flag bits.
|
||||||
|
|
||||||
2013-05-07 Alan Modra <amodra@gmail.com>
|
2013-05-07 Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
* config/tc-ppc.c (PPC_VLE_SPLIT16A): Delete unused macro.
|
* config/tc-ppc.c (PPC_VLE_SPLIT16A): Delete unused macro.
|
||||||
|
|
|
@ -6369,7 +6369,10 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
|
||||||
case BFD_RELOC_LO16_PCREL:
|
case BFD_RELOC_LO16_PCREL:
|
||||||
case BFD_RELOC_PPC_VLE_LO16A:
|
case BFD_RELOC_PPC_VLE_LO16A:
|
||||||
case BFD_RELOC_PPC_VLE_LO16D:
|
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;
|
fixP->fx_no_overflow = 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -6380,9 +6383,8 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
|
||||||
case BFD_RELOC_HI16_PCREL:
|
case BFD_RELOC_HI16_PCREL:
|
||||||
case BFD_RELOC_PPC_VLE_HI16A:
|
case BFD_RELOC_PPC_VLE_HI16A:
|
||||||
case BFD_RELOC_PPC_VLE_HI16D:
|
case BFD_RELOC_PPC_VLE_HI16D:
|
||||||
fieldval = SEX16 (PPC_HI (value));
|
fieldval = PPC_HI (value);
|
||||||
fixP->fx_no_overflow = 1;
|
goto sign_extend_16;
|
||||||
break;
|
|
||||||
|
|
||||||
case BFD_RELOC_HI16_S:
|
case BFD_RELOC_HI16_S:
|
||||||
if (fixP->fx_pcrel)
|
if (fixP->fx_pcrel)
|
||||||
|
@ -6391,38 +6393,33 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
|
||||||
case BFD_RELOC_HI16_S_PCREL:
|
case BFD_RELOC_HI16_S_PCREL:
|
||||||
case BFD_RELOC_PPC_VLE_HA16A:
|
case BFD_RELOC_PPC_VLE_HA16A:
|
||||||
case BFD_RELOC_PPC_VLE_HA16D:
|
case BFD_RELOC_PPC_VLE_HA16D:
|
||||||
fieldval = SEX16 (PPC_HA (value));
|
fieldval = PPC_HA (value);
|
||||||
fixP->fx_no_overflow = 1;
|
goto sign_extend_16;
|
||||||
break;
|
|
||||||
|
|
||||||
#ifdef OBJ_ELF
|
#ifdef OBJ_ELF
|
||||||
case BFD_RELOC_PPC64_HIGHER:
|
case BFD_RELOC_PPC64_HIGHER:
|
||||||
if (fixP->fx_pcrel)
|
if (fixP->fx_pcrel)
|
||||||
goto bad_pcrel;
|
goto bad_pcrel;
|
||||||
fieldval = SEX16 (PPC_HIGHER (value));
|
fieldval = PPC_HIGHER (value);
|
||||||
fixP->fx_no_overflow = 1;
|
goto sign_extend_16;
|
||||||
break;
|
|
||||||
|
|
||||||
case BFD_RELOC_PPC64_HIGHER_S:
|
case BFD_RELOC_PPC64_HIGHER_S:
|
||||||
if (fixP->fx_pcrel)
|
if (fixP->fx_pcrel)
|
||||||
goto bad_pcrel;
|
goto bad_pcrel;
|
||||||
fieldval = SEX16 (PPC_HIGHERA (value));
|
fieldval = PPC_HIGHERA (value);
|
||||||
fixP->fx_no_overflow = 1;
|
goto sign_extend_16;
|
||||||
break;
|
|
||||||
|
|
||||||
case BFD_RELOC_PPC64_HIGHEST:
|
case BFD_RELOC_PPC64_HIGHEST:
|
||||||
if (fixP->fx_pcrel)
|
if (fixP->fx_pcrel)
|
||||||
goto bad_pcrel;
|
goto bad_pcrel;
|
||||||
fieldval = SEX16 (PPC_HIGHEST (value));
|
fieldval = PPC_HIGHEST (value);
|
||||||
fixP->fx_no_overflow = 1;
|
goto sign_extend_16;
|
||||||
break;
|
|
||||||
|
|
||||||
case BFD_RELOC_PPC64_HIGHEST_S:
|
case BFD_RELOC_PPC64_HIGHEST_S:
|
||||||
if (fixP->fx_pcrel)
|
if (fixP->fx_pcrel)
|
||||||
goto bad_pcrel;
|
goto bad_pcrel;
|
||||||
fieldval = SEX16 (PPC_HIGHESTA (value));
|
fieldval = PPC_HIGHESTA (value);
|
||||||
fixP->fx_no_overflow = 1;
|
goto sign_extend_16;
|
||||||
break;
|
|
||||||
|
|
||||||
/* The following relocs can't be calculated by the assembler.
|
/* The following relocs can't be calculated by the assembler.
|
||||||
Leave the field zero. */
|
Leave the field zero. */
|
||||||
|
|
Loading…
Reference in New Issue