diff options
author | Andrew Haley <aph@cygnus.com> | 1999-08-31 13:56:41 +0000 |
---|---|---|
committer | Andrew Haley <aph@gcc.gnu.org> | 1999-08-31 13:56:41 +0000 |
commit | 8230525836955815b66b3e2a7a46fd6a0dbb7fd6 (patch) | |
tree | e4b75b386d3224a945a249843d054795e1103c69 | |
parent | 04b9e2bf66e4c90ea63239d63bfa3c8e19a55ecb (diff) | |
download | gcc-8230525836955815b66b3e2a7a46fd6a0dbb7fd6.zip gcc-8230525836955815b66b3e2a7a46fd6a0dbb7fd6.tar.gz gcc-8230525836955815b66b3e2a7a46fd6a0dbb7fd6.tar.bz2 |
mips.c (machine_dependent_reorg): Force a barrier to output the local constant pool if...
Fri Aug 20 13:43:41 1999 Andrew Haley <aph@cygnus.com>
* config/mips/mips.c (machine_dependent_reorg): Force a
barrier to output the local constant pool if a barrier hasn't
been found at a natural point in the instruction stream.
From-SVN: r29004
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/mips/mips.c | 50 |
2 files changed, 36 insertions, 20 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index caf5c00..417a342 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +Fri Aug 20 13:43:41 1999 Andrew Haley <aph@cygnus.com> + + * config/mips/mips.c (machine_dependent_reorg): Force a + barrier to output the local constant pool if a barrier hasn't + been found at a natural point in the instruction stream. + Mon Aug 30 22:04:36 1999 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> * c-parse.in (language_string): Constify. diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c index 4c61676..51838ea 100644 --- a/gcc/config/mips/mips.c +++ b/gcc/config/mips/mips.c @@ -8372,7 +8372,7 @@ void machine_dependent_reorg (first) rtx first; { - int insns_len, max_internal_pool_size, pool_size, addr; + int insns_len, max_internal_pool_size, pool_size, addr, first_constant_ref; rtx insn; struct constant *constants; @@ -8440,6 +8440,7 @@ machine_dependent_reorg (first) constants = NULL; addr = 0; + first_constant_ref = -1; for (insn = first; insn; insn = NEXT_INSN (insn)) { @@ -8498,6 +8499,9 @@ machine_dependent_reorg (first) SET_DEST (PATTERN (insn)), newsrc); INSN_CODE (insn) = -1; + + if (first_constant_ref < 0) + first_constant_ref = addr; } } @@ -8529,27 +8533,33 @@ machine_dependent_reorg (first) if (constants != NULL) dump_constants (constants, insn); constants = NULL; + first_constant_ref = -1; } + + if (constants != NULL + && (NEXT_INSN (insn) == NULL + || (first_constant_ref >= 0 + && (((addr - first_constant_ref) + + 2 /* for alignment */ + + 2 /* for a short jump insn */ + + pool_size) + >= 0x8000)))) + { + /* If we haven't had a barrier within 0x8000 bytes of a + constant reference or we are at the end of the function, + emit a barrier now. */ - /* ??? If we don't find a barrier within 0x8000 bytes of - instructions and constants in CONSTANTS, we need to invent - one. This seems sufficiently unlikely that I am not going to - worry about it. */ - } - - if (constants != NULL) - { - rtx label, jump, barrier; - - label = gen_label_rtx (); - jump = emit_jump_insn_after (gen_jump (label), get_last_insn ()); - JUMP_LABEL (jump) = label; - LABEL_NUSES (label) = 1; - barrier = emit_barrier_after (jump); - emit_label_after (label, barrier); - dump_constants (constants, barrier); - constants = NULL; - } + rtx label, jump, barrier; + + label = gen_label_rtx (); + jump = emit_jump_insn_after (gen_jump (label), insn); + JUMP_LABEL (jump) = label; + LABEL_NUSES (label) = 1; + barrier = emit_barrier_after (jump); + emit_label_after (label, barrier); + first_constant_ref = -1; + } + } /* ??? If we output all references to a constant in internal constants table, we don't need to output the constant in the real |