mips.c: Include rtl-iter.h.

gcc/
	* config/mips/mips.c: Include rtl-iter.h.
	(mips_small_data_pattern_1): Take an rtx rather than an rtx pointer.
	Take the context as a parameter instead of the containing MEM.
	Iterate over all subrtxes.
	(mips_small_data_pattern_p): Update call accordingly.

From-SVN: r216707
This commit is contained in:
Richard Sandiford 2014-10-26 10:40:59 +00:00 committed by Richard Sandiford
parent 21ffb9589e
commit 187804d41f
2 changed files with 31 additions and 19 deletions

View File

@ -1,3 +1,11 @@
2014-10-26 Richard Sandiford <richard.sandiford@arm.com>
* config/mips/mips.c: Include rtl-iter.h.
(mips_small_data_pattern_1): Take an rtx rather than an rtx pointer.
Take the context as a parameter instead of the containing MEM.
Iterate over all subrtxes.
(mips_small_data_pattern_p): Update call accordingly.
2014-10-26 Richard Sandiford <richard.sandiford@arm.com>
* config/mep/mep.c (mep_mul_hilo_bypass_1): Delete.

View File

@ -76,6 +76,7 @@ along with GCC; see the file COPYING3. If not see
#include "context.h"
#include "cgraph.h"
#include "builtins.h"
#include "rtl-iter.h"
/* True if X is an UNSPEC wrapper around a SYMBOL_REF or LABEL_REF. */
#define UNSPEC_ADDRESS_P(X) \
@ -3449,29 +3450,32 @@ mips_rewrite_small_data_p (rtx x, enum mips_symbol_context context)
&& symbol_type == SYMBOL_GP_RELATIVE);
}
/* A for_each_rtx callback for mips_small_data_pattern_p. DATA is the
containing MEM, or null if none. */
/* Return true if OP refers to small data symbols directly, not through
a LO_SUM. CONTEXT is the context in which X appears. */
static int
mips_small_data_pattern_1 (rtx *loc, void *data)
mips_small_data_pattern_1 (rtx x, enum mips_symbol_context context)
{
enum mips_symbol_context context;
/* Ignore things like "g" constraints in asms. We make no particular
guarantee about which symbolic constants are acceptable as asm operands
versus which must be forced into a GPR. */
if (GET_CODE (*loc) == LO_SUM || GET_CODE (*loc) == ASM_OPERANDS)
return -1;
if (MEM_P (*loc))
subrtx_var_iterator::array_type array;
FOR_EACH_SUBRTX_VAR (iter, array, x, ALL)
{
if (for_each_rtx (&XEXP (*loc, 0), mips_small_data_pattern_1, *loc))
return 1;
return -1;
}
rtx x = *iter;
context = data ? SYMBOL_CONTEXT_MEM : SYMBOL_CONTEXT_LEA;
return mips_rewrite_small_data_p (*loc, context);
/* Ignore things like "g" constraints in asms. We make no particular
guarantee about which symbolic constants are acceptable as asm operands
versus which must be forced into a GPR. */
if (GET_CODE (x) == LO_SUM || GET_CODE (x) == ASM_OPERANDS)
iter.skip_subrtxes ();
else if (MEM_P (x))
{
if (mips_small_data_pattern_1 (XEXP (x, 0), SYMBOL_CONTEXT_MEM))
return true;
iter.skip_subrtxes ();
}
else if (mips_rewrite_small_data_p (x, context))
return true;
}
return false;
}
/* Return true if OP refers to small data symbols directly, not through
@ -3480,7 +3484,7 @@ mips_small_data_pattern_1 (rtx *loc, void *data)
bool
mips_small_data_pattern_p (rtx op)
{
return for_each_rtx (&op, mips_small_data_pattern_1, NULL);
return mips_small_data_pattern_1 (op, SYMBOL_CONTEXT_LEA);
}
/* A for_each_rtx callback, used by mips_rewrite_small_data.