00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef GCC_RTL_H
00023 #define GCC_RTL_H
00024
00025 #include "statistics.h"
00026 #include "machmode.h"
00027 #include "input.h"
00028 #include "real.h"
00029 #include "vec.h"
00030
00031 #undef FFS
00032 #undef FLOAT
00033 #undef ABS
00034 #undef PC
00035
00036
00037
00038 #define NOOP_MOVE_INSN_CODE INT_MAX
00039
00040
00041
00042 #define RTX_CODE enum rtx_code
00043 enum rtx_code {
00044
00045 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) ENUM ,
00046 #include "rtl.def"
00047 #undef DEF_RTL_EXPR
00048
00049 LAST_AND_UNUSED_RTX_CODE};
00050
00051
00052
00053 #define NUM_RTX_CODE ((int) LAST_AND_UNUSED_RTX_CODE)
00054
00055
00056
00057
00058 enum rtx_class {
00059
00060
00061
00062
00063 RTX_COMPARE,
00064 RTX_COMM_COMPARE,
00065 RTX_BIN_ARITH,
00066 RTX_COMM_ARITH,
00067
00068
00069 RTX_UNARY,
00070
00071 RTX_EXTRA,
00072 RTX_MATCH,
00073 RTX_INSN,
00074
00075
00076 RTX_OBJ,
00077 RTX_CONST_OBJ,
00078
00079 RTX_TERNARY,
00080 RTX_BITFIELD_OPS,
00081 RTX_AUTOINC
00082 };
00083
00084 #define RTX_OBJ_MASK (~1)
00085 #define RTX_OBJ_RESULT (RTX_OBJ & RTX_OBJ_MASK)
00086 #define RTX_COMPARE_MASK (~1)
00087 #define RTX_COMPARE_RESULT (RTX_COMPARE & RTX_COMPARE_MASK)
00088 #define RTX_ARITHMETIC_MASK (~1)
00089 #define RTX_ARITHMETIC_RESULT (RTX_COMM_ARITH & RTX_ARITHMETIC_MASK)
00090 #define RTX_BINARY_MASK (~3)
00091 #define RTX_BINARY_RESULT (RTX_COMPARE & RTX_BINARY_MASK)
00092 #define RTX_COMMUTATIVE_MASK (~2)
00093 #define RTX_COMMUTATIVE_RESULT (RTX_COMM_COMPARE & RTX_COMMUTATIVE_MASK)
00094 #define RTX_NON_COMMUTATIVE_RESULT (RTX_COMPARE & RTX_COMMUTATIVE_MASK)
00095
00096 extern const unsigned char rtx_length[NUM_RTX_CODE];
00097 #define GET_RTX_LENGTH(CODE) (rtx_length[(int) (CODE)])
00098
00099 extern const char * const rtx_name[NUM_RTX_CODE];
00100 #define GET_RTX_NAME(CODE) (rtx_name[(int) (CODE)])
00101
00102 extern const char * const rtx_format[NUM_RTX_CODE];
00103 #define GET_RTX_FORMAT(CODE) (rtx_format[(int) (CODE)])
00104
00105 extern const enum rtx_class rtx_class[NUM_RTX_CODE];
00106 #define GET_RTX_CLASS(CODE) (rtx_class[(int) (CODE)])
00107
00108 extern const unsigned char rtx_code_size[NUM_RTX_CODE];
00109 extern const unsigned char rtx_next[NUM_RTX_CODE];
00110
00111
00112
00113 typedef struct
00114 {
00115
00116 unsigned min_align: 8;
00117
00118 unsigned base_after_vec: 1;
00119 unsigned min_after_vec: 1;
00120
00121 unsigned max_after_vec: 1;
00122
00123 unsigned min_after_base: 1;
00124
00125 unsigned max_after_base: 1;
00126
00127
00128 unsigned offset_unsigned: 1;
00129 unsigned : 2;
00130 unsigned scale : 8;
00131 } addr_diff_vec_flags;
00132
00133
00134
00135
00136
00137
00138
00139
00140 typedef struct mem_attrs GTY(())
00141 {
00142 HOST_WIDE_INT alias;
00143 tree expr;
00144 rtx offset;
00145 rtx size;
00146 unsigned int align;
00147 } mem_attrs;
00148
00149
00150
00151
00152 typedef struct reg_attrs GTY(())
00153 {
00154 tree decl;
00155 HOST_WIDE_INT offset;
00156 } reg_attrs;
00157
00158
00159
00160 union rtunion_def
00161 {
00162 int rt_int;
00163 unsigned int rt_uint;
00164 const char *rt_str;
00165 rtx rt_rtx;
00166 rtvec rt_rtvec;
00167 enum machine_mode rt_type;
00168 addr_diff_vec_flags rt_addr_diff_vec_flags;
00169 struct cselib_val_struct *rt_cselib;
00170 struct bitmap_head_def *rt_bit;
00171 tree rt_tree;
00172 struct basic_block_def *rt_bb;
00173 mem_attrs *rt_mem;
00174 reg_attrs *rt_reg;
00175 struct constant_descriptor_rtx *rt_constant;
00176 };
00177 typedef union rtunion_def rtunion;
00178
00179
00180
00181
00182 struct block_symbol GTY(()) {
00183
00184 rtunion GTY ((skip)) fld[3];
00185
00186
00187 struct object_block *block;
00188
00189
00190
00191 HOST_WIDE_INT offset;
00192 };
00193
00194 DEF_VEC_P(rtx);
00195 DEF_VEC_ALLOC_P(rtx,heap);
00196 DEF_VEC_ALLOC_P(rtx,gc);
00197
00198
00199
00200 struct object_block GTY(())
00201 {
00202
00203 section *sect;
00204
00205
00206 unsigned int alignment;
00207
00208
00209 HOST_WIDE_INT size;
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219 VEC(rtx,gc) *objects;
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229 VEC(rtx,gc) *anchors;
00230 };
00231
00232
00233
00234 struct rtx_def GTY((chain_next ("RTX_NEXT (&%h)"),
00235 chain_prev ("RTX_PREV (&%h)")))
00236 {
00237 /* The kind of expression this is. */
00238 ENUM_BITFIELD(rtx_code) code: 16;
00239
00240 /* The kind of value the expression has. */
00241 ENUM_BITFIELD(machine_mode) mode : 8;
00242
00243 /* 1 in a MEM if we should keep the alias set for this mem unchanged
00244 when we access a component.
00245 1 in a CALL_INSN if it is a sibling call.
00246 1 in a SET that is for a return.
00247 In a CODE_LABEL, part of the two-bit alternate entry field. */
00248 unsigned int jump : 1;
00249 /* In a CODE_LABEL, part of the two-bit alternate entry field.
00250 1 in a MEM if it cannot trap. */
00251 unsigned int call : 1;
00252 /* 1 in a REG, MEM, or CONCAT if the value is set at most once, anywhere.
00253 1 in a SUBREG if it references an unsigned object whose mode has been
00254 from a promoted to a wider mode.
00255 1 in a SYMBOL_REF if it addresses something in the per-function
00256 constants pool.
00257 1 in a CALL_INSN, NOTE, or EXPR_LIST for a const or pure call.
00258 1 in a JUMP_INSN, CALL_INSN, or INSN of an annulling branch. */
00259 unsigned int unchanging : 1;
00260 /* 1 in a MEM or ASM_OPERANDS expression if the memory reference is volatile.
00261 1 in an INSN, CALL_INSN, JUMP_INSN, CODE_LABEL, BARRIER, or NOTE
00262 if it has been deleted.
00263 1 in a REG expression if corresponds to a variable declared by the user,
00264 0 for an internally generated temporary.
00265 1 in a SUBREG with a negative value.
00266 1 in a LABEL_REF or in a REG_LABEL note for a non-local label.
00267 In a SYMBOL_REF, this flag is used for machine-specific purposes. */
00268 unsigned int volatil : 1;
00269 /* 1 in a MEM referring to a field of an aggregate.
00270 0 if the MEM was a variable or the result of a * operator in C;
00271 1 if it was the result of a . or -> operator (on a struct) in C.
00272 1 in a REG if the register is used only in exit code a loop.
00273 1 in a SUBREG expression if was generated from a variable with a
00274 promoted mode.
00275 1 in a CODE_LABEL if the label is used for nonlocal gotos
00276 and must not be deleted even if its count is zero.
00277 1 in an INSN, JUMP_INSN or CALL_INSN if this insn must be scheduled
00278 together with the preceding insn. Valid only within sched.
00279 1 in an INSN, JUMP_INSN, or CALL_INSN if insn is in a delay slot and
00280 from the target of a branch. Valid from reorg until end of compilation;
00281 cleared before used. */
00282 unsigned int in_struct : 1;
00283 /* At the end of RTL generation, 1 if this rtx is used. This is used for
00284 copying shared structure. See `unshare_all_rtl'.
00285 In a REG, this is not needed for that purpose, and used instead
00286 in `leaf_renumber_regs_insn'.
00287 1 in a SYMBOL_REF, means that emit_library_call
00288 has used it as the function. */
00289 unsigned int used : 1;
00290 /* 1 in an INSN or a SET if this rtx is related to the call frame,
00291 either changing how we compute the frame address or saving and
00292 restoring registers in the prologue and epilogue.
00293 1 in a REG or MEM if it is a pointer.
00294 1 in a SYMBOL_REF if it addresses something in the per-function
00295 constant string pool. */
00296 unsigned frame_related : 1;
00297 /* 1 in a REG or PARALLEL that is the current function's return value.
00298 1 in a MEM if it refers to a scalar.
00299 1 in a SYMBOL_REF for a weak symbol. */
00300 unsigned return_val : 1;
00301
00302 /* The first element of the operands of this rtx.
00303 The number of operands and their types are controlled
00304 by the `code' field, according to rtl.def. */
00305 union u {
00306 rtunion fld[1];
00307 HOST_WIDE_INT hwint[1];
00308 struct block_symbol block_sym;
00309 struct real_value rv;
00310 } GTY ((special ("rtx_def"), desc ("GET_CODE (&%0)"))) u;
00311 };
00312
00313 /* The size in bytes of an rtx header (code, mode and flags). */
00314 #define RTX_HDR_SIZE offsetof (struct rtx_def, u)
00315
00316 /* The size in bytes of an rtx with code CODE. */
00317 #define RTX_CODE_SIZE(CODE) rtx_code_size[CODE]
00318
00319 #define NULL_RTX (rtx) 0
00320
00321 /* The "next" and "previous" RTX, relative to this one. */
00322
00323 #define RTX_NEXT(X) (rtx_next[GET_CODE (X)] == 0 ? NULL \
00324 : *(rtx *)(((char *)X) + rtx_next[GET_CODE (X)]))
00325
00326 /* FIXME: the "NEXT_INSN (PREV_INSN (X)) == X" condition shouldn't be needed.
00327 */
00328 #define RTX_PREV(X) ((INSN_P (X) \
00329 || NOTE_P (X) \
00330 || BARRIER_P (X) \
00331 || LABEL_P (X)) \
00332 && PREV_INSN (X) != NULL \
00333 && NEXT_INSN (PREV_INSN (X)) == X \
00334 ? PREV_INSN (X) : NULL)
00335
00336 /* Define macros to access the `code' field of the rtx. */
00337
00338 #define GET_CODE(RTX) ((enum rtx_code) (RTX)->code)
00339 #define PUT_CODE(RTX, CODE) ((RTX)->code = (CODE))
00340
00341 #define GET_MODE(RTX) ((enum machine_mode) (RTX)->mode)
00342 #define PUT_MODE(RTX, MODE) ((RTX)->mode = (MODE))
00343
00344 /* RTL vector. These appear inside RTX's when there is a need
00345 for a variable number of things. The principle use is inside
00346 PARALLEL expressions. */
00347
00348 struct rtvec_def GTY(()) {
00349 int num_elem; /* number of elements */
00350 rtx GTY ((length ("%h.num_elem"))) elem[1];
00351 };
00352
00353 #define NULL_RTVEC (rtvec) 0
00354
00355 #define GET_NUM_ELEM(RTVEC) ((RTVEC)->num_elem)
00356 #define PUT_NUM_ELEM(RTVEC, NUM) ((RTVEC)->num_elem = (NUM))
00357
00358 /* Predicate yielding nonzero iff X is an rtx for a register. */
00359 #define REG_P(X) (GET_CODE (X) == REG)
00360
00361 /* Predicate yielding nonzero iff X is an rtx for a memory location. */
00362 #define MEM_P(X) (GET_CODE (X) == MEM)
00363
00364 /* Predicate yielding nonzero iff X is an rtx for a constant integer. */
00365 #define CONST_INT_P(X) (GET_CODE (X) == CONST_INT)
00366
00367 /* Predicate yielding nonzero iff X is a label insn. */
00368 #define LABEL_P(X) (GET_CODE (X) == CODE_LABEL)
00369
00370 /* Predicate yielding nonzero iff X is a jump insn. */
00371 #define JUMP_P(X) (GET_CODE (X) == JUMP_INSN)
00372
00373 /* Predicate yielding nonzero iff X is a call insn. */
00374 #define CALL_P(X) (GET_CODE (X) == CALL_INSN)
00375
00376 /* Predicate yielding nonzero iff X is an insn that cannot jump. */
00377 #define NONJUMP_INSN_P(X) (GET_CODE (X) == INSN)
00378
00379 /* Predicate yielding nonzero iff X is a real insn. */
00380 #define INSN_P(X) \
00381 (NONJUMP_INSN_P (X) || JUMP_P (X) || CALL_P (X))
00382
00383 /* Predicate yielding nonzero iff X is a note insn. */
00384 #define NOTE_P(X) (GET_CODE (X) == NOTE)
00385
00386 /* Predicate yielding nonzero iff X is a barrier insn. */
00387 #define BARRIER_P(X) (GET_CODE (X) == BARRIER)
00388
00389 /* Predicate yielding nonzero iff X is a data for a jump table. */
00390 #define JUMP_TABLE_DATA_P(INSN) \
00391 (JUMP_P (INSN) && (GET_CODE (PATTERN (INSN)) == ADDR_VEC || \
00392 GET_CODE (PATTERN (INSN)) == ADDR_DIFF_VEC))
00393
00394 /* 1 if X is a unary operator. */
00395
00396 #define UNARY_P(X) \
00397 (GET_RTX_CLASS (GET_CODE (X)) == RTX_UNARY)
00398
00399 /* 1 if X is a binary operator. */
00400
00401 #define BINARY_P(X) \
00402 ((GET_RTX_CLASS (GET_CODE (X)) & RTX_BINARY_MASK) == RTX_BINARY_RESULT)
00403
00404 /* 1 if X is an arithmetic operator. */
00405
00406 #define ARITHMETIC_P(X) \
00407 ((GET_RTX_CLASS (GET_CODE (X)) & RTX_ARITHMETIC_MASK) \
00408 == RTX_ARITHMETIC_RESULT)
00409
00410 /* 1 if X is an arithmetic operator. */
00411
00412 #define COMMUTATIVE_ARITH_P(X) \
00413 (GET_RTX_CLASS (GET_CODE (X)) == RTX_COMM_ARITH)
00414
00415 /* 1 if X is a commutative arithmetic operator or a comparison operator.
00416 These two are sometimes selected together because it is possible to
00417 swap the two operands. */
00418
00419 #define SWAPPABLE_OPERANDS_P(X) \
00420 ((1 << GET_RTX_CLASS (GET_CODE (X))) \
00421 & ((1 << RTX_COMM_ARITH) | (1 << RTX_COMM_COMPARE) \
00422 | (1 << RTX_COMPARE)))
00423
00424 /* 1 if X is a non-commutative operator. */
00425
00426 #define NON_COMMUTATIVE_P(X) \
00427 ((GET_RTX_CLASS (GET_CODE (X)) & RTX_COMMUTATIVE_MASK) \
00428 == RTX_NON_COMMUTATIVE_RESULT)
00429
00430 /* 1 if X is a commutative operator on integers. */
00431
00432 #define COMMUTATIVE_P(X) \
00433 ((GET_RTX_CLASS (GET_CODE (X)) & RTX_COMMUTATIVE_MASK) \
00434 == RTX_COMMUTATIVE_RESULT)
00435
00436 /* 1 if X is a relational operator. */
00437
00438 #define COMPARISON_P(X) \
00439 ((GET_RTX_CLASS (GET_CODE (X)) & RTX_COMPARE_MASK) == RTX_COMPARE_RESULT)
00440
00441 /* 1 if X is a constant value that is an integer. */
00442
00443 #define CONSTANT_P(X) \
00444 (GET_RTX_CLASS (GET_CODE (X)) == RTX_CONST_OBJ)
00445
00446 /* 1 if X can be used to represent an object. */
00447 #define OBJECT_P(X) \
00448 ((GET_RTX_CLASS (GET_CODE (X)) & RTX_OBJ_MASK) == RTX_OBJ_RESULT)
00449
00450 /* General accessor macros for accessing the fields of an rtx. */
00451
00452 #if defined ENABLE_RTL_CHECKING && (GCC_VERSION >= 2007)
00453 /* The bit with a star outside the statement expr and an & inside is
00454 so that N can be evaluated only once. */
00455 #define RTL_CHECK1(RTX, N, C1) __extension__ \
00456 (*({ rtx const _rtx = (RTX); const int _n = (N); \
00457 const enum rtx_code _code = GET_CODE (_rtx); \
00458 if (_n < 0 || _n >= GET_RTX_LENGTH (_code)) \
00459 rtl_check_failed_bounds (_rtx, _n, __FILE__, __LINE__, \
00460 __FUNCTION__); \
00461 if (GET_RTX_FORMAT(_code)[_n] != C1) \
00462 rtl_check_failed_type1 (_rtx, _n, C1, __FILE__, __LINE__, \
00463 __FUNCTION__); \
00464 &_rtx->u.fld[_n]; }))
00465
00466 #define RTL_CHECK2(RTX, N, C1, C2) __extension__ \
00467 (*({ rtx const _rtx = (RTX); const int _n = (N); \
00468 const enum rtx_code _code = GET_CODE (_rtx); \
00469 if (_n < 0 || _n >= GET_RTX_LENGTH (_code)) \
00470 rtl_check_failed_bounds (_rtx, _n, __FILE__, __LINE__, \
00471 __FUNCTION__); \
00472 if (GET_RTX_FORMAT(_code)[_n] != C1 \
00473 && GET_RTX_FORMAT(_code)[_n] != C2) \
00474 rtl_check_failed_type2 (_rtx, _n, C1, C2, __FILE__, __LINE__, \
00475 __FUNCTION__); \
00476 &_rtx->u.fld[_n]; }))
00477
00478 #define RTL_CHECKC1(RTX, N, C) __extension__ \
00479 (*({ rtx const _rtx = (RTX); const int _n = (N); \
00480 if (GET_CODE (_rtx) != (C)) \
00481 rtl_check_failed_code1 (_rtx, (C), __FILE__, __LINE__, \
00482 __FUNCTION__); \
00483 &_rtx->u.fld[_n]; }))
00484
00485 #define RTL_CHECKC2(RTX, N, C1, C2) __extension__ \
00486 (*({ rtx const _rtx = (RTX); const int _n = (N); \
00487 const enum rtx_code _code = GET_CODE (_rtx); \
00488 if (_code != (C1) && _code != (C2)) \
00489 rtl_check_failed_code2 (_rtx, (C1), (C2), __FILE__, __LINE__, \
00490 __FUNCTION__); \
00491 &_rtx->u.fld[_n]; }))
00492
00493 #define RTVEC_ELT(RTVEC, I) __extension__ \
00494 (*({ rtvec const _rtvec = (RTVEC); const int _i = (I); \
00495 if (_i < 0 || _i >= GET_NUM_ELEM (_rtvec)) \
00496 rtvec_check_failed_bounds (_rtvec, _i, __FILE__, __LINE__, \
00497 __FUNCTION__); \
00498 &_rtvec->elem[_i]; }))
00499
00500 #define XWINT(RTX, N) __extension__ \
00501 (*({ rtx const _rtx = (RTX); const int _n = (N); \
00502 const enum rtx_code _code = GET_CODE (_rtx); \
00503 if (_n < 0 || _n >= GET_RTX_LENGTH (_code)) \
00504 rtl_check_failed_bounds (_rtx, _n, __FILE__, __LINE__, \
00505 __FUNCTION__); \
00506 if (GET_RTX_FORMAT(_code)[_n] != 'w') \
00507 rtl_check_failed_type1 (_rtx, _n, 'w', __FILE__, __LINE__, \
00508 __FUNCTION__); \
00509 &_rtx->u.hwint[_n]; }))
00510
00511 #define XCWINT(RTX, N, C) __extension__ \
00512 (*({ rtx const _rtx = (RTX); \
00513 if (GET_CODE (_rtx) != (C)) \
00514 rtl_check_failed_code1 (_rtx, (C), __FILE__, __LINE__, \
00515 __FUNCTION__); \
00516 &_rtx->u.hwint[N]; }))
00517
00518 #define XCMWINT(RTX, N, C, M) __extension__ \
00519 (*({ rtx const _rtx = (RTX); \
00520 if (GET_CODE (_rtx) != (C) || GET_MODE (_rtx) != (M)) \
00521 rtl_check_failed_code_mode (_rtx, (C), (M), false, __FILE__, \
00522 __LINE__, __FUNCTION__); \
00523 &_rtx->u.hwint[N]; }))
00524
00525 #define XCNMPRV(RTX, C, M) __extension__ \
00526 ({ rtx const _rtx = (RTX); \
00527 if (GET_CODE (_rtx) != (C) || GET_MODE (_rtx) == (M)) \
00528 rtl_check_failed_code_mode (_rtx, (C), (M), true, __FILE__, \
00529 __LINE__, __FUNCTION__); \
00530 &_rtx->u.rv; })
00531
00532 #define BLOCK_SYMBOL_CHECK(RTX) __extension__ \
00533 ({ rtx const _symbol = (RTX); \
00534 unsigned int flags = RTL_CHECKC1 (_symbol, 1, SYMBOL_REF).rt_int; \
00535 if ((flags & SYMBOL_FLAG_HAS_BLOCK_INFO) == 0) \
00536 rtl_check_failed_block_symbol (__FILE__, __LINE__, \
00537 __FUNCTION__); \
00538 &_symbol->u.block_sym; })
00539
00540 extern void rtl_check_failed_bounds (rtx, int, const char *, int,
00541 const char *)
00542 ATTRIBUTE_NORETURN;
00543 extern void rtl_check_failed_type1 (rtx, int, int, const char *, int,
00544 const char *)
00545 ATTRIBUTE_NORETURN;
00546 extern void rtl_check_failed_type2 (rtx, int, int, int, const char *,
00547 int, const char *)
00548 ATTRIBUTE_NORETURN;
00549 extern void rtl_check_failed_code1 (rtx, enum rtx_code, const char *,
00550 int, const char *)
00551 ATTRIBUTE_NORETURN;
00552 extern void rtl_check_failed_code2 (rtx, enum rtx_code, enum rtx_code,
00553 const char *, int, const char *)
00554 ATTRIBUTE_NORETURN;
00555 extern void rtl_check_failed_code_mode (rtx, enum rtx_code, enum machine_mode,
00556 bool, const char *, int, const char *)
00557 ATTRIBUTE_NORETURN;
00558 extern void rtl_check_failed_block_symbol (const char *, int, const char *)
00559 ATTRIBUTE_NORETURN;
00560 extern void rtvec_check_failed_bounds (rtvec, int, const char *, int,
00561 const char *)
00562 ATTRIBUTE_NORETURN;
00563
00564 #else /* not ENABLE_RTL_CHECKING */
00565
00566 #define RTL_CHECK1(RTX, N, C1) ((RTX)->u.fld[N])
00567 #define RTL_CHECK2(RTX, N, C1, C2) ((RTX)->u.fld[N])
00568 #define RTL_CHECKC1(RTX, N, C) ((RTX)->u.fld[N])
00569 #define RTL_CHECKC2(RTX, N, C1, C2) ((RTX)->u.fld[N])
00570 #define RTVEC_ELT(RTVEC, I) ((RTVEC)->elem[I])
00571 #define XWINT(RTX, N) ((RTX)->u.hwint[N])
00572 #define XCWINT(RTX, N, C) ((RTX)->u.hwint[N])
00573 #define XCMWINT(RTX, N, C, M) ((RTX)->u.hwint[N])
00574 #define XCNMWINT(RTX, N, C, M) ((RTX)->u.hwint[N])
00575 #define XCNMPRV(RTX, C, M) (&(RTX)->u.rv)
00576 #define BLOCK_SYMBOL_CHECK(RTX) (&(RTX)->u.block_sym)
00577
00578 #endif
00579
00580 /* General accessor macros for accessing the flags of an rtx. */
00581
00582 /* Access an individual rtx flag, with no checking of any kind. */
00583 #define RTX_FLAG(RTX, FLAG) ((RTX)->FLAG)
00584
00585 #if defined ENABLE_RTL_FLAG_CHECKING && (GCC_VERSION >= 2007)
00586 #define RTL_FLAG_CHECK1(NAME, RTX, C1) __extension__ \
00587 ({ rtx const _rtx = (RTX); \
00588 if (GET_CODE(_rtx) != C1) \
00589 rtl_check_failed_flag (NAME, _rtx, __FILE__, __LINE__, \
00590 __FUNCTION__); \
00591 _rtx; })
00592
00593 #define RTL_FLAG_CHECK2(NAME, RTX, C1, C2) __extension__ \
00594 ({ rtx const _rtx = (RTX); \
00595 if (GET_CODE(_rtx) != C1 && GET_CODE(_rtx) != C2) \
00596 rtl_check_failed_flag (NAME,_rtx, __FILE__, __LINE__, \
00597 __FUNCTION__); \
00598 _rtx; })
00599
00600 #define RTL_FLAG_CHECK3(NAME, RTX, C1, C2, C3) __extension__ \
00601 ({ rtx const _rtx = (RTX); \
00602 if (GET_CODE(_rtx) != C1 && GET_CODE(_rtx) != C2 \
00603 && GET_CODE(_rtx) != C3) \
00604 rtl_check_failed_flag (NAME, _rtx, __FILE__, __LINE__, \
00605 __FUNCTION__); \
00606 _rtx; })
00607
00608 #define RTL_FLAG_CHECK4(NAME, RTX, C1, C2, C3, C4) __extension__ \
00609 ({ rtx const _rtx = (RTX); \
00610 if (GET_CODE(_rtx) != C1 && GET_CODE(_rtx) != C2 \
00611 && GET_CODE(_rtx) != C3 && GET_CODE(_rtx) != C4) \
00612 rtl_check_failed_flag (NAME, _rtx, __FILE__, __LINE__, \
00613 __FUNCTION__); \
00614 _rtx; })
00615
00616 #define RTL_FLAG_CHECK5(NAME, RTX, C1, C2, C3, C4, C5) __extension__ \
00617 ({ rtx const _rtx = (RTX); \
00618 if (GET_CODE(_rtx) != C1 && GET_CODE(_rtx) != C2 \
00619 && GET_CODE(_rtx) != C3 && GET_CODE(_rtx) != C4 \
00620 && GET_CODE(_rtx) != C5) \
00621 rtl_check_failed_flag (NAME, _rtx, __FILE__, __LINE__, \
00622 __FUNCTION__); \
00623 _rtx; })
00624
00625 #define RTL_FLAG_CHECK6(NAME, RTX, C1, C2, C3, C4, C5, C6) \
00626 __extension__ \
00627 ({ rtx const _rtx = (RTX); \
00628 if (GET_CODE(_rtx) != C1 && GET_CODE(_rtx) != C2 \
00629 && GET_CODE(_rtx) != C3 && GET_CODE(_rtx) != C4 \
00630 && GET_CODE(_rtx) != C5 && GET_CODE(_rtx) != C6) \
00631 rtl_check_failed_flag (NAME,_rtx, __FILE__, __LINE__, \
00632 __FUNCTION__); \
00633 _rtx; })
00634
00635 #define RTL_FLAG_CHECK7(NAME, RTX, C1, C2, C3, C4, C5, C6, C7) \
00636 __extension__ \
00637 ({ rtx const _rtx = (RTX); \
00638 if (GET_CODE(_rtx) != C1 && GET_CODE(_rtx) != C2 \
00639 && GET_CODE(_rtx) != C3 && GET_CODE(_rtx) != C4 \
00640 && GET_CODE(_rtx) != C5 && GET_CODE(_rtx) != C6 \
00641 && GET_CODE(_rtx) != C7) \
00642 rtl_check_failed_flag (NAME, _rtx, __FILE__, __LINE__, \
00643 __FUNCTION__); \
00644 _rtx; })
00645
00646 #define RTL_FLAG_CHECK8(NAME, RTX, C1, C2, C3, C4, C5, C6, C7, C8) \
00647 __extension__ \
00648 ({ rtx const _rtx = (RTX); \
00649 if (GET_CODE(_rtx) != C1 && GET_CODE(_rtx) != C2 \
00650 && GET_CODE(_rtx) != C3 && GET_CODE(_rtx) != C4 \
00651 && GET_CODE(_rtx) != C5 && GET_CODE(_rtx) != C6 \
00652 && GET_CODE(_rtx) != C7 && GET_CODE(_rtx) != C8) \
00653 rtl_check_failed_flag (NAME, _rtx, __FILE__, __LINE__, \
00654 __FUNCTION__); \
00655 _rtx; })
00656
00657 extern void rtl_check_failed_flag (const char *, rtx, const char *,
00658 int, const char *)
00659 ATTRIBUTE_NORETURN
00660 ;
00661
00662 #else /* not ENABLE_RTL_FLAG_CHECKING */
00663
00664 #define RTL_FLAG_CHECK1(NAME, RTX, C1) (RTX)
00665 #define RTL_FLAG_CHECK2(NAME, RTX, C1, C2) (RTX)
00666 #define RTL_FLAG_CHECK3(NAME, RTX, C1, C2, C3) (RTX)
00667 #define RTL_FLAG_CHECK4(NAME, RTX, C1, C2, C3, C4) (RTX)
00668 #define RTL_FLAG_CHECK5(NAME, RTX, C1, C2, C3, C4, C5) (RTX)
00669 #define RTL_FLAG_CHECK6(NAME, RTX, C1, C2, C3, C4, C5, C6) (RTX)
00670 #define RTL_FLAG_CHECK7(NAME, RTX, C1, C2, C3, C4, C5, C6, C7) (RTX)
00671 #define RTL_FLAG_CHECK8(NAME, RTX, C1, C2, C3, C4, C5, C6, C7, C8) (RTX)
00672 #endif
00673
00674 #define XINT(RTX, N) (RTL_CHECK2 (RTX, N, 'i', 'n').rt_int)
00675 #define XSTR(RTX, N) (RTL_CHECK2 (RTX, N, 's', 'S').rt_str)
00676 #define XEXP(RTX, N) (RTL_CHECK2 (RTX, N, 'e', 'u').rt_rtx)
00677 #define XVEC(RTX, N) (RTL_CHECK2 (RTX, N, 'E', 'V').rt_rtvec)
00678 #define XMODE(RTX, N) (RTL_CHECK1 (RTX, N, 'M').rt_type)
00679 #define XBITMAP(RTX, N) (RTL_CHECK1 (RTX, N, 'b').rt_bit)
00680 #define XTREE(RTX, N) (RTL_CHECK1 (RTX, N, 't').rt_tree)
00681 #define XBBDEF(RTX, N) (RTL_CHECK1 (RTX, N, 'B').rt_bb)
00682 #define XTMPL(RTX, N) (RTL_CHECK1 (RTX, N, 'T').rt_str)
00683
00684 #define XVECEXP(RTX, N, M) RTVEC_ELT (XVEC (RTX, N), M)
00685 #define XVECLEN(RTX, N) GET_NUM_ELEM (XVEC (RTX, N))
00686
00687 /* These are like XINT, etc. except that they expect a '0' field instead
00688 of the normal type code. */
00689
00690 #define X0INT(RTX, N) (RTL_CHECK1 (RTX, N, '0').rt_int)
00691 #define X0UINT(RTX, N) (RTL_CHECK1 (RTX, N, '0').rt_uint)
00692 #define X0STR(RTX, N) (RTL_CHECK1 (RTX, N, '0').rt_str)
00693 #define X0EXP(RTX, N) (RTL_CHECK1 (RTX, N, '0').rt_rtx)
00694 #define X0VEC(RTX, N) (RTL_CHECK1 (RTX, N, '0').rt_rtvec)
00695 #define X0MODE(RTX, N) (RTL_CHECK1 (RTX, N, '0').rt_type)
00696 #define X0BITMAP(RTX, N) (RTL_CHECK1 (RTX, N, '0').rt_bit)
00697 #define X0TREE(RTX, N) (RTL_CHECK1 (RTX, N, '0').rt_tree)
00698 #define X0BBDEF(RTX, N) (RTL_CHECK1 (RTX, N, '0').rt_bb)
00699 #define X0ADVFLAGS(RTX, N) (RTL_CHECK1 (RTX, N, '0').rt_addr_diff_vec_flags)
00700 #define X0CSELIB(RTX, N) (RTL_CHECK1 (RTX, N, '0').rt_cselib)
00701 #define X0MEMATTR(RTX, N) (RTL_CHECKC1 (RTX, N, MEM).rt_mem)
00702 #define X0REGATTR(RTX, N) (RTL_CHECKC1 (RTX, N, REG).rt_reg)
00703 #define X0CONSTANT(RTX, N) (RTL_CHECK1 (RTX, N, '0').rt_constant)
00704
00705 /* Access a '0' field with any type. */
00706 #define X0ANY(RTX, N) RTL_CHECK1 (RTX, N, '0')
00707
00708 #define XCINT(RTX, N, C) (RTL_CHECKC1 (RTX, N, C).rt_int)
00709 #define XCUINT(RTX, N, C) (RTL_CHECKC1 (RTX, N, C).rt_uint)
00710 #define XCSTR(RTX, N, C) (RTL_CHECKC1 (RTX, N, C).rt_str)
00711 #define XCEXP(RTX, N, C) (RTL_CHECKC1 (RTX, N, C).rt_rtx)
00712 #define XCVEC(RTX, N, C) (RTL_CHECKC1 (RTX, N, C).rt_rtvec)
00713 #define XCMODE(RTX, N, C) (RTL_CHECKC1 (RTX, N, C).rt_type)
00714 #define XCBITMAP(RTX, N, C) (RTL_CHECKC1 (RTX, N, C).rt_bit)
00715 #define XCTREE(RTX, N, C) (RTL_CHECKC1 (RTX, N, C).rt_tree)
00716 #define XCBBDEF(RTX, N, C) (RTL_CHECKC1 (RTX, N, C).rt_bb)
00717 #define XCCSELIB(RTX, N, C) (RTL_CHECKC1 (RTX, N, C).rt_cselib)
00718
00719 #define XCVECEXP(RTX, N, M, C) RTVEC_ELT (XCVEC (RTX, N, C), M)
00720 #define XCVECLEN(RTX, N, C) GET_NUM_ELEM (XCVEC (RTX, N, C))
00721
00722 #define XC2EXP(RTX, N, C1, C2) (RTL_CHECKC2 (RTX, N, C1, C2).rt_rtx)
00723
00724 /* ACCESS MACROS for particular fields of insns. */
00725
00726 /* Holds a unique number for each insn.
00727 These are not necessarily sequentially increasing. */
00728 #define INSN_UID(INSN) XINT (INSN, 0)
00729
00730 /* Chain insns together in sequence. */
00731 #define PREV_INSN(INSN) XEXP (INSN, 1)
00732 #define NEXT_INSN(INSN) XEXP (INSN, 2)
00733
00734 #define BLOCK_FOR_INSN(INSN) XBBDEF (INSN, 3)
00735 #define INSN_LOCATOR(INSN) XINT (INSN, 4)
00736 /* The body of an insn. */
00737 #define PATTERN(INSN) XEXP (INSN, 5)
00738
00739 /* Code number of instruction, from when it was recognized.
00740 -1 means this instruction has not been recognized yet. */
00741 #define INSN_CODE(INSN) XINT (INSN, 6)
00742
00743 /* Set up in flow.c; empty before then.
00744 Holds a chain of INSN_LIST rtx's whose first operands point at
00745 previous insns with direct data-flow connections to this one.
00746 That means that those insns set variables whose next use is in this insn.
00747 They are always in the same basic block as this insn. */
00748 #define LOG_LINKS(INSN) XEXP(INSN, 7)
00749
00750 #define RTX_FRAME_RELATED_P(RTX) \
00751 (RTL_FLAG_CHECK5("RTX_FRAME_RELATED_P", (RTX), INSN, CALL_INSN, \
00752 JUMP_INSN, BARRIER, SET)->frame_related)
00753
00754 /* 1 if RTX is an insn that has been deleted. */
00755 #define INSN_DELETED_P(RTX) \
00756 (RTL_FLAG_CHECK6("INSN_DELETED_P", (RTX), INSN, CALL_INSN, JUMP_INSN, \
00757 CODE_LABEL, BARRIER, NOTE)->volatil)
00758
00759 /* 1 if RTX is a call to a const or pure function. */
00760 #define CONST_OR_PURE_CALL_P(RTX) \
00761 (RTL_FLAG_CHECK3("CONST_OR_PURE_CALL_P", (RTX), CALL_INSN, NOTE, \
00762 EXPR_LIST)->unchanging)
00763
00764 /* 1 if RTX is a call_insn for a sibling call. */
00765 #define SIBLING_CALL_P(RTX) \
00766 (RTL_FLAG_CHECK1("SIBLING_CALL_P", (RTX), CALL_INSN)->jump)
00767
00768 /* 1 if RTX is a jump_insn, call_insn, or insn that is an annulling branch. */
00769 #define INSN_ANNULLED_BRANCH_P(RTX) \
00770 (RTL_FLAG_CHECK3("INSN_ANNULLED_BRANCH_P", (RTX), JUMP_INSN, CALL_INSN, INSN)->unchanging)
00771
00772 /* 1 if RTX is an insn in a delay slot and is from the target of the branch.
00773 If the branch insn has INSN_ANNULLED_BRANCH_P set, this insn should only be
00774 executed if the branch is taken. For annulled branches with this bit
00775 clear, the insn should be executed only if the branch is not taken. */
00776 #define INSN_FROM_TARGET_P(RTX) \
00777 (RTL_FLAG_CHECK3("INSN_FROM_TARGET_P", (RTX), INSN, JUMP_INSN, CALL_INSN)->in_struct)
00778
00779 /* In an ADDR_DIFF_VEC, the flags for RTX for use by branch shortening.
00780 See the comments for ADDR_DIFF_VEC in rtl.def. */
00781 #define ADDR_DIFF_VEC_FLAGS(RTX) X0ADVFLAGS(RTX, 4)
00782
00783 /* In a VALUE, the value cselib has assigned to RTX.
00784 This is a "struct cselib_val_struct", see cselib.h. */
00785 #define CSELIB_VAL_PTR(RTX) X0CSELIB(RTX, 0)
00786
00787
00788
00789
00790
00791
00792 #define REG_NOTES(INSN) XEXP(INSN, 8)
00793
00794 enum reg_note
00795 {
00796 #define DEF_REG_NOTE(NAME) NAME,
00797 #include "reg-notes.def"
00798 #undef DEF_REG_NOTE
00799 REG_NOTE_MAX
00800 };
00801
00802
00803 #define REG_NOTE_KIND(LINK) ((enum reg_note) GET_MODE (LINK))
00804 #define PUT_REG_NOTE_KIND(LINK, KIND) \
00805 PUT_MODE (LINK, (enum machine_mode) (KIND))
00806
00807
00808
00809 extern const char * const reg_note_name[];
00810 #define GET_REG_NOTE_NAME(MODE) (reg_note_name[(int) (MODE)])
00811
00812
00813
00814
00815
00816
00817
00818
00819 #define CALL_INSN_FUNCTION_USAGE(INSN) XEXP(INSN, 9)
00820
00821
00822
00823
00824 #define CODE_LABEL_NUMBER(INSN) XINT (INSN, 6)
00825
00826
00827
00828
00829
00830
00831
00832
00833 #define NOTE_DATA(INSN) RTL_CHECKC1 (INSN, 4, NOTE)
00834 #define NOTE_DELETED_LABEL_NAME(INSN) XCSTR (INSN, 4, NOTE)
00835 #ifdef USE_MAPPED_LOCATION
00836 #define NOTE_SOURCE_LOCATION(INSN) XCUINT (INSN, 5, NOTE)
00837 #define NOTE_EXPANDED_LOCATION(XLOC, INSN) \
00838 (XLOC) = expand_location (NOTE_SOURCE_LOCATION (INSN))
00839 #define SET_INSN_DELETED(INSN) \
00840 (PUT_CODE (INSN, NOTE), NOTE_LINE_NUMBER (INSN) = NOTE_INSN_DELETED)
00841 #else
00842 #define NOTE_EXPANDED_LOCATION(XLOC, INSN) \
00843 ((XLOC).file = NOTE_SOURCE_FILE (INSN), \
00844 (XLOC).line = NOTE_LINE_NUMBER (INSN))
00845 #define NOTE_SOURCE_FILE(INSN) XCSTR (INSN, 4, NOTE)
00846 #define SET_INSN_DELETED(INSN) \
00847 (PUT_CODE (INSN, NOTE), NOTE_SOURCE_FILE (INSN) = 0, \
00848 NOTE_LINE_NUMBER (INSN) = NOTE_INSN_DELETED)
00849 #endif
00850 #define NOTE_BLOCK(INSN) XCTREE (INSN, 4, NOTE)
00851 #define NOTE_EH_HANDLER(INSN) XCINT (INSN, 4, NOTE)
00852 #define NOTE_BASIC_BLOCK(INSN) XCBBDEF (INSN, 4, NOTE)
00853 #define NOTE_EXPECTED_VALUE(INSN) XCEXP (INSN, 4, NOTE)
00854 #define NOTE_VAR_LOCATION(INSN) XCEXP (INSN, 4, NOTE)
00855
00856
00857
00858 #define NOTE_LINE_NUMBER(INSN) XCINT (INSN, 5, NOTE)
00859
00860
00861 #define NOTE_INSN_BASIC_BLOCK_P(INSN) \
00862 (GET_CODE (INSN) == NOTE \
00863 && NOTE_LINE_NUMBER (INSN) == NOTE_INSN_BASIC_BLOCK)
00864
00865
00866 #define NOTE_VAR_LOCATION_DECL(INSN) (XCTREE (XCEXP (INSN, 4, NOTE), \
00867 0, VAR_LOCATION))
00868 #define NOTE_VAR_LOCATION_LOC(INSN) (XCEXP (XCEXP (INSN, 4, NOTE), \
00869 1, VAR_LOCATION))
00870
00871
00872
00873
00874
00875
00876
00877
00878
00879
00880 enum insn_note
00881 {
00882
00883 NOTE_INSN_BIAS = -100,
00884
00885 #define DEF_INSN_NOTE(NAME) NAME,
00886 #include "insn-notes.def"
00887 #undef DEF_INSN_NOTE
00888
00889 NOTE_INSN_MAX
00890 };
00891
00892
00893
00894 extern const char * const note_insn_name[NOTE_INSN_MAX - NOTE_INSN_BIAS];
00895 #define GET_NOTE_INSN_NAME(NOTE_CODE) \
00896 (note_insn_name[(NOTE_CODE) - (int) NOTE_INSN_BIAS])
00897
00898
00899
00900 #define LABEL_NAME(RTX) XCSTR (RTX, 7, CODE_LABEL)
00901
00902
00903
00904 #define LABEL_NUSES(RTX) XCINT (RTX, 4, CODE_LABEL)
00905
00906
00907
00908
00909 enum label_kind
00910 {
00911 LABEL_NORMAL = 0,
00912 LABEL_STATIC_ENTRY,
00913 LABEL_GLOBAL_ENTRY,
00914 LABEL_WEAK_ENTRY
00915 };
00916
00917 #if defined ENABLE_RTL_FLAG_CHECKING && (GCC_VERSION > 2007)
00918
00919
00920 #define LABEL_KIND(LABEL) __extension__ \
00921 ({ rtx const _label = (LABEL); \
00922 if (GET_CODE (_label) != CODE_LABEL) \
00923 rtl_check_failed_flag ("LABEL_KIND", _label, __FILE__, __LINE__, \
00924 __FUNCTION__); \
00925 (enum label_kind) ((_label->jump << 1) | _label->call); })
00926
00927
00928 #define SET_LABEL_KIND(LABEL, KIND) do { \
00929 rtx _label = (LABEL); \
00930 unsigned int _kind = (KIND); \
00931 if (GET_CODE (_label) != CODE_LABEL) \
00932 rtl_check_failed_flag ("SET_LABEL_KIND", _label, __FILE__, __LINE__, \
00933 __FUNCTION__); \
00934 _label->jump = ((_kind >> 1) & 1); \
00935 _label->call = (_kind & 1); \
00936 } while (0)
00937
00938 #else
00939
00940
00941 #define LABEL_KIND(LABEL) \
00942 ((enum label_kind) (((LABEL)->jump << 1) | (LABEL)->call))
00943
00944
00945 #define SET_LABEL_KIND(LABEL, KIND) do { \
00946 rtx _label = (LABEL); \
00947 unsigned int _kind = (KIND); \
00948 _label->jump = ((_kind >> 1) & 1); \
00949 _label->call = (_kind & 1); \
00950 } while (0)
00951
00952 #endif
00953
00954 #define LABEL_ALT_ENTRY_P(LABEL) (LABEL_KIND (LABEL) != LABEL_NORMAL)
00955
00956
00957
00958
00959 #define JUMP_LABEL(INSN) XCEXP (INSN, 9, JUMP_INSN)
00960
00961
00962
00963
00964
00965 #define LABEL_REFS(LABEL) XCEXP (LABEL, 5, CODE_LABEL)
00966
00967
00968
00969
00970
00971 #define REGNO(RTX) XCUINT (RTX, 0, REG)
00972 #define ORIGINAL_REGNO(RTX) X0UINT (RTX, 1)
00973
00974
00975
00976 #define REG_FUNCTION_VALUE_P(RTX) \
00977 (RTL_FLAG_CHECK2("REG_FUNCTION_VALUE_P", (RTX), REG, PARALLEL)->return_val)
00978
00979
00980 #define REG_USERVAR_P(RTX) \
00981 (RTL_FLAG_CHECK1("REG_USERVAR_P", (RTX), REG)->volatil)
00982
00983
00984 #define REG_POINTER(RTX) \
00985 (RTL_FLAG_CHECK1("REG_POINTER", (RTX), REG)->frame_related)
00986
00987
00988 #define MEM_POINTER(RTX) \
00989 (RTL_FLAG_CHECK1("MEM_POINTER", (RTX), MEM)->frame_related)
00990
00991
00992 #define HARD_REGISTER_P(REG) (HARD_REGISTER_NUM_P (REGNO (REG)))
00993
00994
00995 #define HARD_REGISTER_NUM_P(REG_NO) ((REG_NO) < FIRST_PSEUDO_REGISTER)
00996
00997
00998 #define INTVAL(RTX) XCWINT(RTX, 0, CONST_INT)
00999 #define UINTVAL(RTX) ((unsigned HOST_WIDE_INT) INTVAL (RTX))
01000
01001
01002
01003
01004
01005
01006 #define CONST_DOUBLE_LOW(r) XCMWINT (r, 0, CONST_DOUBLE, VOIDmode)
01007 #define CONST_DOUBLE_HIGH(r) XCMWINT (r, 1, CONST_DOUBLE, VOIDmode)
01008 #define CONST_DOUBLE_REAL_VALUE(r) \
01009 ((const struct real_value *) XCNMPRV (r, CONST_DOUBLE, VOIDmode))
01010
01011
01012 #define CONST_VECTOR_ELT(RTX, N) XCVECEXP (RTX, 0, N, CONST_VECTOR)
01013
01014
01015 #define CONST_VECTOR_NUNITS(RTX) XCVECLEN (RTX, 0, CONST_VECTOR)
01016
01017
01018
01019
01020 #define SUBREG_REG(RTX) XCEXP (RTX, 0, SUBREG)
01021 #define SUBREG_BYTE(RTX) XCUINT (RTX, 1, SUBREG)
01022
01023
01024
01025
01026
01027 #define COSTS_N_INSNS(N) ((N) * 4)
01028
01029
01030
01031 #define MAX_COST INT_MAX
01032
01033 extern void init_rtlanal (void);
01034 extern int rtx_cost (rtx, enum rtx_code);
01035 extern int address_cost (rtx, enum machine_mode);
01036 extern unsigned int subreg_lsb (rtx);
01037 extern unsigned int subreg_lsb_1 (enum machine_mode, enum machine_mode,
01038 unsigned int);
01039 extern unsigned int subreg_regno_offset (unsigned int, enum machine_mode,
01040 unsigned int, enum machine_mode);
01041 extern bool subreg_offset_representable_p (unsigned int, enum machine_mode,
01042 unsigned int, enum machine_mode);
01043 extern unsigned int subreg_regno (rtx);
01044 extern unsigned HOST_WIDE_INT nonzero_bits (rtx, enum machine_mode);
01045 extern unsigned int num_sign_bit_copies (rtx, enum machine_mode);
01046 extern bool constant_pool_constant_p (rtx);
01047 extern bool truncated_to_mode (enum machine_mode, rtx);
01048
01049
01050
01051
01052
01053
01054
01055
01056
01057
01058 #define SUBREG_PROMOTED_VAR_P(RTX) \
01059 (RTL_FLAG_CHECK1("SUBREG_PROMOTED", (RTX), SUBREG)->in_struct)
01060
01061 #define SUBREG_PROMOTED_UNSIGNED_SET(RTX, VAL) \
01062 do { \
01063 rtx const _rtx = RTL_FLAG_CHECK1("SUBREG_PROMOTED_UNSIGNED_SET", (RTX), SUBREG); \
01064 if ((VAL) < 0) \
01065 _rtx->volatil = 1; \
01066 else { \
01067 _rtx->volatil = 0; \
01068 _rtx->unchanging = (VAL); \
01069 } \
01070 } while (0)
01071 #define SUBREG_PROMOTED_UNSIGNED_P(RTX) \
01072 ((RTL_FLAG_CHECK1("SUBREG_PROMOTED_UNSIGNED_P", (RTX), SUBREG)->volatil) \
01073 ? -1 : (RTX)->unchanging)
01074
01075
01076
01077 #define ASM_OPERANDS_TEMPLATE(RTX) XCSTR (RTX, 0, ASM_OPERANDS)
01078 #define ASM_OPERANDS_OUTPUT_CONSTRAINT(RTX) XCSTR (RTX, 1, ASM_OPERANDS)
01079 #define ASM_OPERANDS_OUTPUT_IDX(RTX) XCINT (RTX, 2, ASM_OPERANDS)
01080 #define ASM_OPERANDS_INPUT_VEC(RTX) XCVEC (RTX, 3, ASM_OPERANDS)
01081 #define ASM_OPERANDS_INPUT_CONSTRAINT_VEC(RTX) XCVEC (RTX, 4, ASM_OPERANDS)
01082 #define ASM_OPERANDS_INPUT(RTX, N) XCVECEXP (RTX, 3, N, ASM_OPERANDS)
01083 #define ASM_OPERANDS_INPUT_LENGTH(RTX) XCVECLEN (RTX, 3, ASM_OPERANDS)
01084 #define ASM_OPERANDS_INPUT_CONSTRAINT_EXP(RTX, N) \
01085 XCVECEXP (RTX, 4, N, ASM_OPERANDS)
01086 #define ASM_OPERANDS_INPUT_CONSTRAINT(RTX, N) \
01087 XSTR (XCVECEXP (RTX, 4, N, ASM_OPERANDS), 0)
01088 #define ASM_OPERANDS_INPUT_MODE(RTX, N) \
01089 GET_MODE (XCVECEXP (RTX, 4, N, ASM_OPERANDS))
01090 #ifdef USE_MAPPED_LOCATION
01091 #define ASM_OPERANDS_SOURCE_LOCATION(RTX) XCUINT (RTX, 5, ASM_OPERANDS)
01092 #else
01093 #define ASM_OPERANDS_SOURCE_FILE(RTX) XCSTR (RTX, 5, ASM_OPERANDS)
01094 #define ASM_OPERANDS_SOURCE_LINE(RTX) XCINT (RTX, 6, ASM_OPERANDS)
01095 #endif
01096
01097
01098 #define MEM_READONLY_P(RTX) \
01099 (RTL_FLAG_CHECK1("MEM_READONLY_P", (RTX), MEM)->unchanging)
01100
01101
01102
01103
01104 #define MEM_KEEP_ALIAS_SET_P(RTX) \
01105 (RTL_FLAG_CHECK1("MEM_KEEP_ALIAS_SET_P", (RTX), MEM)->jump)
01106
01107
01108 #define MEM_VOLATILE_P(RTX) \
01109 (RTL_FLAG_CHECK3("MEM_VOLATILE_P", (RTX), MEM, ASM_OPERANDS, \
01110 ASM_INPUT)->volatil)
01111
01112
01113
01114
01115 #define MEM_IN_STRUCT_P(RTX) \
01116 (RTL_FLAG_CHECK1("MEM_IN_STRUCT_P", (RTX), MEM)->in_struct)
01117
01118
01119
01120 #define MEM_SCALAR_P(RTX) \
01121 (RTL_FLAG_CHECK1("MEM_SCALAR_P", (RTX), MEM)->return_val)
01122
01123
01124 #define MEM_NOTRAP_P(RTX) \
01125 (RTL_FLAG_CHECK1("MEM_NOTRAP_P", (RTX), MEM)->call)
01126
01127
01128
01129
01130
01131 #define MEM_SET_IN_STRUCT_P(RTX, VAL) \
01132 do { \
01133 if (VAL) \
01134 { \
01135 MEM_IN_STRUCT_P (RTX) = 1; \
01136 MEM_SCALAR_P (RTX) = 0; \
01137 } \
01138 else \
01139 { \
01140 MEM_IN_STRUCT_P (RTX) = 0; \
01141 MEM_SCALAR_P (RTX) = 1; \
01142 } \
01143 } while (0)
01144
01145
01146
01147 #define MEM_ATTRS(RTX) X0MEMATTR (RTX, 1)
01148
01149
01150
01151 #define REG_ATTRS(RTX) X0REGATTR (RTX, 2)
01152
01153
01154
01155
01156
01157
01158
01159 #define MEM_ALIAS_SET(RTX) (MEM_ATTRS (RTX) == 0 ? 0 : MEM_ATTRS (RTX)->alias)
01160
01161
01162
01163 #define MEM_EXPR(RTX) (MEM_ATTRS (RTX) == 0 ? 0 : MEM_ATTRS (RTX)->expr)
01164
01165
01166
01167 #define MEM_OFFSET(RTX) (MEM_ATTRS (RTX) == 0 ? 0 : MEM_ATTRS (RTX)->offset)
01168
01169
01170
01171 #define MEM_SIZE(RTX) \
01172 (MEM_ATTRS (RTX) != 0 ? MEM_ATTRS (RTX)->size \
01173 : GET_MODE (RTX) != BLKmode ? GEN_INT (GET_MODE_SIZE (GET_MODE (RTX))) \
01174 : 0)
01175
01176
01177
01178 #define MEM_ALIGN(RTX) \
01179 (MEM_ATTRS (RTX) != 0 ? MEM_ATTRS (RTX)->align \
01180 : (STRICT_ALIGNMENT && GET_MODE (RTX) != BLKmode \
01181 ? GET_MODE_ALIGNMENT (GET_MODE (RTX)) : BITS_PER_UNIT))
01182
01183
01184
01185 #define REG_EXPR(RTX) (REG_ATTRS (RTX) == 0 ? 0 : REG_ATTRS (RTX)->decl)
01186
01187
01188
01189 #define REG_OFFSET(RTX) (REG_ATTRS (RTX) == 0 ? 0 : REG_ATTRS (RTX)->offset)
01190
01191
01192 #define MEM_COPY_ATTRIBUTES(LHS, RHS) \
01193 (MEM_VOLATILE_P (LHS) = MEM_VOLATILE_P (RHS), \
01194 MEM_IN_STRUCT_P (LHS) = MEM_IN_STRUCT_P (RHS), \
01195 MEM_SCALAR_P (LHS) = MEM_SCALAR_P (RHS), \
01196 MEM_NOTRAP_P (LHS) = MEM_NOTRAP_P (RHS), \
01197 MEM_READONLY_P (LHS) = MEM_READONLY_P (RHS), \
01198 MEM_KEEP_ALIAS_SET_P (LHS) = MEM_KEEP_ALIAS_SET_P (RHS), \
01199 MEM_ATTRS (LHS) = MEM_ATTRS (RHS))
01200
01201
01202
01203 #define LABEL_REF_NONLOCAL_P(RTX) \
01204 (RTL_FLAG_CHECK2("LABEL_REF_NONLOCAL_P", (RTX), LABEL_REF, \
01205 REG_LABEL)->volatil)
01206
01207
01208 #define LABEL_PRESERVE_P(RTX) \
01209 (RTL_FLAG_CHECK2("LABEL_PRESERVE_P", (RTX), CODE_LABEL, NOTE)->in_struct)
01210
01211
01212
01213 #define SCHED_GROUP_P(RTX) \
01214 (RTL_FLAG_CHECK3("SCHED_GROUP_P", (RTX), INSN, JUMP_INSN, CALL_INSN \
01215 )->in_struct)
01216
01217
01218
01219 #define SET_DEST(RTX) XC2EXP(RTX, 0, SET, CLOBBER)
01220 #define SET_SRC(RTX) XCEXP(RTX, 1, SET)
01221 #define SET_IS_RETURN_P(RTX) \
01222 (RTL_FLAG_CHECK1("SET_IS_RETURN_P", (RTX), SET)->jump)
01223
01224
01225 #define TRAP_CONDITION(RTX) XCEXP (RTX, 0, TRAP_IF)
01226 #define TRAP_CODE(RTX) XCEXP (RTX, 1, TRAP_IF)
01227
01228
01229
01230
01231 #define COND_EXEC_TEST(RTX) XCEXP (RTX, 0, COND_EXEC)
01232 #define COND_EXEC_CODE(RTX) XCEXP (RTX, 1, COND_EXEC)
01233
01234
01235
01236 #define CONSTANT_POOL_ADDRESS_P(RTX) \
01237 (RTL_FLAG_CHECK1("CONSTANT_POOL_ADDRESS_P", (RTX), SYMBOL_REF)->unchanging)
01238
01239
01240
01241 #define TREE_CONSTANT_POOL_ADDRESS_P(RTX) \
01242 (RTL_FLAG_CHECK1("TREE_CONSTANT_POOL_ADDRESS_P", \
01243 (RTX), SYMBOL_REF)->frame_related)
01244
01245
01246 #define SYMBOL_REF_FLAG(RTX) \
01247 (RTL_FLAG_CHECK1("SYMBOL_REF_FLAG", (RTX), SYMBOL_REF)->volatil)
01248
01249
01250
01251 #define SYMBOL_REF_USED(RTX) \
01252 (RTL_FLAG_CHECK1("SYMBOL_REF_USED", (RTX), SYMBOL_REF)->used)
01253
01254
01255 #define SYMBOL_REF_WEAK(RTX) \
01256 (RTL_FLAG_CHECK1("SYMBOL_REF_WEAK", (RTX), SYMBOL_REF)->return_val)
01257
01258
01259
01260 #define SYMBOL_REF_DATA(RTX) X0ANY ((RTX), 2)
01261
01262
01263
01264 #define SET_SYMBOL_REF_DECL(RTX, DECL) \
01265 (gcc_assert (!CONSTANT_POOL_ADDRESS_P (RTX)), X0TREE ((RTX), 2) = (DECL))
01266
01267
01268 #define SYMBOL_REF_DECL(RTX) \
01269 (CONSTANT_POOL_ADDRESS_P (RTX) ? NULL : X0TREE ((RTX), 2))
01270
01271
01272 #define SET_SYMBOL_REF_CONSTANT(RTX, C) \
01273 (gcc_assert (CONSTANT_POOL_ADDRESS_P (RTX)), X0CONSTANT ((RTX), 2) = (C))
01274
01275
01276 #define SYMBOL_REF_CONSTANT(RTX) \
01277 (CONSTANT_POOL_ADDRESS_P (RTX) ? X0CONSTANT ((RTX), 2) : NULL)
01278
01279
01280
01281
01282
01283
01284
01285
01286 #define SYMBOL_REF_FLAGS(RTX) X0INT ((RTX), 1)
01287
01288
01289
01290
01291
01292 #define SYMBOL_FLAG_FUNCTION (1 << 0)
01293 #define SYMBOL_REF_FUNCTION_P(RTX) \
01294 ((SYMBOL_REF_FLAGS (RTX) & SYMBOL_FLAG_FUNCTION) != 0)
01295
01296 #define SYMBOL_FLAG_LOCAL (1 << 1)
01297 #define SYMBOL_REF_LOCAL_P(RTX) \
01298 ((SYMBOL_REF_FLAGS (RTX) & SYMBOL_FLAG_LOCAL) != 0)
01299
01300 #define SYMBOL_FLAG_SMALL (1 << 2)
01301 #define SYMBOL_REF_SMALL_P(RTX) \
01302 ((SYMBOL_REF_FLAGS (RTX) & SYMBOL_FLAG_SMALL) != 0)
01303
01304
01305 #define SYMBOL_FLAG_TLS_SHIFT 3
01306 #define SYMBOL_REF_TLS_MODEL(RTX) \
01307 ((enum tls_model) ((SYMBOL_REF_FLAGS (RTX) >> SYMBOL_FLAG_TLS_SHIFT) & 7))
01308
01309 #define SYMBOL_FLAG_EXTERNAL (1 << 6)
01310 #define SYMBOL_REF_EXTERNAL_P(RTX) \
01311 ((SYMBOL_REF_FLAGS (RTX) & SYMBOL_FLAG_EXTERNAL) != 0)
01312
01313 #define SYMBOL_FLAG_HAS_BLOCK_INFO (1 << 7)
01314 #define SYMBOL_REF_HAS_BLOCK_INFO_P(RTX) \
01315 ((SYMBOL_REF_FLAGS (RTX) & SYMBOL_FLAG_HAS_BLOCK_INFO) != 0)
01316
01317
01318 #define SYMBOL_FLAG_ANCHOR (1 << 8)
01319 #define SYMBOL_REF_ANCHOR_P(RTX) \
01320 ((SYMBOL_REF_FLAGS (RTX) & SYMBOL_FLAG_ANCHOR) != 0)
01321
01322
01323 #define SYMBOL_FLAG_MACH_DEP_SHIFT 9
01324 #define SYMBOL_FLAG_MACH_DEP (1 << SYMBOL_FLAG_MACH_DEP_SHIFT)
01325
01326
01327
01328
01329 #define SYMBOL_REF_BLOCK(RTX) (BLOCK_SYMBOL_CHECK (RTX)->block)
01330
01331
01332
01333
01334
01335 #define SYMBOL_REF_BLOCK_OFFSET(RTX) (BLOCK_SYMBOL_CHECK (RTX)->offset)
01336
01337
01338
01339
01340 #if (defined (HAVE_PRE_INCREMENT) || defined (HAVE_PRE_DECREMENT) || defined (HAVE_POST_INCREMENT) || defined (HAVE_POST_DECREMENT))
01341 #define FIND_REG_INC_NOTE(INSN, REG) \
01342 ((REG) != NULL_RTX && REG_P ((REG)) \
01343 ? find_regno_note ((INSN), REG_INC, REGNO (REG)) \
01344 : find_reg_note ((INSN), REG_INC, (REG)))
01345 #else
01346 #define FIND_REG_INC_NOTE(INSN, REG) 0
01347 #endif
01348
01349
01350
01351
01352 #if (defined (HAVE_PRE_INCREMENT) || defined (HAVE_PRE_DECREMENT) || defined (HAVE_POST_INCREMENT) || defined (HAVE_POST_DECREMENT))
01353 #define AUTO_INC_DEC
01354 #endif
01355
01356 #ifndef HAVE_PRE_INCREMENT
01357 #define HAVE_PRE_INCREMENT 0
01358 #endif
01359
01360 #ifndef HAVE_PRE_DECREMENT
01361 #define HAVE_PRE_DECREMENT 0
01362 #endif
01363
01364 #ifndef HAVE_POST_INCREMENT
01365 #define HAVE_POST_INCREMENT 0
01366 #endif
01367
01368 #ifndef HAVE_POST_DECREMENT
01369 #define HAVE_POST_DECREMENT 0
01370 #endif
01371
01372 #ifndef HAVE_POST_MODIFY_DISP
01373 #define HAVE_POST_MODIFY_DISP 0
01374 #endif
01375
01376 #ifndef HAVE_POST_MODIFY_REG
01377 #define HAVE_POST_MODIFY_REG 0
01378 #endif
01379
01380 #ifndef HAVE_PRE_MODIFY_DISP
01381 #define HAVE_PRE_MODIFY_DISP 0
01382 #endif
01383
01384 #ifndef HAVE_PRE_MODIFY_REG
01385 #define HAVE_PRE_MODIFY_REG 0
01386 #endif
01387
01388
01389
01390
01391
01392
01393 #ifndef USE_LOAD_POST_INCREMENT
01394 #define USE_LOAD_POST_INCREMENT(MODE) HAVE_POST_INCREMENT
01395 #endif
01396
01397 #ifndef USE_LOAD_POST_DECREMENT
01398 #define USE_LOAD_POST_DECREMENT(MODE) HAVE_POST_DECREMENT
01399 #endif
01400
01401 #ifndef USE_LOAD_PRE_INCREMENT
01402 #define USE_LOAD_PRE_INCREMENT(MODE) HAVE_PRE_INCREMENT
01403 #endif
01404
01405 #ifndef USE_LOAD_PRE_DECREMENT
01406 #define USE_LOAD_PRE_DECREMENT(MODE) HAVE_PRE_DECREMENT
01407 #endif
01408
01409 #ifndef USE_STORE_POST_INCREMENT
01410 #define USE_STORE_POST_INCREMENT(MODE) HAVE_POST_INCREMENT
01411 #endif
01412
01413 #ifndef USE_STORE_POST_DECREMENT
01414 #define USE_STORE_POST_DECREMENT(MODE) HAVE_POST_DECREMENT
01415 #endif
01416
01417 #ifndef USE_STORE_PRE_INCREMENT
01418 #define USE_STORE_PRE_INCREMENT(MODE) HAVE_PRE_INCREMENT
01419 #endif
01420
01421 #ifndef USE_STORE_PRE_DECREMENT
01422 #define USE_STORE_PRE_DECREMENT(MODE) HAVE_PRE_DECREMENT
01423 #endif
01424
01425
01426 extern int generating_concat_p;
01427
01428
01429 extern int currently_expanding_to_rtl;
01430
01431
01432
01433
01434 extern int ceil_log2 (unsigned HOST_WIDE_INT);
01435
01436
01437 extern rtx expand_builtin_expect_jump (tree, rtx, rtx);
01438
01439
01440 extern void set_stack_check_libfunc (rtx);
01441 extern HOST_WIDE_INT trunc_int_for_mode (HOST_WIDE_INT, enum machine_mode);
01442 extern rtx plus_constant (rtx, HOST_WIDE_INT);
01443
01444
01445 extern rtvec gen_rtvec (int, ...);
01446 extern rtx copy_insn_1 (rtx);
01447 extern rtx copy_insn (rtx);
01448 extern rtx gen_int_mode (HOST_WIDE_INT, enum machine_mode);
01449 extern rtx emit_copy_of_insn_after (rtx, rtx);
01450 extern void set_reg_attrs_from_mem (rtx, rtx);
01451 extern void set_mem_attrs_from_reg (rtx, rtx);
01452 extern void set_reg_attrs_for_parm (rtx, rtx);
01453 extern int mem_expr_equal_p (tree, tree);
01454
01455
01456 extern rtx rtx_alloc_stat (RTX_CODE MEM_STAT_DECL);
01457 #define rtx_alloc(c) rtx_alloc_stat (c MEM_STAT_INFO)
01458
01459 extern rtvec rtvec_alloc (int);
01460 extern rtx copy_rtx (rtx);
01461 extern void dump_rtx_statistics (void);
01462
01463
01464 extern rtx copy_rtx_if_shared (rtx);
01465
01466
01467 extern unsigned int rtx_size (rtx);
01468 extern rtx shallow_copy_rtx_stat (rtx MEM_STAT_DECL);
01469 #define shallow_copy_rtx(a) shallow_copy_rtx_stat (a MEM_STAT_INFO)
01470 extern int rtx_equal_p (rtx, rtx);
01471
01472
01473 extern rtvec gen_rtvec_v (int, rtx *);
01474 extern rtx gen_reg_rtx (enum machine_mode);
01475 extern rtx gen_rtx_REG_offset (rtx, enum machine_mode, unsigned int, int);
01476 extern rtx gen_label_rtx (void);
01477 extern rtx gen_lowpart_common (enum machine_mode, rtx);
01478
01479
01480 extern rtx gen_lowpart_if_possible (enum machine_mode, rtx);
01481
01482
01483 extern rtx gen_highpart (enum machine_mode, rtx);
01484 extern rtx gen_highpart_mode (enum machine_mode, enum machine_mode, rtx);
01485 extern rtx operand_subword (rtx, unsigned int, int, enum machine_mode);
01486
01487
01488 extern rtx operand_subword_force (rtx, unsigned int, enum machine_mode);
01489 extern int subreg_lowpart_p (rtx);
01490 extern unsigned int subreg_lowpart_offset (enum machine_mode,
01491 enum machine_mode);
01492 extern unsigned int subreg_highpart_offset (enum machine_mode,
01493 enum machine_mode);
01494 extern rtx make_safe_from (rtx, rtx);
01495 extern rtx convert_memory_address (enum machine_mode, rtx);
01496 extern rtx get_insns (void);
01497 extern const char *get_insn_name (int);
01498 extern rtx get_last_insn (void);
01499 extern rtx get_last_insn_anywhere (void);
01500 extern rtx get_first_nonnote_insn (void);
01501 extern rtx get_last_nonnote_insn (void);
01502 extern void start_sequence (void);
01503 extern void push_to_sequence (rtx);
01504 extern void end_sequence (void);
01505 extern rtx immed_double_const (HOST_WIDE_INT, HOST_WIDE_INT,
01506 enum machine_mode);
01507
01508
01509
01510 extern rtx lowpart_subreg (enum machine_mode, rtx, enum machine_mode);
01511
01512
01513 extern rtx force_const_mem (enum machine_mode, rtx);
01514
01515
01516
01517 struct function;
01518 extern rtx get_pool_constant (rtx);
01519 extern rtx get_pool_constant_mark (rtx, bool *);
01520 extern enum machine_mode get_pool_mode (rtx);
01521 extern rtx simplify_subtraction (rtx);
01522
01523
01524 extern rtx assign_stack_local (enum machine_mode, HOST_WIDE_INT, int);
01525 extern rtx assign_stack_temp (enum machine_mode, HOST_WIDE_INT, int);
01526 extern rtx assign_stack_temp_for_type (enum machine_mode,
01527 HOST_WIDE_INT, int, tree);
01528 extern rtx assign_temp (tree, int, int, int);
01529
01530
01531 extern rtx emit_insn_before (rtx, rtx);
01532 extern rtx emit_insn_before_noloc (rtx, rtx);
01533 extern rtx emit_insn_before_setloc (rtx, rtx, int);
01534 extern rtx emit_jump_insn_before (rtx, rtx);
01535 extern rtx emit_jump_insn_before_noloc (rtx, rtx);
01536 extern rtx emit_jump_insn_before_setloc (rtx, rtx, int);
01537 extern rtx emit_call_insn_before (rtx, rtx);
01538 extern rtx emit_call_insn_before_noloc (rtx, rtx);
01539 extern rtx emit_call_insn_before_setloc (rtx, rtx, int);
01540 extern rtx emit_barrier_before (rtx);
01541 extern rtx emit_label_before (rtx, rtx);
01542 extern rtx emit_note_before (int, rtx);
01543 extern rtx emit_insn_after (rtx, rtx);
01544 extern rtx emit_insn_after_noloc (rtx, rtx);
01545 extern rtx emit_insn_after_setloc (rtx, rtx, int);
01546 extern rtx emit_jump_insn_after (rtx, rtx);
01547 extern rtx emit_jump_insn_after_noloc (rtx, rtx);
01548 extern rtx emit_jump_insn_after_setloc (rtx, rtx, int);
01549 extern rtx emit_call_insn_after (rtx, rtx);
01550 extern rtx emit_call_insn_after_noloc (rtx, rtx);
01551 extern rtx emit_call_insn_after_setloc (rtx, rtx, int);
01552 extern rtx emit_barrier_after (rtx);
01553 extern rtx emit_label_after (rtx, rtx);
01554 extern rtx emit_note_after (int, rtx);
01555 extern rtx emit_note_copy_after (rtx, rtx);
01556 extern rtx emit_insn (rtx);
01557 extern rtx emit_jump_insn (rtx);
01558 extern rtx emit_call_insn (rtx);
01559 extern rtx emit_label (rtx);
01560 extern rtx emit_barrier (void);
01561 extern rtx emit_note (int);
01562 extern rtx emit_note_copy (rtx);
01563 extern rtx emit_line_note (location_t);
01564 extern rtx make_insn_raw (rtx);
01565 extern rtx make_jump_insn_raw (rtx);
01566 extern void add_function_usage_to (rtx, rtx);
01567 extern rtx last_call_insn (void);
01568 extern rtx previous_insn (rtx);
01569 extern rtx next_insn (rtx);
01570 extern rtx prev_nonnote_insn (rtx);
01571 extern rtx next_nonnote_insn (rtx);
01572 extern rtx prev_real_insn (rtx);
01573 extern rtx next_real_insn (rtx);
01574 extern rtx prev_active_insn (rtx);
01575 extern rtx next_active_insn (rtx);
01576 extern int active_insn_p (rtx);
01577 extern rtx prev_label (rtx);
01578 extern rtx next_label (rtx);
01579 extern rtx skip_consecutive_labels (rtx);
01580 extern rtx next_cc0_user (rtx);
01581 extern rtx prev_cc0_setter (rtx);
01582
01583
01584 extern int insn_line (rtx);
01585 extern const char * insn_file (rtx);
01586 extern int locator_line (int);
01587 extern const char * locator_file (int);
01588 extern int prologue_locator, epilogue_locator;
01589
01590
01591 extern enum rtx_code reverse_condition (enum rtx_code);
01592 extern enum rtx_code reverse_condition_maybe_unordered (enum rtx_code);
01593 extern enum rtx_code swap_condition (enum rtx_code);
01594 extern enum rtx_code unsigned_condition (enum rtx_code);
01595 extern enum rtx_code signed_condition (enum rtx_code);
01596 extern void mark_jump_label (rtx, rtx, int);
01597 extern unsigned int cleanup_barriers (void);
01598
01599
01600 extern bool squeeze_notes (rtx *, rtx *);
01601 extern rtx delete_related_insns (rtx);
01602 extern void delete_jump (rtx);
01603 extern rtx get_label_before (rtx);
01604 extern rtx get_label_after (rtx);
01605 extern rtx follow_jumps (rtx);
01606
01607
01608 extern rtx *find_constant_term_loc (rtx *);
01609
01610
01611 extern rtx try_split (rtx, rtx, int);
01612 extern int split_branch_probability;
01613
01614
01615 extern rtx split_insns (rtx, rtx);
01616
01617
01618 extern rtx simplify_const_unary_operation (enum rtx_code, enum machine_mode,
01619 rtx, enum machine_mode);
01620 extern rtx simplify_unary_operation (enum rtx_code, enum machine_mode, rtx,
01621 enum machine_mode);
01622 extern rtx simplify_const_binary_operation (enum rtx_code, enum machine_mode,
01623 rtx, rtx);
01624 extern rtx simplify_binary_operation (enum rtx_code, enum machine_mode, rtx,
01625 rtx);
01626 extern rtx simplify_ternary_operation (enum rtx_code, enum machine_mode,
01627 enum machine_mode, rtx, rtx, rtx);
01628 extern rtx simplify_const_relational_operation (enum rtx_code,
01629 enum machine_mode, rtx, rtx);
01630 extern rtx simplify_relational_operation (enum rtx_code, enum machine_mode,
01631 enum machine_mode, rtx, rtx);
01632 extern rtx simplify_gen_binary (enum rtx_code, enum machine_mode, rtx, rtx);
01633 extern rtx simplify_gen_unary (enum rtx_code, enum machine_mode, rtx,
01634 enum machine_mode);
01635 extern rtx simplify_gen_ternary (enum rtx_code, enum machine_mode,
01636 enum machine_mode, rtx, rtx, rtx);
01637 extern rtx simplify_gen_relational (enum rtx_code, enum machine_mode,
01638 enum machine_mode, rtx, rtx);
01639 extern rtx simplify_subreg (enum machine_mode, rtx, enum machine_mode,
01640 unsigned int);
01641 extern rtx simplify_gen_subreg (enum machine_mode, rtx, enum machine_mode,
01642 unsigned int);
01643 extern rtx simplify_replace_rtx (rtx, rtx, rtx);
01644 extern rtx simplify_rtx (rtx);
01645 extern rtx avoid_constant_pool_reference (rtx);
01646 extern bool constant_pool_reference_p (rtx x);
01647 extern bool mode_signbit_p (enum machine_mode, rtx);
01648
01649
01650 extern enum machine_mode choose_hard_reg_mode (unsigned int, unsigned int,
01651 bool);
01652
01653
01654 extern rtx set_unique_reg_note (rtx, enum reg_note, rtx);
01655
01656
01657
01658
01659 #define single_set(I) (INSN_P (I) \
01660 ? (GET_CODE (PATTERN (I)) == SET \
01661 ? PATTERN (I) : single_set_1 (I)) \
01662 : NULL_RTX)
01663 #define single_set_1(I) single_set_2 (I, PATTERN (I))
01664
01665
01666 typedef struct replace_label_data
01667 {
01668 rtx r1;
01669 rtx r2;
01670 bool update_label_nuses;
01671 } replace_label_data;
01672
01673 extern int rtx_addr_can_trap_p (rtx);
01674 extern bool nonzero_address_p (rtx);
01675 extern int rtx_unstable_p (rtx);
01676 extern int rtx_varies_p (rtx, int);
01677 extern int rtx_addr_varies_p (rtx, int);
01678 extern HOST_WIDE_INT get_integer_term (rtx);
01679 extern rtx get_related_value (rtx);
01680 extern int reg_mentioned_p (rtx, rtx);
01681 extern int count_occurrences (rtx, rtx, int);
01682 extern int reg_referenced_p (rtx, rtx);
01683 extern int reg_used_between_p (rtx, rtx, rtx);
01684 extern int reg_set_between_p (rtx, rtx, rtx);
01685 extern int commutative_operand_precedence (rtx);
01686 extern int swap_commutative_operands_p (rtx, rtx);
01687 extern int modified_between_p (rtx, rtx, rtx);
01688 extern int no_labels_between_p (rtx, rtx);
01689 extern int modified_in_p (rtx, rtx);
01690 extern int reg_set_p (rtx, rtx);
01691 extern rtx single_set_2 (rtx, rtx);
01692 extern int multiple_sets (rtx);
01693 extern int set_noop_p (rtx);
01694 extern int noop_move_p (rtx);
01695 extern rtx find_last_value (rtx, rtx *, rtx, int);
01696 extern int refers_to_regno_p (unsigned int, unsigned int, rtx, rtx *);
01697 extern int reg_overlap_mentioned_p (rtx, rtx);
01698 extern rtx set_of (rtx, rtx);
01699 extern void note_stores (rtx, void (*) (rtx, rtx, void *), void *);
01700 extern void note_uses (rtx *, void (*) (rtx *, void *), void *);
01701 extern int dead_or_set_p (rtx, rtx);
01702 extern int dead_or_set_regno_p (rtx, unsigned int);
01703 extern rtx find_reg_note (rtx, enum reg_note, rtx);
01704 extern rtx find_regno_note (rtx, enum reg_note, unsigned int);
01705 extern rtx find_reg_equal_equiv_note (rtx);
01706 extern int find_reg_fusage (rtx, enum rtx_code, rtx);
01707 extern int find_regno_fusage (rtx, enum rtx_code, unsigned int);
01708 extern int pure_call_p (rtx);
01709 extern void remove_note (rtx, rtx);
01710 extern int side_effects_p (rtx);
01711 extern int volatile_refs_p (rtx);
01712 extern int volatile_insn_p (rtx);
01713 extern int may_trap_p (rtx);
01714 extern int may_trap_after_code_motion_p (rtx);
01715 extern int may_trap_or_fault_p (rtx);
01716 extern int inequality_comparisons_p (rtx);
01717 extern rtx replace_rtx (rtx, rtx, rtx);
01718 extern int replace_label (rtx *, void *);
01719 extern int rtx_referenced_p (rtx, rtx);
01720 extern bool tablejump_p (rtx, rtx *, rtx *);
01721 extern int computed_jump_p (rtx);
01722 typedef int (*rtx_function) (rtx *, void *);
01723 extern int for_each_rtx (rtx *, rtx_function, void *);
01724 extern rtx regno_use_in (unsigned int, rtx);
01725 extern int auto_inc_p (rtx);
01726 extern int in_expr_list_p (rtx, rtx);
01727 extern void remove_node_from_expr_list (rtx, rtx *);
01728 extern int loc_mentioned_in_p (rtx *, rtx);
01729 extern rtx find_first_parameter_load (rtx, rtx);
01730 extern bool keep_with_call_p (rtx);
01731 extern bool label_is_jump_target_p (rtx, rtx);
01732 extern int insn_rtx_cost (rtx);
01733
01734
01735
01736 extern rtx canonicalize_condition (rtx, rtx, int, rtx *, rtx, int, int);
01737
01738
01739
01740 extern rtx get_condition (rtx, rtx *, int, int);
01741
01742
01743
01744
01745 extern rtx find_use_as_address (rtx, rtx, HOST_WIDE_INT);
01746
01747
01748
01749 void free_EXPR_LIST_list (rtx *);
01750 void free_INSN_LIST_list (rtx *);
01751 void free_EXPR_LIST_node (rtx);
01752 void free_INSN_LIST_node (rtx);
01753 rtx alloc_INSN_LIST (rtx, rtx);
01754 rtx alloc_EXPR_LIST (int, rtx, rtx);
01755 void free_DEPS_LIST_list (rtx *);
01756 rtx alloc_DEPS_LIST (rtx, rtx, int);
01757 void remove_free_DEPS_LIST_elem (rtx, rtx *);
01758 void remove_free_INSN_LIST_elem (rtx, rtx *);
01759 rtx remove_list_elem (rtx, rtx *);
01760 rtx copy_DEPS_LIST_list (rtx);
01761
01762
01763
01764
01765
01766
01767
01768 extern int max_parallel;
01769
01770
01771 extern void free_reg_info (void);
01772
01773
01774 extern int asm_noperands (rtx);
01775 extern const char *decode_asm_operands (rtx, rtx *, rtx **, const char **,
01776 enum machine_mode *);
01777
01778 extern enum reg_class reg_preferred_class (int);
01779 extern enum reg_class reg_alternate_class (int);
01780
01781 extern void split_all_insns (int);
01782 extern unsigned int split_all_insns_noflow (void);
01783
01784 #define MAX_SAVED_CONST_INT 64
01785 extern GTY(()) rtx const_int_rtx[MAX_SAVED_CONST_INT * 2 + 1];
01786
01787 #define const0_rtx (const_int_rtx[MAX_SAVED_CONST_INT])
01788 #define const1_rtx (const_int_rtx[MAX_SAVED_CONST_INT+1])
01789 #define const2_rtx (const_int_rtx[MAX_SAVED_CONST_INT+2])
01790 #define constm1_rtx (const_int_rtx[MAX_SAVED_CONST_INT-1])
01791 extern GTY(()) rtx const_true_rtx;
01792
01793 extern GTY(()) rtx const_tiny_rtx[3][(int) MAX_MACHINE_MODE];
01794
01795
01796
01797
01798 #define CONST0_RTX(MODE) (const_tiny_rtx[0][(int) (MODE)])
01799
01800
01801
01802 #define CONST1_RTX(MODE) (const_tiny_rtx[1][(int) (MODE)])
01803 #define CONST2_RTX(MODE) (const_tiny_rtx[2][(int) (MODE)])
01804
01805
01806
01807
01808
01809
01810
01811 #ifndef HARD_FRAME_POINTER_REGNUM
01812 #define HARD_FRAME_POINTER_REGNUM FRAME_POINTER_REGNUM
01813 #endif
01814
01815
01816 enum global_rtl_index
01817 {
01818 GR_PC,
01819 GR_CC0,
01820 GR_STACK_POINTER,
01821 GR_FRAME_POINTER,
01822
01823
01824
01825 #if FRAME_POINTER_REGNUM == ARG_POINTER_REGNUM
01826 GR_ARG_POINTER = GR_FRAME_POINTER,
01827 #endif
01828 #if HARD_FRAME_POINTER_REGNUM == FRAME_POINTER_REGNUM
01829 GR_HARD_FRAME_POINTER = GR_FRAME_POINTER,
01830 #else
01831 GR_HARD_FRAME_POINTER,
01832 #endif
01833 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
01834 #if HARD_FRAME_POINTER_REGNUM == ARG_POINTER_REGNUM
01835 GR_ARG_POINTER = GR_HARD_FRAME_POINTER,
01836 #else
01837 GR_ARG_POINTER,
01838 #endif
01839 #endif
01840 GR_VIRTUAL_INCOMING_ARGS,
01841 GR_VIRTUAL_STACK_ARGS,
01842 GR_VIRTUAL_STACK_DYNAMIC,
01843 GR_VIRTUAL_OUTGOING_ARGS,
01844 GR_VIRTUAL_CFA,
01845
01846 GR_MAX
01847 };
01848
01849
01850 extern GTY(()) rtx global_rtl[GR_MAX];
01851
01852
01853 #define pc_rtx (global_rtl[GR_PC])
01854 #define cc0_rtx (global_rtl[GR_CC0])
01855
01856
01857
01858
01859 #define stack_pointer_rtx (global_rtl[GR_STACK_POINTER])
01860 #define frame_pointer_rtx (global_rtl[GR_FRAME_POINTER])
01861 #define hard_frame_pointer_rtx (global_rtl[GR_HARD_FRAME_POINTER])
01862 #define arg_pointer_rtx (global_rtl[GR_ARG_POINTER])
01863
01864 extern GTY(()) rtx pic_offset_table_rtx;
01865 extern GTY(()) rtx static_chain_rtx;
01866 extern GTY(()) rtx static_chain_incoming_rtx;
01867 extern GTY(()) rtx return_address_pointer_rtx;
01868
01869
01870
01871 #ifndef GENERATOR_FILE
01872 #include "genrtl.h"
01873 #ifndef USE_MAPPED_LOCATION
01874 #undef gen_rtx_ASM_OPERANDS
01875 #define gen_rtx_ASM_OPERANDS(MODE, ARG0, ARG1, ARG2, ARG3, ARG4, LOC) \
01876 gen_rtx_fmt_ssiEEsi (ASM_OPERANDS, (MODE), (ARG0), (ARG1), (ARG2), (ARG3), (ARG4), (LOC).file, (LOC).line)
01877 #endif
01878 #endif
01879
01880
01881
01882
01883
01884 extern rtx gen_rtx_CONST_INT (enum machine_mode, HOST_WIDE_INT);
01885 extern rtx gen_rtx_CONST_VECTOR (enum machine_mode, rtvec);
01886 extern rtx gen_raw_REG (enum machine_mode, int);
01887 extern rtx gen_rtx_REG (enum machine_mode, unsigned);
01888 extern rtx gen_rtx_SUBREG (enum machine_mode, rtx, int);
01889 extern rtx gen_rtx_MEM (enum machine_mode, rtx);
01890
01891 #define GEN_INT(N) gen_rtx_CONST_INT (VOIDmode, (N))
01892
01893
01894
01895
01896
01897
01898
01899 #define FIRST_VIRTUAL_REGISTER (FIRST_PSEUDO_REGISTER)
01900
01901
01902
01903
01904
01905 #define virtual_incoming_args_rtx (global_rtl[GR_VIRTUAL_INCOMING_ARGS])
01906
01907 #define VIRTUAL_INCOMING_ARGS_REGNUM (FIRST_VIRTUAL_REGISTER)
01908
01909
01910
01911
01912
01913 #define virtual_stack_vars_rtx (global_rtl[GR_VIRTUAL_STACK_ARGS])
01914
01915 #define VIRTUAL_STACK_VARS_REGNUM ((FIRST_VIRTUAL_REGISTER) + 1)
01916
01917
01918
01919
01920
01921 #define virtual_stack_dynamic_rtx (global_rtl[GR_VIRTUAL_STACK_DYNAMIC])
01922
01923 #define VIRTUAL_STACK_DYNAMIC_REGNUM ((FIRST_VIRTUAL_REGISTER) + 2)
01924
01925
01926
01927
01928
01929 #define virtual_outgoing_args_rtx (global_rtl[GR_VIRTUAL_OUTGOING_ARGS])
01930
01931 #define VIRTUAL_OUTGOING_ARGS_REGNUM ((FIRST_VIRTUAL_REGISTER) + 3)
01932
01933
01934
01935
01936
01937
01938
01939 #define virtual_cfa_rtx (global_rtl[GR_VIRTUAL_CFA])
01940
01941 #define VIRTUAL_CFA_REGNUM ((FIRST_VIRTUAL_REGISTER) + 4)
01942
01943 #define LAST_VIRTUAL_REGISTER ((FIRST_VIRTUAL_REGISTER) + 4)
01944
01945
01946 #define REGNO_PTR_FRAME_P(REGNUM) \
01947 ((REGNUM) == STACK_POINTER_REGNUM \
01948 || (REGNUM) == FRAME_POINTER_REGNUM \
01949 || (REGNUM) == HARD_FRAME_POINTER_REGNUM \
01950 || (REGNUM) == ARG_POINTER_REGNUM \
01951 || ((REGNUM) >= FIRST_VIRTUAL_REGISTER \
01952 && (REGNUM) <= LAST_VIRTUAL_REGISTER))
01953
01954
01955 #define INVALID_REGNUM (~(unsigned int) 0)
01956
01957 extern rtx output_constant_def (tree, int);
01958 extern rtx lookup_constant_def (tree);
01959
01960
01961
01962 extern int flow2_completed;
01963
01964
01965
01966
01967 extern int reload_completed;
01968
01969
01970 extern int epilogue_completed;
01971
01972
01973
01974
01975 extern int reload_in_progress;
01976
01977 #ifdef STACK_REGS
01978
01979
01980 extern int regstack_completed;
01981 #endif
01982
01983
01984
01985
01986
01987
01988
01989 extern int cse_not_expected;
01990
01991
01992
01993 extern int no_new_pseudos;
01994
01995
01996
01997
01998
01999 extern int rtx_to_tree_code (enum rtx_code);
02000
02001
02002 extern int delete_trivially_dead_insns (rtx, int);
02003 extern int cse_main (rtx, int);
02004 extern int exp_equiv_p (rtx, rtx, int, bool);
02005 extern unsigned hash_rtx (rtx x, enum machine_mode, int *, int *, bool);
02006
02007
02008 extern int comparison_dominates_p (enum rtx_code, enum rtx_code);
02009 extern int condjump_p (rtx);
02010 extern int any_condjump_p (rtx);
02011 extern int any_uncondjump_p (rtx);
02012 extern rtx pc_set (rtx);
02013 extern rtx condjump_label (rtx);
02014 extern int simplejump_p (rtx);
02015 extern int returnjump_p (rtx);
02016 extern int onlyjump_p (rtx);
02017 extern int only_sets_cc0_p (rtx);
02018 extern int sets_cc0_p (rtx);
02019 extern int invert_jump_1 (rtx, rtx);
02020 extern int invert_jump (rtx, rtx, int);
02021 extern int rtx_renumbered_equal_p (rtx, rtx);
02022 extern int true_regnum (rtx);
02023 extern unsigned int reg_or_subregno (rtx);
02024 extern int redirect_jump_1 (rtx, rtx);
02025 extern void redirect_jump_2 (rtx, rtx, rtx, int, int);
02026 extern int redirect_jump (rtx, rtx, int);
02027 extern void rebuild_jump_labels (rtx);
02028 extern rtx reversed_comparison (rtx, enum machine_mode);
02029 extern enum rtx_code reversed_comparison_code (rtx, rtx);
02030 extern enum rtx_code reversed_comparison_code_parts (enum rtx_code,
02031 rtx, rtx, rtx);
02032 extern void delete_for_peephole (rtx, rtx);
02033 extern int condjump_in_parallel_p (rtx);
02034 extern unsigned int purge_line_number_notes (void);
02035
02036
02037 extern int max_reg_num (void);
02038 extern int max_label_num (void);
02039 extern int get_first_label_num (void);
02040 extern void maybe_set_first_label_num (rtx);
02041 extern void delete_insns_since (rtx);
02042 extern void mark_reg_pointer (rtx, int);
02043 extern void mark_user_reg (rtx);
02044 extern void reset_used_flags (rtx);
02045 extern void set_used_flags (rtx);
02046 extern void reorder_insns (rtx, rtx, rtx);
02047 extern void reorder_insns_nobb (rtx, rtx, rtx);
02048 extern int get_max_uid (void);
02049 extern int in_sequence_p (void);
02050 extern void force_next_line_note (void);
02051 extern void init_emit (void);
02052 extern void init_emit_once (int);
02053 extern void push_topmost_sequence (void);
02054 extern void pop_topmost_sequence (void);
02055 extern void set_new_first_and_last_insn (rtx, rtx);
02056 extern unsigned int unshare_all_rtl (void);
02057 extern void unshare_all_rtl_again (rtx);
02058 extern void unshare_all_rtl_in_chain (rtx);
02059 extern void verify_rtl_sharing (void);
02060 extern void set_first_insn (rtx);
02061 extern void set_last_insn (rtx);
02062 extern void link_cc0_insns (rtx);
02063 extern void add_insn (rtx);
02064 extern void add_insn_before (rtx, rtx);
02065 extern void add_insn_after (rtx, rtx);
02066 extern void remove_insn (rtx);
02067 extern void emit_insn_after_with_line_notes (rtx, rtx, rtx);
02068 extern rtx emit (rtx);
02069 extern void renumber_insns (void);
02070 extern rtx delete_insn (rtx);
02071 extern rtx entry_of_function (void);
02072 extern void emit_insn_at_entry (rtx);
02073 extern void delete_insn_chain (rtx, rtx);
02074 extern rtx unlink_insn_chain (rtx, rtx);
02075 extern rtx delete_insn_and_edges (rtx);
02076 extern void delete_insn_chain_and_edges (rtx, rtx);
02077 extern rtx gen_lowpart_SUBREG (enum machine_mode, rtx);
02078 extern rtx gen_const_mem (enum machine_mode, rtx);
02079 extern rtx gen_frame_mem (enum machine_mode, rtx);
02080 extern rtx gen_tmp_stack_mem (enum machine_mode, rtx);
02081 extern bool validate_subreg (enum machine_mode, enum machine_mode,
02082 rtx, unsigned int);
02083
02084
02085 extern unsigned int extended_count (rtx, enum machine_mode, int);
02086 extern rtx remove_death (unsigned int, rtx);
02087 extern void dump_combine_stats (FILE *);
02088 extern void dump_combine_total_stats (FILE *);
02089
02090
02091 extern void print_rtl_slim_with_bb (FILE *, rtx, int);
02092 extern void dump_insn_slim (FILE *f, rtx x);
02093 extern void debug_insn_slim (rtx x);
02094
02095
02096 extern void schedule_insns (void);
02097
02098
02099 extern void schedule_ebbs (void);
02100
02101
02102 extern void fix_sched_param (const char *, const char *);
02103
02104
02105 extern const char *print_rtx_head;
02106 extern void debug_rtx (rtx);
02107 extern void debug_rtx_list (rtx, int);
02108 extern void debug_rtx_range (rtx, rtx);
02109 extern rtx debug_rtx_find (rtx, int);
02110 extern void print_mem_expr (FILE *, tree);
02111 extern void print_rtl (FILE *, rtx);
02112 extern void print_simple_rtl (FILE *, rtx);
02113 extern int print_rtl_single (FILE *, rtx);
02114 extern void print_inline_rtx (FILE *, rtx, int);
02115
02116
02117 extern void branch_target_load_optimize (bool);
02118
02119
02120 extern void reposition_prologue_and_epilogue_notes (rtx);
02121 extern void thread_prologue_and_epilogue_insns (rtx);
02122 extern int prologue_epilogue_contains (rtx);
02123 extern int sibcall_epilogue_contains (rtx);
02124 extern void mark_temp_addr_taken (rtx);
02125 extern void update_temp_slot_address (rtx, rtx);
02126
02127
02128 extern void expand_null_return (void);
02129 extern void expand_naked_return (void);
02130 extern void emit_jump (rtx);
02131
02132
02133 extern rtx move_by_pieces (rtx, rtx, unsigned HOST_WIDE_INT,
02134 unsigned int, int);
02135
02136
02137 extern void delete_dead_jumptables (void);
02138 extern void print_rtl_with_bb (FILE *, rtx);
02139 extern void dump_flow_info (FILE *, int);
02140
02141
02142 extern void init_expmed (void);
02143 extern void expand_inc (rtx, rtx);
02144 extern void expand_dec (rtx, rtx);
02145
02146
02147 extern bool can_copy_p (enum machine_mode);
02148 extern rtx fis_get_condition (rtx);
02149
02150
02151 extern void mark_elimination (int, int);
02152 extern void dump_global_regs (FILE *);
02153 #ifdef HARD_CONST
02154
02155 extern void retry_global_alloc (int, HARD_REG_SET);
02156 #endif
02157 extern void build_insn_chain (rtx);
02158
02159
02160 extern int reg_classes_intersect_p (enum reg_class, enum reg_class);
02161 extern int reg_class_subset_p (enum reg_class, enum reg_class);
02162 extern void globalize_reg (int);
02163 extern void init_reg_modes_once (void);
02164 extern void init_regs (void);
02165 extern void init_fake_stack_mems (void);
02166 extern void init_reg_sets (void);
02167 extern void regclass_init (void);
02168 extern void regclass (rtx, int);
02169 extern void reg_scan (rtx, unsigned int);
02170 extern void fix_register (const char *, int, int);
02171 extern void init_subregs_of_mode (void);
02172 extern void record_subregs_of_mode (rtx);
02173 #ifdef HARD_CONST
02174 extern void cannot_change_mode_set_regs (HARD_REG_SET *,
02175 enum machine_mode, unsigned int);
02176 #endif
02177 extern bool invalid_mode_change_p (unsigned int, enum reg_class,
02178 enum machine_mode);
02179
02180
02181 extern void dbr_schedule (rtx);
02182
02183
02184 extern void dump_local_alloc (FILE *);
02185
02186
02187 extern int function_invariant_p (rtx);
02188
02189
02190 enum libcall_type
02191 {
02192 LCT_NORMAL = 0,
02193 LCT_CONST = 1,
02194 LCT_PURE = 2,
02195 LCT_CONST_MAKE_BLOCK = 3,
02196 LCT_PURE_MAKE_BLOCK = 4,
02197 LCT_NORETURN = 5,
02198 LCT_THROW = 6,
02199 LCT_RETURNS_TWICE = 7
02200 };
02201
02202 extern void emit_library_call (rtx, enum libcall_type, enum machine_mode, int,
02203 ...);
02204 extern rtx emit_library_call_value (rtx, rtx, enum libcall_type,
02205 enum machine_mode, int, ...);
02206
02207
02208 extern void init_varasm_once (void);
02209 extern enum tls_model decl_default_tls_model (tree);
02210
02211
02212 extern void traverse_md_constants (int (*) (void **, void *), void *);
02213 struct md_constant { char *name, *value; };
02214
02215
02216 extern int read_skip_spaces (FILE *);
02217 extern bool read_rtx (FILE *, rtx *, int *);
02218 extern void copy_rtx_ptr_loc (const void *, const void *);
02219 extern void print_rtx_ptr_loc (const void *);
02220 extern const char *join_c_conditions (const char *, const char *);
02221 extern void print_c_condition (const char *);
02222 extern const char *read_rtx_filename;
02223 extern int read_rtx_lineno;
02224
02225
02226 extern void clear_reg_alias_info (rtx);
02227 extern rtx canon_rtx (rtx);
02228 extern int true_dependence (rtx, enum machine_mode, rtx, int (*)(rtx, int));
02229 extern rtx get_addr (rtx);
02230 extern int canon_true_dependence (rtx, enum machine_mode, rtx, rtx,
02231 int (*)(rtx, int));
02232 extern int read_dependence (rtx, rtx);
02233 extern int anti_dependence (rtx, rtx);
02234 extern int output_dependence (rtx, rtx);
02235 extern void init_alias_once (void);
02236 extern void init_alias_analysis (void);
02237 extern void end_alias_analysis (void);
02238 extern bool memory_modified_in_insn_p (rtx, rtx);
02239 extern rtx find_base_term (rtx);
02240 extern rtx gen_hard_reg_clobber (enum machine_mode, unsigned int);
02241 extern rtx get_reg_known_value (unsigned int);
02242 extern bool get_reg_known_equiv_p (unsigned int);
02243
02244 #ifdef STACK_REGS
02245 extern int stack_regs_mentioned (rtx insn);
02246 #endif
02247
02248
02249 extern GTY(()) rtx stack_limit_rtx;
02250
02251
02252 extern void invert_br_probabilities (rtx);
02253 extern bool expensive_function_p (int);
02254
02255 extern void tracer (unsigned int);
02256
02257
02258 extern unsigned int variable_tracking_main (void);
02259
02260
02261 extern void get_mode_bounds (enum machine_mode, int, enum machine_mode,
02262 rtx *, rtx *);
02263
02264
02265 extern rtx reversed_condition (rtx);
02266 extern rtx compare_and_jump_seq (rtx, rtx, enum rtx_code, rtx, int, rtx);
02267
02268
02269 extern rtx canon_condition (rtx);
02270 extern void simplify_using_condition (rtx, rtx *, struct bitmap_head_def *);
02271
02272 struct rtl_hooks
02273 {
02274 rtx (*gen_lowpart) (enum machine_mode, rtx);
02275 rtx (*gen_lowpart_no_emit) (enum machine_mode, rtx);
02276 rtx (*reg_nonzero_bits) (rtx, enum machine_mode, rtx, enum machine_mode,
02277 unsigned HOST_WIDE_INT, unsigned HOST_WIDE_INT *);
02278 rtx (*reg_num_sign_bit_copies) (rtx, enum machine_mode, rtx, enum machine_mode,
02279 unsigned int, unsigned int *);
02280 bool (*reg_truncated_to_mode) (enum machine_mode, rtx);
02281
02282
02283 };
02284
02285
02286 extern struct rtl_hooks rtl_hooks;
02287
02288
02289 extern const struct rtl_hooks general_rtl_hooks;
02290
02291
02292 #define gen_lowpart rtl_hooks.gen_lowpart
02293
02294 #endif