OSDN Git Service

(const_binop): Don't pass OVERFLOW to force_fit_type if type is
[pf3gnuchains/gcc-fork.git] / gcc / expr.h
index f4f754e..aa235bd 100644 (file)
@@ -1,5 +1,5 @@
 /* Definitions for code generation pass of GNU compiler.
-   Copyright (C) 1987, 1991, 1992, 1993 Free Software Foundation, Inc.
+   Copyright (C) 1987, 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
 
 This file is part of GNU CC.
 
@@ -29,11 +29,6 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #define BRANCH_COST 1
 #endif
 
-/* The default is that we do not promote the mode of an object.  */
-#ifndef PROMOTE_MODE
-#define PROMOTE_MODE(MODE,UNSIGNEDP,TYPE)
-#endif
-
 /* Macros to access the slots of a QUEUED rtx.
    Here rather than in rtl.h because only the expansion pass
    should ever encounter a QUEUED.  */
@@ -124,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
@@ -175,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
@@ -211,19 +210,16 @@ 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     \
        || TREE_ADDRESSABLE (TYPE)                      \
        || ((MODE) == BLKmode                           \
+          && ! ((TYPE) != 0 && TREE_CODE (TYPE_SIZE (TYPE)) == INTEGER_CST \
+                && 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.  */
@@ -278,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;
@@ -294,7 +292,6 @@ extern optab ior_optab;             /* Logical or */
 extern optab xor_optab;                /* Logical xor */
 extern optab ashl_optab;       /* Arithmetic shift left */
 extern optab ashr_optab;       /* Arithmetic shift right */
-extern optab lshl_optab;       /* Logical shift left */
 extern optab lshr_optab;       /* Logical shift right */
 extern optab rotl_optab;       /* Rotate left */
 extern optab rotr_optab;       /* Rotate right */
@@ -319,6 +316,17 @@ extern optab sin_optab;            /* Sine */
 extern optab cos_optab;                /* Cosine */
 extern optab strlen_optab;     /* String length */
 
+/* Tables of patterns for extending one integer mode to another.  */
+extern enum insn_code extendtab[MAX_MACHINE_MODE][MAX_MACHINE_MODE][2];
+
+/* Tables of patterns for converting between fixed and floating point. */
+extern enum insn_code fixtab[NUM_MACHINE_MODES][NUM_MACHINE_MODES][2];
+extern enum insn_code fixtrunctab[NUM_MACHINE_MODES][NUM_MACHINE_MODES][2];
+extern enum insn_code floattab[NUM_MACHINE_MODES][NUM_MACHINE_MODES][2];
+
+/* Contains the optab used for each rtx code.  */
+extern optab code_to_optab[NUM_RTX_CODE + 1];
+
 /* Passed to expand_binop and expand_unop to say which options to try to use
    if the requested operation can't be open-coded on the requisite mode.
    Either OPTAB_LIB or OPTAB_LIB_WIDEN says try using a library call.
@@ -356,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;
@@ -445,6 +460,16 @@ 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];
+
 /* Define functions given in optabs.c.  */
 
 /* Expand a binary operation given optab and rtx operands.  */
@@ -461,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));
 
@@ -489,9 +517,23 @@ extern void emit_cmp_insn PROTO((rtx, rtx, enum rtx_code, rtx,
    (without splitting it into pieces).  */
 extern int can_compare_p PROTO((enum machine_mode));
 
+/* Emit a library call comparison between floating point X and Y.
+   COMPARISON is the rtl operator to compare with (EQ, NE, GT, etc.).  */
+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.
@@ -526,7 +568,7 @@ extern void expand_fix PROTO((rtx, rtx, int));
    appropriately for the current target machine.  */
 extern void init_optabs        PROTO((void));
 \f
-/* Functions from expmed.c:  (/
+/* Functions from expmed.c:  */
 
 /* Arguments MODE, RTX: return an rtx for the negation of that value.
    May emit insns.  */
@@ -567,7 +609,10 @@ extern void convert_move PROTO((rtx, rtx, int));
 /* Convert an rtx to specified machine mode and return the result.  */
 extern rtx convert_to_mode PROTO((enum machine_mode, rtx, int));
 
-/* Emit code to move a block Y to a block X.
+/* Convert an rtx to MODE from OLDMODE and return the result.  */
+extern rtx convert_modes PROTO((enum machine_mode, enum machine_mode, rtx, int));
+
+/* Emit code to move a block Y to a block X.  */
 extern void emit_block_move PROTO((rtx, rtx, rtx, int));
 
 /* Copy all or part of a value X into registers starting at REGNO.
@@ -576,10 +621,13 @@ extern void move_block_to_reg PROTO((int, rtx, int, enum machine_mode));
 
 /* Copy all or part of a BLKmode value X out of registers starting at REGNO.
    The number of registers to be filled is NREGS.  */
-extern void move_block_from_reg PROTO((int, rtx, int));
+extern void move_block_from_reg PROTO((int, rtx, int, int));
 
-/* Mark NREGS consecutive regs, starting at REGNO, as being live now.  */
-extern void use_regs PROTO((int, int));
+/* Mark REG as holding a parameter for the next CALL_INSN.  */
+extern void use_reg PROTO((rtx*, rtx));
+/* Mark NREGS consecutive regs, starting at REGNO, as holding parameters
+   for the next CALL_INSN.  */
+extern void use_regs PROTO((rtx*, int, int));
 
 /* Write zeros through the storage of OBJECT.
    If OBJECT has BLKmode, SIZE is its length in bytes.  */
@@ -603,10 +651,11 @@ extern rtx gen_push_operand PROTO((void));
 extern void emit_push_insn PROTO((rtx, enum machine_mode, tree, rtx, int,
                                  int, rtx, int, rtx, rtx));
 
-/* Emit library call.  These cannot have accurate prototypes since they have
-   a variable number of args.  */
-extern void emit_library_call ();
-extern void emit_library_call_value ();
+/* Emit library call.  */
+extern void emit_library_call PVPROTO((rtx orgfun, int no_queue,
+  enum machine_mode outmode, int nargs, ...));
+extern rtx emit_library_call_value PVPROTO((rtx orgfun, rtx value, int no_queue,
+  enum machine_mode outmode, int nargs, ...));
 
 /* Expand an assignment that stores the value of FROM into TO. */
 extern rtx expand_assignment PROTO((tree, tree, int, int));
@@ -682,11 +731,9 @@ extern rtx trampoline_address PROTO((tree));
    in its original home.  This becomes invalid if any more code is emitted.  */
 extern rtx hard_function_value PROTO((tree, tree));
 
-
-extern rtx prepare_call_address PROTO((rtx, tree, rtx*));
+extern rtx prepare_call_address        PROTO((rtx, tree, rtx *, int));
 
 extern rtx expand_call PROTO((tree, rtx, int));
-extern void emit_call_1 PROTO((rtx, tree, int, int, rtx, rtx, int, rtx, int));
 
 extern rtx expand_shift PROTO((enum tree_code, enum machine_mode, rtx, tree, rtx, int));
 extern rtx expand_divmod PROTO((int, enum tree_code, enum machine_mode, rtx, rtx, rtx, int));
@@ -694,37 +741,10 @@ extern void locate_and_pad_parm PROTO((enum machine_mode, tree, int, tree, struc
 extern rtx expand_inline_function PROTO((tree, tree, rtx, int, tree, rtx));
 /* Return the CODE_LABEL rtx for a LABEL_DECL, creating it if necessary.  */
 extern rtx label_rtx PROTO((tree));
-#else
-/* Return an rtx for the size in bytes of the value of an expr.  */
-extern rtx expr_size ();
-
-extern rtx lookup_static_chain ();
-
-/* Convert a stack slot address ADDR valid in function FNDECL
-   into an address valid in this function (using a static chain).  */
-extern rtx fix_lexical_addr ();
-
-/* Return the address of the trampoline for entering nested fn FUNCTION.  */
-extern rtx trampoline_address ();
-
-/* Return an rtx that refers to the value returned by a function
-   in its original home.  This becomes invalid if any more code is emitted.  */
-extern rtx hard_function_value ();
-
-extern rtx prepare_call_address ();
-extern rtx expand_call ();
-extern void emit_call_1 ();
-extern rtx expand_shift ();
-extern rtx expand_divmod ();
-extern void locate_and_pad_parm ();
-extern rtx expand_inline_function ();
-
-/* Return the CODE_LABEL rtx for a LABEL_DECL, creating it if necessary.  */
-extern rtx label_rtx ();
 #endif
 
 /* Indicate how an input argument register was promoted.  */
-extern rtx promoted_input_arg ();
+extern rtx promoted_input_arg PROTO((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.
@@ -749,10 +769,6 @@ extern rtx change_address PROTO((rtx, enum machine_mode, rtx));
 
 extern rtx validize_mem PROTO((rtx));
 
-/* Convert a stack slot address ADDR valid in function FNDECL
-   into an address valid in this function (using a static chain).  */
-extern rtx fix_lexical_addr ();
-
 /* Assemble the static constant template for function entry trampolines.  */
 extern rtx assemble_trampoline_template PROTO((void));
 
@@ -786,6 +802,12 @@ extern rtx force_reg PROTO((enum machine_mode, rtx));
 /* Return given rtx, copied into a new temp reg if it was in memory.  */
 extern rtx force_not_mem PROTO((rtx));
 
+#ifdef TREE_CODE
+/* Return mode and signedness to use when object is promoted.  */
+extern enum machine_mode promote_mode PROTO((tree, enum machine_mode,
+                                            int *, int));
+#endif
+
 /* Remove some bytes from the stack.  An rtx says how many.  */
 extern void adjust_stack PROTO((rtx));
 
@@ -812,9 +834,6 @@ extern rtx function_value ();
    in its original home.  This becomes invalid if any more code is emitted.  */
 extern rtx hard_libcall_value PROTO((enum machine_mode));
 
-/* Emit code to copy function value to a specified place.  */
-extern void copy_function_value ();
-
 /* Given an rtx, return an rtx for a value rounded up to a multiple
    of STACK_BOUNDARY / BITS_PER_UNIT.  */
 extern rtx round_push PROTO((rtx));
@@ -825,7 +844,6 @@ extern rtx store_bit_field PROTO((rtx, int, int, enum machine_mode, rtx, int, in
 extern rtx extract_bit_field PROTO((rtx, int, int, int, rtx, enum machine_mode, enum machine_mode, int, int));
 extern rtx expand_mult PROTO((enum machine_mode, rtx, rtx, rtx, int));
 extern rtx expand_mult_add PROTO((rtx, rtx, rtx, rtx,enum machine_mode, int));
-extern rtx expand_stmt_expr ();
 
 extern rtx assemble_static_space PROTO((int));