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