rtl.h revision 50397
118334Speter/* Register Transfer Language (RTL) definitions for GNU C-Compiler 250397Sobrien Copyright (C) 1987, 91-97, 1998 Free Software Foundation, Inc. 318334Speter 418334SpeterThis file is part of GNU CC. 518334Speter 618334SpeterGNU CC is free software; you can redistribute it and/or modify 718334Speterit under the terms of the GNU General Public License as published by 818334Speterthe Free Software Foundation; either version 2, or (at your option) 918334Speterany later version. 1018334Speter 1118334SpeterGNU CC is distributed in the hope that it will be useful, 1218334Speterbut WITHOUT ANY WARRANTY; without even the implied warranty of 1318334SpeterMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1418334SpeterGNU General Public License for more details. 1518334Speter 1618334SpeterYou should have received a copy of the GNU General Public License 1718334Speteralong with GNU CC; see the file COPYING. If not, write to 1818334Speterthe Free Software Foundation, 59 Temple Place - Suite 330, 1918334SpeterBoston, MA 02111-1307, USA. */ 2018334Speter 2150397Sobrien#ifndef _RTL_H 2250397Sobrien#define _RTL_H 2318334Speter 2418334Speter#include "machmode.h" 2518334Speter 2618334Speter#undef FFS /* Some systems predefine this symbol; don't let it interfere. */ 2718334Speter#undef FLOAT /* Likewise. */ 2818334Speter#undef ABS /* Likewise. */ 2918334Speter#undef PC /* Likewise. */ 3018334Speter 3118334Speter#ifndef TREE_CODE 3218334Speterunion tree_node; 3318334Speter#endif 3418334Speter 3518334Speter/* Register Transfer Language EXPRESSIONS CODES */ 3618334Speter 3718334Speter#define RTX_CODE enum rtx_code 3818334Speterenum rtx_code { 3918334Speter 4018334Speter#define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) ENUM , 4118334Speter#include "rtl.def" /* rtl expressions are documented here */ 4218334Speter#undef DEF_RTL_EXPR 4318334Speter 4418334Speter LAST_AND_UNUSED_RTX_CODE}; /* A convenient way to get a value for 4518334Speter NUM_RTX_CODE. 4618334Speter Assumes default enum value assignment. */ 4718334Speter 4818334Speter#define NUM_RTX_CODE ((int)LAST_AND_UNUSED_RTX_CODE) 4918334Speter /* The cast here, saves many elsewhere. */ 5018334Speter 5118334Speterextern int rtx_length[]; 5250397Sobrien#define GET_RTX_LENGTH(CODE) (rtx_length[(int) (CODE)]) 5318334Speter 5418334Speterextern char *rtx_name[]; 5550397Sobrien#define GET_RTX_NAME(CODE) (rtx_name[(int) (CODE)]) 5618334Speter 5718334Speterextern char *rtx_format[]; 5850397Sobrien#define GET_RTX_FORMAT(CODE) (rtx_format[(int) (CODE)]) 5918334Speter 6018334Speterextern char rtx_class[]; 6150397Sobrien#define GET_RTX_CLASS(CODE) (rtx_class[(int) (CODE)]) 6218334Speter 6350397Sobrien/* The flags and bitfields of an ADDR_DIFF_VEC. BASE is the base label 6450397Sobrien relative to which the offsets are calculated, as explained in rtl.def. */ 6550397Sobrientypedef struct 6650397Sobrien{ 6750397Sobrien /* Set at the start of shorten_branches - ONLY WHEN OPTIMIZING - : */ 6850397Sobrien unsigned min_align: 8; 6950397Sobrien /* Flags: */ 7050397Sobrien unsigned base_after_vec: 1; /* BASE is after the ADDR_DIFF_VEC. */ 7150397Sobrien unsigned min_after_vec: 1; /* minimum address target label is after the ADDR_DIFF_VEC. */ 7250397Sobrien unsigned max_after_vec: 1; /* maximum address target label is after the ADDR_DIFF_VEC. */ 7350397Sobrien unsigned min_after_base: 1; /* minimum address target label is after BASE. */ 7450397Sobrien unsigned max_after_base: 1; /* maximum address target label is after BASE. */ 7550397Sobrien /* Set by the actual branch shortening process - ONLY WHEN OPTIMIZING - : */ 7650397Sobrien unsigned offset_unsigned: 1; /* offsets have to be treated as unsigned. */ 7750397Sobrien unsigned : 2; 7850397Sobrien unsigned scale : 8; 7950397Sobrien} addr_diff_vec_flags; 8050397Sobrien 8118334Speter/* Common union for an element of an rtx. */ 8218334Speter 8318334Spetertypedef union rtunion_def 8418334Speter{ 8518334Speter HOST_WIDE_INT rtwint; 8618334Speter int rtint; 8718334Speter char *rtstr; 8818334Speter struct rtx_def *rtx; 8918334Speter struct rtvec_def *rtvec; 9018334Speter enum machine_mode rttype; 9150397Sobrien addr_diff_vec_flags rt_addr_diff_vec_flags; 9250397Sobrien struct bitmap_head_def *rtbit; 9350397Sobrien union tree_node *rttree; 9418334Speter} rtunion; 9518334Speter 9618334Speter/* RTL expression ("rtx"). */ 9718334Speter 9818334Spetertypedef struct rtx_def 9918334Speter{ 10018334Speter#ifdef ONLY_INT_FIELDS 10118334Speter#ifdef CODE_FIELD_BUG 10218334Speter unsigned int code : 16; 10318334Speter#else 10418334Speter unsigned short code; 10518334Speter#endif 10618334Speter#else 10718334Speter /* The kind of expression this is. */ 10818334Speter enum rtx_code code : 16; 10918334Speter#endif 11018334Speter /* The kind of value the expression has. */ 11118334Speter#ifdef ONLY_INT_FIELDS 11218334Speter int mode : 8; 11318334Speter#else 11418334Speter enum machine_mode mode : 8; 11518334Speter#endif 11618334Speter /* 1 in an INSN if it can alter flow of control 11718334Speter within this function. Not yet used! */ 11818334Speter unsigned int jump : 1; 11918334Speter /* 1 in an INSN if it can call another function. Not yet used! */ 12018334Speter unsigned int call : 1; 12118334Speter /* 1 in a MEM or REG if value of this expression will never change 12218334Speter during the current function, even though it is not 12318334Speter manifestly constant. 12418334Speter 1 in a SUBREG if it is from a promoted variable that is unsigned. 12518334Speter 1 in a SYMBOL_REF if it addresses something in the per-function 12618334Speter constants pool. 12718334Speter 1 in a CALL_INSN if it is a const call. 12818334Speter 1 in a JUMP_INSN if it is a branch that should be annulled. Valid from 12918334Speter reorg until end of compilation; cleared before used. */ 13018334Speter unsigned int unchanging : 1; 13118334Speter /* 1 in a MEM expression if contents of memory are volatile. 13218334Speter 1 in an INSN, CALL_INSN, JUMP_INSN, CODE_LABEL or BARRIER 13318334Speter if it is deleted. 13418334Speter 1 in a REG expression if corresponds to a variable declared by the user. 13518334Speter 0 for an internally generated temporary. 13618334Speter In a SYMBOL_REF, this flag is used for machine-specific purposes. 13718334Speter In a LABEL_REF or in a REG_LABEL note, this is LABEL_REF_NONLOCAL_P. */ 13818334Speter unsigned int volatil : 1; 13950397Sobrien /* 1 in a MEM referring to a field of an aggregate. 14018334Speter 0 if the MEM was a variable or the result of a * operator in C; 14118334Speter 1 if it was the result of a . or -> operator (on a struct) in C. 14218334Speter 1 in a REG if the register is used only in exit code a loop. 14318334Speter 1 in a SUBREG expression if was generated from a variable with a 14418334Speter promoted mode. 14518334Speter 1 in a CODE_LABEL if the label is used for nonlocal gotos 14618334Speter and must not be deleted even if its count is zero. 14718334Speter 1 in a LABEL_REF if this is a reference to a label outside the 14818334Speter current loop. 14918334Speter 1 in an INSN, JUMP_INSN, or CALL_INSN if this insn must be scheduled 15018334Speter together with the preceding insn. Valid only within sched. 15118334Speter 1 in an INSN, JUMP_INSN, or CALL_INSN if insn is in a delay slot and 15218334Speter from the target of a branch. Valid from reorg until end of compilation; 15318334Speter cleared before used. */ 15418334Speter unsigned int in_struct : 1; 15518334Speter /* 1 if this rtx is used. This is used for copying shared structure. 15618334Speter See `unshare_all_rtl'. 15718334Speter In a REG, this is not needed for that purpose, and used instead 15818334Speter in `leaf_renumber_regs_insn'. 15918334Speter In a SYMBOL_REF, means that emit_library_call 16018334Speter has used it as the function. */ 16118334Speter unsigned int used : 1; 16218334Speter /* Nonzero if this rtx came from procedure integration. 16318334Speter In a REG, nonzero means this reg refers to the return value 16418334Speter of the current function. */ 16518334Speter unsigned integrated : 1; 16650397Sobrien /* Nonzero if this rtx is related to the call frame, either changing how 16750397Sobrien we compute the frame address or saving and restoring registers in 16850397Sobrien the prologue and epilogue. */ 16950397Sobrien unsigned frame_related : 1; 17018334Speter /* The first element of the operands of this rtx. 17118334Speter The number of operands and their types are controlled 17218334Speter by the `code' field, according to rtl.def. */ 17318334Speter rtunion fld[1]; 17418334Speter} *rtx; 17518334Speter 17650397Sobrien#include "gansidecl.h" 17718334Speter 17818334Speter#define NULL_RTX (rtx) 0 17918334Speter 18018334Speter/* Define macros to access the `code' field of the rtx. */ 18118334Speter 18218334Speter#ifdef SHORT_ENUM_BUG 18318334Speter#define GET_CODE(RTX) ((enum rtx_code) ((RTX)->code)) 18418334Speter#define PUT_CODE(RTX, CODE) ((RTX)->code = ((short) (CODE))) 18518334Speter#else 18618334Speter#define GET_CODE(RTX) ((RTX)->code) 18718334Speter#define PUT_CODE(RTX, CODE) ((RTX)->code = (CODE)) 18818334Speter#endif 18918334Speter 19018334Speter#define GET_MODE(RTX) ((RTX)->mode) 19118334Speter#define PUT_MODE(RTX, MODE) ((RTX)->mode = (MODE)) 19218334Speter 19318334Speter#define RTX_INTEGRATED_P(RTX) ((RTX)->integrated) 19418334Speter#define RTX_UNCHANGING_P(RTX) ((RTX)->unchanging) 19550397Sobrien#define RTX_FRAME_RELATED_P(RTX) ((RTX)->frame_related) 19618334Speter 19718334Speter/* RTL vector. These appear inside RTX's when there is a need 19818334Speter for a variable number of things. The principle use is inside 19918334Speter PARALLEL expressions. */ 20018334Speter 20118334Spetertypedef struct rtvec_def{ 20250397Sobrien int num_elem; /* number of elements */ 20318334Speter rtunion elem[1]; 20418334Speter} *rtvec; 20518334Speter 20618334Speter#define NULL_RTVEC (rtvec) 0 20718334Speter 20818334Speter#define GET_NUM_ELEM(RTVEC) ((RTVEC)->num_elem) 20950397Sobrien#define PUT_NUM_ELEM(RTVEC, NUM) ((RTVEC)->num_elem = (NUM)) 21018334Speter 21118334Speter#define RTVEC_ELT(RTVEC, I) ((RTVEC)->elem[(I)].rtx) 21218334Speter 21318334Speter/* 1 if X is a REG. */ 21418334Speter 21518334Speter#define REG_P(X) (GET_CODE (X) == REG) 21618334Speter 21718334Speter/* 1 if X is a constant value that is an integer. */ 21818334Speter 21918334Speter#define CONSTANT_P(X) \ 22018334Speter (GET_CODE (X) == LABEL_REF || GET_CODE (X) == SYMBOL_REF \ 22118334Speter || GET_CODE (X) == CONST_INT || GET_CODE (X) == CONST_DOUBLE \ 22250397Sobrien || GET_CODE (X) == CONST || GET_CODE (X) == HIGH \ 22350397Sobrien || GET_CODE (X) == CONSTANT_P_RTX) 22418334Speter 22518334Speter/* General accessor macros for accessing the fields of an rtx. */ 22618334Speter 22718334Speter#define XEXP(RTX, N) ((RTX)->fld[N].rtx) 22818334Speter#define XINT(RTX, N) ((RTX)->fld[N].rtint) 22918334Speter#define XWINT(RTX, N) ((RTX)->fld[N].rtwint) 23018334Speter#define XSTR(RTX, N) ((RTX)->fld[N].rtstr) 23118334Speter#define XVEC(RTX, N) ((RTX)->fld[N].rtvec) 23218334Speter#define XVECLEN(RTX, N) ((RTX)->fld[N].rtvec->num_elem) 23318334Speter#define XVECEXP(RTX,N,M)((RTX)->fld[N].rtvec->elem[M].rtx) 23450397Sobrien#define XBITMAP(RTX, N) ((RTX)->fld[N].rtbit) 23550397Sobrien#define XTREE(RTX, N) ((RTX)->fld[N].rttree) 23650397Sobrien 23718334Speter 23818334Speter/* ACCESS MACROS for particular fields of insns. */ 23918334Speter 24018334Speter/* Holds a unique number for each insn. 24118334Speter These are not necessarily sequentially increasing. */ 24218334Speter#define INSN_UID(INSN) ((INSN)->fld[0].rtint) 24318334Speter 24418334Speter/* Chain insns together in sequence. */ 24518334Speter#define PREV_INSN(INSN) ((INSN)->fld[1].rtx) 24618334Speter#define NEXT_INSN(INSN) ((INSN)->fld[2].rtx) 24718334Speter 24818334Speter/* The body of an insn. */ 24918334Speter#define PATTERN(INSN) ((INSN)->fld[3].rtx) 25018334Speter 25118334Speter/* Code number of instruction, from when it was recognized. 25218334Speter -1 means this instruction has not been recognized yet. */ 25318334Speter#define INSN_CODE(INSN) ((INSN)->fld[4].rtint) 25418334Speter 25518334Speter/* Set up in flow.c; empty before then. 25618334Speter Holds a chain of INSN_LIST rtx's whose first operands point at 25718334Speter previous insns with direct data-flow connections to this one. 25818334Speter That means that those insns set variables whose next use is in this insn. 25918334Speter They are always in the same basic block as this insn. */ 26018334Speter#define LOG_LINKS(INSN) ((INSN)->fld[5].rtx) 26118334Speter 26218334Speter/* 1 if insn has been deleted. */ 26318334Speter#define INSN_DELETED_P(INSN) ((INSN)->volatil) 26418334Speter 26518334Speter/* 1 if insn is a call to a const function. */ 26618334Speter#define CONST_CALL_P(INSN) ((INSN)->unchanging) 26718334Speter 26818334Speter/* 1 if insn is a branch that should not unconditionally execute its 26918334Speter delay slots, i.e., it is an annulled branch. */ 27018334Speter#define INSN_ANNULLED_BRANCH_P(INSN) ((INSN)->unchanging) 27118334Speter 27218334Speter/* 1 if insn is in a delay slot and is from the target of the branch. If 27318334Speter the branch insn has INSN_ANNULLED_BRANCH_P set, this insn should only be 27418334Speter executed if the branch is taken. For annulled branches with this bit 27518334Speter clear, the insn should be executed only if the branch is not taken. */ 27618334Speter#define INSN_FROM_TARGET_P(INSN) ((INSN)->in_struct) 27718334Speter 27818334Speter/* Holds a list of notes on what this insn does to various REGs. 27918334Speter It is a chain of EXPR_LIST rtx's, where the second operand 28018334Speter is the chain pointer and the first operand is the REG being described. 28118334Speter The mode field of the EXPR_LIST contains not a real machine mode 28218334Speter but a value that says what this note says about the REG: 28318334Speter REG_DEAD means that the value in REG dies in this insn (i.e., it is 28418334Speter not needed past this insn). If REG is set in this insn, the REG_DEAD 28518334Speter note may, but need not, be omitted. 28618334Speter REG_INC means that the REG is autoincremented or autodecremented. 28750397Sobrien REG_EQUIV describes the insn as a whole; it says that the insn 28850397Sobrien sets a register to a constant value or to be equivalent to a memory 28950397Sobrien address. If the register is spilled to the stack then the constant 29050397Sobrien value should be substituted for it. The contents of the REG_EQUIV 29118334Speter is the constant value or memory address, which may be different 29250397Sobrien from the source of the SET although it has the same value. A 29350397Sobrien REG_EQUIV note may also appear on an insn which copies a register 29450397Sobrien parameter to a pseudo-register, if there is a memory address which 29550397Sobrien could be used to hold that pseudo-register throughout the function. 29618334Speter REG_EQUAL is like REG_EQUIV except that the destination 29718334Speter is only momentarily equal to the specified rtx. Therefore, it 29818334Speter cannot be used for substitution; but it can be used for cse. 29918334Speter REG_RETVAL means that this insn copies the return-value of 30018334Speter a library call out of the hard reg for return values. This note 30118334Speter is actually an INSN_LIST and it points to the first insn involved 30218334Speter in setting up arguments for the call. flow.c uses this to delete 30318334Speter the entire library call when its result is dead. 30418334Speter REG_LIBCALL is the inverse of REG_RETVAL: it goes on the first insn 30518334Speter of the library call and points at the one that has the REG_RETVAL. 30618334Speter REG_WAS_0 says that the register set in this insn held 0 before the insn. 30718334Speter The contents of the note is the insn that stored the 0. 30818334Speter If that insn is deleted or patched to a NOTE, the REG_WAS_0 is inoperative. 30918334Speter The REG_WAS_0 note is actually an INSN_LIST, not an EXPR_LIST. 31018334Speter REG_NONNEG means that the register is always nonnegative during 31118334Speter the containing loop. This is used in branches so that decrement and 31218334Speter branch instructions terminating on zero can be matched. There must be 31318334Speter an insn pattern in the md file named `decrement_and_branch_until_zero' 31418334Speter or else this will never be added to any instructions. 31518334Speter REG_NO_CONFLICT means there is no conflict *after this insn* 31618334Speter between the register in the note and the destination of this insn. 31718334Speter REG_UNUSED identifies a register set in this insn and never used. 31818334Speter REG_CC_SETTER and REG_CC_USER link a pair of insns that set and use 31918334Speter CC0, respectively. Normally, these are required to be consecutive insns, 32018334Speter but we permit putting a cc0-setting insn in the delay slot of a branch 32118334Speter as long as only one copy of the insn exists. In that case, these notes 32218334Speter point from one to the other to allow code generation to determine what 32318334Speter any require information and to properly update CC_STATUS. 32418334Speter REG_LABEL points to a CODE_LABEL. Used by non-JUMP_INSNs to 32518334Speter say that the CODE_LABEL contained in the REG_LABEL note is used 32618334Speter by the insn. 32718334Speter REG_DEP_ANTI is used in LOG_LINKS which represent anti (write after read) 32818334Speter dependencies. REG_DEP_OUTPUT is used in LOG_LINKS which represent output 32918334Speter (write after write) dependencies. Data dependencies, which are the only 33018334Speter type of LOG_LINK created by flow, are represented by a 0 reg note kind. */ 33150397Sobrien/* REG_BR_PROB is attached to JUMP_INSNs and CALL_INSNs when the flag 33250397Sobrien -fbranch-probabilities is given. It has an integer value. For jumps, 33350397Sobrien it is the probability that this is a taken branch. For calls, it is the 33450397Sobrien probability that this call won't return. 33550397Sobrien REG_EXEC_COUNT is attached to the first insn of each basic block, and 33650397Sobrien the first insn after each CALL_INSN. It indicates how many times this 33750397Sobrien block was executed. 33850397Sobrien REG_SAVE_AREA is used to optimize rtl generated by dynamic stack 33950397Sobrien allocations for targets where SETJMP_VIA_SAVE_AREA is true. 34050397Sobrien REG_BR_PRED is attached to JUMP_INSNs only, it holds the branch prediction 34150397Sobrien flags computed by get_jump_flags() after dbr scheduling is complete. */ 34218334Speter 34350397Sobrien 34418334Speter#define REG_NOTES(INSN) ((INSN)->fld[6].rtx) 34518334Speter 34650397Sobrien#define ADDR_DIFF_VEC_FLAGS(RTX) ((RTX)->fld[4].rt_addr_diff_vec_flags) 34750397Sobrien 34818334Speter/* Don't forget to change reg_note_name in rtl.c. */ 34918334Speterenum reg_note { REG_DEAD = 1, REG_INC = 2, REG_EQUIV = 3, REG_WAS_0 = 4, 35018334Speter REG_EQUAL = 5, REG_RETVAL = 6, REG_LIBCALL = 7, 35118334Speter REG_NONNEG = 8, REG_NO_CONFLICT = 9, REG_UNUSED = 10, 35218334Speter REG_CC_SETTER = 11, REG_CC_USER = 12, REG_LABEL = 13, 35350397Sobrien REG_DEP_ANTI = 14, REG_DEP_OUTPUT = 15, REG_BR_PROB = 16, 35450397Sobrien REG_EXEC_COUNT = 17, REG_NOALIAS = 18, REG_SAVE_AREA = 19, 35550397Sobrien REG_BR_PRED = 20, REG_EH_CONTEXT = 21 }; 35650397Sobrien/* The base value for branch probability notes. */ 35750397Sobrien#define REG_BR_PROB_BASE 10000 35818334Speter 35918334Speter/* Define macros to extract and insert the reg-note kind in an EXPR_LIST. */ 36018334Speter#define REG_NOTE_KIND(LINK) ((enum reg_note) GET_MODE (LINK)) 36118334Speter#define PUT_REG_NOTE_KIND(LINK,KIND) PUT_MODE(LINK, (enum machine_mode) (KIND)) 36218334Speter 36318334Speter/* Names for REG_NOTE's in EXPR_LIST insn's. */ 36418334Speter 36518334Speterextern char *reg_note_name[]; 36650397Sobrien#define GET_REG_NOTE_NAME(MODE) (reg_note_name[(int) (MODE)]) 36718334Speter 36818334Speter/* This field is only present on CALL_INSNs. It holds a chain of EXPR_LIST of 36918334Speter USE and CLOBBER expressions. 37018334Speter USE expressions list the registers filled with arguments that 37118334Speter are passed to the function. 37218334Speter CLOBBER expressions document the registers explicitly clobbered 37318334Speter by this CALL_INSN. 37418334Speter Pseudo registers can not be mentioned in this list. */ 37518334Speter#define CALL_INSN_FUNCTION_USAGE(INSN) ((INSN)->fld[7].rtx) 37618334Speter 37718334Speter/* The label-number of a code-label. The assembler label 37818334Speter is made from `L' and the label-number printed in decimal. 37918334Speter Label numbers are unique in a compilation. */ 38018334Speter#define CODE_LABEL_NUMBER(INSN) ((INSN)->fld[3].rtint) 38118334Speter 38218334Speter#define LINE_NUMBER NOTE 38318334Speter 38450397Sobrien/* In a NOTE that is a line number, this is a string for the file name that the 38550397Sobrien line is in. We use the same field to record block numbers temporarily in 38650397Sobrien NOTE_INSN_BLOCK_BEG and NOTE_INSN_BLOCK_END notes. (We avoid lots of casts 38750397Sobrien between ints and pointers if we use a different macro for the block number.) 38850397Sobrien The NOTE_INSN_RANGE_{START,END} and NOTE_INSN_LIVE notes record their 38950397Sobrien information as a rtx in the field. */ 39018334Speter 39118334Speter#define NOTE_SOURCE_FILE(INSN) ((INSN)->fld[3].rtstr) 39218334Speter#define NOTE_BLOCK_NUMBER(INSN) ((INSN)->fld[3].rtint) 39350397Sobrien#define NOTE_RANGE_INFO(INSN) ((INSN)->fld[3].rtx) 39450397Sobrien#define NOTE_LIVE_INFO(INSN) ((INSN)->fld[3].rtx) 39518334Speter 39650397Sobrien/* If the NOTE_BLOCK_NUMBER field gets a -1, it means create a new 39750397Sobrien block node for a live range block. */ 39850397Sobrien#define NOTE_BLOCK_LIVE_RANGE_BLOCK -1 39950397Sobrien 40018334Speter/* In a NOTE that is a line number, this is the line number. 40118334Speter Other kinds of NOTEs are identified by negative numbers here. */ 40218334Speter#define NOTE_LINE_NUMBER(INSN) ((INSN)->fld[4].rtint) 40318334Speter 40418334Speter/* Codes that appear in the NOTE_LINE_NUMBER field 40518334Speter for kinds of notes that are not line numbers. 40618334Speter 40718334Speter Notice that we do not try to use zero here for any of 40818334Speter the special note codes because sometimes the source line 40918334Speter actually can be zero! This happens (for example) when we 41018334Speter are generating code for the per-translation-unit constructor 41118334Speter and destructor routines for some C++ translation unit. 41218334Speter 41318334Speter If you should change any of the following values, or if you 41418334Speter should add a new value here, don't forget to change the 41518334Speter note_insn_name array in rtl.c. */ 41618334Speter 41718334Speter/* This note is used to get rid of an insn 41818334Speter when it isn't safe to patch the insn out of the chain. */ 41918334Speter#define NOTE_INSN_DELETED -1 42018334Speter#define NOTE_INSN_BLOCK_BEG -2 42118334Speter#define NOTE_INSN_BLOCK_END -3 42218334Speter#define NOTE_INSN_LOOP_BEG -4 42318334Speter#define NOTE_INSN_LOOP_END -5 42418334Speter/* This kind of note is generated at the end of the function body, 42518334Speter just before the return insn or return label. 42618334Speter In an optimizing compilation it is deleted by the first jump optimization, 42718334Speter after enabling that optimizer to determine whether control can fall 42818334Speter off the end of the function body without a return statement. */ 42918334Speter#define NOTE_INSN_FUNCTION_END -6 43018334Speter/* This kind of note is generated just after each call to `setjmp', et al. */ 43118334Speter#define NOTE_INSN_SETJMP -7 43218334Speter/* Generated at the place in a loop that `continue' jumps to. */ 43318334Speter#define NOTE_INSN_LOOP_CONT -8 43418334Speter/* Generated at the start of a duplicated exit test. */ 43518334Speter#define NOTE_INSN_LOOP_VTOP -9 43618334Speter/* This marks the point immediately after the last prologue insn. */ 43718334Speter#define NOTE_INSN_PROLOGUE_END -10 43818334Speter/* This marks the point immediately prior to the first epilogue insn. */ 43918334Speter#define NOTE_INSN_EPILOGUE_BEG -11 44018334Speter/* Generated in place of user-declared labels when they are deleted. */ 44118334Speter#define NOTE_INSN_DELETED_LABEL -12 44218334Speter/* This note indicates the start of the real body of the function, 44318334Speter i.e. the point just after all of the parms have been moved into 44418334Speter their homes, etc. */ 44518334Speter#define NOTE_INSN_FUNCTION_BEG -13 44650397Sobrien/* These note where exception handling regions begin and end. */ 44750397Sobrien#define NOTE_INSN_EH_REGION_BEG -14 44850397Sobrien#define NOTE_INSN_EH_REGION_END -15 44950397Sobrien/* Generated whenever a duplicate line number note is output. For example, 45050397Sobrien one is output after the end of an inline function, in order to prevent 45150397Sobrien the line containing the inline call from being counted twice in gcov. */ 45250397Sobrien#define NOTE_REPEATED_LINE_NUMBER -16 45318334Speter 45450397Sobrien/* Start/end of a live range region, where pseudos allocated on the stack can 45550397Sobrien be allocated to temporary registers. */ 45650397Sobrien#define NOTE_INSN_RANGE_START -17 45750397Sobrien#define NOTE_INSN_RANGE_END -18 45850397Sobrien/* Record which registers are currently live. */ 45950397Sobrien#define NOTE_INSN_LIVE -19 46018334Speter 46118334Speter#if 0 /* These are not used, and I don't know what they were for. --rms. */ 46218334Speter#define NOTE_DECL_NAME(INSN) ((INSN)->fld[3].rtstr) 46318334Speter#define NOTE_DECL_CODE(INSN) ((INSN)->fld[4].rtint) 46418334Speter#define NOTE_DECL_RTL(INSN) ((INSN)->fld[5].rtx) 46518334Speter#define NOTE_DECL_IDENTIFIER(INSN) ((INSN)->fld[6].rtint) 46618334Speter#define NOTE_DECL_TYPE(INSN) ((INSN)->fld[7].rtint) 46718334Speter#endif /* 0 */ 46818334Speter 46918334Speter/* Names for NOTE insn's other than line numbers. */ 47018334Speter 47118334Speterextern char *note_insn_name[]; 47218334Speter#define GET_NOTE_INSN_NAME(NOTE_CODE) (note_insn_name[-(NOTE_CODE)]) 47318334Speter 47418334Speter/* The name of a label, in case it corresponds to an explicit label 47518334Speter in the input source code. */ 47618334Speter#define LABEL_NAME(LABEL) ((LABEL)->fld[4].rtstr) 47718334Speter 47818334Speter/* In jump.c, each label contains a count of the number 47918334Speter of LABEL_REFs that point at it, so unused labels can be deleted. */ 48018334Speter#define LABEL_NUSES(LABEL) ((LABEL)->fld[5].rtint) 48118334Speter 48250397Sobrien/* The original regno this ADDRESSOF was built for. */ 48350397Sobrien#define ADDRESSOF_REGNO(RTX) ((RTX)->fld[1].rtint) 48418334Speter 48550397Sobrien/* The variable in the register we took the address of. */ 48650397Sobrien#define ADDRESSOF_DECL(X) ((tree) XEXP ((X), 2)) 48750397Sobrien#define SET_ADDRESSOF_DECL(X, T) (XEXP ((X), 2) = (rtx) (T)) 48818334Speter 48918334Speter/* In jump.c, each JUMP_INSN can point to a label that it can jump to, 49018334Speter so that if the JUMP_INSN is deleted, the label's LABEL_NUSES can 49118334Speter be decremented and possibly the label can be deleted. */ 49218334Speter#define JUMP_LABEL(INSN) ((INSN)->fld[7].rtx) 49318334Speter 49418334Speter/* Once basic blocks are found in flow.c, 49518334Speter each CODE_LABEL starts a chain that goes through 49618334Speter all the LABEL_REFs that jump to that label. 49718334Speter The chain eventually winds up at the CODE_LABEL; it is circular. */ 49850397Sobrien#define LABEL_REFS(LABEL) ((LABEL)->fld[6].rtx) 49918334Speter 50018334Speter/* This is the field in the LABEL_REF through which the circular chain 50118334Speter of references to a particular label is linked. 50218334Speter This chain is set up in flow.c. */ 50318334Speter 50418334Speter#define LABEL_NEXTREF(REF) ((REF)->fld[1].rtx) 50518334Speter 50618334Speter/* Once basic blocks are found in flow.c, 50718334Speter Each LABEL_REF points to its containing instruction with this field. */ 50818334Speter 50918334Speter#define CONTAINING_INSN(RTX) ((RTX)->fld[2].rtx) 51018334Speter 51118334Speter/* For a REG rtx, REGNO extracts the register number. */ 51218334Speter 51318334Speter#define REGNO(RTX) ((RTX)->fld[0].rtint) 51418334Speter 51518334Speter/* For a REG rtx, REG_FUNCTION_VALUE_P is nonzero if the reg 51618334Speter is the current function's return value. */ 51718334Speter 51818334Speter#define REG_FUNCTION_VALUE_P(RTX) ((RTX)->integrated) 51918334Speter 52018334Speter/* 1 in a REG rtx if it corresponds to a variable declared by the user. */ 52118334Speter#define REG_USERVAR_P(RTX) ((RTX)->volatil) 52218334Speter 52318334Speter/* For a CONST_INT rtx, INTVAL extracts the integer. */ 52418334Speter 52518334Speter#define INTVAL(RTX) ((RTX)->fld[0].rtwint) 52618334Speter 52718334Speter/* For a SUBREG rtx, SUBREG_REG extracts the value we want a subreg of. 52818334Speter SUBREG_WORD extracts the word-number. */ 52918334Speter 53018334Speter#define SUBREG_REG(RTX) ((RTX)->fld[0].rtx) 53118334Speter#define SUBREG_WORD(RTX) ((RTX)->fld[1].rtint) 53218334Speter 53318334Speter/* 1 if the REG contained in SUBREG_REG is already known to be 53418334Speter sign- or zero-extended from the mode of the SUBREG to the mode of 53518334Speter the reg. SUBREG_PROMOTED_UNSIGNED_P gives the signedness of the 53618334Speter extension. 53718334Speter 53818334Speter When used as a LHS, is means that this extension must be done 53918334Speter when assigning to SUBREG_REG. */ 54018334Speter 54118334Speter#define SUBREG_PROMOTED_VAR_P(RTX) ((RTX)->in_struct) 54218334Speter#define SUBREG_PROMOTED_UNSIGNED_P(RTX) ((RTX)->unchanging) 54318334Speter 54418334Speter/* Access various components of an ASM_OPERANDS rtx. */ 54518334Speter 54618334Speter#define ASM_OPERANDS_TEMPLATE(RTX) XSTR ((RTX), 0) 54718334Speter#define ASM_OPERANDS_OUTPUT_CONSTRAINT(RTX) XSTR ((RTX), 1) 54818334Speter#define ASM_OPERANDS_OUTPUT_IDX(RTX) XINT ((RTX), 2) 54918334Speter#define ASM_OPERANDS_INPUT_VEC(RTX) XVEC ((RTX), 3) 55018334Speter#define ASM_OPERANDS_INPUT_CONSTRAINT_VEC(RTX) XVEC ((RTX), 4) 55118334Speter#define ASM_OPERANDS_INPUT(RTX, N) XVECEXP ((RTX), 3, (N)) 55218334Speter#define ASM_OPERANDS_INPUT_LENGTH(RTX) XVECLEN ((RTX), 3) 55318334Speter#define ASM_OPERANDS_INPUT_CONSTRAINT(RTX, N) XSTR (XVECEXP ((RTX), 4, (N)), 0) 55418334Speter#define ASM_OPERANDS_INPUT_MODE(RTX, N) GET_MODE (XVECEXP ((RTX), 4, (N))) 55518334Speter#define ASM_OPERANDS_SOURCE_FILE(RTX) XSTR ((RTX), 5) 55618334Speter#define ASM_OPERANDS_SOURCE_LINE(RTX) XINT ((RTX), 6) 55718334Speter 55818334Speter/* For a MEM rtx, 1 if it's a volatile reference. 55918334Speter Also in an ASM_OPERANDS rtx. */ 56018334Speter#define MEM_VOLATILE_P(RTX) ((RTX)->volatil) 56118334Speter 56250397Sobrien/* For a MEM rtx, 1 if it refers to a field of an aggregate. */ 56318334Speter#define MEM_IN_STRUCT_P(RTX) ((RTX)->in_struct) 56418334Speter 56550397Sobrien/* For a MEM rtx, the alias set. If 0, this MEM is not in any alias 56650397Sobrien set, and may alias anything. Otherwise, the MEM can only alias 56750397Sobrien MEMs in the same alias set. This value is set in a 56850397Sobrien language-dependent manner in the front-end, and should not be 56950397Sobrien altered in the back-end. These set numbers are tested for zero, 57050397Sobrien and compared for equality; they have no other significance. In 57150397Sobrien some front-ends, these numbers may correspond in some way to types, 57250397Sobrien or other language-level entities, but they need not, and the 57350397Sobrien back-end makes no such assumptions. */ 57450397Sobrien#define MEM_ALIAS_SET(RTX) (XINT (RTX, 1)) 57550397Sobrien 57618334Speter/* For a LABEL_REF, 1 means that this reference is to a label outside the 57718334Speter loop containing the reference. */ 57818334Speter#define LABEL_OUTSIDE_LOOP_P(RTX) ((RTX)->in_struct) 57918334Speter 58018334Speter/* For a LABEL_REF, 1 means it is for a nonlocal label. */ 58118334Speter/* Likewise in an EXPR_LIST for a REG_LABEL note. */ 58218334Speter#define LABEL_REF_NONLOCAL_P(RTX) ((RTX)->volatil) 58318334Speter 58418334Speter/* For a CODE_LABEL, 1 means always consider this label to be needed. */ 58518334Speter#define LABEL_PRESERVE_P(RTX) ((RTX)->in_struct) 58618334Speter 58718334Speter/* For a REG, 1 means the register is used only in an exit test of a loop. */ 58818334Speter#define REG_LOOP_TEST_P(RTX) ((RTX)->in_struct) 58918334Speter 59018334Speter/* During sched, for an insn, 1 means that the insn must be scheduled together 59118334Speter with the preceding insn. */ 59218334Speter#define SCHED_GROUP_P(INSN) ((INSN)->in_struct) 59318334Speter 59418334Speter/* During sched, for the LOG_LINKS of an insn, these cache the adjusted 59518334Speter cost of the dependence link. The cost of executing an instruction 59618334Speter may vary based on how the results are used. LINK_COST_ZERO is 1 when 59718334Speter the cost through the link varies and is unchanged (i.e., the link has 59818334Speter zero additional cost). LINK_COST_FREE is 1 when the cost through the 59918334Speter link is zero (i.e., the link makes the cost free). In other cases, 60018334Speter the adjustment to the cost is recomputed each time it is needed. */ 60118334Speter#define LINK_COST_ZERO(X) ((X)->jump) 60218334Speter#define LINK_COST_FREE(X) ((X)->call) 60318334Speter 60418334Speter/* For a SET rtx, SET_DEST is the place that is set 60518334Speter and SET_SRC is the value it is set to. */ 60618334Speter#define SET_DEST(RTX) ((RTX)->fld[0].rtx) 60718334Speter#define SET_SRC(RTX) ((RTX)->fld[1].rtx) 60818334Speter 60918334Speter/* For a TRAP_IF rtx, TRAP_CONDITION is an expression. */ 61018334Speter#define TRAP_CONDITION(RTX) ((RTX)->fld[0].rtx) 61150397Sobrien#define TRAP_CODE(RTX) (RTX)->fld[1].rtx 61218334Speter 61318334Speter/* 1 in a SYMBOL_REF if it addresses this function's constants pool. */ 61418334Speter#define CONSTANT_POOL_ADDRESS_P(RTX) ((RTX)->unchanging) 61518334Speter 61618334Speter/* Flag in a SYMBOL_REF for machine-specific purposes. */ 61718334Speter#define SYMBOL_REF_FLAG(RTX) ((RTX)->volatil) 61818334Speter 61918334Speter/* 1 means a SYMBOL_REF has been the library function in emit_library_call. */ 62018334Speter#define SYMBOL_REF_USED(RTX) ((RTX)->used) 62118334Speter 62218334Speter/* For an INLINE_HEADER rtx, FIRST_FUNCTION_INSN is the first insn 62318334Speter of the function that is not involved in copying parameters to 62418334Speter pseudo-registers. FIRST_PARM_INSN is the very first insn of 62518334Speter the function, including the parameter copying. 62618334Speter We keep this around in case we must splice 62718334Speter this function into the assembly code at the end of the file. 62818334Speter FIRST_LABELNO is the first label number used by the function (inclusive). 62918334Speter LAST_LABELNO is the last label used by the function (exclusive). 63018334Speter MAX_REGNUM is the largest pseudo-register used by that function. 63118334Speter FUNCTION_ARGS_SIZE is the size of the argument block in the stack. 63218334Speter POPS_ARGS is the number of bytes of input arguments popped by the function 63318334Speter STACK_SLOT_LIST is the list of stack slots. 63418334Speter FORCED_LABELS is the list of labels whose address was taken. 63518334Speter FUNCTION_FLAGS are where single-bit flags are saved. 63618334Speter OUTGOING_ARGS_SIZE is the size of the largest outgoing stack parameter list. 63718334Speter ORIGINAL_ARG_VECTOR is a vector of the original DECL_RTX values 63818334Speter for the function arguments. 63918334Speter ORIGINAL_DECL_INITIAL is a pointer to the original DECL_INITIAL for the 64018334Speter function. 64150397Sobrien INLINE_REGNO_REG_RTX, INLINE_REGNO_POINTER_FLAG, and 64250397Sobrien INLINE_REGNO_POINTER_ALIGN are pointers to the corresponding arrays. 64318334Speter 64418334Speter We want this to lay down like an INSN. The PREV_INSN field 64518334Speter is always NULL. The NEXT_INSN field always points to the 64618334Speter first function insn of the function being squirreled away. */ 64718334Speter 64818334Speter#define FIRST_FUNCTION_INSN(RTX) ((RTX)->fld[2].rtx) 64918334Speter#define FIRST_PARM_INSN(RTX) ((RTX)->fld[3].rtx) 65018334Speter#define FIRST_LABELNO(RTX) ((RTX)->fld[4].rtint) 65118334Speter#define LAST_LABELNO(RTX) ((RTX)->fld[5].rtint) 65218334Speter#define MAX_PARMREG(RTX) ((RTX)->fld[6].rtint) 65318334Speter#define MAX_REGNUM(RTX) ((RTX)->fld[7].rtint) 65418334Speter#define FUNCTION_ARGS_SIZE(RTX) ((RTX)->fld[8].rtint) 65518334Speter#define POPS_ARGS(RTX) ((RTX)->fld[9].rtint) 65618334Speter#define STACK_SLOT_LIST(RTX) ((RTX)->fld[10].rtx) 65718334Speter#define FORCED_LABELS(RTX) ((RTX)->fld[11].rtx) 65818334Speter#define FUNCTION_FLAGS(RTX) ((RTX)->fld[12].rtint) 65918334Speter#define OUTGOING_ARGS_SIZE(RTX) ((RTX)->fld[13].rtint) 66018334Speter#define ORIGINAL_ARG_VECTOR(RTX) ((RTX)->fld[14].rtvec) 66118334Speter#define ORIGINAL_DECL_INITIAL(RTX) ((RTX)->fld[15].rtx) 66250397Sobrien#define INLINE_REGNO_REG_RTX(RTX) ((RTX)->fld[16].rtvec) 66350397Sobrien#define INLINE_REGNO_POINTER_FLAG(RTX) ((RTX)->fld[17].rtstr) 66450397Sobrien#define INLINE_REGNO_POINTER_ALIGN(RTX) ((RTX)->fld[18].rtstr) 66550397Sobrien#define PARMREG_STACK_LOC(RTX) ((RTX)->fld[19].rtvec) 66618334Speter 66718334Speter/* In FUNCTION_FLAGS we save some variables computed when emitting the code 66818334Speter for the function and which must be `or'ed into the current flag values when 66918334Speter insns from that function are being inlined. */ 67018334Speter 67118334Speter/* These ought to be an enum, but non-ANSI compilers don't like that. */ 67218334Speter#define FUNCTION_FLAGS_CALLS_ALLOCA 01 67318334Speter#define FUNCTION_FLAGS_CALLS_SETJMP 02 67418334Speter#define FUNCTION_FLAGS_RETURNS_STRUCT 04 67518334Speter#define FUNCTION_FLAGS_RETURNS_PCC_STRUCT 010 67618334Speter#define FUNCTION_FLAGS_NEEDS_CONTEXT 020 67718334Speter#define FUNCTION_FLAGS_HAS_NONLOCAL_LABEL 040 67818334Speter#define FUNCTION_FLAGS_RETURNS_POINTER 0100 67918334Speter#define FUNCTION_FLAGS_USES_CONST_POOL 0200 68018334Speter#define FUNCTION_FLAGS_CALLS_LONGJMP 0400 68118334Speter#define FUNCTION_FLAGS_USES_PIC_OFFSET_TABLE 01000 68218334Speter 68318334Speter/* Define a macro to look for REG_INC notes, 68418334Speter but save time on machines where they never exist. */ 68518334Speter 68618334Speter/* Don't continue this line--convex cc version 4.1 would lose. */ 68718334Speter#if (defined (HAVE_PRE_INCREMENT) || defined (HAVE_PRE_DECREMENT) || defined (HAVE_POST_INCREMENT) || defined (HAVE_POST_DECREMENT)) 68818334Speter#define FIND_REG_INC_NOTE(insn, reg) (find_reg_note ((insn), REG_INC, (reg))) 68918334Speter#else 69018334Speter#define FIND_REG_INC_NOTE(insn, reg) 0 69118334Speter#endif 69218334Speter 69318334Speter/* Indicate whether the machine has any sort of auto increment addressing. 69418334Speter If not, we can avoid checking for REG_INC notes. */ 69518334Speter 69618334Speter/* Don't continue this line--convex cc version 4.1 would lose. */ 69718334Speter#if (defined (HAVE_PRE_INCREMENT) || defined (HAVE_PRE_DECREMENT) || defined (HAVE_POST_INCREMENT) || defined (HAVE_POST_DECREMENT)) 69818334Speter#define AUTO_INC_DEC 69918334Speter#endif 70050397Sobrien 70150397Sobrien/* Accessors for RANGE_INFO. */ 70250397Sobrien/* For RANGE_{START,END} notes return the RANGE_START note. */ 70350397Sobrien#define RANGE_INFO_NOTE_START(INSN) (XEXP (INSN, 0)) 70450397Sobrien 70550397Sobrien/* For RANGE_{START,END} notes return the RANGE_START note. */ 70650397Sobrien#define RANGE_INFO_NOTE_END(INSN) (XEXP (INSN, 1)) 70750397Sobrien 70850397Sobrien/* For RANGE_{START,END} notes, return the vector containing the registers used 70950397Sobrien in the range. */ 71050397Sobrien#define RANGE_INFO_REGS(INSN) (XVEC (INSN, 2)) 71150397Sobrien#define RANGE_INFO_REGS_REG(INSN, N) (XVECEXP (INSN, 2, N)) 71250397Sobrien#define RANGE_INFO_NUM_REGS(INSN) (XVECLEN (INSN, 2)) 71350397Sobrien 71450397Sobrien/* For RANGE_{START,END} notes, the number of calls within the range. */ 71550397Sobrien#define RANGE_INFO_NCALLS(INSN) (XINT (INSN, 3)) 71650397Sobrien 71750397Sobrien/* For RANGE_{START,END} notes, the number of insns within the range. */ 71850397Sobrien#define RANGE_INFO_NINSNS(INSN) (XINT (INSN, 4)) 71950397Sobrien 72050397Sobrien/* For RANGE_{START,END} notes, a unique # to identify this range. */ 72150397Sobrien#define RANGE_INFO_UNIQUE(INSN) (XINT (INSN, 5)) 72250397Sobrien 72350397Sobrien/* For RANGE_{START,END} notes, the basic block # the range starts with. */ 72450397Sobrien#define RANGE_INFO_BB_START(INSN) (XINT (INSN, 6)) 72550397Sobrien 72650397Sobrien/* For RANGE_{START,END} notes, the basic block # the range ends with. */ 72750397Sobrien#define RANGE_INFO_BB_END(INSN) (XINT (INSN, 7)) 72850397Sobrien 72950397Sobrien/* For RANGE_{START,END} notes, the loop depth the range is in. */ 73050397Sobrien#define RANGE_INFO_LOOP_DEPTH(INSN) (XINT (INSN, 8)) 73150397Sobrien 73250397Sobrien/* For RANGE_{START,END} notes, the bitmap of live registers at the start 73350397Sobrien of the range. */ 73450397Sobrien#define RANGE_INFO_LIVE_START(INSN) (XBITMAP (INSN, 9)) 73550397Sobrien 73650397Sobrien/* For RANGE_{START,END} notes, the bitmap of live registers at the end 73750397Sobrien of the range. */ 73850397Sobrien#define RANGE_INFO_LIVE_END(INSN) (XBITMAP (INSN, 10)) 73950397Sobrien 74050397Sobrien/* For RANGE_START notes, the marker # of the start of the range. */ 74150397Sobrien#define RANGE_INFO_MARKER_START(INSN) (XINT (INSN, 11)) 74250397Sobrien 74350397Sobrien/* For RANGE_START notes, the marker # of the end of the range. */ 74450397Sobrien#define RANGE_INFO_MARKER_END(INSN) (XINT (INSN, 12)) 74550397Sobrien 74650397Sobrien/* Original pseudo register # for a live range note. */ 74750397Sobrien#define RANGE_REG_PSEUDO(INSN,N) (XINT (XVECEXP (INSN, 2, N), 0)) 74850397Sobrien 74950397Sobrien/* Pseudo register # original register is copied into or -1. */ 75050397Sobrien#define RANGE_REG_COPY(INSN,N) (XINT (XVECEXP (INSN, 2, N), 1)) 75150397Sobrien 75250397Sobrien/* How many times a register in a live range note was referenced. */ 75350397Sobrien#define RANGE_REG_REFS(INSN,N) (XINT (XVECEXP (INSN, 2, N), 2)) 75450397Sobrien 75550397Sobrien/* How many times a register in a live range note was set. */ 75650397Sobrien#define RANGE_REG_SETS(INSN,N) (XINT (XVECEXP (INSN, 2, N), 3)) 75750397Sobrien 75850397Sobrien/* How many times a register in a live range note died. */ 75950397Sobrien#define RANGE_REG_DEATHS(INSN,N) (XINT (XVECEXP (INSN, 2, N), 4)) 76050397Sobrien 76150397Sobrien/* Whether the original value is needed to be copied into the range register at 76250397Sobrien the start of the range. */ 76350397Sobrien#define RANGE_REG_COPY_FLAGS(INSN,N) (XINT (XVECEXP (INSN, 2, N), 5)) 76450397Sobrien 76550397Sobrien/* # of insns the register copy is live over. */ 76650397Sobrien#define RANGE_REG_LIVE_LENGTH(INSN,N) (XINT (XVECEXP (INSN, 2, N), 6)) 76750397Sobrien 76850397Sobrien/* # of calls the register copy is live over. */ 76950397Sobrien#define RANGE_REG_N_CALLS(INSN,N) (XINT (XVECEXP (INSN, 2, N), 7)) 77050397Sobrien 77150397Sobrien/* DECL_NODE pointer of the declaration if the register is a user defined 77250397Sobrien variable. */ 77350397Sobrien#define RANGE_REG_SYMBOL_NODE(INSN,N) (XTREE (XVECEXP (INSN, 2, N), 8)) 77450397Sobrien 77550397Sobrien/* BLOCK_NODE pointer to the block the variable is declared in if the 77650397Sobrien register is a user defined variable. */ 77750397Sobrien#define RANGE_REG_BLOCK_NODE(INSN,N) (XTREE (XVECEXP (INSN, 2, N), 9)) 77850397Sobrien 77950397Sobrien/* EXPR_LIST of the distinct ranges a variable is in. */ 78050397Sobrien#define RANGE_VAR_LIST(INSN) (XEXP (INSN, 0)) 78150397Sobrien 78250397Sobrien/* Block a variable is declared in. */ 78350397Sobrien#define RANGE_VAR_BLOCK(INSN) (XTREE (INSN, 1)) 78450397Sobrien 78550397Sobrien/* # of distinct ranges a variable is in. */ 78650397Sobrien#define RANGE_VAR_NUM(INSN) (XINT (INSN, 2)) 78750397Sobrien 78850397Sobrien/* For a NOTE_INSN_LIVE note, the registers which are currently live. */ 78950397Sobrien#define RANGE_LIVE_BITMAP(INSN) (XBITMAP (INSN, 0)) 79050397Sobrien 79150397Sobrien/* For a NOTE_INSN_LIVE note, the original basic block number. */ 79250397Sobrien#define RANGE_LIVE_ORIG_BLOCK(INSN) (XINT (INSN, 1)) 79318334Speter 79418334Speter/* Generally useful functions. */ 79518334Speter 79618334Speter/* The following functions accept a wide integer argument. Rather than 79718334Speter having to cast on every function call, we use a macro instead, that is 79818334Speter defined here and in tree.h. */ 79918334Speter 80018334Speter#ifndef exact_log2 80150397Sobrien#define exact_log2(N) exact_log2_wide ((unsigned HOST_WIDE_INT) (N)) 80250397Sobrien#define floor_log2(N) floor_log2_wide ((unsigned HOST_WIDE_INT) (N)) 80318334Speter#endif 80450397Sobrienextern int exact_log2_wide PROTO((unsigned HOST_WIDE_INT)); 80550397Sobrienextern int floor_log2_wide PROTO((unsigned HOST_WIDE_INT)); 80618334Speter 80750397Sobrien/* In expmed.c */ 80850397Sobrienextern int ceil_log2 PROTO((unsigned HOST_WIDE_INT)); 80950397Sobrien 81018334Speter#define plus_constant(X,C) plus_constant_wide (X, (HOST_WIDE_INT) (C)) 81118334Speter 81218334Speter#define plus_constant_for_output(X,C) \ 81318334Speter plus_constant_for_output_wide (X, (HOST_WIDE_INT) (C)) 81418334Speter 81550397Sobrien/* In explow.c */ 81618334Speterextern rtx plus_constant_wide PROTO((rtx, HOST_WIDE_INT)); 81718334Speterextern rtx plus_constant_for_output_wide PROTO((rtx, HOST_WIDE_INT)); 81850397Sobrienextern void optimize_save_area_alloca PROTO((rtx)); 81918334Speter 82018334Speterextern rtx gen_rtx PVPROTO((enum rtx_code, 82118334Speter enum machine_mode, ...)); 82218334Speterextern rtvec gen_rtvec PVPROTO((int, ...)); 82318334Speter 82450397Sobrien#ifdef BUFSIZ 82550397Sobrienextern rtx read_rtx PROTO((FILE *)); 82650397Sobrien#endif 82718334Speter 82818334Speter#if 0 82918334Speter/* At present, don't prototype xrealloc, since all of the callers don't 83018334Speter cast their pointers to char *, and all of the xrealloc's don't use 83118334Speter void * yet. */ 83218334Speterextern char *xmalloc PROTO((size_t)); 83350397Sobrienextern char *xcalloc PROTO((size_t, size_t)); 83418334Speterextern char *xrealloc PROTO((void *, size_t)); 83518334Speter#else 83618334Speterextern char *xmalloc (); 83750397Sobrienextern char *xcalloc (); 83818334Speterextern char *xrealloc (); 83918334Speter#endif 84018334Speter 84118334Speterextern char *oballoc PROTO((int)); 84218334Speterextern char *permalloc PROTO((int)); 84318334Speterextern rtx rtx_alloc PROTO((RTX_CODE)); 84418334Speterextern rtvec rtvec_alloc PROTO((int)); 84518334Speterextern rtx copy_rtx PROTO((rtx)); 84618334Speterextern rtx copy_rtx_if_shared PROTO((rtx)); 84718334Speterextern rtx copy_most_rtx PROTO((rtx, rtx)); 84818334Speterextern rtvec gen_rtvec_v PROTO((int, rtx *)); 84950397Sobrienextern rtvec gen_rtvec_vv PROTO((int, rtunion *)); 85018334Speterextern rtx gen_reg_rtx PROTO((enum machine_mode)); 85118334Speterextern rtx gen_label_rtx PROTO((void)); 85218334Speterextern rtx gen_inline_header_rtx PROTO((rtx, rtx, int, int, int, int, 85318334Speter int, int, rtx, rtx, int, int, 85450397Sobrien rtvec, rtx, 85550397Sobrien rtvec, char *, char *, rtvec)); 85618334Speterextern rtx gen_lowpart_common PROTO((enum machine_mode, rtx)); 85718334Speterextern rtx gen_lowpart PROTO((enum machine_mode, rtx)); 85818334Speterextern rtx gen_lowpart_if_possible PROTO((enum machine_mode, rtx)); 85918334Speterextern rtx gen_highpart PROTO((enum machine_mode, rtx)); 86018334Speterextern rtx gen_realpart PROTO((enum machine_mode, rtx)); 86118334Speterextern rtx gen_imagpart PROTO((enum machine_mode, rtx)); 86218334Speterextern rtx operand_subword PROTO((rtx, int, int, enum machine_mode)); 86318334Speterextern rtx operand_subword_force PROTO((rtx, int, enum machine_mode)); 86418334Speterextern int subreg_lowpart_p PROTO((rtx)); 86518334Speterextern rtx make_safe_from PROTO((rtx, rtx)); 86618334Speterextern rtx convert_memory_address PROTO((enum machine_mode, rtx)); 86718334Speterextern rtx memory_address PROTO((enum machine_mode, rtx)); 86818334Speterextern rtx get_insns PROTO((void)); 86918334Speterextern rtx get_last_insn PROTO((void)); 87018334Speterextern rtx get_last_insn_anywhere PROTO((void)); 87118334Speterextern void start_sequence PROTO((void)); 87218334Speterextern void push_to_sequence PROTO((rtx)); 87318334Speterextern void end_sequence PROTO((void)); 87418334Speterextern rtx gen_sequence PROTO((void)); 87518334Speterextern rtx immed_double_const PROTO((HOST_WIDE_INT, HOST_WIDE_INT, enum machine_mode)); 87618334Speterextern rtx force_const_mem PROTO((enum machine_mode, rtx)); 87718334Speterextern rtx force_reg PROTO((enum machine_mode, rtx)); 87818334Speterextern rtx get_pool_constant PROTO((rtx)); 87918334Speterextern enum machine_mode get_pool_mode PROTO((rtx)); 88018334Speterextern int get_pool_offset PROTO((rtx)); 88118334Speterextern rtx simplify_subtraction PROTO((rtx)); 88250397Sobrienextern rtx assign_stack_local PROTO((enum machine_mode, 88350397Sobrien HOST_WIDE_INT, int)); 88450397Sobrienextern rtx assign_stack_temp PROTO((enum machine_mode, 88550397Sobrien HOST_WIDE_INT, int)); 88650397Sobrienextern rtx assign_temp PROTO((union tree_node *, 88750397Sobrien int, int, int)); 88818334Speterextern rtx protect_from_queue PROTO((rtx, int)); 88918334Speterextern void emit_queue PROTO((void)); 89018334Speterextern rtx emit_move_insn PROTO((rtx, rtx)); 89118334Speterextern rtx emit_insn_before PROTO((rtx, rtx)); 89218334Speterextern rtx emit_jump_insn_before PROTO((rtx, rtx)); 89318334Speterextern rtx emit_call_insn_before PROTO((rtx, rtx)); 89418334Speterextern rtx emit_barrier_before PROTO((rtx)); 89518334Speterextern rtx emit_note_before PROTO((int, rtx)); 89618334Speterextern rtx emit_insn_after PROTO((rtx, rtx)); 89718334Speterextern rtx emit_jump_insn_after PROTO((rtx, rtx)); 89818334Speterextern rtx emit_barrier_after PROTO((rtx)); 89918334Speterextern rtx emit_label_after PROTO((rtx, rtx)); 90018334Speterextern rtx emit_note_after PROTO((int, rtx)); 90118334Speterextern rtx emit_line_note_after PROTO((char *, int, rtx)); 90218334Speterextern rtx emit_insn PROTO((rtx)); 90318334Speterextern rtx emit_insns PROTO((rtx)); 90418334Speterextern rtx emit_insns_before PROTO((rtx, rtx)); 90518334Speterextern rtx emit_insns_after PROTO((rtx, rtx)); 90618334Speterextern rtx emit_jump_insn PROTO((rtx)); 90718334Speterextern rtx emit_call_insn PROTO((rtx)); 90818334Speterextern rtx emit_label PROTO((rtx)); 90918334Speterextern rtx emit_barrier PROTO((void)); 91018334Speterextern rtx emit_line_note PROTO((char *, int)); 91118334Speterextern rtx emit_note PROTO((char *, int)); 91218334Speterextern rtx emit_line_note_force PROTO((char *, int)); 91318334Speterextern rtx make_insn_raw PROTO((rtx)); 91418334Speterextern rtx previous_insn PROTO((rtx)); 91518334Speterextern rtx next_insn PROTO((rtx)); 91618334Speterextern rtx prev_nonnote_insn PROTO((rtx)); 91718334Speterextern rtx next_nonnote_insn PROTO((rtx)); 91818334Speterextern rtx prev_real_insn PROTO((rtx)); 91918334Speterextern rtx next_real_insn PROTO((rtx)); 92018334Speterextern rtx prev_active_insn PROTO((rtx)); 92118334Speterextern rtx next_active_insn PROTO((rtx)); 92218334Speterextern rtx prev_label PROTO((rtx)); 92318334Speterextern rtx next_label PROTO((rtx)); 92418334Speterextern rtx next_cc0_user PROTO((rtx)); 92518334Speterextern rtx prev_cc0_setter PROTO((rtx)); 92618334Speterextern rtx next_nondeleted_insn PROTO((rtx)); 92718334Speterextern enum rtx_code reverse_condition PROTO((enum rtx_code)); 92818334Speterextern enum rtx_code swap_condition PROTO((enum rtx_code)); 92918334Speterextern enum rtx_code unsigned_condition PROTO((enum rtx_code)); 93018334Speterextern enum rtx_code signed_condition PROTO((enum rtx_code)); 93118334Speterextern rtx find_equiv_reg PROTO((rtx, rtx, enum reg_class, int, short *, int, enum machine_mode)); 93218334Speterextern rtx squeeze_notes PROTO((rtx, rtx)); 93318334Speterextern rtx delete_insn PROTO((rtx)); 93418334Speterextern void delete_jump PROTO((rtx)); 93518334Speterextern rtx get_label_before PROTO((rtx)); 93618334Speterextern rtx get_label_after PROTO((rtx)); 93718334Speterextern rtx follow_jumps PROTO((rtx)); 93818334Speterextern rtx adj_offsettable_operand PROTO((rtx, int)); 93918334Speterextern rtx try_split PROTO((rtx, rtx, int)); 94018334Speterextern rtx split_insns PROTO((rtx, rtx)); 94118334Speterextern rtx simplify_unary_operation PROTO((enum rtx_code, enum machine_mode, rtx, enum machine_mode)); 94218334Speterextern rtx simplify_binary_operation PROTO((enum rtx_code, enum machine_mode, rtx, rtx)); 94318334Speterextern rtx simplify_ternary_operation PROTO((enum rtx_code, enum machine_mode, enum machine_mode, rtx, rtx, rtx)); 94418334Speterextern rtx simplify_relational_operation PROTO((enum rtx_code, enum machine_mode, rtx, rtx)); 94518334Speterextern rtx nonlocal_label_rtx_list PROTO((void)); 94618334Speterextern rtx gen_move_insn PROTO((rtx, rtx)); 94718334Speterextern rtx gen_jump PROTO((rtx)); 94818334Speterextern rtx gen_beq PROTO((rtx)); 94918334Speterextern rtx gen_bge PROTO((rtx)); 95018334Speterextern rtx gen_ble PROTO((rtx)); 95150397Sobrienextern rtx gen_mem_addressof PROTO((rtx, union tree_node *)); 95218334Speterextern rtx eliminate_constant_term PROTO((rtx, rtx *)); 95318334Speterextern rtx expand_complex_abs PROTO((enum machine_mode, rtx, rtx, int)); 95418334Speterextern enum machine_mode choose_hard_reg_mode PROTO((int, int)); 95550397Sobrienextern int rtx_varies_p PROTO((rtx)); 95650397Sobrienextern int may_trap_p PROTO((rtx)); 95750397Sobrienextern int side_effects_p PROTO((rtx)); 95850397Sobrienextern int volatile_refs_p PROTO((rtx)); 95950397Sobrienextern int volatile_insn_p PROTO((rtx)); 96050397Sobrienextern void remove_note PROTO((rtx, rtx)); 96150397Sobrienextern int refers_to_regno_p PROTO((int, int, rtx, rtx *)); 96250397Sobrienextern int reg_overlap_mentioned_p PROTO((rtx, rtx)); 96318334Speter 96450397Sobrien/* Functions in rtlanal.c */ 96550397Sobrien 96650397Sobrienextern int rtx_unstable_p PROTO((rtx)); 96750397Sobrienextern int rtx_varies_p PROTO((rtx)); 96850397Sobrienextern int rtx_addr_varies_p PROTO((rtx)); 96950397Sobrienextern HOST_WIDE_INT get_integer_term PROTO((rtx)); 97050397Sobrienextern rtx get_related_value PROTO((rtx)); 97150397Sobrienextern int reg_mentioned_p PROTO((rtx, rtx)); 97250397Sobrienextern int reg_referenced_p PROTO((rtx, rtx)); 97350397Sobrienextern int reg_used_between_p PROTO((rtx, rtx, rtx)); 97450397Sobrienextern int reg_referenced_between_p PROTO((rtx, rtx, rtx)); 97550397Sobrienextern int reg_set_between_p PROTO((rtx, rtx, rtx)); 97650397Sobrienextern int modified_between_p PROTO((rtx, rtx, rtx)); 97750397Sobrienextern int no_labels_between_p PROTO((rtx, rtx)); 97850397Sobrienextern int modified_in_p PROTO((rtx, rtx)); 97950397Sobrienextern int reg_set_p PROTO((rtx, rtx)); 98050397Sobrienextern rtx single_set PROTO((rtx)); 98150397Sobrienextern rtx find_last_value PROTO((rtx, rtx *, rtx)); 98250397Sobrienextern int refers_to_regno_p PROTO((int, int, rtx, rtx *)); 98350397Sobrienextern int reg_overlap_mentioned_p PROTO((rtx, rtx)); 98450397Sobrienextern rtx find_use_as_address PROTO((rtx, rtx, HOST_WIDE_INT)); 98550397Sobrienextern void note_stores PROTO((rtx, void (*)())); 98650397Sobrienextern rtx reg_set_last PROTO((rtx, rtx)); 98750397Sobrienextern int rtx_equal_p PROTO((rtx, rtx)); 98850397Sobrienextern int dead_or_set_p PROTO((rtx, rtx)); 98950397Sobrienextern int dead_or_set_regno_p PROTO((rtx, int)); 99050397Sobrienextern rtx find_reg_note PROTO((rtx, enum reg_note, rtx)); 99150397Sobrienextern rtx find_regno_note PROTO((rtx, enum reg_note, int)); 99250397Sobrienextern int find_reg_fusage PROTO((rtx, enum rtx_code, rtx)); 99350397Sobrienextern int find_regno_fusage PROTO((rtx, enum rtx_code, int)); 99450397Sobrienextern void remove_note PROTO((rtx, rtx)); 99550397Sobrienextern int side_effects_p PROTO((rtx)); 99650397Sobrienextern int volatile_refs_p PROTO((rtx)); 99750397Sobrienextern int volatile_insn_p PROTO((rtx)); 99850397Sobrienextern int may_trap_p PROTO((rtx)); 99950397Sobrienextern int inequality_comparison_p PROTO((rtx)); 100050397Sobrienextern rtx replace_rtx PROTO((rtx, rtx, rtx)); 100150397Sobrienextern rtx replace_regs PROTO((rtx, rtx *, int, int)); 100250397Sobrienextern int computed_jump_p PROTO((rtx)); 100350397Sobrien 100418334Speter/* Maximum number of parallel sets and clobbers in any insn in this fn. 100518334Speter Always at least 3, since the combiner could put that many togetherm 100618334Speter and we want this to remain correct for all the remaining passes. */ 100718334Speter 100818334Speterextern int max_parallel; 100918334Speter 101018334Speterextern int asm_noperands PROTO((rtx)); 101118334Speterextern char *decode_asm_operands PROTO((rtx, rtx *, rtx **, char **, enum machine_mode *)); 101218334Speter 101318334Speterextern enum reg_class reg_preferred_class PROTO((int)); 101418334Speterextern enum reg_class reg_alternate_class PROTO((int)); 101518334Speter 101618334Speterextern rtx get_first_nonparm_insn PROTO((void)); 101718334Speter 101818334Speter/* Standard pieces of rtx, to be substituted directly into things. */ 101950397Sobrien#define pc_rtx (&global_rtl.pc_val) 102050397Sobrien#define cc0_rtx (&global_rtl.cc0_val) 102150397Sobrien 102250397Sobrien#define MAX_SAVED_CONST_INT 64 102350397Sobrienextern struct rtx_def const_int_rtx[MAX_SAVED_CONST_INT * 2 + 1]; 102450397Sobrien 102550397Sobrien#define const0_rtx (&const_int_rtx[MAX_SAVED_CONST_INT]) 102650397Sobrien#define const1_rtx (&const_int_rtx[MAX_SAVED_CONST_INT+1]) 102750397Sobrien#define const2_rtx (&const_int_rtx[MAX_SAVED_CONST_INT+2]) 102850397Sobrien#define constm1_rtx (&const_int_rtx[MAX_SAVED_CONST_INT-1]) 102918334Speterextern rtx const_true_rtx; 103018334Speter 103118334Speterextern rtx const_tiny_rtx[3][(int) MAX_MACHINE_MODE]; 103218334Speter 103318334Speter/* Returns a constant 0 rtx in mode MODE. Integer modes are treated the 103418334Speter same as VOIDmode. */ 103518334Speter 103618334Speter#define CONST0_RTX(MODE) (const_tiny_rtx[0][(int) (MODE)]) 103718334Speter 103818334Speter/* Likewise, for the constants 1 and 2. */ 103918334Speter 104018334Speter#define CONST1_RTX(MODE) (const_tiny_rtx[1][(int) (MODE)]) 104118334Speter#define CONST2_RTX(MODE) (const_tiny_rtx[2][(int) (MODE)]) 104218334Speter 104350397Sobrienextern struct _global_rtl 104450397Sobrien{ 104550397Sobrien struct rtx_def pc_val, cc0_val; 104650397Sobrien struct rtx_def stack_pointer_val, frame_pointer_val; 104750397Sobrien struct rtx_def hard_frame_pointer_val; 104850397Sobrien struct rtx_def arg_pointer_val; 104950397Sobrien struct rtx_def virtual_incoming_args_val; 105050397Sobrien struct rtx_def virtual_stack_vars_val; 105150397Sobrien struct rtx_def virtual_stack_dynamic_val; 105250397Sobrien struct rtx_def virtual_outgoing_args_val; 105350397Sobrien} global_rtl; 105450397Sobrien 105518334Speter/* All references to certain hard regs, except those created 105618334Speter by allocating pseudo regs into them (when that's possible), 105718334Speter go through these unique rtx objects. */ 105850397Sobrien#define stack_pointer_rtx (&global_rtl.stack_pointer_val) 105950397Sobrien#define frame_pointer_rtx (&global_rtl.frame_pointer_val) 106050397Sobrien 106118334Speterextern rtx pic_offset_table_rtx; 106218334Speterextern rtx struct_value_rtx; 106318334Speterextern rtx struct_value_incoming_rtx; 106418334Speterextern rtx static_chain_rtx; 106518334Speterextern rtx static_chain_incoming_rtx; 106618334Speter 106750397Sobrien 106850397Sobrien/* Include the RTL generation functions. */ 106950397Sobrien 107050397Sobrien#ifndef NO_GENRTL_H 107150397Sobrien#include "genrtl.h" 107250397Sobrien#endif 107350397Sobrien 107450397Sobrien/* There are some RTL codes that require special attention; the 107550397Sobrien generation functions included above do the raw handling. If you 107650397Sobrien add to this list, modify special_rtx in gengenrtl.c as well. You 107750397Sobrien should also modify gen_rtx to use the special function. */ 107850397Sobrien 107950397Sobrienextern rtx gen_rtx_CONST_INT PROTO((enum machine_mode, HOST_WIDE_INT)); 108050397Sobrienextern rtx gen_rtx_REG PROTO((enum machine_mode, int)); 108150397Sobrienextern rtx gen_rtx_MEM PROTO((enum machine_mode, rtx)); 108250397Sobrien 108350397Sobrien/* We need the cast here to ensure that we get the same result both with 108450397Sobrien and without prototypes. */ 108550397Sobrien#define GEN_INT(N) gen_rtx_CONST_INT (VOIDmode, (HOST_WIDE_INT) (N)) 108650397Sobrien 108750397Sobrien 108818334Speter/* If HARD_FRAME_POINTER_REGNUM is defined, then a special dummy reg 108918334Speter is used to represent the frame pointer. This is because the 109018334Speter hard frame pointer and the automatic variables are separated by an amount 109118334Speter that cannot be determined until after register allocation. We can assume 109218334Speter that in this case ELIMINABLE_REGS will be defined, one action of which 109318334Speter will be to eliminate FRAME_POINTER_REGNUM into HARD_FRAME_POINTER_REGNUM. */ 109418334Speter#ifndef HARD_FRAME_POINTER_REGNUM 109518334Speter#define HARD_FRAME_POINTER_REGNUM FRAME_POINTER_REGNUM 109618334Speter#endif 109718334Speter 109850397Sobrien/* For register elimination to work properly these hard_frame_pointer_rtx, 109950397Sobrien frame_pointer_rtx, and arg_pointer_rtx must be the same if they refer to 110050397Sobrien the same register. */ 110150397Sobrien#if HARD_FRAME_POINTER_REGNUM == FRAME_POINTER_REGNUM 110250397Sobrien#define hard_frame_pointer_rtx (&global_rtl.frame_pointer_val) 110350397Sobrien#else 110450397Sobrien#define hard_frame_pointer_rtx (&global_rtl.hard_frame_pointer_val) 110550397Sobrien#endif 110650397Sobrien 110750397Sobrien#if FRAME_POINTER_REGNUM == ARG_POINTER_REGNUM 110850397Sobrien#define arg_pointer_rtx (&global_rtl.frame_pointer_val) 110950397Sobrien#else 111050397Sobrien#if HARD_FRAME_POINTER_REGNUM == ARG_POINTER_REGNUM 111150397Sobrien#define arg_pointer_rtx (&global_rtl.hard_frame_pointer_val) 111250397Sobrien#else 111350397Sobrien#define arg_pointer_rtx (&global_rtl.arg_pointer_val) 111450397Sobrien#endif 111550397Sobrien#endif 111650397Sobrien 111718334Speter/* Virtual registers are used during RTL generation to refer to locations into 111818334Speter the stack frame when the actual location isn't known until RTL generation 111918334Speter is complete. The routine instantiate_virtual_regs replaces these with 112018334Speter the proper value, which is normally {frame,arg,stack}_pointer_rtx plus 112118334Speter a constant. */ 112218334Speter 112318334Speter#define FIRST_VIRTUAL_REGISTER (FIRST_PSEUDO_REGISTER) 112418334Speter 112518334Speter/* This points to the first word of the incoming arguments passed on the stack, 112618334Speter either by the caller or by the callee when pretending it was passed by the 112718334Speter caller. */ 112818334Speter 112950397Sobrien#define virtual_incoming_args_rtx (&global_rtl.virtual_incoming_args_val) 113018334Speter 113118334Speter#define VIRTUAL_INCOMING_ARGS_REGNUM (FIRST_VIRTUAL_REGISTER) 113218334Speter 113318334Speter/* If FRAME_GROWS_DOWNWARD, this points to immediately above the first 113418334Speter variable on the stack. Otherwise, it points to the first variable on 113518334Speter the stack. */ 113618334Speter 113750397Sobrien#define virtual_stack_vars_rtx (&global_rtl.virtual_stack_vars_val) 113818334Speter 113918334Speter#define VIRTUAL_STACK_VARS_REGNUM ((FIRST_VIRTUAL_REGISTER) + 1) 114018334Speter 114118334Speter/* This points to the location of dynamically-allocated memory on the stack 114218334Speter immediately after the stack pointer has been adjusted by the amount 114318334Speter desired. */ 114418334Speter 114550397Sobrien#define virtual_stack_dynamic_rtx (&global_rtl.virtual_stack_dynamic_val) 114618334Speter 114718334Speter#define VIRTUAL_STACK_DYNAMIC_REGNUM ((FIRST_VIRTUAL_REGISTER) + 2) 114818334Speter 114918334Speter/* This points to the location in the stack at which outgoing arguments should 115018334Speter be written when the stack is pre-pushed (arguments pushed using push 115118334Speter insns always use sp). */ 115218334Speter 115350397Sobrien#define virtual_outgoing_args_rtx (&global_rtl.virtual_outgoing_args_val) 115418334Speter 115518334Speter#define VIRTUAL_OUTGOING_ARGS_REGNUM ((FIRST_VIRTUAL_REGISTER) + 3) 115618334Speter 115718334Speter#define LAST_VIRTUAL_REGISTER ((FIRST_VIRTUAL_REGISTER) + 3) 115818334Speter 115918334Speterextern rtx find_next_ref PROTO((rtx, rtx)); 116018334Speterextern rtx *find_single_use PROTO((rtx, rtx, rtx *)); 116118334Speter 116218334Speterextern rtx output_constant_def PROTO((union tree_node *)); 116318334Speterextern rtx immed_real_const PROTO((union tree_node *)); 116418334Speterextern union tree_node *make_tree PROTO((union tree_node *, rtx)); 116518334Speter 116618334Speter/* Abort routines */ 116718334Speterextern void fatal_insn_not_found PROTO((rtx)); 116818334Speterextern void fatal_insn PROTO((char *, rtx)); 116918334Speter 117018334Speter/* Define a default value for STORE_FLAG_VALUE. */ 117118334Speter 117218334Speter#ifndef STORE_FLAG_VALUE 117318334Speter#define STORE_FLAG_VALUE 1 117418334Speter#endif 117518334Speter 117618334Speter/* Nonzero after end of reload pass. 117718334Speter Set to 1 or 0 by toplev.c. */ 117818334Speter 117918334Speterextern int reload_completed; 118018334Speter 118118334Speter/* Set to 1 while reload_as_needed is operating. 118218334Speter Required by some machines to handle any generated moves differently. */ 118318334Speter 118418334Speterextern int reload_in_progress; 118518334Speter 118618334Speter/* If this is nonzero, we do not bother generating VOLATILE 118718334Speter around volatile memory references, and we are willing to 118818334Speter output indirect addresses. If cse is to follow, we reject 118918334Speter indirect addresses so a useful potential cse is generated; 119018334Speter if it is used only once, instruction combination will produce 119118334Speter the same indirect address eventually. */ 119218334Speterextern int cse_not_expected; 119318334Speter 119418334Speter/* Indexed by pseudo register number, gives the rtx for that pseudo. 119518334Speter Allocated in parallel with regno_pointer_flag. */ 119618334Speterextern rtx *regno_reg_rtx; 119718334Speter 119850397Sobrien/* Vector indexed by regno; contain the alignment in bytes and type 119950397Sobrien pointed to for a register that contains a pointer, if known. */ 120050397Sobrienextern char *regno_pointer_align; 120150397Sobrien#define REGNO_POINTER_ALIGN(REGNO) regno_pointer_align[REGNO] 120250397Sobrien 120318334Speter/* Translates rtx code to tree code, for those codes needed by 120418334Speter REAL_ARITHMETIC. The function returns an int because the caller may not 120518334Speter know what `enum tree_code' means. */ 120618334Speter 120718334Speterextern int rtx_to_tree_code PROTO((enum rtx_code)); 120850397Sobrien 120950397Sobrien/* In rtlanal.c */ 121050397Sobrienextern int reg_set_p PROTO ((rtx, rtx)); 121150397Sobrienextern int reg_mentioned_p PROTO ((rtx, rtx)); 121250397Sobrienextern int reg_referenced_p PROTO ((rtx, rtx)); 121350397Sobrienextern int reg_used_between_p PROTO ((rtx, rtx, rtx)); 121450397Sobrienextern int reg_set_p PROTO ((rtx, rtx)); 121550397Sobrienextern int reg_referenced_between_p PROTO ((rtx, rtx, rtx)); 121650397Sobrienextern int reg_set_between_p PROTO ((rtx, rtx, rtx)); 121750397Sobrienextern int rtx_unstable_p PROTO ((rtx)); 121850397Sobrienextern int rtx_addr_varies_p PROTO ((rtx)); 121950397Sobrienextern int rtx_equal_p PROTO ((rtx, rtx)); 122050397Sobrienextern int inequality_comparisons_p PROTO ((rtx)); 122150397Sobrienextern int dead_or_set_p PROTO ((rtx, rtx)); 122250397Sobrienextern int dead_or_set_regno_p PROTO ((rtx, int)); 122350397Sobrienextern int no_labels_between_p PROTO ((rtx, rtx)); 122450397Sobrienextern int modified_between_p PROTO ((rtx, rtx, rtx)); 122550397Sobrienextern int modified_in_p PROTO ((rtx, rtx)); 122650397Sobrien 122750397Sobrien/* In tree.c */ 122850397Sobrienextern void obfree PROTO ((char *)); 122950397Sobrienstruct obstack; 123050397Sobrienextern void gcc_obstack_init PROTO ((struct obstack *)); 123150397Sobrienextern void pop_obstacks PROTO ((void)); 123250397Sobrienextern void push_obstacks PROTO ((struct obstack *, 123350397Sobrien struct obstack *)); 123450397Sobrien#ifdef BUFSIZ 123550397Sobrienextern int read_skip_spaces PROTO ((FILE *)); 123650397Sobrien#endif 123750397Sobrien 123850397Sobrien/* In cse.c */ 123950397Sobrienstruct cse_basic_block_data; 124050397Sobrienextern int rtx_cost PROTO ((rtx, enum rtx_code)); 124150397Sobrienextern void delete_trivially_dead_insns PROTO ((rtx, int)); 124250397Sobrien#ifdef BUFSIZ 124350397Sobrienextern int cse_main PROTO ((rtx, int, int, FILE *)); 124450397Sobrien#endif 124550397Sobrienextern void cse_end_of_basic_block PROTO ((rtx, 124650397Sobrien struct cse_basic_block_data *, 124750397Sobrien int, int, int)); 124850397Sobrien 124950397Sobrien/* In jump.c */ 125050397Sobrienextern int comparison_dominates_p PROTO ((enum rtx_code, enum rtx_code)); 125150397Sobrienextern int condjump_p PROTO ((rtx)); 125250397Sobrienextern int simplejump_p PROTO ((rtx)); 125350397Sobrienextern int sets_cc0_p PROTO ((rtx)); 125450397Sobrienextern int invert_jump PROTO ((rtx, rtx)); 125550397Sobrienextern int rtx_renumbered_equal_p PROTO ((rtx, rtx)); 125650397Sobrienextern int true_regnum PROTO ((rtx)); 125750397Sobrienextern int redirect_jump PROTO ((rtx, rtx)); 125850397Sobrienextern void jump_optimize PROTO ((rtx, int, int, int)); 125950397Sobrienextern void thread_jumps PROTO ((rtx, int, int)); 126050397Sobrienextern int redirect_exp PROTO ((rtx *, rtx, rtx, rtx)); 126150397Sobrienextern int rtx_equal_for_thread_p PROTO ((rtx, rtx, rtx)); 126250397Sobrienextern int invert_exp PROTO ((rtx, rtx)); 126350397Sobrienextern int can_reverse_comparison_p PROTO ((rtx, rtx)); 126450397Sobrienextern void delete_for_peephole PROTO ((rtx, rtx)); 126550397Sobrienextern int condjump_in_parallel_p PROTO ((rtx)); 126650397Sobrien 126750397Sobrien/* Flags for jump_optimize() */ 126850397Sobrien#define JUMP_CROSS_JUMP 1 126950397Sobrien#define JUMP_NOOP_MOVES 1 127050397Sobrien#define JUMP_AFTER_REGSCAN 1 127150397Sobrien 127250397Sobrien/* In emit-rtl.c. */ 127350397Sobrienextern int max_reg_num PROTO ((void)); 127450397Sobrienextern int max_label_num PROTO ((void)); 127550397Sobrienextern int get_first_label_num PROTO ((void)); 127650397Sobrienextern void delete_insns_since PROTO ((rtx)); 127750397Sobrienextern void mark_reg_pointer PROTO ((rtx, int)); 127850397Sobrienextern void mark_user_reg PROTO ((rtx)); 127950397Sobrienextern void reset_used_flags PROTO ((rtx)); 128050397Sobrienextern void reorder_insns PROTO ((rtx, rtx, rtx)); 128150397Sobrienextern int get_max_uid PROTO ((void)); 128250397Sobrienextern int in_sequence_p PROTO ((void)); 128350397Sobrienextern void force_next_line_note PROTO ((void)); 128450397Sobrienextern void init_emit PROTO ((void)); 128550397Sobrienextern void init_emit_once PROTO ((int)); 128650397Sobrienextern void push_topmost_sequence PROTO ((void)); 128750397Sobrienextern void pop_topmost_sequence PROTO ((void)); 128850397Sobrienextern int subreg_realpart_p PROTO ((rtx)); 128950397Sobrienextern void reverse_comparison PROTO ((rtx)); 129050397Sobrienextern void set_new_first_and_last_insn PROTO ((rtx, rtx)); 129150397Sobrienextern void set_new_first_and_last_label_num PROTO ((int, int)); 129250397Sobrienextern void unshare_all_rtl PROTO ((rtx)); 129350397Sobrienextern void set_last_insn PROTO ((rtx)); 129450397Sobrienextern void link_cc0_insns PROTO ((rtx)); 129550397Sobrienextern void add_insn PROTO ((rtx)); 129650397Sobrienextern void add_insn_before PROTO ((rtx, rtx)); 129750397Sobrienextern void add_insn_after PROTO ((rtx, rtx)); 129850397Sobrienextern void reorder_insns_with_line_notes PROTO ((rtx, rtx, rtx)); 129950397Sobrienextern void emit_insn_after_with_line_notes PROTO ((rtx, rtx, rtx)); 130050397Sobrienextern enum rtx_code classify_insn PROTO ((rtx)); 130150397Sobrienextern rtx emit PROTO ((rtx)); 130250397Sobrien/* Query and clear/ restore no_line_numbers. This is used by the 130350397Sobrien switch / case handling in stmt.c to give proper line numbers in 130450397Sobrien warnings about unreachable code. */ 130550397Sobrienint force_line_numbers PROTO((void)); 130650397Sobrienvoid restore_line_number_status PROTO((int old_value)); 130750397Sobrien 130850397Sobrien/* In insn-emit.c */ 130950397Sobrienextern void add_clobbers PROTO ((rtx, int)); 131050397Sobrien 131150397Sobrien/* In combine.c */ 131250397Sobrienextern void combine_instructions PROTO ((rtx, int)); 131350397Sobrienextern int extended_count PROTO ((rtx, enum machine_mode, int)); 131450397Sobrienextern rtx remove_death PROTO ((int, rtx)); 131550397Sobrien#ifdef BUFSIZ 131650397Sobrienextern void dump_combine_stats PROTO ((FILE *)); 131750397Sobrienextern void dump_combine_total_stats PROTO ((FILE *)); 131850397Sobrien#endif 131950397Sobrien 132050397Sobrien/* In sched.c. */ 132150397Sobrien#ifdef BUFSIZ 132250397Sobrienextern void schedule_insns PROTO ((FILE *)); 132350397Sobrien#endif 132450397Sobrien#ifdef HAIFA 132550397Sobrienextern void fix_sched_param PROTO ((char *, char *)); 132650397Sobrien#endif 132750397Sobrien 132850397Sobrien/* In print-rtl.c */ 132950397Sobrienextern void debug_rtx PROTO ((rtx)); 133050397Sobrienextern void debug_rtx_list PROTO ((rtx, int)); 133150397Sobrienextern rtx debug_rtx_find PROTO ((rtx, int)); 133250397Sobrien#ifdef BUFSIZ 133350397Sobrienextern void print_rtl PROTO ((FILE *, rtx)); 133450397Sobrienextern void print_rtl_single PROTO ((FILE *, rtx)); 133550397Sobrienextern void print_inline_rtx PROTO ((FILE *, rtx, int)); 133650397Sobrien#endif 133750397Sobrien 133850397Sobrien/* In loop.c */ 133950397Sobrienextern void init_loop PROTO ((void)); 134050397Sobrien#ifdef BUFSIZ 134150397Sobrienextern void loop_optimize PROTO ((rtx, FILE *, int)); 134250397Sobrien#endif 134350397Sobrienextern void record_excess_regs PROTO ((rtx, rtx, rtx *)); 134450397Sobrien 134550397Sobrien/* In function.c */ 134650397Sobrienextern void reposition_prologue_and_epilogue_notes PROTO ((rtx)); 134750397Sobrienextern void thread_prologue_and_epilogue_insns PROTO ((rtx)); 134850397Sobrienextern void use_variable PROTO ((rtx)); 134950397Sobrienextern HOST_WIDE_INT get_frame_size PROTO ((void)); 135050397Sobrienextern void preserve_rtl_expr_result PROTO ((rtx)); 135150397Sobrienextern void mark_temp_addr_taken PROTO ((rtx)); 135250397Sobrienextern void update_temp_slot_address PROTO ((rtx, rtx)); 135350397Sobrienextern void use_variable_after PROTO ((rtx, rtx)); 135450397Sobrienextern void purge_addressof PROTO ((rtx)); 135550397Sobrien 135650397Sobrien/* In reload.c */ 135750397Sobrienextern int operands_match_p PROTO ((rtx, rtx)); 135850397Sobrienextern int safe_from_earlyclobber PROTO ((rtx, rtx)); 135950397Sobrienextern int strict_memory_address_p PROTO ((enum machine_mode, rtx)); 136050397Sobrien 136150397Sobrien/* In recog.c */ 136250397Sobrienextern int memory_address_p PROTO ((enum machine_mode, rtx)); 136350397Sobrienextern int constrain_operands PROTO ((int, int)); 136450397Sobrienextern int mode_dependent_address_p PROTO ((rtx)); 136550397Sobrienextern void init_recog_no_volatile PROTO ((void)); 136650397Sobrienextern int offsettable_memref_p PROTO ((rtx)); 136750397Sobrienextern int offsettable_nonstrict_memref_p PROTO ((rtx)); 136850397Sobrienextern int reg_fits_class_p PROTO ((rtx, register enum reg_class, 136950397Sobrien int, enum machine_mode)); 137050397Sobrienextern int check_asm_operands PROTO ((rtx)); 137150397Sobrienextern int address_operand PROTO ((rtx, enum machine_mode)); 137250397Sobrienextern int const_int_operand PROTO ((rtx, enum machine_mode)); 137350397Sobrienextern int const_double_operand PROTO ((rtx, enum machine_mode)); 137450397Sobrienextern int general_operand PROTO ((rtx, enum machine_mode)); 137550397Sobrienextern int immediate_operand PROTO ((rtx, enum machine_mode)); 137650397Sobrienextern int nonimmediate_operand PROTO ((rtx, enum machine_mode)); 137750397Sobrienextern int memory_operand PROTO ((rtx, enum machine_mode)); 137850397Sobrienextern int nonmemory_operand PROTO ((rtx, enum machine_mode)); 137950397Sobrienextern int push_operand PROTO ((rtx, enum machine_mode)); 138050397Sobrienextern int register_operand PROTO ((rtx, enum machine_mode)); 138150397Sobrienextern int scratch_operand PROTO ((rtx, enum machine_mode)); 138250397Sobrienextern int indirect_operand PROTO ((rtx, enum machine_mode)); 138350397Sobrienextern int mode_independent_operand PROTO ((rtx, enum machine_mode)); 138450397Sobrienextern int comparison_operator PROTO ((rtx, enum machine_mode)); 138550397Sobrienextern void init_recog_no_volatile PROTO ((void)); 138650397Sobrienextern void init_recog PROTO ((void)); 138750397Sobrienextern int validate_replace_rtx PROTO ((rtx, rtx, rtx)); 138850397Sobrienextern int offsettable_address_p PROTO ((int, enum machine_mode, rtx)); 138950397Sobrienextern int next_insn_tests_no_inequality PROTO ((rtx)); 139050397Sobrienextern int recog_memoized PROTO ((rtx)); 139150397Sobrienextern int validate_change PROTO ((rtx, rtx *, rtx, int)); 139250397Sobrienextern int apply_change_group PROTO ((void)); 139350397Sobrienextern void cancel_changes PROTO ((int)); 139450397Sobrienextern int num_validated_changes PROTO ((void)); 139550397Sobrien 139650397Sobrien/* In insn-recog.c */ 139750397Sobrienextern int recog PROTO ((rtx, rtx, int *)); 139850397Sobrien 139950397Sobrien/* In stmt.c */ 140050397Sobrienextern void expand_null_return PROTO((void)); 140150397Sobrienextern void emit_jump PROTO ((rtx)); 140250397Sobrienextern int preserve_subexpressions_p PROTO ((void)); 140350397Sobrien 140450397Sobrien/* In expr.c */ 140550397Sobrienextern void init_expr_once PROTO ((void)); 140650397Sobrien 140750397Sobrien/* In stupid.c */ 140850397Sobrien#ifdef BUFSIZ 140950397Sobrienextern void stupid_life_analysis PROTO ((rtx, int, FILE *)); 141050397Sobrien#endif 141150397Sobrien 141250397Sobrien/* In flow.c */ 141350397Sobrienextern void allocate_for_life_analysis PROTO ((void)); 141450397Sobrienextern void recompute_reg_usage PROTO ((rtx)); 141550397Sobrien#ifdef BUFSIZ 141650397Sobrienextern void dump_flow_info PROTO ((FILE *)); 141750397Sobrien#endif 141850397Sobrien 141950397Sobrien/* In expmed.c */ 142050397Sobrienextern void init_expmed PROTO ((void)); 142150397Sobrienextern void expand_inc PROTO ((rtx, rtx)); 142250397Sobrienextern void expand_dec PROTO ((rtx, rtx)); 142350397Sobrienextern rtx expand_mult_highpart PROTO ((enum machine_mode, rtx, 142450397Sobrien unsigned HOST_WIDE_INT, rtx, 142550397Sobrien int, int)); 142650397Sobrien 142750397Sobrien/* In gcse.c */ 142850397Sobrien#ifdef BUFSIZ 142950397Sobrienextern void gcse_main PROTO ((rtx, FILE *)); 143050397Sobrien#endif 143150397Sobrien 143250397Sobrien/* In global.c */ 143350397Sobrienextern void mark_elimination PROTO ((int, int)); 143450397Sobrien#ifdef BUFSIZ 143550397Sobrienextern int global_alloc PROTO ((FILE *)); 143650397Sobrienextern void dump_global_regs PROTO ((FILE *)); 143750397Sobrien#endif 143850397Sobrien#ifdef HARD_CONST 143950397Sobrienextern void retry_global_alloc PROTO ((int, HARD_REG_SET)); 144050397Sobrien#endif 144150397Sobrien 144250397Sobrien/* In regclass.c */ 144350397Sobrienextern int reg_classes_intersect_p PROTO ((enum reg_class, enum reg_class)); 144450397Sobrienextern int reg_class_subset_p PROTO ((enum reg_class, enum reg_class)); 144550397Sobrienextern void globalize_reg PROTO ((int)); 144650397Sobrienextern void init_regs PROTO ((void)); 144750397Sobrienextern void init_reg_sets PROTO ((void)); 144850397Sobrienextern void regset_release_memory PROTO ((void)); 144950397Sobrienextern void regclass_init PROTO ((void)); 145050397Sobrienextern void regclass PROTO ((rtx, int)); 145150397Sobrienextern void reg_scan PROTO ((rtx, int, int)); 145250397Sobrienextern void reg_scan_update PROTO ((rtx, rtx, int)); 145350397Sobrienextern void fix_register PROTO ((char *, int, int)); 145450397Sobrien 145550397Sobrien/* In regmove.c */ 145650397Sobrien#ifdef BUFSIZ 145750397Sobrienextern void regmove_optimize PROTO ((rtx, int, FILE *)); 145850397Sobrien#endif 145950397Sobrien 146050397Sobrien/* In reorg.c */ 146150397Sobrien#ifdef BUFSIZ 146250397Sobrienextern void dbr_schedule PROTO ((rtx, FILE *)); 146350397Sobrien#endif 146450397Sobrien 146550397Sobrien/* In optabs.c */ 146650397Sobrienextern void init_optabs PROTO ((void)); 146750397Sobrien 146850397Sobrien/* In local-alloc.c */ 146950397Sobrien#ifdef BUFSIZ 147050397Sobrienextern void dump_local_alloc PROTO ((FILE *)); 147150397Sobrien#endif 147250397Sobrienextern void local_alloc PROTO ((void)); 147350397Sobrien 147450397Sobrien/* In reload1.c */ 147550397Sobrienextern void reload_cse_regs PROTO ((rtx)); 147650397Sobrienextern void init_reload PROTO ((void)); 147750397Sobrienextern void mark_home_live PROTO ((int)); 147850397Sobrien#ifdef BUFSIZ 147950397Sobrienextern int reload PROTO ((rtx, int, FILE *)); 148050397Sobrien#endif 148150397Sobrien 148250397Sobrien/* In caller-save.c */ 148350397Sobrienextern void init_caller_save PROTO ((void)); 148450397Sobrien 148550397Sobrien/* In profile.c */ 148650397Sobrienextern void init_branch_prob PROTO ((char *)); 148750397Sobrien#ifdef BUFSIZ 148850397Sobrienextern void branch_prob PROTO ((rtx, FILE *)); 148950397Sobrienextern void end_branch_prob PROTO ((FILE *)); 149050397Sobrien#endif 149150397Sobrienextern void output_func_start_profiler PROTO ((void)); 149250397Sobrien 149350397Sobrien/* In reg-stack.c */ 149450397Sobrien#ifdef BUFSIZ 149550397Sobrienextern void reg_to_stack PROTO ((rtx, FILE *)); 149650397Sobrien#endif 149750397Sobrienextern int stack_regs_mentioned_p PROTO ((rtx)); 149850397Sobrien 149950397Sobrien/* In fold-const.c */ 150050397Sobrienextern int add_double PROTO ((HOST_WIDE_INT, HOST_WIDE_INT, 150150397Sobrien HOST_WIDE_INT, HOST_WIDE_INT, 150250397Sobrien HOST_WIDE_INT *, HOST_WIDE_INT *)); 150350397Sobrienextern int neg_double PROTO ((HOST_WIDE_INT, HOST_WIDE_INT, 150450397Sobrien HOST_WIDE_INT *, HOST_WIDE_INT *)); 150550397Sobrienextern int mul_double PROTO ((HOST_WIDE_INT, HOST_WIDE_INT, 150650397Sobrien HOST_WIDE_INT, HOST_WIDE_INT, 150750397Sobrien HOST_WIDE_INT *, HOST_WIDE_INT *)); 150850397Sobrienextern void lshift_double PROTO ((HOST_WIDE_INT, HOST_WIDE_INT, 150950397Sobrien HOST_WIDE_INT, int, HOST_WIDE_INT *, 151050397Sobrien HOST_WIDE_INT *, int)); 151150397Sobrienextern void rshift_double PROTO ((HOST_WIDE_INT, HOST_WIDE_INT, 151250397Sobrien HOST_WIDE_INT, int, 151350397Sobrien HOST_WIDE_INT *, HOST_WIDE_INT *, int)); 151450397Sobrienextern void lrotate_double PROTO ((HOST_WIDE_INT, HOST_WIDE_INT, 151550397Sobrien HOST_WIDE_INT, int, HOST_WIDE_INT *, 151650397Sobrien HOST_WIDE_INT *)); 151750397Sobrienextern void rrotate_double PROTO ((HOST_WIDE_INT, HOST_WIDE_INT, 151850397Sobrien HOST_WIDE_INT, int, HOST_WIDE_INT *, 151950397Sobrien HOST_WIDE_INT *)); 152050397Sobrien 152150397Sobrien/* In calls.c */ 152250397Sobrien/* Emit library call. */ 152350397Sobrienextern void emit_library_call PVPROTO ((rtx, int, enum machine_mode, 152450397Sobrien int, ...)); 152550397Sobrienextern rtx emit_library_call_value PVPROTO((rtx, rtx, int, 152650397Sobrien enum machine_mode, 152750397Sobrien int, ...)); 152850397Sobrien 152950397Sobrien/* In unroll.c */ 153050397Sobrienextern int set_dominates_use PROTO ((int, int, int, rtx, rtx)); 153150397Sobrien 153250397Sobrien/* In varasm.c */ 153350397Sobrienextern void bss_section PROTO ((void)); 153450397Sobrienextern int in_data_section PROTO ((void)); 153550397Sobrienextern int supports_one_only PROTO ((void)); 153650397Sobrien 153750397Sobrien/* In rtl.c */ 153850397Sobrienextern void init_rtl PROTO ((void)); 153950397Sobrienextern void rtx_free PROTO ((rtx)); 154050397Sobrien 154150397Sobrien/* In alias.c */ 154250397Sobrienextern int true_dependence PROTO ((rtx, enum machine_mode, rtx, 154350397Sobrien int (*)(rtx))); 154450397Sobrienextern int read_dependence PROTO ((rtx, rtx)); 154550397Sobrienextern int anti_dependence PROTO ((rtx, rtx)); 154650397Sobrienextern int output_dependence PROTO ((rtx, rtx)); 154750397Sobrienextern void init_alias_once PROTO ((void)); 154850397Sobrienextern void init_alias_analysis PROTO ((void)); 154950397Sobrienextern void end_alias_analysis PROTO ((void)); 155050397Sobrien 155150397Sobrienextern void record_base_value PROTO ((int, rtx, int)); 155250397Sobrien 155350397Sobrien#endif /* _RTL_H */ 1554