|
|
1.1 root 1: /* Register Transfer Language (RTL) definitions for GNU C-Compiler
1.1.1.4 root 2: Copyright (C) 1987, 1991, 1992 Free Software Foundation, Inc.
1.1 root 3:
4: This file is part of GNU CC.
5:
6: GNU CC is free software; you can redistribute it and/or modify
7: it under the terms of the GNU General Public License as published by
8: the Free Software Foundation; either version 2, or (at your option)
9: any later version.
10:
11: GNU CC is distributed in the hope that it will be useful,
12: but WITHOUT ANY WARRANTY; without even the implied warranty of
13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14: GNU General Public License for more details.
15:
16: You should have received a copy of the GNU General Public License
17: along with GNU CC; see the file COPYING. If not, write to
18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19:
20:
21: #include "machmode.h"
22:
23: #undef FFS /* Some systems predefine this symbol; don't let it interfere. */
24: #undef FLOAT /* Likewise. */
1.1.1.5 ! root 25: #undef ABS /* Likewise. */
! 26: #undef PC /* Likewise. */
1.1 root 27:
28: /* Register Transfer Language EXPRESSIONS CODES */
29:
30: #define RTX_CODE enum rtx_code
31: enum rtx_code {
32:
33: #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) ENUM ,
34: #include "rtl.def" /* rtl expressions are documented here */
35: #undef DEF_RTL_EXPR
36:
1.1.1.3 root 37: LAST_AND_UNUSED_RTX_CODE}; /* A convenient way to get a value for
1.1 root 38: NUM_RTX_CODE.
1.1.1.3 root 39: Assumes default enum value assignment. */
1.1 root 40:
41: #define NUM_RTX_CODE ((int)LAST_AND_UNUSED_RTX_CODE)
42: /* The cast here, saves many elsewhere. */
43:
44: extern int rtx_length[];
45: #define GET_RTX_LENGTH(CODE) (rtx_length[(int)(CODE)])
46:
47: extern char *rtx_name[];
48: #define GET_RTX_NAME(CODE) (rtx_name[(int)(CODE)])
49:
50: extern char *rtx_format[];
51: #define GET_RTX_FORMAT(CODE) (rtx_format[(int)(CODE)])
52:
53: extern char rtx_class[];
54: #define GET_RTX_CLASS(CODE) (rtx_class[(int)(CODE)])
55:
56: /* Common union for an element of an rtx. */
57:
58: typedef union rtunion_def
59: {
1.1.1.4 root 60: HOST_WIDE_INT rtwint;
1.1 root 61: int rtint;
62: char *rtstr;
63: struct rtx_def *rtx;
64: struct rtvec_def *rtvec;
65: enum machine_mode rttype;
66: } rtunion;
67:
68: /* RTL expression ("rtx"). */
69:
70: typedef struct rtx_def
71: {
72: #ifdef ONLY_INT_FIELDS
1.1.1.4 root 73: #ifdef CODE_FIELD_BUG
74: unsigned int code : 16;
75: #else
1.1 root 76: unsigned short code;
1.1.1.4 root 77: #endif
1.1 root 78: #else
79: /* The kind of expression this is. */
80: enum rtx_code code : 16;
81: #endif
82: /* The kind of value the expression has. */
83: #ifdef ONLY_INT_FIELDS
84: int mode : 8;
85: #else
86: enum machine_mode mode : 8;
87: #endif
88: /* 1 in an INSN if it can alter flow of control
89: within this function. Not yet used! */
90: unsigned int jump : 1;
91: /* 1 in an INSN if it can call another function. Not yet used! */
92: unsigned int call : 1;
93: /* 1 in a MEM or REG if value of this expression will never change
94: during the current function, even though it is not
95: manifestly constant.
1.1.1.4 root 96: 1 in a SUBREG if it is from a promoted variable that is unsigned.
1.1 root 97: 1 in a SYMBOL_REF if it addresses something in the per-function
98: constants pool.
99: 1 in a CALL_INSN if it is a const call.
100: 1 in a JUMP_INSN if it is a branch that should be annulled. Valid from
101: reorg until end of compilation; cleared before used. */
102: unsigned int unchanging : 1;
103: /* 1 in a MEM expression if contents of memory are volatile.
104: 1 in an INSN, CALL_INSN, JUMP_INSN, CODE_LABEL or BARRIER
105: if it is deleted.
106: 1 in a REG expression if corresponds to a variable declared by the user.
107: 0 for an internally generated temporary.
1.1.1.4 root 108: In a SYMBOL_REF, this flag is used for machine-specific purposes.
109: In a LABEL_REF or in a REG_LABEL note, this is LABEL_REF_NONLOCAL_P. */
1.1 root 110: unsigned int volatil : 1;
111: /* 1 in a MEM referring to a field of a structure (not a union!).
112: 0 if the MEM was a variable or the result of a * operator in C;
113: 1 if it was the result of a . or -> operator (on a struct) in C.
114: 1 in a REG if the register is used only in exit code a loop.
1.1.1.4 root 115: 1 in a SUBREG expression if was generated from a variable with a
116: promoted mode.
1.1 root 117: 1 in a CODE_LABEL if the label is used for nonlocal gotos
118: and must not be deleted even if its count is zero.
119: 1 in a LABEL_REF if this is a reference to a label outside the
120: current loop.
121: 1 in an INSN, JUMP_INSN, or CALL_INSN if this insn must be scheduled
1.1.1.2 root 122: together with the preceding insn. Valid only within sched.
1.1 root 123: 1 in an INSN, JUMP_INSN, or CALL_INSN if insn is in a delay slot and
124: from the target of a branch. Valid from reorg until end of compilation;
125: cleared before used. */
126: unsigned int in_struct : 1;
127: /* 1 if this rtx is used. This is used for copying shared structure.
128: See `unshare_all_rtl'.
129: In a REG, this is not needed for that purpose, and used instead
130: in `leaf_renumber_regs_insn'.
131: In a SYMBOL_REF, means that emit_library_call
132: has used it as the function. */
133: unsigned int used : 1;
134: /* Nonzero if this rtx came from procedure integration.
135: In a REG, nonzero means this reg refers to the return value
136: of the current function. */
137: unsigned integrated : 1;
138: /* The first element of the operands of this rtx.
139: The number of operands and their types are controlled
140: by the `code' field, according to rtl.def. */
141: rtunion fld[1];
142: } *rtx;
143:
1.1.1.4 root 144: /* Add prototype support. */
145: #ifndef PROTO
146: #if defined (USE_PROTOTYPES) ? USE_PROTOTYPES : defined (__STDC__)
147: #define PROTO(ARGS) ARGS
148: #else
149: #define PROTO(ARGS) ()
150: #endif
151: #endif
152:
1.1 root 153: #define NULL_RTX (rtx) 0
154:
1.1.1.4 root 155: /* Define a generic NULL if one hasn't already been defined. */
156:
157: #ifndef NULL
158: #define NULL 0
159: #endif
160:
161: #ifndef GENERIC_PTR
162: #if defined (USE_PROTOTYPES) ? USE_PROTOTYPES : defined (__STDC__)
163: #define GENERIC_PTR void *
164: #else
165: #define GENERIC_PTR char *
166: #endif
167: #endif
168:
169: #ifndef NULL_PTR
170: #define NULL_PTR ((GENERIC_PTR)0)
171: #endif
172:
1.1 root 173: /* Define macros to access the `code' field of the rtx. */
174:
175: #ifdef SHORT_ENUM_BUG
176: #define GET_CODE(RTX) ((enum rtx_code) ((RTX)->code))
177: #define PUT_CODE(RTX, CODE) ((RTX)->code = ((short) (CODE)))
178: #else
179: #define GET_CODE(RTX) ((RTX)->code)
180: #define PUT_CODE(RTX, CODE) ((RTX)->code = (CODE))
181: #endif
182:
183: #define GET_MODE(RTX) ((RTX)->mode)
184: #define PUT_MODE(RTX, MODE) ((RTX)->mode = (MODE))
185:
186: #define RTX_INTEGRATED_P(RTX) ((RTX)->integrated)
187: #define RTX_UNCHANGING_P(RTX) ((RTX)->unchanging)
188:
189: /* RTL vector. These appear inside RTX's when there is a need
190: for a variable number of things. The principle use is inside
191: PARALLEL expressions. */
192:
193: typedef struct rtvec_def{
194: unsigned num_elem; /* number of elements */
195: rtunion elem[1];
196: } *rtvec;
197:
198: #define NULL_RTVEC (rtvec) 0
199:
200: #define GET_NUM_ELEM(RTVEC) ((RTVEC)->num_elem)
201: #define PUT_NUM_ELEM(RTVEC, NUM) ((RTVEC)->num_elem = (unsigned) NUM)
202:
203: #define RTVEC_ELT(RTVEC, I) ((RTVEC)->elem[(I)].rtx)
204:
205: /* 1 if X is a REG. */
206:
207: #define REG_P(X) (GET_CODE (X) == REG)
208:
209: /* 1 if X is a constant value that is an integer. */
210:
211: #define CONSTANT_P(X) \
212: (GET_CODE (X) == LABEL_REF || GET_CODE (X) == SYMBOL_REF \
213: || GET_CODE (X) == CONST_INT || GET_CODE (X) == CONST_DOUBLE \
214: || GET_CODE (X) == CONST || GET_CODE (X) == HIGH)
215:
216: /* General accessor macros for accessing the fields of an rtx. */
217:
218: #define XEXP(RTX, N) ((RTX)->fld[N].rtx)
219: #define XINT(RTX, N) ((RTX)->fld[N].rtint)
1.1.1.4 root 220: #define XWINT(RTX, N) ((RTX)->fld[N].rtwint)
1.1 root 221: #define XSTR(RTX, N) ((RTX)->fld[N].rtstr)
222: #define XVEC(RTX, N) ((RTX)->fld[N].rtvec)
223: #define XVECLEN(RTX, N) ((RTX)->fld[N].rtvec->num_elem)
224: #define XVECEXP(RTX,N,M)((RTX)->fld[N].rtvec->elem[M].rtx)
225:
226: /* ACCESS MACROS for particular fields of insns. */
227:
228: /* Holds a unique number for each insn.
229: These are not necessarily sequentially increasing. */
230: #define INSN_UID(INSN) ((INSN)->fld[0].rtint)
231:
232: /* Chain insns together in sequence. */
233: #define PREV_INSN(INSN) ((INSN)->fld[1].rtx)
234: #define NEXT_INSN(INSN) ((INSN)->fld[2].rtx)
235:
236: /* The body of an insn. */
237: #define PATTERN(INSN) ((INSN)->fld[3].rtx)
238:
239: /* Code number of instruction, from when it was recognized.
240: -1 means this instruction has not been recognized yet. */
241: #define INSN_CODE(INSN) ((INSN)->fld[4].rtint)
242:
243: /* Set up in flow.c; empty before then.
244: Holds a chain of INSN_LIST rtx's whose first operands point at
245: previous insns with direct data-flow connections to this one.
246: That means that those insns set variables whose next use is in this insn.
247: They are always in the same basic block as this insn. */
248: #define LOG_LINKS(INSN) ((INSN)->fld[5].rtx)
249:
250: /* 1 if insn has been deleted. */
251: #define INSN_DELETED_P(INSN) ((INSN)->volatil)
252:
253: /* 1 if insn is a call to a const function. */
254: #define CONST_CALL_P(INSN) ((INSN)->unchanging)
255:
256: /* 1 if insn is a branch that should not unconditionally execute its
257: delay slots, i.e., it is an annulled branch. */
258: #define INSN_ANNULLED_BRANCH_P(INSN) ((INSN)->unchanging)
259:
260: /* 1 if insn is in a delay slot and is from the target of the branch. If
1.1.1.3 root 261: the branch insn has INSN_ANNULLED_BRANCH_P set, this insn should only be
1.1 root 262: executed if the branch is taken. For annulled branches with this bit
263: clear, the insn should be executed only if the branch is not taken. */
264: #define INSN_FROM_TARGET_P(INSN) ((INSN)->in_struct)
265:
266: /* Holds a list of notes on what this insn does to various REGs.
267: It is a chain of EXPR_LIST rtx's, where the second operand
268: is the chain pointer and the first operand is the REG being described.
269: The mode field of the EXPR_LIST contains not a real machine mode
270: but a value that says what this note says about the REG:
271: REG_DEAD means that the value in REG dies in this insn (i.e., it is
272: not needed past this insn). If REG is set in this insn, the REG_DEAD
273: note may, but need not, be omitted.
274: REG_INC means that the REG is autoincremented or autodecremented.
275: REG_EQUIV describes the insn as a whole; it says that the
276: insn sets a register to a constant value or to be equivalent to
277: a memory address. If the
278: register is spilled to the stack then the constant value
279: should be substituted for it. The contents of the REG_EQUIV
280: is the constant value or memory address, which may be different
281: from the source of the SET although it has the same value.
282: REG_EQUAL is like REG_EQUIV except that the destination
283: is only momentarily equal to the specified rtx. Therefore, it
284: cannot be used for substitution; but it can be used for cse.
285: REG_RETVAL means that this insn copies the return-value of
286: a library call out of the hard reg for return values. This note
287: is actually an INSN_LIST and it points to the first insn involved
288: in setting up arguments for the call. flow.c uses this to delete
289: the entire library call when its result is dead.
290: REG_LIBCALL is the inverse of REG_RETVAL: it goes on the first insn
291: of the library call and points at the one that has the REG_RETVAL.
292: REG_WAS_0 says that the register set in this insn held 0 before the insn.
293: The contents of the note is the insn that stored the 0.
294: If that insn is deleted or patched to a NOTE, the REG_WAS_0 is inoperative.
295: The REG_WAS_0 note is actually an INSN_LIST, not an EXPR_LIST.
296: REG_NONNEG means that the register is always nonnegative during
297: the containing loop. This is used in branches so that decrement and
298: branch instructions terminating on zero can be matched. There must be
299: an insn pattern in the md file named `decrement_and_branch_until_zero'
300: or else this will never be added to any instructions.
301: REG_NO_CONFLICT means there is no conflict *after this insn*
302: between the register in the note and the destination of this insn.
303: REG_UNUSED identifies a register set in this insn and never used.
304: REG_CC_SETTER and REG_CC_USER link a pair of insns that set and use
305: CC0, respectively. Normally, these are required to be consecutive insns,
306: but we permit putting a cc0-setting insn in the delay slot of a branch
307: as long as only one copy of the insn exists. In that case, these notes
308: point from one to the other to allow code generation to determine what
309: any require information and to properly update CC_STATUS.
310: REG_LABEL points to a CODE_LABEL. Used by non-JUMP_INSNs to
311: say that the CODE_LABEL contained in the REG_LABEL note is used
312: by the insn.
313: REG_DEP_ANTI is used in LOG_LINKS which represent anti (write after read)
314: dependencies. REG_DEP_OUTPUT is used in LOG_LINKS which represent output
315: (write after write) dependencies. Data dependencies, which are the only
316: type of LOG_LINK created by flow, are represented by a 0 reg note kind. */
317:
318: #define REG_NOTES(INSN) ((INSN)->fld[6].rtx)
319:
320: /* Don't forget to change reg_note_name in rtl.c. */
321: enum reg_note { REG_DEAD = 1, REG_INC = 2, REG_EQUIV = 3, REG_WAS_0 = 4,
322: REG_EQUAL = 5, REG_RETVAL = 6, REG_LIBCALL = 7,
323: REG_NONNEG = 8, REG_NO_CONFLICT = 9, REG_UNUSED = 10,
324: REG_CC_SETTER = 11, REG_CC_USER = 12, REG_LABEL = 13,
325: REG_DEP_ANTI = 14, REG_DEP_OUTPUT = 15 };
326:
327: /* Define macros to extract and insert the reg-note kind in an EXPR_LIST. */
328: #define REG_NOTE_KIND(LINK) ((enum reg_note) GET_MODE (LINK))
329: #define PUT_REG_NOTE_KIND(LINK,KIND) PUT_MODE(LINK, (enum machine_mode) (KIND))
330:
331: /* Names for REG_NOTE's in EXPR_LIST insn's. */
332:
333: extern char *reg_note_name[];
334: #define GET_REG_NOTE_NAME(MODE) (reg_note_name[(int)(MODE)])
335:
336: /* The label-number of a code-label. The assembler label
337: is made from `L' and the label-number printed in decimal.
338: Label numbers are unique in a compilation. */
339: #define CODE_LABEL_NUMBER(INSN) ((INSN)->fld[3].rtint)
340:
341: #define LINE_NUMBER NOTE
342:
343: /* In a NOTE that is a line number, this is a string for the file name
1.1.1.4 root 344: that the line is in. We use the same field to record block numbers
345: temporarily in NOTE_INSN_BLOCK_BEG and NOTE_INSN_BLOCK_END notes.
346: (We avoid lots of casts between ints and pointers if we use a
347: different macro for the bock number.) */
1.1 root 348:
349: #define NOTE_SOURCE_FILE(INSN) ((INSN)->fld[3].rtstr)
1.1.1.4 root 350: #define NOTE_BLOCK_NUMBER(INSN) ((INSN)->fld[3].rtint)
1.1 root 351:
352: /* In a NOTE that is a line number, this is the line number.
353: Other kinds of NOTEs are identified by negative numbers here. */
354: #define NOTE_LINE_NUMBER(INSN) ((INSN)->fld[4].rtint)
355:
356: /* Codes that appear in the NOTE_LINE_NUMBER field
1.1.1.5 ! root 357: for kinds of notes that are not line numbers.
1.1 root 358:
1.1.1.5 ! root 359: Notice that we do not try to use zero here for any of
! 360: the special note codes because sometimes the source line
! 361: actually can be zero! This happens (for example) when we
! 362: are generating code for the per-translation-unit constructor
! 363: and destructor routines for some C++ translation unit.
! 364:
! 365: If you should change any of the following values, or if you
! 366: should add a new value here, don't forget to change the
! 367: note_insn_name array in rtl.c. */
1.1 root 368:
369: /* This note is used to get rid of an insn
370: when it isn't safe to patch the insn out of the chain. */
371: #define NOTE_INSN_DELETED -1
372: #define NOTE_INSN_BLOCK_BEG -2
373: #define NOTE_INSN_BLOCK_END -3
374: #define NOTE_INSN_LOOP_BEG -4
375: #define NOTE_INSN_LOOP_END -5
376: /* This kind of note is generated at the end of the function body,
377: just before the return insn or return label.
378: In an optimizing compilation it is deleted by the first jump optimization,
379: after enabling that optimizer to determine whether control can fall
380: off the end of the function body without a return statement. */
381: #define NOTE_INSN_FUNCTION_END -6
382: /* This kind of note is generated just after each call to `setjmp', et al. */
383: #define NOTE_INSN_SETJMP -7
384: /* Generated at the place in a loop that `continue' jumps to. */
385: #define NOTE_INSN_LOOP_CONT -8
386: /* Generated at the start of a duplicated exit test. */
387: #define NOTE_INSN_LOOP_VTOP -9
1.1.1.4 root 388: /* This marks the point immediately after the last prologue insn. */
389: #define NOTE_INSN_PROLOGUE_END -10
390: /* This marks the point immediately prior to the first epilogue insn. */
391: #define NOTE_INSN_EPILOGUE_BEG -11
392: /* Generated in place of user-declared labels when they are deleted. */
393: #define NOTE_INSN_DELETED_LABEL -12
1.1.1.5 ! root 394: /* This note indicates the start of the real body of the function,
! 395: i.e. the point just after all of the parms have been moved into
! 396: their homes, etc. */
! 397: #define NOTE_INSN_FUNCTION_BEG -13
1.1 root 398:
1.1.1.4 root 399:
400: #if 0 /* These are not used, and I don't know what they were for. --rms. */
1.1 root 401: #define NOTE_DECL_NAME(INSN) ((INSN)->fld[3].rtstr)
402: #define NOTE_DECL_CODE(INSN) ((INSN)->fld[4].rtint)
403: #define NOTE_DECL_RTL(INSN) ((INSN)->fld[5].rtx)
404: #define NOTE_DECL_IDENTIFIER(INSN) ((INSN)->fld[6].rtint)
405: #define NOTE_DECL_TYPE(INSN) ((INSN)->fld[7].rtint)
1.1.1.4 root 406: #endif /* 0 */
1.1 root 407:
408: /* Names for NOTE insn's other than line numbers. */
409:
410: extern char *note_insn_name[];
411: #define GET_NOTE_INSN_NAME(NOTE_CODE) (note_insn_name[-(NOTE_CODE)])
412:
413: /* The name of a label, in case it corresponds to an explicit label
414: in the input source code. */
415: #define LABEL_NAME(LABEL) ((LABEL)->fld[4].rtstr)
416:
417: /* In jump.c, each label contains a count of the number
418: of LABEL_REFs that point at it, so unused labels can be deleted. */
419: #define LABEL_NUSES(LABEL) ((LABEL)->fld[5].rtint)
420:
421: /* In jump.c, each JUMP_INSN can point to a label that it can jump to,
422: so that if the JUMP_INSN is deleted, the label's LABEL_NUSES can
423: be decremented and possibly the label can be deleted. */
424: #define JUMP_LABEL(INSN) ((INSN)->fld[7].rtx)
425:
426: /* Once basic blocks are found in flow.c,
427: each CODE_LABEL starts a chain that goes through
428: all the LABEL_REFs that jump to that label.
429: The chain eventually winds up at the CODE_LABEL; it is circular. */
430: #define LABEL_REFS(LABEL) ((LABEL)->fld[5].rtx)
431:
432: /* This is the field in the LABEL_REF through which the circular chain
433: of references to a particular label is linked.
434: This chain is set up in flow.c. */
435:
436: #define LABEL_NEXTREF(REF) ((REF)->fld[1].rtx)
437:
438: /* Once basic blocks are found in flow.c,
439: Each LABEL_REF points to its containing instruction with this field. */
440:
441: #define CONTAINING_INSN(RTX) ((RTX)->fld[2].rtx)
442:
443: /* For a REG rtx, REGNO extracts the register number. */
444:
445: #define REGNO(RTX) ((RTX)->fld[0].rtint)
446:
447: /* For a REG rtx, REG_FUNCTION_VALUE_P is nonzero if the reg
448: is the current function's return value. */
449:
450: #define REG_FUNCTION_VALUE_P(RTX) ((RTX)->integrated)
451:
452: /* 1 in a REG rtx if it corresponds to a variable declared by the user. */
453: #define REG_USERVAR_P(RTX) ((RTX)->volatil)
454:
455: /* For a CONST_INT rtx, INTVAL extracts the integer. */
456:
1.1.1.4 root 457: #define INTVAL(RTX) ((RTX)->fld[0].rtwint)
1.1 root 458:
459: /* For a SUBREG rtx, SUBREG_REG extracts the value we want a subreg of.
460: SUBREG_WORD extracts the word-number. */
461:
462: #define SUBREG_REG(RTX) ((RTX)->fld[0].rtx)
463: #define SUBREG_WORD(RTX) ((RTX)->fld[1].rtint)
464:
1.1.1.4 root 465: /* 1 if the REG contained in SUBREG_REG is already known to be
466: sign- or zero-extended from the mode of the SUBREG to the mode of
467: the reg. SUBREG_PROMOTED_UNSIGNED_P gives the signedness of the
468: extension.
469:
470: When used as a LHS, is means that this extension must be done
471: when assigning to SUBREG_REG. */
472:
473: #define SUBREG_PROMOTED_VAR_P(RTX) ((RTX)->in_struct)
474: #define SUBREG_PROMOTED_UNSIGNED_P(RTX) ((RTX)->unchanging)
475:
1.1 root 476: /* Access various components of an ASM_OPERANDS rtx. */
477:
478: #define ASM_OPERANDS_TEMPLATE(RTX) XSTR ((RTX), 0)
479: #define ASM_OPERANDS_OUTPUT_CONSTRAINT(RTX) XSTR ((RTX), 1)
480: #define ASM_OPERANDS_OUTPUT_IDX(RTX) XINT ((RTX), 2)
481: #define ASM_OPERANDS_INPUT_VEC(RTX) XVEC ((RTX), 3)
482: #define ASM_OPERANDS_INPUT_CONSTRAINT_VEC(RTX) XVEC ((RTX), 4)
483: #define ASM_OPERANDS_INPUT(RTX, N) XVECEXP ((RTX), 3, (N))
484: #define ASM_OPERANDS_INPUT_LENGTH(RTX) XVECLEN ((RTX), 3)
485: #define ASM_OPERANDS_INPUT_CONSTRAINT(RTX, N) XSTR (XVECEXP ((RTX), 4, (N)), 0)
486: #define ASM_OPERANDS_INPUT_MODE(RTX, N) GET_MODE (XVECEXP ((RTX), 4, (N)))
487: #define ASM_OPERANDS_SOURCE_FILE(RTX) XSTR ((RTX), 5)
488: #define ASM_OPERANDS_SOURCE_LINE(RTX) XINT ((RTX), 6)
489:
490: /* For a MEM rtx, 1 if it's a volatile reference.
491: Also in an ASM_OPERANDS rtx. */
492: #define MEM_VOLATILE_P(RTX) ((RTX)->volatil)
493:
494: /* For a MEM rtx, 1 if it refers to a structure or union component. */
495: #define MEM_IN_STRUCT_P(RTX) ((RTX)->in_struct)
496:
497: /* For a LABEL_REF, 1 means that this reference is to a label outside the
498: loop containing the reference. */
499: #define LABEL_OUTSIDE_LOOP_P(RTX) ((RTX)->in_struct)
500:
1.1.1.4 root 501: /* For a LABEL_REF, 1 means it is for a nonlocal label. */
502: /* Likewise in an EXPR_LIST for a REG_LABEL note. */
503: #define LABEL_REF_NONLOCAL_P(RTX) ((RTX)->volatil)
504:
1.1 root 505: /* For a CODE_LABEL, 1 means always consider this label to be needed. */
506: #define LABEL_PRESERVE_P(RTX) ((RTX)->in_struct)
507:
508: /* For a REG, 1 means the register is used only in an exit test of a loop. */
509: #define REG_LOOP_TEST_P(RTX) ((RTX)->in_struct)
510:
511: /* During sched, for an insn, 1 means that the insn must be scheduled together
1.1.1.2 root 512: with the preceding insn. */
1.1 root 513: #define SCHED_GROUP_P(INSN) ((INSN)->in_struct)
514:
1.1.1.4 root 515: /* During sched, for the LOG_LINKS of an insn, these cache the adjusted
516: cost of the dependence link. The cost of executing an instruction
517: may vary based on how the results are used. LINK_COST_ZERO is 1 when
518: the cost through the link varies and is unchanged (i.e., the link has
519: zero additional cost). LINK_COST_FREE is 1 when the cost through the
520: link is zero (i.e., the link makes the cost free). In other cases,
521: the adjustment to the cost is recomputed each time it is needed. */
522: #define LINK_COST_ZERO(X) ((X)->jump)
523: #define LINK_COST_FREE(X) ((X)->call)
524:
1.1 root 525: /* For a SET rtx, SET_DEST is the place that is set
526: and SET_SRC is the value it is set to. */
527: #define SET_DEST(RTX) ((RTX)->fld[0].rtx)
528: #define SET_SRC(RTX) ((RTX)->fld[1].rtx)
529:
530: /* For a TRAP_IF rtx, TRAP_CONDITION is an expression. */
531: #define TRAP_CONDITION(RTX) ((RTX)->fld[0].rtx)
532:
533: /* 1 in a SYMBOL_REF if it addresses this function's constants pool. */
534: #define CONSTANT_POOL_ADDRESS_P(RTX) ((RTX)->unchanging)
535:
536: /* Flag in a SYMBOL_REF for machine-specific purposes. */
537: #define SYMBOL_REF_FLAG(RTX) ((RTX)->volatil)
538:
539: /* 1 means a SYMBOL_REF has been the library function in emit_library_call. */
540: #define SYMBOL_REF_USED(RTX) ((RTX)->used)
541:
542: /* For an INLINE_HEADER rtx, FIRST_FUNCTION_INSN is the first insn
543: of the function that is not involved in copying parameters to
544: pseudo-registers. FIRST_PARM_INSN is the very first insn of
545: the function, including the parameter copying.
546: We keep this around in case we must splice
547: this function into the assembly code at the end of the file.
548: FIRST_LABELNO is the first label number used by the function (inclusive).
549: LAST_LABELNO is the last label used by the function (exclusive).
550: MAX_REGNUM is the largest pseudo-register used by that function.
551: FUNCTION_ARGS_SIZE is the size of the argument block in the stack.
552: POPS_ARGS is the number of bytes of input arguments popped by the function
553: STACK_SLOT_LIST is the list of stack slots.
554: FUNCTION_FLAGS are where single-bit flags are saved.
555: OUTGOING_ARGS_SIZE is the size of the largest outgoing stack parameter list.
556: ORIGINAL_ARG_VECTOR is a vector of the original DECL_RTX values
557: for the function arguments.
558: ORIGINAL_DECL_INITIAL is a pointer to the original DECL_INITIAL for the
559: function.
560:
561: We want this to lay down like an INSN. The PREV_INSN field
562: is always NULL. The NEXT_INSN field always points to the
563: first function insn of the function being squirreled away. */
564:
565: #define FIRST_FUNCTION_INSN(RTX) ((RTX)->fld[2].rtx)
566: #define FIRST_PARM_INSN(RTX) ((RTX)->fld[3].rtx)
567: #define FIRST_LABELNO(RTX) ((RTX)->fld[4].rtint)
568: #define LAST_LABELNO(RTX) ((RTX)->fld[5].rtint)
569: #define MAX_PARMREG(RTX) ((RTX)->fld[6].rtint)
570: #define MAX_REGNUM(RTX) ((RTX)->fld[7].rtint)
571: #define FUNCTION_ARGS_SIZE(RTX) ((RTX)->fld[8].rtint)
572: #define POPS_ARGS(RTX) ((RTX)->fld[9].rtint)
573: #define STACK_SLOT_LIST(RTX) ((RTX)->fld[10].rtx)
574: #define FUNCTION_FLAGS(RTX) ((RTX)->fld[11].rtint)
575: #define OUTGOING_ARGS_SIZE(RTX) ((RTX)->fld[12].rtint)
576: #define ORIGINAL_ARG_VECTOR(RTX) ((RTX)->fld[13].rtvec)
577: #define ORIGINAL_DECL_INITIAL(RTX) ((RTX)->fld[14].rtx)
578:
579: /* In FUNCTION_FLAGS we save some variables computed when emitting the code
580: for the function and which must be `or'ed into the current flag values when
581: insns from that function are being inlined. */
582:
583: /* These ought to be an enum, but non-ANSI compilers don't like that. */
584: #define FUNCTION_FLAGS_CALLS_ALLOCA 01
585: #define FUNCTION_FLAGS_CALLS_SETJMP 02
586: #define FUNCTION_FLAGS_RETURNS_STRUCT 04
587: #define FUNCTION_FLAGS_RETURNS_PCC_STRUCT 010
588: #define FUNCTION_FLAGS_NEEDS_CONTEXT 020
589: #define FUNCTION_FLAGS_HAS_NONLOCAL_LABEL 040
590: #define FUNCTION_FLAGS_RETURNS_POINTER 0100
591: #define FUNCTION_FLAGS_USES_CONST_POOL 0200
592: #define FUNCTION_FLAGS_CALLS_LONGJMP 0400
593: #define FUNCTION_FLAGS_USES_PIC_OFFSET_TABLE 01000
594:
595: /* Define a macro to look for REG_INC notes,
596: but save time on machines where they never exist. */
597:
1.1.1.3 root 598: /* Don't continue this line--convex cc version 4.1 would lose. */
599: #if (defined (HAVE_PRE_INCREMENT) || defined (HAVE_PRE_DECREMENT) || defined (HAVE_POST_INCREMENT) || defined (HAVE_POST_DECREMENT))
1.1 root 600: #define FIND_REG_INC_NOTE(insn, reg) (find_reg_note ((insn), REG_INC, (reg)))
601: #else
602: #define FIND_REG_INC_NOTE(insn, reg) 0
603: #endif
604:
605: /* Indicate whether the machine has any sort of auto increment addressing.
606: If not, we can avoid checking for REG_INC notes. */
607:
1.1.1.3 root 608: /* Don't continue this line--convex cc version 4.1 would lose. */
609: #if (defined (HAVE_PRE_INCREMENT) || defined (HAVE_PRE_DECREMENT) || defined (HAVE_POST_INCREMENT) || defined (HAVE_POST_DECREMENT))
1.1 root 610: #define AUTO_INC_DEC
611: #endif
612:
613: /* Generally useful functions. */
614:
1.1.1.4 root 615: /* The following functions accept a wide integer argument. Rather than
616: having to cast on every function call, we use a macro instead, that is
617: defined here and in tree.h. */
618:
619: #ifndef exact_log2
620: #define exact_log2(N) exact_log2_wide ((HOST_WIDE_INT) (N))
621: #define floor_log2(N) floor_log2_wide ((HOST_WIDE_INT) (N))
622: #endif
623:
624: #define plus_constant(X,C) plus_constant_wide (X, (HOST_WIDE_INT) (C))
625:
626: #define plus_constant_for_output(X,C) \
627: plus_constant_for_output_wide (X, (HOST_WIDE_INT) (C))
628:
629: extern rtx plus_constant_wide PROTO((rtx, HOST_WIDE_INT));
630: extern rtx plus_constant_for_output_wide PROTO((rtx, HOST_WIDE_INT));
631:
632: #define GEN_INT(N) gen_rtx (CONST_INT, VOIDmode, (N))
633:
634: #if 0
635: /* We cannot define prototypes for the variable argument functions,
636: since they have not been ANSI-fied, and an ANSI compiler would
637: complain when compiling the definition of these functions. */
638:
639: extern rtx gen_rtx PROTO((enum rtx_code, enum machine_mode, ...));
640: extern rtvec gen_rtvec PROTO((int, ...));
641:
642: #else
1.1 root 643: extern rtx gen_rtx ();
644: extern rtvec gen_rtvec ();
1.1.1.4 root 645: #endif
646:
647: #ifdef BUFSIZ /* stdio.h has been included */
648: extern rtx read_rtx PROTO((FILE *));
649: #else
1.1 root 650: extern rtx read_rtx ();
1.1.1.4 root 651: #endif
652:
653: #if 0
654: /* At present, don't prototype xrealloc, since all of the callers don't
655: cast their pointers to char *, and all of the xrealloc's don't use
656: void * yet. */
1.1.1.5 ! root 657: extern char *xmalloc PROTO((size_t));
! 658: extern char *xrealloc PROTO((void *, size_t));
1.1.1.4 root 659: #else
1.1.1.5 ! root 660: extern char *xmalloc ();
1.1.1.4 root 661: extern char *xrealloc ();
662: #endif
663:
664: extern char *oballoc PROTO((int));
665: extern char *permalloc PROTO((int));
666: extern void free PROTO((void *));
667: extern rtx rtx_alloc PROTO((RTX_CODE));
668: extern rtvec rtvec_alloc PROTO((int));
669: extern rtx find_reg_note PROTO((rtx, enum reg_note, rtx));
670: extern rtx find_regno_note PROTO((rtx, enum reg_note, int));
671: extern HOST_WIDE_INT get_integer_term PROTO((rtx));
672: extern rtx get_related_value PROTO((rtx));
673: extern rtx single_set PROTO((rtx));
674: extern rtx find_last_value PROTO((rtx, rtx *, rtx));
675: extern rtx copy_rtx PROTO((rtx));
676: extern rtx copy_rtx_if_shared PROTO((rtx));
677: extern rtx copy_most_rtx PROTO((rtx, rtx));
678: extern rtx replace_rtx PROTO((rtx, rtx, rtx));
679: extern rtvec gen_rtvec_v PROTO((int, rtx *));
680: extern rtx gen_reg_rtx PROTO((enum machine_mode));
681: extern rtx gen_label_rtx PROTO((void));
682: extern rtx gen_inline_header_rtx PROTO((rtx, rtx, int, int, int, int, int, int, rtx, int, int, rtvec, rtx));
683: extern rtx gen_lowpart_common PROTO((enum machine_mode, rtx));
684: extern rtx gen_lowpart PROTO((enum machine_mode, rtx));
685: extern rtx gen_lowpart_if_possible PROTO((enum machine_mode, rtx));
686: extern rtx gen_highpart PROTO((enum machine_mode, rtx));
687: extern rtx gen_realpart PROTO((enum machine_mode, rtx));
688: extern rtx gen_imagpart PROTO((enum machine_mode, rtx));
689: extern rtx operand_subword PROTO((rtx, int, int, enum machine_mode));
690: extern rtx operand_subword_force PROTO((rtx, int, enum machine_mode));
691: extern int subreg_lowpart_p PROTO((rtx));
692: extern rtx make_safe_from PROTO((rtx, rtx));
693: extern rtx memory_address PROTO((enum machine_mode, rtx));
694: extern rtx get_insns PROTO((void));
695: extern rtx get_last_insn PROTO((void));
696: extern rtx get_last_insn_anywhere PROTO((void));
697: extern void start_sequence PROTO((void));
698: extern void push_to_sequence PROTO((rtx));
699: extern void end_sequence PROTO((void));
700: extern rtx gen_sequence PROTO((void));
701: extern rtx immed_double_const PROTO((HOST_WIDE_INT, HOST_WIDE_INT, enum machine_mode));
702: extern rtx force_const_mem PROTO((enum machine_mode, rtx));
703: extern rtx force_reg PROTO((enum machine_mode, rtx));
704: extern rtx get_pool_constant PROTO((rtx));
705: extern enum machine_mode get_pool_mode PROTO((rtx));
706: extern int get_pool_offset PROTO((rtx));
707: extern rtx simplify_subtraction PROTO((rtx));
708: extern rtx assign_stack_local PROTO((enum machine_mode, int, int));
709: extern rtx assign_stack_temp PROTO((enum machine_mode, int, int));
710: extern rtx protect_from_queue PROTO((rtx, int));
711: extern void emit_queue PROTO((void));
712: extern rtx emit_move_insn PROTO((rtx, rtx));
713: extern rtx emit_insn_before PROTO((rtx, rtx));
714: extern rtx emit_jump_insn_before PROTO((rtx, rtx));
715: extern rtx emit_call_insn_before PROTO((rtx, rtx));
716: extern rtx emit_barrier_before PROTO((rtx));
717: extern rtx emit_note_before PROTO((int, rtx));
718: extern rtx emit_insn_after PROTO((rtx, rtx));
719: extern rtx emit_jump_insn_after PROTO((rtx, rtx));
720: extern rtx emit_barrier_after PROTO((rtx));
721: extern rtx emit_label_after PROTO((rtx, rtx));
722: extern rtx emit_note_after PROTO((int, rtx));
723: extern rtx emit_line_note_after PROTO((char *, int, rtx));
724: extern rtx emit_insn PROTO((rtx));
725: extern rtx emit_insns PROTO((rtx));
726: extern rtx emit_insns_before PROTO((rtx, rtx));
727: extern rtx emit_jump_insn PROTO((rtx));
728: extern rtx emit_call_insn PROTO((rtx));
729: extern rtx emit_label PROTO((rtx));
730: extern rtx emit_barrier PROTO((void));
731: extern rtx emit_line_note PROTO((char *, int));
732: extern rtx emit_note PROTO((char *, int));
733: extern rtx emit_line_note_force PROTO((char *, int));
734: extern rtx make_insn_raw PROTO((rtx));
735: extern rtx previous_insn PROTO((rtx));
736: extern rtx next_insn PROTO((rtx));
737: extern rtx prev_nonnote_insn PROTO((rtx));
738: extern rtx next_nonnote_insn PROTO((rtx));
739: extern rtx prev_real_insn PROTO((rtx));
740: extern rtx next_real_insn PROTO((rtx));
741: extern rtx prev_active_insn PROTO((rtx));
742: extern rtx next_active_insn PROTO((rtx));
743: extern rtx prev_label PROTO((rtx));
744: extern rtx next_label PROTO((rtx));
745: extern rtx next_cc0_user PROTO((rtx));
746: extern rtx prev_cc0_setter PROTO((rtx));
747: extern rtx reg_set_last PROTO((rtx, rtx));
748: extern rtx next_nondeleted_insn PROTO((rtx));
749: extern enum rtx_code reverse_condition PROTO((enum rtx_code));
750: extern enum rtx_code swap_condition PROTO((enum rtx_code));
751: extern enum rtx_code unsigned_condition PROTO((enum rtx_code));
752: extern enum rtx_code signed_condition PROTO((enum rtx_code));
753: extern rtx find_equiv_reg PROTO((rtx, rtx, enum reg_class, int, short *, int, enum machine_mode));
754: extern rtx squeeze_notes PROTO((rtx, rtx));
755: extern rtx delete_insn PROTO((rtx));
756: extern void delete_jump PROTO((rtx));
757: extern rtx get_label_before PROTO((rtx));
758: extern rtx get_label_after PROTO((rtx));
759: extern rtx follow_jumps PROTO((rtx));
760: extern rtx adj_offsettable_operand PROTO((rtx, int));
761: extern rtx try_split PROTO((rtx, rtx, int));
762: extern rtx split_insns PROTO((rtx, rtx));
763: extern rtx simplify_unary_operation PROTO((enum rtx_code, enum machine_mode, rtx, enum machine_mode));
764: extern rtx simplify_binary_operation PROTO((enum rtx_code, enum machine_mode, rtx, rtx));
765: extern rtx simplify_ternary_operation PROTO((enum rtx_code, enum machine_mode, enum machine_mode, rtx, rtx, rtx));
766: extern rtx simplify_relational_operation PROTO((enum rtx_code, enum machine_mode, rtx, rtx));
767: extern rtx nonlocal_label_rtx_list PROTO((void));
768: extern rtx gen_move_insn PROTO((rtx, rtx));
769: extern rtx gen_jump PROTO((rtx));
770: extern rtx gen_beq PROTO((rtx));
771: extern rtx gen_bge PROTO((rtx));
772: extern rtx gen_ble PROTO((rtx));
773: extern rtx eliminate_constant_term PROTO((rtx, rtx *));
774: extern rtx expand_complex_abs PROTO((enum machine_mode, rtx, rtx, int));
1.1 root 775:
776: /* Maximum number of parallel sets and clobbers in any insn in this fn.
777: Always at least 3, since the combiner could put that many togetherm
778: and we want this to remain correct for all the remaining passes. */
779:
780: extern int max_parallel;
781:
1.1.1.4 root 782: extern int asm_noperands PROTO((rtx));
783: extern char *decode_asm_operands PROTO((rtx, rtx *, rtx **, char **, enum machine_mode *));
1.1 root 784:
1.1.1.4 root 785: extern enum reg_class reg_preferred_class PROTO((int));
786: extern enum reg_class reg_alternate_class PROTO((int));
1.1 root 787:
1.1.1.4 root 788: extern rtx get_first_nonparm_insn PROTO((void));
1.1 root 789:
790: /* Standard pieces of rtx, to be substituted directly into things. */
791: extern rtx pc_rtx;
792: extern rtx cc0_rtx;
793: extern rtx const0_rtx;
794: extern rtx const1_rtx;
795: extern rtx const2_rtx;
796: extern rtx constm1_rtx;
797: extern rtx const_true_rtx;
798:
799: extern rtx const_tiny_rtx[3][(int) MAX_MACHINE_MODE];
800:
801: /* Returns a constant 0 rtx in mode MODE. Integer modes are treated the
802: same as VOIDmode. */
803:
804: #define CONST0_RTX(MODE) (const_tiny_rtx[0][(int) (MODE)])
805:
806: /* Likewise, for the constants 1 and 2. */
807:
808: #define CONST1_RTX(MODE) (const_tiny_rtx[1][(int) (MODE)])
809: #define CONST2_RTX(MODE) (const_tiny_rtx[2][(int) (MODE)])
810:
811: /* All references to certain hard regs, except those created
812: by allocating pseudo regs into them (when that's possible),
813: go through these unique rtx objects. */
814: extern rtx stack_pointer_rtx;
815: extern rtx frame_pointer_rtx;
816: extern rtx arg_pointer_rtx;
817: extern rtx pic_offset_table_rtx;
818: extern rtx struct_value_rtx;
819: extern rtx struct_value_incoming_rtx;
820: extern rtx static_chain_rtx;
821: extern rtx static_chain_incoming_rtx;
822:
823: /* Virtual registers are used during RTL generation to refer to locations into
824: the stack frame when the actual location isn't known until RTL generation
825: is complete. The routine instantiate_virtual_regs replaces these with
826: the proper value, which is normally {frame,arg,stack}_pointer_rtx plus
827: a constant. */
828:
829: #define FIRST_VIRTUAL_REGISTER (FIRST_PSEUDO_REGISTER)
830:
831: /* This points to the first word of the incoming arguments passed on the stack,
832: either by the caller or by the callee when pretending it was passed by the
833: caller. */
834:
835: extern rtx virtual_incoming_args_rtx;
836:
837: #define VIRTUAL_INCOMING_ARGS_REGNUM (FIRST_VIRTUAL_REGISTER)
838:
839: /* If FRAME_GROWS_DOWNWARDS, this points to immediately above the first
840: variable on the stack. Otherwise, it points to the first variable on
841: the stack. */
842:
843: extern rtx virtual_stack_vars_rtx;
844:
845: #define VIRTUAL_STACK_VARS_REGNUM ((FIRST_VIRTUAL_REGISTER) + 1)
846:
847: /* This points to the location of dynamically-allocated memory on the stack
848: immediately after the stack pointer has been adjusted by the amount
849: desired. */
850:
851: extern rtx virtual_stack_dynamic_rtx;
852:
853: #define VIRTUAL_STACK_DYNAMIC_REGNUM ((FIRST_VIRTUAL_REGISTER) + 2)
854:
855: /* This points to the location in the stack at which outgoing arguments should
856: be written when the stack is pre-pushed (arguments pushed using push
857: insns always use sp). */
858:
859: extern rtx virtual_outgoing_args_rtx;
860:
861: #define VIRTUAL_OUTGOING_ARGS_REGNUM ((FIRST_VIRTUAL_REGISTER) + 3)
862:
863: #define LAST_VIRTUAL_REGISTER ((FIRST_VIRTUAL_REGISTER) + 3)
864:
1.1.1.4 root 865: extern rtx find_next_ref PROTO((rtx, rtx));
866: extern rtx *find_single_use PROTO((rtx, rtx, rtx *));
867:
868: /* It is hard to write the prototype for expand_expr, since it needs
869: expr.h to be included for the enumeration. */
870:
871: extern rtx expand_expr ();
872: extern rtx immed_real_const_1();
873:
874: #ifdef TREE_CODE
875: /* rtl.h and tree.h were included. */
876: extern rtx output_constant_def PROTO((tree));
877: extern rtx immed_real_const PROTO((tree));
878: extern rtx immed_real_const_1 PROTO((REAL_VALUE_TYPE, enum machine_mode));
879: extern tree make_tree PROTO((tree, rtx));
880:
881: #else
882: extern rtx output_constant_def ();
883: extern rtx immed_real_const ();
884: extern rtx immed_real_const_1 ();
885: #endif
1.1 root 886:
887: /* Define a default value for STORE_FLAG_VALUE. */
888:
889: #ifndef STORE_FLAG_VALUE
890: #define STORE_FLAG_VALUE 1
891: #endif
892:
893: /* Nonzero after end of reload pass.
894: Set to 1 or 0 by toplev.c. */
895:
896: extern int reload_completed;
897:
898: /* Set to 1 while reload_as_needed is operating.
899: Required by some machines to handle any generated moves differently. */
900:
901: extern int reload_in_progress;
902:
903: /* If this is nonzero, we do not bother generating VOLATILE
904: around volatile memory references, and we are willing to
905: output indirect addresses. If cse is to follow, we reject
906: indirect addresses so a useful potential cse is generated;
907: if it is used only once, instruction combination will produce
908: the same indirect address eventually. */
909: extern int cse_not_expected;
910:
911: /* Indexed by pseudo register number, gives the rtx for that pseudo.
912: Allocated in parallel with regno_pointer_flag. */
913: extern rtx *regno_reg_rtx;
1.1.1.5 ! root 914:
! 915: /* Translates rtx code to tree code, for those codes needed by
! 916: REAL_ARITHMETIC. */
! 917: extern int rtx_to_tree_code ();
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.