]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/expr.h
Merge from pch-branch up to tag pch-commit-20020603.
[thirdparty/gcc.git] / gcc / expr.h
CommitLineData
e8bbfc4e 1/* Definitions for code generation pass of GNU compiler.
ef58a523
JL
2 Copyright (C) 1987, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3 1999, 2000 Free Software Foundation, Inc.
e8bbfc4e 4
1322177d 5This file is part of GCC.
e8bbfc4e 6
1322177d
LB
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
9Software Foundation; either version 2, or (at your option) any later
10version.
e8bbfc4e 11
1322177d
LB
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for more details.
e8bbfc4e
RK
16
17You should have received a copy of the GNU General Public License
1322177d
LB
18along with GCC; see the file COPYING. If not, write to the Free
19Software Foundation, 59 Temple Place - Suite 330, Boston, MA
2002111-1307, USA. */
e8bbfc4e 21
e8bbfc4e
RK
22/* The default branch cost is 1. */
23#ifndef BRANCH_COST
24#define BRANCH_COST 1
25#endif
26
27/* Macros to access the slots of a QUEUED rtx.
28 Here rather than in rtl.h because only the expansion pass
29 should ever encounter a QUEUED. */
30
31/* The variable for which an increment is queued. */
32#define QUEUED_VAR(P) XEXP (P, 0)
33/* If the increment has been emitted, this is the insn
41b083c4
R
34 that does the increment. It is zero before the increment is emitted.
35 If more than one insn is emitted, this is the first insn. */
e8bbfc4e
RK
36#define QUEUED_INSN(P) XEXP (P, 1)
37/* If a pre-increment copy has been generated, this is the copy
38 (it is a temporary reg). Zero if no copy made yet. */
39#define QUEUED_COPY(P) XEXP (P, 2)
40/* This is the body to use for the insn to do the increment.
41 It is used to emit the increment. */
42#define QUEUED_BODY(P) XEXP (P, 3)
43/* Next QUEUED in the queue. */
44#define QUEUED_NEXT(P) XEXP (P, 4)
45
46/* This is the 4th arg to `expand_expr'.
47 EXPAND_SUM means it is ok to return a PLUS rtx or MULT rtx.
48 EXPAND_INITIALIZER is similar but also record any labels on forced_labels.
49 EXPAND_CONST_ADDRESS means it is ok to return a MEM whose address
99b5da08 50 is a constant that is not a legitimate address.
37a08a29
RK
51 EXPAND_WRITE means we are only going to write to the resulting rtx. */
52enum expand_modifier {EXPAND_NORMAL, EXPAND_SUM, EXPAND_CONST_ADDRESS,
53 EXPAND_INITIALIZER, EXPAND_WRITE};
e8bbfc4e 54
5c7a310f
MM
55/* Prevent the compiler from deferring stack pops. See
56 inhibit_defer_pop for more information. */
57#define NO_DEFER_POP (inhibit_defer_pop += 1)
58
59/* Allow the compiler to defer stack pops. See inhibit_defer_pop for
60 more information. */
61#define OK_DEFER_POP (inhibit_defer_pop -= 1)
e8bbfc4e
RK
62\f
63#ifdef TREE_CODE /* Don't lose if tree.h not included. */
64/* Structure to record the size of a sequence of arguments
fed3cef0
RK
65 as the sum of a tree-expression and a constant. This structure is
66 also used to store offsets from the stack, which might be negative,
67 so the variable part must be ssizetype, not sizetype. */
e8bbfc4e
RK
68
69struct args_size
70{
e5e809f4 71 HOST_WIDE_INT constant;
e8bbfc4e
RK
72 tree var;
73};
74#endif
75
76/* Add the value of the tree INC to the `struct args_size' TO. */
77
82cf684b
RH
78#define ADD_PARM_SIZE(TO, INC) \
79do { \
80 tree inc = (INC); \
81 if (host_integerp (inc, 0)) \
82 (TO).constant += tree_low_cst (inc, 0); \
83 else if ((TO).var == 0) \
361ea006 84 (TO).var = convert (ssizetype, inc); \
82cf684b
RH
85 else \
86 (TO).var = size_binop (PLUS_EXPR, (TO).var, \
87 convert (ssizetype, inc)); \
88} while (0)
89
90#define SUB_PARM_SIZE(TO, DEC) \
91do { \
92 tree dec = (DEC); \
93 if (host_integerp (dec, 0)) \
94 (TO).constant -= tree_low_cst (dec, 0); \
95 else if ((TO).var == 0) \
96 (TO).var = size_binop (MINUS_EXPR, ssize_int (0), \
97 convert (ssizetype, dec)); \
98 else \
99 (TO).var = size_binop (MINUS_EXPR, (TO).var, \
100 convert (ssizetype, dec)); \
101} while (0)
e8bbfc4e 102
fed3cef0
RK
103/* Convert the implicit sum in a `struct args_size' into a tree
104 of type ssizetype. */
105#define ARGS_SIZE_TREE(SIZE) \
106((SIZE).var == 0 ? ssize_int ((SIZE).constant) \
f322b423
RH
107 : size_binop (PLUS_EXPR, convert (ssizetype, (SIZE).var), \
108 ssize_int ((SIZE).constant)))
fed3cef0 109
e8bbfc4e 110/* Convert the implicit sum in a `struct args_size' into an rtx. */
fed3cef0
RK
111#define ARGS_SIZE_RTX(SIZE) \
112((SIZE).var == 0 ? GEN_INT ((SIZE).constant) \
37a08a29 113 : expand_expr (ARGS_SIZE_TREE (SIZE), NULL_RTX, VOIDmode, 0))
e8bbfc4e
RK
114
115/* Supply a default definition for FUNCTION_ARG_PADDING:
355b2097 116 usually pad upward, but pad short args downward on
e8bbfc4e
RK
117 big-endian machines. */
118
119enum direction {none, upward, downward}; /* Value has this type. */
120
121#ifndef FUNCTION_ARG_PADDING
e8bbfc4e 122#define FUNCTION_ARG_PADDING(MODE, TYPE) \
f76b9db2
ILT
123 (! BYTES_BIG_ENDIAN \
124 ? upward \
125 : (((MODE) == BLKmode \
126 ? ((TYPE) && TREE_CODE (TYPE_SIZE (TYPE)) == INTEGER_CST \
127 && int_size_in_bytes (TYPE) < (PARM_BOUNDARY / BITS_PER_UNIT)) \
128 : GET_MODE_BITSIZE (MODE) < PARM_BOUNDARY) \
129 ? downward : upward))
e8bbfc4e
RK
130#endif
131
132/* Supply a default definition for FUNCTION_ARG_BOUNDARY. Normally, we let
133 FUNCTION_ARG_PADDING, which also pads the length, handle any needed
134 alignment. */
0fb7aeda 135
e8bbfc4e
RK
136#ifndef FUNCTION_ARG_BOUNDARY
137#define FUNCTION_ARG_BOUNDARY(MODE, TYPE) PARM_BOUNDARY
138#endif
139
e5e809f4
JL
140/* Provide a default value for STRICT_ARGUMENT_NAMING. */
141#ifndef STRICT_ARGUMENT_NAMING
142#define STRICT_ARGUMENT_NAMING 0
143#endif
144
9ab70a9b
R
145/* Provide a default value for PRETEND_OUTGOING_VARARGS_NAMED. */
146#ifdef SETUP_INCOMING_VARARGS
147#ifndef PRETEND_OUTGOING_VARARGS_NAMED
148#define PRETEND_OUTGOING_VARARGS_NAMED 1
149#endif
150#else
151/* It is an error to define PRETEND_OUTGOING_VARARGS_NAMED without
152 defining SETUP_INCOMING_VARARGS. */
153#define PRETEND_OUTGOING_VARARGS_NAMED 0
154#endif
155
e8bbfc4e
RK
156/* Nonzero if we do not know how to pass TYPE solely in registers.
157 We cannot do so in the following cases:
158
159 - if the type has variable size
160 - if the type is marked as addressable (it is required to be constructed
161 into the stack)
162 - if the padding and mode of the type is such that a copy into a register
e7cf2d7e
RK
163 would put it into the wrong part of the register.
164
14a8d078 165 Which padding can't be supported depends on the byte endianness.
e8bbfc4e 166
e7cf2d7e 167 A value in a register is implicitly padded at the most significant end.
e8bbfc4e
RK
168 On a big-endian machine, that is the lower end in memory.
169 So a value padded in memory at the upper end can't go in a register.
170 For a little-endian machine, the reverse is true. */
171
d9a4ee00 172#ifndef MUST_PASS_IN_STACK
e8bbfc4e
RK
173#define MUST_PASS_IN_STACK(MODE,TYPE) \
174 ((TYPE) != 0 \
175 && (TREE_CODE (TYPE_SIZE (TYPE)) != INTEGER_CST \
176 || TREE_ADDRESSABLE (TYPE) \
177 || ((MODE) == BLKmode \
6fb713ce
RK
178 && ! ((TYPE) != 0 && TREE_CODE (TYPE_SIZE (TYPE)) == INTEGER_CST \
179 && 0 == (int_size_in_bytes (TYPE) \
180 % (PARM_BOUNDARY / BITS_PER_UNIT))) \
e8bbfc4e 181 && (FUNCTION_ARG_PADDING (MODE, TYPE) \
f76b9db2 182 == (BYTES_BIG_ENDIAN ? upward : downward)))))
d9a4ee00 183#endif
e8bbfc4e 184
e14fa9c4 185/* Nonzero if type TYPE should be returned in memory.
e8bbfc4e
RK
186 Most machines can use the following default definition. */
187
188#ifndef RETURN_IN_MEMORY
e14fa9c4 189#define RETURN_IN_MEMORY(TYPE) (TYPE_MODE (TYPE) == BLKmode)
e8bbfc4e 190#endif
f7761c9a 191
a260abc9
DE
192/* Supply a default definition of STACK_SAVEAREA_MODE for emit_stack_save.
193 Normally move_insn, so Pmode stack pointer. */
194
195#ifndef STACK_SAVEAREA_MODE
196#define STACK_SAVEAREA_MODE(LEVEL) Pmode
197#endif
198
39403d82
DE
199/* Supply a default definition of STACK_SIZE_MODE for
200 allocate_dynamic_stack_space. Normally PLUS/MINUS, so word_mode. */
201
202#ifndef STACK_SIZE_MODE
203#define STACK_SIZE_MODE word_mode
204#endif
205
f7761c9a
RK
206/* Provide default values for the macros controlling stack checking. */
207
208#ifndef STACK_CHECK_BUILTIN
209#define STACK_CHECK_BUILTIN 0
210#endif
211
212/* The default interval is one page. */
213#ifndef STACK_CHECK_PROBE_INTERVAL
214#define STACK_CHECK_PROBE_INTERVAL 4096
215#endif
216
217/* The default is to do a store into the stack. */
218#ifndef STACK_CHECK_PROBE_LOAD
219#define STACK_CHECK_PROBE_LOAD 0
220#endif
221
222/* This value is arbitrary, but should be sufficient for most machines. */
223#ifndef STACK_CHECK_PROTECT
224#define STACK_CHECK_PROTECT (75 * UNITS_PER_WORD)
225#endif
226
227/* Make the maximum frame size be the largest we can and still only need
228 one probe per function. */
229#ifndef STACK_CHECK_MAX_FRAME_SIZE
230#define STACK_CHECK_MAX_FRAME_SIZE \
231 (STACK_CHECK_PROBE_INTERVAL - UNITS_PER_WORD)
232#endif
233
234/* This is arbitrary, but should be large enough everywhere. */
235#ifndef STACK_CHECK_FIXED_FRAME_SIZE
236#define STACK_CHECK_FIXED_FRAME_SIZE (4 * UNITS_PER_WORD)
237#endif
238
239/* Provide a reasonable default for the maximum size of an object to
240 allocate in the fixed frame. We may need to be able to make this
241 controllable by the user at some point. */
242#ifndef STACK_CHECK_MAX_VAR_SIZE
243#define STACK_CHECK_MAX_VAR_SIZE (STACK_CHECK_MAX_FRAME_SIZE / 100)
244#endif
e8bbfc4e 245\f
e78d8e51
ZW
246/* Functions from optabs.c, commonly used, and without need for the optabs
247 tables: */
e8bbfc4e 248
ef89d648
ZW
249/* Passed to expand_simple_binop and expand_binop to say which options
250 to try to use if the requested operation can't be open-coded on the
251 requisite mode. Either OPTAB_LIB or OPTAB_LIB_WIDEN says try using
252 a library call. Either OPTAB_WIDEN or OPTAB_LIB_WIDEN says try
253 using a wider mode. OPTAB_MUST_WIDEN says try widening and don't
254 try anything else. */
255
256enum optab_methods
257{
258 OPTAB_DIRECT,
259 OPTAB_LIB,
260 OPTAB_WIDEN,
261 OPTAB_LIB_WIDEN,
262 OPTAB_MUST_WIDEN
263};
264
265/* Generate code for a simple binary or unary operation. "Simple" in
266 this case means "can be unambiguously described by a (mode, code)
267 pair and mapped to a single optab." */
268extern rtx expand_simple_binop PARAMS ((enum machine_mode, enum rtx_code, rtx,
269 rtx, rtx, int, enum optab_methods));
270extern rtx expand_simple_unop PARAMS ((enum machine_mode, enum rtx_code,
271 rtx, rtx, int));
272
273/* Report whether the machine description contains an insn which can
274 perform the operation described by CODE and MODE. */
275extern int have_insn_for PARAMS ((enum rtx_code, enum machine_mode));
276
19eb1ad7 277/* Emit code to make a call to a constant function or a library call. */
711d877c 278extern void emit_libcall_block PARAMS ((rtx, rtx, rtx, rtx));
e8bbfc4e 279
e78d8e51
ZW
280/* Create but don't emit one rtl instruction to perform certain operations.
281 Modes must match; operands must meet the operation's predicates.
282 Likewise for subtraction and for just copying.
283 These do not call protect_from_queue; caller must do so. */
284extern rtx gen_add2_insn PARAMS ((rtx, rtx));
285extern rtx gen_add3_insn PARAMS ((rtx, rtx, rtx));
286extern rtx gen_sub2_insn PARAMS ((rtx, rtx));
ef89d648 287extern rtx gen_sub3_insn PARAMS ((rtx, rtx, rtx));
e78d8e51
ZW
288extern rtx gen_move_insn PARAMS ((rtx, rtx));
289extern int have_add2_insn PARAMS ((rtx, rtx));
290extern int have_sub2_insn PARAMS ((rtx, rtx));
12e74c9e 291
0fb7aeda 292/* Emit a pair of rtl insns to compare two rtx's and to jump
362cc3d4 293 to a label if the comparison is true. */
711d877c 294extern void emit_cmp_and_jump_insns PARAMS ((rtx, rtx, enum rtx_code, rtx,
a06ef755 295 enum machine_mode, int, rtx));
362cc3d4 296
12e74c9e 297/* Generate code to indirectly jump to a location given in the rtx LOC. */
711d877c 298extern void emit_indirect_jump PARAMS ((rtx));
12e74c9e 299
423933c2
DE
300#ifdef HAVE_conditional_move
301/* Emit a conditional move operation. */
711d877c
KG
302rtx emit_conditional_move PARAMS ((rtx, enum rtx_code, rtx, rtx,
303 enum machine_mode, rtx, rtx,
304 enum machine_mode, int));
423933c2
DE
305
306/* Return non-zero if the conditional move is supported. */
711d877c 307int can_conditionally_move_p PARAMS ((enum machine_mode mode));
e9576d2c 308
423933c2
DE
309#endif
310
12e74c9e 311\f
bda63bf1 312/* Functions from expmed.c: */
e8bbfc4e 313
12e74c9e
RK
314/* Arguments MODE, RTX: return an rtx for the negation of that value.
315 May emit insns. */
711d877c 316extern rtx negate_rtx PARAMS ((enum machine_mode, rtx));
e8bbfc4e 317
12e74c9e 318/* Expand a logical AND operation. */
22273300 319extern rtx expand_and PARAMS ((enum machine_mode, rtx, rtx, rtx));
e8bbfc4e 320
12e74c9e 321/* Emit a store-flag operation. */
711d877c
KG
322extern rtx emit_store_flag PARAMS ((rtx, enum rtx_code, rtx, rtx,
323 enum machine_mode, int, int));
e8bbfc4e 324
c0eccde6 325/* Like emit_store_flag, but always succeeds. */
711d877c
KG
326extern rtx emit_store_flag_force PARAMS ((rtx, enum rtx_code, rtx, rtx,
327 enum machine_mode, int, int));
c0eccde6 328
12e74c9e 329/* Functions from loop.c: */
e8bbfc4e 330
a49a6a68
JW
331/* Given an insn and condition, return a canonical description of
332 the test being made. */
10f13594 333extern rtx canonicalize_condition PARAMS ((rtx, rtx, int, rtx *, rtx));
a49a6a68
JW
334
335/* Given a JUMP_INSN, return a canonical description of the test
336 being made. */
711d877c 337extern rtx get_condition PARAMS ((rtx, rtx *));
e0cd0770
JC
338
339/* Generate a conditional trap instruction. */
711d877c 340extern rtx gen_cond_trap PARAMS ((enum rtx_code, rtx, rtx, rtx));
12e74c9e 341\f
28f4ec01 342/* Functions from builtins.c: */
711d877c
KG
343extern rtx expand_builtin PARAMS ((tree, rtx, rtx, enum machine_mode, int));
344extern void std_expand_builtin_va_start PARAMS ((int, tree, rtx));
345extern rtx std_expand_builtin_va_arg PARAMS ((tree, tree));
346extern rtx expand_builtin_va_arg PARAMS ((tree, tree));
f6155fda
SS
347extern void default_init_builtins PARAMS ((void));
348extern rtx default_expand_builtin PARAMS ((tree, rtx, rtx,
349 enum machine_mode, int));
250d07b6
RH
350extern void expand_builtin_setjmp_setup PARAMS ((rtx, rtx));
351extern void expand_builtin_setjmp_receiver PARAMS ((rtx));
711d877c
KG
352extern void expand_builtin_longjmp PARAMS ((rtx, rtx));
353extern rtx expand_builtin_saveregs PARAMS ((void));
9602f5a0 354extern void expand_builtin_trap PARAMS ((void));
3bdf5ad1
RK
355extern HOST_WIDE_INT get_varargs_alias_set PARAMS ((void));
356extern HOST_WIDE_INT get_frame_alias_set PARAMS ((void));
357extern void record_base_value PARAMS ((unsigned int, rtx, int));
358extern void record_alias_subset PARAMS ((HOST_WIDE_INT,
359 HOST_WIDE_INT));
3bdf5ad1 360extern HOST_WIDE_INT new_alias_set PARAMS ((void));
10b76d73 361extern int can_address_p PARAMS ((tree));
28f4ec01 362\f
12e74c9e 363/* Functions from expr.c: */
cb411bd6 364
12e74c9e
RK
365/* This is run once per compilation to set up which modes can be used
366 directly in memory and to initialize the block move optab. */
711d877c 367extern void init_expr_once PARAMS ((void));
12e74c9e
RK
368
369/* This is run at the start of compiling a function. */
711d877c 370extern void init_expr PARAMS ((void));
12e74c9e 371
49ad7cfa 372/* This is run at the end of compiling a function. */
711d877c 373extern void finish_expr_for_function PARAMS ((void));
49ad7cfa 374
12e74c9e
RK
375/* Use protect_from_queue to convert a QUEUED expression
376 into something that you can put immediately into an instruction. */
711d877c 377extern rtx protect_from_queue PARAMS ((rtx, int));
12e74c9e
RK
378
379/* Perform all the pending incrementations. */
711d877c 380extern void emit_queue PARAMS ((void));
b4cb4994 381
1f06ee8d 382/* Tell if something has a queued subexpression. */
711d877c 383extern int queued_subexp_p PARAMS ((rtx));
1f06ee8d 384
e8bbfc4e
RK
385/* Emit some rtl insns to move data between rtx's, converting machine modes.
386 Both modes must be floating or both fixed. */
711d877c 387extern void convert_move PARAMS ((rtx, rtx, int));
e8bbfc4e
RK
388
389/* Convert an rtx to specified machine mode and return the result. */
711d877c 390extern rtx convert_to_mode PARAMS ((enum machine_mode, rtx, int));
e8bbfc4e 391
3fad11c9 392/* Convert an rtx to MODE from OLDMODE and return the result. */
729a2125
RK
393extern rtx convert_modes PARAMS ((enum machine_mode, enum machine_mode,
394 rtx, int));
3fad11c9 395
bda63bf1 396/* Emit code to move a block Y to a block X. */
8ac61af7 397extern rtx emit_block_move PARAMS ((rtx, rtx, rtx));
12e74c9e
RK
398
399/* Copy all or part of a value X into registers starting at REGNO.
400 The number of registers to be filled is NREGS. */
711d877c 401extern void move_block_to_reg PARAMS ((int, rtx, int, enum machine_mode));
12e74c9e
RK
402
403/* Copy all or part of a BLKmode value X out of registers starting at REGNO.
404 The number of registers to be filled is NREGS. */
711d877c 405extern void move_block_from_reg PARAMS ((int, rtx, int, int));
12e74c9e 406
ae73d3be
JW
407/* Load a BLKmode value into non-consecutive registers represented by a
408 PARALLEL. */
04050c69 409extern void emit_group_load PARAMS ((rtx, rtx, int));
729a2125 410
ae73d3be
JW
411/* Store a BLKmode value from non-consecutive registers represented by a
412 PARALLEL. */
04050c69 413extern void emit_group_store PARAMS ((rtx, rtx, int));
ae73d3be 414
c36fce9a 415#ifdef TREE_CODE
19eb1ad7 416/* Copy BLKmode object from a set of registers. */
711d877c 417extern rtx copy_blkmode_from_reg PARAMS ((rtx,rtx,tree));
c36fce9a
GRK
418#endif
419
8c99eaf6 420/* Mark REG as holding a parameter for the next CALL_INSN. */
711d877c 421extern void use_reg PARAMS ((rtx *, rtx));
729a2125 422
8c99eaf6
RK
423/* Mark NREGS consecutive regs, starting at REGNO, as holding parameters
424 for the next CALL_INSN. */
711d877c 425extern void use_regs PARAMS ((rtx *, int, int));
729a2125 426
ae73d3be 427/* Mark a PARALLEL as holding a parameter for the next CALL_INSN. */
711d877c 428extern void use_group_regs PARAMS ((rtx *, rtx));
12e74c9e
RK
429
430/* Write zeros through the storage of OBJECT.
8ac61af7
RK
431 If OBJECT has BLKmode, SIZE is its length in bytes. */
432extern rtx clear_storage PARAMS ((rtx, rtx));
12e74c9e 433
57814e5e
JJ
434/* Return non-zero if it is desirable to store LEN bytes generated by
435 CONSTFUN with several move instructions by store_by_pieces
436 function. CONSTFUNDATA is a pointer which will be passed as argument
437 in every CONSTFUN call.
438 ALIGN is maximum alignment we can assume. */
439extern int can_store_by_pieces PARAMS ((unsigned HOST_WIDE_INT,
440 rtx (*) (PTR, HOST_WIDE_INT,
441 enum machine_mode),
442 PTR, unsigned int));
443
444/* Generate several move instructions to store LEN bytes generated by
445 CONSTFUN to block TO. (A MEM rtx with BLKmode). CONSTFUNDATA is a
446 pointer which will be passed as argument in every CONSTFUN call.
447 ALIGN is maximum alignment we can assume. */
448extern void store_by_pieces PARAMS ((rtx, unsigned HOST_WIDE_INT,
449 rtx (*) (PTR, HOST_WIDE_INT,
450 enum machine_mode),
451 PTR, unsigned int));
452
12e74c9e 453/* Emit insns to set X from Y. */
711d877c 454extern rtx emit_move_insn PARAMS ((rtx, rtx));
12e74c9e
RK
455
456/* Emit insns to set X from Y, with no frills. */
711d877c 457extern rtx emit_move_insn_1 PARAMS ((rtx, rtx));
12e74c9e
RK
458
459/* Push a block of length SIZE (perhaps variable)
460 and return an rtx to address the beginning of the block. */
711d877c 461extern rtx push_block PARAMS ((rtx, int, int));
12e74c9e 462
12e74c9e
RK
463#ifdef TREE_CODE
464/* Generate code to push something onto the stack, given its mode and type. */
729a2125
RK
465extern void emit_push_insn PARAMS ((rtx, enum machine_mode, tree, rtx,
466 unsigned int, int, rtx, int, rtx, rtx,
467 int, rtx));
12e74c9e 468
19eb1ad7 469/* Expand an assignment that stores the value of FROM into TO. */
711d877c 470extern rtx expand_assignment PARAMS ((tree, tree, int, int));
12e74c9e
RK
471
472/* Generate code for computing expression EXP,
473 and storing the value into TARGET.
474 If SUGGEST_REG is nonzero, copy the value through a register
475 and return that register, if that is possible. */
711d877c 476extern rtx store_expr PARAMS ((tree, rtx, int));
12e74c9e 477#endif
e8bbfc4e
RK
478
479/* Given an rtx that may include add and multiply operations,
480 generate them as insns and return a pseudo-reg containing the value.
481 Useful after calling expand_expr with 1 as sum_ok. */
711d877c 482extern rtx force_operand PARAMS ((rtx, rtx));
e8bbfc4e 483
f47e9b4e
RK
484/* Return an object on the placeholder list that matches EXP, a
485 PLACEHOLDER_EXPR. An object "matches" if it is of the type of the
738cc472
RK
486 PLACEHOLDER_EXPR or a pointer type to it. For further information, see
487 tree.def. If no such object is found, abort. If PLIST is nonzero, it is
488 a location which initially points to a starting location in the
489 placeholder list (zero means start of the list) and where a pointer into
490 the placeholder list at which the object is found is placed. */
f47e9b4e
RK
491extern tree find_placeholder PARAMS ((tree, tree *));
492
12e74c9e
RK
493/* Generate code for computing expression EXP.
494 An rtx for the computed value is returned. The value is never null.
495 In the case of a void EXP, const0_rtx is returned. */
711d877c
KG
496extern rtx expand_expr PARAMS ((tree, rtx, enum machine_mode,
497 enum expand_modifier));
12e74c9e
RK
498
499/* At the start of a function, record that we have no previously-pushed
500 arguments waiting to be popped. */
711d877c 501extern void init_pending_stack_adjust PARAMS ((void));
12e74c9e
RK
502
503/* When exiting from function, if safe, clear out any pending stack adjust
504 so the adjustment won't get done. */
711d877c 505extern void clear_pending_stack_adjust PARAMS ((void));
12e74c9e
RK
506
507/* Pop any previously-pushed arguments that have not been popped yet. */
711d877c 508extern void do_pending_stack_adjust PARAMS ((void));
12e74c9e
RK
509
510#ifdef TREE_CODE
28f4ec01
BS
511/* Return the tree node and offset if a given argument corresponds to
512 a string constant. */
711d877c 513extern tree string_constant PARAMS ((tree, tree *));
28f4ec01 514
12e74c9e 515/* Generate code to evaluate EXP and jump to LABEL if the value is zero. */
711d877c 516extern void jumpifnot PARAMS ((tree, rtx));
12e74c9e
RK
517
518/* Generate code to evaluate EXP and jump to LABEL if the value is nonzero. */
711d877c 519extern void jumpif PARAMS ((tree, rtx));
12e74c9e
RK
520
521/* Generate code to evaluate EXP and jump to IF_FALSE_LABEL if
522 the result is zero, or IF_TRUE_LABEL if the result is one. */
711d877c 523extern void do_jump PARAMS ((tree, rtx, rtx));
12e74c9e
RK
524#endif
525
526/* Generate rtl to compare two rtx's, will call emit_cmp_insn. */
711d877c 527extern rtx compare_from_rtx PARAMS ((rtx, rtx, enum rtx_code, int,
a06ef755 528 enum machine_mode, rtx));
711d877c 529extern void do_compare_rtx_and_jump PARAMS ((rtx, rtx, enum rtx_code, int,
729a2125 530 enum machine_mode, rtx,
a06ef755 531 rtx, rtx));
12e74c9e 532
ad82abb8
ZW
533/* Two different ways of generating switch statements. */
534extern int try_casesi PARAMS ((tree, tree, tree, tree, rtx, rtx));
535extern int try_tablejump PARAMS ((tree, tree, tree, tree, rtx, rtx));
536
537/* Smallest number of adjacent cases before we use a jump table.
538 XXX Should be a target hook. */
539extern unsigned int case_values_threshold PARAMS ((void));
540
12e74c9e 541\f
cb411bd6
RS
542#ifdef TREE_CODE
543/* rtl.h and tree.h were included. */
544/* Return an rtx for the size in bytes of the value of an expr. */
711d877c 545extern rtx expr_size PARAMS ((tree));
cb411bd6 546
711d877c 547extern rtx lookup_static_chain PARAMS ((tree));
cb411bd6
RS
548
549/* Convert a stack slot address ADDR valid in function FNDECL
550 into an address valid in this function (using a static chain). */
711d877c 551extern rtx fix_lexical_addr PARAMS ((rtx, tree));
cb411bd6
RS
552
553/* Return the address of the trampoline for entering nested fn FUNCTION. */
711d877c 554extern rtx trampoline_address PARAMS ((tree));
cb411bd6
RS
555
556/* Return an rtx that refers to the value returned by a function
557 in its original home. This becomes invalid if any more code is emitted. */
711d877c 558extern rtx hard_function_value PARAMS ((tree, tree, int));
cb411bd6 559
3affaf29 560extern rtx prepare_call_address PARAMS ((rtx, tree, rtx *, int, int));
cb411bd6 561
711d877c 562extern rtx expand_call PARAMS ((tree, rtx, int));
cb411bd6 563
3bdf5ad1
RK
564extern rtx expand_shift PARAMS ((enum tree_code, enum machine_mode, rtx, tree,
565 rtx, int));
566extern rtx expand_divmod PARAMS ((int, enum tree_code, enum machine_mode, rtx,
567 rtx, rtx, int));
568extern void locate_and_pad_parm PARAMS ((enum machine_mode, tree, int, tree,
569 struct args_size *,
570 struct args_size *,
571 struct args_size *,
572 struct args_size *));
711d877c 573extern rtx expand_inline_function PARAMS ((tree, tree, rtx, int, tree, rtx));
3bdf5ad1 574
cb411bd6 575/* Return the CODE_LABEL rtx for a LABEL_DECL, creating it if necessary. */
711d877c 576extern rtx label_rtx PARAMS ((tree));
cb411bd6
RS
577#endif
578
626043cf 579/* Indicate how an input argument register was promoted. */
770ae6cc
RK
580extern rtx promoted_input_arg PARAMS ((unsigned int, enum machine_mode *,
581 int *));
626043cf 582
e8bbfc4e
RK
583/* Return an rtx like arg but sans any constant terms.
584 Returns the original rtx if it has no constant terms.
585 The constant terms are added and stored via a second arg. */
711d877c 586extern rtx eliminate_constant_term PARAMS ((rtx, rtx *));
e8bbfc4e
RK
587
588/* Convert arg to a valid memory address for specified machine mode,
589 by emitting insns to perform arithmetic if nec. */
711d877c 590extern rtx memory_address PARAMS ((enum machine_mode, rtx));
e8bbfc4e
RK
591
592/* Like `memory_address' but pretent `flag_force_addr' is 0. */
711d877c 593extern rtx memory_address_noforce PARAMS ((enum machine_mode, rtx));
e8bbfc4e 594
173b24b9
RK
595/* Set the alias set of MEM to SET. */
596extern void set_mem_alias_set PARAMS ((rtx, HOST_WIDE_INT));
597
d022d93e 598/* Set the alignment of MEM to ALIGN bits. */
738cc472
RK
599extern void set_mem_align PARAMS ((rtx, unsigned int));
600
998d7deb
RH
601/* Set the expr for MEM to EXPR. */
602extern void set_mem_expr PARAMS ((rtx, tree));
603
604/* Set the offset for MEM to OFFSET. */
605extern void set_mem_offset PARAMS ((rtx, rtx));
1285011e 606
e8bbfc4e
RK
607/* Return a memory reference like MEMREF, but with its mode changed
608 to MODE and its address changed to ADDR.
609 (VOIDmode means don't change the mode.
738cc472
RK
610 NULL for ADDR means don't change the address.) */
611extern rtx change_address PARAMS ((rtx, enum machine_mode, rtx));
e8bbfc4e 612
f4ef873c
RK
613/* Return a memory reference like MEMREF, but with its mode changed
614 to MODE and its address offset by OFFSET bytes. */
738cc472 615#define adjust_address(MEMREF, MODE, OFFSET) \
89fc10a5 616 adjust_address_1 (MEMREF, MODE, OFFSET, 1, 1)
f4ef873c 617
f1ec5147 618/* Likewise, but the reference is not required to be valid. */
738cc472 619#define adjust_address_nv(MEMREF, MODE, OFFSET) \
89fc10a5
JJ
620 adjust_address_1 (MEMREF, MODE, OFFSET, 0, 1)
621
622/* Return a memory reference like MEMREF, but with its mode changed
623 to MODE and its address changed to ADDR, which is assumed to be
624 increased by OFFSET bytes from MEMREF. */
625#define adjust_automodify_address(MEMREF, MODE, ADDR, OFFSET) \
626 adjust_automodify_address_1 (MEMREF, MODE, ADDR, OFFSET, 1)
627
628/* Likewise, but the reference is not required to be valid. */
629#define adjust_automodify_address_nv(MEMREF, MODE, ADDR, OFFSET) \
630 adjust_automodify_address_1 (MEMREF, MODE, ADDR, OFFSET, 0)
738cc472
RK
631
632extern rtx adjust_address_1 PARAMS ((rtx, enum machine_mode, HOST_WIDE_INT,
89fc10a5
JJ
633 int, int));
634extern rtx adjust_automodify_address_1 PARAMS ((rtx, enum machine_mode,
635 rtx, HOST_WIDE_INT, int));
f1ec5147 636
0d4903b8
RK
637/* Return a memory reference like MEMREF, but whose address is changed by
638 adding OFFSET, an RTX, to it. POW2 is the highest power of two factor
639 known to be in OFFSET (possibly 1). */
640extern rtx offset_address PARAMS ((rtx, rtx, HOST_WIDE_INT));
641
792760b9
RK
642/* Return a memory reference like MEMREF, but with its address changed to
643 ADDR. The caller is asserting that the actual piece of memory pointed
644 to is the same, just the form of the address is being changed, such as
645 by putting something into a register. */
646extern rtx replace_equiv_address PARAMS ((rtx, rtx));
647
f1ec5147
RK
648/* Likewise, but the reference is not required to be valid. */
649extern rtx replace_equiv_address_nv PARAMS ((rtx, rtx));
650
e7dfe4bb
RH
651/* Return a memory reference like MEMREF, but with its mode widened to
652 MODE and adjusted by OFFSET. */
653extern rtx widen_memory_access PARAMS ((rtx, enum machine_mode, HOST_WIDE_INT));
654
e8bbfc4e
RK
655/* Return a memory reference like MEMREF, but which is known to have a
656 valid address. */
711d877c 657extern rtx validize_mem PARAMS ((rtx));
e8bbfc4e 658
3bdf5ad1 659#ifdef TREE_CODE
258a120b
JM
660/* Given REF, either a MEM or a REG, and T, either the type of X or
661 the expression corresponding to REF, set RTX_UNCHANGING_P if
662 appropriate. */
663extern void maybe_set_unchanging PARAMS ((rtx, tree));
664
3bdf5ad1
RK
665/* Given REF, a MEM, and T, either the type of X or the expression
666 corresponding to REF, set the memory attributes. OBJECTP is nonzero
667 if we are making a new object of this type. */
668extern void set_mem_attributes PARAMS ((rtx, tree, int));
669#endif
670
e8bbfc4e 671/* Assemble the static constant template for function entry trampolines. */
711d877c 672extern rtx assemble_trampoline_template PARAMS ((void));
e8bbfc4e 673
e8bbfc4e
RK
674/* Given rtx, return new rtx whose address won't be affected by
675 any side effects. It has been copied to a new temporary reg. */
711d877c 676extern rtx stabilize PARAMS ((rtx));
e8bbfc4e
RK
677
678/* Given an rtx, copy all regs it refers to into new temps
679 and return a modified copy that refers to the new temps. */
711d877c 680extern rtx copy_all_regs PARAMS ((rtx));
e8bbfc4e
RK
681
682/* Copy given rtx to a new temp reg and return that. */
711d877c 683extern rtx copy_to_reg PARAMS ((rtx));
e8bbfc4e
RK
684
685/* Like copy_to_reg but always make the reg Pmode. */
711d877c 686extern rtx copy_addr_to_reg PARAMS ((rtx));
e8bbfc4e
RK
687
688/* Like copy_to_reg but always make the reg the specified mode MODE. */
711d877c 689extern rtx copy_to_mode_reg PARAMS ((enum machine_mode, rtx));
e8bbfc4e
RK
690
691/* Copy given rtx to given temp reg and return that. */
711d877c 692extern rtx copy_to_suggested_reg PARAMS ((rtx, rtx, enum machine_mode));
e8bbfc4e
RK
693
694/* Copy a value to a register if it isn't already a register.
695 Args are mode (in case value is a constant) and the value. */
711d877c 696extern rtx force_reg PARAMS ((enum machine_mode, rtx));
e8bbfc4e
RK
697
698/* Return given rtx, copied into a new temp reg if it was in memory. */
711d877c 699extern rtx force_not_mem PARAMS ((rtx));
e8bbfc4e 700
9d69b7c8
RK
701#ifdef TREE_CODE
702/* Return mode and signedness to use when object is promoted. */
711d877c
KG
703extern enum machine_mode promote_mode PARAMS ((tree, enum machine_mode,
704 int *, int));
9d69b7c8
RK
705#endif
706
e8bbfc4e 707/* Remove some bytes from the stack. An rtx says how many. */
711d877c 708extern void adjust_stack PARAMS ((rtx));
e8bbfc4e
RK
709
710/* Add some bytes to the stack. An rtx says how many. */
711d877c 711extern void anti_adjust_stack PARAMS ((rtx));
e8bbfc4e 712
59257ff7
RK
713/* This enum is used for the following two functions. */
714enum save_level {SAVE_BLOCK, SAVE_FUNCTION, SAVE_NONLOCAL};
715
716/* Save the stack pointer at the specified level. */
711d877c 717extern void emit_stack_save PARAMS ((enum save_level, rtx *, rtx));
59257ff7
RK
718
719/* Restore the stack pointer from a save area of the specified level. */
711d877c 720extern void emit_stack_restore PARAMS ((enum save_level, rtx, rtx));
59257ff7 721
e8bbfc4e
RK
722/* Allocate some space on the stack dynamically and return its address. An rtx
723 says how many bytes. */
711d877c 724extern rtx allocate_dynamic_stack_space PARAMS ((rtx, rtx, int));
e8bbfc4e 725
0fb7aeda 726/* Probe a range of stack addresses from FIRST to FIRST+SIZE, inclusive.
f7761c9a
RK
727 FIRST is a constant and size is a Pmode RTX. These are offsets from the
728 current stack pointer. STACK_GROWS_DOWNWARD says whether to add or
729 subtract from the stack. If SIZE is constant, this is done
730 with a fixed number of probes. Otherwise, we must make a loop. */
711d877c 731extern void probe_stack_range PARAMS ((HOST_WIDE_INT, rtx));
f7761c9a 732
e8bbfc4e
RK
733/* Return an rtx that refers to the value returned by a library call
734 in its original home. This becomes invalid if any more code is emitted. */
711d877c 735extern rtx hard_libcall_value PARAMS ((enum machine_mode));
e8bbfc4e 736
e8bbfc4e
RK
737/* Given an rtx, return an rtx for a value rounded up to a multiple
738 of STACK_BOUNDARY / BITS_PER_UNIT. */
711d877c 739extern rtx round_push PARAMS ((rtx));
e8bbfc4e 740
da920570
ZW
741/* Return the mode desired by operand N of a particular bitfield
742 insert/extract insn, or MAX_MACHINE_MODE if no such insn is
743 available. */
744
745enum extraction_pattern { EP_insv, EP_extv, EP_extzv };
746extern enum machine_mode
747mode_for_extraction PARAMS ((enum extraction_pattern, int));
748
770ae6cc
RK
749extern rtx store_bit_field PARAMS ((rtx, unsigned HOST_WIDE_INT,
750 unsigned HOST_WIDE_INT,
04050c69 751 enum machine_mode, rtx, HOST_WIDE_INT));
770ae6cc
RK
752extern rtx extract_bit_field PARAMS ((rtx, unsigned HOST_WIDE_INT,
753 unsigned HOST_WIDE_INT, int, rtx,
729a2125 754 enum machine_mode, enum machine_mode,
04050c69 755 HOST_WIDE_INT));
711d877c 756extern rtx expand_mult PARAMS ((enum machine_mode, rtx, rtx, rtx, int));
ce60bf25 757extern bool const_mult_add_overflow_p PARAMS ((rtx, rtx, rtx, enum machine_mode, int));
711d877c
KG
758extern rtx expand_mult_add PARAMS ((rtx, rtx, rtx, rtx,enum machine_mode, int));
759extern rtx expand_mult_highpart_adjust PARAMS ((enum machine_mode, rtx, rtx, rtx, rtx, int));
e8bbfc4e 760
711d877c 761extern rtx assemble_static_space PARAMS ((int));
e8bbfc4e
RK
762
763/* Hook called by expand_expr for language-specific tree codes.
764 It is up to the language front end to install a hook
765 if it has any such codes that expand_expr needs to know about. */
711d877c
KG
766extern rtx (*lang_expand_expr) PARAMS ((union tree_node *, rtx,
767 enum machine_mode,
768 enum expand_modifier modifier));
b0cb541b 769
8f17b5c5
MM
770extern int safe_from_p PARAMS ((rtx, tree, int));
771
e78d8e51
ZW
772/* Call this once to initialize the contents of the optabs
773 appropriately for the current target machine. */
774extern void init_optabs PARAMS ((void));
711d877c 775extern void init_all_optabs PARAMS ((void));
e78d8e51
ZW
776
777/* Call this to initialize an optab function entry. */
778extern rtx init_one_libfunc PARAMS ((const char *));
779
711d877c
KG
780extern void do_jump_by_parts_equality_rtx PARAMS ((rtx, rtx, rtx));
781extern void do_jump_by_parts_greater_rtx PARAMS ((enum machine_mode,
782 int, rtx, rtx, rtx,
783 rtx));
df03cab5 784
0586a4ce 785#ifdef TREE_CODE /* Don't lose if tree.h not included. */
711d877c 786extern void mark_seen_cases PARAMS ((tree, unsigned char *,
770ae6cc 787 HOST_WIDE_INT, int));
0586a4ce 788#endif