OSDN Git Service

(const_binop): Don't pass OVERFLOW to force_fit_type if type is
[pf3gnuchains/gcc-fork.git] / gcc / expr.h
index 7abeb73..aa235bd 100644 (file)
@@ -119,6 +119,12 @@ extern int pending_stack_adjust;
 #ifdef TREE_CODE   /* Don't lose if tree.h not included.  */
 extern tree cleanups_this_call;
 #endif
+
+/* When temporaries are created by TARGET_EXPRs, they are created at
+   this level of temp_slot_level, so that they can remain allocated
+   until no longer needed.  CLEANUP_POINT_EXPRs define the lifetime
+   of TARGET_EXPRs.  */
+extern int target_temp_slot_level;
 \f
 #ifdef TREE_CODE /* Don't lose if tree.h not included.  */
 /* Structure to record the size of a sequence of arguments
@@ -170,16 +176,14 @@ struct args_size
 enum direction {none, upward, downward};  /* Value has this type.  */
 
 #ifndef FUNCTION_ARG_PADDING
-#if BYTES_BIG_ENDIAN
 #define FUNCTION_ARG_PADDING(MODE, TYPE)                               \
-  (((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)
-#else
-#define FUNCTION_ARG_PADDING(MODE, TYPE) upward
-#endif
+  (! 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))
 #endif
 
 /* Supply a default definition for FUNCTION_ARG_BOUNDARY.  Normally, we let
@@ -206,12 +210,6 @@ enum direction {none, upward, downward};  /* Value has this type.  */
    So a value padded in memory at the upper end can't go in a register.
    For a little-endian machine, the reverse is true.  */
 
-#if BYTES_BIG_ENDIAN
-#define MUST_PASS_IN_STACK_BAD_PADDING upward
-#else
-#define MUST_PASS_IN_STACK_BAD_PADDING downward
-#endif
-
 #define MUST_PASS_IN_STACK(MODE,TYPE)                  \
   ((TYPE) != 0                                         \
    && (TREE_CODE (TYPE_SIZE (TYPE)) != INTEGER_CST     \
@@ -221,7 +219,7 @@ enum direction {none, upward, downward};  /* Value has this type.  */
                 && 0 == (int_size_in_bytes (TYPE)      \
                          % (PARM_BOUNDARY / BITS_PER_UNIT))) \
           && (FUNCTION_ARG_PADDING (MODE, TYPE)        \
-              == MUST_PASS_IN_STACK_BAD_PADDING))))
+              == (BYTES_BIG_ENDIAN ? upward : downward)))))
 
 /* Nonzero if type TYPE should be returned in memory.
    Most machines can use the following default definition.  */
@@ -276,6 +274,8 @@ extern rtx (*const insn_gen_function[]) ();
 extern optab add_optab;
 extern optab sub_optab;
 extern optab smul_optab;       /* Signed and floating-point multiply */
+extern optab smul_highpart_optab; /* Signed multiply, return high word */
+extern optab umul_highpart_optab;
 extern optab smul_widen_optab; /* Signed multiply with result 
                                   one machine mode wider than args */
 extern optab umul_widen_optab;
@@ -364,6 +364,13 @@ extern rtx bcmp_libfunc;
 extern rtx memset_libfunc;
 extern rtx bzero_libfunc;
 
+extern rtx eqhf2_libfunc;
+extern rtx nehf2_libfunc;
+extern rtx gthf2_libfunc;
+extern rtx gehf2_libfunc;
+extern rtx lthf2_libfunc;
+extern rtx lehf2_libfunc;
+
 extern rtx eqsf2_libfunc;
 extern rtx nesf2_libfunc;
 extern rtx gtsf2_libfunc;
@@ -453,6 +460,13 @@ extern rtxfun bcc_gen_fctn[NUM_RTX_CODE];
 
 extern enum insn_code setcc_gen_code[NUM_RTX_CODE];
 
+#ifdef HAVE_conditional_move
+/* Indexed by the the machine mode, gives the insn code to make a conditional
+   move insn.  */
+
+extern enum insn_code movcc_gen_code[NUM_MACHINE_MODES];
+#endif
+
 /* This array records the insn_code of insns to perform block moves.  */
 extern enum insn_code movstr_optab[NUM_MACHINE_MODES];
 
@@ -472,6 +486,9 @@ extern int expand_twoval_binop PROTO((optab, rtx, rtx, rtx, rtx, int));
 /* Expand a unary arithmetic operation given optab rtx operand.  */
 extern rtx expand_unop PROTO((enum machine_mode, optab, rtx, rtx, int));
 
+/* Expand the absolute value operation.  */
+extern rtx expand_abs PROTO((enum machine_mode, rtx, rtx, int, int));
+
 /* Expand the complex absolute value operation.  */
 extern rtx expand_complex_abs PROTO((enum machine_mode, rtx, rtx, int));
 
@@ -507,6 +524,16 @@ extern void emit_float_lib_cmp PROTO((rtx, rtx, enum rtx_code));
 /* Generate code to indirectly jump to a location given in the rtx LOC.  */
 extern void emit_indirect_jump PROTO((rtx));
 
+#ifdef HAVE_conditional_move
+/* Emit a conditional move operation.  */
+rtx emit_conditional_move PROTO((rtx, enum rtx_code, rtx, rtx,
+                                enum machine_mode, rtx, rtx,
+                                enum machine_mode, int));
+
+/* Return non-zero if the conditional move is supported.  */
+int can_conditionally_move_p PROTO((enum machine_mode mode));
+#endif
+
 /* Create but don't emit one rtl instruction to add one rtx into another.
    Modes must match; operands must meet the operation's predicates.
    Likewise for subtraction and for just copying.