X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gcc%2Frecog.h;h=71e801edb2ded297bfe27962c59b6918e8049378;hb=6c84d5762f1e1a60b1d4cee0caf8b4e7e0ba5f6f;hp=a7e22e6e349b0136b76a0d697492890cea7db47d;hpb=a4edaf835918f2dd4a2c36659b3639438a0d1a38;p=gcc.git diff --git a/gcc/recog.h b/gcc/recog.h index a7e22e6e349..71e801edb2d 100644 --- a/gcc/recog.h +++ b/gcc/recog.h @@ -1,6 +1,5 @@ /* Declarations for interface to insn recognizer and insn-output.c. - Copyright (C) 1987, 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, - 2005, 2006, 2007 Free Software Foundation, Inc. + Copyright (C) 1987-2013 Free Software Foundation, Inc. This file is part of GCC. @@ -18,6 +17,9 @@ You should have received a copy of the GNU General Public License along with GCC; see the file COPYING3. If not see . */ +#ifndef GCC_RECOG_H +#define GCC_RECOG_H + /* Random number that should be large enough for all purposes. */ #define MAX_RECOG_ALTERNATIVES 30 @@ -72,11 +74,11 @@ struct operand_alternative extern void init_recog (void); extern void init_recog_no_volatile (void); extern int check_asm_operands (rtx); -extern int asm_operand_ok (rtx, const char *); +extern int asm_operand_ok (rtx, const char *, const char **); extern bool validate_change (rtx, rtx *, rtx, bool); extern bool validate_unshare_change (rtx, rtx *, rtx, bool); extern bool canonicalize_change_group (rtx insn, rtx x); -extern int insn_invalid_p (rtx); +extern int insn_invalid_p (rtx, bool); extern int verify_changes (int); extern void confirm_change_group (void); extern int apply_change_group (void); @@ -84,9 +86,17 @@ extern int num_validated_changes (void); extern void cancel_changes (int); extern int constrain_operands (int); extern int constrain_operands_cached (int); -extern int memory_address_p (enum machine_mode, rtx); -extern int strict_memory_address_p (enum machine_mode, rtx); +extern int memory_address_addr_space_p (enum machine_mode, rtx, addr_space_t); +#define memory_address_p(mode,addr) \ + memory_address_addr_space_p ((mode), (addr), ADDR_SPACE_GENERIC) +extern int strict_memory_address_addr_space_p (enum machine_mode, rtx, + addr_space_t); +#define strict_memory_address_p(mode,addr) \ + strict_memory_address_addr_space_p ((mode), (addr), ADDR_SPACE_GENERIC) +extern int validate_replace_rtx_subexp (rtx, rtx, rtx, rtx *); extern int validate_replace_rtx (rtx, rtx, rtx); +extern int validate_replace_rtx_part (rtx, rtx, rtx *, rtx); +extern int validate_replace_rtx_part_nosimplify (rtx, rtx, rtx *, rtx); extern void validate_replace_rtx_group (rtx, rtx, rtx); extern void validate_replace_src_group (rtx, rtx, rtx); extern bool validate_simplify_insn (rtx insn); @@ -94,12 +104,16 @@ extern int num_changes_pending (void); #ifdef HAVE_cc0 extern int next_insn_tests_no_inequality (rtx); #endif -extern int reg_fits_class_p (rtx, enum reg_class, int, enum machine_mode); +extern bool reg_fits_class_p (const_rtx, reg_class_t, int, enum machine_mode); extern int offsettable_memref_p (rtx); extern int offsettable_nonstrict_memref_p (rtx); -extern int offsettable_address_p (int, enum machine_mode, rtx); -extern int mode_dependent_address_p (rtx); +extern int offsettable_address_addr_space_p (int, enum machine_mode, rtx, + addr_space_t); +#define offsettable_address_p(strict,mode,addr) \ + offsettable_address_addr_space_p ((strict), (mode), (addr), \ + ADDR_SPACE_GENERIC) +extern bool mode_dependent_address_p (rtx, addr_space_t); extern int recog (rtx, rtx, int *); #ifndef GENERATOR_FILE @@ -143,6 +157,19 @@ recog_memoized (rtx insn) } #endif +/* Skip chars until the next ',' or the end of the string. This is + useful to skip alternatives in a constraint string. */ +static inline const char * +skip_alternative (const char *p) +{ + const char *r = p; + while (*r != '\0' && *r != ',') + r++; + if (*r == ',') + r++; + return r; +} + /* Nonzero means volatile operands are recognized. */ extern int volatile_ok; @@ -152,7 +179,7 @@ extern int which_alternative; /* The following vectors hold the results from insn_extract. */ -struct recog_data +struct recog_data_d { /* It is very tempting to make the 5 operand related arrays into a structure and index on that. However, to be source compatible @@ -169,6 +196,9 @@ struct recog_data /* Gives the constraint string for operand N. */ const char *constraints[MAX_RECOG_OPERANDS]; + /* Nonzero if operand N is a match_operator or a match_parallel. */ + char is_operator[MAX_RECOG_OPERANDS]; + /* Gives the mode of operand N. */ enum machine_mode operand_mode[MAX_RECOG_OPERANDS]; @@ -202,11 +232,20 @@ struct recog_data /* The number of alternatives in the constraints for the insn. */ char n_alternatives; + /* True if insn is ASM_OPERANDS. */ + bool is_asm; + + /* Specifies whether an insn alternative is enabled using the + `enabled' attribute in the insn pattern definition. For back + ends not using the `enabled' attribute the array fields are + always set to `true' in expand_insn. */ + bool alternative_enabled_p [MAX_RECOG_ALTERNATIVES]; + /* In case we are caching, hold insn data was generated for. */ rtx insn; }; -extern struct recog_data recog_data; +extern struct recog_data_d recog_data; /* Contains a vector of operand_alternative structures for every operand. Set up by preprocess_constraints. */ @@ -229,7 +268,11 @@ struct insn_operand_data const char strict_low; + const char is_operator; + const char eliminable; + + const char allows_mem; }; /* Legal values for insn_data.output_format. Indicate what type of data @@ -239,10 +282,10 @@ struct insn_operand_data #define INSN_OUTPUT_FORMAT_MULTI 2 /* const char * const * */ #define INSN_OUTPUT_FORMAT_FUNCTION 3 /* const char * (*)(...) */ -struct insn_data +struct insn_data_d { const char *const name; -#if HAVE_DESIGNATED_INITIALIZERS +#if HAVE_DESIGNATED_UNION_INITIALIZERS union { const char *single; const char *const *multi; @@ -258,11 +301,14 @@ struct insn_data const insn_gen_fn genfun; const struct insn_operand_data *const operand; + const char n_generator_args; const char n_operands; const char n_dups; const char n_alternatives; const char output_format; }; -extern const struct insn_data insn_data[]; +extern const struct insn_data_d insn_data[]; extern int peep2_current_count; + +#endif /* GCC_RECOG_H */