X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fexpr.h;h=cb4050dc10d45426982c2c2d30e84e74301994ef;hb=227683f6a9fffa96a0bed177acd6fb7835d55854;hp=caf965e941272a9dfc719402f3a74960a5182aff;hpb=3fcf767f4bc7223ea813164bf4f2daa041dbb2e9;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/expr.h b/gcc/expr.h index caf965e9412..cb4050dc10d 100644 --- a/gcc/expr.h +++ b/gcc/expr.h @@ -1,6 +1,6 @@ /* Definitions for code generation pass of GNU compiler. Copyright (C) 1987, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, - 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 + 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. This file is part of GCC. @@ -34,11 +34,6 @@ along with GCC; see the file COPYING3. If not see /* For GET_MODE_BITSIZE, word_mode */ #include "machmode.h" -/* The default branch cost is 1. */ -#ifndef BRANCH_COST -#define BRANCH_COST(speed_p, predictable_p) 1 -#endif - /* This is the 4th arg to `expand_expr'. EXPAND_STACK_PARM means we are possibly expanding a call param onto the stack. @@ -61,37 +56,6 @@ enum expand_modifier {EXPAND_NORMAL = 0, EXPAND_STACK_PARM, EXPAND_SUM, more information. */ #define OK_DEFER_POP (inhibit_defer_pop -= 1) -/* If a memory-to-memory move would take MOVE_RATIO or more simple - move-instruction sequences, we will do a movmem or libcall instead. */ - -#ifndef MOVE_RATIO -#if defined (HAVE_movmemqi) || defined (HAVE_movmemhi) || defined (HAVE_movmemsi) || defined (HAVE_movmemdi) || defined (HAVE_movmemti) -#define MOVE_RATIO(speed) 2 -#else -/* If we are optimizing for space (-Os), cut down the default move ratio. */ -#define MOVE_RATIO(speed) ((speed) ? 15 : 3) -#endif -#endif - -/* If a clear memory operation would take CLEAR_RATIO or more simple - move-instruction sequences, we will do a setmem or libcall instead. */ - -#ifndef CLEAR_RATIO -#if defined (HAVE_setmemqi) || defined (HAVE_setmemhi) || defined (HAVE_setmemsi) || defined (HAVE_setmemdi) || defined (HAVE_setmemti) -#define CLEAR_RATIO(speed) 2 -#else -/* If we are optimizing for space, cut down the default clear ratio. */ -#define CLEAR_RATIO(speed) ((speed) ? 15 :3) -#endif -#endif - -/* If a memory set (to value other than zero) operation would take - SET_RATIO or more simple move-instruction sequences, we will do a movmem - or libcall instead. */ -#ifndef SET_RATIO -#define SET_RATIO(speed) MOVE_RATIO(speed) -#endif - enum direction {none, upward, downward}; /* Structure to record the size of a sequence of arguments @@ -166,106 +130,17 @@ do { \ ((SIZE).var == 0 ? GEN_INT ((SIZE).constant) \ : expand_normal (ARGS_SIZE_TREE (SIZE))) -/* Supply a default definition for FUNCTION_ARG_PADDING: - usually pad upward, but pad short args downward on - big-endian machines. */ - -#define DEFAULT_FUNCTION_ARG_PADDING(MODE, TYPE) \ - (! BYTES_BIG_ENDIAN \ - ? upward \ - : (((MODE) == BLKmode \ - ? ((TYPE) && TREE_CODE (TYPE_SIZE (TYPE)) == INTEGER_CST \ - && int_size_in_bytes (TYPE) < (PARM_BOUNDARY / BITS_PER_UNIT)) \ - : GET_MODE_BITSIZE (MODE) < PARM_BOUNDARY) \ - ? downward : upward)) - -#ifndef FUNCTION_ARG_PADDING -#define FUNCTION_ARG_PADDING(MODE, TYPE) \ - DEFAULT_FUNCTION_ARG_PADDING ((MODE), (TYPE)) -#endif - -/* Supply a default definition for FUNCTION_ARG_BOUNDARY. Normally, we let - FUNCTION_ARG_PADDING, which also pads the length, handle any needed - alignment. */ - -#ifndef FUNCTION_ARG_BOUNDARY -#define FUNCTION_ARG_BOUNDARY(MODE, TYPE) PARM_BOUNDARY -#endif - -/* Supply a default definition of STACK_SAVEAREA_MODE for emit_stack_save. - Normally move_insn, so Pmode stack pointer. */ - -#ifndef STACK_SAVEAREA_MODE -#define STACK_SAVEAREA_MODE(LEVEL) Pmode -#endif - -/* Supply a default definition of STACK_SIZE_MODE for - allocate_dynamic_stack_space. Normally PLUS/MINUS, so word_mode. */ - -#ifndef STACK_SIZE_MODE -#define STACK_SIZE_MODE word_mode -#endif - -/* Provide default values for the macros controlling stack checking. */ - -/* The default is neither full builtin stack checking... */ -#ifndef STACK_CHECK_BUILTIN -#define STACK_CHECK_BUILTIN 0 -#endif - -/* ...nor static builtin stack checking. */ -#ifndef STACK_CHECK_STATIC_BUILTIN -#define STACK_CHECK_STATIC_BUILTIN 0 -#endif - -/* The default interval is one page. */ -#ifndef STACK_CHECK_PROBE_INTERVAL -#define STACK_CHECK_PROBE_INTERVAL 4096 -#endif - -/* The default is to do a store into the stack. */ -#ifndef STACK_CHECK_PROBE_LOAD -#define STACK_CHECK_PROBE_LOAD 0 -#endif - -/* This is a kludge to try to capture the discrepancy between the old - mechanism (generic stack checking) and the new mechanism (static - builtin stack checking). STACK_CHECK_PROTECT needs to be bumped - for the latter because part of the protection area is effectively - included in STACK_CHECK_MAX_FRAME_SIZE for the former. */ -#ifdef STACK_CHECK_PROTECT -#define STACK_OLD_CHECK_PROTECT STACK_CHECK_PROTECT -#else -#define STACK_OLD_CHECK_PROTECT \ - (USING_SJLJ_EXCEPTIONS ? 75 * UNITS_PER_WORD : 8 * 1024) -#endif - -/* Minimum amount of stack required to recover from an anticipated stack - overflow detection. The default value conveys an estimate of the amount - of stack required to propagate an exception. */ -#ifndef STACK_CHECK_PROTECT -#define STACK_CHECK_PROTECT \ - (USING_SJLJ_EXCEPTIONS ? 75 * UNITS_PER_WORD : 12 * 1024) -#endif - -/* Make the maximum frame size be the largest we can and still only need - one probe per function. */ -#ifndef STACK_CHECK_MAX_FRAME_SIZE -#define STACK_CHECK_MAX_FRAME_SIZE \ - (STACK_CHECK_PROBE_INTERVAL - UNITS_PER_WORD) -#endif - -/* This is arbitrary, but should be large enough everywhere. */ -#ifndef STACK_CHECK_FIXED_FRAME_SIZE -#define STACK_CHECK_FIXED_FRAME_SIZE (4 * UNITS_PER_WORD) -#endif - -/* Provide a reasonable default for the maximum size of an object to - allocate in the fixed frame. We may need to be able to make this - controllable by the user at some point. */ -#ifndef STACK_CHECK_MAX_VAR_SIZE -#define STACK_CHECK_MAX_VAR_SIZE (STACK_CHECK_MAX_FRAME_SIZE / 100) -#endif + +/* This structure is used to pass around information about exploded + unary, binary and trinary expressions between expand_expr_real_1 and + friends. */ +typedef struct separate_ops +{ + enum tree_code code; + location_t location; + tree type; + tree op0, op1, op2; +} *sepops; /* Functions from optabs.c, commonly used, and without need for the optabs tables: */ @@ -298,9 +173,6 @@ extern rtx expand_simple_unop (enum machine_mode, enum rtx_code, rtx, rtx, perform the operation described by CODE and MODE. */ extern int have_insn_for (enum rtx_code, enum machine_mode); -extern rtx prepare_operand (int, rtx, int, enum machine_mode, enum machine_mode, - int); - /* Emit code to make a call to a constant function or a library call. */ extern void emit_libcall_block (rtx, rtx, rtx, rtx); @@ -379,7 +251,7 @@ extern rtx builtin_strncpy_read_str (void *, HOST_WIDE_INT, enum machine_mode); /* Functions from expr.c: */ -/* This is run during target initialization to set up which modes can be +/* This is run during target initialization to set up which modes can be used directly in memory and to initialize the block move optab. */ extern void init_expr_target (void); @@ -415,6 +287,7 @@ extern rtx emit_block_move (rtx, rtx, rtx, enum block_op_methods); extern rtx emit_block_move_via_libcall (rtx, rtx, rtx, bool); extern rtx emit_block_move_hints (rtx, rtx, rtx, enum block_op_methods, unsigned int, HOST_WIDE_INT); +extern bool emit_storent_insn (rtx to, rtx from); /* Copy all or part of a value X into registers starting at REGNO. The number of registers to be filled is NREGS. */ @@ -467,7 +340,7 @@ extern rtx clear_storage_hints (rtx, rtx, enum block_op_methods, rtx set_storage_via_libcall (rtx, rtx, rtx, bool); /* Expand a setmem pattern; return true if successful. */ -extern bool set_storage_via_setmem (rtx, rtx, rtx, unsigned int, +extern bool set_storage_via_setmem (rtx, rtx, rtx, unsigned int, unsigned int, HOST_WIDE_INT); /* Determine whether the LEN bytes can be moved by using several move @@ -528,9 +401,13 @@ extern rtx store_expr (tree, rtx, int, bool); Useful after calling expand_expr with 1 as sum_ok. */ extern rtx force_operand (rtx, rtx); -/* Work horse for expand_expr. */ -extern rtx expand_expr_real (tree, rtx, enum machine_mode, +/* Work horses for expand_expr. */ +extern rtx expand_expr_real (tree, rtx, enum machine_mode, enum expand_modifier, rtx *); +extern rtx expand_expr_real_1 (tree, rtx, enum machine_mode, + enum expand_modifier, rtx *); +extern rtx expand_expr_real_2 (sepops, rtx, enum machine_mode, + enum expand_modifier); /* Generate code for computing expression EXP. An rtx for the computed value is returned. The value is never null. @@ -567,17 +444,20 @@ extern void do_pending_stack_adjust (void); extern tree string_constant (tree, tree *); /* Generate code to evaluate EXP and jump to LABEL if the value is zero. */ -extern void jumpifnot (tree, rtx); +extern void jumpifnot (tree, rtx, int); +extern void jumpifnot_1 (enum tree_code, tree, tree, rtx, int); /* Generate code to evaluate EXP and jump to LABEL if the value is nonzero. */ -extern void jumpif (tree, rtx); +extern void jumpif (tree, rtx, int); +extern void jumpif_1 (enum tree_code, tree, tree, rtx, int); /* Generate code to evaluate EXP and jump to IF_FALSE_LABEL if the result is zero, or IF_TRUE_LABEL if the result is one. */ -extern void do_jump (tree, rtx, rtx); +extern void do_jump (tree, rtx, rtx, int); +extern void do_jump_1 (enum tree_code, tree, tree, rtx, rtx, int); extern void do_compare_rtx_and_jump (rtx, rtx, enum rtx_code, int, - enum machine_mode, rtx, rtx, rtx); + enum machine_mode, rtx, rtx, rtx, int); /* Two different ways of generating switch statements. */ extern int try_casesi (tree, tree, tree, tree, rtx, rtx, rtx); @@ -599,7 +479,7 @@ extern HOST_WIDE_INT int_expr_size (tree); in its original home. This becomes invalid if any more code is emitted. */ extern rtx hard_function_value (const_tree, const_tree, const_tree, int); -extern rtx prepare_call_address (rtx, rtx, rtx *, int, int); +extern rtx prepare_call_address (tree, rtx, rtx, rtx *, int, int); extern bool shift_return_value (enum machine_mode, bool, rtx); @@ -608,8 +488,10 @@ extern rtx expand_call (tree, rtx, int); extern void fixup_tail_calls (void); #ifdef TREE_CODE -extern rtx expand_shift (enum tree_code, enum machine_mode, rtx, tree, rtx, - int); +extern rtx expand_variable_shift (enum tree_code, enum machine_mode, + rtx, tree, rtx, int); +extern rtx expand_shift (enum tree_code, enum machine_mode, rtx, int, rtx, + int); extern rtx expand_divmod (int, enum tree_code, enum machine_mode, rtx, rtx, rtx, int); #endif @@ -631,9 +513,15 @@ extern rtx force_label_rtx (tree); The constant terms are added and stored via a second arg. */ extern rtx eliminate_constant_term (rtx, rtx *); -/* Convert arg to a valid memory address for specified machine mode, - by emitting insns to perform arithmetic if nec. */ -extern rtx memory_address (enum machine_mode, rtx); +/* Convert arg to a valid memory address for specified machine mode that points + to a specific named address space, by emitting insns to perform arithmetic + if necessary. */ +extern rtx memory_address_addr_space (enum machine_mode, rtx, addr_space_t); + +/* Like memory_address_addr_space, except assume the memory address points to + the generic named address space. */ +#define memory_address(MODE,RTX) \ + memory_address_addr_space ((MODE), (RTX), ADDR_SPACE_GENERIC) /* Return a memory reference like MEMREF, but with its mode changed to MODE and its address changed to ADDR. @@ -719,8 +607,17 @@ extern rtx force_reg (enum machine_mode, rtx); /* Return given rtx, copied into a new temp reg if it was in memory. */ extern rtx force_not_mem (rtx); +/* Return mode and signedness to use when an argument or result in the + given mode is promoted. */ +extern enum machine_mode promote_function_mode (const_tree, enum machine_mode, int *, + const_tree, int); + +/* Return mode and signedness to use when an object in the given mode + is promoted. */ +extern enum machine_mode promote_mode (const_tree, enum machine_mode, int *); + /* Return mode and signedness to use when object is promoted. */ -extern enum machine_mode promote_mode (const_tree, enum machine_mode, int *, int); +enum machine_mode promote_decl_mode (const_tree, int *); /* Remove some bytes from the stack. An rtx says how many. */ extern void adjust_stack (rtx); @@ -728,32 +625,36 @@ extern void adjust_stack (rtx); /* Add some bytes to the stack. An rtx says how many. */ extern void anti_adjust_stack (rtx); +/* Add some bytes to the stack while probing it. An rtx says how many. */ +extern void anti_adjust_stack_and_probe (rtx, bool); + /* This enum is used for the following two functions. */ enum save_level {SAVE_BLOCK, SAVE_FUNCTION, SAVE_NONLOCAL}; /* Save the stack pointer at the specified level. */ -extern void emit_stack_save (enum save_level, rtx *, rtx); +extern void emit_stack_save (enum save_level, rtx *); /* Restore the stack pointer from a save area of the specified level. */ -extern void emit_stack_restore (enum save_level, rtx, rtx); +extern void emit_stack_restore (enum save_level, rtx); /* Invoke emit_stack_save for the nonlocal_goto_save_area. */ extern void update_nonlocal_goto_save_area (void); -/* Allocate some space on the stack dynamically and return its address. An rtx - says how many bytes. */ -extern rtx allocate_dynamic_stack_space (rtx, rtx, int); +/* Allocate some space on the stack dynamically and return its address. */ +extern rtx allocate_dynamic_stack_space (rtx, unsigned, unsigned, bool); + +/* Emit one stack probe at ADDRESS, an address within the stack. */ +extern void emit_stack_probe (rtx); /* Probe a range of stack addresses from FIRST to FIRST+SIZE, inclusive. - FIRST is a constant and size is a Pmode RTX. These are offsets from the - current stack pointer. STACK_GROWS_DOWNWARD says whether to add or - subtract from the stack. If SIZE is constant, this is done - with a fixed number of probes. Otherwise, we must make a loop. */ + FIRST is a constant and size is a Pmode RTX. These are offsets from + the current stack pointer. STACK_GROWS_DOWNWARD says whether to add + or subtract them from the stack pointer. */ extern void probe_stack_range (HOST_WIDE_INT, rtx); /* Return an rtx that refers to the value returned by a library call in its original home. This becomes invalid if any more code is emitted. */ -extern rtx hard_libcall_value (enum machine_mode); +extern rtx hard_libcall_value (enum machine_mode, rtx); /* Return the mode desired by operand N of a particular bitfield insert/extract insn, or MAX_MACHINE_MODE if no such insn is @@ -766,7 +667,7 @@ mode_for_extraction (enum extraction_pattern, int); extern void store_bit_field (rtx, unsigned HOST_WIDE_INT, unsigned HOST_WIDE_INT, enum machine_mode, rtx); extern rtx extract_bit_field (rtx, unsigned HOST_WIDE_INT, - unsigned HOST_WIDE_INT, int, rtx, + unsigned HOST_WIDE_INT, int, bool, rtx, enum machine_mode, enum machine_mode); extern rtx extract_low_bits (enum machine_mode, enum machine_mode, rtx); extern rtx expand_mult (enum machine_mode, rtx, rtx, rtx, int); @@ -786,6 +687,10 @@ extern void init_all_optabs (void); extern rtx init_one_libfunc (const char *); extern rtx set_user_assembler_libfunc (const char *, const char *); -extern int vector_mode_valid_p (enum machine_mode); +/* Build a decl for a libfunc named NAME. */ +extern tree build_libfunc_function (const char *); + +/* Get the personality libfunc for a function decl. */ +rtx get_personality_function (tree); #endif /* GCC_EXPR_H */