diff options
author | Lorry Tar Creator <lorry-tar-importer@baserock.org> | 2015-04-22 10:21:45 +0000 |
---|---|---|
committer | <> | 2015-04-25 21:44:09 +0000 |
commit | f80b5ea1605c9f9408c5aa386ba71c16d918ebbf (patch) | |
tree | bb7eafaa81fc4b8c5c215bc08d517fd158db234a /gcc/recog.h | |
parent | c27a97d04853380f1e80525391b3f0d156ed4c84 (diff) | |
download | gcc-tarball-f80b5ea1605c9f9408c5aa386ba71c16d918ebbf.tar.gz |
Imported from /home/lorry/working-area/delta_gcc-tarball/gcc-5.1.0.tar.bz2.gcc-5.1.0
Diffstat (limited to 'gcc/recog.h')
-rw-r--r-- | gcc/recog.h | 147 |
1 files changed, 100 insertions, 47 deletions
diff --git a/gcc/recog.h b/gcc/recog.h index 89e87a9497..45ea671963 100644 --- a/gcc/recog.h +++ b/gcc/recog.h @@ -1,5 +1,5 @@ /* Declarations for interface to insn recognizer and insn-output.c. - Copyright (C) 1987-2014 Free Software Foundation, Inc. + Copyright (C) 1987-2015 Free Software Foundation, Inc. This file is part of GCC. @@ -20,8 +20,17 @@ 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. */ +/* Random number that should be large enough for all purposes. Also define + a type that has at least MAX_RECOG_ALTERNATIVES + 1 bits, with the extra + bit giving an invalid value that can be used to mean "uninitialized". */ #define MAX_RECOG_ALTERNATIVES 30 +typedef unsigned int alternative_mask; + +/* A mask of all alternatives. */ +#define ALL_ALTERNATIVES ((alternative_mask) -1) + +/* A mask containing just alternative X. */ +#define ALTERNATIVE_BIT(X) ((alternative_mask) 1 << (X)) /* Types of operands. */ enum op_type { @@ -37,39 +46,41 @@ struct operand_alternative const char *constraint; /* The register class valid for this alternative (possibly NO_REGS). */ - enum reg_class cl; + ENUM_BITFIELD (reg_class) cl : 16; /* "Badness" of this alternative, computed from number of '?' and '!' characters in the constraint string. */ - unsigned int reject; + unsigned int reject : 16; /* -1 if no matching constraint was found, or an operand number. */ - int matches; + int matches : 8; /* The same information, but reversed: -1 if this operand is not matched by any other, or the operand number of the operand that matches this one. */ - int matched; + int matched : 8; /* Nonzero if '&' was found in the constraint string. */ - unsigned int earlyclobber:1; + unsigned int earlyclobber : 1; /* Nonzero if TARGET_MEM_CONSTRAINT was found in the constraint string. */ - unsigned int memory_ok:1; - /* Nonzero if 'o' was found in the constraint string. */ - unsigned int offmem_ok:1; - /* Nonzero if 'V' was found in the constraint string. */ - unsigned int nonoffmem_ok:1; - /* Nonzero if '<' was found in the constraint string. */ - unsigned int decmem_ok:1; - /* Nonzero if '>' was found in the constraint string. */ - unsigned int incmem_ok:1; + unsigned int memory_ok : 1; /* Nonzero if 'p' was found in the constraint string. */ - unsigned int is_address:1; + unsigned int is_address : 1; /* Nonzero if 'X' was found in the constraint string, or if the constraint string for this alternative was empty. */ - unsigned int anything_ok:1; + unsigned int anything_ok : 1; + + unsigned int unused : 12; }; +/* Return the class for operand I of alternative ALT, taking matching + constraints into account. */ + +static inline enum reg_class +alternative_class (const operand_alternative *alt, int i) +{ + return alt[i].matches >= 0 ? alt[alt[i].matches].cl : alt[i].cl; +} extern void init_recog (void); extern void init_recog_no_volatile (void); @@ -78,18 +89,18 @@ 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, bool); +extern int insn_invalid_p (rtx_insn *, bool); extern int verify_changes (int); extern void confirm_change_group (void); extern int apply_change_group (void); 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_addr_space_p (enum machine_mode, rtx, addr_space_t); +extern int constrain_operands (int, alternative_mask); +extern int constrain_operands_cached (rtx_insn *, int); +extern int memory_address_addr_space_p (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, +extern int strict_memory_address_addr_space_p (machine_mode, rtx, addr_space_t); #define strict_memory_address_p(mode,addr) \ strict_memory_address_addr_space_p ((mode), (addr), ADDR_SPACE_GENERIC) @@ -104,11 +115,11 @@ extern int num_changes_pending (void); #ifdef HAVE_cc0 extern int next_insn_tests_no_inequality (rtx); #endif -extern bool reg_fits_class_p (const_rtx, reg_class_t, int, enum machine_mode); +extern bool reg_fits_class_p (const_rtx, reg_class_t, int, machine_mode); extern int offsettable_memref_p (rtx); extern int offsettable_nonstrict_memref_p (rtx); -extern int offsettable_address_addr_space_p (int, enum machine_mode, rtx, +extern int offsettable_address_addr_space_p (int, machine_mode, rtx, addr_space_t); #define offsettable_address_p(strict,mode,addr) \ offsettable_address_addr_space_p ((strict), (mode), (addr), \ @@ -117,26 +128,30 @@ extern bool mode_dependent_address_p (rtx, addr_space_t); extern int recog (rtx, rtx, int *); #ifndef GENERATOR_FILE -static inline int recog_memoized (rtx insn); +static inline int recog_memoized (rtx_insn *insn); #endif extern void add_clobbers (rtx, int); extern int added_clobbers_hard_reg_p (int); -extern void insn_extract (rtx); -extern void extract_insn (rtx); -extern void extract_constrain_insn_cached (rtx); -extern void extract_insn_cached (rtx); -extern void preprocess_constraints (void); +extern void insn_extract (rtx_insn *); +extern void extract_insn (rtx_insn *); +extern void extract_constrain_insn (rtx_insn *insn); +extern void extract_constrain_insn_cached (rtx_insn *); +extern void extract_insn_cached (rtx_insn *); +extern void preprocess_constraints (int, int, const char **, + operand_alternative *); +extern const operand_alternative *preprocess_insn_constraints (int); +extern void preprocess_constraints (rtx); extern rtx peep2_next_insn (int); extern int peep2_regno_dead_p (int, int); extern int peep2_reg_dead_p (int, rtx); #ifdef CLEAR_HARD_REG_SET extern rtx peep2_find_free_register (int, int, const char *, - enum machine_mode, HARD_REG_SET *); + machine_mode, HARD_REG_SET *); #endif extern rtx peephole2_insns (rtx, rtx, int *); -extern int store_data_bypass_p (rtx, rtx); -extern int if_test_bypass_p (rtx, rtx); +extern int store_data_bypass_p (rtx_insn *, rtx_insn *); +extern int if_test_bypass_p (rtx_insn *, rtx_insn *); #ifndef GENERATOR_FILE /* Try recognizing the instruction INSN, @@ -149,7 +164,7 @@ extern int if_test_bypass_p (rtx, rtx); through this one. */ static inline int -recog_memoized (rtx insn) +recog_memoized (rtx_insn *insn) { if (INSN_CODE (insn) < 0) INSN_CODE (insn) = recog (PATTERN (insn), insn, 0); @@ -200,7 +215,7 @@ struct recog_data_d char is_operator[MAX_RECOG_OPERANDS]; /* Gives the mode of operand N. */ - enum machine_mode operand_mode[MAX_RECOG_OPERANDS]; + machine_mode operand_mode[MAX_RECOG_OPERANDS]; /* Gives the type (in, out, inout) for operand N. */ enum op_type operand_type[MAX_RECOG_OPERANDS]; @@ -235,27 +250,31 @@ struct recog_data_d /* 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_d recog_data; -/* Contains a vector of operand_alternative structures for every operand. - Set up by preprocess_constraints. */ -extern struct operand_alternative recog_op_alt[MAX_RECOG_OPERANDS][MAX_RECOG_ALTERNATIVES]; +extern const operand_alternative *recog_op_alt; + +/* Return a pointer to an array in which index OP describes the constraints + on operand OP of the current instruction alternative (which_alternative). + Only valid after calling preprocess_constraints and constrain_operands. */ + +inline static const operand_alternative * +which_op_alt () +{ + gcc_checking_assert (IN_RANGE (which_alternative, 0, + recog_data.n_alternatives - 1)); + return &recog_op_alt[which_alternative * recog_data.n_operands]; +} /* A table defined in insn-output.c that give information about each insn-code value. */ -typedef int (*insn_operand_predicate_fn) (rtx, enum machine_mode); -typedef const char * (*insn_output_fn) (rtx *, rtx); +typedef int (*insn_operand_predicate_fn) (rtx, machine_mode); +typedef const char * (*insn_output_fn) (rtx *, rtx_insn *); struct insn_gen_fn { @@ -361,4 +380,38 @@ struct insn_data_d extern const struct insn_data_d insn_data[]; extern int peep2_current_count; +#ifndef GENERATOR_FILE +#include "insn-codes.h" + +/* An enum of boolean attributes that may only depend on the current + subtarget, not on things like operands or compiler phase. */ +enum bool_attr { + BA_ENABLED, + BA_PREFERRED_FOR_SPEED, + BA_PREFERRED_FOR_SIZE, + BA_LAST = BA_PREFERRED_FOR_SIZE +}; + +/* Target-dependent globals. */ +struct target_recog { + bool x_initialized; + alternative_mask x_bool_attr_masks[LAST_INSN_CODE][BA_LAST + 1]; + operand_alternative *x_op_alt[LAST_INSN_CODE]; +}; + +extern struct target_recog default_target_recog; +#if SWITCHABLE_TARGET +extern struct target_recog *this_target_recog; +#else +#define this_target_recog (&default_target_recog) +#endif + +alternative_mask get_enabled_alternatives (rtx_insn *); +alternative_mask get_preferred_alternatives (rtx_insn *); +alternative_mask get_preferred_alternatives (rtx_insn *, basic_block); +bool check_bool_attrs (rtx_insn *); + +void recog_init (); +#endif + #endif /* GCC_RECOG_H */ |