Annotation of gcc/rtl.h, revision 1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.