diff options
author | Richard Sandiford <richard.sandiford@arm.com> | 2014-10-26 10:41:06 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2014-10-26 10:41:06 +0000 |
commit | 3854efe8639a9a515ebc422acb9e638c579635f4 (patch) | |
tree | f66c239a9e40134bca571be34db862208aaf65ff /gcc/config/mips | |
parent | 187804d41fded84fdf8dc733e9cd746c20b8f569 (diff) | |
download | gcc-3854efe8639a9a515ebc422acb9e638c579635f4.tar.gz |
mips.c (mips_rewrite_small_data_1): Take the context as a parameter instead of the containing MEM.
gcc/
* config/mips/mips.c (mips_rewrite_small_data_1): Take the context
as a parameter instead of the containing MEM. Iterate over all
subrtxes. Don't return a value.
(mips_rewrite_small_data): Update call accordingly.
From-SVN: r216708
Diffstat (limited to 'gcc/config/mips')
-rw-r--r-- | gcc/config/mips/mips.c | 39 |
1 files changed, 20 insertions, 19 deletions
diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c index f0286ce4f64..4d16d9b81fa 100644 --- a/gcc/config/mips/mips.c +++ b/gcc/config/mips/mips.c @@ -3487,28 +3487,29 @@ mips_small_data_pattern_p (rtx op) return mips_small_data_pattern_1 (op, SYMBOL_CONTEXT_LEA); } -/* A for_each_rtx callback, used by mips_rewrite_small_data. - DATA is the containing MEM, or null if none. */ +/* Rewrite *LOC so that it refers to small data using explicit + relocations. CONTEXT is the context in which *LOC appears. */ -static int -mips_rewrite_small_data_1 (rtx *loc, void *data) +static void +mips_rewrite_small_data_1 (rtx *loc, enum mips_symbol_context context) { - enum mips_symbol_context context; - - if (MEM_P (*loc)) + subrtx_ptr_iterator::array_type array; + FOR_EACH_SUBRTX_PTR (iter, array, loc, ALL) { - for_each_rtx (&XEXP (*loc, 0), mips_rewrite_small_data_1, *loc); - return -1; + rtx *loc = *iter; + if (MEM_P (*loc)) + { + mips_rewrite_small_data_1 (&XEXP (*loc, 0), SYMBOL_CONTEXT_MEM); + iter.skip_subrtxes (); + } + else if (mips_rewrite_small_data_p (*loc, context)) + { + *loc = gen_rtx_LO_SUM (Pmode, pic_offset_table_rtx, *loc); + iter.skip_subrtxes (); + } + else if (GET_CODE (*loc) == LO_SUM) + iter.skip_subrtxes (); } - - context = data ? SYMBOL_CONTEXT_MEM : SYMBOL_CONTEXT_LEA; - if (mips_rewrite_small_data_p (*loc, context)) - *loc = gen_rtx_LO_SUM (Pmode, pic_offset_table_rtx, *loc); - - if (GET_CODE (*loc) == LO_SUM) - return -1; - - return 0; } /* Rewrite instruction pattern PATTERN so that it refers to small data @@ -3518,7 +3519,7 @@ rtx mips_rewrite_small_data (rtx pattern) { pattern = copy_insn (pattern); - for_each_rtx (&pattern, mips_rewrite_small_data_1, NULL); + mips_rewrite_small_data_1 (&pattern, SYMBOL_CONTEXT_LEA); return pattern; } |