recog.h revision 117395
1/* Declarations for interface to insn recognizer and insn-output.c. 2 Copyright (C) 1987, 1996, 1997, 1998, 1999, 2000, 2001 3 Free Software Foundation, Inc. 4 5This file is part of GCC. 6 7GCC is free software; you can redistribute it and/or modify it under 8the terms of the GNU General Public License as published by the Free 9Software Foundation; either version 2, or (at your option) any later 10version. 11 12GCC is distributed in the hope that it will be useful, but WITHOUT ANY 13WARRANTY; without even the implied warranty of MERCHANTABILITY or 14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 15for more details. 16 17You should have received a copy of the GNU General Public License 18along with GCC; see the file COPYING. If not, write to the Free 19Software Foundation, 59 Temple Place - Suite 330, Boston, MA 2002111-1307, USA. */ 21 22/* Random number that should be large enough for all purposes. */ 23#define MAX_RECOG_ALTERNATIVES 30 24#define recog_memoized(I) (INSN_CODE (I) >= 0 \ 25 ? INSN_CODE (I) : recog_memoized_1 (I)) 26 27/* Types of operands. */ 28enum op_type { 29 OP_IN, 30 OP_OUT, 31 OP_INOUT 32}; 33 34struct operand_alternative 35{ 36 /* Pointer to the beginning of the constraint string for this alternative, 37 for easier access by alternative number. */ 38 const char *constraint; 39 40 /* The register class valid for this alternative (possibly NO_REGS). */ 41 enum reg_class class; 42 43 /* "Badness" of this alternative, computed from number of '?' and '!' 44 characters in the constraint string. */ 45 unsigned int reject; 46 47 /* -1 if no matching constraint was found, or an operand number. */ 48 int matches; 49 /* The same information, but reversed: -1 if this operand is not 50 matched by any other, or the operand number of the operand that 51 matches this one. */ 52 int matched; 53 54 /* Nonzero if '&' was found in the constraint string. */ 55 unsigned int earlyclobber:1; 56 /* Nonzero if 'm' was found in the constraint string. */ 57 unsigned int memory_ok:1; 58 /* Nonzero if 'o' was found in the constraint string. */ 59 unsigned int offmem_ok:1; 60 /* Nonzero if 'V' was found in the constraint string. */ 61 unsigned int nonoffmem_ok:1; 62 /* Nonzero if '<' was found in the constraint string. */ 63 unsigned int decmem_ok:1; 64 /* Nonzero if '>' was found in the constraint string. */ 65 unsigned int incmem_ok:1; 66 /* Nonzero if 'p' was found in the constraint string. */ 67 unsigned int is_address:1; 68 /* Nonzero if 'X' was found in the constraint string, or if the constraint 69 string for this alternative was empty. */ 70 unsigned int anything_ok:1; 71}; 72 73 74extern void init_recog PARAMS ((void)); 75extern void init_recog_no_volatile PARAMS ((void)); 76extern int recog_memoized_1 PARAMS ((rtx)); 77extern int check_asm_operands PARAMS ((rtx)); 78extern int asm_operand_ok PARAMS ((rtx, const char *)); 79extern int validate_change PARAMS ((rtx, rtx *, rtx, int)); 80extern int insn_invalid_p PARAMS ((rtx)); 81extern int apply_change_group PARAMS ((void)); 82extern int num_validated_changes PARAMS ((void)); 83extern void cancel_changes PARAMS ((int)); 84extern int constrain_operands PARAMS ((int)); 85extern int constrain_operands_cached PARAMS ((int)); 86extern int memory_address_p PARAMS ((enum machine_mode, rtx)); 87extern int strict_memory_address_p PARAMS ((enum machine_mode, rtx)); 88extern int validate_replace_rtx_subexp PARAMS ((rtx, rtx, rtx, rtx *)); 89extern int validate_replace_rtx PARAMS ((rtx, rtx, rtx)); 90extern void validate_replace_rtx_group PARAMS ((rtx, rtx, rtx)); 91extern int validate_replace_src PARAMS ((rtx, rtx, rtx)); 92extern void validate_replace_src_group PARAMS ((rtx, rtx, rtx)); 93extern int num_changes_pending PARAMS ((void)); 94#ifdef HAVE_cc0 95extern int next_insn_tests_no_inequality PARAMS ((rtx)); 96#endif 97extern int reg_fits_class_p PARAMS ((rtx, enum reg_class, int, 98 enum machine_mode)); 99extern rtx *find_single_use PARAMS ((rtx, rtx, rtx *)); 100 101extern int general_operand PARAMS ((rtx, enum machine_mode)); 102extern int address_operand PARAMS ((rtx, enum machine_mode)); 103extern int register_operand PARAMS ((rtx, enum machine_mode)); 104extern int pmode_register_operand PARAMS ((rtx, enum machine_mode)); 105extern int scratch_operand PARAMS ((rtx, enum machine_mode)); 106extern int immediate_operand PARAMS ((rtx, enum machine_mode)); 107extern int const_int_operand PARAMS ((rtx, enum machine_mode)); 108extern int const_double_operand PARAMS ((rtx, enum machine_mode)); 109extern int nonimmediate_operand PARAMS ((rtx, enum machine_mode)); 110extern int nonmemory_operand PARAMS ((rtx, enum machine_mode)); 111extern int push_operand PARAMS ((rtx, enum machine_mode)); 112extern int pop_operand PARAMS ((rtx, enum machine_mode)); 113extern int memory_operand PARAMS ((rtx, enum machine_mode)); 114extern int indirect_operand PARAMS ((rtx, enum machine_mode)); 115extern int mode_independent_operand PARAMS ((rtx, enum machine_mode)); 116extern int comparison_operator PARAMS ((rtx, enum machine_mode)); 117 118extern int offsettable_memref_p PARAMS ((rtx)); 119extern int offsettable_nonstrict_memref_p PARAMS ((rtx)); 120extern int offsettable_address_p PARAMS ((int, enum machine_mode, rtx)); 121extern int mode_dependent_address_p PARAMS ((rtx)); 122 123extern int recog PARAMS ((rtx, rtx, int *)); 124extern void add_clobbers PARAMS ((rtx, int)); 125extern int added_clobbers_hard_reg_p PARAMS ((int)); 126extern void insn_extract PARAMS ((rtx)); 127extern void extract_insn PARAMS ((rtx)); 128extern void extract_constrain_insn_cached PARAMS ((rtx)); 129extern void extract_insn_cached PARAMS ((rtx)); 130extern void preprocess_constraints PARAMS ((void)); 131extern rtx peep2_next_insn PARAMS ((int)); 132extern int peep2_regno_dead_p PARAMS ((int, int)); 133extern int peep2_reg_dead_p PARAMS ((int, rtx)); 134#ifdef CLEAR_HARD_REG_SET 135extern rtx peep2_find_free_register PARAMS ((int, int, const char *, 136 enum machine_mode, 137 HARD_REG_SET *)); 138#endif 139extern void peephole2_optimize PARAMS ((FILE *)); 140extern rtx peephole2_insns PARAMS ((rtx, rtx, int *)); 141 142extern int store_data_bypass_p PARAMS ((rtx, rtx)); 143extern int if_test_bypass_p PARAMS ((rtx, rtx)); 144 145/* Nonzero means volatile operands are recognized. */ 146extern int volatile_ok; 147 148/* Set by constrain_operands to the number of the alternative that 149 matched. */ 150extern int which_alternative; 151 152/* The following vectors hold the results from insn_extract. */ 153 154struct recog_data 155{ 156 /* It is very tempting to make the 5 operand related arrays into a 157 structure and index on that. However, to be source compatible 158 with all of the existing md file insn constraints and output 159 templates, we need `operand' as a flat array. Without that 160 member, making an array for the rest seems pointless. */ 161 162 /* Gives value of operand N. */ 163 rtx operand[MAX_RECOG_OPERANDS]; 164 165 /* Gives location where operand N was found. */ 166 rtx *operand_loc[MAX_RECOG_OPERANDS]; 167 168 /* Gives the constraint string for operand N. */ 169 const char *constraints[MAX_RECOG_OPERANDS]; 170 171 /* Gives the mode of operand N. */ 172 enum machine_mode operand_mode[MAX_RECOG_OPERANDS]; 173 174 /* Gives the type (in, out, inout) for operand N. */ 175 enum op_type operand_type[MAX_RECOG_OPERANDS]; 176 177 /* Gives location where the Nth duplicate-appearance of an operand 178 was found. This is something that matched MATCH_DUP. */ 179 rtx *dup_loc[MAX_DUP_OPERANDS]; 180 181 /* Gives the operand number that was duplicated in the Nth 182 duplicate-appearance of an operand. */ 183 char dup_num[MAX_DUP_OPERANDS]; 184 185 /* ??? Note that these are `char' instead of `unsigned char' to (try to) 186 avoid certain lossage from K&R C, wherein `unsigned char' default 187 promotes to `unsigned int' instead of `int' as in ISO C. As of 1999, 188 the most common places to bootstrap from K&R C are SunOS and HPUX, 189 both of which have signed characters by default. The only other 190 supported natives that have both K&R C and unsigned characters are 191 ROMP and Irix 3, and neither have been seen for a while, but do 192 continue to consider unsignedness when performing arithmetic inside 193 a comparison. */ 194 195 /* The number of operands of the insn. */ 196 char n_operands; 197 198 /* The number of MATCH_DUPs in the insn. */ 199 char n_dups; 200 201 /* The number of alternatives in the constraints for the insn. */ 202 char n_alternatives; 203 204 /* In case we are caching, hold insn data was generated for. */ 205 rtx insn; 206}; 207 208extern struct recog_data recog_data; 209 210/* Contains a vector of operand_alternative structures for every operand. 211 Set up by preprocess_constraints. */ 212extern struct operand_alternative recog_op_alt[MAX_RECOG_OPERANDS][MAX_RECOG_ALTERNATIVES]; 213 214/* A table defined in insn-output.c that give information about 215 each insn-code value. */ 216 217typedef int (*insn_operand_predicate_fn) PARAMS ((rtx, enum machine_mode)); 218typedef const char * (*insn_output_fn) PARAMS ((rtx *, rtx)); 219typedef rtx (*insn_gen_fn) PARAMS ((rtx, ...)); 220 221struct insn_operand_data 222{ 223 const insn_operand_predicate_fn predicate; 224 225 const char *const constraint; 226 227 const ENUM_BITFIELD(machine_mode) mode : 16; 228 229 const char strict_low; 230 231 const char eliminable; 232}; 233 234/* Legal values for insn_data.output_format. Indicate what type of data 235 is stored in insn_data.output. */ 236#define INSN_OUTPUT_FORMAT_NONE 0 /* abort */ 237#define INSN_OUTPUT_FORMAT_SINGLE 1 /* const char * */ 238#define INSN_OUTPUT_FORMAT_MULTI 2 /* const char * const * */ 239#define INSN_OUTPUT_FORMAT_FUNCTION 3 /* const char * (*)(...) */ 240 241struct insn_data 242{ 243 const char *const name; 244 const PTR output; 245 const insn_gen_fn genfun; 246 const struct insn_operand_data *const operand; 247 248 const char n_operands; 249 const char n_dups; 250 const char n_alternatives; 251 const char output_format; 252}; 253 254extern const struct insn_data insn_data[]; 255