Annotation of GNUtools/cc/gcc.info-11, revision 1.1

1.1     ! root        1: This is Info file gcc.info, produced by Makeinfo-1.54 from the input
        !             2: file gcc.texi.
        !             3: 
        !             4:    This file documents the use and the internals of the GNU compiler.
        !             5: 
        !             6:    Published by the Free Software Foundation 675 Massachusetts Avenue
        !             7: Cambridge, MA 02139 USA
        !             8: 
        !             9:    Copyright (C) 1988, 1989, 1992, 1993 Free Software Foundation, Inc.
        !            10: 
        !            11:    Permission is granted to make and distribute verbatim copies of this
        !            12: manual provided the copyright notice and this permission notice are
        !            13: preserved on all copies.
        !            14: 
        !            15:    Permission is granted to copy and distribute modified versions of
        !            16: this manual under the conditions for verbatim copying, provided also
        !            17: that the sections entitled "GNU General Public License" and "Protect
        !            18: Your Freedom--Fight `Look And Feel'" are included exactly as in the
        !            19: original, and provided that the entire resulting derived work is
        !            20: distributed under the terms of a permission notice identical to this
        !            21: one.
        !            22: 
        !            23:    Permission is granted to copy and distribute translations of this
        !            24: manual into another language, under the above conditions for modified
        !            25: versions, except that the sections entitled "GNU General Public
        !            26: License" and "Protect Your Freedom--Fight `Look And Feel'", and this
        !            27: permission notice, may be included in translations approved by the Free
        !            28: Software Foundation instead of in the original English.
        !            29: 
        !            30: 
        !            31: File: gcc.info,  Node: Passes,  Next: RTL,  Prev: Interface,  Up: Top
        !            32: 
        !            33: Passes and Files of the Compiler
        !            34: ********************************
        !            35: 
        !            36:    The overall control structure of the compiler is in `toplev.c'.  This
        !            37: file is responsible for initialization, decoding arguments, opening and
        !            38: closing files, and sequencing the passes.
        !            39: 
        !            40:    The parsing pass is invoked only once, to parse the entire input.
        !            41: The RTL intermediate code for a function is generated as the function
        !            42: is parsed, a statement at a time.  Each statement is read in as a
        !            43: syntax tree and then converted to RTL; then the storage for the tree
        !            44: for the statement is reclaimed.  Storage for types (and the expressions
        !            45: for their sizes), declarations, and a representation of the binding
        !            46: contours and how they nest, remain until the function is finished being
        !            47: compiled; these are all needed to output the debugging information.
        !            48: 
        !            49:    Each time the parsing pass reads a complete function definition or
        !            50: top-level declaration, it calls either the function
        !            51: `rest_of_compilation', or the function `rest_of_decl_compilation' in
        !            52: `toplev.c', which are responsible for all further processing necessary,
        !            53: ending with output of the assembler language.  All other compiler
        !            54: passes run, in sequence, within `rest_of_compilation'.  When that
        !            55: function returns from compiling a function definition, the storage used
        !            56: for that function definition's compilation is entirely freed, unless it
        !            57: is an inline function (*note An Inline Function is As Fast As a Macro:
        !            58: Inline.).
        !            59: 
        !            60:    Here is a list of all the passes of the compiler and their source
        !            61: files.  Also included is a description of where debugging dumps can be
        !            62: requested with `-d' options.
        !            63: 
        !            64:    * Parsing.  This pass reads the entire text of a function definition,
        !            65:      constructing partial syntax trees.  This and RTL generation are no
        !            66:      longer truly separate passes (formerly they were), but it is
        !            67:      easier to think of them as separate.
        !            68: 
        !            69:      The tree representation does not entirely follow C syntax, because
        !            70:      it is intended to support other languages as well.
        !            71: 
        !            72:      Language-specific data type analysis is also done in this pass,
        !            73:      and every tree node that represents an expression has a data type
        !            74:      attached.  Variables are represented as declaration nodes.
        !            75: 
        !            76:      Constant folding and some arithmetic simplifications are also done
        !            77:      during this pass.
        !            78: 
        !            79:      The language-independent source files for parsing are
        !            80:      `stor-layout.c', `fold-const.c', and `tree.c'.  There are also
        !            81:      header files `tree.h' and `tree.def' which define the format of
        !            82:      the tree representation.
        !            83: 
        !            84:      The source files to parse C are `c-parse.in', `c-decl.c',
        !            85:      `c-typeck.c', `c-aux-info.c', `c-convert.c', and `c-lang.c' along
        !            86:      with header files `c-lex.h', and `c-tree.h'.
        !            87: 
        !            88:      The source files for parsing C++ are `cp-parse.y', `cp-class.c',
        !            89:      `cp-cvt.c', `cp-decl.c', `cp-decl2.c', `cp-dem.c', `cp-except.c',
        !            90:      `cp-expr.c', `cp-init.c', `cp-lex.c', `cp-method.c', `cp-ptree.c',
        !            91:      `cp-search.c', `cp-tree.c', `cp-type2.c', and `cp-typeck.c', along
        !            92:      with header files `cp-tree.def', `cp-tree.h', and `cp-decl.h'.
        !            93: 
        !            94:      The special source files for parsing Objective C are
        !            95:      `objc-parse.y', `objc-actions.c', `objc-tree.def', and
        !            96:      `objc-actions.h'.  Certain C-specific files are used for this as
        !            97:      well.
        !            98: 
        !            99:      The file `c-common.c' is also used for all of the above languages.
        !           100: 
        !           101:    * RTL generation.  This is the conversion of syntax tree into RTL
        !           102:      code.  It is actually done statement-by-statement during parsing,
        !           103:      but for most purposes it can be thought of as a separate pass.
        !           104: 
        !           105:      This is where the bulk of target-parameter-dependent code is found,
        !           106:      since often it is necessary for strategies to apply only when
        !           107:      certain standard kinds of instructions are available.  The purpose
        !           108:      of named instruction patterns is to provide this information to
        !           109:      the RTL generation pass.
        !           110: 
        !           111:      Optimization is done in this pass for `if'-conditions that are
        !           112:      comparisons, boolean operations or conditional expressions.  Tail
        !           113:      recursion is detected at this time also.  Decisions are made about
        !           114:      how best to arrange loops and how to output `switch' statements.
        !           115: 
        !           116:      The source files for RTL generation include `stmt.c', `calls.c',
        !           117:      `expr.c', `explow.c', `expmed.c', `function.c', `optabs.c' and
        !           118:      `emit-rtl.c'.  Also, the file `insn-emit.c', generated from the
        !           119:      machine description by the program `genemit', is used in this
        !           120:      pass.  The header file `expr.h' is used for communication within
        !           121:      this pass.
        !           122: 
        !           123:      The header files `insn-flags.h' and `insn-codes.h', generated from
        !           124:      the machine description by the programs `genflags' and `gencodes',
        !           125:      tell this pass which standard names are available for use and
        !           126:      which patterns correspond to them.
        !           127: 
        !           128:      Aside from debugging information output, none of the following
        !           129:      passes refers to the tree structure representation of the function
        !           130:      (only part of which is saved).
        !           131: 
        !           132:      The decision of whether the function can and should be expanded
        !           133:      inline in its subsequent callers is made at the end of rtl
        !           134:      generation.  The function must meet certain criteria, currently
        !           135:      related to the size of the function and the types and number of
        !           136:      parameters it has.  Note that this function may contain loops,
        !           137:      recursive calls to itself (tail-recursive functions can be
        !           138:      inlined!), gotos, in short, all constructs supported by GNU CC.
        !           139:      The file `integrate.c' contains the code to save a function's rtl
        !           140:      for later inlining and to inline that rtl when the function is
        !           141:      called.  The header file `integrate.h' is also used for this
        !           142:      purpose.
        !           143: 
        !           144:      The option `-dr' causes a debugging dump of the RTL code after
        !           145:      this pass.  This dump file's name is made by appending `.rtl' to
        !           146:      the input file name.
        !           147: 
        !           148:    * Jump optimization.  This pass simplifies jumps to the following
        !           149:      instruction, jumps across jumps, and jumps to jumps.  It deletes
        !           150:      unreferenced labels and unreachable code, except that unreachable
        !           151:      code that contains a loop is not recognized as unreachable in this
        !           152:      pass.  (Such loops are deleted later in the basic block analysis.)
        !           153:      It also converts some code originally written with jumps into
        !           154:      sequences of instructions that directly set values from the
        !           155:      results of comparisons, if the machine has such instructions.
        !           156: 
        !           157:      Jump optimization is performed two or three times.  The first time
        !           158:      is immediately following RTL generation.  The second time is after
        !           159:      CSE, but only if CSE says repeated jump optimization is needed.
        !           160:      The last time is right before the final pass.  That time,
        !           161:      cross-jumping and deletion of no-op move instructions are done
        !           162:      together with the optimizations described above.
        !           163: 
        !           164:      The source file of this pass is `jump.c'.
        !           165: 
        !           166:      The option `-dj' causes a debugging dump of the RTL code after
        !           167:      this pass is run for the first time.  This dump file's name is
        !           168:      made by appending `.jump' to the input file name.
        !           169: 
        !           170:    * Register scan.  This pass finds the first and last use of each
        !           171:      register, as a guide for common subexpression elimination.  Its
        !           172:      source is in `regclass.c'.
        !           173: 
        !           174:    * Jump threading.  This pass detects a condition jump that branches
        !           175:      to an identical or inverse test.  Such jumps can be `threaded'
        !           176:      through the second conditional test.  The source code for this
        !           177:      pass is in `jump.c'.  This optimization is only performed if
        !           178:      `-fthread-jumps' is enabled.
        !           179: 
        !           180:    * Common subexpression elimination.  This pass also does constant
        !           181:      propagation.  Its source file is `cse.c'.  If constant propagation
        !           182:      causes conditional jumps to become unconditional or to become
        !           183:      no-ops, jump optimization is run again when CSE is finished.
        !           184: 
        !           185:      The option `-ds' causes a debugging dump of the RTL code after
        !           186:      this pass.  This dump file's name is made by appending `.cse' to
        !           187:      the input file name.
        !           188: 
        !           189:    * Loop optimization.  This pass moves constant expressions out of
        !           190:      loops, and optionally does strength-reduction and loop unrolling
        !           191:      as well.  Its source files are `loop.c' and `unroll.c', plus the
        !           192:      header `loop.h' used for communication between them.  Loop
        !           193:      unrolling uses some functions in `integrate.c' and the header
        !           194:      `integrate.h'.
        !           195: 
        !           196:      The option `-dL' causes a debugging dump of the RTL code after
        !           197:      this pass.  This dump file's name is made by appending `.loop' to
        !           198:      the input file name.
        !           199: 
        !           200:    * If `-frerun-cse-after-loop' was enabled, a second common
        !           201:      subexpression elimination pass is performed after the loop
        !           202:      optimization pass.  Jump threading is also done again at this time
        !           203:      if it was specified.
        !           204: 
        !           205:      The option `-dt' causes a debugging dump of the RTL code after
        !           206:      this pass.  This dump file's name is made by appending `.cse2' to
        !           207:      the input file name.
        !           208: 
        !           209:    * Stupid register allocation is performed at this point in a
        !           210:      nonoptimizing compilation.  It does a little data flow analysis as
        !           211:      well.  When stupid register allocation is in use, the next pass
        !           212:      executed is the reloading pass; the others in between are skipped.
        !           213:      The source file is `stupid.c'.
        !           214: 
        !           215:    * Data flow analysis (`flow.c').  This pass divides the program into
        !           216:      basic blocks (and in the process deletes unreachable loops); then
        !           217:      it computes which pseudo-registers are live at each point in the
        !           218:      program, and makes the first instruction that uses a value point at
        !           219:      the instruction that computed the value.
        !           220: 
        !           221:      This pass also deletes computations whose results are never used,
        !           222:      and combines memory references with add or subtract instructions
        !           223:      to make autoincrement or autodecrement addressing.
        !           224: 
        !           225:      The option `-df' causes a debugging dump of the RTL code after
        !           226:      this pass.  This dump file's name is made by appending `.flow' to
        !           227:      the input file name.  If stupid register allocation is in use, this
        !           228:      dump file reflects the full results of such allocation.
        !           229: 
        !           230:    * Instruction combination (`combine.c').  This pass attempts to
        !           231:      combine groups of two or three instructions that are related by
        !           232:      data flow into single instructions.  It combines the RTL
        !           233:      expressions for the instructions by substitution, simplifies the
        !           234:      result using algebra, and then attempts to match the result
        !           235:      against the machine description.
        !           236: 
        !           237:      The option `-dc' causes a debugging dump of the RTL code after
        !           238:      this pass.  This dump file's name is made by appending `.combine'
        !           239:      to the input file name.
        !           240: 
        !           241:    * Instruction scheduling (`sched.c').  This pass looks for
        !           242:      instructions whose output will not be available by the time that
        !           243:      it is used in subsequent instructions.  (Memory loads and floating
        !           244:      point instructions often have this behavior on RISC machines).  It
        !           245:      re-orders instructions within a basic block to try to separate the
        !           246:      definition and use of items that otherwise would cause pipeline
        !           247:      stalls.
        !           248: 
        !           249:      Instruction scheduling is performed twice.  The first time is
        !           250:      immediately after instruction combination and the second is
        !           251:      immediately after reload.
        !           252: 
        !           253:      The option `-dS' causes a debugging dump of the RTL code after this
        !           254:      pass is run for the first time.  The dump file's name is made by
        !           255:      appending `.sched' to the input file name.
        !           256: 
        !           257:    * Register class preferencing.  The RTL code is scanned to find out
        !           258:      which register class is best for each pseudo register.  The source
        !           259:      file is `regclass.c'.
        !           260: 
        !           261:    * Local register allocation (`local-alloc.c').  This pass allocates
        !           262:      hard registers to pseudo registers that are used only within one
        !           263:      basic block.  Because the basic block is linear, it can use fast
        !           264:      and powerful techniques to do a very good job.
        !           265: 
        !           266:      The option `-dl' causes a debugging dump of the RTL code after
        !           267:      this pass.  This dump file's name is made by appending `.lreg' to
        !           268:      the input file name.
        !           269: 
        !           270:    * Global register allocation (`global.c').  This pass allocates hard
        !           271:      registers for the remaining pseudo registers (those whose life
        !           272:      spans are not contained in one basic block).
        !           273: 
        !           274:    * Reloading.  This pass renumbers pseudo registers with the hardware
        !           275:      registers numbers they were allocated.  Pseudo registers that did
        !           276:      not get hard registers are replaced with stack slots.  Then it
        !           277:      finds instructions that are invalid because a value has failed to
        !           278:      end up in a register, or has ended up in a register of the wrong
        !           279:      kind.  It fixes up these instructions by reloading the
        !           280:      problematical values temporarily into registers.  Additional
        !           281:      instructions are generated to do the copying.
        !           282: 
        !           283:      The reload pass also optionally eliminates the frame pointer and
        !           284:      inserts instructions to save and restore call-clobbered registers
        !           285:      around calls.
        !           286: 
        !           287:      Source files are `reload.c' and `reload1.c', plus the header
        !           288:      `reload.h' used for communication between them.
        !           289: 
        !           290:      The option `-dg' causes a debugging dump of the RTL code after
        !           291:      this pass.  This dump file's name is made by appending `.greg' to
        !           292:      the input file name.
        !           293: 
        !           294:    * Instruction scheduling is repeated here to try to avoid pipeline
        !           295:      stalls due to memory loads generated for spilled pseudo registers.
        !           296: 
        !           297:      The option `-dR' causes a debugging dump of the RTL code after
        !           298:      this pass.  This dump file's name is made by appending `.sched2'
        !           299:      to the input file name.
        !           300: 
        !           301:    * Jump optimization is repeated, this time including cross-jumping
        !           302:      and deletion of no-op move instructions.
        !           303: 
        !           304:      The option `-dJ' causes a debugging dump of the RTL code after
        !           305:      this pass.  This dump file's name is made by appending `.jump2' to
        !           306:      the input file name.
        !           307: 
        !           308:    * Delayed branch scheduling.  This optional pass attempts to find
        !           309:      instructions that can go into the delay slots of other
        !           310:      instructions, usually jumps and calls.  The source file name is
        !           311:      `reorg.c'.
        !           312: 
        !           313:      The option `-dd' causes a debugging dump of the RTL code after
        !           314:      this pass.  This dump file's name is made by appending `.dbr' to
        !           315:      the input file name.
        !           316: 
        !           317:    * Conversion from usage of some hard registers to usage of a register
        !           318:      stack may be done at this point.  Currently, this is supported only
        !           319:      for the floating-point registers of the Intel 80387 coprocessor.
        !           320:      The source file name is `reg-stack.c'.
        !           321: 
        !           322:      The options `-dk' causes a debugging dump of the RTL code after
        !           323:      this pass.  This dump file's name is made by appending `.stack' to
        !           324:      the input file name.
        !           325: 
        !           326:    * Final.  This pass outputs the assembler code for the function.  It
        !           327:      is also responsible for identifying spurious test and compare
        !           328:      instructions.  Machine-specific peephole optimizations are
        !           329:      performed at the same time.  The function entry and exit sequences
        !           330:      are generated directly as assembler code in this pass; they never
        !           331:      exist as RTL.
        !           332: 
        !           333:      The source files are `final.c' plus `insn-output.c'; the latter is
        !           334:      generated automatically from the machine description by the tool
        !           335:      `genoutput'.  The header file `conditions.h' is used for
        !           336:      communication between these files.
        !           337: 
        !           338:    * Debugging information output.  This is run after final because it
        !           339:      must output the stack slot offsets for pseudo registers that did
        !           340:      not get hard registers.  Source files are `dbxout.c' for DBX
        !           341:      symbol table format, `sdbout.c' for SDB symbol table format, and
        !           342:      `dwarfout.c' for DWARF symbol table format.
        !           343: 
        !           344:    Some additional files are used by all or many passes:
        !           345: 
        !           346:    * Every pass uses `machmode.def' and `machmode.h' which define the
        !           347:      machine modes.
        !           348: 
        !           349:    * Several passes use `real.h', which defines the default
        !           350:      representation of floating point constants and how to operate on
        !           351:      them.
        !           352: 
        !           353:    * All the passes that work with RTL use the header files `rtl.h' and
        !           354:      `rtl.def', and subroutines in file `rtl.c'.  The tools `gen*' also
        !           355:      use these files to read and work with the machine description RTL.
        !           356: 
        !           357:    * Several passes refer to the header file `insn-config.h' which
        !           358:      contains a few parameters (C macro definitions) generated
        !           359:      automatically from the machine description RTL by the tool
        !           360:      `genconfig'.
        !           361: 
        !           362:    * Several passes use the instruction recognizer, which consists of
        !           363:      `recog.c' and `recog.h', plus the files `insn-recog.c' and
        !           364:      `insn-extract.c' that are generated automatically from the machine
        !           365:      description by the tools `genrecog' and `genextract'.
        !           366: 
        !           367:    * Several passes use the header files `regs.h' which defines the
        !           368:      information recorded about pseudo register usage, and
        !           369:      `basic-block.h' which defines the information recorded about basic
        !           370:      blocks.
        !           371: 
        !           372:    * `hard-reg-set.h' defines the type `HARD_REG_SET', a bit-vector
        !           373:      with a bit for each hard register, and some macros to manipulate
        !           374:      it.  This type is just `int' if the machine has few enough hard
        !           375:      registers; otherwise it is an array of `int' and some of the
        !           376:      macros expand into loops.
        !           377: 
        !           378:    * Several passes use instruction attributes.  A definition of the
        !           379:      attributes defined for a particular machine is in file
        !           380:      `insn-attr.h', which is generated from the machine description by
        !           381:      the program `genattr'.  The file `insn-attrtab.c' contains
        !           382:      subroutines to obtain the attribute values for insns.  It is
        !           383:      generated from the machine description by the program `genattrtab'.
        !           384: 
        !           385: 
        !           386: File: gcc.info,  Node: RTL,  Next: Machine Desc,  Prev: Passes,  Up: Top
        !           387: 
        !           388: RTL Representation
        !           389: ******************
        !           390: 
        !           391:    Most of the work of the compiler is done on an intermediate
        !           392: representation called register transfer language.  In this language,
        !           393: the instructions to be output are described, pretty much one by one, in
        !           394: an algebraic form that describes what the instruction does.
        !           395: 
        !           396:    RTL is inspired by Lisp lists.  It has both an internal form, made
        !           397: up of structures that point at other structures, and a textual form
        !           398: that is used in the machine description and in printed debugging dumps.
        !           399: The textual form uses nested parentheses to indicate the pointers in
        !           400: the internal form.
        !           401: 
        !           402: * Menu:
        !           403: 
        !           404: * RTL Objects::       Expressions vs vectors vs strings vs integers.
        !           405: * Accessors::         Macros to access expression operands or vector elts.
        !           406: * Flags::             Other flags in an RTL expression.
        !           407: * Machine Modes::     Describing the size and format of a datum.
        !           408: * Constants::         Expressions with constant values.
        !           409: * Regs and Memory::   Expressions representing register contents or memory.
        !           410: * Arithmetic::        Expressions representing arithmetic on other expressions.
        !           411: * Comparisons::       Expressions representing comparison of expressions.
        !           412: * Bit Fields::        Expressions representing bitfields in memory or reg.
        !           413: * Conversions::       Extending, truncating, floating or fixing.
        !           414: * RTL Declarations::  Declaring volatility, constancy, etc.
        !           415: * Side Effects::      Expressions for storing in registers, etc.
        !           416: * Incdec::            Embedded side-effects for autoincrement addressing.
        !           417: * Assembler::         Representing `asm' with operands.
        !           418: * Insns::             Expression types for entire insns.
        !           419: * Calls::             RTL representation of function call insns.
        !           420: * Sharing::           Some expressions are unique; others *must* be copied.
        !           421: * Reading RTL::       Reading textual RTL from a file.
        !           422: 
        !           423: 
        !           424: File: gcc.info,  Node: RTL Objects,  Next: Accessors,  Prev: RTL,  Up: RTL
        !           425: 
        !           426: RTL Object Types
        !           427: ================
        !           428: 
        !           429:    RTL uses five kinds of objects: expressions, integers, wide integers,
        !           430: strings and vectors.  Expressions are the most important ones.  An RTL
        !           431: expression ("RTX", for short) is a C structure, but it is usually
        !           432: referred to with a pointer; a type that is given the typedef name `rtx'.
        !           433: 
        !           434:    An integer is simply an `int'; their written form uses decimal
        !           435: digits.  A wide integer is an integral object whose type is
        !           436: `HOST_WIDE_INT' (*note Config::.); their written form uses decimal
        !           437: digits.
        !           438: 
        !           439:    A string is a sequence of characters.  In core it is represented as a
        !           440: `char *' in usual C fashion, and it is written in C syntax as well.
        !           441: However, strings in RTL may never be null.  If you write an empty
        !           442: string in a machine description, it is represented in core as a null
        !           443: pointer rather than as a pointer to a null character.  In certain
        !           444: contexts, these null pointers instead of strings are valid.  Within RTL
        !           445: code, strings are most commonly found inside `symbol_ref' expressions,
        !           446: but they appear in other contexts in the RTL expressions that make up
        !           447: machine descriptions.
        !           448: 
        !           449:    A vector contains an arbitrary number of pointers to expressions.
        !           450: The number of elements in the vector is explicitly present in the
        !           451: vector.  The written form of a vector consists of square brackets
        !           452: (`[...]') surrounding the elements, in sequence and with whitespace
        !           453: separating them.  Vectors of length zero are not created; null pointers
        !           454: are used instead.
        !           455: 
        !           456:    Expressions are classified by "expression codes" (also called RTX
        !           457: codes).  The expression code is a name defined in `rtl.def', which is
        !           458: also (in upper case) a C enumeration constant.  The possible expression
        !           459: codes and their meanings are machine-independent.  The code of an RTX
        !           460: can be extracted with the macro `GET_CODE (X)' and altered with
        !           461: `PUT_CODE (X, NEWCODE)'.
        !           462: 
        !           463:    The expression code determines how many operands the expression
        !           464: contains, and what kinds of objects they are.  In RTL, unlike Lisp, you
        !           465: cannot tell by looking at an operand what kind of object it is.
        !           466: Instead, you must know from its context--from the expression code of
        !           467: the containing expression.  For example, in an expression of code
        !           468: `subreg', the first operand is to be regarded as an expression and the
        !           469: second operand as an integer.  In an expression of code `plus', there
        !           470: are two operands, both of which are to be regarded as expressions.  In
        !           471: a `symbol_ref' expression, there is one operand, which is to be
        !           472: regarded as a string.
        !           473: 
        !           474:    Expressions are written as parentheses containing the name of the
        !           475: expression type, its flags and machine mode if any, and then the
        !           476: operands of the expression (separated by spaces).
        !           477: 
        !           478:    Expression code names in the `md' file are written in lower case,
        !           479: but when they appear in C code they are written in upper case.  In this
        !           480: manual, they are shown as follows: `const_int'.
        !           481: 
        !           482:    In a few contexts a null pointer is valid where an expression is
        !           483: normally wanted.  The written form of this is `(nil)'.
        !           484: 
        !           485: 
        !           486: File: gcc.info,  Node: Accessors,  Next: Flags,  Prev: RTL Objects,  Up: RTL
        !           487: 
        !           488: Access to Operands
        !           489: ==================
        !           490: 
        !           491:    For each expression type `rtl.def' specifies the number of contained
        !           492: objects and their kinds, with four possibilities: `e' for expression
        !           493: (actually a pointer to an expression), `i' for integer, `w' for wide
        !           494: integer, `s' for string, and `E' for vector of expressions.  The
        !           495: sequence of letters for an expression code is called its "format".
        !           496: Thus, the format of `subreg' is `ei'.
        !           497: 
        !           498:    A few other format characters are used occasionally:
        !           499: 
        !           500: `u'
        !           501:      `u' is equivalent to `e' except that it is printed differently in
        !           502:      debugging dumps.  It is used for pointers to insns.
        !           503: 
        !           504: `n'
        !           505:      `n' is equivalent to `i' except that it is printed differently in
        !           506:      debugging dumps.  It is used for the line number or code number of
        !           507:      a `note' insn.
        !           508: 
        !           509: `S'
        !           510:      `S' indicates a string which is optional.  In the RTL objects in
        !           511:      core, `S' is equivalent to `s', but when the object is read, from
        !           512:      an `md' file, the string value of this operand may be omitted.  An
        !           513:      omitted string is taken to be the null string.
        !           514: 
        !           515: `V'
        !           516:      `V' indicates a vector which is optional.  In the RTL objects in
        !           517:      core, `V' is equivalent to `E', but when the object is read from
        !           518:      an `md' file, the vector value of this operand may be omitted.  An
        !           519:      omitted vector is effectively the same as a vector of no elements.
        !           520: 
        !           521: `0'
        !           522:      `0' means a slot whose contents do not fit any normal category.
        !           523:      `0' slots are not printed at all in dumps, and are often used in
        !           524:      special ways by small parts of the compiler.
        !           525: 
        !           526:    There are macros to get the number of operands, the format, and the
        !           527: class of an expression code:
        !           528: 
        !           529: `GET_RTX_LENGTH (CODE)'
        !           530:      Number of operands of an RTX of code CODE.
        !           531: 
        !           532: `GET_RTX_FORMAT (CODE)'
        !           533:      The format of an RTX of code CODE, as a C string.
        !           534: 
        !           535: `GET_RTX_CLASS (CODE)'
        !           536:      A single character representing the type of RTX operation that code
        !           537:      CODE performs.
        !           538: 
        !           539:      The following classes are defined:
        !           540: 
        !           541:     `o'
        !           542:           An RTX code that represents an actual object, such as `reg' or
        !           543:           `mem'.  `subreg' is not in this class.
        !           544: 
        !           545:     `<'
        !           546:           An RTX code for a comparison.  The codes in this class are
        !           547:           `NE', `EQ', `LE', `LT', `GE', `GT', `LEU', `LTU', `GEU',
        !           548:           `GTU'.
        !           549: 
        !           550:     `1'
        !           551:           An RTX code for a unary arithmetic operation, such as `neg'.
        !           552: 
        !           553:     `c'
        !           554:           An RTX code for a commutative binary operation, other than
        !           555:           `NE' and `EQ' (which have class `<').
        !           556: 
        !           557:     `2'
        !           558:           An RTX code for a noncommutative binary operation, such as
        !           559:           `MINUS'.
        !           560: 
        !           561:     `b'
        !           562:           An RTX code for a bitfield operation, either `ZERO_EXTRACT' or
        !           563:           `SIGN_EXTRACT'.
        !           564: 
        !           565:     `3'
        !           566:           An RTX code for other three input operations, such as
        !           567:           `IF_THEN_ELSE'.
        !           568: 
        !           569:     `i'
        !           570:           An RTX code for a machine insn (`INSN', `JUMP_INSN', and
        !           571:           `CALL_INSN').
        !           572: 
        !           573:     `m'
        !           574:           An RTX code for something that matches in insns, such as
        !           575:           `MATCH_DUP'.
        !           576: 
        !           577:     `x'
        !           578:           All other RTX codes.
        !           579: 
        !           580:    Operands of expressions are accessed using the macros `XEXP',
        !           581: `XINT', `XWINT' and `XSTR'.  Each of these macros takes two arguments:
        !           582: an expression-pointer (RTX) and an operand number (counting from zero).
        !           583: Thus,
        !           584: 
        !           585:      XEXP (X, 2)
        !           586: 
        !           587: accesses operand 2 of expression X, as an expression.
        !           588: 
        !           589:      XINT (X, 2)
        !           590: 
        !           591: accesses the same operand as an integer.  `XSTR', used in the same
        !           592: fashion, would access it as a string.
        !           593: 
        !           594:    Any operand can be accessed as an integer, as an expression or as a
        !           595: string.  You must choose the correct method of access for the kind of
        !           596: value actually stored in the operand.  You would do this based on the
        !           597: expression code of the containing expression.  That is also how you
        !           598: would know how many operands there are.
        !           599: 
        !           600:    For example, if X is a `subreg' expression, you know that it has two
        !           601: operands which can be correctly accessed as `XEXP (X, 0)' and `XINT (X,
        !           602: 1)'.  If you did `XINT (X, 0)', you would get the address of the
        !           603: expression operand but cast as an integer; that might occasionally be
        !           604: useful, but it would be cleaner to write `(int) XEXP (X, 0)'.  `XEXP
        !           605: (X, 1)' would also compile without error, and would return the second,
        !           606: integer operand cast as an expression pointer, which would probably
        !           607: result in a crash when accessed.  Nothing stops you from writing `XEXP
        !           608: (X, 28)' either, but this will access memory past the end of the
        !           609: expression with unpredictable results.
        !           610: 
        !           611:    Access to operands which are vectors is more complicated.  You can
        !           612: use the macro `XVEC' to get the vector-pointer itself, or the macros
        !           613: `XVECEXP' and `XVECLEN' to access the elements and length of a vector.
        !           614: 
        !           615: `XVEC (EXP, IDX)'
        !           616:      Access the vector-pointer which is operand number IDX in EXP.
        !           617: 
        !           618: `XVECLEN (EXP, IDX)'
        !           619:      Access the length (number of elements) in the vector which is in
        !           620:      operand number IDX in EXP.  This value is an `int'.
        !           621: 
        !           622: `XVECEXP (EXP, IDX, ELTNUM)'
        !           623:      Access element number ELTNUM in the vector which is in operand
        !           624:      number IDX in EXP.  This value is an RTX.
        !           625: 
        !           626:      It is up to you to make sure that ELTNUM is not negative and is
        !           627:      less than `XVECLEN (EXP, IDX)'.
        !           628: 
        !           629:    All the macros defined in this section expand into lvalues and
        !           630: therefore can be used to assign the operands, lengths and vector
        !           631: elements as well as to access them.
        !           632: 
        !           633: 
        !           634: File: gcc.info,  Node: Flags,  Next: Machine Modes,  Prev: Accessors,  Up: RTL
        !           635: 
        !           636: Flags in an RTL Expression
        !           637: ==========================
        !           638: 
        !           639:    RTL expressions contain several flags (one-bit bitfields) that are
        !           640: used in certain types of expression.  Most often they are accessed with
        !           641: the following macros:
        !           642: 
        !           643: `MEM_VOLATILE_P (X)'
        !           644:      In `mem' expressions, nonzero for volatile memory references.
        !           645:      Stored in the `volatil' field and printed as `/v'.
        !           646: 
        !           647: `MEM_IN_STRUCT_P (X)'
        !           648:      In `mem' expressions, nonzero for reference to an entire
        !           649:      structure, union or array, or to a component of one.  Zero for
        !           650:      references to a scalar variable or through a pointer to a scalar.
        !           651:      Stored in the `in_struct' field and printed as `/s'.
        !           652: 
        !           653: `REG_LOOP_TEST_P'
        !           654:      In `reg' expressions, nonzero if this register's entire life is
        !           655:      contained in the exit test code for some loop.  Stored in the
        !           656:      `in_struct' field and printed as `/s'.
        !           657: 
        !           658: `REG_USERVAR_P (X)'
        !           659:      In a `reg', nonzero if it corresponds to a variable present in the
        !           660:      user's source code.  Zero for temporaries generated internally by
        !           661:      the compiler.  Stored in the `volatil' field and printed as `/v'.
        !           662: 
        !           663: `REG_FUNCTION_VALUE_P (X)'
        !           664:      Nonzero in a `reg' if it is the place in which this function's
        !           665:      value is going to be returned.  (This happens only in a hard
        !           666:      register.)  Stored in the `integrated' field and printed as `/i'.
        !           667: 
        !           668:      The same hard register may be used also for collecting the values
        !           669:      of functions called by this one, but `REG_FUNCTION_VALUE_P' is zero
        !           670:      in this kind of use.
        !           671: 
        !           672: `SUBREG_PROMOTED_VAR_P'
        !           673:      Nonzero in a `subreg' if it was made when accessing an object that
        !           674:      was promoted to a wider mode in accord with the `PROMOTED_MODE'
        !           675:      machine description macro (*note Storage Layout::.).  In this
        !           676:      case, the mode of the `subreg' is the declared mode of the object
        !           677:      and the mode of `SUBREG_REG' is the mode of the register that
        !           678:      holds the object.  Promoted variables are always either sign- or
        !           679:      zero-extended to the wider mode on every assignment.  Stored in
        !           680:      the `in_struct' field and printed as `/s'.
        !           681: 
        !           682: `SUBREG_PROMOTED_UNSIGNED_P'
        !           683:      Nonzero in a `subreg' that has `SUBREG_PROMOTED_VAR_P' nonzero if
        !           684:      the object being referenced is kept zero-extended and zero if it
        !           685:      is kept sign-extended.  Stored in the `unchanging' field and
        !           686:      printed as `/u'.
        !           687: 
        !           688: `RTX_UNCHANGING_P (X)'
        !           689:      Nonzero in a `reg' or `mem' if the value is not changed.  (This
        !           690:      flag is not set for memory references via pointers to constants.
        !           691:      Such pointers only guarantee that the object will not be changed
        !           692:      explicitly by the current function.  The object might be changed by
        !           693:      other functions or by aliasing.)  Stored in the `unchanging' field
        !           694:      and printed as `/u'.
        !           695: 
        !           696: `RTX_INTEGRATED_P (INSN)'
        !           697:      Nonzero in an insn if it resulted from an in-line function call.
        !           698:      Stored in the `integrated' field and printed as `/i'.  This may be
        !           699:      deleted; nothing currently depends on it.
        !           700: 
        !           701: `SYMBOL_REF_USED (X)'
        !           702:      In a `symbol_ref', indicates that X has been used.  This is
        !           703:      normally only used to ensure that X is only declared external
        !           704:      once.  Stored in the `used' field.
        !           705: 
        !           706: `SYMBOL_REF_FLAG (X)'
        !           707:      In a `symbol_ref', this is used as a flag for machine-specific
        !           708:      purposes.  Stored in the `volatil' field and printed as `/v'.
        !           709: 
        !           710: `LABEL_OUTSIDE_LOOP_P'
        !           711:      In `label_ref' expressions, nonzero if this is a reference to a
        !           712:      label that is outside the innermost loop containing the reference
        !           713:      to the label.  Stored in the `in_struct' field and printed as `/s'.
        !           714: 
        !           715: `INSN_DELETED_P (INSN)'
        !           716:      In an insn, nonzero if the insn has been deleted.  Stored in the
        !           717:      `volatil' field and printed as `/v'.
        !           718: 
        !           719: `INSN_ANNULLED_BRANCH_P (INSN)'
        !           720:      In an `insn' in the delay slot of a branch insn, indicates that an
        !           721:      annulling branch should be used.  See the discussion under
        !           722:      `sequence' below.  Stored in the `unchanging' field and printed as
        !           723:      `/u'.
        !           724: 
        !           725: `INSN_FROM_TARGET_P (INSN)'
        !           726:      In an `insn' in a delay slot of a branch, indicates that the insn
        !           727:      is from the target of the branch.  If the branch insn has
        !           728:      `INSN_ANNULLED_BRANCH_P' set, this insn should only be executed if
        !           729:      the branch is taken.  For annulled branches with this bit clear,
        !           730:      the insn should be executed only if the branch is not taken.
        !           731:      Stored in the `in_struct' field and printed as `/s'.
        !           732: 
        !           733: `CONSTANT_POOL_ADDRESS_P (X)'
        !           734:      Nonzero in a `symbol_ref' if it refers to part of the current
        !           735:      function's "constants pool".  These are addresses close to the
        !           736:      beginning of the function, and GNU CC assumes they can be addressed
        !           737:      directly (perhaps with the help of base registers).  Stored in the
        !           738:      `unchanging' field and printed as `/u'.
        !           739: 
        !           740: `CONST_CALL_P (X)'
        !           741:      In a `call_insn', indicates that the insn represents a call to a
        !           742:      const function.  Stored in the `unchanging' field and printed as
        !           743:      `/u'.
        !           744: 
        !           745: `LABEL_PRESERVE_P (X)'
        !           746:      In a `code_label', indicates that the label can never be deleted.
        !           747:      Labels referenced by a non-local goto will have this bit set.
        !           748:      Stored in the `in_struct' field and printed as `/s'.
        !           749: 
        !           750: `SCHED_GROUP_P (INSN)'
        !           751:      During instruction scheduling, in an insn, indicates that the
        !           752:      previous insn must be scheduled together with this insn.  This is
        !           753:      used to ensure that certain groups of instructions will not be
        !           754:      split up by the instruction scheduling pass, for example, `use'
        !           755:      insns before a `call_insn' may not be separated from the
        !           756:      `call_insn'.  Stored in the `in_struct' field and printed as `/s'.
        !           757: 
        !           758:    These are the fields which the above macros refer to:
        !           759: 
        !           760: `used'
        !           761:      Normally, this flag is used only momentarily, at the end of RTL
        !           762:      generation for a function, to count the number of times an
        !           763:      expression appears in insns.  Expressions that appear more than
        !           764:      once are copied, according to the rules for shared structure
        !           765:      (*note Sharing::.).
        !           766: 
        !           767:      In a `symbol_ref', it indicates that an external declaration for
        !           768:      the symbol has already been written.
        !           769: 
        !           770:      In a `reg', it is used by the leaf register renumbering code to
        !           771:      ensure that each register is only renumbered once.
        !           772: 
        !           773: `volatil'
        !           774:      This flag is used in `mem', `symbol_ref' and `reg' expressions and
        !           775:      in insns.  In RTL dump files, it is printed as `/v'.
        !           776: 
        !           777:      In a `mem' expression, it is 1 if the memory reference is volatile.
        !           778:      Volatile memory references may not be deleted, reordered or
        !           779:      combined.
        !           780: 
        !           781:      In a `symbol_ref' expression, it is used for machine-specific
        !           782:      purposes.
        !           783: 
        !           784:      In a `reg' expression, it is 1 if the value is a user-level
        !           785:      variable.  0 indicates an internal compiler temporary.
        !           786: 
        !           787:      In an insn, 1 means the insn has been deleted.
        !           788: 
        !           789: `in_struct'
        !           790:      In `mem' expressions, it is 1 if the memory datum referred to is
        !           791:      all or part of a structure or array; 0 if it is (or might be) a
        !           792:      scalar variable.  A reference through a C pointer has 0 because
        !           793:      the pointer might point to a scalar variable.  This information
        !           794:      allows the compiler to determine something about possible cases of
        !           795:      aliasing.
        !           796: 
        !           797:      In an insn in the delay slot of a branch, 1 means that this insn
        !           798:      is from the target of the branch.
        !           799: 
        !           800:      During instruction scheduling, in an insn, 1 means that this insn
        !           801:      must be scheduled as part of a group together with the previous
        !           802:      insn.
        !           803: 
        !           804:      In `reg' expressions, it is 1 if the register has its entire life
        !           805:      contained within the test expression of some loop.
        !           806: 
        !           807:      In `subreg' expressions, 1 means that the `subreg' is accessing an
        !           808:      object that has had its mode promoted from a wider mode.
        !           809: 
        !           810:      In `label_ref' expressions, 1 means that the referenced label is
        !           811:      outside the innermost loop containing the insn in which the
        !           812:      `label_ref' was found.
        !           813: 
        !           814:      In `code_label' expressions, it is 1 if the label may never be
        !           815:      deleted.  This is used for labels which are the target of
        !           816:      non-local gotos.
        !           817: 
        !           818:      In an RTL dump, this flag is represented as `/s'.
        !           819: 
        !           820: `unchanging'
        !           821:      In `reg' and `mem' expressions, 1 means that the value of the
        !           822:      expression never changes.
        !           823: 
        !           824:      In `subreg' expressions, it is 1 if the `subreg' references an
        !           825:      unsigned object whose mode has been promoted to a wider mode.
        !           826: 
        !           827:      In an insn, 1 means that this is an annulling branch.
        !           828: 
        !           829:      In a `symbol_ref' expression, 1 means that this symbol addresses
        !           830:      something in the per-function constants pool.
        !           831: 
        !           832:      In a `call_insn', 1 means that this instruction is a call to a
        !           833:      const function.
        !           834: 
        !           835:      In an RTL dump, this flag is represented as `/u'.
        !           836: 
        !           837: `integrated'
        !           838:      In some kinds of expressions, including insns, this flag means the
        !           839:      rtl was produced by procedure integration.
        !           840: 
        !           841:      In a `reg' expression, this flag indicates the register containing
        !           842:      the value to be returned by the current function.  On machines
        !           843:      that pass parameters in registers, the same register number may be
        !           844:      used for parameters as well, but this flag is not set on such uses.
        !           845: 
        !           846: 
        !           847: File: gcc.info,  Node: Machine Modes,  Next: Constants,  Prev: Flags,  Up: RTL
        !           848: 
        !           849: Machine Modes
        !           850: =============
        !           851: 
        !           852:    A machine mode describes a size of data object and the
        !           853: representation used for it.  In the C code, machine modes are
        !           854: represented by an enumeration type, `enum machine_mode', defined in
        !           855: `machmode.def'.  Each RTL expression has room for a machine mode and so
        !           856: do certain kinds of tree expressions (declarations and types, to be
        !           857: precise).
        !           858: 
        !           859:    In debugging dumps and machine descriptions, the machine mode of an
        !           860: RTL expression is written after the expression code with a colon to
        !           861: separate them.  The letters `mode' which appear at the end of each
        !           862: machine mode name are omitted.  For example, `(reg:SI 38)' is a `reg'
        !           863: expression with machine mode `SImode'.  If the mode is `VOIDmode', it
        !           864: is not written at all.
        !           865: 
        !           866:    Here is a table of machine modes.  The term "byte" below refers to an
        !           867: object of `BITS_PER_UNIT' bits (*note Storage Layout::.).
        !           868: 
        !           869: `QImode'
        !           870:      "Quarter-Integer" mode represents a single byte treated as an
        !           871:      integer.
        !           872: 
        !           873: `HImode'
        !           874:      "Half-Integer" mode represents a two-byte integer.
        !           875: 
        !           876: `PSImode'
        !           877:      "Partial Single Integer" mode represents an integer which occupies
        !           878:      four bytes but which doesn't really use all four.  On some
        !           879:      machines, this is the right mode to use for pointers.
        !           880: 
        !           881: `SImode'
        !           882:      "Single Integer" mode represents a four-byte integer.
        !           883: 
        !           884: `PDImode'
        !           885:      "Partial Double Integer" mode represents an integer which occupies
        !           886:      eight bytes but which doesn't really use all eight.  On some
        !           887:      machines, this is the right mode to use for certain pointers.
        !           888: 
        !           889: `DImode'
        !           890:      "Double Integer" mode represents an eight-byte integer.
        !           891: 
        !           892: `TImode'
        !           893:      "Tetra Integer" (?) mode represents a sixteen-byte integer.
        !           894: 
        !           895: `SFmode'
        !           896:      "Single Floating" mode represents a single-precision (four byte)
        !           897:      floating point number.
        !           898: 
        !           899: `DFmode'
        !           900:      "Double Floating" mode represents a double-precision (eight byte)
        !           901:      floating point number.
        !           902: 
        !           903: `XFmode'
        !           904:      "Extended Floating" mode represents a triple-precision (twelve
        !           905:      byte) floating point number.  This mode is used for IEEE extended
        !           906:      floating point.
        !           907: 
        !           908: `TFmode'
        !           909:      "Tetra Floating" mode represents a quadruple-precision (sixteen
        !           910:      byte) floating point number.
        !           911: 
        !           912: `CCmode'
        !           913:      "Condition Code" mode represents the value of a condition code,
        !           914:      which is a machine-specific set of bits used to represent the
        !           915:      result of a comparison operation.  Other machine-specific modes
        !           916:      may also be used for the condition code.  These modes are not used
        !           917:      on machines that use `cc0' (see *note Condition Code::.).
        !           918: 
        !           919: `BLKmode'
        !           920:      "Block" mode represents values that are aggregates to which none of
        !           921:      the other modes apply.  In RTL, only memory references can have
        !           922:      this mode, and only if they appear in string-move or vector
        !           923:      instructions.  On machines which have no such instructions,
        !           924:      `BLKmode' will not appear in RTL.
        !           925: 
        !           926: `VOIDmode'
        !           927:      Void mode means the absence of a mode or an unspecified mode.  For
        !           928:      example, RTL expressions of code `const_int' have mode `VOIDmode'
        !           929:      because they can be taken to have whatever mode the context
        !           930:      requires.  In debugging dumps of RTL, `VOIDmode' is expressed by
        !           931:      the absence of any mode.
        !           932: 
        !           933: `SCmode, DCmode, XCmode, TCmode'
        !           934:      These modes stand for a complex number represented as a pair of
        !           935:      floating point values.  The floating point values are in `SFmode',
        !           936:      `DFmode', `XFmode', and `TFmode', respectively.
        !           937: 
        !           938: `CQImode, CHImode, CSImode, CDImode, CTImode, COImode'
        !           939:      These modes stand for a complex number represented as a pair of
        !           940:      integer values.  The integer values are in `QImode', `HImode',
        !           941:      `SImode', `DImode', `TImode', and `OImode', respectively.
        !           942: 
        !           943:    The machine description defines `Pmode' as a C macro which expands
        !           944: into the machine mode used for addresses.  Normally this is the mode
        !           945: whose size is `BITS_PER_WORD', `SImode' on 32-bit machines.
        !           946: 
        !           947:    The only modes which a machine description must support are
        !           948: `QImode', and the modes corresponding to `BITS_PER_WORD',
        !           949: `FLOAT_TYPE_SIZE' and `DOUBLE_TYPE_SIZE'.  The compiler will attempt to
        !           950: use `DImode' for 8-byte structures and unions, but this can be
        !           951: prevented by overriding the definition of `MAX_FIXED_MODE_SIZE'.
        !           952: Alternatively, you can have the compiler use `TImode' for 16-byte
        !           953: structures and unions.  Likewise, you can arrange for the C type `short
        !           954: int' to avoid using `HImode'.
        !           955: 
        !           956:    Very few explicit references to machine modes remain in the compiler
        !           957: and these few references will soon be removed.  Instead, the machine
        !           958: modes are divided into mode classes.  These are represented by the
        !           959: enumeration type `enum mode_class' defined in `machmode.h'.  The
        !           960: possible mode classes are:
        !           961: 
        !           962: `MODE_INT'
        !           963:      Integer modes.  By default these are `QImode', `HImode', `SImode',
        !           964:      `DImode', and `TImode'.
        !           965: 
        !           966: `MODE_PARTIAL_INT'
        !           967:      The "partial integer" modes, `PSImode' and `PDImode'.
        !           968: 
        !           969: `MODE_FLOAT'
        !           970:      floating point modes.  By default these are `SFmode', `DFmode',
        !           971:      `XFmode' and `TFmode'.
        !           972: 
        !           973: `MODE_COMPLEX_INT'
        !           974:      Complex integer modes.  (These are not currently implemented).
        !           975: 
        !           976: `MODE_COMPLEX_FLOAT'
        !           977:      Complex floating point modes.  By default these are `SCmode',
        !           978:      `DCmode', `XCmode', and `TCmode'.
        !           979: 
        !           980: `MODE_FUNCTION'
        !           981:      Algol or Pascal function variables including a static chain.
        !           982:      (These are not currently implemented).
        !           983: 
        !           984: `MODE_CC'
        !           985:      Modes representing condition code values.  These are `CCmode' plus
        !           986:      any modes listed in the `EXTRA_CC_MODES' macro.  *Note Jump
        !           987:      Patterns::, also see *Note Condition Code::.
        !           988: 
        !           989: `MODE_RANDOM'
        !           990:      This is a catchall mode class for modes which don't fit into the
        !           991:      above classes.  Currently `VOIDmode' and `BLKmode' are in
        !           992:      `MODE_RANDOM'.
        !           993: 
        !           994:    Here are some C macros that relate to machine modes:
        !           995: 
        !           996: `GET_MODE (X)'
        !           997:      Returns the machine mode of the RTX X.
        !           998: 
        !           999: `PUT_MODE (X, NEWMODE)'
        !          1000:      Alters the machine mode of the RTX X to be NEWMODE.
        !          1001: 
        !          1002: `NUM_MACHINE_MODES'
        !          1003:      Stands for the number of machine modes available on the target
        !          1004:      machine.  This is one greater than the largest numeric value of any
        !          1005:      machine mode.
        !          1006: 
        !          1007: `GET_MODE_NAME (M)'
        !          1008:      Returns the name of mode M as a string.
        !          1009: 
        !          1010: `GET_MODE_CLASS (M)'
        !          1011:      Returns the mode class of mode M.
        !          1012: 
        !          1013: `GET_MODE_WIDER_MODE (M)'
        !          1014:      Returns the next wider natural mode.  For example, the expression
        !          1015:      `GET_MODE_WIDER_MODE (QImode)' returns `HImode'.
        !          1016: 
        !          1017: `GET_MODE_SIZE (M)'
        !          1018:      Returns the size in bytes of a datum of mode M.
        !          1019: 
        !          1020: `GET_MODE_BITSIZE (M)'
        !          1021:      Returns the size in bits of a datum of mode M.
        !          1022: 
        !          1023: `GET_MODE_MASK (M)'
        !          1024:      Returns a bitmask containing 1 for all bits in a word that fit
        !          1025:      within mode M.  This macro can only be used for modes whose
        !          1026:      bitsize is less than or equal to `HOST_BITS_PER_INT'.
        !          1027: 
        !          1028: `GET_MODE_ALIGNMENT (M))'
        !          1029:      Return the required alignment, in bits, for an object of mode M.
        !          1030: 
        !          1031: `GET_MODE_UNIT_SIZE (M)'
        !          1032:      Returns the size in bytes of the subunits of a datum of mode M.
        !          1033:      This is the same as `GET_MODE_SIZE' except in the case of complex
        !          1034:      modes.  For them, the unit size is the size of the real or
        !          1035:      imaginary part.
        !          1036: 
        !          1037: `GET_MODE_NUNITS (M)'
        !          1038:      Returns the number of units contained in a mode, i.e.,
        !          1039:      `GET_MODE_SIZE' divided by `GET_MODE_UNIT_SIZE'.
        !          1040: 
        !          1041: `GET_CLASS_NARROWEST_MODE (C)'
        !          1042:      Returns the narrowest mode in mode class C.
        !          1043: 
        !          1044:    The global variables `byte_mode' and `word_mode' contain modes whose
        !          1045: classes are `MODE_INT' and whose bitsizes are either `BITS_PER_UNIT' or
        !          1046: `BITS_PER_WORD', respectively.  On 32-bit machines, these are `QImode'
        !          1047: and `SImode', respectively.
        !          1048: 
        !          1049: 
        !          1050: File: gcc.info,  Node: Constants,  Next: Regs and Memory,  Prev: Machine Modes,  Up: RTL
        !          1051: 
        !          1052: Constant Expression Types
        !          1053: =========================
        !          1054: 
        !          1055:    The simplest RTL expressions are those that represent constant
        !          1056: values.
        !          1057: 
        !          1058: `(const_int I)'
        !          1059:      This type of expression represents the integer value I.  I is
        !          1060:      customarily accessed with the macro `INTVAL' as in `INTVAL (EXP)',
        !          1061:      which is equivalent to `XWINT (EXP, 0)'.
        !          1062: 
        !          1063:      There is only one expression object for the integer value zero; it
        !          1064:      is the value of the variable `const0_rtx'.  Likewise, the only
        !          1065:      expression for integer value one is found in `const1_rtx', the only
        !          1066:      expression for integer value two is found in `const2_rtx', and the
        !          1067:      only expression for integer value negative one is found in
        !          1068:      `constm1_rtx'.  Any attempt to create an expression of code
        !          1069:      `const_int' and value zero, one, two or negative one will return
        !          1070:      `const0_rtx', `const1_rtx', `const2_rtx' or `constm1_rtx' as
        !          1071:      appropriate.
        !          1072: 
        !          1073:      Similarly, there is only one object for the integer whose value is
        !          1074:      `STORE_FLAG_VALUE'.  It is found in `const_true_rtx'.  If
        !          1075:      `STORE_FLAG_VALUE' is one, `const_true_rtx' and `const1_rtx' will
        !          1076:      point to the same object.  If `STORE_FLAG_VALUE' is -1,
        !          1077:      `const_true_rtx' and `constm1_rtx' will point to the same object.
        !          1078: 
        !          1079: `(const_double:M ADDR I0 I1 ...)'
        !          1080:      Represents either a floating-point constant of mode M or an
        !          1081:      integer constant too large to fit into `HOST_BITS_PER_WIDE_INT'
        !          1082:      bits but small enough to fit within twice that number of bits (GNU
        !          1083:      CC does not provide a mechanism to represent even larger
        !          1084:      constants).  In the latter case, M will be `VOIDmode'.
        !          1085: 
        !          1086:      ADDR is used to contain the `mem' expression that corresponds to
        !          1087:      the location in memory that at which the constant can be found.  If
        !          1088:      it has not been allocated a memory location, but is on the chain
        !          1089:      of all `const_double' expressions in this compilation (maintained
        !          1090:      using an undisplayed field), ADDR contains `const0_rtx'.  If it is
        !          1091:      not on the chain, ADDR contains `cc0_rtx'.  ADDR is customarily
        !          1092:      accessed with the macro `CONST_DOUBLE_MEM' and the chain field via
        !          1093:      `CONST_DOUBLE_CHAIN'.
        !          1094: 
        !          1095:      If M is `VOIDmode', the bits of the value are stored in I0 and I1.
        !          1096:      I0 is customarily accessed with the macro `CONST_DOUBLE_LOW' and
        !          1097:      I1 with `CONST_DOUBLE_HIGH'.
        !          1098: 
        !          1099:      If the constant is floating point (regardless of its precision),
        !          1100:      then the number of integers used to store the value depends on the
        !          1101:      size of `REAL_VALUE_TYPE' (*note Cross-compilation::.).  The
        !          1102:      integers represent a floating point number, but not precisely in
        !          1103:      the target machine's or host machine's floating point format.  To
        !          1104:      convert them to the precise bit pattern used by the target
        !          1105:      machine, use the macro `REAL_VALUE_TO_TARGET_DOUBLE' and friends
        !          1106:      (*note Data Output::.).
        !          1107: 
        !          1108:      The macro `CONST0_RTX (MODE)' refers to an expression with value 0
        !          1109:      in mode MODE.  If mode MODE is of mode class `MODE_INT', it
        !          1110:      returns `const0_rtx'.  Otherwise, it returns a `CONST_DOUBLE'
        !          1111:      expression in mode MODE.  Similarly, the macro `CONST1_RTX (MODE)'
        !          1112:      refers to an expression with value 1 in mode MODE and similarly
        !          1113:      for `CONST2_RTX'.
        !          1114: 
        !          1115: `(const_string STR)'
        !          1116:      Represents a constant string with value STR.  Currently this is
        !          1117:      used only for insn attributes (*note Insn Attributes::.) since
        !          1118:      constant strings in C are placed in memory.
        !          1119: 
        !          1120: `(symbol_ref:MODE SYMBOL)'
        !          1121:      Represents the value of an assembler label for data.  SYMBOL is a
        !          1122:      string that describes the name of the assembler label.  If it
        !          1123:      starts with a `*', the label is the rest of SYMBOL not including
        !          1124:      the `*'.  Otherwise, the label is SYMBOL, usually prefixed with
        !          1125:      `_'.
        !          1126: 
        !          1127:      The `symbol_ref' contains a mode, which is usually `Pmode'.
        !          1128:      Usually that is the only mode for which a symbol is directly valid.
        !          1129: 
        !          1130: `(label_ref LABEL)'
        !          1131:      Represents the value of an assembler label for code.  It contains
        !          1132:      one operand, an expression, which must be a `code_label' that
        !          1133:      appears in the instruction sequence to identify the place where
        !          1134:      the label should go.
        !          1135: 
        !          1136:      The reason for using a distinct expression type for code label
        !          1137:      references is so that jump optimization can distinguish them.
        !          1138: 
        !          1139: `(const:M EXP)'
        !          1140:      Represents a constant that is the result of an assembly-time
        !          1141:      arithmetic computation.  The operand, EXP, is an expression that
        !          1142:      contains only constants (`const_int', `symbol_ref' and `label_ref'
        !          1143:      expressions) combined with `plus' and `minus'.  However, not all
        !          1144:      combinations are valid, since the assembler cannot do arbitrary
        !          1145:      arithmetic on relocatable symbols.
        !          1146: 
        !          1147:      M should be `Pmode'.
        !          1148: 
        !          1149: `(high:M EXP)'
        !          1150:      Represents the high-order bits of EXP, usually a `symbol_ref'.
        !          1151:      The number of bits is machine-dependent and is normally the number
        !          1152:      of bits specified in an instruction that initializes the high
        !          1153:      order bits of a register.  It is used with `lo_sum' to represent
        !          1154:      the typical two-instruction sequence used in RISC machines to
        !          1155:      reference a global memory location.
        !          1156: 
        !          1157:      M should be `Pmode'.
        !          1158: 

unix.superglobalmegacorp.com

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