|
|
1.1 root 1: /* Register Transfer Language (RTL) definitions for GNU C-Compiler
2: Copyright (C) 1987 Free Software Foundation, Inc.
3:
4: This file is part of GNU CC.
5:
6: GNU CC is distributed in the hope that it will be useful,
7: but WITHOUT ANY WARRANTY. No author or distributor
8: accepts responsibility to anyone for the consequences of using it
9: or for whether it serves any particular purpose or works at all,
10: unless he says so in writing. Refer to the GNU CC General Public
11: License for full details.
12:
13: Everyone is granted permission to copy, modify and redistribute
14: GNU CC, but only under the conditions described in the
15: GNU CC General Public License. A copy of this license is
16: supposed to have been given to you along with GNU CC so you
17: can know your rights and responsibilities. It should be in a
18: file named COPYING. Among other things, the copyright notice
19: and this notice must be preserved on all copies. */
20:
21:
22: /* Register Transfer Language EXPRESSIONS CODES */
23:
24: #define RTX_CODE enum rtx_code
25: enum rtx_code {
26:
27: #define DEF_RTL_EXPR(ENUM, NAME, FORMAT) ENUM ,
28: #include "rtl.def" /* rtl expressions are documented here */
29: #undef DEF_RTL_EXPR
30:
31: LAST_AND_UNUSED_RTX_CODE}; /* A convienent way to get a value for
32: NUM_RTX_CODE.
33: Assumes default enum value assignement. */
34:
35: #define NUM_RTX_CODE ((int)LAST_AND_UNUSED_RTX_CODE)
36: /* The cast here, saves many elsewhere. */
37:
38: extern int rtx_length[];
39: #define GET_RTX_LENGTH(CODE) (rtx_length[(int)(CODE)])
40:
41: extern char *rtx_name[];
42: #define GET_RTX_NAME(CODE) (rtx_name[(int)(CODE)])
43:
44: extern char *rtx_format[];
45: #define GET_RTX_FORMAT(CODE) (rtx_format[(int)(CODE)])
46:
47:
48: /* Get the definition of `enum machine_mode' */
49:
50: #ifndef HAVE_MACHINE_MODES
51:
52: #define DEF_MACHMODE(SYM, NAME, TYPE, SIZE, UNIT) SYM,
53:
54: enum machine_mode {
55: #include "machmode.def"
56: MAX_MACHINE_MODE };
57:
58: #undef DEF_MACHMODE
59:
60: #define HAVE_MACHINE_MODES
61:
62: #endif /* not HAVE_MACHINE_MODES */
63:
64: #ifndef NUM_MACHINE_MODES
65: #define NUM_MACHINE_MODES (int) MAX_MACHINE_MODE
66: #endif
67:
68: /* Get the name of mode MODE as a string. */
69:
70: extern char *mode_name[];
71: #define GET_MODE_NAME(MODE) (mode_name[(int)(MODE)])
72:
73: enum mode_class { MODE_RANDOM, MODE_INT, MODE_FLOAT,
74: MODE_COMPLEX_INT, MODE_COMPLEX_FLOAT, MODE_FUNCTION };
75:
76: /* Get the general kind of object that mode MODE represents
77: (integer, floating, complex, etc.) */
78:
79: extern enum mode_class mode_class[];
80: #define GET_MODE_CLASS(MODE) (mode_class[(int)(MODE)])
81:
82: /* Get the size in bytes of an object of mode MODE. */
83:
84: extern int mode_size[];
85: #define GET_MODE_SIZE(MODE) (mode_size[(int)(MODE)])
86:
87: /* Get the size in bytes of the basic parts of an object of mode MODE. */
88:
89: extern int mode_unit_size[];
90: #define GET_MODE_UNIT_SIZE(MODE) (mode_unit_size[(int)(MODE)])
91:
92: /* Get the size in bits of an object of mode MODE. */
93:
94: #define GET_MODE_BITSIZE(MODE) (BITS_PER_UNIT * mode_size[(int)(MODE)])
95:
96: /* Get a bitmask containing 1 for all bits in a word
97: that fit within mode MODE. */
98:
99: #define GET_MODE_MASK(MODE) \
100: ((GET_MODE_BITSIZE (MODE) >= HOST_BITS_PER_INT) \
101: ? -1 : ((1 << GET_MODE_BITSIZE (MODE)) - 1))
102:
103: /* Common union for an element of an rtx. */
104:
105: typedef union rtunion_def
106: {
107: int rtint;
108: char *rtstr;
109: struct rtx_def *rtx;
110: struct rtvec_def *rtvec;
111: enum machine_mode rttype;
112: } rtunion;
113:
114: /* RTL expression ("rtx"). */
115:
116: typedef struct rtx_def
117: {
118: /* The kind of expression this is. */
119: enum rtx_code code : 16;
120: /* The kind of value the expression has. */
121: enum machine_mode mode : 8;
122: /* 1 in an INSN if it can alter flow of control
123: within this function. Not yet used! */
124: unsigned int jump : 1;
125: /* 1 in an INSN if it can call another function. Not yet used! */
126: unsigned int call : 1;
127: /* 1 in a MEM or REG if value of this expression will never change
128: during the current function, even though it is not
129: manifestly constant.
130: 1 in a SYMBOL_REF if it addresses something in the per-function
131: constants pool. */
132: unsigned int unchanging : 1;
133: /* 1 in a MEM expression if contents of memory are volatile. */
134: /* 1 in an INSN, CALL_INSN, JUMP_INSN, CODE_LABEL or BARRIER
135: if it is deleted. */
136: /* 1 in a REG expression if corresponds to a variable declared by the user.
137: 0 for an internally generated temporary. */
138: unsigned int volatil : 1;
139: /* 1 in a MEM referring to a field of a structure (not a union!).
140: 0 if the MEM was a variable or the result of a * operator in C;
141: 1 if it was the result of a . or -> operator (on a struct) in C. */
142: unsigned int in_struct : 1;
143: /* 1 if this rtx is used. This is used for copying shared structure.
144: See `unshare_all_rtl'.
145: This bit is used to detect that event. */
146: unsigned int used : 1;
147: /* Nonzero if this rtx came from procedure integration. */
148: unsigned integrated : 1;
149: /* The first element of the operands of this rtx.
150: The number of operands and their types are controlled
151: by the `code' field, according to rtl.def. */
152: rtunion fld[1];
153: } *rtx;
154:
155: #define NULL_RTX (rtx) NULL
156:
157: #define GET_CODE(RTX) ((RTX)->code)
158: #define PUT_CODE(RTX, CODE) ((RTX)->code = (CODE))
159:
160: #define GET_MODE(RTX) ((RTX)->mode)
161: #define PUT_MODE(RTX, MODE) ((RTX)->mode = (MODE))
162:
163: /* RTL vector. These appear inside RTX's when there is a need
164: for a variable number of things. The principle use is inside
165: PARALLEL expressions. */
166:
167: typedef struct rtvec_def{
168: unsigned num_elem; /* number of elements */
169: rtunion elem[1];
170: } *rtvec;
171:
172: #define NULL_RTVEC (rtvec) NULL
173:
174: #define GET_NUM_ELEM(RTVEC) ((RTVEC)->num_elem)
175: #define PUT_NUM_ELEM(RTVEC, NUM) ((RTVEC)->num_elem = (unsigned) NUM)
176:
177: /* 1 if X is a REG. */
178:
179: #define REG_P(X) (GET_CODE (X) == REG)
180:
181: /* 1 if X is a constant value that is an integer. */
182:
183: #define CONSTANT_P(X) \
184: (GET_CODE (X) == LABEL_REF || GET_CODE (X) == SYMBOL_REF \
185: || GET_CODE (X) == CONST_INT \
186: || GET_CODE (X) == CONST)
187:
188: /* General accessor macros for accessing the fields of an rtx. */
189:
190: #define XEXP(RTX, N) ((RTX)->fld[N].rtx)
191: #define XINT(RTX, N) ((RTX)->fld[N].rtint)
192: #define XSTR(RTX, N) ((RTX)->fld[N].rtstr)
193: #define XVEC(RTX, N) ((RTX)->fld[N].rtvec)
194: #define XVECLEN(RTX, N) ((RTX)->fld[N].rtvec->num_elem)
195: #define XVECEXP(RTX,N,M)((RTX)->fld[N].rtvec->elem[M].rtx)
196:
197: /* ACCESS MACROS for particular fields of insns. */
198:
199: /* Holds a unique number for each insn.
200: These are not necessarily sequentially increasing. */
201: #define INSN_UID(INSN) ((INSN)->fld[0].rtint)
202:
203: /* Chain insns together in sequence. */
204: #define PREV_INSN(INSN) ((INSN)->fld[1].rtx)
205: #define NEXT_INSN(INSN) ((INSN)->fld[2].rtx)
206:
207: /* The body of an insn. */
208: #define PATTERN(INSN) ((INSN)->fld[3].rtx)
209:
210: /* Code number of instruction, from when it was recognized.
211: -1 means this instruction has not been recognized yet. */
212: #define INSN_CODE(INSN) ((INSN)->fld[4].rtint)
213:
214: /* Set up in flow.c; empty before then.
215: Holds a chain of INSN_LIST rtx's whose first operands point at
216: previous insns with direct data-flow connections to this one.
217: That means that those insns set variables whose next use is in this insn.
218: They are always in the same basic block as this insn. */
219: #define LOG_LINKS(INSN) ((INSN)->fld[5].rtx)
220:
221: /* Holds a list of notes on what this insn does to various REGs.
222: It is a chain of EXPR_LIST rtx's, where the second operand
223: is the chain pointer and the first operand is the REG being described.
224: The mode field of the EXPR_LIST contains not a real machine mode
225: but a value that says what this note says about the REG:
226: REG_DEAD means that the REG dies in this insn.
227: REG_INC means that the REG is autoincremented or autodecremented.
228: Note that one insn can have both REG_DEAD and REG_INC for the same register
229: if the register is preincremented or predecremented in the insn
230: and not needed afterward. This can probably happen.
231: REG_EQUIV describes the insn as a whole; it says that the
232: insn sets a register to a constant value or to be equivalent to
233: a memory address. If the
234: register is spilled to the stack then the constant value
235: should be substituted for it. The contents of the REG_EQUIV
236: is the constant value or memory address, which may be different
237: from the source of the SET although it has the same value.
238: REG_EQUAL is like REG_EQUIV except that the destination
239: is only momentarily equal to the specified rtx. Therefore, it
240: cannot be used for substitution; but it can be used for cse.
241: REG_RETVAL means that this insn copies the return-value of
242: a library call out of the hard reg for return values. This note
243: is actually an INSN_LIST and it points to the first insn involved
244: in setting up arguments for the call. flow.c uses this to delete
245: the entire library call when its result is dead.
246: REG_WAS_0 says that the register set in this insn held 0 before the insn.
247: The contents of the note is the insn that stored the 0.
248: If that insn is deleted or patched to a NOTE, the REG_WAS_0 is inoperative.
249: The REG_WAS_0 note is actually an INSN_LIST, not an EXPR_LIST. */
250:
251: #define REG_NOTES(INSN) ((INSN)->fld[6].rtx)
252:
253: enum reg_note { REG_DEAD = 1, REG_INC = 2, REG_EQUIV = 3, REG_WAS_0 = 4,
254: REG_EQUAL = 5, REG_RETVAL = 6 };
255:
256: /* Extract the reg-note kind from an EXPR_LIST. */
257: #define REG_NOTE_KIND(LINK) ((enum reg_note) GET_MODE (LINK))
258:
259: /* The label-number of a code-label. The assembler label
260: is made from `L' and the label-number printed in decimal.
261: Label numbers are unique in a compilation. */
262: #define CODE_LABEL_NUMBER(INSN) ((INSN)->fld[3].rtint)
263:
264: #define LINE_NUMBER NOTE
265:
266: /* In a NOTE that is a line number, this is a string for the file name
267: that the line is in. */
268:
269: #define NOTE_SOURCE_FILE(INSN) ((INSN)->fld[3].rtstr)
270:
271: /* In a NOTE that is a line number, this is the line number.
272: Other kinds of NOTEs are identified by negative numbers here. */
273: #define NOTE_LINE_NUMBER(INSN) ((INSN)->fld[4].rtint)
274:
275: /* Codes that appear in the NOTE_LINE_NUMBER field
276: for kinds of notes that are not line numbers. */
277:
278: #define NOTE_INSN_FUNCTION_BEG 0
279: #define NOTE_INSN_DELETED -1
280: #define NOTE_INSN_BLOCK_BEG -2
281: #define NOTE_INSN_BLOCK_END -3
282: #define NOTE_INSN_LOOP_BEG -4
283: #define NOTE_INSN_LOOP_END -5
284: /* This kind of note is generated at the end of the function body,
285: just before the return insn or return label.
286: In an optimizing compilation it is deleted by the first jump optimization,
287: after enabling that optimizer to determine whether control can fall
288: off the end of the function body without a return statement. */
289: #define NOTE_INSN_FUNCTION_END -6
290: /* This kind of note is generated just after each call to `setjmp', et al. */
291: #define NOTE_INSN_SETJMP -7
292:
293: #define NOTE_DECL_NAME(INSN) ((INSN)->fld[3].rtstr)
294: #define NOTE_DECL_CODE(INSN) ((INSN)->fld[4].rtint)
295: #define NOTE_DECL_RTL(INSN) ((INSN)->fld[5].rtx)
296: #define NOTE_DECL_IDENTIFIER(INSN) ((INSN)->fld[6].rtint)
297: #define NOTE_DECL_TYPE(INSN) ((INSN)->fld[7].rtint)
298:
299: /* In jump.c, each label contains a count of the number
300: of LABEL_REFs that point at it, so unused labels can be deleted. */
301: #define LABEL_NUSES(LABEL) ((LABEL)->fld[4].rtint)
302:
303: /* In jump.c, each JUMP_INSN can point to a label that it can jump to,
304: so that if the JUMP_INSN is deleted, the label's LABEL_NUSES can
305: be decremented and possibly the label can be deleted. */
306: #define JUMP_LABEL(INSN) ((INSN)->fld[7].rtx)
307:
308: /* Once basic blocks are found in flow.c,
309: each CODE_LABEL starts a chain that goes through
310: all the LABEL_REFs that jump to that label.
311: The chain eventually winds up at the CODE_LABEL; it is circular. */
312: #define LABEL_REFS(LABEL) ((LABEL)->fld[4].rtx)
313:
314: /* This is the field in the LABEL_REF through which the circular chain
315: of references to a particular label is linked.
316: This chain is set up in flow.c. */
317:
318: #define LABEL_NEXTREF(REF) ((REF)->fld[1].rtx)
319:
320: /* Once basic blocks are found in flow.c,
321: Each LABEL_REF points to its containing instruction with this field. */
322:
323: #define CONTAINING_INSN(RTX) ((RTX)->fld[2].rtx)
324:
325: /* For a REG rtx, REGNO extracts the register number. */
326:
327: #define REGNO(RTX) ((RTX)->fld[0].rtint)
328:
329: /* For a CONST_INT rtx, INTVAL extracts the integer. */
330:
331: #define INTVAL(RTX) ((RTX)->fld[0].rtint)
332:
333: /* For a SUBREG rtx, SUBREG_REG extracts the value we want a subreg of.
334: SUBREG_WORD extracts the word-number. */
335:
336: #define SUBREG_REG(RTX) ((RTX)->fld[0].rtx)
337: #define SUBREG_WORD(RTX) ((RTX)->fld[1].rtint)
338:
339: /* For a SET rtx, SET_DEST is the place that is set
340: and SET_SRC is the value it is set to. */
341: #define SET_DEST(RTX) ((RTX)->fld[0].rtx)
342: #define SET_SRC(RTX) ((RTX)->fld[1].rtx)
343:
344: /* For an INLINE_HEADER rtx, FIRST_FUNCTION_INSN is the first insn
345: of the function that is not involved in copying parameters to
346: pseudo-registers. FIRST_PARM_INSN is the very first insn of
347: the function, including the parameter copying.
348: We keep this around in case we must splice
349: this function into the assembly code at the end of the file.
350: FIRST_LABELNO is the first label number used by the function (inclusive).
351: LAST_LABELNO is the last label used by the function (exclusive).
352: MAX_REGNUM is the largest pseudo-register used by that function.
353:
354: We want this to lay down like an INSN. The PREV_INSN field
355: is always NULL. The NEXT_INSN field always points to the
356: first function insn of the function being squirreled away. */
357:
358: #define FIRST_FUNCTION_INSN(RTX) ((RTX)->fld[2].rtx)
359: #define FIRST_PARM_INSN(RTX) ((RTX)->fld[3].rtx)
360: #define FIRST_LABELNO(RTX) ((RTX)->fld[4].rtint)
361: #define LAST_LABELNO(RTX) ((RTX)->fld[5].rtint)
362: #define MAX_PARMREG(RTX) ((RTX)->fld[6].rtint)
363: #define MAX_REGNUM(RTX) ((RTX)->fld[7].rtint)
364: #define FUNCTION_ARGS_SIZE(RTX) ((RTX)->fld[8].rtint)
365:
366: /* Generally useful functions. */
367:
368: extern rtx rtx_alloc ();
369: extern rtvec rtvec_alloc ();
370: extern rtx find_reg_note ();
371: extern rtx gen_rtx ();
372: extern rtx copy_rtx ();
373: extern rtvec gen_rtvec ();
374: extern rtvec gen_rtvec_v ();
375: extern rtx gen_reg_rtx ();
376: extern rtx gen_label_rtx ();
377: extern rtx gen_inline_header_rtx ();
378: extern rtx gen_lowpart ();
379: extern rtx gen_highpart ();
380: extern int subreg_lowpart_p ();
381: extern rtx make_safe_from ();
382: extern rtx memory_address ();
383: extern rtx get_insns ();
384: extern rtx get_last_insn ();
385: extern rtx gen_sequence ();
386: extern rtx expand_expr ();
387: extern rtx output_constant_def ();
388: extern rtx immed_real_const ();
389: extern rtx force_const_double_mem ();
390: extern rtx force_const_mem ();
391: extern rtx get_parm_real_loc ();
392: extern rtx assign_stack_local ();
393: extern rtx protect_from_queue ();
394: extern void emit_queue ();
395: extern rtx emit_move_insn ();
396: extern rtx emit_insn ();
397: extern rtx emit_jump_insn ();
398: extern rtx emit_call_insn ();
399: extern rtx emit_insn_before ();
400: extern rtx emit_insn_after ();
401: extern void emit_label ();
402: extern void emit_barrier ();
403: extern rtx emit_note ();
404: extern rtx prev_real_insn ();
405: extern rtx next_real_insn ();
406: extern rtx next_nondeleted_insn ();
407: extern rtx plus_constant ();
408: extern rtx find_equiv_reg ();
409: extern rtx delete_insn ();
410: extern rtx adj_offsetable_operand ();
411:
412: extern int emit_to_sequence;
413:
414: extern int asm_noperands ();
415: extern char *decode_asm_operands ();
416:
417: #ifdef BITS_PER_WORD
418: /* Conditional is to detect when config.h has been included. */
419: extern enum reg_class reg_preferred_class ();
420: #endif
421:
422: extern rtx get_first_nonparm_insn ();
423:
424: /* Standard pieces of rtx, to be substituted directly into things. */
425: extern rtx pc_rtx;
426: extern rtx cc0_rtx;
427: extern rtx const0_rtx;
428: extern rtx const1_rtx;
429: extern rtx fconst0_rtx;
430: extern rtx dconst0_rtx;
431:
432: /* All references to certain hard regs, except those created
433: by allocating pseudo regs into them (when that's possible),
434: go through these unique rtx objects. */
435: extern rtx stack_pointer_rtx;
436: extern rtx frame_pointer_rtx;
437: extern rtx arg_pointer_rtx;
438: extern rtx struct_value_rtx;
439: extern rtx struct_value_incoming_rtx;
440: extern rtx static_chain_rtx;
441: extern rtx static_chain_incoming_rtx;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.