diff options
author | obrien <obrien@FreeBSD.org> | 2002-05-09 22:08:26 +0000 |
---|---|---|
committer | obrien <obrien@FreeBSD.org> | 2002-05-09 22:08:26 +0000 |
commit | 0ac4840cc78ae311236dfbb08fa8d9a1f0b5be60 (patch) | |
tree | 6817ed2db3c9e77e9ff6d6797dbf9517bdc74fbb /contrib | |
parent | 7d3f59c051222ef74a34b45967e4e65f58a66d9d (diff) | |
download | FreeBSD-src-0ac4840cc78ae311236dfbb08fa8d9a1f0b5be60.zip FreeBSD-src-0ac4840cc78ae311236dfbb08fa8d9a1f0b5be60.tar.gz |
Use the stock (3.1 pre) file.
Diffstat (limited to 'contrib')
-rw-r--r-- | contrib/gcc/reload.c | 89 |
1 files changed, 57 insertions, 32 deletions
diff --git a/contrib/gcc/reload.c b/contrib/gcc/reload.c index 672c631..d7138b2 100644 --- a/contrib/gcc/reload.c +++ b/contrib/gcc/reload.c @@ -270,8 +270,9 @@ static int find_reloads_address_1 PARAMS ((enum machine_mode, rtx, int, rtx *, static void find_reloads_address_part PARAMS ((rtx, rtx *, enum reg_class, enum machine_mode, int, enum reload_type, int)); -static rtx find_reloads_subreg_address PARAMS ((rtx, int, int, enum reload_type, - int, rtx)); +static rtx find_reloads_subreg_address PARAMS ((rtx, int, int, + enum reload_type, int, rtx)); +static void copy_replacements_1 PARAMS ((rtx *, rtx *, int)); static int find_inc_amount PARAMS ((rtx, rtx)); #ifdef HAVE_SECONDARY_RELOADS @@ -1883,6 +1884,7 @@ find_dummy_reload (real_in, real_out, inloc, outloc, *inloc = const0_rtx; if (regno < FIRST_PSEUDO_REGISTER + && HARD_REGNO_MODE_OK (regno, outmode) && ! refers_to_regno_for_reload_p (regno, regno + nwords, PATTERN (this_insn), outloc)) { @@ -3035,6 +3037,7 @@ find_reloads (insn, replace, ind_levels, live_known, reload_reg_p) were handled in find_reloads_address. */ this_alternative[i] = (int) MODE_BASE_REG_CLASS (VOIDmode); win = 1; + badop = 0; break; case 'm': @@ -4930,6 +4933,7 @@ subst_reg_equivs (ad, insn) case CONST_INT: case CONST: case CONST_DOUBLE: + case CONST_VECTOR: case SYMBOL_REF: case LABEL_REF: case PC: @@ -5902,46 +5906,67 @@ subst_reloads (insn) } } -/* Make a copy of any replacements being done into X and move those copies - to locations in Y, a copy of X. We only look at the highest level of - the RTL. */ +/* Make a copy of any replacements being done into X and move those + copies to locations in Y, a copy of X. */ void copy_replacements (x, y) - rtx x; - rtx y; + rtx x, y; { - int i, j; - enum rtx_code code = GET_CODE (x); - const char *fmt = GET_RTX_FORMAT (code); - struct replacement *r; - /* We can't support X being a SUBREG because we might then need to know its location if something inside it was replaced. */ - if (code == SUBREG) + if (GET_CODE (x) == SUBREG) abort (); - for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) - if (fmt[i] == 'e') - for (j = 0; j < n_replacements; j++) + copy_replacements_1 (&x, &y, n_replacements); +} + +static void +copy_replacements_1 (px, py, orig_replacements) + rtx *px; + rtx *py; + int orig_replacements; +{ + int i, j; + rtx x, y; + struct replacement *r; + enum rtx_code code; + const char *fmt; + + for (j = 0; j < orig_replacements; j++) + { + if (replacements[j].subreg_loc == px) { - if (replacements[j].subreg_loc == &XEXP (x, i)) - { - r = &replacements[n_replacements++]; - r->where = replacements[j].where; - r->subreg_loc = &XEXP (y, i); - r->what = replacements[j].what; - r->mode = replacements[j].mode; - } - else if (replacements[j].where == &XEXP (x, i)) - { - r = &replacements[n_replacements++]; - r->where = &XEXP (y, i); - r->subreg_loc = 0; - r->what = replacements[j].what; - r->mode = replacements[j].mode; - } + r = &replacements[n_replacements++]; + r->where = replacements[j].where; + r->subreg_loc = py; + r->what = replacements[j].what; + r->mode = replacements[j].mode; } + else if (replacements[j].where == px) + { + r = &replacements[n_replacements++]; + r->where = py; + r->subreg_loc = 0; + r->what = replacements[j].what; + r->mode = replacements[j].mode; + } + } + + x = *px; + y = *py; + code = GET_CODE (x); + fmt = GET_RTX_FORMAT (code); + + for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) + { + if (fmt[i] == 'e') + copy_replacements_1 (&XEXP (x, i), &XEXP (y, i), orig_replacements); + else if (fmt[i] == 'E') + for (j = XVECLEN (x, i); --j >= 0; ) + copy_replacements_1 (&XVECEXP (x, i, j), &XVECEXP (y, i, j), + orig_replacements); + } } /* Change any replacements being done to *X to be done to *Y */ |