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