From 2bfa88dc7944a6275dd2bd28b01a095311d6c2ff Mon Sep 17 00:00:00 2001 From: Richard Earnshaw Date: Fri, 3 Sep 1999 16:27:57 +0000 Subject: [PATCH] arm.c (note_invalid_constants): No need to ignore ASMs, we can now rework these too. * arm.c (note_invalid_constants): No need to ignore ASMs, we can now rework these too. (arm_reorg): If an insn can't reach the end of the current pool, ensure that we emit that pool before the insn. From-SVN: r29084 --- gcc/ChangeLog | 7 +++++++ gcc/config/arm/arm.c | 21 +++++++++++++-------- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index edbc6d3643a..da0b2045511 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +Fri Sep 3 17:24:31 1999 Richard Earnshaw + + * arm.c (note_invalid_constants): No need to ignore ASMs, we can + now rework these too. + (arm_reorg): If an insn can't reach the end of the current pool, + ensure that we emit that pool before the insn. + Fri Sep 3 09:14:32 1999 Marc Espie * tlink.c (scan_linker_output): Skip the initial underscore in diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index c2d9768a7e5..69ec6fd8478 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -4236,10 +4236,6 @@ note_invalid_constants (insn, address) /* Extract the operands of the insn */ extract_insn(insn); - /* If this is an asm, we can't do anything about it (or can we?) */ - if (INSN_CODE (insn) < 0) - return; - /* Find the alternative selected */ if (! constrain_operands (1)) fatal_insn_not_found (insn); @@ -4375,11 +4371,20 @@ arm_reorg (first) barrier = last_barrier->insn; ftmp = last_barrier; } + /* ftmp is last fix that we can fit into this pool and we + failed to find a barrier that we could use. Insert a new + barrier in the code and arrange to jump around it. */ else - /* ftmp is last fix that we can fit into this pool and we - failed to find a barrier that we could use. Insert a new - barrier in the code and arrange to jump around it. */ - barrier = find_barrier (ftmp->insn, max_range - ftmp->address); + { + /* Check that there isn't another fix that is in range that + we couldn't fit into this pool because the pool was + already too large: we need to put the pool before such an + instruction. */ + if (ftmp->next && ftmp->next->address < max_range) + max_range = ftmp->address; + + barrier = find_barrier (ftmp->insn, max_range - ftmp->address); + } /* Scan over the fixes we have identified for this pool, fixing them up and adding the constants to the pool itself. */