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/optabs.h | |
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/optabs.h')
-rw-r--r-- | gcc/optabs.h | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/gcc/optabs.h b/gcc/optabs.h index e0be2ba..81aa1d0 100644 --- a/gcc/optabs.h +++ b/gcc/optabs.h @@ -323,6 +323,38 @@ extern rtx optab_libfunc (optab optab, enum machine_mode mode); extern rtx convert_optab_libfunc (convert_optab optab, enum machine_mode mode1, enum machine_mode mode2); +/* Describes an instruction that inserts or extracts a bitfield. */ +struct extraction_insn +{ + /* The code of the instruction. */ + enum insn_code icode; + + /* The mode that the structure operand should have. This is byte_mode + when using the legacy insv, extv and extzv patterns to access memory. */ + enum machine_mode struct_mode; + + /* The mode of the field to be inserted or extracted, and by extension + the mode of the insertion or extraction itself. */ + enum machine_mode field_mode; + + /* The mode of the field's bit position. This is only important + when the position is variable rather than constant. */ + enum machine_mode pos_mode; +}; + +/* Enumerates the possible extraction_insn operations. */ +enum extraction_pattern { EP_insv, EP_extv, EP_extzv }; + +extern bool get_best_reg_extraction_insn (extraction_insn *, + enum extraction_pattern, + unsigned HOST_WIDE_INT, + enum machine_mode); + +extern bool get_best_mem_extraction_insn (extraction_insn *, + enum extraction_pattern, + HOST_WIDE_INT, HOST_WIDE_INT, + enum machine_mode); + extern bool insn_operand_matches (enum insn_code icode, unsigned int opno, rtx operand); |