X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=blobdiff_plain;f=gcc%2Frecog.h;h=3354a66496a4508d5fcddc3517b40240f0c67fae;hp=83e5c29067d0581244daff27949d00deffeede21;hb=bd1a81f7e1665d2e33cc824dd05dd7988da9f1a8;hpb=caebd015e71baf461ce1d58fcf7fe06527cf54e2 diff --git a/gcc/recog.h b/gcc/recog.h index 83e5c29067d..3354a66496a 100644 --- a/gcc/recog.h +++ b/gcc/recog.h @@ -1,12 +1,12 @@ /* Declarations for interface to insn recognizer and insn-output.c. - Copyright (C) 1987, 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005 - Free Software Foundation, Inc. + Copyright (C) 1987, 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, + 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. This file is part of GCC. GCC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free -Software Foundation; either version 2, or (at your option) any later +Software Foundation; either version 3, or (at your option) any later version. GCC is distributed in the hope that it will be useful, but WITHOUT ANY @@ -15,9 +15,8 @@ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License -along with GCC; see the file COPYING. If not, write to the Free -Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301, USA. */ +along with GCC; see the file COPYING3. If not see +. */ /* Random number that should be large enough for all purposes. */ #define MAX_RECOG_ALTERNATIVES 30 @@ -51,7 +50,8 @@ struct operand_alternative /* Nonzero if '&' was found in the constraint string. */ unsigned int earlyclobber:1; - /* Nonzero if 'm' was found in the constraint string. */ + /* 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; @@ -72,9 +72,10 @@ 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 validate_change (rtx, rtx *, rtx, int); -extern int validate_change_maybe_volatile (rtx, rtx *, rtx); +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 verify_changes (int); extern void confirm_change_group (void); @@ -83,22 +84,33 @@ 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); 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 rtx *find_single_use (rtx, rtx, rtx *); 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 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 int mode_dependent_address_p (rtx); extern int recog (rtx, rtx, int *); @@ -119,7 +131,6 @@ extern int peep2_reg_dead_p (int, rtx); extern rtx peep2_find_free_register (int, int, const char *, enum machine_mode, HARD_REG_SET *); #endif -extern void peephole2_optimize (FILE *); extern rtx peephole2_insns (rtx, rtx, int *); extern int store_data_bypass_p (rtx, rtx); @@ -144,6 +155,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; @@ -203,6 +227,12 @@ struct recog_data /* The number of alternatives in the constraints for the insn. */ char n_alternatives; + /* 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; };