aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/mips
diff options
context:
space:
mode:
authorrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>2014-10-26 10:40:59 +0000
committerrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>2014-10-26 10:40:59 +0000
commit840f5278d8f12ce73f785a61bea39547fee212eb (patch)
treee1f82dd72b9a0631c6fe629622d7c0bb309c5a98 /gcc/config/mips
parent6b92c2dcd04ee6b79f7fd0a2cf5c19fc841c79b5 (diff)
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@216707 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/mips')
-rw-r--r--gcc/config/mips/mips.c42
1 files changed, 23 insertions, 19 deletions
diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c
index 41a3ba4ce7a..f0286ce4f64 100644
--- a/gcc/config/mips/mips.c
+++ b/gcc/config/mips/mips.c
@@ -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.