/* 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.
#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) \
+ && int_size_in_bytes (TYPE) < (PARM_BOUNDARY / BITS_PER_UNIT)) \
: GET_MODE_BITSIZE (MODE) < PARM_BOUNDARY) \
? downward : upward)
#else
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. */
-/* ??? Perhaps later rename this to FUNCTION_ARG_MUST_PASS_IN_STACK?
- (although it is a little long). */
-
-#ifndef MUST_PASS_IN_STACK
-
#if BYTES_BIG_ENDIAN
#define MUST_PASS_IN_STACK_BAD_PADDING upward
#else
&& (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))))
-#endif
/* Nonzero if type TYPE should be returned in memory.
Most machines can use the following default definition. */
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.
(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));
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. */
/* 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.
/* 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));
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));