]> gcc.gnu.org Git - gcc.git/blame - gcc/rtl.h
arm.c (arm_override_options): Error on iWMMXt and hardware floating point.
[gcc.git] / gcc / rtl.h
CommitLineData
5e6908ea 1/* Register Transfer Language (RTL) definitions for GCC
c7ec5472
MK
2 Copyright (C) 1987, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
6f29feb1 4
1322177d 5This file is part of GCC.
6f29feb1 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.
6f29feb1 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.
6f29feb1
JW
16
17You should have received a copy of the GNU General Public License
1322177d 18along with GCC; see the file COPYING. If not, write to the Free
366ccddb
KC
19Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
2002110-1301, USA. */
6f29feb1 21
88657302
RH
22#ifndef GCC_RTL_H
23#define GCC_RTL_H
36edd3cc 24
7e7ec48e 25#include "statistics.h"
6f29feb1 26#include "machmode.h"
fd3acbb3 27#include "input.h"
9e254451 28#include "real.h"
aacd3885 29#include "vec.h"
6f29feb1
JW
30
31#undef FFS /* Some systems predefine this symbol; don't let it interfere. */
1cfc3092 32#undef FLOAT /* Likewise. */
ac889e46 33#undef ABS /* Likewise. */
71ae9cc6 34#undef PC /* Likewise. */
6f29feb1 35
173b24b9 36/* Value used by some passes to "recognize" noop moves as valid
eebedaa5 37 instructions. */
b5832b43
JH
38#define NOOP_MOVE_INSN_CODE INT_MAX
39
6f29feb1
JW
40/* Register Transfer Language EXPRESSIONS CODES */
41
42#define RTX_CODE enum rtx_code
43enum rtx_code {
44
45#define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) ENUM ,
46#include "rtl.def" /* rtl expressions are documented here */
47#undef DEF_RTL_EXPR
48
6dc42e49 49 LAST_AND_UNUSED_RTX_CODE}; /* A convenient way to get a value for
6f29feb1 50 NUM_RTX_CODE.
6dc42e49 51 Assumes default enum value assignment. */
6f29feb1 52
cf403648 53#define NUM_RTX_CODE ((int) LAST_AND_UNUSED_RTX_CODE)
6f29feb1
JW
54 /* The cast here, saves many elsewhere. */
55
ec8e098d
PB
56/* Register Transfer Language EXPRESSIONS CODE CLASSES */
57
58enum rtx_class {
59 /* We check bit 0-1 of some rtx class codes in the predicates below. */
60
61 /* Bit 0 = comparison if 0, arithmetic is 1
62 Bit 1 = 1 if commutative. */
63 RTX_COMPARE, /* 0 */
64 RTX_COMM_COMPARE,
65 RTX_BIN_ARITH,
66 RTX_COMM_ARITH,
67
68 /* Must follow the four preceding values. */
69 RTX_UNARY, /* 4 */
70
71 RTX_EXTRA,
72 RTX_MATCH,
73 RTX_INSN,
74
75 /* Bit 0 = 1 if constant. */
76 RTX_OBJ, /* 8 */
77 RTX_CONST_OBJ,
78
79 RTX_TERNARY,
80 RTX_BITFIELD_OPS,
81 RTX_AUTOINC
82};
83
84#define RTX_OBJ_MASK (~1)
85#define RTX_OBJ_RESULT (RTX_OBJ & RTX_OBJ_MASK)
86#define RTX_COMPARE_MASK (~1)
87#define RTX_COMPARE_RESULT (RTX_COMPARE & RTX_COMPARE_MASK)
88#define RTX_ARITHMETIC_MASK (~1)
89#define RTX_ARITHMETIC_RESULT (RTX_COMM_ARITH & RTX_ARITHMETIC_MASK)
90#define RTX_BINARY_MASK (~3)
91#define RTX_BINARY_RESULT (RTX_COMPARE & RTX_BINARY_MASK)
92#define RTX_COMMUTATIVE_MASK (~2)
93#define RTX_COMMUTATIVE_RESULT (RTX_COMM_COMPARE & RTX_COMMUTATIVE_MASK)
94#define RTX_NON_COMMUTATIVE_RESULT (RTX_COMPARE & RTX_COMMUTATIVE_MASK)
ec8e098d 95
86460bab 96extern const unsigned char rtx_length[NUM_RTX_CODE];
0f41302f 97#define GET_RTX_LENGTH(CODE) (rtx_length[(int) (CODE)])
6f29feb1 98
86460bab 99extern const char * const rtx_name[NUM_RTX_CODE];
0f41302f 100#define GET_RTX_NAME(CODE) (rtx_name[(int) (CODE)])
6f29feb1 101
86460bab 102extern const char * const rtx_format[NUM_RTX_CODE];
0f41302f 103#define GET_RTX_FORMAT(CODE) (rtx_format[(int) (CODE)])
6f29feb1 104
ec8e098d 105extern const enum rtx_class rtx_class[NUM_RTX_CODE];
0f41302f 106#define GET_RTX_CLASS(CODE) (rtx_class[(int) (CODE)])
36a5eadd 107
aacd3885 108extern const unsigned char rtx_code_size[NUM_RTX_CODE];
36a5eadd 109extern const unsigned char rtx_next[NUM_RTX_CODE];
6f29feb1 110\f
33f7f353
JR
111/* The flags and bitfields of an ADDR_DIFF_VEC. BASE is the base label
112 relative to which the offsets are calculated, as explained in rtl.def. */
113typedef struct
114{
115 /* Set at the start of shorten_branches - ONLY WHEN OPTIMIZING - : */
116 unsigned min_align: 8;
117 /* Flags: */
118 unsigned base_after_vec: 1; /* BASE is after the ADDR_DIFF_VEC. */
173b24b9
RK
119 unsigned min_after_vec: 1; /* minimum address target label is
120 after the ADDR_DIFF_VEC. */
121 unsigned max_after_vec: 1; /* maximum address target label is
122 after the ADDR_DIFF_VEC. */
123 unsigned min_after_base: 1; /* minimum address target label is
124 after BASE. */
125 unsigned max_after_base: 1; /* maximum address target label is
126 after BASE. */
33f7f353
JR
127 /* Set by the actual branch shortening process - ONLY WHEN OPTIMIZING - : */
128 unsigned offset_unsigned: 1; /* offsets have to be treated as unsigned. */
129 unsigned : 2;
130 unsigned scale : 8;
131} addr_diff_vec_flags;
132
173b24b9
RK
133/* Structure used to describe the attributes of a MEM. These are hashed
134 so MEMs that the same attributes share a data structure. This means
135 they cannot be modified in place. If any element is nonzero, it means
136 the value of the corresponding attribute is unknown. */
184166b5
R
137/* ALIGN and SIZE are the alignment and size of the MEM itself,
138 while EXPR can describe a larger underlying object, which might have a
139 stricter alignment; OFFSET is the offset of the MEM within that object. */
e2500fed 140typedef struct mem_attrs GTY(())
173b24b9 141{
eebedaa5 142 HOST_WIDE_INT alias; /* Memory alias set. */
998d7deb 143 tree expr; /* expr corresponding to MEM. */
eebedaa5 144 rtx offset; /* Offset from start of DECL, as CONST_INT. */
173b24b9 145 rtx size; /* Size in bytes, as a CONST_INT. */
d022d93e 146 unsigned int align; /* Alignment of MEM in bits. */
173b24b9
RK
147} mem_attrs;
148
a560d4d4
JH
149/* Structure used to describe the attributes of a REG in similar way as
150 mem_attrs does for MEM above. */
151
152typedef struct reg_attrs GTY(())
153{
154 tree decl; /* decl corresponding to REG. */
155 HOST_WIDE_INT offset; /* Offset from start of DECL. */
156} reg_attrs;
157
6f29feb1
JW
158/* Common union for an element of an rtx. */
159
36a5eadd 160union rtunion_def
6f29feb1 161{
9ce88f5e
GDR
162 int rt_int;
163 unsigned int rt_uint;
164 const char *rt_str;
165 rtx rt_rtx;
166 rtvec rt_rtvec;
167 enum machine_mode rt_type;
33f7f353 168 addr_diff_vec_flags rt_addr_diff_vec_flags;
eab5c70a 169 struct cselib_val_struct *rt_cselib;
9ce88f5e
GDR
170 struct bitmap_head_def *rt_bit;
171 tree rt_tree;
172 struct basic_block_def *rt_bb;
173 mem_attrs *rt_mem;
174 reg_attrs *rt_reg;
c185c797 175 struct constant_descriptor_rtx *rt_constant;
36a5eadd
GK
176};
177typedef union rtunion_def rtunion;
6f29feb1 178
aacd3885
RS
179/* This structure remembers the position of a SYMBOL_REF within an
180 object_block structure. A SYMBOL_REF only provides this information
3fa9c136 181 if SYMBOL_REF_HAS_BLOCK_INFO_P is true. */
aacd3885
RS
182struct block_symbol GTY(()) {
183 /* The usual SYMBOL_REF fields. */
184 rtunion GTY ((skip)) fld[3];
185
186 /* The block that contains this object. */
187 struct object_block *block;
188
189 /* The offset of this object from the start of its block. It is negative
190 if the symbol has not yet been assigned an offset. */
191 HOST_WIDE_INT offset;
192};
193
194DEF_VEC_P(rtx);
195DEF_VEC_ALLOC_P(rtx,heap);
196DEF_VEC_ALLOC_P(rtx,gc);
197
198/* Describes a group of objects that are to be placed together in such
199 a way that their relative positions are known. */
200struct object_block GTY(())
201{
202 /* The section in which these objects should be placed. */
203 section *sect;
204
205 /* The alignment of the first object, measured in bits. */
206 unsigned int alignment;
207
208 /* The total size of the objects, measured in bytes. */
209 HOST_WIDE_INT size;
210
211 /* The SYMBOL_REFs for each object. The vector is sorted in
212 order of increasing offset and the following conditions will
213 hold for each element X:
214
3fa9c136 215 SYMBOL_REF_HAS_BLOCK_INFO_P (X)
aacd3885
RS
216 !SYMBOL_REF_ANCHOR_P (X)
217 SYMBOL_REF_BLOCK (X) == [address of this structure]
218 SYMBOL_REF_BLOCK_OFFSET (X) >= 0. */
219 VEC(rtx,gc) *objects;
220
221 /* All the anchor SYMBOL_REFs used to address these objects, sorted
222 in order of increasing offset, and then increasing TLS model.
223 The following conditions will hold for each element X in this vector:
224
3fa9c136 225 SYMBOL_REF_HAS_BLOCK_INFO_P (X)
aacd3885
RS
226 SYMBOL_REF_ANCHOR_P (X)
227 SYMBOL_REF_BLOCK (X) == [address of this structure]
228 SYMBOL_REF_BLOCK_OFFSET (X) >= 0. */
229 VEC(rtx,gc) *anchors;
230};
231
6f29feb1
JW
232/* RTL expression ("rtx"). */
233
3d7aafde 234struct rtx_def GTY((chain_next ("RTX_NEXT (&%h)"),
36a5eadd 235 chain_prev ("RTX_PREV (&%h)")))
6f29feb1 236{
6f29feb1 237 /* The kind of expression this is. */
c149cc37 238 ENUM_BITFIELD(rtx_code) code: 16;
18def38f 239
6f29feb1 240 /* The kind of value the expression has. */
c149cc37
RL
241 ENUM_BITFIELD(machine_mode) mode : 8;
242
5a63e069
JJ
243 /* 1 in a MEM if we should keep the alias set for this mem unchanged
244 when we access a component.
245 1 in a CALL_INSN if it is a sibling call.
0dc36574
ZW
246 1 in a SET that is for a return.
247 In a CODE_LABEL, part of the two-bit alternate entry field. */
6f29feb1 248 unsigned int jump : 1;
4da2eb6b
RH
249 /* In a CODE_LABEL, part of the two-bit alternate entry field.
250 1 in a MEM if it cannot trap. */
6f29feb1 251 unsigned int call : 1;
5a63e069
JJ
252 /* 1 in a REG, MEM, or CONCAT if the value is set at most once, anywhere.
253 1 in a SUBREG if it references an unsigned object whose mode has been
254 from a promoted to a wider mode.
6f29feb1
JW
255 1 in a SYMBOL_REF if it addresses something in the per-function
256 constants pool.
5a63e069 257 1 in a CALL_INSN, NOTE, or EXPR_LIST for a const or pure call.
7440af14 258 1 in a JUMP_INSN, CALL_INSN, or INSN of an annulling branch. */
6f29feb1 259 unsigned int unchanging : 1;
5a63e069
JJ
260 /* 1 in a MEM or ASM_OPERANDS expression if the memory reference is volatile.
261 1 in an INSN, CALL_INSN, JUMP_INSN, CODE_LABEL, BARRIER, or NOTE
262 if it has been deleted.
263 1 in a REG expression if corresponds to a variable declared by the user,
6f29feb1 264 0 for an internally generated temporary.
5a63e069
JJ
265 1 in a SUBREG with a negative value.
266 1 in a LABEL_REF or in a REG_LABEL note for a non-local label.
267 In a SYMBOL_REF, this flag is used for machine-specific purposes. */
6f29feb1 268 unsigned int volatil : 1;
8358a974 269 /* 1 in a MEM referring to a field of an aggregate.
6f29feb1
JW
270 0 if the MEM was a variable or the result of a * operator in C;
271 1 if it was the result of a . or -> operator (on a struct) in C.
272 1 in a REG if the register is used only in exit code a loop.
f590cca1 273 1 in a SUBREG expression if was generated from a variable with a
07be3989 274 promoted mode.
6f29feb1
JW
275 1 in a CODE_LABEL if the label is used for nonlocal gotos
276 and must not be deleted even if its count is zero.
be202ec2
FS
277 1 in an INSN, JUMP_INSN or CALL_INSN if this insn must be scheduled
278 together with the preceding insn. Valid only within sched.
6f29feb1
JW
279 1 in an INSN, JUMP_INSN, or CALL_INSN if insn is in a delay slot and
280 from the target of a branch. Valid from reorg until end of compilation;
d67fb775 281 cleared before used. */
6f29feb1 282 unsigned int in_struct : 1;
5a63e069
JJ
283 /* At the end of RTL generation, 1 if this rtx is used. This is used for
284 copying shared structure. See `unshare_all_rtl'.
f590cca1 285 In a REG, this is not needed for that purpose, and used instead
6f29feb1 286 in `leaf_renumber_regs_insn'.
5a63e069 287 1 in a SYMBOL_REF, means that emit_library_call
6f29feb1
JW
288 has used it as the function. */
289 unsigned int used : 1;
b664de3a 290 /* 1 in an INSN or a SET if this rtx is related to the call frame,
c6df88cb 291 either changing how we compute the frame address or saving and
f590cca1 292 restoring registers in the prologue and epilogue.
f8ad8d7c 293 1 in a REG or MEM if it is a pointer.
bd7cf17e
JJ
294 1 in a SYMBOL_REF if it addresses something in the per-function
295 constant string pool. */
469ac993 296 unsigned frame_related : 1;
6de9cd9a 297 /* 1 in a REG or PARALLEL that is the current function's return value.
acf8677f 298 1 in a MEM if it refers to a scalar.
6de9cd9a
DN
299 1 in a SYMBOL_REF for a weak symbol. */
300 unsigned return_val : 1;
0a25f1f5 301
6f29feb1
JW
302 /* The first element of the operands of this rtx.
303 The number of operands and their types are controlled
304 by the `code' field, according to rtl.def. */
e1de1560
RS
305 union u {
306 rtunion fld[1];
307 HOST_WIDE_INT hwint[1];
aacd3885 308 struct block_symbol block_sym;
9e254451 309 struct real_value rv;
e1de1560 310 } GTY ((special ("rtx_def"), desc ("GET_CODE (&%0)"))) u;
2f78c311 311};
6f29feb1 312
e1de1560
RS
313/* The size in bytes of an rtx header (code, mode and flags). */
314#define RTX_HDR_SIZE offsetof (struct rtx_def, u)
315
316/* The size in bytes of an rtx with code CODE. */
aacd3885 317#define RTX_CODE_SIZE(CODE) rtx_code_size[CODE]
e1de1560 318
6f29feb1
JW
319#define NULL_RTX (rtx) 0
320
36a5eadd
GK
321/* The "next" and "previous" RTX, relative to this one. */
322
323#define RTX_NEXT(X) (rtx_next[GET_CODE (X)] == 0 ? NULL \
324 : *(rtx *)(((char *)X) + rtx_next[GET_CODE (X)]))
325
326/* FIXME: the "NEXT_INSN (PREV_INSN (X)) == X" condition shouldn't be needed.
327 */
4b4bf941
JQ
328#define RTX_PREV(X) ((INSN_P (X) \
329 || NOTE_P (X) \
330 || BARRIER_P (X) \
331 || LABEL_P (X)) \
36a5eadd
GK
332 && PREV_INSN (X) != NULL \
333 && NEXT_INSN (PREV_INSN (X)) == X \
334 ? PREV_INSN (X) : NULL)
335
6f29feb1
JW
336/* Define macros to access the `code' field of the rtx. */
337
dbbbbf3b 338#define GET_CODE(RTX) ((enum rtx_code) (RTX)->code)
7e7c843f 339#define PUT_CODE(RTX, CODE) ((RTX)->code = (CODE))
6f29feb1 340
dbbbbf3b 341#define GET_MODE(RTX) ((enum machine_mode) (RTX)->mode)
7e7c843f 342#define PUT_MODE(RTX, MODE) ((RTX)->mode = (MODE))
6f29feb1 343
6f29feb1
JW
344/* RTL vector. These appear inside RTX's when there is a need
345 for a variable number of things. The principle use is inside
346 PARALLEL expressions. */
347
e2500fed 348struct rtvec_def GTY(()) {
e9a25f70 349 int num_elem; /* number of elements */
e2500fed 350 rtx GTY ((length ("%h.num_elem"))) elem[1];
2f78c311 351};
6f29feb1
JW
352
353#define NULL_RTVEC (rtvec) 0
354
355#define GET_NUM_ELEM(RTVEC) ((RTVEC)->num_elem)
e9a25f70 356#define PUT_NUM_ELEM(RTVEC, NUM) ((RTVEC)->num_elem = (NUM))
6f29feb1 357
3d27dbd0 358/* Predicate yielding nonzero iff X is an rtx for a register. */
6f29feb1
JW
359#define REG_P(X) (GET_CODE (X) == REG)
360
3d27dbd0
SB
361/* Predicate yielding nonzero iff X is an rtx for a memory location. */
362#define MEM_P(X) (GET_CODE (X) == MEM)
363
917f1b7e 364/* Predicate yielding nonzero iff X is an rtx for a constant integer. */
d97c1295
JBG
365#define CONST_INT_P(X) (GET_CODE (X) == CONST_INT)
366
b53978a3
JO
367/* Predicate yielding nonzero iff X is a label insn. */
368#define LABEL_P(X) (GET_CODE (X) == CODE_LABEL)
369
370/* Predicate yielding nonzero iff X is a jump insn. */
371#define JUMP_P(X) (GET_CODE (X) == JUMP_INSN)
372
3d27dbd0
SB
373/* Predicate yielding nonzero iff X is a call insn. */
374#define CALL_P(X) (GET_CODE (X) == CALL_INSN)
375
376/* Predicate yielding nonzero iff X is an insn that cannot jump. */
377#define NONJUMP_INSN_P(X) (GET_CODE (X) == INSN)
378
379/* Predicate yielding nonzero iff X is a real insn. */
380#define INSN_P(X) \
381 (NONJUMP_INSN_P (X) || JUMP_P (X) || CALL_P (X))
382
b53978a3
JO
383/* Predicate yielding nonzero iff X is a note insn. */
384#define NOTE_P(X) (GET_CODE (X) == NOTE)
385
386/* Predicate yielding nonzero iff X is a barrier insn. */
387#define BARRIER_P(X) (GET_CODE (X) == BARRIER)
388
389/* Predicate yielding nonzero iff X is a data for a jump table. */
390#define JUMP_TABLE_DATA_P(INSN) \
391 (JUMP_P (INSN) && (GET_CODE (PATTERN (INSN)) == ADDR_VEC || \
392 GET_CODE (PATTERN (INSN)) == ADDR_DIFF_VEC))
393
ec8e098d
PB
394/* 1 if X is a unary operator. */
395
396#define UNARY_P(X) \
397 (GET_RTX_CLASS (GET_CODE (X)) == RTX_UNARY)
398
399/* 1 if X is a binary operator. */
400
401#define BINARY_P(X) \
402 ((GET_RTX_CLASS (GET_CODE (X)) & RTX_BINARY_MASK) == RTX_BINARY_RESULT)
403
404/* 1 if X is an arithmetic operator. */
405
406#define ARITHMETIC_P(X) \
407 ((GET_RTX_CLASS (GET_CODE (X)) & RTX_ARITHMETIC_MASK) \
408 == RTX_ARITHMETIC_RESULT)
409
410/* 1 if X is an arithmetic operator. */
411
412#define COMMUTATIVE_ARITH_P(X) \
413 (GET_RTX_CLASS (GET_CODE (X)) == RTX_COMM_ARITH)
414
415/* 1 if X is a commutative arithmetic operator or a comparison operator.
416 These two are sometimes selected together because it is possible to
417 swap the two operands. */
418
419#define SWAPPABLE_OPERANDS_P(X) \
420 ((1 << GET_RTX_CLASS (GET_CODE (X))) \
421 & ((1 << RTX_COMM_ARITH) | (1 << RTX_COMM_COMPARE) \
422 | (1 << RTX_COMPARE)))
423
424/* 1 if X is a non-commutative operator. */
425
426#define NON_COMMUTATIVE_P(X) \
427 ((GET_RTX_CLASS (GET_CODE (X)) & RTX_COMMUTATIVE_MASK) \
428 == RTX_NON_COMMUTATIVE_RESULT)
429
430/* 1 if X is a commutative operator on integers. */
431
432#define COMMUTATIVE_P(X) \
433 ((GET_RTX_CLASS (GET_CODE (X)) & RTX_COMMUTATIVE_MASK) \
434 == RTX_COMMUTATIVE_RESULT)
435
436/* 1 if X is a relational operator. */
437
438#define COMPARISON_P(X) \
439 ((GET_RTX_CLASS (GET_CODE (X)) & RTX_COMPARE_MASK) == RTX_COMPARE_RESULT)
440
6f29feb1
JW
441/* 1 if X is a constant value that is an integer. */
442
443#define CONSTANT_P(X) \
f4770271 444 (GET_RTX_CLASS (GET_CODE (X)) == RTX_CONST_OBJ)
6f29feb1 445
ec8e098d
PB
446/* 1 if X can be used to represent an object. */
447#define OBJECT_P(X) \
448 ((GET_RTX_CLASS (GET_CODE (X)) & RTX_OBJ_MASK) == RTX_OBJ_RESULT)
449
6f29feb1
JW
450/* General accessor macros for accessing the fields of an rtx. */
451
f4524c9e 452#if defined ENABLE_RTL_CHECKING && (GCC_VERSION >= 2007)
ef178af3
ZW
453/* The bit with a star outside the statement expr and an & inside is
454 so that N can be evaluated only once. */
8784fdcd 455#define RTL_CHECK1(RTX, N, C1) __extension__ \
d544bc39
KG
456(*({ rtx const _rtx = (RTX); const int _n = (N); \
457 const enum rtx_code _code = GET_CODE (_rtx); \
ef178af3 458 if (_n < 0 || _n >= GET_RTX_LENGTH (_code)) \
f52eda29
GS
459 rtl_check_failed_bounds (_rtx, _n, __FILE__, __LINE__, \
460 __FUNCTION__); \
ef178af3 461 if (GET_RTX_FORMAT(_code)[_n] != C1) \
f52eda29
GS
462 rtl_check_failed_type1 (_rtx, _n, C1, __FILE__, __LINE__, \
463 __FUNCTION__); \
e1de1560 464 &_rtx->u.fld[_n]; }))
ef178af3 465
8784fdcd 466#define RTL_CHECK2(RTX, N, C1, C2) __extension__ \
d544bc39
KG
467(*({ rtx const _rtx = (RTX); const int _n = (N); \
468 const enum rtx_code _code = GET_CODE (_rtx); \
ef178af3 469 if (_n < 0 || _n >= GET_RTX_LENGTH (_code)) \
f52eda29
GS
470 rtl_check_failed_bounds (_rtx, _n, __FILE__, __LINE__, \
471 __FUNCTION__); \
ef178af3
ZW
472 if (GET_RTX_FORMAT(_code)[_n] != C1 \
473 && GET_RTX_FORMAT(_code)[_n] != C2) \
474 rtl_check_failed_type2 (_rtx, _n, C1, C2, __FILE__, __LINE__, \
fbfc1192 475 __FUNCTION__); \
e1de1560 476 &_rtx->u.fld[_n]; }))
ef178af3 477
8784fdcd 478#define RTL_CHECKC1(RTX, N, C) __extension__ \
d544bc39 479(*({ rtx const _rtx = (RTX); const int _n = (N); \
f52eda29
GS
480 if (GET_CODE (_rtx) != (C)) \
481 rtl_check_failed_code1 (_rtx, (C), __FILE__, __LINE__, \
482 __FUNCTION__); \
e1de1560 483 &_rtx->u.fld[_n]; }))
83ab3839 484
8784fdcd 485#define RTL_CHECKC2(RTX, N, C1, C2) __extension__ \
d544bc39
KG
486(*({ rtx const _rtx = (RTX); const int _n = (N); \
487 const enum rtx_code _code = GET_CODE (_rtx); \
f52eda29
GS
488 if (_code != (C1) && _code != (C2)) \
489 rtl_check_failed_code2 (_rtx, (C1), (C2), __FILE__, __LINE__, \
490 __FUNCTION__); \
e1de1560 491 &_rtx->u.fld[_n]; }))
83ab3839 492
8784fdcd 493#define RTVEC_ELT(RTVEC, I) __extension__ \
d544bc39 494(*({ rtvec const _rtvec = (RTVEC); const int _i = (I); \
ef178af3
ZW
495 if (_i < 0 || _i >= GET_NUM_ELEM (_rtvec)) \
496 rtvec_check_failed_bounds (_rtvec, _i, __FILE__, __LINE__, \
fbfc1192 497 __FUNCTION__); \
ef178af3
ZW
498 &_rtvec->elem[_i]; }))
499
e1de1560
RS
500#define XWINT(RTX, N) __extension__ \
501(*({ rtx const _rtx = (RTX); const int _n = (N); \
502 const enum rtx_code _code = GET_CODE (_rtx); \
503 if (_n < 0 || _n >= GET_RTX_LENGTH (_code)) \
504 rtl_check_failed_bounds (_rtx, _n, __FILE__, __LINE__, \
505 __FUNCTION__); \
506 if (GET_RTX_FORMAT(_code)[_n] != 'w') \
507 rtl_check_failed_type1 (_rtx, _n, 'w', __FILE__, __LINE__, \
508 __FUNCTION__); \
509 &_rtx->u.hwint[_n]; }))
510
511#define XCWINT(RTX, N, C) __extension__ \
512(*({ rtx const _rtx = (RTX); \
513 if (GET_CODE (_rtx) != (C)) \
514 rtl_check_failed_code1 (_rtx, (C), __FILE__, __LINE__, \
515 __FUNCTION__); \
516 &_rtx->u.hwint[N]; }))
517
9e254451
ILT
518#define XCMWINT(RTX, N, C, M) __extension__ \
519(*({ rtx const _rtx = (RTX); \
520 if (GET_CODE (_rtx) != (C) || GET_MODE (_rtx) != (M)) \
521 rtl_check_failed_code_mode (_rtx, (C), (M), false, __FILE__, \
522 __LINE__, __FUNCTION__); \
523 &_rtx->u.hwint[N]; }))
524
525#define XCNMPRV(RTX, C, M) __extension__ \
526({ rtx const _rtx = (RTX); \
527 if (GET_CODE (_rtx) != (C) || GET_MODE (_rtx) == (M)) \
528 rtl_check_failed_code_mode (_rtx, (C), (M), true, __FILE__, \
529 __LINE__, __FUNCTION__); \
530 &_rtx->u.rv; })
531
aacd3885
RS
532#define BLOCK_SYMBOL_CHECK(RTX) __extension__ \
533({ rtx const _symbol = (RTX); \
534 unsigned int flags = RTL_CHECKC1 (_symbol, 1, SYMBOL_REF).rt_int; \
3fa9c136 535 if ((flags & SYMBOL_FLAG_HAS_BLOCK_INFO) == 0) \
aacd3885
RS
536 rtl_check_failed_block_symbol (__FILE__, __LINE__, \
537 __FUNCTION__); \
538 &_symbol->u.block_sym; })
539
0c20a65f
AJ
540extern void rtl_check_failed_bounds (rtx, int, const char *, int,
541 const char *)
ef178af3 542 ATTRIBUTE_NORETURN;
0c20a65f
AJ
543extern void rtl_check_failed_type1 (rtx, int, int, const char *, int,
544 const char *)
ef178af3 545 ATTRIBUTE_NORETURN;
0c20a65f
AJ
546extern void rtl_check_failed_type2 (rtx, int, int, int, const char *,
547 int, const char *)
ef178af3 548 ATTRIBUTE_NORETURN;
0c20a65f
AJ
549extern void rtl_check_failed_code1 (rtx, enum rtx_code, const char *,
550 int, const char *)
83ab3839 551 ATTRIBUTE_NORETURN;
0c20a65f
AJ
552extern void rtl_check_failed_code2 (rtx, enum rtx_code, enum rtx_code,
553 const char *, int, const char *)
83ab3839 554 ATTRIBUTE_NORETURN;
9e254451
ILT
555extern void rtl_check_failed_code_mode (rtx, enum rtx_code, enum machine_mode,
556 bool, const char *, int, const char *)
557 ATTRIBUTE_NORETURN;
aacd3885
RS
558extern void rtl_check_failed_block_symbol (const char *, int, const char *)
559 ATTRIBUTE_NORETURN;
0c20a65f
AJ
560extern void rtvec_check_failed_bounds (rtvec, int, const char *, int,
561 const char *)
ef178af3
ZW
562 ATTRIBUTE_NORETURN;
563
f4524c9e 564#else /* not ENABLE_RTL_CHECKING */
ef178af3 565
e1de1560
RS
566#define RTL_CHECK1(RTX, N, C1) ((RTX)->u.fld[N])
567#define RTL_CHECK2(RTX, N, C1, C2) ((RTX)->u.fld[N])
568#define RTL_CHECKC1(RTX, N, C) ((RTX)->u.fld[N])
569#define RTL_CHECKC2(RTX, N, C1, C2) ((RTX)->u.fld[N])
83ab3839 570#define RTVEC_ELT(RTVEC, I) ((RTVEC)->elem[I])
e1de1560
RS
571#define XWINT(RTX, N) ((RTX)->u.hwint[N])
572#define XCWINT(RTX, N, C) ((RTX)->u.hwint[N])
9e254451
ILT
573#define XCMWINT(RTX, N, C, M) ((RTX)->u.hwint[N])
574#define XCNMWINT(RTX, N, C, M) ((RTX)->u.hwint[N])
575#define XCNMPRV(RTX, C, M) (&(RTX)->u.rv)
aacd3885 576#define BLOCK_SYMBOL_CHECK(RTX) (&(RTX)->u.block_sym)
ef178af3
ZW
577
578#endif
579
5a63e069
JJ
580/* General accessor macros for accessing the flags of an rtx. */
581
582/* Access an individual rtx flag, with no checking of any kind. */
583#define RTX_FLAG(RTX, FLAG) ((RTX)->FLAG)
584
65212b66 585#if defined ENABLE_RTL_FLAG_CHECKING && (GCC_VERSION >= 2007)
2d4cc6a7 586#define RTL_FLAG_CHECK1(NAME, RTX, C1) __extension__ \
5a63e069
JJ
587({ rtx const _rtx = (RTX); \
588 if (GET_CODE(_rtx) != C1) \
2d4cc6a7 589 rtl_check_failed_flag (NAME, _rtx, __FILE__, __LINE__, \
3d7aafde 590 __FUNCTION__); \
5a63e069
JJ
591 _rtx; })
592
2d4cc6a7 593#define RTL_FLAG_CHECK2(NAME, RTX, C1, C2) __extension__ \
5a63e069
JJ
594({ rtx const _rtx = (RTX); \
595 if (GET_CODE(_rtx) != C1 && GET_CODE(_rtx) != C2) \
2d4cc6a7 596 rtl_check_failed_flag (NAME,_rtx, __FILE__, __LINE__, \
3d7aafde 597 __FUNCTION__); \
5a63e069
JJ
598 _rtx; })
599
2d4cc6a7 600#define RTL_FLAG_CHECK3(NAME, RTX, C1, C2, C3) __extension__ \
5a63e069 601({ rtx const _rtx = (RTX); \
3d7aafde 602 if (GET_CODE(_rtx) != C1 && GET_CODE(_rtx) != C2 \
5a63e069 603 && GET_CODE(_rtx) != C3) \
2d4cc6a7 604 rtl_check_failed_flag (NAME, _rtx, __FILE__, __LINE__, \
3d7aafde 605 __FUNCTION__); \
5a63e069
JJ
606 _rtx; })
607
2d4cc6a7 608#define RTL_FLAG_CHECK4(NAME, RTX, C1, C2, C3, C4) __extension__ \
5a63e069 609({ rtx const _rtx = (RTX); \
3d7aafde 610 if (GET_CODE(_rtx) != C1 && GET_CODE(_rtx) != C2 \
5a63e069 611 && GET_CODE(_rtx) != C3 && GET_CODE(_rtx) != C4) \
2d4cc6a7 612 rtl_check_failed_flag (NAME, _rtx, __FILE__, __LINE__, \
3d7aafde 613 __FUNCTION__); \
5a63e069
JJ
614 _rtx; })
615
2d4cc6a7 616#define RTL_FLAG_CHECK5(NAME, RTX, C1, C2, C3, C4, C5) __extension__ \
5a63e069 617({ rtx const _rtx = (RTX); \
3d7aafde 618 if (GET_CODE(_rtx) != C1 && GET_CODE(_rtx) != C2 \
5a63e069
JJ
619 && GET_CODE(_rtx) != C3 && GET_CODE(_rtx) != C4 \
620 && GET_CODE(_rtx) != C5) \
2d4cc6a7 621 rtl_check_failed_flag (NAME, _rtx, __FILE__, __LINE__, \
3d7aafde 622 __FUNCTION__); \
5a63e069
JJ
623 _rtx; })
624
2d4cc6a7
JJ
625#define RTL_FLAG_CHECK6(NAME, RTX, C1, C2, C3, C4, C5, C6) \
626 __extension__ \
5a63e069 627({ rtx const _rtx = (RTX); \
3d7aafde 628 if (GET_CODE(_rtx) != C1 && GET_CODE(_rtx) != C2 \
5a63e069
JJ
629 && GET_CODE(_rtx) != C3 && GET_CODE(_rtx) != C4 \
630 && GET_CODE(_rtx) != C5 && GET_CODE(_rtx) != C6) \
2d4cc6a7 631 rtl_check_failed_flag (NAME,_rtx, __FILE__, __LINE__, \
3d7aafde 632 __FUNCTION__); \
5a63e069
JJ
633 _rtx; })
634
2d4cc6a7
JJ
635#define RTL_FLAG_CHECK7(NAME, RTX, C1, C2, C3, C4, C5, C6, C7) \
636 __extension__ \
5a63e069 637({ rtx const _rtx = (RTX); \
3d7aafde 638 if (GET_CODE(_rtx) != C1 && GET_CODE(_rtx) != C2 \
5a63e069
JJ
639 && GET_CODE(_rtx) != C3 && GET_CODE(_rtx) != C4 \
640 && GET_CODE(_rtx) != C5 && GET_CODE(_rtx) != C6 \
641 && GET_CODE(_rtx) != C7) \
2d4cc6a7 642 rtl_check_failed_flag (NAME, _rtx, __FILE__, __LINE__, \
3d7aafde 643 __FUNCTION__); \
5a63e069
JJ
644 _rtx; })
645
2d4cc6a7
JJ
646#define RTL_FLAG_CHECK8(NAME, RTX, C1, C2, C3, C4, C5, C6, C7, C8) \
647 __extension__ \
5a63e069 648({ rtx const _rtx = (RTX); \
3d7aafde 649 if (GET_CODE(_rtx) != C1 && GET_CODE(_rtx) != C2 \
5a63e069
JJ
650 && GET_CODE(_rtx) != C3 && GET_CODE(_rtx) != C4 \
651 && GET_CODE(_rtx) != C5 && GET_CODE(_rtx) != C6 \
652 && GET_CODE(_rtx) != C7 && GET_CODE(_rtx) != C8) \
2d4cc6a7 653 rtl_check_failed_flag (NAME, _rtx, __FILE__, __LINE__, \
3d7aafde 654 __FUNCTION__); \
5a63e069
JJ
655 _rtx; })
656
0c20a65f
AJ
657extern void rtl_check_failed_flag (const char *, rtx, const char *,
658 int, const char *)
5a63e069
JJ
659 ATTRIBUTE_NORETURN
660 ;
661
662#else /* not ENABLE_RTL_FLAG_CHECKING */
663
2d4cc6a7
JJ
664#define RTL_FLAG_CHECK1(NAME, RTX, C1) (RTX)
665#define RTL_FLAG_CHECK2(NAME, RTX, C1, C2) (RTX)
666#define RTL_FLAG_CHECK3(NAME, RTX, C1, C2, C3) (RTX)
667#define RTL_FLAG_CHECK4(NAME, RTX, C1, C2, C3, C4) (RTX)
3d7aafde 668#define RTL_FLAG_CHECK5(NAME, RTX, C1, C2, C3, C4, C5) (RTX)
2d4cc6a7
JJ
669#define RTL_FLAG_CHECK6(NAME, RTX, C1, C2, C3, C4, C5, C6) (RTX)
670#define RTL_FLAG_CHECK7(NAME, RTX, C1, C2, C3, C4, C5, C6, C7) (RTX)
671#define RTL_FLAG_CHECK8(NAME, RTX, C1, C2, C3, C4, C5, C6, C7, C8) (RTX)
5a63e069
JJ
672#endif
673
9ce88f5e
GDR
674#define XINT(RTX, N) (RTL_CHECK2 (RTX, N, 'i', 'n').rt_int)
675#define XSTR(RTX, N) (RTL_CHECK2 (RTX, N, 's', 'S').rt_str)
676#define XEXP(RTX, N) (RTL_CHECK2 (RTX, N, 'e', 'u').rt_rtx)
677#define XVEC(RTX, N) (RTL_CHECK2 (RTX, N, 'E', 'V').rt_rtvec)
678#define XMODE(RTX, N) (RTL_CHECK1 (RTX, N, 'M').rt_type)
679#define XBITMAP(RTX, N) (RTL_CHECK1 (RTX, N, 'b').rt_bit)
680#define XTREE(RTX, N) (RTL_CHECK1 (RTX, N, 't').rt_tree)
681#define XBBDEF(RTX, N) (RTL_CHECK1 (RTX, N, 'B').rt_bb)
682#define XTMPL(RTX, N) (RTL_CHECK1 (RTX, N, 'T').rt_str)
ef178af3
ZW
683
684#define XVECEXP(RTX, N, M) RTVEC_ELT (XVEC (RTX, N), M)
685#define XVECLEN(RTX, N) GET_NUM_ELEM (XVEC (RTX, N))
686
e1de1560 687/* These are like XINT, etc. except that they expect a '0' field instead
ef178af3
ZW
688 of the normal type code. */
689
9ce88f5e
GDR
690#define X0INT(RTX, N) (RTL_CHECK1 (RTX, N, '0').rt_int)
691#define X0UINT(RTX, N) (RTL_CHECK1 (RTX, N, '0').rt_uint)
692#define X0STR(RTX, N) (RTL_CHECK1 (RTX, N, '0').rt_str)
693#define X0EXP(RTX, N) (RTL_CHECK1 (RTX, N, '0').rt_rtx)
694#define X0VEC(RTX, N) (RTL_CHECK1 (RTX, N, '0').rt_rtvec)
695#define X0MODE(RTX, N) (RTL_CHECK1 (RTX, N, '0').rt_type)
696#define X0BITMAP(RTX, N) (RTL_CHECK1 (RTX, N, '0').rt_bit)
697#define X0TREE(RTX, N) (RTL_CHECK1 (RTX, N, '0').rt_tree)
698#define X0BBDEF(RTX, N) (RTL_CHECK1 (RTX, N, '0').rt_bb)
f52eda29
GS
699#define X0ADVFLAGS(RTX, N) (RTL_CHECK1 (RTX, N, '0').rt_addr_diff_vec_flags)
700#define X0CSELIB(RTX, N) (RTL_CHECK1 (RTX, N, '0').rt_cselib)
9ce88f5e
GDR
701#define X0MEMATTR(RTX, N) (RTL_CHECKC1 (RTX, N, MEM).rt_mem)
702#define X0REGATTR(RTX, N) (RTL_CHECKC1 (RTX, N, REG).rt_reg)
c185c797 703#define X0CONSTANT(RTX, N) (RTL_CHECK1 (RTX, N, '0').rt_constant)
f52eda29 704
e1de1560
RS
705/* Access a '0' field with any type. */
706#define X0ANY(RTX, N) RTL_CHECK1 (RTX, N, '0')
707
9ce88f5e
GDR
708#define XCINT(RTX, N, C) (RTL_CHECKC1 (RTX, N, C).rt_int)
709#define XCUINT(RTX, N, C) (RTL_CHECKC1 (RTX, N, C).rt_uint)
710#define XCSTR(RTX, N, C) (RTL_CHECKC1 (RTX, N, C).rt_str)
711#define XCEXP(RTX, N, C) (RTL_CHECKC1 (RTX, N, C).rt_rtx)
712#define XCVEC(RTX, N, C) (RTL_CHECKC1 (RTX, N, C).rt_rtvec)
713#define XCMODE(RTX, N, C) (RTL_CHECKC1 (RTX, N, C).rt_type)
714#define XCBITMAP(RTX, N, C) (RTL_CHECKC1 (RTX, N, C).rt_bit)
715#define XCTREE(RTX, N, C) (RTL_CHECKC1 (RTX, N, C).rt_tree)
716#define XCBBDEF(RTX, N, C) (RTL_CHECKC1 (RTX, N, C).rt_bb)
f52eda29 717#define XCCSELIB(RTX, N, C) (RTL_CHECKC1 (RTX, N, C).rt_cselib)
83ab3839
RH
718
719#define XCVECEXP(RTX, N, M, C) RTVEC_ELT (XCVEC (RTX, N, C), M)
720#define XCVECLEN(RTX, N, C) GET_NUM_ELEM (XCVEC (RTX, N, C))
721
9ce88f5e 722#define XC2EXP(RTX, N, C1, C2) (RTL_CHECKC2 (RTX, N, C1, C2).rt_rtx)
6f29feb1
JW
723\f
724/* ACCESS MACROS for particular fields of insns. */
725
726/* Holds a unique number for each insn.
727 These are not necessarily sequentially increasing. */
f52eda29 728#define INSN_UID(INSN) XINT (INSN, 0)
6f29feb1
JW
729
730/* Chain insns together in sequence. */
f52eda29
GS
731#define PREV_INSN(INSN) XEXP (INSN, 1)
732#define NEXT_INSN(INSN) XEXP (INSN, 2)
6f29feb1 733
ba4f7968 734#define BLOCK_FOR_INSN(INSN) XBBDEF (INSN, 3)
0435312e 735#define INSN_LOCATOR(INSN) XINT (INSN, 4)
6f29feb1 736/* The body of an insn. */
ba4f7968 737#define PATTERN(INSN) XEXP (INSN, 5)
6f29feb1
JW
738
739/* Code number of instruction, from when it was recognized.
740 -1 means this instruction has not been recognized yet. */
ba4f7968 741#define INSN_CODE(INSN) XINT (INSN, 6)
6f29feb1
JW
742
743/* Set up in flow.c; empty before then.
744 Holds a chain of INSN_LIST rtx's whose first operands point at
745 previous insns with direct data-flow connections to this one.
746 That means that those insns set variables whose next use is in this insn.
747 They are always in the same basic block as this insn. */
ba4f7968 748#define LOG_LINKS(INSN) XEXP(INSN, 7)
6f29feb1 749
2d4cc6a7
JJ
750#define RTX_FRAME_RELATED_P(RTX) \
751 (RTL_FLAG_CHECK5("RTX_FRAME_RELATED_P", (RTX), INSN, CALL_INSN, \
752 JUMP_INSN, BARRIER, SET)->frame_related)
753
754/* 1 if RTX is an insn that has been deleted. */
755#define INSN_DELETED_P(RTX) \
756 (RTL_FLAG_CHECK6("INSN_DELETED_P", (RTX), INSN, CALL_INSN, JUMP_INSN, \
757 CODE_LABEL, BARRIER, NOTE)->volatil)
758
759/* 1 if RTX is a call to a const or pure function. */
760#define CONST_OR_PURE_CALL_P(RTX) \
761 (RTL_FLAG_CHECK3("CONST_OR_PURE_CALL_P", (RTX), CALL_INSN, NOTE, \
762 EXPR_LIST)->unchanging)
763
764/* 1 if RTX is a call_insn for a sibling call. */
765#define SIBLING_CALL_P(RTX) \
766 (RTL_FLAG_CHECK1("SIBLING_CALL_P", (RTX), CALL_INSN)->jump)
767
7440af14 768/* 1 if RTX is a jump_insn, call_insn, or insn that is an annulling branch. */
2d4cc6a7 769#define INSN_ANNULLED_BRANCH_P(RTX) \
7440af14 770 (RTL_FLAG_CHECK3("INSN_ANNULLED_BRANCH_P", (RTX), JUMP_INSN, CALL_INSN, INSN)->unchanging)
2d4cc6a7 771
2d4cc6a7
JJ
772/* 1 if RTX is an insn in a delay slot and is from the target of the branch.
773 If the branch insn has INSN_ANNULLED_BRANCH_P set, this insn should only be
6f29feb1
JW
774 executed if the branch is taken. For annulled branches with this bit
775 clear, the insn should be executed only if the branch is not taken. */
2d4cc6a7 776#define INSN_FROM_TARGET_P(RTX) \
cf40ea15 777 (RTL_FLAG_CHECK3("INSN_FROM_TARGET_P", (RTX), INSN, JUMP_INSN, CALL_INSN)->in_struct)
6f29feb1 778
d67fb775
SB
779/* In an ADDR_DIFF_VEC, the flags for RTX for use by branch shortening.
780 See the comments for ADDR_DIFF_VEC in rtl.def. */
f590cca1
RH
781#define ADDR_DIFF_VEC_FLAGS(RTX) X0ADVFLAGS(RTX, 4)
782
d67fb775
SB
783/* In a VALUE, the value cselib has assigned to RTX.
784 This is a "struct cselib_val_struct", see cselib.h. */
f590cca1
RH
785#define CSELIB_VAL_PTR(RTX) X0CSELIB(RTX, 0)
786
6f29feb1 787/* Holds a list of notes on what this insn does to various REGs.
f590cca1
RH
788 It is a chain of EXPR_LIST rtx's, where the second operand is the
789 chain pointer and the first operand is the REG being described.
6f29feb1 790 The mode field of the EXPR_LIST contains not a real machine mode
f590cca1 791 but a value from enum reg_note. */
ba4f7968 792#define REG_NOTES(INSN) XEXP(INSN, 8)
6f29feb1 793
f590cca1
RH
794enum reg_note
795{
826c9564
ZW
796#define DEF_REG_NOTE(NAME) NAME,
797#include "reg-notes.def"
798#undef DEF_REG_NOTE
799 REG_NOTE_MAX
f590cca1
RH
800};
801
6f29feb1
JW
802/* Define macros to extract and insert the reg-note kind in an EXPR_LIST. */
803#define REG_NOTE_KIND(LINK) ((enum reg_note) GET_MODE (LINK))
f52eda29
GS
804#define PUT_REG_NOTE_KIND(LINK, KIND) \
805 PUT_MODE (LINK, (enum machine_mode) (KIND))
6f29feb1
JW
806
807/* Names for REG_NOTE's in EXPR_LIST insn's. */
808
1f9a015e 809extern const char * const reg_note_name[];
0f41302f 810#define GET_REG_NOTE_NAME(MODE) (reg_note_name[(int) (MODE)])
6f29feb1 811
e51c6661
RK
812/* This field is only present on CALL_INSNs. It holds a chain of EXPR_LIST of
813 USE and CLOBBER expressions.
814 USE expressions list the registers filled with arguments that
815 are passed to the function.
816 CLOBBER expressions document the registers explicitly clobbered
817 by this CALL_INSN.
818 Pseudo registers can not be mentioned in this list. */
ba4f7968 819#define CALL_INSN_FUNCTION_USAGE(INSN) XEXP(INSN, 9)
e51c6661 820
6f29feb1
JW
821/* The label-number of a code-label. The assembler label
822 is made from `L' and the label-number printed in decimal.
823 Label numbers are unique in a compilation. */
ba4f7968 824#define CODE_LABEL_NUMBER(INSN) XINT (INSN, 6)
6f29feb1 825
0dfa1860
MM
826/* In a NOTE that is a line number, this is a string for the file name that the
827 line is in. We use the same field to record block numbers temporarily in
828 NOTE_INSN_BLOCK_BEG and NOTE_INSN_BLOCK_END notes. (We avoid lots of casts
829 between ints and pointers if we use a different macro for the block number.)
63f4a88e 830 */
6f29feb1 831
fd3acbb3 832/* Opaque data. */
dd107e66 833#define NOTE_DATA(INSN) RTL_CHECKC1 (INSN, 4, NOTE)
c1667470
PB
834#define NOTE_DELETED_LABEL_NAME(INSN) XCSTR (INSN, 4, NOTE)
835#ifdef USE_MAPPED_LOCATION
836#define NOTE_SOURCE_LOCATION(INSN) XCUINT (INSN, 5, NOTE)
837#define NOTE_EXPANDED_LOCATION(XLOC, INSN) \
838 (XLOC) = expand_location (NOTE_SOURCE_LOCATION (INSN))
839#define SET_INSN_DELETED(INSN) \
840 (PUT_CODE (INSN, NOTE), NOTE_LINE_NUMBER (INSN) = NOTE_INSN_DELETED)
841#else
842#define NOTE_EXPANDED_LOCATION(XLOC, INSN) \
843 ((XLOC).file = NOTE_SOURCE_FILE (INSN), \
844 (XLOC).line = NOTE_LINE_NUMBER (INSN))
3d7aafde 845#define NOTE_SOURCE_FILE(INSN) XCSTR (INSN, 4, NOTE)
c1667470
PB
846#define SET_INSN_DELETED(INSN) \
847 (PUT_CODE (INSN, NOTE), NOTE_SOURCE_FILE (INSN) = 0, \
848 NOTE_LINE_NUMBER (INSN) = NOTE_INSN_DELETED)
849#endif
ba4f7968
JH
850#define NOTE_BLOCK(INSN) XCTREE (INSN, 4, NOTE)
851#define NOTE_EH_HANDLER(INSN) XCINT (INSN, 4, NOTE)
ba4f7968
JH
852#define NOTE_BASIC_BLOCK(INSN) XCBBDEF (INSN, 4, NOTE)
853#define NOTE_EXPECTED_VALUE(INSN) XCEXP (INSN, 4, NOTE)
014a1138 854#define NOTE_VAR_LOCATION(INSN) XCEXP (INSN, 4, NOTE)
0dfa1860 855
6f29feb1
JW
856/* In a NOTE that is a line number, this is the line number.
857 Other kinds of NOTEs are identified by negative numbers here. */
ba4f7968 858#define NOTE_LINE_NUMBER(INSN) XCINT (INSN, 5, NOTE)
6f29feb1 859
589ca5cb 860/* Nonzero if INSN is a note marking the beginning of a basic block. */
3d7aafde 861#define NOTE_INSN_BASIC_BLOCK_P(INSN) \
589ca5cb
MM
862 (GET_CODE (INSN) == NOTE \
863 && NOTE_LINE_NUMBER (INSN) == NOTE_INSN_BASIC_BLOCK)
864
014a1138
JZ
865/* Variable declaration and the location of a variable. */
866#define NOTE_VAR_LOCATION_DECL(INSN) (XCTREE (XCEXP (INSN, 4, NOTE), \
867 0, VAR_LOCATION))
868#define NOTE_VAR_LOCATION_LOC(INSN) (XCEXP (XCEXP (INSN, 4, NOTE), \
869 1, VAR_LOCATION))
6f29feb1 870
826c9564
ZW
871/* Codes that appear in the NOTE_LINE_NUMBER field for kinds of notes
872 that are not line numbers. These codes are all negative.
873
a31efb86
DE
874 Notice that we do not try to use zero here for any of
875 the special note codes because sometimes the source line
876 actually can be zero! This happens (for example) when we
877 are generating code for the per-translation-unit constructor
826c9564 878 and destructor routines for some C++ translation unit. */
6f29feb1 879
d636c18c
RH
880enum insn_note
881{
882 /* Keep all of these numbers negative. Adjust as needed. */
883 NOTE_INSN_BIAS = -100,
884
826c9564
ZW
885#define DEF_INSN_NOTE(NAME) NAME,
886#include "insn-notes.def"
887#undef DEF_INSN_NOTE
014a1138 888
d636c18c
RH
889 NOTE_INSN_MAX
890};
10f07067 891
6f29feb1
JW
892/* Names for NOTE insn's other than line numbers. */
893
d636c18c
RH
894extern const char * const note_insn_name[NOTE_INSN_MAX - NOTE_INSN_BIAS];
895#define GET_NOTE_INSN_NAME(NOTE_CODE) \
dbbbbf3b 896 (note_insn_name[(NOTE_CODE) - (int) NOTE_INSN_BIAS])
6f29feb1
JW
897
898/* The name of a label, in case it corresponds to an explicit label
899 in the input source code. */
ba4f7968 900#define LABEL_NAME(RTX) XCSTR (RTX, 7, CODE_LABEL)
6f29feb1
JW
901
902/* In jump.c, each label contains a count of the number
903 of LABEL_REFs that point at it, so unused labels can be deleted. */
ba4f7968 904#define LABEL_NUSES(RTX) XCINT (RTX, 4, CODE_LABEL)
6f29feb1 905
0dc36574
ZW
906/* Labels carry a two-bit field composed of the ->jump and ->call
907 bits. This field indicates whether the label is an alternate
908 entry point, and if so, what kind. */
909enum label_kind
910{
911 LABEL_NORMAL = 0, /* ordinary label */
912 LABEL_STATIC_ENTRY, /* alternate entry point, not exported */
913 LABEL_GLOBAL_ENTRY, /* alternate entry point, exported */
914 LABEL_WEAK_ENTRY /* alternate entry point, exported as weak symbol */
915};
916
917#if defined ENABLE_RTL_FLAG_CHECKING && (GCC_VERSION > 2007)
918
919/* Retrieve the kind of LABEL. */
920#define LABEL_KIND(LABEL) __extension__ \
921({ rtx const _label = (LABEL); \
922 if (GET_CODE (_label) != CODE_LABEL) \
923 rtl_check_failed_flag ("LABEL_KIND", _label, __FILE__, __LINE__, \
924 __FUNCTION__); \
925 (enum label_kind) ((_label->jump << 1) | _label->call); })
926
927/* Set the kind of LABEL. */
928#define SET_LABEL_KIND(LABEL, KIND) do { \
929 rtx _label = (LABEL); \
930 unsigned int _kind = (KIND); \
931 if (GET_CODE (_label) != CODE_LABEL) \
932 rtl_check_failed_flag ("SET_LABEL_KIND", _label, __FILE__, __LINE__, \
933 __FUNCTION__); \
934 _label->jump = ((_kind >> 1) & 1); \
935 _label->call = (_kind & 1); \
936} while (0)
937
938#else
939
940/* Retrieve the kind of LABEL. */
941#define LABEL_KIND(LABEL) \
942 ((enum label_kind) (((LABEL)->jump << 1) | (LABEL)->call))
943
944/* Set the kind of LABEL. */
945#define SET_LABEL_KIND(LABEL, KIND) do { \
946 rtx _label = (LABEL); \
947 unsigned int _kind = (KIND); \
948 _label->jump = ((_kind >> 1) & 1); \
949 _label->call = (_kind & 1); \
950} while (0)
951
952#endif /* rtl flag checking */
953
954#define LABEL_ALT_ENTRY_P(LABEL) (LABEL_KIND (LABEL) != LABEL_NORMAL)
8cd0faaf 955
6f29feb1
JW
956/* In jump.c, each JUMP_INSN can point to a label that it can jump to,
957 so that if the JUMP_INSN is deleted, the label's LABEL_NUSES can
958 be decremented and possibly the label can be deleted. */
ba4f7968 959#define JUMP_LABEL(INSN) XCEXP (INSN, 9, JUMP_INSN)
6f29feb1
JW
960
961/* Once basic blocks are found in flow.c,
962 each CODE_LABEL starts a chain that goes through
963 all the LABEL_REFs that jump to that label.
be1bb652 964 The chain eventually winds up at the CODE_LABEL: it is circular. */
ba4f7968 965#define LABEL_REFS(LABEL) XCEXP (LABEL, 5, CODE_LABEL)
6f29feb1 966\f
08394eef
BS
967/* For a REG rtx, REGNO extracts the register number. ORIGINAL_REGNO holds
968 the number the register originally had; for a pseudo register turned into
969 a hard reg this will hold the old pseudo register number. */
6f29feb1 970
f52eda29
GS
971#define REGNO(RTX) XCUINT (RTX, 0, REG)
972#define ORIGINAL_REGNO(RTX) X0UINT (RTX, 1)
6f29feb1 973
084a1106
JDA
974/* 1 if RTX is a reg or parallel that is the current function's return
975 value. */
2d4cc6a7 976#define REG_FUNCTION_VALUE_P(RTX) \
6de9cd9a 977 (RTL_FLAG_CHECK2("REG_FUNCTION_VALUE_P", (RTX), REG, PARALLEL)->return_val)
6f29feb1 978
2d4cc6a7
JJ
979/* 1 if RTX is a reg that corresponds to a variable declared by the user. */
980#define REG_USERVAR_P(RTX) \
981 (RTL_FLAG_CHECK1("REG_USERVAR_P", (RTX), REG)->volatil)
6f29feb1 982
2d4cc6a7
JJ
983/* 1 if RTX is a reg that holds a pointer value. */
984#define REG_POINTER(RTX) \
985 (RTL_FLAG_CHECK1("REG_POINTER", (RTX), REG)->frame_related)
3502dc9c 986
f8ad8d7c
ZD
987/* 1 if RTX is a mem that holds a pointer value. */
988#define MEM_POINTER(RTX) \
989 (RTL_FLAG_CHECK1("MEM_POINTER", (RTX), MEM)->frame_related)
990
cdbca172
JO
991/* 1 if the given register REG corresponds to a hard register. */
992#define HARD_REGISTER_P(REG) (HARD_REGISTER_NUM_P (REGNO (REG)))
993
994/* 1 if the given register number REG_NO corresponds to a hard register. */
f52eda29 995#define HARD_REGISTER_NUM_P(REG_NO) ((REG_NO) < FIRST_PSEUDO_REGISTER)
cdbca172 996
6f29feb1 997/* For a CONST_INT rtx, INTVAL extracts the integer. */
83ab3839 998#define INTVAL(RTX) XCWINT(RTX, 0, CONST_INT)
6f29feb1 999
a36556a8 1000/* For a CONST_DOUBLE:
6a47d88f 1001 For a VOIDmode, there are two integers CONST_DOUBLE_LOW is the
46b33600 1002 low-order word and ..._HIGH the high-order.
3d7aafde 1003 For a float, there is a REAL_VALUE_TYPE structure, and
46b33600 1004 CONST_DOUBLE_REAL_VALUE(r) is a pointer to it. */
9e254451
ILT
1005#define CONST_DOUBLE_LOW(r) XCMWINT (r, 0, CONST_DOUBLE, VOIDmode)
1006#define CONST_DOUBLE_HIGH(r) XCMWINT (r, 1, CONST_DOUBLE, VOIDmode)
1007#define CONST_DOUBLE_REAL_VALUE(r) \
1008 ((const struct real_value *) XCNMPRV (r, CONST_DOUBLE, VOIDmode))
a36556a8 1009
69ef87e2
AH
1010/* For a CONST_VECTOR, return element #n. */
1011#define CONST_VECTOR_ELT(RTX, N) XCVECEXP (RTX, 0, N, CONST_VECTOR)
1012
1013/* For a CONST_VECTOR, return the number of elements in a vector. */
1014#define CONST_VECTOR_NUNITS(RTX) XCVECLEN (RTX, 0, CONST_VECTOR)
1015
6f29feb1 1016/* For a SUBREG rtx, SUBREG_REG extracts the value we want a subreg of.
ddef6bc7 1017 SUBREG_BYTE extracts the byte-number. */
6f29feb1 1018
f52eda29
GS
1019#define SUBREG_REG(RTX) XCEXP (RTX, 0, SUBREG)
1020#define SUBREG_BYTE(RTX) XCUINT (RTX, 1, SUBREG)
ddef6bc7
JJ
1021
1022/* in rtlanal.c */
f894b69b
PB
1023/* Return the right cost to give to an operation
1024 to make the cost of the corresponding register-to-register instruction
1025 N times that of a fast register-to-register instruction. */
1026#define COSTS_N_INSNS(N) ((N) * 4)
1027
1028/* Maximum cost of an rtl expression. This value has the special meaning
1029 not to use an rtx with this cost under any circumstances. */
1030#define MAX_COST INT_MAX
1031
cf94b0fc 1032extern void init_rtlanal (void);
f894b69b
PB
1033extern int rtx_cost (rtx, enum rtx_code);
1034extern int address_cost (rtx, enum machine_mode);
0c20a65f 1035extern unsigned int subreg_lsb (rtx);
bb51e270
RS
1036extern unsigned int subreg_lsb_1 (enum machine_mode, enum machine_mode,
1037 unsigned int);
0c20a65f
AJ
1038extern unsigned int subreg_regno_offset (unsigned int, enum machine_mode,
1039 unsigned int, enum machine_mode);
1040extern bool subreg_offset_representable_p (unsigned int, enum machine_mode,
1041 unsigned int, enum machine_mode);
1042extern unsigned int subreg_regno (rtx);
2f93eea8
PB
1043extern unsigned HOST_WIDE_INT nonzero_bits (rtx, enum machine_mode);
1044extern unsigned int num_sign_bit_copies (rtx, enum machine_mode);
3d8504ac 1045extern bool constant_pool_constant_p (rtx);
d3b72690 1046extern bool truncated_to_mode (enum machine_mode, rtx);
2f93eea8 1047
6f29feb1 1048
2d4cc6a7
JJ
1049/* 1 if RTX is a subreg containing a reg that is already known to be
1050 sign- or zero-extended from the mode of the subreg to the mode of
07be3989 1051 the reg. SUBREG_PROMOTED_UNSIGNED_P gives the signedness of the
f590cca1 1052 extension.
07be3989
RK
1053
1054 When used as a LHS, is means that this extension must be done
1055 when assigning to SUBREG_REG. */
1056
2d4cc6a7
JJ
1057#define SUBREG_PROMOTED_VAR_P(RTX) \
1058 (RTL_FLAG_CHECK1("SUBREG_PROMOTED", (RTX), SUBREG)->in_struct)
1059
1060#define SUBREG_PROMOTED_UNSIGNED_SET(RTX, VAL) \
1061do { \
b0ad77d5 1062 rtx const _rtx = RTL_FLAG_CHECK1("SUBREG_PROMOTED_UNSIGNED_SET", (RTX), SUBREG); \
2d4cc6a7 1063 if ((VAL) < 0) \
b0ad77d5 1064 _rtx->volatil = 1; \
2d4cc6a7 1065 else { \
b0ad77d5
KG
1066 _rtx->volatil = 0; \
1067 _rtx->unchanging = (VAL); \
2d4cc6a7 1068 } \
7879b81e 1069} while (0)
5a63e069 1070#define SUBREG_PROMOTED_UNSIGNED_P(RTX) \
2d4cc6a7
JJ
1071 ((RTL_FLAG_CHECK1("SUBREG_PROMOTED_UNSIGNED_P", (RTX), SUBREG)->volatil) \
1072 ? -1 : (RTX)->unchanging)
07be3989 1073
6f29feb1
JW
1074/* Access various components of an ASM_OPERANDS rtx. */
1075
f52eda29
GS
1076#define ASM_OPERANDS_TEMPLATE(RTX) XCSTR (RTX, 0, ASM_OPERANDS)
1077#define ASM_OPERANDS_OUTPUT_CONSTRAINT(RTX) XCSTR (RTX, 1, ASM_OPERANDS)
1078#define ASM_OPERANDS_OUTPUT_IDX(RTX) XCINT (RTX, 2, ASM_OPERANDS)
1079#define ASM_OPERANDS_INPUT_VEC(RTX) XCVEC (RTX, 3, ASM_OPERANDS)
1080#define ASM_OPERANDS_INPUT_CONSTRAINT_VEC(RTX) XCVEC (RTX, 4, ASM_OPERANDS)
1081#define ASM_OPERANDS_INPUT(RTX, N) XCVECEXP (RTX, 3, N, ASM_OPERANDS)
1082#define ASM_OPERANDS_INPUT_LENGTH(RTX) XCVECLEN (RTX, 3, ASM_OPERANDS)
6462bb43 1083#define ASM_OPERANDS_INPUT_CONSTRAINT_EXP(RTX, N) \
f52eda29 1084 XCVECEXP (RTX, 4, N, ASM_OPERANDS)
3bdf5ad1 1085#define ASM_OPERANDS_INPUT_CONSTRAINT(RTX, N) \
f52eda29 1086 XSTR (XCVECEXP (RTX, 4, N, ASM_OPERANDS), 0)
3bdf5ad1 1087#define ASM_OPERANDS_INPUT_MODE(RTX, N) \
f52eda29 1088 GET_MODE (XCVECEXP (RTX, 4, N, ASM_OPERANDS))
c1667470
PB
1089#ifdef USE_MAPPED_LOCATION
1090#define ASM_OPERANDS_SOURCE_LOCATION(RTX) XCUINT (RTX, 5, ASM_OPERANDS)
1091#else
f52eda29
GS
1092#define ASM_OPERANDS_SOURCE_FILE(RTX) XCSTR (RTX, 5, ASM_OPERANDS)
1093#define ASM_OPERANDS_SOURCE_LINE(RTX) XCINT (RTX, 6, ASM_OPERANDS)
c1667470 1094#endif
6f29feb1 1095
389fdba0
RH
1096/* 1 if RTX is a mem that is statically allocated in read-only memory. */
1097#define MEM_READONLY_P(RTX) \
1098 (RTL_FLAG_CHECK1("MEM_READONLY_P", (RTX), MEM)->unchanging)
1099
2d4cc6a7 1100/* 1 if RTX is a mem and we should keep the alias set for this mem
10b76d73
RK
1101 unchanged when we access a component. Set to 1, or example, when we
1102 are already in a non-addressable component of an aggregate. */
2d4cc6a7
JJ
1103#define MEM_KEEP_ALIAS_SET_P(RTX) \
1104 (RTL_FLAG_CHECK1("MEM_KEEP_ALIAS_SET_P", (RTX), MEM)->jump)
10b76d73 1105
2d4cc6a7
JJ
1106/* 1 if RTX is a mem or asm_operand for a volatile reference. */
1107#define MEM_VOLATILE_P(RTX) \
1108 (RTL_FLAG_CHECK3("MEM_VOLATILE_P", (RTX), MEM, ASM_OPERANDS, \
1109 ASM_INPUT)->volatil)
6f29feb1 1110
2d4cc6a7 1111/* 1 if RTX is a mem that refers to an aggregate, either to the
24b7d7c3 1112 aggregate itself or to a field of the aggregate. If zero, RTX may
4eb00163 1113 or may not be such a reference. */
2d4cc6a7
JJ
1114#define MEM_IN_STRUCT_P(RTX) \
1115 (RTL_FLAG_CHECK1("MEM_IN_STRUCT_P", (RTX), MEM)->in_struct)
6f29feb1 1116
acf8677f 1117/* 1 if RTX is a MEM that refers to a scalar. If zero, RTX may or may
3ef42a0c 1118 not refer to a scalar. */
2d4cc6a7 1119#define MEM_SCALAR_P(RTX) \
acf8677f 1120 (RTL_FLAG_CHECK1("MEM_SCALAR_P", (RTX), MEM)->return_val)
c6df88cb 1121
4da2eb6b
RH
1122/* 1 if RTX is a mem that cannot trap. */
1123#define MEM_NOTRAP_P(RTX) \
1124 (RTL_FLAG_CHECK1("MEM_NOTRAP_P", (RTX), MEM)->call)
1125
40f03658 1126/* If VAL is nonzero, set MEM_IN_STRUCT_P and clear MEM_SCALAR_P in
c6df88cb
MM
1127 RTX. Otherwise, vice versa. Use this macro only when you are
1128 *sure* that you know that the MEM is in a structure, or is a
1129 scalar. VAL is evaluated only once. */
f52eda29
GS
1130#define MEM_SET_IN_STRUCT_P(RTX, VAL) \
1131do { \
f9e158c3
JM
1132 if (VAL) \
1133 { \
1134 MEM_IN_STRUCT_P (RTX) = 1; \
1135 MEM_SCALAR_P (RTX) = 0; \
1136 } \
1137 else \
1138 { \
1139 MEM_IN_STRUCT_P (RTX) = 0; \
1140 MEM_SCALAR_P (RTX) = 1; \
1141 } \
1142} while (0)
c6df88cb 1143
173b24b9
RK
1144/* The memory attribute block. We provide access macros for each value
1145 in the block and provide defaults if none specified. */
1146#define MEM_ATTRS(RTX) X0MEMATTR (RTX, 1)
1147
a560d4d4
JH
1148/* The register attribute block. We provide access macros for each value
1149 in the block and provide defaults if none specified. */
1150#define REG_ATTRS(RTX) X0REGATTR (RTX, 2)
1151
41472af8
MM
1152/* For a MEM rtx, the alias set. If 0, this MEM is not in any alias
1153 set, and may alias anything. Otherwise, the MEM can only alias
3568b0ef 1154 MEMs in a conflicting alias set. This value is set in a
41472af8 1155 language-dependent manner in the front-end, and should not be
3568b0ef
RH
1156 altered in the back-end. These set numbers are tested with
1157 alias_sets_conflict_p. */
173b24b9
RK
1158#define MEM_ALIAS_SET(RTX) (MEM_ATTRS (RTX) == 0 ? 0 : MEM_ATTRS (RTX)->alias)
1159
1160/* For a MEM rtx, the decl it is known to refer to, if it is known to
998d7deb
RH
1161 refer to part of a DECL. It may also be a COMPONENT_REF. */
1162#define MEM_EXPR(RTX) (MEM_ATTRS (RTX) == 0 ? 0 : MEM_ATTRS (RTX)->expr)
173b24b9 1163
998d7deb 1164/* For a MEM rtx, the offset from the start of MEM_EXPR, if known, as a
173b24b9
RK
1165 RTX that is always a CONST_INT. */
1166#define MEM_OFFSET(RTX) (MEM_ATTRS (RTX) == 0 ? 0 : MEM_ATTRS (RTX)->offset)
1167
1168/* For a MEM rtx, the size in bytes of the MEM, if known, as an RTX that
1169 is always a CONST_INT. */
10b76d73
RK
1170#define MEM_SIZE(RTX) \
1171(MEM_ATTRS (RTX) != 0 ? MEM_ATTRS (RTX)->size \
1172 : GET_MODE (RTX) != BLKmode ? GEN_INT (GET_MODE_SIZE (GET_MODE (RTX))) \
1173 : 0)
173b24b9 1174
917afb0c
RK
1175/* For a MEM rtx, the alignment in bits. We can use the alignment of the
1176 mode as a default when STRICT_ALIGNMENT, but not if not. */
8ac61af7
RK
1177#define MEM_ALIGN(RTX) \
1178(MEM_ATTRS (RTX) != 0 ? MEM_ATTRS (RTX)->align \
917afb0c
RK
1179 : (STRICT_ALIGNMENT && GET_MODE (RTX) != BLKmode \
1180 ? GET_MODE_ALIGNMENT (GET_MODE (RTX)) : BITS_PER_UNIT))
3bdf5ad1 1181
a560d4d4
JH
1182/* For a REG rtx, the decl it is known to refer to, if it is known to
1183 refer to part of a DECL. */
1184#define REG_EXPR(RTX) (REG_ATTRS (RTX) == 0 ? 0 : REG_ATTRS (RTX)->decl)
1185
1186/* For a MEM rtx, the offset from the start of MEM_DECL, if known, as a
1187 RTX that is always a CONST_INT. */
1188#define REG_OFFSET(RTX) (REG_ATTRS (RTX) == 0 ? 0 : REG_ATTRS (RTX)->offset)
1189
3bdf5ad1 1190/* Copy the attributes that apply to memory locations from RHS to LHS. */
10b76d73
RK
1191#define MEM_COPY_ATTRIBUTES(LHS, RHS) \
1192 (MEM_VOLATILE_P (LHS) = MEM_VOLATILE_P (RHS), \
1193 MEM_IN_STRUCT_P (LHS) = MEM_IN_STRUCT_P (RHS), \
1194 MEM_SCALAR_P (LHS) = MEM_SCALAR_P (RHS), \
4da2eb6b 1195 MEM_NOTRAP_P (LHS) = MEM_NOTRAP_P (RHS), \
389fdba0 1196 MEM_READONLY_P (LHS) = MEM_READONLY_P (RHS), \
10b76d73 1197 MEM_KEEP_ALIAS_SET_P (LHS) = MEM_KEEP_ALIAS_SET_P (RHS), \
173b24b9 1198 MEM_ATTRS (LHS) = MEM_ATTRS (RHS))
41472af8 1199
2d4cc6a7
JJ
1200/* 1 if RTX is a label_ref to a label outside the loop containing the
1201 reference. */
1202#define LABEL_OUTSIDE_LOOP_P(RTX) \
1203 (RTL_FLAG_CHECK1("LABEL_OUTSIDE_LOOP_P", (RTX), LABEL_REF)->in_struct)
6f29feb1 1204
2d4cc6a7
JJ
1205/* 1 if RTX is a label_ref for a nonlocal label. */
1206/* Likewise in an expr_list for a reg_label note. */
1207#define LABEL_REF_NONLOCAL_P(RTX) \
1208 (RTL_FLAG_CHECK2("LABEL_REF_NONLOCAL_P", (RTX), LABEL_REF, \
1209 REG_LABEL)->volatil)
adfaf10a 1210
2d4cc6a7
JJ
1211/* 1 if RTX is a code_label that should always be considered to be needed. */
1212#define LABEL_PRESERVE_P(RTX) \
1213 (RTL_FLAG_CHECK2("LABEL_PRESERVE_P", (RTX), CODE_LABEL, NOTE)->in_struct)
6f29feb1 1214
2d4cc6a7 1215/* During sched, 1 if RTX is an insn that must be scheduled together
d45cf215 1216 with the preceding insn. */
2d4cc6a7 1217#define SCHED_GROUP_P(RTX) \
be202ec2
FS
1218 (RTL_FLAG_CHECK3("SCHED_GROUP_P", (RTX), INSN, JUMP_INSN, CALL_INSN \
1219 )->in_struct)
6f29feb1
JW
1220
1221/* For a SET rtx, SET_DEST is the place that is set
1222 and SET_SRC is the value it is set to. */
83ab3839
RH
1223#define SET_DEST(RTX) XC2EXP(RTX, 0, SET, CLOBBER)
1224#define SET_SRC(RTX) XCEXP(RTX, 1, SET)
2d4cc6a7
JJ
1225#define SET_IS_RETURN_P(RTX) \
1226 (RTL_FLAG_CHECK1("SET_IS_RETURN_P", (RTX), SET)->jump)
6f29feb1
JW
1227
1228/* For a TRAP_IF rtx, TRAP_CONDITION is an expression. */
f52eda29
GS
1229#define TRAP_CONDITION(RTX) XCEXP (RTX, 0, TRAP_IF)
1230#define TRAP_CODE(RTX) XCEXP (RTX, 1, TRAP_IF)
6f29feb1 1231
0c99ec5c
RH
1232/* For a COND_EXEC rtx, COND_EXEC_TEST is the condition to base
1233 conditionally executing the code on, COND_EXEC_CODE is the code
1234 to execute if the condition is true. */
f52eda29
GS
1235#define COND_EXEC_TEST(RTX) XCEXP (RTX, 0, COND_EXEC)
1236#define COND_EXEC_CODE(RTX) XCEXP (RTX, 1, COND_EXEC)
0c99ec5c 1237
2adb9af1
RH
1238/* 1 if RTX is a symbol_ref that addresses this function's rtl
1239 constants pool. */
2d4cc6a7
JJ
1240#define CONSTANT_POOL_ADDRESS_P(RTX) \
1241 (RTL_FLAG_CHECK1("CONSTANT_POOL_ADDRESS_P", (RTX), SYMBOL_REF)->unchanging)
6f29feb1 1242
2adb9af1
RH
1243/* 1 if RTX is a symbol_ref that addresses a value in the file's
1244 tree constant pool. This information is private to varasm.c. */
1245#define TREE_CONSTANT_POOL_ADDRESS_P(RTX) \
1246 (RTL_FLAG_CHECK1("TREE_CONSTANT_POOL_ADDRESS_P", \
1247 (RTX), SYMBOL_REF)->frame_related)
bd7cf17e 1248
2d4cc6a7
JJ
1249/* Used if RTX is a symbol_ref, for machine-specific purposes. */
1250#define SYMBOL_REF_FLAG(RTX) \
1251 (RTL_FLAG_CHECK1("SYMBOL_REF_FLAG", (RTX), SYMBOL_REF)->volatil)
6f29feb1 1252
2d4cc6a7
JJ
1253/* 1 if RTX is a symbol_ref that has been the library function in
1254 emit_library_call. */
1255#define SYMBOL_REF_USED(RTX) \
1256 (RTL_FLAG_CHECK1("SYMBOL_REF_USED", (RTX), SYMBOL_REF)->used)
6f29feb1 1257
2d4cc6a7
JJ
1258/* 1 if RTX is a symbol_ref for a weak symbol. */
1259#define SYMBOL_REF_WEAK(RTX) \
6de9cd9a 1260 (RTL_FLAG_CHECK1("SYMBOL_REF_WEAK", (RTX), SYMBOL_REF)->return_val)
ff0b6b99 1261
c185c797
RS
1262/* A pointer attached to the SYMBOL_REF; either SYMBOL_REF_DECL or
1263 SYMBOL_REF_CONSTANT. */
929e5e5b
RS
1264#define SYMBOL_REF_DATA(RTX) X0ANY ((RTX), 2)
1265
1266/* Set RTX's SYMBOL_REF_DECL to DECL. RTX must not be a constant
1267 pool symbol. */
1268#define SET_SYMBOL_REF_DECL(RTX, DECL) \
1269 (gcc_assert (!CONSTANT_POOL_ADDRESS_P (RTX)), X0TREE ((RTX), 2) = (DECL))
c185c797 1270
32a61907 1271/* The tree (decl or constant) associated with the symbol, or null. */
c185c797
RS
1272#define SYMBOL_REF_DECL(RTX) \
1273 (CONSTANT_POOL_ADDRESS_P (RTX) ? NULL : X0TREE ((RTX), 2))
1274
929e5e5b
RS
1275/* Set RTX's SYMBOL_REF_CONSTANT to C. RTX must be a constant pool symbol. */
1276#define SET_SYMBOL_REF_CONSTANT(RTX, C) \
1277 (gcc_assert (CONSTANT_POOL_ADDRESS_P (RTX)), X0CONSTANT ((RTX), 2) = (C))
1278
c185c797
RS
1279/* The rtx constant pool entry for a symbol, or null. */
1280#define SYMBOL_REF_CONSTANT(RTX) \
1281 (CONSTANT_POOL_ADDRESS_P (RTX) ? X0CONSTANT ((RTX), 2) : NULL)
52859c77
RH
1282
1283/* A set of flags on a symbol_ref that are, in some respects, redundant with
1284 information derivable from the tree decl associated with this symbol.
1285 Except that we build a *lot* of SYMBOL_REFs that aren't associated with a
1286 decl. In some cases this is a bug. But beyond that, it's nice to cache
1287 this information to avoid recomputing it. Finally, this allows space for
1288 the target to store more than one bit of information, as with
1289 SYMBOL_REF_FLAG. */
1290#define SYMBOL_REF_FLAGS(RTX) X0INT ((RTX), 1)
1291
1292/* These flags are common enough to be defined for all targets. They
1293 are computed by the default version of targetm.encode_section_info. */
1294
1295/* Set if this symbol is a function. */
1296#define SYMBOL_FLAG_FUNCTION (1 << 0)
1297#define SYMBOL_REF_FUNCTION_P(RTX) \
1298 ((SYMBOL_REF_FLAGS (RTX) & SYMBOL_FLAG_FUNCTION) != 0)
1299/* Set if targetm.binds_local_p is true. */
1300#define SYMBOL_FLAG_LOCAL (1 << 1)
1301#define SYMBOL_REF_LOCAL_P(RTX) \
1302 ((SYMBOL_REF_FLAGS (RTX) & SYMBOL_FLAG_LOCAL) != 0)
1303/* Set if targetm.in_small_data_p is true. */
1304#define SYMBOL_FLAG_SMALL (1 << 2)
1305#define SYMBOL_REF_SMALL_P(RTX) \
1306 ((SYMBOL_REF_FLAGS (RTX) & SYMBOL_FLAG_SMALL) != 0)
1307/* The three-bit field at [5:3] is true for TLS variables; use
1308 SYMBOL_REF_TLS_MODEL to extract the field as an enum tls_model. */
1309#define SYMBOL_FLAG_TLS_SHIFT 3
1310#define SYMBOL_REF_TLS_MODEL(RTX) \
629f6514 1311 ((enum tls_model) ((SYMBOL_REF_FLAGS (RTX) >> SYMBOL_FLAG_TLS_SHIFT) & 7))
52859c77
RH
1312/* Set if this symbol is not defined in this translation unit. */
1313#define SYMBOL_FLAG_EXTERNAL (1 << 6)
1314#define SYMBOL_REF_EXTERNAL_P(RTX) \
1315 ((SYMBOL_REF_FLAGS (RTX) & SYMBOL_FLAG_EXTERNAL) != 0)
aacd3885 1316/* Set if this symbol has a block_symbol structure associated with it. */
3fa9c136
RS
1317#define SYMBOL_FLAG_HAS_BLOCK_INFO (1 << 7)
1318#define SYMBOL_REF_HAS_BLOCK_INFO_P(RTX) \
1319 ((SYMBOL_REF_FLAGS (RTX) & SYMBOL_FLAG_HAS_BLOCK_INFO) != 0)
aacd3885 1320/* Set if this symbol is a section anchor. SYMBOL_REF_ANCHOR_P implies
3fa9c136 1321 SYMBOL_REF_HAS_BLOCK_INFO_P. */
aacd3885
RS
1322#define SYMBOL_FLAG_ANCHOR (1 << 8)
1323#define SYMBOL_REF_ANCHOR_P(RTX) \
1324 ((SYMBOL_REF_FLAGS (RTX) & SYMBOL_FLAG_ANCHOR) != 0)
52859c77
RH
1325
1326/* Subsequent bits are available for the target to use. */
aacd3885 1327#define SYMBOL_FLAG_MACH_DEP_SHIFT 9
89e6b702 1328#define SYMBOL_FLAG_MACH_DEP (1 << SYMBOL_FLAG_MACH_DEP_SHIFT)
52859c77 1329
3fa9c136
RS
1330/* If SYMBOL_REF_HAS_BLOCK_INFO_P (RTX), this is the object_block
1331 structure to which the symbol belongs, or NULL if it has not been
1332 assigned a block. */
aacd3885
RS
1333#define SYMBOL_REF_BLOCK(RTX) (BLOCK_SYMBOL_CHECK (RTX)->block)
1334
3fa9c136
RS
1335/* If SYMBOL_REF_HAS_BLOCK_INFO_P (RTX), this is the offset of RTX from
1336 the first object in SYMBOL_REF_BLOCK (RTX). The value is negative if
1337 RTX has not yet been assigned to a block, or it has not been given an
1338 offset within that block. */
aacd3885
RS
1339#define SYMBOL_REF_BLOCK_OFFSET(RTX) (BLOCK_SYMBOL_CHECK (RTX)->offset)
1340
6f29feb1
JW
1341/* Define a macro to look for REG_INC notes,
1342 but save time on machines where they never exist. */
1343
58e54c44 1344#if (defined (HAVE_PRE_INCREMENT) || defined (HAVE_PRE_DECREMENT) || defined (HAVE_POST_INCREMENT) || defined (HAVE_POST_DECREMENT))
f52eda29
GS
1345#define FIND_REG_INC_NOTE(INSN, REG) \
1346 ((REG) != NULL_RTX && REG_P ((REG)) \
1347 ? find_regno_note ((INSN), REG_INC, REGNO (REG)) \
1348 : find_reg_note ((INSN), REG_INC, (REG)))
6f29feb1 1349#else
f52eda29 1350#define FIND_REG_INC_NOTE(INSN, REG) 0
6f29feb1
JW
1351#endif
1352
1353/* Indicate whether the machine has any sort of auto increment addressing.
1354 If not, we can avoid checking for REG_INC notes. */
1355
58e54c44 1356#if (defined (HAVE_PRE_INCREMENT) || defined (HAVE_PRE_DECREMENT) || defined (HAVE_POST_INCREMENT) || defined (HAVE_POST_DECREMENT))
6f29feb1
JW
1357#define AUTO_INC_DEC
1358#endif
0dfa1860 1359
940da324
JL
1360#ifndef HAVE_PRE_INCREMENT
1361#define HAVE_PRE_INCREMENT 0
1362#endif
1363
1364#ifndef HAVE_PRE_DECREMENT
1365#define HAVE_PRE_DECREMENT 0
1366#endif
1367
1368#ifndef HAVE_POST_INCREMENT
1369#define HAVE_POST_INCREMENT 0
1370#endif
1371
1372#ifndef HAVE_POST_DECREMENT
1373#define HAVE_POST_DECREMENT 0
1374#endif
1375
4b983fdc
RH
1376#ifndef HAVE_POST_MODIFY_DISP
1377#define HAVE_POST_MODIFY_DISP 0
1378#endif
1379
1380#ifndef HAVE_POST_MODIFY_REG
1381#define HAVE_POST_MODIFY_REG 0
1382#endif
1383
1384#ifndef HAVE_PRE_MODIFY_DISP
1385#define HAVE_PRE_MODIFY_DISP 0
1386#endif
1387
1388#ifndef HAVE_PRE_MODIFY_REG
1389#define HAVE_PRE_MODIFY_REG 0
1390#endif
1391
6e01bd94
MH
1392
1393/* Some architectures do not have complete pre/post increment/decrement
1394 instruction sets, or only move some modes efficiently. These macros
1395 allow us to tune autoincrement generation. */
1396
1397#ifndef USE_LOAD_POST_INCREMENT
1398#define USE_LOAD_POST_INCREMENT(MODE) HAVE_POST_INCREMENT
1399#endif
1400
1401#ifndef USE_LOAD_POST_DECREMENT
1402#define USE_LOAD_POST_DECREMENT(MODE) HAVE_POST_DECREMENT
1403#endif
1404
1405#ifndef USE_LOAD_PRE_INCREMENT
1406#define USE_LOAD_PRE_INCREMENT(MODE) HAVE_PRE_INCREMENT
1407#endif
1408
1409#ifndef USE_LOAD_PRE_DECREMENT
1410#define USE_LOAD_PRE_DECREMENT(MODE) HAVE_PRE_DECREMENT
1411#endif
1412
1413#ifndef USE_STORE_POST_INCREMENT
1414#define USE_STORE_POST_INCREMENT(MODE) HAVE_POST_INCREMENT
1415#endif
1416
1417#ifndef USE_STORE_POST_DECREMENT
1418#define USE_STORE_POST_DECREMENT(MODE) HAVE_POST_DECREMENT
1419#endif
1420
1421#ifndef USE_STORE_PRE_INCREMENT
1422#define USE_STORE_PRE_INCREMENT(MODE) HAVE_PRE_INCREMENT
1423#endif
1424
1425#ifndef USE_STORE_PRE_DECREMENT
1426#define USE_STORE_PRE_DECREMENT(MODE) HAVE_PRE_DECREMENT
1427#endif
6f29feb1 1428\f
1b3d8f8a
GK
1429/* Nonzero when we are generating CONCATs. */
1430extern int generating_concat_p;
1431
4586b4ca
SB
1432/* Nonzero when we are expanding trees to RTL. */
1433extern int currently_expanding_to_rtl;
1434
6f29feb1
JW
1435/* Generally useful functions. */
1436
ac957f13 1437/* In expmed.c */
0c20a65f 1438extern int ceil_log2 (unsigned HOST_WIDE_INT);
5f4f0e22 1439
5f2d6cfa 1440/* In builtins.c */
4682ae04 1441extern rtx expand_builtin_expect_jump (tree, rtx, rtx);
5f2d6cfa 1442
50b2596f 1443/* In explow.c */
0c20a65f
AJ
1444extern void set_stack_check_libfunc (rtx);
1445extern HOST_WIDE_INT trunc_int_for_mode (HOST_WIDE_INT, enum machine_mode);
3e95a7cb 1446extern rtx plus_constant (rtx, HOST_WIDE_INT);
5f4f0e22 1447
4eb00163 1448/* In emit-rtl.c */
0c20a65f
AJ
1449extern rtvec gen_rtvec (int, ...);
1450extern rtx copy_insn_1 (rtx);
1451extern rtx copy_insn (rtx);
1452extern rtx gen_int_mode (HOST_WIDE_INT, enum machine_mode);
1453extern rtx emit_copy_of_insn_after (rtx, rtx);
1454extern void set_reg_attrs_from_mem (rtx, rtx);
1455extern void set_mem_attrs_from_reg (rtx, rtx);
1456extern void set_reg_attrs_for_parm (rtx, rtx);
2b3493c8 1457extern int mem_expr_equal_p (tree, tree);
4eb00163
JO
1458
1459/* In rtl.c */
b9dcdee4
JH
1460extern rtx rtx_alloc_stat (RTX_CODE MEM_STAT_DECL);
1461#define rtx_alloc(c) rtx_alloc_stat (c MEM_STAT_INFO)
1462
0c20a65f
AJ
1463extern rtvec rtvec_alloc (int);
1464extern rtx copy_rtx (rtx);
439a7e54 1465extern void dump_rtx_statistics (void);
4eb00163
JO
1466
1467/* In emit-rtl.c */
0c20a65f 1468extern rtx copy_rtx_if_shared (rtx);
4eb00163
JO
1469
1470/* In rtl.c */
aacd3885 1471extern unsigned int rtx_size (rtx);
b9dcdee4
JH
1472extern rtx shallow_copy_rtx_stat (rtx MEM_STAT_DECL);
1473#define shallow_copy_rtx(a) shallow_copy_rtx_stat (a MEM_STAT_INFO)
0c20a65f 1474extern int rtx_equal_p (rtx, rtx);
4eb00163
JO
1475
1476/* In emit-rtl.c */
0c20a65f
AJ
1477extern rtvec gen_rtvec_v (int, rtx *);
1478extern rtx gen_reg_rtx (enum machine_mode);
1479extern rtx gen_rtx_REG_offset (rtx, enum machine_mode, unsigned int, int);
1480extern rtx gen_label_rtx (void);
0c20a65f 1481extern rtx gen_lowpart_common (enum machine_mode, rtx);
4eb00163
JO
1482
1483/* In cse.c */
0c20a65f 1484extern rtx gen_lowpart_if_possible (enum machine_mode, rtx);
4eb00163
JO
1485
1486/* In emit-rtl.c */
0c20a65f
AJ
1487extern rtx gen_highpart (enum machine_mode, rtx);
1488extern rtx gen_highpart_mode (enum machine_mode, enum machine_mode, rtx);
0c20a65f 1489extern rtx operand_subword (rtx, unsigned int, int, enum machine_mode);
4eb00163
JO
1490
1491/* In emit-rtl.c */
0c20a65f
AJ
1492extern rtx operand_subword_force (rtx, unsigned int, enum machine_mode);
1493extern int subreg_lowpart_p (rtx);
1494extern unsigned int subreg_lowpart_offset (enum machine_mode,
1495 enum machine_mode);
1496extern unsigned int subreg_highpart_offset (enum machine_mode,
1497 enum machine_mode);
1498extern rtx make_safe_from (rtx, rtx);
1499extern rtx convert_memory_address (enum machine_mode, rtx);
1500extern rtx get_insns (void);
1501extern const char *get_insn_name (int);
1502extern rtx get_last_insn (void);
1503extern rtx get_last_insn_anywhere (void);
1504extern rtx get_first_nonnote_insn (void);
1505extern rtx get_last_nonnote_insn (void);
1506extern void start_sequence (void);
1507extern void push_to_sequence (rtx);
1508extern void end_sequence (void);
0c20a65f
AJ
1509extern rtx immed_double_const (HOST_WIDE_INT, HOST_WIDE_INT,
1510 enum machine_mode);
550d1387 1511
a82bbcbb
ZD
1512/* In loop-iv.c */
1513
1514extern rtx lowpart_subreg (enum machine_mode, rtx, enum machine_mode);
1515
550d1387 1516/* In varasm.c */
0c20a65f 1517extern rtx force_const_mem (enum machine_mode, rtx);
4eb00163 1518
4eb00163 1519/* In varasm.c */
7e7ec48e
ZW
1520
1521struct function;
0c20a65f
AJ
1522extern rtx get_pool_constant (rtx);
1523extern rtx get_pool_constant_mark (rtx, bool *);
1524extern enum machine_mode get_pool_mode (rtx);
0c20a65f 1525extern rtx simplify_subtraction (rtx);
4eb00163
JO
1526
1527/* In function.c */
0c20a65f
AJ
1528extern rtx assign_stack_local (enum machine_mode, HOST_WIDE_INT, int);
1529extern rtx assign_stack_temp (enum machine_mode, HOST_WIDE_INT, int);
1530extern rtx assign_stack_temp_for_type (enum machine_mode,
1531 HOST_WIDE_INT, int, tree);
1532extern rtx assign_temp (tree, int, int, int);
fd3acbb3 1533
4eb00163 1534/* In emit-rtl.c */
0c20a65f 1535extern rtx emit_insn_before (rtx, rtx);
a7102479 1536extern rtx emit_insn_before_noloc (rtx, rtx);
0c20a65f
AJ
1537extern rtx emit_insn_before_setloc (rtx, rtx, int);
1538extern rtx emit_jump_insn_before (rtx, rtx);
a7102479 1539extern rtx emit_jump_insn_before_noloc (rtx, rtx);
0c20a65f
AJ
1540extern rtx emit_jump_insn_before_setloc (rtx, rtx, int);
1541extern rtx emit_call_insn_before (rtx, rtx);
a7102479 1542extern rtx emit_call_insn_before_noloc (rtx, rtx);
0c20a65f
AJ
1543extern rtx emit_call_insn_before_setloc (rtx, rtx, int);
1544extern rtx emit_barrier_before (rtx);
1545extern rtx emit_label_before (rtx, rtx);
1546extern rtx emit_note_before (int, rtx);
1547extern rtx emit_insn_after (rtx, rtx);
a7102479 1548extern rtx emit_insn_after_noloc (rtx, rtx);
0c20a65f
AJ
1549extern rtx emit_insn_after_setloc (rtx, rtx, int);
1550extern rtx emit_jump_insn_after (rtx, rtx);
a7102479 1551extern rtx emit_jump_insn_after_noloc (rtx, rtx);
0c20a65f
AJ
1552extern rtx emit_jump_insn_after_setloc (rtx, rtx, int);
1553extern rtx emit_call_insn_after (rtx, rtx);
a7102479 1554extern rtx emit_call_insn_after_noloc (rtx, rtx);
0c20a65f
AJ
1555extern rtx emit_call_insn_after_setloc (rtx, rtx, int);
1556extern rtx emit_barrier_after (rtx);
1557extern rtx emit_label_after (rtx, rtx);
1558extern rtx emit_note_after (int, rtx);
1559extern rtx emit_note_copy_after (rtx, rtx);
1560extern rtx emit_insn (rtx);
1561extern rtx emit_jump_insn (rtx);
1562extern rtx emit_call_insn (rtx);
1563extern rtx emit_label (rtx);
1564extern rtx emit_barrier (void);
1565extern rtx emit_note (int);
1566extern rtx emit_note_copy (rtx);
0cea056b 1567extern rtx emit_line_note (location_t);
0c20a65f 1568extern rtx make_insn_raw (rtx);
38109dab 1569extern rtx make_jump_insn_raw (rtx);
0c20a65f
AJ
1570extern void add_function_usage_to (rtx, rtx);
1571extern rtx last_call_insn (void);
1572extern rtx previous_insn (rtx);
1573extern rtx next_insn (rtx);
1574extern rtx prev_nonnote_insn (rtx);
1575extern rtx next_nonnote_insn (rtx);
1576extern rtx prev_real_insn (rtx);
1577extern rtx next_real_insn (rtx);
1578extern rtx prev_active_insn (rtx);
1579extern rtx next_active_insn (rtx);
1580extern int active_insn_p (rtx);
1581extern rtx prev_label (rtx);
1582extern rtx next_label (rtx);
6c2511d3 1583extern rtx skip_consecutive_labels (rtx);
0c20a65f
AJ
1584extern rtx next_cc0_user (rtx);
1585extern rtx prev_cc0_setter (rtx);
4eb00163 1586
1292ec0c 1587/* In cfglayout.c */
0c20a65f
AJ
1588extern int insn_line (rtx);
1589extern const char * insn_file (rtx);
9ae130f8
JH
1590extern int locator_line (int);
1591extern const char * locator_file (int);
0435312e 1592extern int prologue_locator, epilogue_locator;
1292ec0c 1593
4eb00163 1594/* In jump.c */
0c20a65f
AJ
1595extern enum rtx_code reverse_condition (enum rtx_code);
1596extern enum rtx_code reverse_condition_maybe_unordered (enum rtx_code);
1597extern enum rtx_code swap_condition (enum rtx_code);
1598extern enum rtx_code unsigned_condition (enum rtx_code);
1599extern enum rtx_code signed_condition (enum rtx_code);
1600extern void mark_jump_label (rtx, rtx, int);
c2924966 1601extern unsigned int cleanup_barriers (void);
4eb00163 1602
4eb00163 1603/* In jump.c */
0c20a65f
AJ
1604extern bool squeeze_notes (rtx *, rtx *);
1605extern rtx delete_related_insns (rtx);
1606extern void delete_jump (rtx);
0c20a65f
AJ
1607extern rtx get_label_before (rtx);
1608extern rtx get_label_after (rtx);
1609extern rtx follow_jumps (rtx);
4eb00163
JO
1610
1611/* In recog.c */
0c20a65f 1612extern rtx *find_constant_term_loc (rtx *);
4eb00163
JO
1613
1614/* In emit-rtl.c */
0c20a65f 1615extern rtx try_split (rtx, rtx, int);
6b24c259 1616extern int split_branch_probability;
4eb00163
JO
1617
1618/* In unknown file */
0c20a65f 1619extern rtx split_insns (rtx, rtx);
4eb00163
JO
1620
1621/* In simplify-rtx.c */
0a67e02c
PB
1622extern rtx simplify_const_unary_operation (enum rtx_code, enum machine_mode,
1623 rtx, enum machine_mode);
0c20a65f
AJ
1624extern rtx simplify_unary_operation (enum rtx_code, enum machine_mode, rtx,
1625 enum machine_mode);
0a67e02c
PB
1626extern rtx simplify_const_binary_operation (enum rtx_code, enum machine_mode,
1627 rtx, rtx);
0c20a65f
AJ
1628extern rtx simplify_binary_operation (enum rtx_code, enum machine_mode, rtx,
1629 rtx);
1630extern rtx simplify_ternary_operation (enum rtx_code, enum machine_mode,
1631 enum machine_mode, rtx, rtx, rtx);
7ce3e360
RS
1632extern rtx simplify_const_relational_operation (enum rtx_code,
1633 enum machine_mode, rtx, rtx);
0c20a65f 1634extern rtx simplify_relational_operation (enum rtx_code, enum machine_mode,
7ce3e360 1635 enum machine_mode, rtx, rtx);
0c20a65f
AJ
1636extern rtx simplify_gen_binary (enum rtx_code, enum machine_mode, rtx, rtx);
1637extern rtx simplify_gen_unary (enum rtx_code, enum machine_mode, rtx,
1638 enum machine_mode);
1639extern rtx simplify_gen_ternary (enum rtx_code, enum machine_mode,
1640 enum machine_mode, rtx, rtx, rtx);
1641extern rtx simplify_gen_relational (enum rtx_code, enum machine_mode,
1642 enum machine_mode, rtx, rtx);
1643extern rtx simplify_subreg (enum machine_mode, rtx, enum machine_mode,
1644 unsigned int);
1645extern rtx simplify_gen_subreg (enum machine_mode, rtx, enum machine_mode,
1646 unsigned int);
1647extern rtx simplify_replace_rtx (rtx, rtx, rtx);
1648extern rtx simplify_rtx (rtx);
1649extern rtx avoid_constant_pool_reference (rtx);
1c653a41 1650extern bool constant_pool_reference_p (rtx x);
b757b9f8 1651extern bool mode_signbit_p (enum machine_mode, rtx);
4eb00163 1652
4eb00163 1653/* In regclass.c */
fee226d2
R
1654extern enum machine_mode choose_hard_reg_mode (unsigned int, unsigned int,
1655 bool);
4eb00163
JO
1656
1657/* In emit-rtl.c */
0c20a65f 1658extern rtx set_unique_reg_note (rtx, enum reg_note, rtx);
9ae8ffe7 1659
e9a25f70
JL
1660/* Functions in rtlanal.c */
1661
b1cdafbb
JH
1662/* Single set is implemented as macro for performance reasons. */
1663#define single_set(I) (INSN_P (I) \
1664 ? (GET_CODE (PATTERN (I)) == SET \
1665 ? PATTERN (I) : single_set_1 (I)) \
1666 : NULL_RTX)
2130b7fb 1667#define single_set_1(I) single_set_2 (I, PATTERN (I))
b1cdafbb 1668
39811184 1669/* Structure used for passing data to REPLACE_LABEL. */
4af16369 1670typedef struct replace_label_data
39811184
JZ
1671{
1672 rtx r1;
1673 rtx r2;
4af16369
JZ
1674 bool update_label_nuses;
1675} replace_label_data;
39811184 1676
0c20a65f
AJ
1677extern int rtx_addr_can_trap_p (rtx);
1678extern bool nonzero_address_p (rtx);
1679extern int rtx_unstable_p (rtx);
1680extern int rtx_varies_p (rtx, int);
1681extern int rtx_addr_varies_p (rtx, int);
1682extern HOST_WIDE_INT get_integer_term (rtx);
1683extern rtx get_related_value (rtx);
0c20a65f
AJ
1684extern int reg_mentioned_p (rtx, rtx);
1685extern int count_occurrences (rtx, rtx, int);
1686extern int reg_referenced_p (rtx, rtx);
1687extern int reg_used_between_p (rtx, rtx, rtx);
0c20a65f 1688extern int reg_set_between_p (rtx, rtx, rtx);
0c20a65f
AJ
1689extern int commutative_operand_precedence (rtx);
1690extern int swap_commutative_operands_p (rtx, rtx);
1691extern int modified_between_p (rtx, rtx, rtx);
1692extern int no_labels_between_p (rtx, rtx);
0c20a65f 1693extern int modified_in_p (rtx, rtx);
0c20a65f
AJ
1694extern int reg_set_p (rtx, rtx);
1695extern rtx single_set_2 (rtx, rtx);
1696extern int multiple_sets (rtx);
1697extern int set_noop_p (rtx);
1698extern int noop_move_p (rtx);
1699extern rtx find_last_value (rtx, rtx *, rtx, int);
1700extern int refers_to_regno_p (unsigned int, unsigned int, rtx, rtx *);
1701extern int reg_overlap_mentioned_p (rtx, rtx);
1702extern rtx set_of (rtx, rtx);
1703extern void note_stores (rtx, void (*) (rtx, rtx, void *), void *);
1704extern void note_uses (rtx *, void (*) (rtx *, void *), void *);
0c20a65f
AJ
1705extern int dead_or_set_p (rtx, rtx);
1706extern int dead_or_set_regno_p (rtx, unsigned int);
1707extern rtx find_reg_note (rtx, enum reg_note, rtx);
1708extern rtx find_regno_note (rtx, enum reg_note, unsigned int);
1709extern rtx find_reg_equal_equiv_note (rtx);
1710extern int find_reg_fusage (rtx, enum rtx_code, rtx);
1711extern int find_regno_fusage (rtx, enum rtx_code, unsigned int);
1712extern int pure_call_p (rtx);
1713extern void remove_note (rtx, rtx);
1714extern int side_effects_p (rtx);
1715extern int volatile_refs_p (rtx);
1716extern int volatile_insn_p (rtx);
1717extern int may_trap_p (rtx);
e755fcf5 1718extern int may_trap_after_code_motion_p (rtx);
2358ff91 1719extern int may_trap_or_fault_p (rtx);
0c20a65f
AJ
1720extern int inequality_comparisons_p (rtx);
1721extern rtx replace_rtx (rtx, rtx, rtx);
0c20a65f
AJ
1722extern int replace_label (rtx *, void *);
1723extern int rtx_referenced_p (rtx, rtx);
1724extern bool tablejump_p (rtx, rtx *, rtx *);
1725extern int computed_jump_p (rtx);
1726typedef int (*rtx_function) (rtx *, void *);
1727extern int for_each_rtx (rtx *, rtx_function, void *);
1728extern rtx regno_use_in (unsigned int, rtx);
1729extern int auto_inc_p (rtx);
1730extern int in_expr_list_p (rtx, rtx);
1731extern void remove_node_from_expr_list (rtx, rtx *);
0c20a65f
AJ
1732extern int loc_mentioned_in_p (rtx *, rtx);
1733extern rtx find_first_parameter_load (rtx, rtx);
1734extern bool keep_with_call_p (rtx);
432f982f 1735extern bool label_is_jump_target_p (rtx, rtx);
6fd21094 1736extern int insn_rtx_cost (rtx);
6f29feb1 1737
75473b02
SB
1738/* Given an insn and condition, return a canonical description of
1739 the test being made. */
1740extern rtx canonicalize_condition (rtx, rtx, int, rtx *, rtx, int, int);
1741
1742/* Given a JUMP_INSN, return a canonical description of the test
1743 being made. */
1744extern rtx get_condition (rtx, rtx *, int, int);
1745
1746
ae0b51ef
JL
1747/* flow.c */
1748
0c20a65f 1749extern rtx find_use_as_address (rtx, rtx, HOST_WIDE_INT);
e2500fed
GK
1750
1751/* lists.c */
1752
3d7aafde
AJ
1753void free_EXPR_LIST_list (rtx *);
1754void free_INSN_LIST_list (rtx *);
1755void free_EXPR_LIST_node (rtx);
1756void free_INSN_LIST_node (rtx);
1757rtx alloc_INSN_LIST (rtx, rtx);
1758rtx alloc_EXPR_LIST (int, rtx, rtx);
ddbd5439 1759void free_DEPS_LIST_list (rtx *);
c7ec5472 1760rtx alloc_DEPS_LIST (rtx, rtx, int);
ddbd5439 1761void remove_free_DEPS_LIST_elem (rtx, rtx *);
63f54b1a
MK
1762void remove_free_INSN_LIST_elem (rtx, rtx *);
1763rtx remove_list_elem (rtx, rtx *);
496d7bb0 1764rtx copy_DEPS_LIST_list (rtx);
ae0b51ef
JL
1765
1766/* regclass.c */
1767
6f29feb1 1768/* Maximum number of parallel sets and clobbers in any insn in this fn.
d91edf86 1769 Always at least 3, since the combiner could put that many together
6f29feb1
JW
1770 and we want this to remain correct for all the remaining passes. */
1771
1772extern int max_parallel;
1773
e0c6d139 1774/* Free up register info memory. */
0c20a65f 1775extern void free_reg_info (void);
e0c6d139 1776
ae0b51ef 1777/* recog.c */
0c20a65f
AJ
1778extern int asm_noperands (rtx);
1779extern const char *decode_asm_operands (rtx, rtx *, rtx **, const char **,
1780 enum machine_mode *);
6f29feb1 1781
0c20a65f
AJ
1782extern enum reg_class reg_preferred_class (int);
1783extern enum reg_class reg_alternate_class (int);
6f29feb1 1784
0c20a65f 1785extern void split_all_insns (int);
c2924966 1786extern unsigned int split_all_insns_noflow (void);
6a73406e 1787
68d75312 1788#define MAX_SAVED_CONST_INT 64
e2500fed 1789extern GTY(()) rtx const_int_rtx[MAX_SAVED_CONST_INT * 2 + 1];
68d75312 1790
5da077de
AS
1791#define const0_rtx (const_int_rtx[MAX_SAVED_CONST_INT])
1792#define const1_rtx (const_int_rtx[MAX_SAVED_CONST_INT+1])
1793#define const2_rtx (const_int_rtx[MAX_SAVED_CONST_INT+2])
1794#define constm1_rtx (const_int_rtx[MAX_SAVED_CONST_INT-1])
e2500fed 1795extern GTY(()) rtx const_true_rtx;
a8efe40d 1796
e2500fed 1797extern GTY(()) rtx const_tiny_rtx[3][(int) MAX_MACHINE_MODE];
a8efe40d 1798
f590cca1 1799/* Returns a constant 0 rtx in mode MODE. Integer modes are treated the
a8efe40d
RK
1800 same as VOIDmode. */
1801
1802#define CONST0_RTX(MODE) (const_tiny_rtx[0][(int) (MODE)])
1803
1804/* Likewise, for the constants 1 and 2. */
1805
1806#define CONST1_RTX(MODE) (const_tiny_rtx[1][(int) (MODE)])
1807#define CONST2_RTX(MODE) (const_tiny_rtx[2][(int) (MODE)])
6f29feb1 1808
5da077de
AS
1809/* If HARD_FRAME_POINTER_REGNUM is defined, then a special dummy reg
1810 is used to represent the frame pointer. This is because the
1811 hard frame pointer and the automatic variables are separated by an amount
1812 that cannot be determined until after register allocation. We can assume
1813 that in this case ELIMINABLE_REGS will be defined, one action of which
eebedaa5 1814 will be to eliminate FRAME_POINTER_REGNUM into HARD_FRAME_POINTER_REGNUM. */
5da077de
AS
1815#ifndef HARD_FRAME_POINTER_REGNUM
1816#define HARD_FRAME_POINTER_REGNUM FRAME_POINTER_REGNUM
1817#endif
1818
1819/* Index labels for global_rtl. */
1820enum global_rtl_index
68d75312 1821{
5da077de
AS
1822 GR_PC,
1823 GR_CC0,
1824 GR_STACK_POINTER,
1825 GR_FRAME_POINTER,
1826/* For register elimination to work properly these hard_frame_pointer_rtx,
1827 frame_pointer_rtx, and arg_pointer_rtx must be the same if they refer to
1828 the same register. */
1829#if FRAME_POINTER_REGNUM == ARG_POINTER_REGNUM
1830 GR_ARG_POINTER = GR_FRAME_POINTER,
1831#endif
1832#if HARD_FRAME_POINTER_REGNUM == FRAME_POINTER_REGNUM
1833 GR_HARD_FRAME_POINTER = GR_FRAME_POINTER,
1834#else
1835 GR_HARD_FRAME_POINTER,
1836#endif
1837#if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
1838#if HARD_FRAME_POINTER_REGNUM == ARG_POINTER_REGNUM
1839 GR_ARG_POINTER = GR_HARD_FRAME_POINTER,
1840#else
1841 GR_ARG_POINTER,
1842#endif
1843#endif
1844 GR_VIRTUAL_INCOMING_ARGS,
1845 GR_VIRTUAL_STACK_ARGS,
1846 GR_VIRTUAL_STACK_DYNAMIC,
1847 GR_VIRTUAL_OUTGOING_ARGS,
1848 GR_VIRTUAL_CFA,
1849
1850 GR_MAX
1851};
1852
1853/* Pointers to standard pieces of rtx are stored here. */
e2500fed 1854extern GTY(()) rtx global_rtl[GR_MAX];
5da077de
AS
1855
1856/* Standard pieces of rtx, to be substituted directly into things. */
1857#define pc_rtx (global_rtl[GR_PC])
1858#define cc0_rtx (global_rtl[GR_CC0])
68d75312 1859
6f29feb1
JW
1860/* All references to certain hard regs, except those created
1861 by allocating pseudo regs into them (when that's possible),
1862 go through these unique rtx objects. */
5da077de
AS
1863#define stack_pointer_rtx (global_rtl[GR_STACK_POINTER])
1864#define frame_pointer_rtx (global_rtl[GR_FRAME_POINTER])
1865#define hard_frame_pointer_rtx (global_rtl[GR_HARD_FRAME_POINTER])
1866#define arg_pointer_rtx (global_rtl[GR_ARG_POINTER])
68d75312 1867
e2500fed 1868extern GTY(()) rtx pic_offset_table_rtx;
e2500fed
GK
1869extern GTY(()) rtx static_chain_rtx;
1870extern GTY(()) rtx static_chain_incoming_rtx;
1871extern GTY(()) rtx return_address_pointer_rtx;
3b80f6ca
RH
1872
1873/* Include the RTL generation functions. */
1874
7e7ec48e 1875#ifndef GENERATOR_FILE
3b80f6ca 1876#include "genrtl.h"
c1667470
PB
1877#ifndef USE_MAPPED_LOCATION
1878#undef gen_rtx_ASM_OPERANDS
1879#define gen_rtx_ASM_OPERANDS(MODE, ARG0, ARG1, ARG2, ARG3, ARG4, LOC) \
1880 gen_rtx_fmt_ssiEEsi (ASM_OPERANDS, (MODE), (ARG0), (ARG1), (ARG2), (ARG3), (ARG4), (LOC).file, (LOC).line)
1881#endif
3b80f6ca
RH
1882#endif
1883
41472af8
MM
1884/* There are some RTL codes that require special attention; the
1885 generation functions included above do the raw handling. If you
a2a8cc44 1886 add to this list, modify special_rtx in gengenrtl.c as well. */
3b80f6ca 1887
0c20a65f
AJ
1888extern rtx gen_rtx_CONST_INT (enum machine_mode, HOST_WIDE_INT);
1889extern rtx gen_rtx_CONST_VECTOR (enum machine_mode, rtvec);
1890extern rtx gen_raw_REG (enum machine_mode, int);
1891extern rtx gen_rtx_REG (enum machine_mode, unsigned);
1892extern rtx gen_rtx_SUBREG (enum machine_mode, rtx, int);
1893extern rtx gen_rtx_MEM (enum machine_mode, rtx);
3b80f6ca 1894
3e95a7cb 1895#define GEN_INT(N) gen_rtx_CONST_INT (VOIDmode, (N))
3b80f6ca 1896
6f29feb1
JW
1897/* Virtual registers are used during RTL generation to refer to locations into
1898 the stack frame when the actual location isn't known until RTL generation
1899 is complete. The routine instantiate_virtual_regs replaces these with
1900 the proper value, which is normally {frame,arg,stack}_pointer_rtx plus
1901 a constant. */
1902
1903#define FIRST_VIRTUAL_REGISTER (FIRST_PSEUDO_REGISTER)
1904
1905/* This points to the first word of the incoming arguments passed on the stack,
1906 either by the caller or by the callee when pretending it was passed by the
1907 caller. */
1908
5da077de 1909#define virtual_incoming_args_rtx (global_rtl[GR_VIRTUAL_INCOMING_ARGS])
6f29feb1
JW
1910
1911#define VIRTUAL_INCOMING_ARGS_REGNUM (FIRST_VIRTUAL_REGISTER)
1912
60343c3b 1913/* If FRAME_GROWS_DOWNWARD, this points to immediately above the first
6f29feb1
JW
1914 variable on the stack. Otherwise, it points to the first variable on
1915 the stack. */
1916
5da077de 1917#define virtual_stack_vars_rtx (global_rtl[GR_VIRTUAL_STACK_ARGS])
6f29feb1
JW
1918
1919#define VIRTUAL_STACK_VARS_REGNUM ((FIRST_VIRTUAL_REGISTER) + 1)
1920
1921/* This points to the location of dynamically-allocated memory on the stack
1922 immediately after the stack pointer has been adjusted by the amount
1923 desired. */
1924
5da077de 1925#define virtual_stack_dynamic_rtx (global_rtl[GR_VIRTUAL_STACK_DYNAMIC])
6f29feb1
JW
1926
1927#define VIRTUAL_STACK_DYNAMIC_REGNUM ((FIRST_VIRTUAL_REGISTER) + 2)
1928
1929/* This points to the location in the stack at which outgoing arguments should
1930 be written when the stack is pre-pushed (arguments pushed using push
1931 insns always use sp). */
1932
5da077de 1933#define virtual_outgoing_args_rtx (global_rtl[GR_VIRTUAL_OUTGOING_ARGS])
6f29feb1
JW
1934
1935#define VIRTUAL_OUTGOING_ARGS_REGNUM ((FIRST_VIRTUAL_REGISTER) + 3)
1936
71038426 1937/* This points to the Canonical Frame Address of the function. This
14b493d6 1938 should correspond to the CFA produced by INCOMING_FRAME_SP_OFFSET,
71038426 1939 but is calculated relative to the arg pointer for simplicity; the
f590cca1 1940 frame pointer nor stack pointer are necessarily fixed relative to
71038426
RH
1941 the CFA until after reload. */
1942
5da077de 1943#define virtual_cfa_rtx (global_rtl[GR_VIRTUAL_CFA])
71038426
RH
1944
1945#define VIRTUAL_CFA_REGNUM ((FIRST_VIRTUAL_REGISTER) + 4)
1946
1947#define LAST_VIRTUAL_REGISTER ((FIRST_VIRTUAL_REGISTER) + 4)
6f29feb1 1948
a06ef755 1949/* Nonzero if REGNUM is a pointer into the stack frame. */
3d7aafde 1950#define REGNO_PTR_FRAME_P(REGNUM) \
a06ef755
RK
1951 ((REGNUM) == STACK_POINTER_REGNUM \
1952 || (REGNUM) == FRAME_POINTER_REGNUM \
1953 || (REGNUM) == HARD_FRAME_POINTER_REGNUM \
1954 || (REGNUM) == ARG_POINTER_REGNUM \
1955 || ((REGNUM) >= FIRST_VIRTUAL_REGISTER \
1956 && (REGNUM) <= LAST_VIRTUAL_REGISTER))
1957
848e0190 1958/* REGNUM never really appearing in the INSN stream. */
cf403648 1959#define INVALID_REGNUM (~(unsigned int) 0)
848e0190 1960
0c20a65f 1961extern rtx output_constant_def (tree, int);
75c20980 1962extern rtx lookup_constant_def (tree);
6f29feb1 1963
0ea0e871
JL
1964/* Nonzero after the second flow pass has completed.
1965 Set to 1 or 0 by toplev.c */
1966extern int flow2_completed;
1967
6f29feb1 1968/* Nonzero after end of reload pass.
0ea0e871 1969 Set to 1 or 0 by reload1.c. */
6f29feb1
JW
1970
1971extern int reload_completed;
1972
fe3ad572
SC
1973/* Nonzero after thread_prologue_and_epilogue_insns has run. */
1974extern int epilogue_completed;
1975
6f29feb1
JW
1976/* Set to 1 while reload_as_needed is operating.
1977 Required by some machines to handle any generated moves differently. */
1978
1979extern int reload_in_progress;
1980
1981/* If this is nonzero, we do not bother generating VOLATILE
1982 around volatile memory references, and we are willing to
1983 output indirect addresses. If cse is to follow, we reject
1984 indirect addresses so a useful potential cse is generated;
1985 if it is used only once, instruction combination will produce
1986 the same indirect address eventually. */
1987extern int cse_not_expected;
1988
f1db3576
JL
1989/* Set to nonzero before life analysis to indicate that it is unsafe to
1990 generate any new pseudo registers. */
1991extern int no_new_pseudos;
1992
f5118aa5 1993/* Translates rtx code to tree code, for those codes needed by
88efc60a
RK
1994 REAL_ARITHMETIC. The function returns an int because the caller may not
1995 know what `enum tree_code' means. */
1996
0c20a65f 1997extern int rtx_to_tree_code (enum rtx_code);
9ae8ffe7 1998
ac957f13 1999/* In cse.c */
0c20a65f 2000extern int delete_trivially_dead_insns (rtx, int);
10d22567 2001extern int cse_main (rtx, int);
0516f6fe
SB
2002extern int exp_equiv_p (rtx, rtx, int, bool);
2003extern unsigned hash_rtx (rtx x, enum machine_mode, int *, int *, bool);
ac957f13
JL
2004
2005/* In jump.c */
0c20a65f
AJ
2006extern int comparison_dominates_p (enum rtx_code, enum rtx_code);
2007extern int condjump_p (rtx);
2008extern int any_condjump_p (rtx);
2009extern int any_uncondjump_p (rtx);
0c20a65f
AJ
2010extern rtx pc_set (rtx);
2011extern rtx condjump_label (rtx);
2012extern int simplejump_p (rtx);
2013extern int returnjump_p (rtx);
2014extern int onlyjump_p (rtx);
2015extern int only_sets_cc0_p (rtx);
2016extern int sets_cc0_p (rtx);
2017extern int invert_jump_1 (rtx, rtx);
2018extern int invert_jump (rtx, rtx, int);
2019extern int rtx_renumbered_equal_p (rtx, rtx);
2020extern int true_regnum (rtx);
2021extern unsigned int reg_or_subregno (rtx);
2022extern int redirect_jump_1 (rtx, rtx);
0a634832 2023extern void redirect_jump_2 (rtx, rtx, rtx, int, int);
0c20a65f
AJ
2024extern int redirect_jump (rtx, rtx, int);
2025extern void rebuild_jump_labels (rtx);
14f02e73 2026extern rtx reversed_comparison (rtx, enum machine_mode);
0c20a65f
AJ
2027extern enum rtx_code reversed_comparison_code (rtx, rtx);
2028extern enum rtx_code reversed_comparison_code_parts (enum rtx_code,
2029 rtx, rtx, rtx);
2030extern void delete_for_peephole (rtx, rtx);
2031extern int condjump_in_parallel_p (rtx);
c2924966 2032extern unsigned int purge_line_number_notes (void);
14bf4a33 2033
eebedaa5 2034/* In emit-rtl.c. */
0c20a65f
AJ
2035extern int max_reg_num (void);
2036extern int max_label_num (void);
2037extern int get_first_label_num (void);
6de9cd9a 2038extern void maybe_set_first_label_num (rtx);
0c20a65f
AJ
2039extern void delete_insns_since (rtx);
2040extern void mark_reg_pointer (rtx, int);
2041extern void mark_user_reg (rtx);
2042extern void reset_used_flags (rtx);
2c07f13b 2043extern void set_used_flags (rtx);
0c20a65f
AJ
2044extern void reorder_insns (rtx, rtx, rtx);
2045extern void reorder_insns_nobb (rtx, rtx, rtx);
2046extern int get_max_uid (void);
2047extern int in_sequence_p (void);
2048extern void force_next_line_note (void);
2049extern void init_emit (void);
2050extern void init_emit_once (int);
2051extern void push_topmost_sequence (void);
2052extern void pop_topmost_sequence (void);
0c20a65f 2053extern void set_new_first_and_last_insn (rtx, rtx);
c2924966 2054extern unsigned int unshare_all_rtl (void);
0c20a65f 2055extern void unshare_all_rtl_again (rtx);
2c07f13b
JH
2056extern void unshare_all_rtl_in_chain (rtx);
2057extern void verify_rtl_sharing (void);
0c20a65f
AJ
2058extern void set_first_insn (rtx);
2059extern void set_last_insn (rtx);
2060extern void link_cc0_insns (rtx);
2061extern void add_insn (rtx);
2062extern void add_insn_before (rtx, rtx);
2063extern void add_insn_after (rtx, rtx);
2064extern void remove_insn (rtx);
0c20a65f 2065extern void emit_insn_after_with_line_notes (rtx, rtx, rtx);
0c20a65f 2066extern rtx emit (rtx);
10d22567 2067extern void renumber_insns (void);
0c20a65f 2068extern rtx delete_insn (rtx);
91278841 2069extern rtx entry_of_function (void);
0c20a65f
AJ
2070extern void delete_insn_chain (rtx, rtx);
2071extern rtx unlink_insn_chain (rtx, rtx);
2072extern rtx delete_insn_and_edges (rtx);
2073extern void delete_insn_chain_and_edges (rtx, rtx);
dad822d3 2074extern rtx gen_lowpart_SUBREG (enum machine_mode, rtx);
542a8afa 2075extern rtx gen_const_mem (enum machine_mode, rtx);
bf877a76
R
2076extern rtx gen_frame_mem (enum machine_mode, rtx);
2077extern rtx gen_tmp_stack_mem (enum machine_mode, rtx);
beb72684
RH
2078extern bool validate_subreg (enum machine_mode, enum machine_mode,
2079 rtx, unsigned int);
ac957f13 2080
ac957f13 2081/* In combine.c */
79a490a9
AJ
2082extern unsigned int extended_count (rtx, enum machine_mode, int);
2083extern rtx remove_death (unsigned int, rtx);
79a490a9
AJ
2084extern void dump_combine_stats (FILE *);
2085extern void dump_combine_total_stats (FILE *);
ac957f13 2086
a68e7e6c
PB
2087/* In sched-vis.c. */
2088extern void print_rtl_slim_with_bb (FILE *, rtx, int);
2089extern void dump_insn_slim (FILE *f, rtx x);
2090extern void debug_insn_slim (rtx x);
2091
dad822d3 2092/* In sched-rgn.c. */
10d22567 2093extern void schedule_insns (void);
dad822d3
PB
2094
2095/* In sched-ebb.c. */
10d22567 2096extern void schedule_ebbs (void);
dad822d3
PB
2097
2098/* In haifa-sched.c. */
0c20a65f 2099extern void fix_sched_param (const char *, const char *);
ac957f13
JL
2100
2101/* In print-rtl.c */
47c10e9b 2102extern const char *print_rtx_head;
0c20a65f
AJ
2103extern void debug_rtx (rtx);
2104extern void debug_rtx_list (rtx, int);
2105extern void debug_rtx_range (rtx, rtx);
2106extern rtx debug_rtx_find (rtx, int);
0c20a65f
AJ
2107extern void print_mem_expr (FILE *, tree);
2108extern void print_rtl (FILE *, rtx);
2109extern void print_simple_rtl (FILE *, rtx);
2110extern int print_rtl_single (FILE *, rtx);
2111extern void print_inline_rtx (FILE *, rtx, int);
ac957f13
JL
2112
2113/* In loop.c */
0c20a65f 2114extern void init_loop (void);
75473b02
SB
2115
2116/* In bt-load.c */
827c06b6 2117extern void branch_target_load_optimize (bool);
ac957f13
JL
2118
2119/* In function.c */
0c20a65f
AJ
2120extern void reposition_prologue_and_epilogue_notes (rtx);
2121extern void thread_prologue_and_epilogue_insns (rtx);
2122extern int prologue_epilogue_contains (rtx);
2123extern int sibcall_epilogue_contains (rtx);
0c20a65f
AJ
2124extern void mark_temp_addr_taken (rtx);
2125extern void update_temp_slot_address (rtx, rtx);
ac957f13 2126
ac957f13 2127/* In stmt.c */
0c20a65f 2128extern void expand_null_return (void);
6e3077c6 2129extern void expand_naked_return (void);
0c20a65f 2130extern void emit_jump (rtx);
ac957f13
JL
2131
2132/* In expr.c */
0c20a65f
AJ
2133extern rtx move_by_pieces (rtx, rtx, unsigned HOST_WIDE_INT,
2134 unsigned int, int);
2e245dac 2135
ac957f13 2136/* In flow.c */
0c20a65f 2137extern void delete_dead_jumptables (void);
0c20a65f 2138extern void print_rtl_with_bb (FILE *, rtx);
5b4fdb20 2139extern void dump_flow_info (FILE *, int);
ac957f13
JL
2140
2141/* In expmed.c */
0c20a65f
AJ
2142extern void init_expmed (void);
2143extern void expand_inc (rtx, rtx);
2144extern void expand_dec (rtx, rtx);
ac957f13 2145
50b2596f 2146/* In gcse.c */
0c20a65f
AJ
2147extern bool can_copy_p (enum machine_mode);
2148extern rtx fis_get_condition (rtx);
0516f6fe 2149
ac957f13 2150/* In global.c */
0c20a65f 2151extern void mark_elimination (int, int);
0c20a65f 2152extern void dump_global_regs (FILE *);
cab634f2 2153#ifdef HARD_CONST
cff9f8d5 2154/* Yes, this ifdef is silly, but HARD_REG_SET is not always defined. */
0c20a65f 2155extern void retry_global_alloc (int, HARD_REG_SET);
cab634f2 2156#endif
0c20a65f 2157extern void build_insn_chain (rtx);
ac957f13
JL
2158
2159/* In regclass.c */
0c20a65f
AJ
2160extern int reg_classes_intersect_p (enum reg_class, enum reg_class);
2161extern int reg_class_subset_p (enum reg_class, enum reg_class);
2162extern void globalize_reg (int);
28420116 2163extern void init_reg_modes_once (void);
0c20a65f
AJ
2164extern void init_regs (void);
2165extern void init_fake_stack_mems (void);
2166extern void init_reg_sets (void);
0c20a65f 2167extern void regclass_init (void);
10d22567 2168extern void regclass (rtx, int);
c80a0f26 2169extern void reg_scan (rtx, unsigned int);
0c20a65f 2170extern void fix_register (const char *, int, int);
41bf2a8b
RH
2171extern void init_subregs_of_mode (void);
2172extern void record_subregs_of_mode (rtx);
cff9f8d5 2173#ifdef HARD_CONST
0c20a65f
AJ
2174extern void cannot_change_mode_set_regs (HARD_REG_SET *,
2175 enum machine_mode, unsigned int);
cff9f8d5 2176#endif
0c20a65f
AJ
2177extern bool invalid_mode_change_p (unsigned int, enum reg_class,
2178 enum machine_mode);
cdadb1dd 2179
50b2596f 2180/* In reorg.c */
10d22567 2181extern void dbr_schedule (rtx);
50b2596f 2182
ac957f13 2183/* In local-alloc.c */
0c20a65f 2184extern void dump_local_alloc (FILE *);
ac957f13 2185
5fffc382
R
2186/* In reload1.c */
2187extern int function_invariant_p (rtx);
2188
ac957f13 2189/* In calls.c */
ebb1b59a
BS
2190enum libcall_type
2191{
2192 LCT_NORMAL = 0,
2193 LCT_CONST = 1,
2194 LCT_PURE = 2,
2195 LCT_CONST_MAKE_BLOCK = 3,
695ee791 2196 LCT_PURE_MAKE_BLOCK = 4,
9555a122 2197 LCT_NORETURN = 5,
9d98f8f9 2198 LCT_THROW = 6,
321cf1f2 2199 LCT_RETURNS_TWICE = 7
ebb1b59a
BS
2200};
2201
0c20a65f
AJ
2202extern void emit_library_call (rtx, enum libcall_type, enum machine_mode, int,
2203 ...);
2204extern rtx emit_library_call_value (rtx, rtx, enum libcall_type,
2205 enum machine_mode, int, ...);
ac957f13 2206
ac957f13 2207/* In varasm.c */
0c20a65f 2208extern void init_varasm_once (void);
c2f7fa15
SB
2209extern enum tls_model decl_default_tls_model (tree);
2210
ac957f13 2211/* In rtl.c */
0c20a65f 2212extern void traverse_md_constants (int (*) (void **, void *), void *);
c25c12b8 2213struct md_constant { char *name, *value; };
ac957f13 2214
7e7ec48e 2215/* In read-rtl.c */
0c20a65f 2216extern int read_skip_spaces (FILE *);
57406c63 2217extern bool read_rtx (FILE *, rtx *, int *);
7445392c
RS
2218extern void copy_rtx_ptr_loc (const void *, const void *);
2219extern void print_rtx_ptr_loc (const void *);
2220extern const char *join_c_conditions (const char *, const char *);
2221extern void print_c_condition (const char *);
bcdaba58
RH
2222extern const char *read_rtx_filename;
2223extern int read_rtx_lineno;
2224
ac957f13 2225/* In alias.c */
4682ae04
AJ
2226extern void clear_reg_alias_info (rtx);
2227extern rtx canon_rtx (rtx);
2228extern int true_dependence (rtx, enum machine_mode, rtx, int (*)(rtx, int));
2229extern rtx get_addr (rtx);
2230extern int canon_true_dependence (rtx, enum machine_mode, rtx, rtx,
2231 int (*)(rtx, int));
2232extern int read_dependence (rtx, rtx);
2233extern int anti_dependence (rtx, rtx);
2234extern int output_dependence (rtx, rtx);
4682ae04
AJ
2235extern void init_alias_once (void);
2236extern void init_alias_analysis (void);
2237extern void end_alias_analysis (void);
4682ae04
AJ
2238extern bool memory_modified_in_insn_p (rtx, rtx);
2239extern rtx find_base_term (rtx);
3e89ed8d 2240extern rtx gen_hard_reg_clobber (enum machine_mode, unsigned int);
bb1acb3e
RH
2241extern rtx get_reg_known_value (unsigned int);
2242extern bool get_reg_known_equiv_p (unsigned int);
4c649323 2243
21b2cd73 2244#ifdef STACK_REGS
0c20a65f 2245extern int stack_regs_mentioned (rtx insn);
21b2cd73
JH
2246#endif
2247
a157febd 2248/* In toplev.c */
e2500fed 2249extern GTY(()) rtx stack_limit_rtx;
dfdb644f 2250
4db384c9 2251/* In predict.c */
0c20a65f
AJ
2252extern void invert_br_probabilities (rtx);
2253extern bool expensive_function_p (int);
5c856b23 2254/* In tracer.c */
35b6b437 2255extern void tracer (unsigned int);
cff9f8d5 2256
014a1138 2257/* In var-tracking.c */
c2924966 2258extern unsigned int variable_tracking_main (void);
014a1138 2259
50654f6c 2260/* In stor-layout.c. */
0aea6467
ZD
2261extern void get_mode_bounds (enum machine_mode, int, enum machine_mode,
2262 rtx *, rtx *);
50654f6c
ZD
2263
2264/* In loop-unswitch.c */
2265extern rtx reversed_condition (rtx);
2266extern rtx compare_and_jump_seq (rtx, rtx, enum rtx_code, rtx, int, rtx);
2267
2268/* In loop-iv.c */
2269extern rtx canon_condition (rtx);
2270extern void simplify_using_condition (rtx, rtx *, struct bitmap_head_def *);
2f93eea8
PB
2271\f
2272struct rtl_hooks
2273{
2274 rtx (*gen_lowpart) (enum machine_mode, rtx);
9ce921ab 2275 rtx (*gen_lowpart_no_emit) (enum machine_mode, rtx);
2f93eea8
PB
2276 rtx (*reg_nonzero_bits) (rtx, enum machine_mode, rtx, enum machine_mode,
2277 unsigned HOST_WIDE_INT, unsigned HOST_WIDE_INT *);
2278 rtx (*reg_num_sign_bit_copies) (rtx, enum machine_mode, rtx, enum machine_mode,
2279 unsigned int, unsigned int *);
d3b72690 2280 bool (*reg_truncated_to_mode) (enum machine_mode, rtx);
2f93eea8 2281
d3b72690 2282 /* Whenever you add entries here, make sure you adjust rtlhooks-def.h. */
2f93eea8
PB
2283};
2284
2285/* Each pass can provide its own. */
2286extern struct rtl_hooks rtl_hooks;
2287
2288/* ... but then it has to restore these. */
2289extern const struct rtl_hooks general_rtl_hooks;
2290
2291/* Keep this for the nonce. */
2292#define gen_lowpart rtl_hooks.gen_lowpart
2293
88657302 2294#endif /* ! GCC_RTL_H */
This page took 3.711147 seconds and 5 git commands to generate.