Commit a1c741f0 by Richard Sandiford Committed by Richard Sandiford

mips.c (mips_has_long_branch_p): New function, split out from...

gcc/
	* config/mips/mips.c (mips_has_long_branch_p): New function,
	split out from...
	(mips_expand_ghost_gp_insns): ...here.  Look inside sequences.

From-SVN: r190701
parent 62332eba
2012-08-26 Richard Sandiford <rdsandiford@googlemail.com> 2012-08-26 Richard Sandiford <rdsandiford@googlemail.com>
* config/mips/mips.c (mips_has_long_branch_p): New function,
split out from...
(mips_expand_ghost_gp_insns): ...here. Look inside sequences.
2012-08-26 Richard Sandiford <rdsandiford@googlemail.com>
* config/mips/mips.c (r10k_safe_mem_expr_p): Use get_inner_reference. * config/mips/mips.c (r10k_safe_mem_expr_p): Use get_inner_reference.
2012-08-26 Richard Sandiford <rdsandiford@googlemail.com> 2012-08-26 Richard Sandiford <rdsandiford@googlemail.com>
......
...@@ -15478,23 +15478,15 @@ mips_reorg_process_insns (void) ...@@ -15478,23 +15478,15 @@ mips_reorg_process_insns (void)
htab_delete (htab); htab_delete (htab);
} }
/* If we are using a GOT, but have not decided to use a global pointer yet, /* Return true if the function has a long branch instruction. */
see whether we need one to implement long branches. Convert the ghost
global-pointer instructions into real ones if so. */
static bool static bool
mips_expand_ghost_gp_insns (void) mips_has_long_branch_p (void)
{ {
rtx insn; rtx insn, subinsn;
int normal_length; int normal_length;
/* Quick exit if we already know that we will or won't need a /* We need up-to-date instruction lengths. */
global pointer. */
if (!TARGET_USE_GOT
|| cfun->machine->global_pointer == INVALID_REGNUM
|| mips_must_initialize_gp_p ())
return false;
shorten_branches (get_insns ()); shorten_branches (get_insns ());
/* Look for a branch that is longer than normal. The normal length for /* Look for a branch that is longer than normal. The normal length for
...@@ -15503,12 +15495,32 @@ mips_expand_ghost_gp_insns (void) ...@@ -15503,12 +15495,32 @@ mips_expand_ghost_gp_insns (void)
but they have no delay slot. */ but they have no delay slot. */
normal_length = (TARGET_MIPS16 ? 4 : 8); normal_length = (TARGET_MIPS16 ? 4 : 8);
for (insn = get_insns (); insn; insn = NEXT_INSN (insn)) for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
if (JUMP_P (insn) FOR_EACH_SUBINSN (subinsn, insn)
&& USEFUL_INSN_P (insn) if (JUMP_P (subinsn)
&& get_attr_length (insn) > normal_length) && USEFUL_INSN_P (subinsn)
break; && get_attr_length (subinsn) > normal_length
&& (any_condjump_p (subinsn) || any_uncondjump_p (subinsn)))
return true;
return false;
}
/* If we are using a GOT, but have not decided to use a global pointer yet,
see whether we need one to implement long branches. Convert the ghost
global-pointer instructions into real ones if so. */
static bool
mips_expand_ghost_gp_insns (void)
{
/* Quick exit if we already know that we will or won't need a
global pointer. */
if (!TARGET_USE_GOT
|| cfun->machine->global_pointer == INVALID_REGNUM
|| mips_must_initialize_gp_p ())
return false;
if (insn == NULL_RTX) /* Run a full check for long branches. */
if (!mips_has_long_branch_p ())
return false; return false;
/* We've now established that we need $gp. */ /* We've now established that we need $gp. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment