/* Definitions for code generation pass of GNU compiler.
- Copyright (C) 1987, 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
+ Copyright (C) 1987, 91-95, 1996 Free Software Foundation, Inc.
This file is part of GNU CC.
You should have received a copy of the GNU General Public License
along with GNU CC; see the file COPYING. If not, write to
-the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
-
-
-#ifndef __STDC__
-#ifndef const
-#define const
-#endif
-#endif
+the Free Software Foundation, 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
/* The default branch cost is 1. */
#ifndef BRANCH_COST
#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
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
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 \
&& 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. */
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;
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];
+/* This array records the insn_code of insns to perform block clears. */
+extern enum insn_code clrstr_optab[NUM_MACHINE_MODES];
+
/* Define functions given in optabs.c. */
/* Expand a binary operation given optab and rtx operands. */
/* 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));
/* 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.
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. */
-extern void clear_storage PROTO((rtx, int));
+ If OBJECT has BLKmode, SIZE is its length in bytes and ALIGN is its
+ alignment. */
+extern void clear_storage PROTO((rtx, rtx, int));
/* Emit insns to set X from Y. */
extern rtx emit_move_insn PROTO((rtx, rtx));
and return an rtx to address the beginning of the block. */
extern rtx push_block PROTO((rtx, int, int));
-/* Make an operand to push someting on the stack. */
+/* Make an operand to push something on the stack. */
extern rtx gen_push_operand PROTO((void));
#ifdef TREE_CODE
says how many bytes. */
extern rtx allocate_dynamic_stack_space PROTO((rtx, rtx, int));
-/* Emit code to copy function value to a new temp reg and return that reg. */
-extern rtx function_value ();
-
/* 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 PROTO((enum machine_mode));
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_mult_highpart_adjust PROTO((enum machine_mode, rtx, rtx, rtx, rtx, int));
extern rtx assemble_static_space PROTO((int));
It is up to the language front end to install a hook
if it has any such codes that expand_expr needs to know about. */
extern rtx (*lang_expand_expr) ();
+
+#ifdef TREE_CODE
+/* Build bytecode call descriptor for function SUBR. */
+extern rtx bc_build_calldesc PROTO((tree));
+
+/* Emit a type code to be used by the runtime support in handling
+ parameter passing. The type code consists of the machine mode
+ plus the minimal alignment shifted left 8 bits. */
+extern tree bc_runtime_type_code PROTO((tree));
+#endif