diff options
author | Richard Sandiford <rdsandiford@googlemail.com> | 2012-11-18 17:33:38 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2012-11-18 17:33:38 +0000 |
commit | fcdd52b73c0b23bffd5ce5ba591f994547333429 (patch) | |
tree | 322c854e5205121b0545f58847a6f3aa5e4c0b36 /gcc/recog.c | |
parent | 8b7d5dab44547924887d15e00823fac44df2aa61 (diff) | |
download | gcc-fcdd52b73c0b23bffd5ce5ba591f994547333429.zip gcc-fcdd52b73c0b23bffd5ce5ba591f994547333429.tar.gz gcc-fcdd52b73c0b23bffd5ce5ba591f994547333429.tar.bz2 |
Makefile.in (recog.o): Add insn-codes.h.
gcc/
* Makefile.in (recog.o): Add insn-codes.h.
* expr.h (extraction_pattern): Move to optabs.h.
(mode_for_extraction): Delete.
* optabs.h (extraction_insn): New structure.
(extraction_pattern): Moved from expr.h.
(get_best_reg_extraction_insn, get_best_mem_extraction_insn): Declare.
* optabs.c (HAVE_insv, CODE_FOR_insv, HAVE_extv, CODE_FOR_extv)
(HAVE_extzv, CODE_FOR_extzv): Provide defaults.
(extraction_type): New enum.
(get_traditional_extraction_insn, get_extraction_insn)
(get_best_reg_extraction_insn, get_best_mem_extraction_insn):
New functions.
* combine.c (make_extraction): Use get_best_reg_extraction_insn
instead of mode_for_extraction.
* expmed.c (HAVE_insv, CODE_FOR_insv, gen_insv, HAVE_extv)
(CODE_FOR_extv, gen_extv, HAVE_extzv, CODE_FOR_extzv, gen_extzv):
Remove fallback definitions.
(mode_for_extraction): Delete.
(adjust_bit_field_mem_for_reg): New function.
(store_bit_field_using_insv): Replace OP_MODE parameter with
an extraction_insn. Pass struct_mode to narrow_bit_field_mem.
(extract_bit_field_using_extv): Likewise EXT_MODE.
(store_bit_field_1): Use get_best_reg_extraction_insn and
get_best_mem_extraction_insn instead of mode_for_extraction.
Use adjust_bit_field_mem_for_reg when forcing memory to a
register and doing a register insertion. Update calls to
store_bit_field_using_insv.
(extract_bit_field_1): Likewise extractions and calls to
extract_bit_field_using_extv.
(store_Bit_field): When narrowing to a bitregion, don't use the
insv mode as a limit.
* recog.c: (HAVE_extv, CODE_FOR_extv, HAVE_extzv, CODE_FOR_extzv):
Provide defaults.
(simplify_while_replacing): Use insn_data instead of
mode_for_extraction.
From-SVN: r193605
Diffstat (limited to 'gcc/recog.c')
-rw-r--r-- | gcc/recog.c | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/gcc/recog.c b/gcc/recog.c index 47e7f75..3c56703 100644 --- a/gcc/recog.c +++ b/gcc/recog.c @@ -40,6 +40,7 @@ along with GCC; see the file COPYING3. If not see #include "target.h" #include "tree-pass.h" #include "df.h" +#include "insn-codes.h" #ifndef STACK_PUSH_CODE #ifdef STACK_GROWS_DOWNWARD @@ -542,6 +543,16 @@ cancel_changes (int num) num_changes = num; } +/* Reduce conditional compilation elsewhere. */ +#ifndef HAVE_extv +#define HAVE_extv 0 +#define CODE_FOR_extv CODE_FOR_nothing +#endif +#ifndef HAVE_extzv +#define HAVE_extzv 0 +#define CODE_FOR_extzv CODE_FOR_nothing +#endif + /* A subroutine of validate_replace_rtx_1 that tries to simplify the resulting rtx. */ @@ -628,19 +639,17 @@ simplify_while_replacing (rtx *loc, rtx to, rtx object, enum machine_mode is_mode = GET_MODE (XEXP (x, 0)); int pos = INTVAL (XEXP (x, 2)); - if (GET_CODE (x) == ZERO_EXTRACT) + if (GET_CODE (x) == ZERO_EXTRACT && HAVE_extzv) { - enum machine_mode new_mode - = mode_for_extraction (EP_extzv, 1); - if (new_mode != MAX_MACHINE_MODE) - wanted_mode = new_mode; + wanted_mode = insn_data[CODE_FOR_extzv].operand[1].mode; + if (wanted_mode == VOIDmode) + wanted_mode = word_mode; } - else if (GET_CODE (x) == SIGN_EXTRACT) + else if (GET_CODE (x) == SIGN_EXTRACT && HAVE_extv) { - enum machine_mode new_mode - = mode_for_extraction (EP_extv, 1); - if (new_mode != MAX_MACHINE_MODE) - wanted_mode = new_mode; + wanted_mode = insn_data[CODE_FOR_extv].operand[1].mode; + if (wanted_mode == VOIDmode) + wanted_mode = word_mode; } /* If we have a narrower mode, we can do something. */ |