* config/tc-arm.c (parse_address_main): Handle -0 offsets.
	(encode_arm_addr_mode_2): Set default sign of zero here ...
	(encode_arm_addr_mode_3): ... and here.
	(encode_arm_cp_address): ... and here.
	(md_apply_fix): Use default sign of zero here.

	gas/testsuite/
	* gas/arm/inst.d: Adjust for signed zero offsets.
	* gas/arm/ldst-offset0.d: New test.
	* gas/arm/ldst-offset0.s: New test.
	* gas/arm/offset-1.d: New test.
	* gas/arm/offset-1.s: New test.

	ld/testsuite/
	Adjust tests for zero offset formatting.
	* ld-arm/cortex-a8-fix-bcc-plt.d: Adjust.
	* ld-arm/farcall-arm-arm-pic-veneer.d: Adjust.
	* ld-arm/farcall-arm-thumb.d: Adjust.
	* ld-arm/farcall-group-size2.d: Adjust.
	* ld-arm/farcall-group.d: Adjust.
	* ld-arm/farcall-mix.d: Adjust.
	* ld-arm/farcall-mix2.d: Adjust.
	* ld-arm/farcall-mixed-lib-v4t.d: Adjust.
	* ld-arm/farcall-mixed-lib.d: Adjust.
	* ld-arm/farcall-thumb-arm-blx-pic-veneer.d: Adjust.
	* ld-arm/farcall-thumb-arm-pic-veneer.d: Adjust.
	* ld-arm/farcall-thumb-thumb.d: Adjust.
	* ld-arm/ifunc-10.dd: Adjust.
	* ld-arm/ifunc-3.dd: Adjust.
	* ld-arm/ifunc-4.dd: Adjust.
	* ld-arm/ifunc-5.dd: Adjust.
	* ld-arm/ifunc-6.dd: Adjust.
	* ld-arm/ifunc-7.dd: Adjust.
	* ld-arm/ifunc-8.dd: Adjust.
	* ld-arm/jump-reloc-veneers-long.d: Adjust.
	* ld-arm/tls-longplt-lib.d: Adjust.
	* ld-arm/tls-thumb1.d: Adjust.

	opcodes/
	* arm-dis.c (print_insn_coprocessor): Explicitly print #-0
	as address offset.
	(print_arm_address): Likewise. Elide positive #0 appropriately.
	(print_insn_arm): Likewise.
This commit is contained in:
Nathan Sidwell
2011-06-02 15:32:10 +00:00
parent 65fdb766be
commit 26d97720ed
33 changed files with 502 additions and 224 deletions

View File

@@ -1893,6 +1893,8 @@ print_insn_coprocessor (bfd_vma pc,
func (stream, ", #%d]%s",
offset,
WRITEBACK_BIT_SET ? "!" : "");
else if (NEGATIVE_BIT_SET)
func (stream, ", #-0]");
else
func (stream, "]");
}
@@ -1904,10 +1906,14 @@ print_insn_coprocessor (bfd_vma pc,
{
if (offset)
func (stream, ", #%d", offset);
else if (NEGATIVE_BIT_SET)
func (stream, ", #-0");
}
else
{
func (stream, ", {%d}", offset);
func (stream, ", {%s%d}",
(NEGATIVE_BIT_SET && !offset) ? "-" : "",
offset);
value_in_comment = offset;
}
}
@@ -2338,13 +2344,15 @@ print_arm_address (bfd_vma pc, struct disassemble_info *info, long given)
func (stream, "[pc");
if (NEGATIVE_BIT_SET)
offset = - offset;
if (PRE_BIT_SET)
{
/* Pre-indexed. */
func (stream, ", #%d]", offset);
/* Pre-indexed. Elide offset of positive zero when
non-writeback. */
if (WRITEBACK_BIT_SET || NEGATIVE_BIT_SET || offset)
func (stream, ", #%s%d", NEGATIVE_BIT_SET ? "-" : "", offset);
if (NEGATIVE_BIT_SET)
offset = -offset;
offset += pc + 8;
@@ -2352,12 +2360,11 @@ print_arm_address (bfd_vma pc, struct disassemble_info *info, long given)
being used. Probably a very dangerous thing
for the programmer to do, but who are we to
argue ? */
if (WRITEBACK_BIT_SET)
func (stream, "!");
func (stream, "]%s", WRITEBACK_BIT_SET ? "!" : "");
}
else /* Post indexed. */
{
func (stream, "], #%d", offset);
func (stream, "], #%s%d", NEGATIVE_BIT_SET ? "-" : "", offset);
/* Ie ignore the offset. */
offset = pc + 8;
@@ -2376,15 +2383,14 @@ print_arm_address (bfd_vma pc, struct disassemble_info *info, long given)
{
if ((given & 0x02000000) == 0)
{
/* Elide offset of positive zero when non-writeback. */
offset = given & 0xfff;
if (offset)
func (stream, ", #%s%d",
NEGATIVE_BIT_SET ? "-" : "", offset);
if (WRITEBACK_BIT_SET || NEGATIVE_BIT_SET || offset)
func (stream, ", #%s%d", NEGATIVE_BIT_SET ? "-" : "", offset);
}
else
{
func (stream, ", %s",
NEGATIVE_BIT_SET ? "-" : "");
func (stream, ", %s", NEGATIVE_BIT_SET ? "-" : "");
arm_decode_shift (given, func, stream, TRUE);
}
@@ -2395,12 +2401,10 @@ print_arm_address (bfd_vma pc, struct disassemble_info *info, long given)
{
if ((given & 0x02000000) == 0)
{
/* Always show offset. */
offset = given & 0xfff;
if (offset)
func (stream, "], #%s%d",
NEGATIVE_BIT_SET ? "-" : "", offset);
else
func (stream, "]");
func (stream, "], #%s%d",
NEGATIVE_BIT_SET ? "-" : "", offset);
}
else
{
@@ -2993,20 +2997,23 @@ print_insn_arm (bfd_vma pc, struct disassemble_info *info, long given)
/* PC relative with immediate offset. */
int offset = ((given & 0xf00) >> 4) | (given & 0xf);
if (NEGATIVE_BIT_SET)
offset = - offset;
if (PRE_BIT_SET)
{
if (offset)
func (stream, "[pc, #%d]\t; ", offset);
/* Elide positive zero offset. */
if (offset || NEGATIVE_BIT_SET)
func (stream, "[pc, #%s%d]\t; ",
NEGATIVE_BIT_SET ? "-" : "", offset);
else
func (stream, "[pc]\t; ");
func (stream, "[pc]\t; ");
if (NEGATIVE_BIT_SET)
offset = -offset;
info->print_address_func (offset + pc + 8, info);
}
else
{
func (stream, "[pc], #%d", offset);
/* Always show the offset. */
func (stream, "[pc], #%s%d",
NEGATIVE_BIT_SET ? "-" : "", offset);
if (! allow_unpredictable)
is_unpredictable = TRUE;
}
@@ -3015,9 +3022,6 @@ print_insn_arm (bfd_vma pc, struct disassemble_info *info, long given)
{
int offset = ((given & 0xf00) >> 4) | (given & 0xf);
if (NEGATIVE_BIT_SET)
offset = - offset;
func (stream, "[%s",
arm_regnames[(given >> 16) & 0xf]);
@@ -3025,13 +3029,15 @@ print_insn_arm (bfd_vma pc, struct disassemble_info *info, long given)
{
if (IMMEDIATE_BIT_SET)
{
if (WRITEBACK_BIT_SET)
/* Immediate Pre-indexed. */
/* PR 10924: Offset must be printed, even if it is zero. */
func (stream, ", #%d", offset);
else if (offset)
/* Immediate Offset: printing zero offset is optional. */
func (stream, ", #%d", offset);
/* Elide offset for non-writeback
positive zero. */
if (WRITEBACK_BIT_SET || NEGATIVE_BIT_SET
|| offset)
func (stream, ", #%s%d",
NEGATIVE_BIT_SET ? "-" : "", offset);
if (NEGATIVE_BIT_SET)
offset = -offset;
value_in_comment = offset;
}
@@ -3059,7 +3065,10 @@ print_insn_arm (bfd_vma pc, struct disassemble_info *info, long given)
{
/* Immediate Post-indexed. */
/* PR 10924: Offset must be printed, even if it is zero. */
func (stream, "], #%d", offset);
func (stream, "], #%s%d",
NEGATIVE_BIT_SET ? "-" : "", offset);
if (NEGATIVE_BIT_SET)
offset = -offset;
value_in_comment = offset;
}
else