| Index: gcc/gcc/expr.h
|
| diff --git a/gcc/gcc/expr.h b/gcc/gcc/expr.h
|
| index 216de87feb13c3269dfa0b0f98549fe1914d61a1..4fddde6006ef6650d00ec69bf0af51aa80bb1986 100644
|
| --- a/gcc/gcc/expr.h
|
| +++ b/gcc/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.
|
| @@ -218,14 +218,14 @@ do { \
|
| #define STACK_CHECK_STATIC_BUILTIN 0
|
| #endif
|
|
|
| -/* The default interval is one page. */
|
| -#ifndef STACK_CHECK_PROBE_INTERVAL
|
| -#define STACK_CHECK_PROBE_INTERVAL 4096
|
| +/* The default interval is one page (4096 bytes). */
|
| +#ifndef STACK_CHECK_PROBE_INTERVAL_EXP
|
| +#define STACK_CHECK_PROBE_INTERVAL_EXP 12
|
| #endif
|
|
|
| -/* The default is to do a store into the stack. */
|
| -#ifndef STACK_CHECK_PROBE_LOAD
|
| -#define STACK_CHECK_PROBE_LOAD 0
|
| +/* The default is not to move the stack pointer. */
|
| +#ifndef STACK_CHECK_MOVING_SP
|
| +#define STACK_CHECK_MOVING_SP 0
|
| #endif
|
|
|
| /* This is a kludge to try to capture the discrepancy between the old
|
| @@ -252,7 +252,7 @@ do { \
|
| one probe per function. */
|
| #ifndef STACK_CHECK_MAX_FRAME_SIZE
|
| #define STACK_CHECK_MAX_FRAME_SIZE \
|
| - (STACK_CHECK_PROBE_INTERVAL - UNITS_PER_WORD)
|
| + ((1 << STACK_CHECK_PROBE_INTERVAL_EXP) - UNITS_PER_WORD)
|
| #endif
|
|
|
| /* This is arbitrary, but should be large enough everywhere. */
|
| @@ -267,6 +267,17 @@ do { \
|
| #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;
|
| + tree type;
|
| + tree op0, op1, op2;
|
| + location_t location;
|
| +} *sepops;
|
| +
|
| /* Functions from optabs.c, commonly used, and without need for the optabs
|
| tables: */
|
|
|
| @@ -298,6 +309,9 @@ 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);
|
|
|
| @@ -376,7 +390,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);
|
|
|
| @@ -412,6 +426,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. */
|
| @@ -464,7 +479,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
|
| @@ -525,9 +540,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.
|
| @@ -564,29 +583,25 @@ 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);
|
|
|
| -/* Generate rtl to compare two rtx's, will call emit_cmp_insn. */
|
| -extern rtx compare_from_rtx (rtx, rtx, enum rtx_code, int, enum machine_mode,
|
| - rtx);
|
| 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);
|
| extern int try_tablejump (tree, tree, tree, tree, rtx, rtx);
|
|
|
| -/* Smallest number of adjacent cases before we use a jump table.
|
| - XXX Should be a target hook. */
|
| -extern unsigned int case_values_threshold (void);
|
| -
|
| /* Functions from alias.c */
|
| #include "alias.h"
|
|
|
| @@ -603,7 +618,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);
|
|
|
| @@ -635,9 +650,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.
|
| @@ -699,7 +720,7 @@ extern void set_mem_attributes_minus_bitpos (rtx, tree, int, HOST_WIDE_INT);
|
| /* Return OFFSET if XEXP (MEM, 0) - OFFSET is known to be ALIGN
|
| bits aligned for 0 <= OFFSET < ALIGN / BITS_PER_UNIT, or
|
| -1 if not known. */
|
| -extern int get_mem_align_offset (rtx, int);
|
| +extern int get_mem_align_offset (rtx, unsigned int);
|
|
|
| /* Assemble the static constant template for function entry trampolines. */
|
| extern rtx assemble_trampoline_template (void);
|
| @@ -723,8 +744,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);
|
| @@ -732,6 +762,9 @@ 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};
|
|
|
| @@ -749,15 +782,14 @@ extern void update_nonlocal_goto_save_area (void);
|
| extern rtx allocate_dynamic_stack_space (rtx, rtx, int);
|
|
|
| /* 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
|
| @@ -778,6 +810,8 @@ extern rtx expand_mult_highpart_adjust (enum machine_mode, rtx, rtx, rtx, rtx, i
|
|
|
| extern rtx assemble_static_space (unsigned HOST_WIDE_INT);
|
| extern int safe_from_p (const_rtx, tree, int);
|
| +extern bool split_comparison (enum rtx_code, enum machine_mode,
|
| + enum rtx_code *, enum rtx_code *);
|
|
|
| /* Call this once to initialize the contents of the optabs
|
| appropriately for the current target machine. */
|
| @@ -788,6 +822,12 @@ extern void init_all_optabs (void);
|
| extern rtx init_one_libfunc (const char *);
|
| extern rtx set_user_assembler_libfunc (const char *, const char *);
|
|
|
| +/* 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);
|
| +
|
| extern int vector_mode_valid_p (enum machine_mode);
|
|
|
| #endif /* GCC_EXPR_H */
|
|
|