OSDN Git Service

PR fortran/30723
[pf3gnuchains/gcc-fork.git] / gcc / expr.h
index 224e285..13c7321 100644 (file)
@@ -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
+   1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
    Free Software Foundation, Inc.
 
 This file is part of GCC.
@@ -29,8 +29,8 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
 #include "rtl.h"
 /* For optimize_size */
 #include "flags.h"
-/* For host_integerp, tree_low_cst, convert, size_binop, ssize_int, TREE_CODE,
-   TYPE_SIZE, int_size_in_bytes,    */
+/* For host_integerp, tree_low_cst, fold_convert, size_binop, ssize_int,
+   TREE_CODE, TYPE_SIZE, int_size_in_bytes,    */
 #include "tree.h"
 /* For GET_MODE_BITSIZE, word_mode */
 #include "machmode.h"
@@ -123,42 +123,42 @@ struct locate_and_pad_arg_data
 
 /* Add the value of the tree INC to the `struct args_size' TO.  */
 
-#define ADD_PARM_SIZE(TO, INC)                         \
-do {                                                   \
-  tree inc = (INC);                                    \
-  if (host_integerp (inc, 0))                          \
-    (TO).constant += tree_low_cst (inc, 0);            \
-  else if ((TO).var == 0)                              \
-    (TO).var = convert (ssizetype, inc);               \
-  else                                                 \
-    (TO).var = size_binop (PLUS_EXPR, (TO).var,                \
-                          convert (ssizetype, inc));   \
+#define ADD_PARM_SIZE(TO, INC)                                 \
+do {                                                           \
+  tree inc = (INC);                                            \
+  if (host_integerp (inc, 0))                                  \
+    (TO).constant += tree_low_cst (inc, 0);                    \
+  else if ((TO).var == 0)                                      \
+    (TO).var = fold_convert (ssizetype, inc);                  \
+  else                                                         \
+    (TO).var = size_binop (PLUS_EXPR, (TO).var,                        \
+                          fold_convert (ssizetype, inc));      \
 } while (0)
 
-#define SUB_PARM_SIZE(TO, DEC)                         \
-do {                                                   \
-  tree dec = (DEC);                                    \
-  if (host_integerp (dec, 0))                          \
-    (TO).constant -= tree_low_cst (dec, 0);            \
-  else if ((TO).var == 0)                              \
-    (TO).var = size_binop (MINUS_EXPR, ssize_int (0),  \
-                          convert (ssizetype, dec));   \
-  else                                                 \
-    (TO).var = size_binop (MINUS_EXPR, (TO).var,       \
-                          convert (ssizetype, dec));   \
+#define SUB_PARM_SIZE(TO, DEC)                                 \
+do {                                                           \
+  tree dec = (DEC);                                            \
+  if (host_integerp (dec, 0))                                  \
+    (TO).constant -= tree_low_cst (dec, 0);                    \
+  else if ((TO).var == 0)                                      \
+    (TO).var = size_binop (MINUS_EXPR, ssize_int (0),          \
+                          fold_convert (ssizetype, dec));      \
+  else                                                         \
+    (TO).var = size_binop (MINUS_EXPR, (TO).var,               \
+                          fold_convert (ssizetype, dec));      \
 } while (0)
 
 /* Convert the implicit sum in a `struct args_size' into a tree
    of type ssizetype.  */
 #define ARGS_SIZE_TREE(SIZE)                                   \
 ((SIZE).var == 0 ? ssize_int ((SIZE).constant)                 \
- : size_binop (PLUS_EXPR, convert (ssizetype, (SIZE).var),     \
+ : size_binop (PLUS_EXPR, fold_convert (ssizetype, (SIZE).var),        \
               ssize_int ((SIZE).constant)))
 
 /* Convert the implicit sum in a `struct args_size' into an rtx.  */
 #define ARGS_SIZE_RTX(SIZE)                                    \
 ((SIZE).var == 0 ? GEN_INT ((SIZE).constant)                   \
- : expand_expr (ARGS_SIZE_TREE (SIZE), NULL_RTX, VOIDmode, 0))
+ : expand_normal (ARGS_SIZE_TREE (SIZE)))
 
 /* Supply a default definition for FUNCTION_ARG_PADDING:
    usually pad upward, but pad short args downward on
@@ -341,6 +341,7 @@ extern rtx default_expand_builtin (tree, rtx, rtx, enum machine_mode, int);
 extern void expand_builtin_setjmp_setup (rtx, rtx);
 extern void expand_builtin_setjmp_receiver (rtx);
 extern rtx expand_builtin_saveregs (void);
+extern void expand_builtin_trap (void);
 \f
 /* Functions from expr.c:  */
 
@@ -376,6 +377,9 @@ extern void init_block_move_fn (const char *);
 extern void init_block_clear_fn (const char *);
 
 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);
 
 /* Copy all or part of a value X into registers starting at REGNO.
    The number of registers to be filled is NREGS.  */
@@ -422,9 +426,14 @@ extern void use_group_regs (rtx *, rtx);
 /* Write zeros through the storage of OBJECT.
    If OBJECT has BLKmode, SIZE is its length in bytes.  */
 extern rtx clear_storage (rtx, rtx, enum block_op_methods);
+extern rtx clear_storage_hints (rtx, rtx, enum block_op_methods,
+                               unsigned int, HOST_WIDE_INT);
+/* The same, but always output an library call.  */
+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
    instructions.  Return nonzero if a call to move_by_pieces should
@@ -456,6 +465,9 @@ extern rtx emit_move_insn (rtx, rtx);
 /* Emit insns to set X from Y, with no frills.  */
 extern rtx emit_move_insn_1 (rtx, rtx);
 
+extern rtx emit_move_complex_push (enum machine_mode, rtx, rtx);
+extern rtx emit_move_complex_parts (rtx, rtx);
+
 /* Push a block of length SIZE (perhaps variable)
    and return an rtx to address the beginning of the block.  */
 extern rtx push_block (rtx, int, int);
@@ -492,6 +504,12 @@ expand_expr (tree exp, rtx target, enum machine_mode mode,
   return expand_expr_real (exp, target, mode, modifier, NULL);
 }
 
+static inline rtx
+expand_normal (tree exp)
+{
+  return expand_expr_real (exp, NULL_RTX, VOIDmode, EXPAND_NORMAL, NULL);
+}
+
 extern void expand_var (tree);
 
 /* At the start of a function, record that we have no previously-pushed
@@ -579,9 +597,6 @@ extern rtx label_rtx (tree);
    if how is not obvious).  */
 extern rtx force_label_rtx (tree);
 
-/* Indicate how an input argument register was promoted.  */
-extern rtx promoted_input_arg (unsigned int, enum machine_mode *, int *);
-
 /* Return an rtx like arg but sans any constant terms.
    Returns the original rtx if it has no constant terms.
    The constant terms are added and stored via a second arg.  */
@@ -639,6 +654,8 @@ extern rtx widen_memory_access (rtx, enum machine_mode, HOST_WIDE_INT);
    valid address.  */
 extern rtx validize_mem (rtx);
 
+extern rtx use_anchored_address (rtx);
+
 /* Given REF, a MEM, and T, either the type of X or the expression
    corresponding to REF, set the memory attributes.  OBJECTP is nonzero
    if we are making a new object of this type.  */
@@ -721,8 +738,6 @@ extern rtx extract_bit_field (rtx, unsigned HOST_WIDE_INT,
                              unsigned HOST_WIDE_INT, int, rtx,
                              enum machine_mode, enum machine_mode);
 extern rtx expand_mult (enum machine_mode, rtx, rtx, rtx, int);
-extern bool const_mult_add_overflow_p (rtx, rtx, rtx, enum machine_mode, int);
-extern rtx expand_mult_add (rtx, rtx, rtx, rtx,enum machine_mode, int);
 extern rtx expand_mult_highpart_adjust (enum machine_mode, rtx, rtx, rtx, rtx, int);
 
 extern rtx assemble_static_space (unsigned HOST_WIDE_INT);
@@ -736,10 +751,6 @@ extern void init_all_optabs (void);
 /* Call this to initialize an optab function entry.  */
 extern rtx init_one_libfunc (const char *);
 
-extern void do_jump_by_parts_equality_rtx (rtx, rtx, rtx);
-extern void do_jump_by_parts_greater_rtx (enum machine_mode, int, rtx, rtx,
-                                         rtx, rtx);
-
 extern int vector_mode_valid_p (enum machine_mode);
 
 #endif /* GCC_EXPR_H */