Annotation of researchv10dc/cmd/gcc/rtl.h, revision 1.1

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

unix.superglobalmegacorp.com

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