rtl.h 98.1 KB
Newer Older
1
/* Register Transfer Language (RTL) definitions for GCC
2
   Copyright (C) 1987, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3
   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
4
   Free Software Foundation, Inc.
Jim Wilson committed
5

6
This file is part of GCC.
Jim Wilson committed
7

8 9
GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
10
Software Foundation; either version 3, or (at your option) any later
11
version.
Jim Wilson committed
12

13 14 15 16
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.
Jim Wilson committed
17 18

You should have received a copy of the GNU General Public License
19 20
along with GCC; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.  */
Jim Wilson committed
21

22 23
#ifndef GCC_RTL_H
#define GCC_RTL_H
24

25
#include "statistics.h"
Jim Wilson committed
26
#include "machmode.h"
27
#include "input.h"
28
#include "real.h"
29
#include "vec.h"
30
#include "vecir.h"
31
#include "fixed-value.h"
32
#include "alias.h"
33
#include "hashtab.h"
Jim Wilson committed
34 35

#undef FFS  /* Some systems predefine this symbol; don't let it interfere.  */
36
#undef FLOAT /* Likewise.  */
37
#undef ABS /* Likewise.  */
Richard Stallman committed
38
#undef PC /* Likewise.  */
Jim Wilson committed
39

40
/* Value used by some passes to "recognize" noop moves as valid
Kazu Hirata committed
41
 instructions.  */
42 43
#define NOOP_MOVE_INSN_CODE	INT_MAX

Jim Wilson committed
44 45 46 47 48 49 50 51 52
/* Register Transfer Language EXPRESSIONS CODES */

#define RTX_CODE	enum rtx_code
enum rtx_code  {

#define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS)   ENUM ,
#include "rtl.def"		/* rtl expressions are documented here */
#undef DEF_RTL_EXPR

53
  LAST_AND_UNUSED_RTX_CODE};	/* A convenient way to get a value for
Jim Wilson committed
54
				   NUM_RTX_CODE.
55
				   Assumes default enum value assignment.  */
Jim Wilson committed
56

Kazu Hirata committed
57
#define NUM_RTX_CODE ((int) LAST_AND_UNUSED_RTX_CODE)
Jim Wilson committed
58 59
				/* The cast here, saves many elsewhere.  */

60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
/* Register Transfer Language EXPRESSIONS CODE CLASSES */

enum rtx_class  {
  /* We check bit 0-1 of some rtx class codes in the predicates below.  */

  /* Bit 0 = comparison if 0, arithmetic is 1
     Bit 1 = 1 if commutative.  */
  RTX_COMPARE,		/* 0 */
  RTX_COMM_COMPARE,
  RTX_BIN_ARITH,
  RTX_COMM_ARITH,

  /* Must follow the four preceding values.  */
  RTX_UNARY,		/* 4 */

  RTX_EXTRA,
  RTX_MATCH,
  RTX_INSN,

  /* Bit 0 = 1 if constant.  */
  RTX_OBJ,		/* 8 */
  RTX_CONST_OBJ,

  RTX_TERNARY,
  RTX_BITFIELD_OPS,
  RTX_AUTOINC
};

#define RTX_OBJ_MASK (~1)
#define RTX_OBJ_RESULT (RTX_OBJ & RTX_OBJ_MASK)
#define RTX_COMPARE_MASK (~1)
#define RTX_COMPARE_RESULT (RTX_COMPARE & RTX_COMPARE_MASK)
#define RTX_ARITHMETIC_MASK (~1)
#define RTX_ARITHMETIC_RESULT (RTX_COMM_ARITH & RTX_ARITHMETIC_MASK)
#define RTX_BINARY_MASK (~3)
#define RTX_BINARY_RESULT (RTX_COMPARE & RTX_BINARY_MASK)
#define RTX_COMMUTATIVE_MASK (~2)
#define RTX_COMMUTATIVE_RESULT (RTX_COMM_COMPARE & RTX_COMMUTATIVE_MASK)
#define RTX_NON_COMMUTATIVE_RESULT (RTX_COMPARE & RTX_COMMUTATIVE_MASK)

100
extern const unsigned char rtx_length[NUM_RTX_CODE];
Mike Stump committed
101
#define GET_RTX_LENGTH(CODE)		(rtx_length[(int) (CODE)])
Jim Wilson committed
102

103
extern const char * const rtx_name[NUM_RTX_CODE];
Mike Stump committed
104
#define GET_RTX_NAME(CODE)		(rtx_name[(int) (CODE)])
Jim Wilson committed
105

106
extern const char * const rtx_format[NUM_RTX_CODE];
Mike Stump committed
107
#define GET_RTX_FORMAT(CODE)		(rtx_format[(int) (CODE)])
Jim Wilson committed
108

109
extern const enum rtx_class rtx_class[NUM_RTX_CODE];
Mike Stump committed
110
#define GET_RTX_CLASS(CODE)		(rtx_class[(int) (CODE)])
Geoffrey Keating committed
111

112
extern const unsigned char rtx_code_size[NUM_RTX_CODE];
Geoffrey Keating committed
113
extern const unsigned char rtx_next[NUM_RTX_CODE];
Jim Wilson committed
114

115 116 117 118 119 120 121 122
/* The flags and bitfields of an ADDR_DIFF_VEC.  BASE is the base label
   relative to which the offsets are calculated, as explained in rtl.def.  */
typedef struct
{
  /* Set at the start of shorten_branches - ONLY WHEN OPTIMIZING - : */
  unsigned min_align: 8;
  /* Flags: */
  unsigned base_after_vec: 1; /* BASE is after the ADDR_DIFF_VEC.  */
123 124 125 126 127 128 129 130
  unsigned min_after_vec: 1;  /* minimum address target label is
				 after the ADDR_DIFF_VEC.  */
  unsigned max_after_vec: 1;  /* maximum address target label is
				 after the ADDR_DIFF_VEC.  */
  unsigned min_after_base: 1; /* minimum address target label is
				 after BASE.  */
  unsigned max_after_base: 1; /* maximum address target label is
				 after BASE.  */
131 132 133 134 135 136
  /* Set by the actual branch shortening process - ONLY WHEN OPTIMIZING - : */
  unsigned offset_unsigned: 1; /* offsets have to be treated as unsigned.  */
  unsigned : 2;
  unsigned scale : 8;
} addr_diff_vec_flags;

137 138
/* Structure used to describe the attributes of a MEM.  These are hashed
   so MEMs that the same attributes share a data structure.  This means
139
   they cannot be modified in place.  */
140
typedef struct GTY(()) mem_attrs
141
{
142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
  /* The expression that the MEM accesses, or null if not known.
     This expression might be larger than the memory reference itself.
     (In other words, the MEM might access only part of the object.)  */
  tree expr;

  /* The offset of the memory reference from the start of EXPR.
     Only valid if OFFSET_KNOWN_P.  */
  HOST_WIDE_INT offset;

  /* The size of the memory reference in bytes.  Only valid if
     SIZE_KNOWN_P.  */
  HOST_WIDE_INT size;

  /* The alias set of the memory reference.  */
  alias_set_type alias;

  /* The alignment of the reference in bits.  Always a multiple of
     BITS_PER_UNIT.  Note that EXPR may have a stricter alignment
     than the memory reference itself.  */
  unsigned int align;

  /* The address space that the memory reference uses.  */
  unsigned char addrspace;

  /* True if OFFSET is known.  */
  bool offset_known_p;

  /* True if SIZE is known.  */
  bool size_known_p;
171 172
} mem_attrs;

173
/* Structure used to describe the attributes of a REG in similar way as
174 175 176 177 178
   mem_attrs does for MEM above.  Note that the OFFSET field is calculated
   in the same way as for mem_attrs, rather than in the same way as a
   SUBREG_BYTE.  For example, if a big-endian target stores a byte
   object in the low part of a 4-byte register, the OFFSET field
   will be -3 rather than 0.  */
179

180
typedef struct GTY(()) reg_attrs {
181 182 183 184
  tree decl;			/* decl corresponding to REG.  */
  HOST_WIDE_INT offset;		/* Offset from start of DECL.  */
} reg_attrs;

Jim Wilson committed
185 186
/* Common union for an element of an rtx.  */

Geoffrey Keating committed
187
union rtunion_def
Jim Wilson committed
188
{
189 190 191 192 193 194
  int rt_int;
  unsigned int rt_uint;
  const char *rt_str;
  rtx rt_rtx;
  rtvec rt_rtvec;
  enum machine_mode rt_type;
195
  addr_diff_vec_flags rt_addr_diff_vec_flags;
196
  struct cselib_val_struct *rt_cselib;
197 198 199 200
  tree rt_tree;
  struct basic_block_def *rt_bb;
  mem_attrs *rt_mem;
  reg_attrs *rt_reg;
201
  struct constant_descriptor_rtx *rt_constant;
202
  struct dw_cfi_struct *rt_cfi;
Geoffrey Keating committed
203 204
};
typedef union rtunion_def rtunion;
Jim Wilson committed
205

206 207
/* This structure remembers the position of a SYMBOL_REF within an
   object_block structure.  A SYMBOL_REF only provides this information
208
   if SYMBOL_REF_HAS_BLOCK_INFO_P is true.  */
209
struct GTY(()) block_symbol {
210 211 212 213 214 215 216 217 218 219 220 221 222
  /* The usual SYMBOL_REF fields.  */
  rtunion GTY ((skip)) fld[3];

  /* The block that contains this object.  */
  struct object_block *block;

  /* The offset of this object from the start of its block.  It is negative
     if the symbol has not yet been assigned an offset.  */
  HOST_WIDE_INT offset;
};

/* Describes a group of objects that are to be placed together in such
   a way that their relative positions are known.  */
223
struct GTY(()) object_block {
224 225 226 227 228 229 230 231 232 233 234 235 236
  /* The section in which these objects should be placed.  */
  section *sect;

  /* The alignment of the first object, measured in bits.  */
  unsigned int alignment;

  /* The total size of the objects, measured in bytes.  */
  HOST_WIDE_INT size;

  /* The SYMBOL_REFs for each object.  The vector is sorted in
     order of increasing offset and the following conditions will
     hold for each element X:

237
	 SYMBOL_REF_HAS_BLOCK_INFO_P (X)
238 239 240 241 242 243 244 245 246
	 !SYMBOL_REF_ANCHOR_P (X)
	 SYMBOL_REF_BLOCK (X) == [address of this structure]
	 SYMBOL_REF_BLOCK_OFFSET (X) >= 0.  */
  VEC(rtx,gc) *objects;

  /* All the anchor SYMBOL_REFs used to address these objects, sorted
     in order of increasing offset, and then increasing TLS model.
     The following conditions will hold for each element X in this vector:

247
	 SYMBOL_REF_HAS_BLOCK_INFO_P (X)
248 249 250 251 252 253
	 SYMBOL_REF_ANCHOR_P (X)
	 SYMBOL_REF_BLOCK (X) == [address of this structure]
	 SYMBOL_REF_BLOCK_OFFSET (X) >= 0.  */
  VEC(rtx,gc) *anchors;
};

Jim Wilson committed
254 255
/* RTL expression ("rtx").  */

256
struct GTY((chain_next ("RTX_NEXT (&%h)"),
257
	    chain_prev ("RTX_PREV (&%h)"), variable_size)) rtx_def {
Jim Wilson committed
258
  /* The kind of expression this is.  */
259
  ENUM_BITFIELD(rtx_code) code: 16;
260

Jim Wilson committed
261
  /* The kind of value the expression has.  */
262 263
  ENUM_BITFIELD(machine_mode) mode : 8;

264 265 266
  /* 1 in a MEM if we should keep the alias set for this mem unchanged
     when we access a component.
     1 in a CALL_INSN if it is a sibling call.
267 268
     1 in a SET that is for a return.
     In a CODE_LABEL, part of the two-bit alternate entry field.  */
Jim Wilson committed
269
  unsigned int jump : 1;
270
  /* In a CODE_LABEL, part of the two-bit alternate entry field.
H.J. Lu committed
271
     1 in a MEM if it cannot trap.
Kenneth Zadeck committed
272 273
     1 in a CALL_INSN logically equivalent to
       ECF_LOOPING_CONST_OR_PURE and DECL_LOOPING_CONST_OR_PURE_P. */
Jim Wilson committed
274
  unsigned int call : 1;
275
  /* 1 in a REG, MEM, or CONCAT if the value is set at most once, anywhere.
276
     1 in a SUBREG used for SUBREG_PROMOTED_UNSIGNED_P.
Jim Wilson committed
277 278
     1 in a SYMBOL_REF if it addresses something in the per-function
     constants pool.
H.J. Lu committed
279
     1 in a CALL_INSN logically equivalent to ECF_CONST and TREE_READONLY.
Kenneth Zadeck committed
280
     1 in a NOTE, or EXPR_LIST for a const call.
281
     1 in a JUMP_INSN, CALL_INSN, or INSN of an annulling branch.  */
Jim Wilson committed
282
  unsigned int unchanging : 1;
283 284 285 286
  /* 1 in a MEM or ASM_OPERANDS expression if the memory reference is volatile.
     1 in an INSN, CALL_INSN, JUMP_INSN, CODE_LABEL, BARRIER, or NOTE
     if it has been deleted.
     1 in a REG expression if corresponds to a variable declared by the user,
Jim Wilson committed
287
     0 for an internally generated temporary.
288
     1 in a SUBREG used for SUBREG_PROMOTED_UNSIGNED_P.
289 290
     1 in a LABEL_REF, REG_LABEL_TARGET or REG_LABEL_OPERAND note for a
     non-local label.
291 292 293
     In a SYMBOL_REF, this flag is used for machine-specific purposes.
     In a PREFETCH, this flag indicates that it should be considered a scheduling
     barrier.  */
Jim Wilson committed
294
  unsigned int volatil : 1;
295
  /* 1 in a MEM referring to a field of an aggregate.
Jim Wilson committed
296 297 298
     0 if the MEM was a variable or the result of a * operator in C;
     1 if it was the result of a . or -> operator (on a struct) in C.
     1 in a REG if the register is used only in exit code a loop.
299
     1 in a SUBREG expression if was generated from a variable with a
300
     promoted mode.
Jim Wilson committed
301 302
     1 in a CODE_LABEL if the label is used for nonlocal gotos
     and must not be deleted even if its count is zero.
303 304
     1 in an INSN, JUMP_INSN or CALL_INSN if this insn must be scheduled
     together with the preceding insn.  Valid only within sched.
Jim Wilson committed
305 306
     1 in an INSN, JUMP_INSN, or CALL_INSN if insn is in a delay slot and
     from the target of a branch.  Valid from reorg until end of compilation;
307
     cleared before used.  */
Jim Wilson committed
308
  unsigned int in_struct : 1;
309 310
  /* At the end of RTL generation, 1 if this rtx is used.  This is used for
     copying shared structure.  See `unshare_all_rtl'.
311
     In a REG, this is not needed for that purpose, and used instead
Jim Wilson committed
312
     in `leaf_renumber_regs_insn'.
313
     1 in a SYMBOL_REF, means that emit_library_call
Jim Wilson committed
314 315
     has used it as the function.  */
  unsigned int used : 1;
316
  /* 1 in an INSN or a SET if this rtx is related to the call frame,
317
     either changing how we compute the frame address or saving and
318
     restoring registers in the prologue and epilogue.
319
     1 in a REG or MEM if it is a pointer.
320 321
     1 in a SYMBOL_REF if it addresses something in the per-function
     constant string pool.  */
x  
Jason Merrill committed
322
  unsigned frame_related : 1;
323
  /* 1 in a REG or PARALLEL that is the current function's return value.
324
     1 in a MEM if it refers to a scalar.
H.J. Lu committed
325 326
     1 in a SYMBOL_REF for a weak symbol.
     1 in a CALL_INSN logically equivalent to ECF_PURE and DECL_PURE_P. */
327
  unsigned return_val : 1;
328

Jim Wilson committed
329 330 331
  /* The first element of the operands of this rtx.
     The number of operands and their types are controlled
     by the `code' field, according to rtl.def.  */
332 333 334
  union u {
    rtunion fld[1];
    HOST_WIDE_INT hwint[1];
335
    struct block_symbol block_sym;
336
    struct real_value rv;
337
    struct fixed_value fv;
338
  } GTY ((special ("rtx_def"), desc ("GET_CODE (&%0)"))) u;
339
};
Jim Wilson committed
340

341 342 343 344
/* The size in bytes of an rtx header (code, mode and flags).  */
#define RTX_HDR_SIZE offsetof (struct rtx_def, u)

/* The size in bytes of an rtx with code CODE.  */
345
#define RTX_CODE_SIZE(CODE) rtx_code_size[CODE]
346

Jim Wilson committed
347 348
#define NULL_RTX (rtx) 0

Geoffrey Keating committed
349 350 351 352 353 354 355
/* The "next" and "previous" RTX, relative to this one.  */

#define RTX_NEXT(X) (rtx_next[GET_CODE (X)] == 0 ? NULL			\
		     : *(rtx *)(((char *)X) + rtx_next[GET_CODE (X)]))

/* FIXME: the "NEXT_INSN (PREV_INSN (X)) == X" condition shouldn't be needed.
 */
356 357 358 359
#define RTX_PREV(X) ((INSN_P (X)       			\
                      || NOTE_P (X)       		\
                      || BARRIER_P (X)        		\
                      || LABEL_P (X))    		\
Geoffrey Keating committed
360 361 362 363
                     && PREV_INSN (X) != NULL           \
                     && NEXT_INSN (PREV_INSN (X)) == X  \
                     ? PREV_INSN (X) : NULL)

Jim Wilson committed
364 365
/* Define macros to access the `code' field of the rtx.  */

366
#define GET_CODE(RTX)	    ((enum rtx_code) (RTX)->code)
367
#define PUT_CODE(RTX, CODE) ((RTX)->code = (CODE))
Jim Wilson committed
368

369
#define GET_MODE(RTX)	    ((enum machine_mode) (RTX)->mode)
370
#define PUT_MODE(RTX, MODE) ((RTX)->mode = (MODE))
Jim Wilson committed
371 372 373 374 375

/* RTL vector.  These appear inside RTX's when there is a need
   for a variable number of things.  The principle use is inside
   PARALLEL expressions.  */

376
struct GTY((variable_size)) rtvec_def {
377
  int num_elem;		/* number of elements */
378
  rtx GTY ((length ("%h.num_elem"))) elem[1];
379
};
Jim Wilson committed
380 381 382 383

#define NULL_RTVEC (rtvec) 0

#define GET_NUM_ELEM(RTVEC)		((RTVEC)->num_elem)
384
#define PUT_NUM_ELEM(RTVEC, NUM)	((RTVEC)->num_elem = (NUM))
Jim Wilson committed
385

386
/* Predicate yielding nonzero iff X is an rtx for a register.  */
Jim Wilson committed
387 388
#define REG_P(X) (GET_CODE (X) == REG)

389 390 391
/* Predicate yielding nonzero iff X is an rtx for a memory location.  */
#define MEM_P(X) (GET_CODE (X) == MEM)

392
/* Predicate yielding nonzero iff X is an rtx for a constant integer.  */
393 394
#define CONST_INT_P(X) (GET_CODE (X) == CONST_INT)

395 396 397 398
/* Predicate yielding true iff X is an rtx for a double-int
   or floating point constant.  */
#define CONST_DOUBLE_P(X) (GET_CODE (X) == CONST_DOUBLE)

399 400 401 402 403 404
/* Predicate yielding nonzero iff X is a label insn.  */
#define LABEL_P(X) (GET_CODE (X) == CODE_LABEL)

/* Predicate yielding nonzero iff X is a jump insn.  */
#define JUMP_P(X) (GET_CODE (X) == JUMP_INSN)

405 406 407 408 409 410
/* Predicate yielding nonzero iff X is a call insn.  */
#define CALL_P(X) (GET_CODE (X) == CALL_INSN)

/* Predicate yielding nonzero iff X is an insn that cannot jump.  */
#define NONJUMP_INSN_P(X) (GET_CODE (X) == INSN)

411 412 413 414 415 416 417 418 419
/* Predicate yielding nonzero iff X is a debug note/insn.  */
#define DEBUG_INSN_P(X) (GET_CODE (X) == DEBUG_INSN)

/* Predicate yielding nonzero iff X is an insn that is not a debug insn.  */
#define NONDEBUG_INSN_P(X) (INSN_P (X) && !DEBUG_INSN_P (X))

/* Nonzero if DEBUG_INSN_P may possibly hold.  */
#define MAY_HAVE_DEBUG_INSNS MAY_HAVE_DEBUG_STMTS

420 421
/* Predicate yielding nonzero iff X is a real insn.  */
#define INSN_P(X) \
422
  (NONJUMP_INSN_P (X) || DEBUG_INSN_P (X) || JUMP_P (X) || CALL_P (X))
423

424 425 426 427 428 429 430 431 432 433 434
/* Predicate yielding nonzero iff X is a note insn.  */
#define NOTE_P(X) (GET_CODE (X) == NOTE)

/* Predicate yielding nonzero iff X is a barrier insn.  */
#define BARRIER_P(X) (GET_CODE (X) == BARRIER)

/* Predicate yielding nonzero iff X is a data for a jump table.  */
#define JUMP_TABLE_DATA_P(INSN) \
  (JUMP_P (INSN) && (GET_CODE (PATTERN (INSN)) == ADDR_VEC || \
		     GET_CODE (PATTERN (INSN)) == ADDR_DIFF_VEC))

435 436 437
/* Predicate yielding nonzero iff X is a return.  */
#define ANY_RETURN_P(X) ((X) == ret_rtx)

438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484
/* 1 if X is a unary operator.  */

#define UNARY_P(X)   \
  (GET_RTX_CLASS (GET_CODE (X)) == RTX_UNARY)

/* 1 if X is a binary operator.  */

#define BINARY_P(X)   \
  ((GET_RTX_CLASS (GET_CODE (X)) & RTX_BINARY_MASK) == RTX_BINARY_RESULT)

/* 1 if X is an arithmetic operator.  */

#define ARITHMETIC_P(X)   \
  ((GET_RTX_CLASS (GET_CODE (X)) & RTX_ARITHMETIC_MASK)			\
    == RTX_ARITHMETIC_RESULT)

/* 1 if X is an arithmetic operator.  */

#define COMMUTATIVE_ARITH_P(X)   \
  (GET_RTX_CLASS (GET_CODE (X)) == RTX_COMM_ARITH)

/* 1 if X is a commutative arithmetic operator or a comparison operator.
   These two are sometimes selected together because it is possible to
   swap the two operands.  */

#define SWAPPABLE_OPERANDS_P(X)   \
  ((1 << GET_RTX_CLASS (GET_CODE (X)))					\
    & ((1 << RTX_COMM_ARITH) | (1 << RTX_COMM_COMPARE)			\
       | (1 << RTX_COMPARE)))

/* 1 if X is a non-commutative operator.  */

#define NON_COMMUTATIVE_P(X)   \
  ((GET_RTX_CLASS (GET_CODE (X)) & RTX_COMMUTATIVE_MASK)		\
    == RTX_NON_COMMUTATIVE_RESULT)

/* 1 if X is a commutative operator on integers.  */

#define COMMUTATIVE_P(X)   \
  ((GET_RTX_CLASS (GET_CODE (X)) & RTX_COMMUTATIVE_MASK)		\
    == RTX_COMMUTATIVE_RESULT)

/* 1 if X is a relational operator.  */

#define COMPARISON_P(X)   \
  ((GET_RTX_CLASS (GET_CODE (X)) & RTX_COMPARE_MASK) == RTX_COMPARE_RESULT)

Jim Wilson committed
485 486 487
/* 1 if X is a constant value that is an integer.  */

#define CONSTANT_P(X)   \
488
  (GET_RTX_CLASS (GET_CODE (X)) == RTX_CONST_OBJ)
Jim Wilson committed
489

490 491 492 493
/* 1 if X can be used to represent an object.  */
#define OBJECT_P(X)							\
  ((GET_RTX_CLASS (GET_CODE (X)) & RTX_OBJ_MASK) == RTX_OBJ_RESULT)

Jim Wilson committed
494 495
/* General accessor macros for accessing the fields of an rtx.  */

496
#if defined ENABLE_RTL_CHECKING && (GCC_VERSION >= 2007)
497 498
/* The bit with a star outside the statement expr and an & inside is
   so that N can be evaluated only once.  */
499
#define RTL_CHECK1(RTX, N, C1) __extension__				\
500
(*({ __typeof (RTX) const _rtx = (RTX); const int _n = (N);		\
501
     const enum rtx_code _code = GET_CODE (_rtx);			\
502
     if (_n < 0 || _n >= GET_RTX_LENGTH (_code))			\
503 504
       rtl_check_failed_bounds (_rtx, _n, __FILE__, __LINE__,		\
				__FUNCTION__);				\
505
     if (GET_RTX_FORMAT(_code)[_n] != C1)				\
506 507
       rtl_check_failed_type1 (_rtx, _n, C1, __FILE__, __LINE__,	\
			       __FUNCTION__);				\
508
     &_rtx->u.fld[_n]; }))
509

510
#define RTL_CHECK2(RTX, N, C1, C2) __extension__			\
511
(*({ __typeof (RTX) const _rtx = (RTX); const int _n = (N);		\
512
     const enum rtx_code _code = GET_CODE (_rtx);			\
513
     if (_n < 0 || _n >= GET_RTX_LENGTH (_code))			\
514 515
       rtl_check_failed_bounds (_rtx, _n, __FILE__, __LINE__,		\
				__FUNCTION__);				\
516 517 518
     if (GET_RTX_FORMAT(_code)[_n] != C1				\
	 && GET_RTX_FORMAT(_code)[_n] != C2)				\
       rtl_check_failed_type2 (_rtx, _n, C1, C2, __FILE__, __LINE__,	\
519
			       __FUNCTION__);				\
520
     &_rtx->u.fld[_n]; }))
521

522
#define RTL_CHECKC1(RTX, N, C) __extension__				\
523
(*({ __typeof (RTX) const _rtx = (RTX); const int _n = (N);		\
524 525 526
     if (GET_CODE (_rtx) != (C))					\
       rtl_check_failed_code1 (_rtx, (C), __FILE__, __LINE__,		\
			       __FUNCTION__);				\
527
     &_rtx->u.fld[_n]; }))
528

529
#define RTL_CHECKC2(RTX, N, C1, C2) __extension__			\
530
(*({ __typeof (RTX) const _rtx = (RTX); const int _n = (N);		\
531
     const enum rtx_code _code = GET_CODE (_rtx);			\
532 533 534
     if (_code != (C1) && _code != (C2))				\
       rtl_check_failed_code2 (_rtx, (C1), (C2), __FILE__, __LINE__,	\
			       __FUNCTION__); \
535
     &_rtx->u.fld[_n]; }))
536

537
#define RTVEC_ELT(RTVEC, I) __extension__				\
538
(*({ __typeof (RTVEC) const _rtvec = (RTVEC); const int _i = (I);	\
539 540
     if (_i < 0 || _i >= GET_NUM_ELEM (_rtvec))				\
       rtvec_check_failed_bounds (_rtvec, _i, __FILE__, __LINE__,	\
541
				  __FUNCTION__);			\
542 543
     &_rtvec->elem[_i]; }))

544
#define XWINT(RTX, N) __extension__					\
545
(*({ __typeof (RTX) const _rtx = (RTX); const int _n = (N);		\
546 547 548 549 550 551 552 553 554 555
     const enum rtx_code _code = GET_CODE (_rtx);			\
     if (_n < 0 || _n >= GET_RTX_LENGTH (_code))			\
       rtl_check_failed_bounds (_rtx, _n, __FILE__, __LINE__,		\
				__FUNCTION__);				\
     if (GET_RTX_FORMAT(_code)[_n] != 'w')				\
       rtl_check_failed_type1 (_rtx, _n, 'w', __FILE__, __LINE__,	\
			       __FUNCTION__);				\
     &_rtx->u.hwint[_n]; }))

#define XCWINT(RTX, N, C) __extension__					\
556
(*({ __typeof (RTX) const _rtx = (RTX);					\
557 558 559 560 561
     if (GET_CODE (_rtx) != (C))					\
       rtl_check_failed_code1 (_rtx, (C), __FILE__, __LINE__,		\
			       __FUNCTION__);				\
     &_rtx->u.hwint[N]; }))

562
#define XCMWINT(RTX, N, C, M) __extension__				\
563
(*({ __typeof (RTX) const _rtx = (RTX);					\
564 565 566 567 568 569
     if (GET_CODE (_rtx) != (C) || GET_MODE (_rtx) != (M))		\
       rtl_check_failed_code_mode (_rtx, (C), (M), false, __FILE__,	\
				   __LINE__, __FUNCTION__);		\
     &_rtx->u.hwint[N]; }))

#define XCNMPRV(RTX, C, M) __extension__				\
570
({ __typeof (RTX) const _rtx = (RTX);					\
571 572 573 574 575
   if (GET_CODE (_rtx) != (C) || GET_MODE (_rtx) == (M))		\
     rtl_check_failed_code_mode (_rtx, (C), (M), true, __FILE__,	\
				 __LINE__, __FUNCTION__);		\
   &_rtx->u.rv; })

576
#define XCNMPFV(RTX, C, M) __extension__				\
577
({ __typeof (RTX) const _rtx = (RTX);					\
578 579 580 581 582
   if (GET_CODE (_rtx) != (C) || GET_MODE (_rtx) == (M))		\
     rtl_check_failed_code_mode (_rtx, (C), (M), true, __FILE__,	\
				 __LINE__, __FUNCTION__);		\
   &_rtx->u.fv; })

583
#define BLOCK_SYMBOL_CHECK(RTX) __extension__				\
584 585
({ __typeof (RTX) const _symbol = (RTX);				\
   const unsigned int flags = RTL_CHECKC1 (_symbol, 1, SYMBOL_REF).rt_int; \
586
   if ((flags & SYMBOL_FLAG_HAS_BLOCK_INFO) == 0)			\
587 588 589 590
     rtl_check_failed_block_symbol (__FILE__, __LINE__,			\
				    __FUNCTION__);			\
   &_symbol->u.block_sym; })

591
extern void rtl_check_failed_bounds (const_rtx, int, const char *, int,
592
				     const char *)
593
    ATTRIBUTE_NORETURN;
594
extern void rtl_check_failed_type1 (const_rtx, int, int, const char *, int,
595
				    const char *)
596
    ATTRIBUTE_NORETURN;
597
extern void rtl_check_failed_type2 (const_rtx, int, int, int, const char *,
598
				    int, const char *)
599
    ATTRIBUTE_NORETURN;
600
extern void rtl_check_failed_code1 (const_rtx, enum rtx_code, const char *,
601
				    int, const char *)
602
    ATTRIBUTE_NORETURN;
603
extern void rtl_check_failed_code2 (const_rtx, enum rtx_code, enum rtx_code,
604
				    const char *, int, const char *)
605
    ATTRIBUTE_NORETURN;
606
extern void rtl_check_failed_code_mode (const_rtx, enum rtx_code, enum machine_mode,
607 608
					bool, const char *, int, const char *)
    ATTRIBUTE_NORETURN;
609 610
extern void rtl_check_failed_block_symbol (const char *, int, const char *)
    ATTRIBUTE_NORETURN;
611
extern void rtvec_check_failed_bounds (const_rtvec, int, const char *, int,
612
				       const char *)
613 614
    ATTRIBUTE_NORETURN;

615
#else   /* not ENABLE_RTL_CHECKING */
616

617 618 619 620
#define RTL_CHECK1(RTX, N, C1)      ((RTX)->u.fld[N])
#define RTL_CHECK2(RTX, N, C1, C2)  ((RTX)->u.fld[N])
#define RTL_CHECKC1(RTX, N, C)	    ((RTX)->u.fld[N])
#define RTL_CHECKC2(RTX, N, C1, C2) ((RTX)->u.fld[N])
621
#define RTVEC_ELT(RTVEC, I)	    ((RTVEC)->elem[I])
622 623
#define XWINT(RTX, N)		    ((RTX)->u.hwint[N])
#define XCWINT(RTX, N, C)	    ((RTX)->u.hwint[N])
624 625 626
#define XCMWINT(RTX, N, C, M)	    ((RTX)->u.hwint[N])
#define XCNMWINT(RTX, N, C, M)	    ((RTX)->u.hwint[N])
#define XCNMPRV(RTX, C, M)	    (&(RTX)->u.rv)
627
#define XCNMPFV(RTX, C, M)	    (&(RTX)->u.fv)
628
#define BLOCK_SYMBOL_CHECK(RTX)	    (&(RTX)->u.block_sym)
629 630 631

#endif

632 633 634 635 636
/* General accessor macros for accessing the flags of an rtx.  */

/* Access an individual rtx flag, with no checking of any kind.  */
#define RTX_FLAG(RTX, FLAG)	((RTX)->FLAG)

637
#if defined ENABLE_RTL_FLAG_CHECKING && (GCC_VERSION >= 2007)
638
#define RTL_FLAG_CHECK1(NAME, RTX, C1) __extension__			\
639
({ __typeof (RTX) const _rtx = (RTX);					\
640
   if (GET_CODE(_rtx) != C1)						\
641
     rtl_check_failed_flag  (NAME, _rtx, __FILE__, __LINE__,		\
642
			     __FUNCTION__);				\
643 644
   _rtx; })

645
#define RTL_FLAG_CHECK2(NAME, RTX, C1, C2) __extension__		\
646
({ __typeof (RTX) const _rtx = (RTX);					\
647
   if (GET_CODE(_rtx) != C1 && GET_CODE(_rtx) != C2)			\
648
     rtl_check_failed_flag  (NAME,_rtx, __FILE__, __LINE__,		\
649
			      __FUNCTION__);				\
650 651
   _rtx; })

652
#define RTL_FLAG_CHECK3(NAME, RTX, C1, C2, C3) __extension__		\
653
({ __typeof (RTX) const _rtx = (RTX);					\
654
   if (GET_CODE(_rtx) != C1 && GET_CODE(_rtx) != C2			\
655
       && GET_CODE(_rtx) != C3)						\
656
     rtl_check_failed_flag  (NAME, _rtx, __FILE__, __LINE__,		\
657
			     __FUNCTION__);				\
658 659
   _rtx; })

660
#define RTL_FLAG_CHECK4(NAME, RTX, C1, C2, C3, C4) __extension__	\
661
({ __typeof (RTX) const _rtx = (RTX);					\
662
   if (GET_CODE(_rtx) != C1 && GET_CODE(_rtx) != C2			\
663
       && GET_CODE(_rtx) != C3 && GET_CODE(_rtx) != C4)			\
664
     rtl_check_failed_flag  (NAME, _rtx, __FILE__, __LINE__,		\
665
			      __FUNCTION__);				\
666 667
   _rtx; })

668
#define RTL_FLAG_CHECK5(NAME, RTX, C1, C2, C3, C4, C5) __extension__	\
669
({ __typeof (RTX) const _rtx = (RTX);					\
670
   if (GET_CODE(_rtx) != C1 && GET_CODE(_rtx) != C2			\
671 672
       && GET_CODE(_rtx) != C3 && GET_CODE(_rtx) != C4			\
       && GET_CODE(_rtx) != C5)						\
673
     rtl_check_failed_flag  (NAME, _rtx, __FILE__, __LINE__,		\
674
			     __FUNCTION__);				\
675 676
   _rtx; })

677 678
#define RTL_FLAG_CHECK6(NAME, RTX, C1, C2, C3, C4, C5, C6)		\
  __extension__								\
679
({ __typeof (RTX) const _rtx = (RTX);					\
680
   if (GET_CODE(_rtx) != C1 && GET_CODE(_rtx) != C2			\
681 682
       && GET_CODE(_rtx) != C3 && GET_CODE(_rtx) != C4			\
       && GET_CODE(_rtx) != C5 && GET_CODE(_rtx) != C6)			\
683
     rtl_check_failed_flag  (NAME,_rtx, __FILE__, __LINE__,		\
684
			     __FUNCTION__);				\
685 686
   _rtx; })

687 688
#define RTL_FLAG_CHECK7(NAME, RTX, C1, C2, C3, C4, C5, C6, C7)		\
  __extension__								\
689
({ __typeof (RTX) const _rtx = (RTX);					\
690
   if (GET_CODE(_rtx) != C1 && GET_CODE(_rtx) != C2			\
691 692 693
       && GET_CODE(_rtx) != C3 && GET_CODE(_rtx) != C4			\
       && GET_CODE(_rtx) != C5 && GET_CODE(_rtx) != C6			\
       && GET_CODE(_rtx) != C7)						\
694
     rtl_check_failed_flag  (NAME, _rtx, __FILE__, __LINE__,		\
695
			     __FUNCTION__);				\
696 697
   _rtx; })

698 699
#define RTL_FLAG_CHECK8(NAME, RTX, C1, C2, C3, C4, C5, C6, C7, C8)	\
  __extension__								\
700
({ __typeof (RTX) const _rtx = (RTX);					\
701
   if (GET_CODE(_rtx) != C1 && GET_CODE(_rtx) != C2			\
702 703 704
       && GET_CODE(_rtx) != C3 && GET_CODE(_rtx) != C4			\
       && GET_CODE(_rtx) != C5 && GET_CODE(_rtx) != C6			\
       && GET_CODE(_rtx) != C7 && GET_CODE(_rtx) != C8)			\
705
     rtl_check_failed_flag  (NAME, _rtx, __FILE__, __LINE__,		\
706
			     __FUNCTION__);				\
707 708
   _rtx; })

709
extern void rtl_check_failed_flag (const char *, const_rtx, const char *,
710
				   int, const char *)
711 712 713 714 715
    ATTRIBUTE_NORETURN
    ;

#else	/* not ENABLE_RTL_FLAG_CHECKING */

716 717 718 719
#define RTL_FLAG_CHECK1(NAME, RTX, C1)					(RTX)
#define RTL_FLAG_CHECK2(NAME, RTX, C1, C2)				(RTX)
#define RTL_FLAG_CHECK3(NAME, RTX, C1, C2, C3)				(RTX)
#define RTL_FLAG_CHECK4(NAME, RTX, C1, C2, C3, C4)			(RTX)
720
#define RTL_FLAG_CHECK5(NAME, RTX, C1, C2, C3, C4, C5)		(RTX)
721 722 723
#define RTL_FLAG_CHECK6(NAME, RTX, C1, C2, C3, C4, C5, C6)		(RTX)
#define RTL_FLAG_CHECK7(NAME, RTX, C1, C2, C3, C4, C5, C6, C7)		(RTX)
#define RTL_FLAG_CHECK8(NAME, RTX, C1, C2, C3, C4, C5, C6, C7, C8)	(RTX)
724 725
#endif

726 727 728 729 730 731 732 733
#define XINT(RTX, N)	(RTL_CHECK2 (RTX, N, 'i', 'n').rt_int)
#define XSTR(RTX, N)	(RTL_CHECK2 (RTX, N, 's', 'S').rt_str)
#define XEXP(RTX, N)	(RTL_CHECK2 (RTX, N, 'e', 'u').rt_rtx)
#define XVEC(RTX, N)	(RTL_CHECK2 (RTX, N, 'E', 'V').rt_rtvec)
#define XMODE(RTX, N)	(RTL_CHECK1 (RTX, N, 'M').rt_type)
#define XTREE(RTX, N)   (RTL_CHECK1 (RTX, N, 't').rt_tree)
#define XBBDEF(RTX, N)	(RTL_CHECK1 (RTX, N, 'B').rt_bb)
#define XTMPL(RTX, N)	(RTL_CHECK1 (RTX, N, 'T').rt_str)
734
#define XCFI(RTX, N)	(RTL_CHECK1 (RTX, N, 'C').rt_cfi)
735 736 737 738

#define XVECEXP(RTX, N, M)	RTVEC_ELT (XVEC (RTX, N), M)
#define XVECLEN(RTX, N)		GET_NUM_ELEM (XVEC (RTX, N))

739
/* These are like XINT, etc. except that they expect a '0' field instead
740 741
   of the normal type code.  */

742 743 744 745 746 747 748 749
#define X0INT(RTX, N)	   (RTL_CHECK1 (RTX, N, '0').rt_int)
#define X0UINT(RTX, N)	   (RTL_CHECK1 (RTX, N, '0').rt_uint)
#define X0STR(RTX, N)	   (RTL_CHECK1 (RTX, N, '0').rt_str)
#define X0EXP(RTX, N)	   (RTL_CHECK1 (RTX, N, '0').rt_rtx)
#define X0VEC(RTX, N)	   (RTL_CHECK1 (RTX, N, '0').rt_rtvec)
#define X0MODE(RTX, N)	   (RTL_CHECK1 (RTX, N, '0').rt_type)
#define X0TREE(RTX, N)	   (RTL_CHECK1 (RTX, N, '0').rt_tree)
#define X0BBDEF(RTX, N)	   (RTL_CHECK1 (RTX, N, '0').rt_bb)
750 751
#define X0ADVFLAGS(RTX, N) (RTL_CHECK1 (RTX, N, '0').rt_addr_diff_vec_flags)
#define X0CSELIB(RTX, N)   (RTL_CHECK1 (RTX, N, '0').rt_cselib)
752 753
#define X0MEMATTR(RTX, N)  (RTL_CHECKC1 (RTX, N, MEM).rt_mem)
#define X0REGATTR(RTX, N)  (RTL_CHECKC1 (RTX, N, REG).rt_reg)
754
#define X0CONSTANT(RTX, N) (RTL_CHECK1 (RTX, N, '0').rt_constant)
755

756 757 758
/* Access a '0' field with any type.  */
#define X0ANY(RTX, N)	   RTL_CHECK1 (RTX, N, '0')

759 760 761 762 763 764 765 766
#define XCINT(RTX, N, C)      (RTL_CHECKC1 (RTX, N, C).rt_int)
#define XCUINT(RTX, N, C)     (RTL_CHECKC1 (RTX, N, C).rt_uint)
#define XCSTR(RTX, N, C)      (RTL_CHECKC1 (RTX, N, C).rt_str)
#define XCEXP(RTX, N, C)      (RTL_CHECKC1 (RTX, N, C).rt_rtx)
#define XCVEC(RTX, N, C)      (RTL_CHECKC1 (RTX, N, C).rt_rtvec)
#define XCMODE(RTX, N, C)     (RTL_CHECKC1 (RTX, N, C).rt_type)
#define XCTREE(RTX, N, C)     (RTL_CHECKC1 (RTX, N, C).rt_tree)
#define XCBBDEF(RTX, N, C)    (RTL_CHECKC1 (RTX, N, C).rt_bb)
767
#define XCCFI(RTX, N, C)      (RTL_CHECKC1 (RTX, N, C).rt_cfi)
768
#define XCCSELIB(RTX, N, C)   (RTL_CHECKC1 (RTX, N, C).rt_cselib)
769 770 771 772

#define XCVECEXP(RTX, N, M, C)	RTVEC_ELT (XCVEC (RTX, N, C), M)
#define XCVECLEN(RTX, N, C)	GET_NUM_ELEM (XCVEC (RTX, N, C))

773
#define XC2EXP(RTX, N, C1, C2)      (RTL_CHECKC2 (RTX, N, C1, C2).rt_rtx)
Jim Wilson committed
774 775 776 777 778

/* ACCESS MACROS for particular fields of insns.  */

/* Holds a unique number for each insn.
   These are not necessarily sequentially increasing.  */
779
#define INSN_UID(INSN)  XINT (INSN, 0)
Jim Wilson committed
780 781

/* Chain insns together in sequence.  */
782 783
#define PREV_INSN(INSN)	XEXP (INSN, 1)
#define NEXT_INSN(INSN)	XEXP (INSN, 2)
Jim Wilson committed
784

785
#define BLOCK_FOR_INSN(INSN) XBBDEF (INSN, 3)
786 787 788 789 790

/* The body of an insn.  */
#define PATTERN(INSN)	XEXP (INSN, 4)

#define INSN_LOCATOR(INSN) XINT (INSN, 5)
791 792
/* LOCATION of an RTX if relevant.  */
#define RTL_LOCATION(X) (INSN_P (X) ? \
793
			 locator_location (INSN_LOCATOR (X)) \
794 795 796
			 : UNKNOWN_LOCATION)
/* LOCATION of current INSN.  */
#define CURR_INSN_LOCATION (locator_location (curr_insn_locator ()))
Jim Wilson committed
797 798 799

/* Code number of instruction, from when it was recognized.
   -1 means this instruction has not been recognized yet.  */
800
#define INSN_CODE(INSN) XINT (INSN, 6)
Jim Wilson committed
801

802
#define RTX_FRAME_RELATED_P(RTX)					\
803 804
  (RTL_FLAG_CHECK6("RTX_FRAME_RELATED_P", (RTX), DEBUG_INSN, INSN,	\
		   CALL_INSN, JUMP_INSN, BARRIER, SET)->frame_related)
805 806 807

/* 1 if RTX is an insn that has been deleted.  */
#define INSN_DELETED_P(RTX)						\
808 809
  (RTL_FLAG_CHECK7("INSN_DELETED_P", (RTX), DEBUG_INSN, INSN,		\
		   CALL_INSN, JUMP_INSN,				\
810 811
		   CODE_LABEL, BARRIER, NOTE)->volatil)

Kenneth Zadeck committed
812 813 814 815 816 817 818 819 820 821
/* 1 if RTX is a call to a const function.  Built from ECF_CONST and
   TREE_READONLY.  */
#define RTL_CONST_CALL_P(RTX)					\
  (RTL_FLAG_CHECK1("RTL_CONST_CALL_P", (RTX), CALL_INSN)->unchanging)

/* 1 if RTX is a call to a pure function.  Built from ECF_PURE and
   DECL_PURE_P.  */
#define RTL_PURE_CALL_P(RTX)					\
  (RTL_FLAG_CHECK1("RTL_PURE_CALL_P", (RTX), CALL_INSN)->return_val)

822
/* 1 if RTX is a call to a const or pure function.  */
Kenneth Zadeck committed
823 824 825 826 827 828 829
#define RTL_CONST_OR_PURE_CALL_P(RTX) \
  (RTL_CONST_CALL_P(RTX) || RTL_PURE_CALL_P(RTX))

/* 1 if RTX is a call to a looping const or pure function.  Built from
   ECF_LOOPING_CONST_OR_PURE and DECL_LOOPING_CONST_OR_PURE_P.  */
#define RTL_LOOPING_CONST_OR_PURE_CALL_P(RTX)					\
  (RTL_FLAG_CHECK1("CONST_OR_PURE_CALL_P", (RTX), CALL_INSN)->call)
830 831 832 833 834

/* 1 if RTX is a call_insn for a sibling call.  */
#define SIBLING_CALL_P(RTX)						\
  (RTL_FLAG_CHECK1("SIBLING_CALL_P", (RTX), CALL_INSN)->jump)

835
/* 1 if RTX is a jump_insn, call_insn, or insn that is an annulling branch.  */
836
#define INSN_ANNULLED_BRANCH_P(RTX)					\
837
  (RTL_FLAG_CHECK3("INSN_ANNULLED_BRANCH_P", (RTX), JUMP_INSN, CALL_INSN, INSN)->unchanging)
838 839 840

/* 1 if RTX is an insn in a delay slot and is from the target of the branch.
   If the branch insn has INSN_ANNULLED_BRANCH_P set, this insn should only be
Jim Wilson committed
841 842
   executed if the branch is taken.  For annulled branches with this bit
   clear, the insn should be executed only if the branch is not taken.  */
843
#define INSN_FROM_TARGET_P(RTX)						\
844
  (RTL_FLAG_CHECK3("INSN_FROM_TARGET_P", (RTX), INSN, JUMP_INSN, CALL_INSN)->in_struct)
Jim Wilson committed
845

846 847
/* In an ADDR_DIFF_VEC, the flags for RTX for use by branch shortening.
   See the comments for ADDR_DIFF_VEC in rtl.def.  */
848 849
#define ADDR_DIFF_VEC_FLAGS(RTX) X0ADVFLAGS(RTX, 4)

850 851
/* In a VALUE, the value cselib has assigned to RTX.
   This is a "struct cselib_val_struct", see cselib.h.  */
852 853
#define CSELIB_VAL_PTR(RTX) X0CSELIB(RTX, 0)

Jim Wilson committed
854
/* Holds a list of notes on what this insn does to various REGs.
855 856
   It is a chain of EXPR_LIST rtx's, where the second operand is the
   chain pointer and the first operand is the REG being described.
Jim Wilson committed
857
   The mode field of the EXPR_LIST contains not a real machine mode
858
   but a value from enum reg_note.  */
859
#define REG_NOTES(INSN)	XEXP(INSN, 7)
Jim Wilson committed
860

861 862 863 864
/* In an ENTRY_VALUE this is the DECL_INCOMING_RTL of the argument in
   question.  */
#define ENTRY_VALUE_EXP(RTX) (RTL_CHECKC1 (RTX, 0, ENTRY_VALUE).rt_rtx)

865 866
enum reg_note
{
867 868 869 870
#define DEF_REG_NOTE(NAME) NAME,
#include "reg-notes.def"
#undef DEF_REG_NOTE
  REG_NOTE_MAX
871 872
};

Jim Wilson committed
873 874
/* Define macros to extract and insert the reg-note kind in an EXPR_LIST.  */
#define REG_NOTE_KIND(LINK) ((enum reg_note) GET_MODE (LINK))
875 876
#define PUT_REG_NOTE_KIND(LINK, KIND) \
  PUT_MODE (LINK, (enum machine_mode) (KIND))
Jim Wilson committed
877 878 879

/* Names for REG_NOTE's in EXPR_LIST insn's.  */

880
extern const char * const reg_note_name[];
Mike Stump committed
881
#define GET_REG_NOTE_NAME(MODE) (reg_note_name[(int) (MODE)])
Jim Wilson committed
882

883 884 885 886 887 888 889
/* This field is only present on CALL_INSNs.  It holds a chain of EXPR_LIST of
   USE and CLOBBER expressions.
     USE expressions list the registers filled with arguments that
   are passed to the function.
     CLOBBER expressions document the registers explicitly clobbered
   by this CALL_INSN.
     Pseudo registers can not be mentioned in this list.  */
890
#define CALL_INSN_FUNCTION_USAGE(INSN)	XEXP(INSN, 8)
891

Jim Wilson committed
892 893 894
/* The label-number of a code-label.  The assembler label
   is made from `L' and the label-number printed in decimal.
   Label numbers are unique in a compilation.  */
895
#define CODE_LABEL_NUMBER(INSN)	XINT (INSN, 6)
Jim Wilson committed
896

897 898 899 900
/* In a NOTE that is a line number, this is a string for the file name that the
   line is in.  We use the same field to record block numbers temporarily in
   NOTE_INSN_BLOCK_BEG and NOTE_INSN_BLOCK_END notes.  (We avoid lots of casts
   between ints and pointers if we use a different macro for the block number.)
901
   */
Jim Wilson committed
902

903
/* Opaque data.  */
904 905
#define NOTE_DATA(INSN)	        RTL_CHECKC1 (INSN, 4, NOTE)
#define NOTE_DELETED_LABEL_NAME(INSN) XCSTR (INSN, 4, NOTE)
906
#define SET_INSN_DELETED(INSN) set_insn_deleted (INSN);
907 908 909 910
#define NOTE_BLOCK(INSN)	XCTREE (INSN, 4, NOTE)
#define NOTE_EH_HANDLER(INSN)	XCINT (INSN, 4, NOTE)
#define NOTE_BASIC_BLOCK(INSN)	XCBBDEF (INSN, 4, NOTE)
#define NOTE_VAR_LOCATION(INSN)	XCEXP (INSN, 4, NOTE)
911 912
#define NOTE_CFI(INSN)		XCCFI (INSN, 4, NOTE)
#define NOTE_LABEL_NUMBER(INSN)	XCINT (INSN, 4, NOTE)
913

Jim Wilson committed
914 915
/* In a NOTE that is a line number, this is the line number.
   Other kinds of NOTEs are identified by negative numbers here.  */
916
#define NOTE_KIND(INSN) XCINT (INSN, 5, NOTE)
Jim Wilson committed
917

918
/* Nonzero if INSN is a note marking the beginning of a basic block.  */
919
#define NOTE_INSN_BASIC_BLOCK_P(INSN)			\
920
  (GET_CODE (INSN) == NOTE				\
921
   && NOTE_KIND (INSN) == NOTE_INSN_BASIC_BLOCK)
922

923
/* Variable declaration and the location of a variable.  */
924 925
#define PAT_VAR_LOCATION_DECL(PAT) (XCTREE ((PAT), 0, VAR_LOCATION))
#define PAT_VAR_LOCATION_LOC(PAT) (XCEXP ((PAT), 1, VAR_LOCATION))
Jim Wilson committed
926

927 928 929
/* Initialization status of the variable in the location.  Status
   can be unknown, uninitialized or initialized.  See enumeration
   type below.  */
930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963
#define PAT_VAR_LOCATION_STATUS(PAT) \
  ((enum var_init_status) (XCINT ((PAT), 2, VAR_LOCATION)))

/* Accessors for a NOTE_INSN_VAR_LOCATION.  */
#define NOTE_VAR_LOCATION_DECL(NOTE) \
  PAT_VAR_LOCATION_DECL (NOTE_VAR_LOCATION (NOTE))
#define NOTE_VAR_LOCATION_LOC(NOTE) \
  PAT_VAR_LOCATION_LOC (NOTE_VAR_LOCATION (NOTE))
#define NOTE_VAR_LOCATION_STATUS(NOTE) \
  PAT_VAR_LOCATION_STATUS (NOTE_VAR_LOCATION (NOTE))

/* The VAR_LOCATION rtx in a DEBUG_INSN.  */
#define INSN_VAR_LOCATION(INSN) PATTERN (INSN)

/* Accessors for a tree-expanded var location debug insn.  */
#define INSN_VAR_LOCATION_DECL(INSN) \
  PAT_VAR_LOCATION_DECL (INSN_VAR_LOCATION (INSN))
#define INSN_VAR_LOCATION_LOC(INSN) \
  PAT_VAR_LOCATION_LOC (INSN_VAR_LOCATION (INSN))
#define INSN_VAR_LOCATION_STATUS(INSN) \
  PAT_VAR_LOCATION_STATUS (INSN_VAR_LOCATION (INSN))

/* Expand to the RTL that denotes an unknown variable location in a
   DEBUG_INSN.  */
#define gen_rtx_UNKNOWN_VAR_LOC() (gen_rtx_CLOBBER (VOIDmode, const0_rtx))

/* Determine whether X is such an unknown location.  */
#define VAR_LOC_UNKNOWN_P(X) \
  (GET_CODE (X) == CLOBBER && XEXP ((X), 0) == const0_rtx)

/* 1 if RTX is emitted after a call, but it should take effect before
   the call returns.  */
#define NOTE_DURING_CALL_P(RTX)				\
  (RTL_FLAG_CHECK1("NOTE_VAR_LOCATION_DURING_CALL_P", (RTX), NOTE)->call)
964

965 966 967
/* DEBUG_EXPR_DECL corresponding to a DEBUG_EXPR RTX.  */
#define DEBUG_EXPR_TREE_DECL(RTX) XCTREE (RTX, 0, DEBUG_EXPR)

968 969 970
/* VAR_DECL/PARM_DECL DEBUG_IMPLICIT_PTR takes address of.  */
#define DEBUG_IMPLICIT_PTR_DECL(RTX) XCTREE (RTX, 0, DEBUG_IMPLICIT_PTR)

971 972 973
/* PARM_DECL DEBUG_PARAMETER_REF references.  */
#define DEBUG_PARAMETER_REF_DECL(RTX) XCTREE (RTX, 0, DEBUG_PARAMETER_REF)

974
/* Codes that appear in the NOTE_KIND field for kinds of notes
975
   that are not line numbers.  These codes are all negative.
H.J. Lu committed
976

977 978 979 980
   Notice that we do not try to use zero here for any of
   the special note codes because sometimes the source line
   actually can be zero!  This happens (for example) when we
   are generating code for the per-translation-unit constructor
981
   and destructor routines for some C++ translation unit.  */
Jim Wilson committed
982

983 984
enum insn_note
{
985 986 987
#define DEF_INSN_NOTE(NAME) NAME,
#include "insn-notes.def"
#undef DEF_INSN_NOTE
988

989 990
  NOTE_INSN_MAX
};
991

Jim Wilson committed
992 993
/* Names for NOTE insn's other than line numbers.  */

994
extern const char * const note_insn_name[NOTE_INSN_MAX];
995
#define GET_NOTE_INSN_NAME(NOTE_CODE) \
996
  (note_insn_name[(NOTE_CODE)])
Jim Wilson committed
997 998 999

/* The name of a label, in case it corresponds to an explicit label
   in the input source code.  */
1000
#define LABEL_NAME(RTX) XCSTR (RTX, 7, CODE_LABEL)
Jim Wilson committed
1001 1002 1003

/* In jump.c, each label contains a count of the number
   of LABEL_REFs that point at it, so unused labels can be deleted.  */
1004
#define LABEL_NUSES(RTX) XCINT (RTX, 5, CODE_LABEL)
Jim Wilson committed
1005

1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020
/* Labels carry a two-bit field composed of the ->jump and ->call
   bits.  This field indicates whether the label is an alternate
   entry point, and if so, what kind.  */
enum label_kind
{
  LABEL_NORMAL = 0,	/* ordinary label */
  LABEL_STATIC_ENTRY,	/* alternate entry point, not exported */
  LABEL_GLOBAL_ENTRY,	/* alternate entry point, exported */
  LABEL_WEAK_ENTRY	/* alternate entry point, exported as weak symbol */
};

#if defined ENABLE_RTL_FLAG_CHECKING && (GCC_VERSION > 2007)

/* Retrieve the kind of LABEL.  */
#define LABEL_KIND(LABEL) __extension__					\
1021
({ __typeof (LABEL) const _label = (LABEL);				\
1022 1023 1024 1025 1026 1027 1028
   if (GET_CODE (_label) != CODE_LABEL)					\
     rtl_check_failed_flag ("LABEL_KIND", _label, __FILE__, __LINE__,	\
			    __FUNCTION__);				\
   (enum label_kind) ((_label->jump << 1) | _label->call); })

/* Set the kind of LABEL.  */
#define SET_LABEL_KIND(LABEL, KIND) do {				\
1029
   __typeof (LABEL) const _label = (LABEL);				\
1030
   const unsigned int _kind = (KIND);					\
1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045
   if (GET_CODE (_label) != CODE_LABEL)					\
     rtl_check_failed_flag ("SET_LABEL_KIND", _label, __FILE__, __LINE__, \
			    __FUNCTION__);				\
   _label->jump = ((_kind >> 1) & 1);					\
   _label->call = (_kind & 1);						\
} while (0)

#else

/* Retrieve the kind of LABEL.  */
#define LABEL_KIND(LABEL) \
   ((enum label_kind) (((LABEL)->jump << 1) | (LABEL)->call))

/* Set the kind of LABEL.  */
#define SET_LABEL_KIND(LABEL, KIND) do {				\
1046 1047
   rtx const _label = (LABEL);						\
   const unsigned int _kind = (KIND);					\
1048 1049 1050 1051 1052 1053 1054
   _label->jump = ((_kind >> 1) & 1);					\
   _label->call = (_kind & 1);						\
} while (0)

#endif /* rtl flag checking */

#define LABEL_ALT_ENTRY_P(LABEL) (LABEL_KIND (LABEL) != LABEL_NORMAL)
1055

Jim Wilson committed
1056 1057 1058
/* In jump.c, each JUMP_INSN can point to a label that it can jump to,
   so that if the JUMP_INSN is deleted, the label's LABEL_NUSES can
   be decremented and possibly the label can be deleted.  */
1059
#define JUMP_LABEL(INSN)   XCEXP (INSN, 8, JUMP_INSN)
Jim Wilson committed
1060

1061 1062 1063
/* Once basic blocks are found, each CODE_LABEL starts a chain that
   goes through all the LABEL_REFs that jump to that label.  The chain
   eventually winds up at the CODE_LABEL: it is circular.  */
1064
#define LABEL_REFS(LABEL) XCEXP (LABEL, 4, CODE_LABEL)
Jim Wilson committed
1065

1066 1067 1068 1069
/* For a REG rtx, REGNO extracts the register number.  REGNO can only
   be used on RHS.  Use SET_REGNO to change the value.  */
#define REGNO(RTX) (rhs_regno(RTX))
#define SET_REGNO(RTX,N) (df_ref_change_reg_with_loc (REGNO(RTX), N, RTX), XCUINT (RTX, 0, REG) = N)
1070
#define SET_REGNO_RAW(RTX,N) (XCUINT (RTX, 0, REG) = N)
1071 1072 1073 1074

/* ORIGINAL_REGNO holds the number the register originally had; for a
   pseudo register turned into a hard reg this will hold the old pseudo
   register number.  */
1075
#define ORIGINAL_REGNO(RTX) X0UINT (RTX, 1)
Jim Wilson committed
1076

1077 1078
/* Force the REGNO macro to only be used on the lhs.  */
static inline unsigned int
1079
rhs_regno (const_rtx x)
1080 1081 1082 1083 1084
{
  return XCUINT (x, 0, REG);
}


1085 1086
/* 1 if RTX is a reg or parallel that is the current function's return
   value.  */
1087
#define REG_FUNCTION_VALUE_P(RTX)					\
1088
  (RTL_FLAG_CHECK2("REG_FUNCTION_VALUE_P", (RTX), REG, PARALLEL)->return_val)
Jim Wilson committed
1089

1090 1091 1092
/* 1 if RTX is a reg that corresponds to a variable declared by the user.  */
#define REG_USERVAR_P(RTX)						\
  (RTL_FLAG_CHECK1("REG_USERVAR_P", (RTX), REG)->volatil)
Jim Wilson committed
1093

1094 1095 1096
/* 1 if RTX is a reg that holds a pointer value.  */
#define REG_POINTER(RTX)						\
  (RTL_FLAG_CHECK1("REG_POINTER", (RTX), REG)->frame_related)
1097

1098 1099 1100 1101
/* 1 if RTX is a mem that holds a pointer value.  */
#define MEM_POINTER(RTX)						\
  (RTL_FLAG_CHECK1("MEM_POINTER", (RTX), MEM)->frame_related)

1102 1103 1104 1105
/* 1 if the given register REG corresponds to a hard register.  */
#define HARD_REGISTER_P(REG) (HARD_REGISTER_NUM_P (REGNO (REG)))

/* 1 if the given register number REG_NO corresponds to a hard register.  */
1106
#define HARD_REGISTER_NUM_P(REG_NO) ((REG_NO) < FIRST_PSEUDO_REGISTER)
1107

Jim Wilson committed
1108
/* For a CONST_INT rtx, INTVAL extracts the integer.  */
1109
#define INTVAL(RTX) XCWINT(RTX, 0, CONST_INT)
Stuart Hastings committed
1110
#define UINTVAL(RTX) ((unsigned HOST_WIDE_INT) INTVAL (RTX))
Jim Wilson committed
1111

Zack Weinberg committed
1112
/* For a CONST_DOUBLE:
1113
   For a VOIDmode, there are two integers CONST_DOUBLE_LOW is the
1114
     low-order word and ..._HIGH the high-order.
1115
   For a float, there is a REAL_VALUE_TYPE structure, and
1116
     CONST_DOUBLE_REAL_VALUE(r) is a pointer to it.  */
1117 1118 1119 1120
#define CONST_DOUBLE_LOW(r) XCMWINT (r, 0, CONST_DOUBLE, VOIDmode)
#define CONST_DOUBLE_HIGH(r) XCMWINT (r, 1, CONST_DOUBLE, VOIDmode)
#define CONST_DOUBLE_REAL_VALUE(r) \
  ((const struct real_value *) XCNMPRV (r, CONST_DOUBLE, VOIDmode))
Zack Weinberg committed
1121

1122 1123 1124 1125 1126 1127 1128
#define CONST_FIXED_VALUE(r) \
  ((const struct fixed_value *) XCNMPFV (r, CONST_FIXED, VOIDmode))
#define CONST_FIXED_VALUE_HIGH(r) \
  ((HOST_WIDE_INT) (CONST_FIXED_VALUE(r)->data.high))
#define CONST_FIXED_VALUE_LOW(r) \
  ((HOST_WIDE_INT) (CONST_FIXED_VALUE(r)->data.low))

1129 1130 1131 1132 1133 1134
/* For a CONST_VECTOR, return element #n.  */
#define CONST_VECTOR_ELT(RTX, N) XCVECEXP (RTX, 0, N, CONST_VECTOR)

/* For a CONST_VECTOR, return the number of elements in a vector.  */
#define CONST_VECTOR_NUNITS(RTX) XCVECLEN (RTX, 0, CONST_VECTOR)

Jim Wilson committed
1135
/* For a SUBREG rtx, SUBREG_REG extracts the value we want a subreg of.
1136
   SUBREG_BYTE extracts the byte-number.  */
Jim Wilson committed
1137

1138 1139
#define SUBREG_REG(RTX) XCEXP (RTX, 0, SUBREG)
#define SUBREG_BYTE(RTX) XCUINT (RTX, 1, SUBREG)
1140 1141

/* in rtlanal.c */
1142 1143 1144 1145 1146 1147 1148 1149 1150
/* Return the right cost to give to an operation
   to make the cost of the corresponding register-to-register instruction
   N times that of a fast register-to-register instruction.  */
#define COSTS_N_INSNS(N) ((N) * 4)

/* Maximum cost of an rtl expression.  This value has the special meaning
   not to use an rtx with this cost under any circumstances.  */
#define MAX_COST INT_MAX

1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197
/* A structure to hold all available cost information about an rtl
   expression.  */
struct full_rtx_costs
{
  int speed;
  int size;
};

/* Initialize a full_rtx_costs structure C to the maximum cost.  */
static inline void
init_costs_to_max (struct full_rtx_costs *c)
{
  c->speed = MAX_COST;
  c->size = MAX_COST;
}

/* Initialize a full_rtx_costs structure C to zero cost.  */
static inline void
init_costs_to_zero (struct full_rtx_costs *c)
{
  c->speed = 0;
  c->size = 0;
}

/* Compare two full_rtx_costs structures A and B, returning true
   if A < B when optimizing for speed.  */
static inline bool
costs_lt_p (struct full_rtx_costs *a, struct full_rtx_costs *b,
	    bool speed)
{
  if (speed)
    return (a->speed < b->speed
	    || (a->speed == b->speed && a->size < b->size));
  else
    return (a->size < b->size
	    || (a->size == b->size && a->speed < b->speed));
}

/* Increase both members of the full_rtx_costs structure C by the
   cost of N insns.  */
static inline void
costs_add_n_insns (struct full_rtx_costs *c, int n)
{
  c->speed += COSTS_N_INSNS (n);
  c->size += COSTS_N_INSNS (n);
}

1198
extern void init_rtlanal (void);
1199
extern int rtx_cost (rtx, enum rtx_code, bool);
1200
extern int address_cost (rtx, enum machine_mode, addr_space_t, bool);
1201
extern void get_full_rtx_cost (rtx, enum rtx_code, struct full_rtx_costs *);
1202
extern unsigned int subreg_lsb (const_rtx);
1203 1204
extern unsigned int subreg_lsb_1 (enum machine_mode, enum machine_mode,
				  unsigned int);
1205 1206 1207 1208
extern unsigned int subreg_regno_offset	(unsigned int, enum machine_mode,
					 unsigned int, enum machine_mode);
extern bool subreg_offset_representable_p (unsigned int, enum machine_mode,
					   unsigned int, enum machine_mode);
1209
extern unsigned int subreg_regno (const_rtx);
1210 1211
extern int simplify_subreg_regno (unsigned int, enum machine_mode,
				  unsigned int, enum machine_mode);
1212
extern unsigned int subreg_nregs (const_rtx);
1213
extern unsigned int subreg_nregs_with_regno (unsigned int, const_rtx);
1214 1215
extern unsigned HOST_WIDE_INT nonzero_bits (const_rtx, enum machine_mode);
extern unsigned int num_sign_bit_copies (const_rtx, enum machine_mode);
1216
extern bool constant_pool_constant_p (rtx);
1217
extern bool truncated_to_mode (enum machine_mode, const_rtx);
1218
extern int low_bitmask_len (enum machine_mode, unsigned HOST_WIDE_INT);
1219

Jim Wilson committed
1220

1221 1222
/* 1 if RTX is a subreg containing a reg that is already known to be
   sign- or zero-extended from the mode of the subreg to the mode of
1223
   the reg.  SUBREG_PROMOTED_UNSIGNED_P gives the signedness of the
1224
   extension.
1225 1226 1227 1228

   When used as a LHS, is means that this extension must be done
   when assigning to SUBREG_REG.  */

1229 1230 1231 1232 1233
#define SUBREG_PROMOTED_VAR_P(RTX)					\
  (RTL_FLAG_CHECK1("SUBREG_PROMOTED", (RTX), SUBREG)->in_struct)

#define SUBREG_PROMOTED_UNSIGNED_SET(RTX, VAL)				\
do {									\
1234
  rtx const _rtx = RTL_FLAG_CHECK1("SUBREG_PROMOTED_UNSIGNED_SET", (RTX), SUBREG); \
1235
  if ((VAL) < 0)							\
1236
    _rtx->volatil = 1;							\
1237
  else {								\
1238 1239
    _rtx->volatil = 0;							\
    _rtx->unchanging = (VAL);						\
1240
  }									\
1241
} while (0)
1242 1243 1244 1245 1246 1247 1248 1249 1250

/* Valid for subregs which are SUBREG_PROMOTED_VAR_P().  In that case
   this gives the necessary extensions:
   0  - signed
   1  - normal unsigned
   -1 - pointer unsigned, which most often can be handled like unsigned
        extension, except for generating instructions where we need to
	emit special code (ptr_extend insns) on some architectures.  */

1251
#define SUBREG_PROMOTED_UNSIGNED_P(RTX)	\
1252
  ((RTL_FLAG_CHECK1("SUBREG_PROMOTED_UNSIGNED_P", (RTX), SUBREG)->volatil) \
1253
   ? -1 : (int) (RTX)->unchanging)
1254

Jim Wilson committed
1255 1256
/* Access various components of an ASM_OPERANDS rtx.  */

1257 1258 1259 1260 1261 1262 1263
#define ASM_OPERANDS_TEMPLATE(RTX) XCSTR (RTX, 0, ASM_OPERANDS)
#define ASM_OPERANDS_OUTPUT_CONSTRAINT(RTX) XCSTR (RTX, 1, ASM_OPERANDS)
#define ASM_OPERANDS_OUTPUT_IDX(RTX) XCINT (RTX, 2, ASM_OPERANDS)
#define ASM_OPERANDS_INPUT_VEC(RTX) XCVEC (RTX, 3, ASM_OPERANDS)
#define ASM_OPERANDS_INPUT_CONSTRAINT_VEC(RTX) XCVEC (RTX, 4, ASM_OPERANDS)
#define ASM_OPERANDS_INPUT(RTX, N) XCVECEXP (RTX, 3, N, ASM_OPERANDS)
#define ASM_OPERANDS_INPUT_LENGTH(RTX) XCVECLEN (RTX, 3, ASM_OPERANDS)
1264
#define ASM_OPERANDS_INPUT_CONSTRAINT_EXP(RTX, N) \
1265
  XCVECEXP (RTX, 4, N, ASM_OPERANDS)
1266
#define ASM_OPERANDS_INPUT_CONSTRAINT(RTX, N) \
1267
  XSTR (XCVECEXP (RTX, 4, N, ASM_OPERANDS), 0)
1268
#define ASM_OPERANDS_INPUT_MODE(RTX, N)  \
1269
  GET_MODE (XCVECEXP (RTX, 4, N, ASM_OPERANDS))
1270 1271 1272 1273
#define ASM_OPERANDS_LABEL_VEC(RTX) XCVEC (RTX, 5, ASM_OPERANDS)
#define ASM_OPERANDS_LABEL_LENGTH(RTX) XCVECLEN (RTX, 5, ASM_OPERANDS)
#define ASM_OPERANDS_LABEL(RTX, N) XCVECEXP (RTX, 5, N, ASM_OPERANDS)
#define ASM_OPERANDS_SOURCE_LOCATION(RTX) XCUINT (RTX, 6, ASM_OPERANDS)
1274
#define ASM_INPUT_SOURCE_LOCATION(RTX) XCUINT (RTX, 1, ASM_INPUT)
Jim Wilson committed
1275

1276 1277 1278 1279
/* 1 if RTX is a mem that is statically allocated in read-only memory.  */
#define MEM_READONLY_P(RTX) \
  (RTL_FLAG_CHECK1("MEM_READONLY_P", (RTX), MEM)->unchanging)

1280
/* 1 if RTX is a mem and we should keep the alias set for this mem
1281 1282
   unchanged when we access a component.  Set to 1, or example, when we
   are already in a non-addressable component of an aggregate.  */
1283 1284
#define MEM_KEEP_ALIAS_SET_P(RTX)					\
  (RTL_FLAG_CHECK1("MEM_KEEP_ALIAS_SET_P", (RTX), MEM)->jump)
1285

1286 1287 1288 1289
/* 1 if RTX is a mem or asm_operand for a volatile reference.  */
#define MEM_VOLATILE_P(RTX)						\
  (RTL_FLAG_CHECK3("MEM_VOLATILE_P", (RTX), MEM, ASM_OPERANDS,		\
		   ASM_INPUT)->volatil)
Jim Wilson committed
1290

1291
/* 1 if RTX is a mem that refers to an aggregate, either to the
1292
   aggregate itself or to a field of the aggregate.  If zero, RTX may
1293
   or may not be such a reference.  */
1294 1295
#define MEM_IN_STRUCT_P(RTX)						\
  (RTL_FLAG_CHECK1("MEM_IN_STRUCT_P", (RTX), MEM)->in_struct)
Jim Wilson committed
1296

1297
/* 1 if RTX is a MEM that refers to a scalar.  If zero, RTX may or may
1298
   not refer to a scalar.  */
1299
#define MEM_SCALAR_P(RTX)						\
1300
  (RTL_FLAG_CHECK1("MEM_SCALAR_P", (RTX), MEM)->return_val)
1301

1302 1303 1304 1305
/* 1 if RTX is a mem that cannot trap.  */
#define MEM_NOTRAP_P(RTX) \
  (RTL_FLAG_CHECK1("MEM_NOTRAP_P", (RTX), MEM)->call)

1306 1307 1308 1309
/* The memory attribute block.  We provide access macros for each value
   in the block and provide defaults if none specified.  */
#define MEM_ATTRS(RTX) X0MEMATTR (RTX, 1)

1310 1311 1312 1313
/* The register attribute block.  We provide access macros for each value
   in the block and provide defaults if none specified.  */
#define REG_ATTRS(RTX) X0REGATTR (RTX, 2)

Richard Sandiford committed
1314
#ifndef GENERATOR_FILE
1315 1316
/* For a MEM rtx, the alias set.  If 0, this MEM is not in any alias
   set, and may alias anything.  Otherwise, the MEM can only alias
1317
   MEMs in a conflicting alias set.  This value is set in a
1318
   language-dependent manner in the front-end, and should not be
1319 1320
   altered in the back-end.  These set numbers are tested with
   alias_sets_conflict_p.  */
Richard Sandiford committed
1321
#define MEM_ALIAS_SET(RTX) (get_mem_attrs (RTX)->alias)
1322 1323

/* For a MEM rtx, the decl it is known to refer to, if it is known to
1324
   refer to part of a DECL.  It may also be a COMPONENT_REF.  */
Richard Sandiford committed
1325
#define MEM_EXPR(RTX) (get_mem_attrs (RTX)->expr)
1326

1327
/* For a MEM rtx, true if its MEM_OFFSET is known.  */
1328
#define MEM_OFFSET_KNOWN_P(RTX) (get_mem_attrs (RTX)->offset_known_p)
1329 1330

/* For a MEM rtx, the offset from the start of MEM_EXPR.  */
1331
#define MEM_OFFSET(RTX) (get_mem_attrs (RTX)->offset)
1332

1333
/* For a MEM rtx, the address space.  */
Richard Sandiford committed
1334
#define MEM_ADDR_SPACE(RTX) (get_mem_attrs (RTX)->addrspace)
1335

1336
/* For a MEM rtx, true if its MEM_SIZE is known.  */
1337
#define MEM_SIZE_KNOWN_P(RTX) (get_mem_attrs (RTX)->size_known_p)
1338 1339

/* For a MEM rtx, the size in bytes of the MEM.  */
1340
#define MEM_SIZE(RTX) (get_mem_attrs (RTX)->size)
1341

1342 1343
/* For a MEM rtx, the alignment in bits.  We can use the alignment of the
   mode as a default when STRICT_ALIGNMENT, but not if not.  */
Richard Sandiford committed
1344 1345 1346 1347
#define MEM_ALIGN(RTX) (get_mem_attrs (RTX)->align)
#else
#define MEM_ADDR_SPACE(RTX) ADDR_SPACE_GENERIC
#endif
1348

1349 1350 1351 1352
/* For a REG rtx, the decl it is known to refer to, if it is known to
   refer to part of a DECL.  */
#define REG_EXPR(RTX) (REG_ATTRS (RTX) == 0 ? 0 : REG_ATTRS (RTX)->decl)

1353 1354
/* For a REG rtx, the offset from the start of REG_EXPR, if known, as an
   HOST_WIDE_INT.  */
1355 1356
#define REG_OFFSET(RTX) (REG_ATTRS (RTX) == 0 ? 0 : REG_ATTRS (RTX)->offset)

1357
/* Copy the attributes that apply to memory locations from RHS to LHS.  */
1358 1359 1360 1361
#define MEM_COPY_ATTRIBUTES(LHS, RHS)				\
  (MEM_VOLATILE_P (LHS) = MEM_VOLATILE_P (RHS),			\
   MEM_IN_STRUCT_P (LHS) = MEM_IN_STRUCT_P (RHS),		\
   MEM_SCALAR_P (LHS) = MEM_SCALAR_P (RHS),			\
1362
   MEM_NOTRAP_P (LHS) = MEM_NOTRAP_P (RHS),			\
1363
   MEM_READONLY_P (LHS) = MEM_READONLY_P (RHS),			\
1364
   MEM_KEEP_ALIAS_SET_P (LHS) = MEM_KEEP_ALIAS_SET_P (RHS),	\
1365
   MEM_POINTER (LHS) = MEM_POINTER (RHS),			\
1366
   MEM_ATTRS (LHS) = MEM_ATTRS (RHS))
1367

1368
/* 1 if RTX is a label_ref for a nonlocal label.  */
1369 1370
/* Likewise in an expr_list for a REG_LABEL_OPERAND or
   REG_LABEL_TARGET note.  */
1371
#define LABEL_REF_NONLOCAL_P(RTX)					\
1372
  (RTL_FLAG_CHECK1("LABEL_REF_NONLOCAL_P", (RTX), LABEL_REF)->volatil)
Richard Stallman committed
1373

1374 1375 1376
/* 1 if RTX is a code_label that should always be considered to be needed.  */
#define LABEL_PRESERVE_P(RTX)						\
  (RTL_FLAG_CHECK2("LABEL_PRESERVE_P", (RTX), CODE_LABEL, NOTE)->in_struct)
Jim Wilson committed
1377

1378
/* During sched, 1 if RTX is an insn that must be scheduled together
1379
   with the preceding insn.  */
1380
#define SCHED_GROUP_P(RTX)						\
1381 1382 1383
  (RTL_FLAG_CHECK4("SCHED_GROUP_P", (RTX), DEBUG_INSN, INSN,		\
		   JUMP_INSN, CALL_INSN					\
		   )->in_struct)
Jim Wilson committed
1384 1385 1386

/* For a SET rtx, SET_DEST is the place that is set
   and SET_SRC is the value it is set to.  */
1387 1388
#define SET_DEST(RTX) XC2EXP(RTX, 0, SET, CLOBBER)
#define SET_SRC(RTX) XCEXP(RTX, 1, SET)
1389 1390
#define SET_IS_RETURN_P(RTX)						\
  (RTL_FLAG_CHECK1("SET_IS_RETURN_P", (RTX), SET)->jump)
Jim Wilson committed
1391 1392

/* For a TRAP_IF rtx, TRAP_CONDITION is an expression.  */
1393 1394
#define TRAP_CONDITION(RTX) XCEXP (RTX, 0, TRAP_IF)
#define TRAP_CODE(RTX) XCEXP (RTX, 1, TRAP_IF)
Jim Wilson committed
1395

1396 1397 1398
/* For a COND_EXEC rtx, COND_EXEC_TEST is the condition to base
   conditionally executing the code on, COND_EXEC_CODE is the code
   to execute if the condition is true.  */
1399 1400
#define COND_EXEC_TEST(RTX) XCEXP (RTX, 0, COND_EXEC)
#define COND_EXEC_CODE(RTX) XCEXP (RTX, 1, COND_EXEC)
1401

1402 1403
/* 1 if RTX is a symbol_ref that addresses this function's rtl
   constants pool.  */
1404 1405
#define CONSTANT_POOL_ADDRESS_P(RTX)					\
  (RTL_FLAG_CHECK1("CONSTANT_POOL_ADDRESS_P", (RTX), SYMBOL_REF)->unchanging)
Jim Wilson committed
1406

1407 1408 1409 1410 1411
/* 1 if RTX is a symbol_ref that addresses a value in the file's
   tree constant pool.  This information is private to varasm.c.  */
#define TREE_CONSTANT_POOL_ADDRESS_P(RTX)				\
  (RTL_FLAG_CHECK1("TREE_CONSTANT_POOL_ADDRESS_P",			\
		   (RTX), SYMBOL_REF)->frame_related)
1412

1413 1414 1415
/* Used if RTX is a symbol_ref, for machine-specific purposes.  */
#define SYMBOL_REF_FLAG(RTX)						\
  (RTL_FLAG_CHECK1("SYMBOL_REF_FLAG", (RTX), SYMBOL_REF)->volatil)
Jim Wilson committed
1416

1417 1418 1419 1420
/* 1 if RTX is a symbol_ref that has been the library function in
   emit_library_call.  */
#define SYMBOL_REF_USED(RTX)						\
  (RTL_FLAG_CHECK1("SYMBOL_REF_USED", (RTX), SYMBOL_REF)->used)
Jim Wilson committed
1421

1422 1423
/* 1 if RTX is a symbol_ref for a weak symbol.  */
#define SYMBOL_REF_WEAK(RTX)						\
1424
  (RTL_FLAG_CHECK1("SYMBOL_REF_WEAK", (RTX), SYMBOL_REF)->return_val)
1425

1426 1427
/* A pointer attached to the SYMBOL_REF; either SYMBOL_REF_DECL or
   SYMBOL_REF_CONSTANT.  */
1428 1429 1430 1431 1432 1433
#define SYMBOL_REF_DATA(RTX) X0ANY ((RTX), 2)

/* Set RTX's SYMBOL_REF_DECL to DECL.  RTX must not be a constant
   pool symbol.  */
#define SET_SYMBOL_REF_DECL(RTX, DECL) \
  (gcc_assert (!CONSTANT_POOL_ADDRESS_P (RTX)), X0TREE ((RTX), 2) = (DECL))
1434

1435
/* The tree (decl or constant) associated with the symbol, or null.  */
1436 1437 1438
#define SYMBOL_REF_DECL(RTX) \
  (CONSTANT_POOL_ADDRESS_P (RTX) ? NULL : X0TREE ((RTX), 2))

1439 1440 1441 1442
/* Set RTX's SYMBOL_REF_CONSTANT to C.  RTX must be a constant pool symbol.  */
#define SET_SYMBOL_REF_CONSTANT(RTX, C) \
  (gcc_assert (CONSTANT_POOL_ADDRESS_P (RTX)), X0CONSTANT ((RTX), 2) = (C))

1443 1444 1445
/* The rtx constant pool entry for a symbol, or null.  */
#define SYMBOL_REF_CONSTANT(RTX) \
  (CONSTANT_POOL_ADDRESS_P (RTX) ? X0CONSTANT ((RTX), 2) : NULL)
1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474

/* A set of flags on a symbol_ref that are, in some respects, redundant with
   information derivable from the tree decl associated with this symbol.
   Except that we build a *lot* of SYMBOL_REFs that aren't associated with a
   decl.  In some cases this is a bug.  But beyond that, it's nice to cache
   this information to avoid recomputing it.  Finally, this allows space for
   the target to store more than one bit of information, as with
   SYMBOL_REF_FLAG.  */
#define SYMBOL_REF_FLAGS(RTX)	X0INT ((RTX), 1)

/* These flags are common enough to be defined for all targets.  They
   are computed by the default version of targetm.encode_section_info.  */

/* Set if this symbol is a function.  */
#define SYMBOL_FLAG_FUNCTION	(1 << 0)
#define SYMBOL_REF_FUNCTION_P(RTX) \
  ((SYMBOL_REF_FLAGS (RTX) & SYMBOL_FLAG_FUNCTION) != 0)
/* Set if targetm.binds_local_p is true.  */
#define SYMBOL_FLAG_LOCAL	(1 << 1)
#define SYMBOL_REF_LOCAL_P(RTX) \
  ((SYMBOL_REF_FLAGS (RTX) & SYMBOL_FLAG_LOCAL) != 0)
/* Set if targetm.in_small_data_p is true.  */
#define SYMBOL_FLAG_SMALL	(1 << 2)
#define SYMBOL_REF_SMALL_P(RTX) \
  ((SYMBOL_REF_FLAGS (RTX) & SYMBOL_FLAG_SMALL) != 0)
/* The three-bit field at [5:3] is true for TLS variables; use
   SYMBOL_REF_TLS_MODEL to extract the field as an enum tls_model.  */
#define SYMBOL_FLAG_TLS_SHIFT	3
#define SYMBOL_REF_TLS_MODEL(RTX) \
1475
  ((enum tls_model) ((SYMBOL_REF_FLAGS (RTX) >> SYMBOL_FLAG_TLS_SHIFT) & 7))
1476 1477 1478 1479
/* Set if this symbol is not defined in this translation unit.  */
#define SYMBOL_FLAG_EXTERNAL	(1 << 6)
#define SYMBOL_REF_EXTERNAL_P(RTX) \
  ((SYMBOL_REF_FLAGS (RTX) & SYMBOL_FLAG_EXTERNAL) != 0)
1480
/* Set if this symbol has a block_symbol structure associated with it.  */
1481 1482 1483
#define SYMBOL_FLAG_HAS_BLOCK_INFO (1 << 7)
#define SYMBOL_REF_HAS_BLOCK_INFO_P(RTX) \
  ((SYMBOL_REF_FLAGS (RTX) & SYMBOL_FLAG_HAS_BLOCK_INFO) != 0)
1484
/* Set if this symbol is a section anchor.  SYMBOL_REF_ANCHOR_P implies
1485
   SYMBOL_REF_HAS_BLOCK_INFO_P.  */
1486 1487 1488
#define SYMBOL_FLAG_ANCHOR	(1 << 8)
#define SYMBOL_REF_ANCHOR_P(RTX) \
  ((SYMBOL_REF_FLAGS (RTX) & SYMBOL_FLAG_ANCHOR) != 0)
1489 1490

/* Subsequent bits are available for the target to use.  */
1491
#define SYMBOL_FLAG_MACH_DEP_SHIFT	9
1492
#define SYMBOL_FLAG_MACH_DEP		(1 << SYMBOL_FLAG_MACH_DEP_SHIFT)
1493

1494 1495 1496
/* If SYMBOL_REF_HAS_BLOCK_INFO_P (RTX), this is the object_block
   structure to which the symbol belongs, or NULL if it has not been
   assigned a block.  */
1497 1498
#define SYMBOL_REF_BLOCK(RTX) (BLOCK_SYMBOL_CHECK (RTX)->block)

1499 1500 1501 1502
/* If SYMBOL_REF_HAS_BLOCK_INFO_P (RTX), this is the offset of RTX from
   the first object in SYMBOL_REF_BLOCK (RTX).  The value is negative if
   RTX has not yet been assigned to a block, or it has not been given an
   offset within that block.  */
1503 1504
#define SYMBOL_REF_BLOCK_OFFSET(RTX) (BLOCK_SYMBOL_CHECK (RTX)->offset)

1505 1506 1507 1508
/* True if RTX is flagged to be a scheduling barrier.  */
#define PREFETCH_SCHEDULE_BARRIER_P(RTX)					\
  (RTL_FLAG_CHECK1("PREFETCH_SCHEDULE_BARRIER_P", (RTX), PREFETCH)->volatil)

1509 1510 1511 1512 1513 1514 1515 1516 1517 1518
/* Indicate whether the machine has any sort of auto increment addressing.
   If not, we can avoid checking for REG_INC notes.  */

#if (defined (HAVE_PRE_INCREMENT) || defined (HAVE_PRE_DECREMENT) \
     || defined (HAVE_POST_INCREMENT) || defined (HAVE_POST_DECREMENT) \
     || defined (HAVE_PRE_MODIFY_DISP) || defined (HAVE_PRE_MODIFY_DISP) \
     || defined (HAVE_PRE_MODIFY_REG) || defined (HAVE_POST_MODIFY_REG))
#define AUTO_INC_DEC
#endif

Jim Wilson committed
1519 1520 1521
/* Define a macro to look for REG_INC notes,
   but save time on machines where they never exist.  */

1522
#ifdef AUTO_INC_DEC
1523 1524 1525 1526
#define FIND_REG_INC_NOTE(INSN, REG)			\
  ((REG) != NULL_RTX && REG_P ((REG))			\
   ? find_regno_note ((INSN), REG_INC, REGNO (REG))	\
   : find_reg_note ((INSN), REG_INC, (REG)))
Jim Wilson committed
1527
#else
1528
#define FIND_REG_INC_NOTE(INSN, REG) 0
Jim Wilson committed
1529 1530
#endif

1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546
#ifndef HAVE_PRE_INCREMENT
#define HAVE_PRE_INCREMENT 0
#endif

#ifndef HAVE_PRE_DECREMENT
#define HAVE_PRE_DECREMENT 0
#endif

#ifndef HAVE_POST_INCREMENT
#define HAVE_POST_INCREMENT 0
#endif

#ifndef HAVE_POST_DECREMENT
#define HAVE_POST_DECREMENT 0
#endif

1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562
#ifndef HAVE_POST_MODIFY_DISP
#define HAVE_POST_MODIFY_DISP 0
#endif

#ifndef HAVE_POST_MODIFY_REG
#define HAVE_POST_MODIFY_REG 0
#endif

#ifndef HAVE_PRE_MODIFY_DISP
#define HAVE_PRE_MODIFY_DISP 0
#endif

#ifndef HAVE_PRE_MODIFY_REG
#define HAVE_PRE_MODIFY_REG 0
#endif

1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598

/* Some architectures do not have complete pre/post increment/decrement
   instruction sets, or only move some modes efficiently.  These macros
   allow us to tune autoincrement generation.  */

#ifndef USE_LOAD_POST_INCREMENT
#define USE_LOAD_POST_INCREMENT(MODE)   HAVE_POST_INCREMENT
#endif

#ifndef USE_LOAD_POST_DECREMENT
#define USE_LOAD_POST_DECREMENT(MODE)   HAVE_POST_DECREMENT
#endif

#ifndef USE_LOAD_PRE_INCREMENT
#define USE_LOAD_PRE_INCREMENT(MODE)    HAVE_PRE_INCREMENT
#endif

#ifndef USE_LOAD_PRE_DECREMENT
#define USE_LOAD_PRE_DECREMENT(MODE)    HAVE_PRE_DECREMENT
#endif

#ifndef USE_STORE_POST_INCREMENT
#define USE_STORE_POST_INCREMENT(MODE)  HAVE_POST_INCREMENT
#endif

#ifndef USE_STORE_POST_DECREMENT
#define USE_STORE_POST_DECREMENT(MODE)  HAVE_POST_DECREMENT
#endif

#ifndef USE_STORE_PRE_INCREMENT
#define USE_STORE_PRE_INCREMENT(MODE)   HAVE_PRE_INCREMENT
#endif

#ifndef USE_STORE_PRE_DECREMENT
#define USE_STORE_PRE_DECREMENT(MODE)   HAVE_PRE_DECREMENT
#endif
Jim Wilson committed
1599

1600 1601 1602
/* Nonzero when we are generating CONCATs.  */
extern int generating_concat_p;

1603 1604 1605
/* Nonzero when we are expanding trees to RTL.  */
extern int currently_expanding_to_rtl;

Jim Wilson committed
1606 1607
/* Generally useful functions.  */

1608
/* In expmed.c */
1609
extern int ceil_log2 (unsigned HOST_WIDE_INT);
1610

Kaveh R. Ghazi committed
1611
/* In explow.c */
1612
extern HOST_WIDE_INT trunc_int_for_mode	(HOST_WIDE_INT, enum machine_mode);
1613
extern rtx plus_constant (rtx, HOST_WIDE_INT);
1614

1615
/* In rtl.c */
1616 1617 1618
extern rtx rtx_alloc_stat (RTX_CODE MEM_STAT_DECL);
#define rtx_alloc(c) rtx_alloc_stat (c MEM_STAT_INFO)

1619
extern rtvec rtvec_alloc (int);
1620
extern rtvec shallow_copy_rtvec (rtvec);
1621
extern bool shared_const_p (const_rtx);
1622
extern rtx copy_rtx (rtx);
1623
extern void dump_rtx_statistics (void);
1624 1625

/* In emit-rtl.c */
1626
extern rtx copy_rtx_if_shared (rtx);
1627 1628

/* In rtl.c */
1629 1630
extern unsigned int rtx_size (const_rtx);
extern rtx shallow_copy_rtx_stat (const_rtx MEM_STAT_DECL);
1631
#define shallow_copy_rtx(a) shallow_copy_rtx_stat (a MEM_STAT_INFO)
1632
extern int rtx_equal_p (const_rtx, const_rtx);
1633
extern hashval_t iterative_hash_rtx (const_rtx, hashval_t);
1634 1635

/* In emit-rtl.c */
1636 1637 1638
extern rtvec gen_rtvec_v (int, rtx *);
extern rtx gen_reg_rtx (enum machine_mode);
extern rtx gen_rtx_REG_offset (rtx, enum machine_mode, unsigned int, int);
1639
extern rtx gen_reg_rtx_offset (rtx, enum machine_mode, int);
Peter Bergner committed
1640
extern rtx gen_reg_rtx_and_attrs (rtx);
1641 1642
extern rtx gen_label_rtx (void);
extern rtx gen_lowpart_common (enum machine_mode, rtx);
1643 1644

/* In cse.c */
1645
extern rtx gen_lowpart_if_possible (enum machine_mode, rtx);
1646 1647

/* In emit-rtl.c */
1648 1649 1650
extern rtx gen_highpart (enum machine_mode, rtx);
extern rtx gen_highpart_mode (enum machine_mode, enum machine_mode, rtx);
extern rtx operand_subword (rtx, unsigned int, int, enum machine_mode);
1651 1652

/* In emit-rtl.c */
1653
extern rtx operand_subword_force (rtx, unsigned int, enum machine_mode);
1654
extern bool paradoxical_subreg_p (const_rtx);
1655
extern int subreg_lowpart_p (const_rtx);
1656 1657 1658 1659
extern unsigned int subreg_lowpart_offset (enum machine_mode,
					   enum machine_mode);
extern unsigned int subreg_highpart_offset (enum machine_mode,
					    enum machine_mode);
1660
extern int byte_lowpart_offset (enum machine_mode, enum machine_mode);
1661
extern rtx make_safe_from (rtx, rtx);
1662 1663 1664 1665
extern rtx convert_memory_address_addr_space (enum machine_mode, rtx,
					      addr_space_t);
#define convert_memory_address(to_mode,x) \
	convert_memory_address_addr_space ((to_mode), (x), ADDR_SPACE_GENERIC)
1666 1667 1668 1669 1670 1671
extern const char *get_insn_name (int);
extern rtx get_last_insn_anywhere (void);
extern rtx get_first_nonnote_insn (void);
extern rtx get_last_nonnote_insn (void);
extern void start_sequence (void);
extern void push_to_sequence (rtx);
1672
extern void push_to_sequence2 (rtx, rtx);
1673
extern void end_sequence (void);
1674
extern double_int rtx_to_double_int (const_rtx);
1675
extern rtx immed_double_int_const (double_int, enum machine_mode);
1676 1677
extern rtx immed_double_const (HOST_WIDE_INT, HOST_WIDE_INT,
			       enum machine_mode);
1678

1679 1680 1681 1682
/* In loop-iv.c  */

extern rtx lowpart_subreg (enum machine_mode, rtx, enum machine_mode);

1683
/* In varasm.c  */
1684
extern rtx force_const_mem (enum machine_mode, rtx);
1685 1686

/* In varasm.c  */
1687 1688

struct function;
1689 1690
extern rtx get_pool_constant (rtx);
extern rtx get_pool_constant_mark (rtx, bool *);
1691
extern enum machine_mode get_pool_mode (const_rtx);
1692
extern rtx simplify_subtraction (rtx);
1693
extern void decide_function_section (tree);
1694 1695

/* In function.c  */
1696
extern rtx assign_stack_local (enum machine_mode, HOST_WIDE_INT, int);
1697 1698 1699
#define ASLK_REDUCE_ALIGN 1
#define ASLK_RECORD_PAD 2
extern rtx assign_stack_local_1 (enum machine_mode, HOST_WIDE_INT, int, int);
1700 1701 1702 1703
extern rtx assign_stack_temp (enum machine_mode, HOST_WIDE_INT, int);
extern rtx assign_stack_temp_for_type (enum machine_mode,
				       HOST_WIDE_INT, int, tree);
extern rtx assign_temp (tree, int, int, int);
1704

1705
/* In emit-rtl.c */
1706
extern rtx emit_insn_before (rtx, rtx);
1707
extern rtx emit_insn_before_noloc (rtx, rtx, struct basic_block_def *);
1708 1709
extern rtx emit_insn_before_setloc (rtx, rtx, int);
extern rtx emit_jump_insn_before (rtx, rtx);
1710
extern rtx emit_jump_insn_before_noloc (rtx, rtx);
1711 1712
extern rtx emit_jump_insn_before_setloc (rtx, rtx, int);
extern rtx emit_call_insn_before (rtx, rtx);
1713
extern rtx emit_call_insn_before_noloc (rtx, rtx);
1714
extern rtx emit_call_insn_before_setloc (rtx, rtx, int);
1715 1716 1717
extern rtx emit_debug_insn_before (rtx, rtx);
extern rtx emit_debug_insn_before_noloc (rtx, rtx);
extern rtx emit_debug_insn_before_setloc (rtx, rtx, int);
1718 1719
extern rtx emit_barrier_before (rtx);
extern rtx emit_label_before (rtx, rtx);
1720
extern rtx emit_note_before (enum insn_note, rtx);
1721
extern rtx emit_insn_after (rtx, rtx);
1722
extern rtx emit_insn_after_noloc (rtx, rtx, struct basic_block_def *);
1723 1724
extern rtx emit_insn_after_setloc (rtx, rtx, int);
extern rtx emit_jump_insn_after (rtx, rtx);
1725
extern rtx emit_jump_insn_after_noloc (rtx, rtx);
1726 1727
extern rtx emit_jump_insn_after_setloc (rtx, rtx, int);
extern rtx emit_call_insn_after (rtx, rtx);
1728
extern rtx emit_call_insn_after_noloc (rtx, rtx);
1729
extern rtx emit_call_insn_after_setloc (rtx, rtx, int);
1730 1731 1732
extern rtx emit_debug_insn_after (rtx, rtx);
extern rtx emit_debug_insn_after_noloc (rtx, rtx);
extern rtx emit_debug_insn_after_setloc (rtx, rtx, int);
1733 1734
extern rtx emit_barrier_after (rtx);
extern rtx emit_label_after (rtx, rtx);
1735
extern rtx emit_note_after (enum insn_note, rtx);
1736
extern rtx emit_insn (rtx);
1737
extern rtx emit_debug_insn (rtx);
1738 1739 1740 1741
extern rtx emit_jump_insn (rtx);
extern rtx emit_call_insn (rtx);
extern rtx emit_label (rtx);
extern rtx emit_barrier (void);
1742
extern rtx emit_note (enum insn_note);
1743
extern rtx emit_note_copy (rtx);
1744 1745 1746 1747
extern rtx gen_clobber (rtx);
extern rtx emit_clobber (rtx);
extern rtx gen_use (rtx);
extern rtx emit_use (rtx);
1748
extern rtx make_insn_raw (rtx);
1749
extern rtx make_debug_insn_raw (rtx);
1750
extern rtx make_jump_insn_raw (rtx);
1751 1752 1753 1754 1755
extern void add_function_usage_to (rtx, rtx);
extern rtx last_call_insn (void);
extern rtx previous_insn (rtx);
extern rtx next_insn (rtx);
extern rtx prev_nonnote_insn (rtx);
1756
extern rtx prev_nonnote_insn_bb (rtx);
1757
extern rtx next_nonnote_insn (rtx);
1758
extern rtx next_nonnote_insn_bb (rtx);
1759 1760
extern rtx prev_nondebug_insn (rtx);
extern rtx next_nondebug_insn (rtx);
1761 1762
extern rtx prev_nonnote_nondebug_insn (rtx);
extern rtx next_nonnote_nondebug_insn (rtx);
1763 1764 1765 1766
extern rtx prev_real_insn (rtx);
extern rtx next_real_insn (rtx);
extern rtx prev_active_insn (rtx);
extern rtx next_active_insn (rtx);
1767
extern int active_insn_p (const_rtx);
1768 1769
extern rtx prev_label (rtx);
extern rtx next_label (rtx);
1770
extern rtx skip_consecutive_labels (rtx);
1771 1772
extern rtx next_cc0_user (rtx);
extern rtx prev_cc0_setter (rtx);
1773

1774
/* In cfglayout.c  */
1775 1776
extern int insn_line (const_rtx);
extern const char * insn_file (const_rtx);
1777
extern location_t locator_location (int);
1778 1779
extern int locator_line (int);
extern const char * locator_file (int);
1780
extern bool locator_eq (int, int);
1781
extern int prologue_locator, epilogue_locator;
1782

1783
/* In jump.c */
1784 1785 1786 1787 1788 1789
extern enum rtx_code reverse_condition (enum rtx_code);
extern enum rtx_code reverse_condition_maybe_unordered (enum rtx_code);
extern enum rtx_code swap_condition (enum rtx_code);
extern enum rtx_code unsigned_condition (enum rtx_code);
extern enum rtx_code signed_condition (enum rtx_code);
extern void mark_jump_label (rtx, rtx, int);
1790
extern unsigned int cleanup_barriers (void);
1791 1792

/* In jump.c */
1793
extern rtx delete_related_insns (rtx);
1794 1795

/* In recog.c  */
1796
extern rtx *find_constant_term_loc (rtx *);
1797 1798

/* In emit-rtl.c  */
1799
extern rtx try_split (rtx, rtx, int);
1800
extern int split_branch_probability;
1801 1802

/* In unknown file  */
1803
extern rtx split_insns (rtx, rtx);
1804 1805

/* In simplify-rtx.c  */
1806 1807
extern rtx simplify_const_unary_operation (enum rtx_code, enum machine_mode,
					   rtx, enum machine_mode);
1808 1809
extern rtx simplify_unary_operation (enum rtx_code, enum machine_mode, rtx,
				     enum machine_mode);
1810 1811
extern rtx simplify_const_binary_operation (enum rtx_code, enum machine_mode,
					    rtx, rtx);
1812 1813 1814 1815
extern rtx simplify_binary_operation (enum rtx_code, enum machine_mode, rtx,
				      rtx);
extern rtx simplify_ternary_operation (enum rtx_code, enum machine_mode,
				       enum machine_mode, rtx, rtx, rtx);
1816 1817
extern rtx simplify_const_relational_operation (enum rtx_code,
						enum machine_mode, rtx, rtx);
1818
extern rtx simplify_relational_operation (enum rtx_code, enum machine_mode,
1819
					  enum machine_mode, rtx, rtx);
1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830
extern rtx simplify_gen_binary (enum rtx_code, enum machine_mode, rtx, rtx);
extern rtx simplify_gen_unary (enum rtx_code, enum machine_mode, rtx,
			       enum machine_mode);
extern rtx simplify_gen_ternary (enum rtx_code, enum machine_mode,
				 enum machine_mode, rtx, rtx, rtx);
extern rtx simplify_gen_relational (enum rtx_code, enum machine_mode,
				    enum machine_mode, rtx, rtx);
extern rtx simplify_subreg (enum machine_mode, rtx, enum machine_mode,
			    unsigned int);
extern rtx simplify_gen_subreg (enum machine_mode, rtx, enum machine_mode,
				unsigned int);
1831
extern rtx simplify_replace_fn_rtx (rtx, const_rtx,
1832
				    rtx (*fn) (rtx, const_rtx, void *), void *);
1833
extern rtx simplify_replace_rtx (rtx, const_rtx, rtx);
1834
extern rtx simplify_rtx (const_rtx);
1835
extern rtx avoid_constant_pool_reference (rtx);
1836
extern rtx delegitimize_mem_from_attrs (rtx);
1837
extern bool mode_signbit_p (enum machine_mode, const_rtx);
1838 1839 1840 1841 1842
extern bool val_signbit_p (enum machine_mode, unsigned HOST_WIDE_INT);
extern bool val_signbit_known_set_p (enum machine_mode,
				     unsigned HOST_WIDE_INT);
extern bool val_signbit_known_clear_p (enum machine_mode,
				       unsigned HOST_WIDE_INT);
1843

1844
/* In reginfo.c  */
1845 1846
extern enum machine_mode choose_hard_reg_mode (unsigned int, unsigned int,
					       bool);
1847 1848

/* In emit-rtl.c  */
1849
extern rtx set_unique_reg_note (rtx, enum reg_note, rtx);
1850
extern void set_insn_deleted (rtx);
1851

1852 1853
/* Functions in rtlanal.c */

1854 1855 1856 1857 1858
/* Single set is implemented as macro for performance reasons.  */
#define single_set(I) (INSN_P (I) \
		       ? (GET_CODE (PATTERN (I)) == SET \
			  ? PATTERN (I) : single_set_1 (I)) \
		       : NULL_RTX)
1859
#define single_set_1(I) single_set_2 (I, PATTERN (I))
1860

1861
/* Structure used for passing data to REPLACE_LABEL.  */
1862
typedef struct replace_label_data
1863 1864 1865
{
  rtx r1;
  rtx r2;
1866 1867
  bool update_label_nuses;
} replace_label_data;
1868

1869 1870 1871
extern int rtx_addr_can_trap_p (const_rtx);
extern bool nonzero_address_p (const_rtx);
extern int rtx_unstable_p (const_rtx);
1872 1873
extern bool rtx_varies_p (const_rtx, bool);
extern bool rtx_addr_varies_p (const_rtx, bool);
1874 1875 1876
extern HOST_WIDE_INT get_integer_term (const_rtx);
extern rtx get_related_value (const_rtx);
extern bool offset_within_block_p (const_rtx, HOST_WIDE_INT);
1877
extern void split_const (rtx, rtx *, rtx *);
1878 1879 1880 1881
extern int reg_mentioned_p (const_rtx, const_rtx);
extern int count_occurrences (const_rtx, const_rtx, int);
extern int reg_referenced_p (const_rtx, const_rtx);
extern int reg_used_between_p (const_rtx, const_rtx, const_rtx);
1882
extern int reg_set_between_p (const_rtx, const_rtx, const_rtx);
1883
extern int commutative_operand_precedence (rtx);
Peter Bergner committed
1884
extern bool swap_commutative_operands_p (rtx, rtx);
1885
extern int modified_between_p (const_rtx, const_rtx, const_rtx);
1886
extern int no_labels_between_p (const_rtx, const_rtx);
1887
extern int modified_in_p (const_rtx, const_rtx);
1888
extern int reg_set_p (const_rtx, const_rtx);
1889 1890 1891
extern rtx single_set_2 (const_rtx, const_rtx);
extern int multiple_sets (const_rtx);
extern int set_noop_p (const_rtx);
1892
extern int noop_move_p (const_rtx);
1893
extern rtx find_last_value (rtx, rtx *, rtx, int);
1894 1895
extern int refers_to_regno_p (unsigned int, unsigned int, const_rtx, rtx *);
extern int reg_overlap_mentioned_p (const_rtx, const_rtx);
1896 1897
extern const_rtx set_of (const_rtx, const_rtx);
extern void note_stores (const_rtx, void (*) (rtx, const_rtx, void *), void *);
1898
extern void note_uses (rtx *, void (*) (rtx *, void *), void *);
1899 1900 1901 1902 1903 1904 1905 1906
extern int dead_or_set_p (const_rtx, const_rtx);
extern int dead_or_set_regno_p (const_rtx, unsigned int);
extern rtx find_reg_note (const_rtx, enum reg_note, const_rtx);
extern rtx find_regno_note (const_rtx, enum reg_note, unsigned int);
extern rtx find_reg_equal_equiv_note (const_rtx);
extern rtx find_constant_src (const_rtx);
extern int find_reg_fusage (const_rtx, enum rtx_code, const_rtx);
extern int find_regno_fusage (const_rtx, enum rtx_code, unsigned int);
1907
extern rtx alloc_reg_note (enum reg_note, rtx, rtx);
1908
extern void add_reg_note (rtx, enum reg_note, rtx);
1909
extern void remove_note (rtx, const_rtx);
1910
extern void remove_reg_equal_equiv_notes (rtx);
1911
extern void remove_reg_equal_equiv_notes_for_regno (unsigned int);
1912 1913 1914
extern int side_effects_p (const_rtx);
extern int volatile_refs_p (const_rtx);
extern int volatile_insn_p (const_rtx);
1915
extern int may_trap_p_1 (const_rtx, unsigned);
1916 1917
extern int may_trap_p (const_rtx);
extern int may_trap_or_fault_p (const_rtx);
1918 1919 1920 1921 1922 1923 1924
extern bool can_throw_internal (const_rtx);
extern bool can_throw_external (const_rtx);
extern bool insn_could_throw_p (const_rtx);
extern bool insn_nothrow_p (const_rtx);
extern bool can_nonlocal_goto (const_rtx);
extern void copy_reg_eh_region_note_forward (rtx, rtx, rtx);
extern void copy_reg_eh_region_note_backward(rtx, rtx, rtx);
1925
extern int inequality_comparisons_p (const_rtx);
1926 1927 1928
extern rtx replace_rtx (rtx, rtx, rtx);
extern int replace_label (rtx *, void *);
extern int rtx_referenced_p (rtx, rtx);
1929 1930
extern bool tablejump_p (const_rtx, rtx *, rtx *);
extern int computed_jump_p (const_rtx);
1931

1932 1933
typedef int (*rtx_function) (rtx *, void *);
extern int for_each_rtx (rtx *, rtx_function, void *);
1934

1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945
/* Callback for for_each_inc_dec, to process the autoinc operation OP
   within MEM that sets DEST to SRC + SRCOFF, or SRC if SRCOFF is
   NULL.  The callback is passed the same opaque ARG passed to
   for_each_inc_dec.  Return zero to continue looking for other
   autoinc operations, -1 to skip OP's operands, and any other value
   to interrupt the traversal and return that value to the caller of
   for_each_inc_dec.  */
typedef int (*for_each_inc_dec_fn) (rtx mem, rtx op, rtx dest, rtx src,
				    rtx srcoff, void *arg);
extern int for_each_inc_dec (rtx *, for_each_inc_dec_fn, void *arg);

1946 1947 1948 1949 1950 1951 1952 1953 1954 1955
typedef int (*rtx_equal_p_callback_function) (const_rtx *, const_rtx *,
                                              rtx *, rtx *);
extern int rtx_equal_p_cb (const_rtx, const_rtx,
                           rtx_equal_p_callback_function);

typedef int (*hash_rtx_callback_function) (const_rtx, enum machine_mode, rtx *,
                                           enum machine_mode *);
extern unsigned hash_rtx_cb (const_rtx, enum machine_mode, int *, int *,
                             bool, hash_rtx_callback_function);

1956
extern rtx regno_use_in (unsigned int, rtx);
1957 1958 1959 1960
extern int auto_inc_p (const_rtx);
extern int in_expr_list_p (const_rtx, const_rtx);
extern void remove_node_from_expr_list (const_rtx, rtx *);
extern int loc_mentioned_in_p (rtx *, const_rtx);
1961
extern rtx find_first_parameter_load (rtx, rtx);
1962
extern bool keep_with_call_p (const_rtx);
1963
extern bool label_is_jump_target_p (const_rtx, const_rtx);
1964
extern int insn_rtx_cost (rtx, bool);
Jim Wilson committed
1965

1966 1967 1968 1969 1970 1971 1972 1973
/* Given an insn and condition, return a canonical description of
   the test being made.  */
extern rtx canonicalize_condition (rtx, rtx, int, rtx *, rtx, int, int);

/* Given a JUMP_INSN, return a canonical description of the test
   being made.  */
extern rtx get_condition (rtx, rtx *, int, int);

1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989
/* Information about a subreg of a hard register.  */
struct subreg_info
{
  /* Offset of first hard register involved in the subreg.  */
  int offset;
  /* Number of hard registers involved in the subreg.  */
  int nregs;
  /* Whether this subreg can be represented as a hard reg with the new
     mode.  */
  bool representable_p;
};

extern void subreg_get_info (unsigned int, enum machine_mode,
			     unsigned int, enum machine_mode,
			     struct subreg_info *);

1990 1991
/* lists.c */

1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002
extern void free_EXPR_LIST_list		(rtx *);
extern void free_INSN_LIST_list		(rtx *);
extern void free_EXPR_LIST_node		(rtx);
extern void free_INSN_LIST_node		(rtx);
extern rtx alloc_INSN_LIST			(rtx, rtx);
extern rtx alloc_EXPR_LIST			(int, rtx, rtx);
extern void remove_free_INSN_LIST_elem (rtx, rtx *);
extern rtx remove_list_elem (rtx, rtx *);
extern rtx remove_free_INSN_LIST_node (rtx *);
extern rtx remove_free_EXPR_LIST_node (rtx *);

2003

2004
/* reginfo.c */
2005

Vladimir Makarov committed
2006 2007 2008
/* Initialize may_move_cost and friends for mode M.  */
extern void init_move_cost (enum machine_mode);
/* Resize reg info.  */
2009
extern bool resize_reg_info (void);
2010
/* Free up register info memory.  */
2011
extern void free_reg_info (void);
2012 2013
extern void init_subregs_of_mode (void);
extern void finish_subregs_of_mode (void);
2014

2015
/* recog.c */
2016
extern rtx extract_asm_operands (rtx);
2017
extern int asm_noperands (const_rtx);
2018
extern const char *decode_asm_operands (rtx, rtx *, rtx **, const char **,
2019
					enum machine_mode *, location_t *);
Jim Wilson committed
2020

2021 2022
extern enum reg_class reg_preferred_class (int);
extern enum reg_class reg_alternate_class (int);
Vladimir Makarov committed
2023
extern enum reg_class reg_allocno_class (int);
2024 2025
extern void setup_reg_classes (int, enum reg_class, enum reg_class,
			       enum reg_class);
Jim Wilson committed
2026

2027
extern void split_all_insns (void);
2028
extern unsigned int split_all_insns_noflow (void);
2029

2030
#define MAX_SAVED_CONST_INT 64
2031
extern GTY(()) rtx const_int_rtx[MAX_SAVED_CONST_INT * 2 + 1];
2032

2033 2034 2035 2036
#define const0_rtx	(const_int_rtx[MAX_SAVED_CONST_INT])
#define const1_rtx	(const_int_rtx[MAX_SAVED_CONST_INT+1])
#define const2_rtx	(const_int_rtx[MAX_SAVED_CONST_INT+2])
#define constm1_rtx	(const_int_rtx[MAX_SAVED_CONST_INT-1])
2037
extern GTY(()) rtx const_true_rtx;
2038

2039
extern GTY(()) rtx const_tiny_rtx[3][(int) MAX_MACHINE_MODE];
2040

2041
/* Returns a constant 0 rtx in mode MODE.  Integer modes are treated the
2042 2043 2044 2045 2046 2047 2048 2049
   same as VOIDmode.  */

#define CONST0_RTX(MODE) (const_tiny_rtx[0][(int) (MODE)])

/* Likewise, for the constants 1 and 2.  */

#define CONST1_RTX(MODE) (const_tiny_rtx[1][(int) (MODE)])
#define CONST2_RTX(MODE) (const_tiny_rtx[2][(int) (MODE)])
Jim Wilson committed
2050

2051 2052 2053 2054 2055
/* If HARD_FRAME_POINTER_REGNUM is defined, then a special dummy reg
   is used to represent the frame pointer.  This is because the
   hard frame pointer and the automatic variables are separated by an amount
   that cannot be determined until after register allocation.  We can assume
   that in this case ELIMINABLE_REGS will be defined, one action of which
Kazu Hirata committed
2056
   will be to eliminate FRAME_POINTER_REGNUM into HARD_FRAME_POINTER_REGNUM.  */
2057 2058 2059 2060
#ifndef HARD_FRAME_POINTER_REGNUM
#define HARD_FRAME_POINTER_REGNUM FRAME_POINTER_REGNUM
#endif

2061 2062 2063 2064 2065 2066 2067 2068 2069 2070
#ifndef HARD_FRAME_POINTER_IS_FRAME_POINTER
#define HARD_FRAME_POINTER_IS_FRAME_POINTER \
  (HARD_FRAME_POINTER_REGNUM == FRAME_POINTER_REGNUM)
#endif

#ifndef HARD_FRAME_POINTER_IS_ARG_POINTER
#define HARD_FRAME_POINTER_IS_ARG_POINTER \
  (HARD_FRAME_POINTER_REGNUM == ARG_POINTER_REGNUM)
#endif

2071 2072
/* Index labels for global_rtl.  */
enum global_rtl_index
2073
{
2074 2075
  GR_PC,
  GR_CC0,
2076
  GR_RETURN,
2077 2078 2079 2080 2081 2082 2083 2084
  GR_STACK_POINTER,
  GR_FRAME_POINTER,
/* For register elimination to work properly these hard_frame_pointer_rtx,
   frame_pointer_rtx, and arg_pointer_rtx must be the same if they refer to
   the same register.  */
#if FRAME_POINTER_REGNUM == ARG_POINTER_REGNUM
  GR_ARG_POINTER = GR_FRAME_POINTER,
#endif
2085
#if HARD_FRAME_POINTER_IS_FRAME_POINTER
2086 2087 2088 2089 2090
  GR_HARD_FRAME_POINTER = GR_FRAME_POINTER,
#else
  GR_HARD_FRAME_POINTER,
#endif
#if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
2091
#if HARD_FRAME_POINTER_IS_ARG_POINTER
2092 2093 2094 2095 2096 2097 2098 2099 2100 2101
  GR_ARG_POINTER = GR_HARD_FRAME_POINTER,
#else
  GR_ARG_POINTER,
#endif
#endif
  GR_VIRTUAL_INCOMING_ARGS,
  GR_VIRTUAL_STACK_ARGS,
  GR_VIRTUAL_STACK_DYNAMIC,
  GR_VIRTUAL_OUTGOING_ARGS,
  GR_VIRTUAL_CFA,
2102
  GR_VIRTUAL_PREFERRED_STACK_BOUNDARY,
2103 2104 2105 2106

  GR_MAX
};

2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138
/* Target-dependent globals.  */
struct GTY(()) target_rtl {
  /* All references to the hard registers in global_rtl_index go through
     these unique rtl objects.  On machines where the frame-pointer and
     arg-pointer are the same register, they use the same unique object.

     After register allocation, other rtl objects which used to be pseudo-regs
     may be clobbered to refer to the frame-pointer register.
     But references that were originally to the frame-pointer can be
     distinguished from the others because they contain frame_pointer_rtx.

     When to use frame_pointer_rtx and hard_frame_pointer_rtx is a little
     tricky: until register elimination has taken place hard_frame_pointer_rtx
     should be used if it is being set, and frame_pointer_rtx otherwise.  After
     register elimination hard_frame_pointer_rtx should always be used.
     On machines where the two registers are same (most) then these are the
     same.  */
  rtx x_global_rtl[GR_MAX];

  /* A unique representation of (REG:Pmode PIC_OFFSET_TABLE_REGNUM).  */
  rtx x_pic_offset_table_rtx;

  /* A unique representation of (REG:Pmode RETURN_ADDRESS_POINTER_REGNUM).
     This is used to implement __builtin_return_address for some machines;
     see for instance the MIPS port.  */
  rtx x_return_address_pointer_rtx;

  /* Commonly used RTL for hard registers.  These objects are not
     necessarily unique, so we allocate them separately from global_rtl.
     They are initialized once per compilation unit, then copied into
     regno_reg_rtx at the beginning of each function.  */
  rtx x_initial_regno_reg_rtx[FIRST_PSEUDO_REGISTER];
2139 2140 2141

  /* A sample (mem:M stack_pointer_rtx) rtx for each mode M.  */
  rtx x_top_of_stack[MAX_MACHINE_MODE];
2142 2143 2144 2145

  /* Static hunks of RTL used by the aliasing code; these are treated
     as persistent to avoid unnecessary RTL allocations.  */
  rtx x_static_reg_base_value[FIRST_PSEUDO_REGISTER];
Richard Sandiford committed
2146 2147 2148

  /* The default memory attributes for each mode.  */
  struct mem_attrs *x_mode_mem_attrs[(int) MAX_MACHINE_MODE];
2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163
};

extern GTY(()) struct target_rtl default_target_rtl;
#if SWITCHABLE_TARGET
extern struct target_rtl *this_target_rtl;
#else
#define this_target_rtl (&default_target_rtl)
#endif

#define global_rtl				\
  (this_target_rtl->x_global_rtl)
#define pic_offset_table_rtx \
  (this_target_rtl->x_pic_offset_table_rtx)
#define return_address_pointer_rtx \
  (this_target_rtl->x_return_address_pointer_rtx)
2164 2165
#define top_of_stack \
  (this_target_rtl->x_top_of_stack)
Richard Sandiford committed
2166 2167
#define mode_mem_attrs \
  (this_target_rtl->x_mode_mem_attrs)
2168 2169 2170

/* Standard pieces of rtx, to be substituted directly into things.  */
#define pc_rtx                  (global_rtl[GR_PC])
2171
#define ret_rtx                 (global_rtl[GR_RETURN])
2172
#define cc0_rtx                 (global_rtl[GR_CC0])
2173

Jim Wilson committed
2174 2175 2176
/* All references to certain hard regs, except those created
   by allocating pseudo regs into them (when that's possible),
   go through these unique rtx objects.  */
2177 2178 2179 2180
#define stack_pointer_rtx       (global_rtl[GR_STACK_POINTER])
#define frame_pointer_rtx       (global_rtl[GR_FRAME_POINTER])
#define hard_frame_pointer_rtx	(global_rtl[GR_HARD_FRAME_POINTER])
#define arg_pointer_rtx		(global_rtl[GR_ARG_POINTER])
2181

Richard Sandiford committed
2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195
#ifndef GENERATOR_FILE
/* Return the attributes of a MEM rtx.  */
static inline struct mem_attrs *
get_mem_attrs (const_rtx x)
{
  struct mem_attrs *attrs;

  attrs = MEM_ATTRS (x);
  if (!attrs)
    attrs = mode_mem_attrs[(int) GET_MODE (x)];
  return attrs;
}
#endif

2196 2197
/* Include the RTL generation functions.  */

2198
#ifndef GENERATOR_FILE
2199
#include "genrtl.h"
2200 2201 2202 2203 2204
#undef gen_rtx_ASM_INPUT
#define gen_rtx_ASM_INPUT(MODE, ARG0)				\
  gen_rtx_fmt_si (ASM_INPUT, (MODE), (ARG0), 0)
#define gen_rtx_ASM_INPUT_loc(MODE, ARG0, LOC)			\
  gen_rtx_fmt_si (ASM_INPUT, (MODE), (ARG0), (LOC))
2205 2206
#endif

2207 2208
/* There are some RTL codes that require special attention; the
   generation functions included above do the raw handling.  If you
2209
   add to this list, modify special_rtx in gengenrtl.c as well.  */
2210

2211 2212 2213 2214 2215 2216
extern rtx gen_rtx_CONST_INT (enum machine_mode, HOST_WIDE_INT);
extern rtx gen_rtx_CONST_VECTOR (enum machine_mode, rtvec);
extern rtx gen_raw_REG (enum machine_mode, int);
extern rtx gen_rtx_REG (enum machine_mode, unsigned);
extern rtx gen_rtx_SUBREG (enum machine_mode, rtx, int);
extern rtx gen_rtx_MEM (enum machine_mode, rtx);
2217

2218
#define GEN_INT(N)  gen_rtx_CONST_INT (VOIDmode, (N))
2219

Jim Wilson committed
2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231
/* Virtual registers are used during RTL generation to refer to locations into
   the stack frame when the actual location isn't known until RTL generation
   is complete.  The routine instantiate_virtual_regs replaces these with
   the proper value, which is normally {frame,arg,stack}_pointer_rtx plus
   a constant.  */

#define FIRST_VIRTUAL_REGISTER	(FIRST_PSEUDO_REGISTER)

/* This points to the first word of the incoming arguments passed on the stack,
   either by the caller or by the callee when pretending it was passed by the
   caller.  */

2232
#define virtual_incoming_args_rtx       (global_rtl[GR_VIRTUAL_INCOMING_ARGS])
Jim Wilson committed
2233 2234 2235

#define VIRTUAL_INCOMING_ARGS_REGNUM	(FIRST_VIRTUAL_REGISTER)

Richard Stallman committed
2236
/* If FRAME_GROWS_DOWNWARD, this points to immediately above the first
Jim Wilson committed
2237 2238 2239
   variable on the stack.  Otherwise, it points to the first variable on
   the stack.  */

2240
#define virtual_stack_vars_rtx	        (global_rtl[GR_VIRTUAL_STACK_ARGS])
Jim Wilson committed
2241 2242 2243 2244 2245 2246 2247

#define VIRTUAL_STACK_VARS_REGNUM	((FIRST_VIRTUAL_REGISTER) + 1)

/* This points to the location of dynamically-allocated memory on the stack
   immediately after the stack pointer has been adjusted by the amount
   desired.  */

2248
#define virtual_stack_dynamic_rtx	(global_rtl[GR_VIRTUAL_STACK_DYNAMIC])
Jim Wilson committed
2249 2250 2251 2252 2253 2254 2255

#define VIRTUAL_STACK_DYNAMIC_REGNUM	((FIRST_VIRTUAL_REGISTER) + 2)

/* This points to the location in the stack at which outgoing arguments should
   be written when the stack is pre-pushed (arguments pushed using push
   insns always use sp).  */

2256
#define virtual_outgoing_args_rtx	(global_rtl[GR_VIRTUAL_OUTGOING_ARGS])
Jim Wilson committed
2257 2258 2259

#define VIRTUAL_OUTGOING_ARGS_REGNUM	((FIRST_VIRTUAL_REGISTER) + 3)

2260
/* This points to the Canonical Frame Address of the function.  This
2261
   should correspond to the CFA produced by INCOMING_FRAME_SP_OFFSET,
2262
   but is calculated relative to the arg pointer for simplicity; the
2263
   frame pointer nor stack pointer are necessarily fixed relative to
2264 2265
   the CFA until after reload.  */

2266
#define virtual_cfa_rtx			(global_rtl[GR_VIRTUAL_CFA])
2267 2268 2269

#define VIRTUAL_CFA_REGNUM		((FIRST_VIRTUAL_REGISTER) + 4)

2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281
#define LAST_VIRTUAL_POINTER_REGISTER	((FIRST_VIRTUAL_REGISTER) + 4)

/* This is replaced by crtl->preferred_stack_boundary / BITS_PER_UNIT
   when finalized.  */

#define virtual_preferred_stack_boundary_rtx \
	(global_rtl[GR_VIRTUAL_PREFERRED_STACK_BOUNDARY])

#define VIRTUAL_PREFERRED_STACK_BOUNDARY_REGNUM \
					((FIRST_VIRTUAL_REGISTER) + 5)

#define LAST_VIRTUAL_REGISTER		((FIRST_VIRTUAL_REGISTER) + 5)
Jim Wilson committed
2282

2283
/* Nonzero if REGNUM is a pointer into the stack frame.  */
2284
#define REGNO_PTR_FRAME_P(REGNUM)		\
2285 2286 2287 2288 2289
  ((REGNUM) == STACK_POINTER_REGNUM		\
   || (REGNUM) == FRAME_POINTER_REGNUM		\
   || (REGNUM) == HARD_FRAME_POINTER_REGNUM	\
   || (REGNUM) == ARG_POINTER_REGNUM		\
   || ((REGNUM) >= FIRST_VIRTUAL_REGISTER	\
2290
       && (REGNUM) <= LAST_VIRTUAL_POINTER_REGISTER))
2291

2292
/* REGNUM never really appearing in the INSN stream.  */
Kazu Hirata committed
2293
#define INVALID_REGNUM			(~(unsigned int) 0)
2294

2295
extern rtx output_constant_def (tree, int);
2296
extern rtx lookup_constant_def (tree);
Jim Wilson committed
2297 2298

/* Nonzero after end of reload pass.
2299
   Set to 1 or 0 by reload1.c.  */
Jim Wilson committed
2300 2301 2302

extern int reload_completed;

Stephen Clarke committed
2303 2304 2305
/* Nonzero after thread_prologue_and_epilogue_insns has run.  */
extern int epilogue_completed;

Jim Wilson committed
2306 2307 2308 2309 2310
/* Set to 1 while reload_as_needed is operating.
   Required by some machines to handle any generated moves differently.  */

extern int reload_in_progress;

2311 2312 2313 2314 2315
/* This macro indicates whether you may create a new
   pseudo-register.  */

#define can_create_pseudo_p() (!reload_in_progress && !reload_completed)

2316 2317 2318 2319 2320 2321
#ifdef STACK_REGS
/* Nonzero after end of regstack pass.
   Set to 1 or 0 by reg-stack.c.  */
extern int regstack_completed;
#endif

Jim Wilson committed
2322 2323 2324 2325 2326 2327 2328 2329
/* If this is nonzero, we do not bother generating VOLATILE
   around volatile memory references, and we are willing to
   output indirect addresses.  If cse is to follow, we reject
   indirect addresses so a useful potential cse is generated;
   if it is used only once, instruction combination will produce
   the same indirect address eventually.  */
extern int cse_not_expected;

2330
/* Translates rtx code to tree code, for those codes needed by
2331 2332 2333
   REAL_ARITHMETIC.  The function returns an int because the caller may not
   know what `enum tree_code' means.  */

2334
extern int rtx_to_tree_code (enum rtx_code);
2335

2336
/* In cse.c */
2337
extern int delete_trivially_dead_insns (rtx, int);
2338
extern int cse_main (rtx, int);
2339 2340
extern int exp_equiv_p (const_rtx, const_rtx, int, bool);
extern unsigned hash_rtx (const_rtx x, enum machine_mode, int *, int *, bool);
2341

2342 2343 2344
/* In dse.c */
extern void check_for_inc_dec (rtx insn);

2345
/* In jump.c */
2346
extern int comparison_dominates_p (enum rtx_code, enum rtx_code);
2347
extern bool jump_to_label_p (rtx);
2348 2349 2350 2351
extern int condjump_p (const_rtx);
extern int any_condjump_p (const_rtx);
extern int any_uncondjump_p (const_rtx);
extern rtx pc_set (const_rtx);
2352
extern rtx condjump_label (const_rtx);
2353
extern int simplejump_p (const_rtx);
2354
extern int returnjump_p (rtx);
2355
extern int eh_returnjump_p (rtx);
2356 2357 2358
extern int onlyjump_p (const_rtx);
extern int only_sets_cc0_p (const_rtx);
extern int sets_cc0_p (const_rtx);
2359 2360
extern int invert_jump_1 (rtx, rtx);
extern int invert_jump (rtx, rtx, int);
2361
extern int rtx_renumbered_equal_p (const_rtx, const_rtx);
2362 2363
extern int true_regnum (const_rtx);
extern unsigned int reg_or_subregno (const_rtx);
2364
extern int redirect_jump_1 (rtx, rtx);
2365
extern void redirect_jump_2 (rtx, rtx, rtx, int, int);
2366 2367
extern int redirect_jump (rtx, rtx, int);
extern void rebuild_jump_labels (rtx);
2368
extern void rebuild_jump_labels_chain (rtx);
2369 2370 2371 2372
extern rtx reversed_comparison (const_rtx, enum machine_mode);
extern enum rtx_code reversed_comparison_code (const_rtx, const_rtx);
extern enum rtx_code reversed_comparison_code_parts (enum rtx_code, const_rtx,
						     const_rtx, const_rtx);
2373
extern void delete_for_peephole (rtx, rtx);
2374
extern int condjump_in_parallel_p (const_rtx);
2375

Kazu Hirata committed
2376
/* In emit-rtl.c.  */
2377 2378 2379
extern int max_reg_num (void);
extern int max_label_num (void);
extern int get_first_label_num (void);
2380
extern void maybe_set_first_label_num (rtx);
2381 2382 2383 2384
extern void delete_insns_since (rtx);
extern void mark_reg_pointer (rtx, int);
extern void mark_user_reg (rtx);
extern void reset_used_flags (rtx);
2385
extern void set_used_flags (rtx);
2386 2387
extern void reorder_insns (rtx, rtx, rtx);
extern void reorder_insns_nobb (rtx, rtx, rtx);
2388
extern int get_max_insn_count (void);
2389 2390 2391
extern int in_sequence_p (void);
extern void force_next_line_note (void);
extern void init_emit (void);
2392
extern void init_emit_regs (void);
2393
extern void init_emit_once (void);
2394 2395 2396
extern void push_topmost_sequence (void);
extern void pop_topmost_sequence (void);
extern void set_new_first_and_last_insn (rtx, rtx);
2397
extern unsigned int unshare_all_rtl (void);
2398
extern void unshare_all_rtl_again (rtx);
2399 2400
extern void unshare_all_rtl_in_chain (rtx);
extern void verify_rtl_sharing (void);
2401 2402
extern void link_cc0_insns (rtx);
extern void add_insn (rtx);
2403 2404
extern void add_insn_before (rtx, rtx, struct basic_block_def *);
extern void add_insn_after (rtx, rtx, struct basic_block_def *);
2405 2406 2407
extern void remove_insn (rtx);
extern rtx emit (rtx);
extern rtx delete_insn (rtx);
2408
extern rtx entry_of_function (void);
2409
extern void emit_insn_at_entry (rtx);
2410
extern void delete_insn_chain (rtx, rtx, bool);
2411 2412
extern rtx unlink_insn_chain (rtx, rtx);
extern rtx delete_insn_and_edges (rtx);
2413
extern rtx gen_lowpart_SUBREG (enum machine_mode, rtx);
2414
extern rtx gen_const_mem (enum machine_mode, rtx);
2415 2416
extern rtx gen_frame_mem (enum machine_mode, rtx);
extern rtx gen_tmp_stack_mem (enum machine_mode, rtx);
2417
extern bool validate_subreg (enum machine_mode, enum machine_mode,
2418
			     const_rtx, unsigned int);
2419

2420
/* In combine.c  */
2421
extern unsigned int extended_count (const_rtx, enum machine_mode, int);
2422 2423 2424
extern rtx remove_death (unsigned int, rtx);
extern void dump_combine_stats (FILE *);
extern void dump_combine_total_stats (FILE *);
2425

2426 2427 2428
/* In cfgcleanup.c  */
extern void delete_dead_jumptables (void);

2429
/* In sched-vis.c.  */
2430 2431 2432
extern void debug_bb_n_slim (int);
extern void debug_bb_slim (struct basic_block_def *);
extern void print_rtl_slim (FILE *, rtx, rtx, int, int);
2433 2434 2435 2436
extern void print_rtl_slim_with_bb (FILE *, rtx, int);
extern void dump_insn_slim (FILE *f, rtx x);
extern void debug_insn_slim (rtx x);

2437
/* In sched-rgn.c.  */
2438
extern void schedule_insns (void);
2439 2440

/* In sched-ebb.c.  */
2441
extern void schedule_ebbs (void);
2442

2443 2444 2445
/* In sel-sched-dump.c.  */
extern void sel_sched_fix_param (const char *param, const char *val);

2446
/* In print-rtl.c */
2447
extern const char *print_rtx_head;
2448 2449 2450 2451 2452 2453 2454 2455 2456
extern void debug_rtx (const_rtx);
extern void debug_rtx_list (const_rtx, int);
extern void debug_rtx_range (const_rtx, const_rtx);
extern const_rtx debug_rtx_find (const_rtx, int);
extern void print_mem_expr (FILE *, const_tree);
extern void print_rtl (FILE *, const_rtx);
extern void print_simple_rtl (FILE *, const_rtx);
extern int print_rtl_single (FILE *, const_rtx);
extern void print_inline_rtx (FILE *, const_rtx, int);
2457 2458

/* In function.c */
2459
extern void reposition_prologue_and_epilogue_notes (void);
2460 2461
extern int prologue_epilogue_contains (const_rtx);
extern int sibcall_epilogue_contains (const_rtx);
2462 2463
extern void mark_temp_addr_taken (rtx);
extern void update_temp_slot_address (rtx, rtx);
2464
extern void maybe_copy_prologue_epilogue_insn (rtx, rtx);
2465 2466

/* In stmt.c */
2467
extern void expand_null_return (void);
2468
extern void expand_naked_return (void);
2469
extern void emit_jump (rtx);
2470 2471

/* In expr.c */
2472 2473
extern rtx move_by_pieces (rtx, rtx, unsigned HOST_WIDE_INT,
			   unsigned int, int);
2474
extern int fixup_args_size_notes (rtx, rtx, int);
2475

2476
/* In cfgrtl.c */
2477
extern void print_rtl_with_bb (FILE *, const_rtx);
2478 2479 2480

/* In cfg.c.  */
extern void dump_reg_info (FILE *);
2481
extern void dump_flow_info (FILE *, int);
2482 2483

/* In expmed.c */
2484 2485 2486
extern void init_expmed (void);
extern void expand_inc (rtx, rtx);
extern void expand_dec (rtx, rtx);
2487

Kaveh R. Ghazi committed
2488
/* In gcse.c */
2489
extern bool can_copy_p (enum machine_mode);
2490
extern bool can_assign_to_reg_without_clobbers_p (rtx);
2491
extern rtx fis_get_condition (rtx);
2492

2493
/* In ira.c */
Vladimir Makarov committed
2494 2495 2496
#ifdef HARD_CONST
extern HARD_REG_SET eliminable_regset;
#endif
2497
extern void mark_elimination (int, int);
2498

2499
/* In reginfo.c */
2500
extern int reg_classes_intersect_p (reg_class_t, reg_class_t);
2501
extern int reg_class_subset_p (reg_class_t, reg_class_t);
2502
extern void globalize_reg (tree, int);
2503
extern void init_reg_modes_target (void);
2504
extern void init_regs (void);
2505
extern void reinit_regs (void);
2506
extern void init_fake_stack_mems (void);
2507
extern void save_register_info (void);
2508
extern void init_reg_sets (void);
2509
extern void regclass (rtx, int);
2510
extern void reg_scan (rtx, unsigned int);
2511
extern void fix_register (const char *, int, int);
2512
extern bool invalid_mode_change_p (unsigned int, enum reg_class);
2513

Kaveh R. Ghazi committed
2514
/* In reorg.c */
2515
extern void dbr_schedule (rtx);
Kaveh R. Ghazi committed
2516

2517
/* In reload1.c */
2518
extern int function_invariant_p (const_rtx);
2519

2520
/* In calls.c */
2521 2522 2523 2524 2525
enum libcall_type
{
  LCT_NORMAL = 0,
  LCT_CONST = 1,
  LCT_PURE = 2,
2526 2527 2528
  LCT_NORETURN = 3,
  LCT_THROW = 4,
  LCT_RETURNS_TWICE = 5
2529 2530
};

2531 2532 2533 2534
extern void emit_library_call (rtx, enum libcall_type, enum machine_mode, int,
			       ...);
extern rtx emit_library_call_value (rtx, rtx, enum libcall_type,
				    enum machine_mode, int, ...);
2535 2536

/* In varasm.c */
2537
extern void init_varasm_once (void);
H.J. Lu committed
2538

2539 2540
extern rtx make_debug_expr_from_rtl (const_rtx);

2541
/* In read-rtl.c */
2542
extern bool read_rtx (const char *, rtx *);
2543

2544
/* In alias.c */
2545
extern rtx canon_rtx (rtx);
2546
extern int true_dependence (const_rtx, enum machine_mode, const_rtx, bool (*)(const_rtx, bool));
2547
extern rtx get_addr (rtx);
2548
extern int canon_true_dependence (const_rtx, enum machine_mode, rtx, const_rtx,
2549
				  rtx, bool (*)(const_rtx, bool));
2550 2551 2552
extern int read_dependence (const_rtx, const_rtx);
extern int anti_dependence (const_rtx, const_rtx);
extern int output_dependence (const_rtx, const_rtx);
2553
extern int may_alias_p (const_rtx, const_rtx);
2554
extern void init_alias_target (void);
2555 2556
extern void init_alias_analysis (void);
extern void end_alias_analysis (void);
2557
extern void vt_equate_reg_base_value (const_rtx, const_rtx);
2558
extern bool memory_modified_in_insn_p (const_rtx, const_rtx);
2559
extern rtx find_base_term (rtx);
2560
extern rtx gen_hard_reg_clobber (enum machine_mode, unsigned int);
2561 2562
extern rtx get_reg_known_value (unsigned int);
extern bool get_reg_known_equiv_p (unsigned int);
2563
extern rtx get_reg_base_value (unsigned int);
2564

2565
#ifdef STACK_REGS
2566
extern int stack_regs_mentioned (const_rtx insn);
2567 2568
#endif

2569
/* In toplev.c */
2570
extern GTY(()) rtx stack_limit_rtx;
2571

Jan Hubicka committed
2572
/* In predict.c */
2573 2574
extern void invert_br_probabilities (rtx);
extern bool expensive_function_p (int);
2575

2576
/* In var-tracking.c */
2577
extern unsigned int variable_tracking_main (void);
2578

Zdenek Dvorak committed
2579
/* In stor-layout.c.  */
2580 2581
extern void get_mode_bounds (enum machine_mode, int, enum machine_mode,
			     rtx *, rtx *);
Zdenek Dvorak committed
2582 2583 2584 2585 2586 2587 2588 2589

/* In loop-unswitch.c  */
extern rtx reversed_condition (rtx);
extern rtx compare_and_jump_seq (rtx, rtx, enum rtx_code, rtx, int, rtx);

/* In loop-iv.c  */
extern rtx canon_condition (rtx);
extern void simplify_using_condition (rtx, rtx *, struct bitmap_head_def *);
2590 2591 2592

/* In final.c  */
extern unsigned int compute_alignments (void);
2593
extern int asm_str_count (const char *templ);
2594 2595 2596 2597

struct rtl_hooks
{
  rtx (*gen_lowpart) (enum machine_mode, rtx);
2598
  rtx (*gen_lowpart_no_emit) (enum machine_mode, rtx);
2599
  rtx (*reg_nonzero_bits) (const_rtx, enum machine_mode, const_rtx, enum machine_mode,
2600
			   unsigned HOST_WIDE_INT, unsigned HOST_WIDE_INT *);
2601
  rtx (*reg_num_sign_bit_copies) (const_rtx, enum machine_mode, const_rtx, enum machine_mode,
2602
				  unsigned int, unsigned int *);
2603
  bool (*reg_truncated_to_mode) (enum machine_mode, const_rtx);
2604

2605
  /* Whenever you add entries here, make sure you adjust rtlhooks-def.h.  */
2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616
};

/* Each pass can provide its own.  */
extern struct rtl_hooks rtl_hooks;

/* ... but then it has to restore these.  */
extern const struct rtl_hooks general_rtl_hooks;

/* Keep this for the nonce.  */
#define gen_lowpart rtl_hooks.gen_lowpart

2617
extern void insn_locators_alloc (void);
2618
extern void insn_locators_free (void);
2619 2620
extern void insn_locators_finalize (void);
extern void set_curr_insn_source_location (location_t);
2621
extern location_t get_curr_insn_source_location (void);
2622
extern void set_curr_insn_block (tree);
2623
extern tree get_curr_insn_block (void);
2624
extern int curr_insn_locator (void);
2625 2626
extern bool optimize_insn_for_size_p (void);
extern bool optimize_insn_for_speed_p (void);
2627

2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640
/* rtl-error.c */
extern void _fatal_insn_not_found (const_rtx, const char *, int, const char *)
     ATTRIBUTE_NORETURN;
extern void _fatal_insn (const char *, const_rtx, const char *, int, const char *)
     ATTRIBUTE_NORETURN;

#define fatal_insn(msgid, insn) \
	_fatal_insn (msgid, insn, __FILE__, __LINE__, __FUNCTION__)
#define fatal_insn_not_found(insn) \
	_fatal_insn_not_found (insn, __FILE__, __LINE__, __FUNCTION__)



2641
#endif /* ! GCC_RTL_H */