Annotation of researchv10dc/cmd/gcc/internals-3, revision 1.1.1.1

1.1       root        1: 
                      2: 
                      3: File: internals,  Node: Passes,  Next: RTL,  Prev: Interface,  Up: Top
                      4: 
                      5: Passes and Files of the Compiler
                      6: ********************************
                      7: 
                      8: The overall control structure of the compiler is in `toplev.c'.  This file
                      9: is responsible for initialization, decoding arguments, opening and closing
                     10: files, and sequencing the passes.
                     11: 
                     12: The parsing pass is invoked only once, to parse the entire input.  The RTL
                     13: intermediate code for a function is generated as the function is parsed, a
                     14: statement at a time.  Each statement is read in as a syntax tree and then
                     15: converted to RTL; then the storage for the tree for the statement is
                     16: reclaimed.  Storage for types (and the expressions for their sizes),
                     17: declarations, and a representation of the binding contours and how they
                     18: nest, remains until the function is finished being compiled; these are all
                     19: needed to output the debugging information.
                     20: 
                     21: Each time the parsing pass reads a complete function definition or
                     22: top-level declaration, it calls the function `rest_of_compilation' or
                     23: `rest_of_decl_compilation' in `toplev.c', which are responsible for all
                     24: further processing necessary, ending with output of the assembler language.
                     25:  All other compiler passes run, in sequence, within `rest_of_compilation'. 
                     26: When that function returns from compiling a function definition, the
                     27: storage used for that function definition's compilation is entirely freed,
                     28: unless it is an inline function (*Note Inline::.).
                     29: 
                     30: Here is a list of all the passes of the compiler and their source files. 
                     31: Also included is a description of where debugging dumps can be requested
                     32: with `-d' options.
                     33: 
                     34:    * Parsing.  This pass reads the entire text of a function definition,
                     35:      constructing partial syntax trees.  This and RTL generation are no
                     36:      longer truly separate passes (formerly they were), but it is easier to
                     37:      think of them as separate.
                     38: 
                     39:      The tree representation does not entirely follow C syntax, because it
                     40:      is intended to support other languages as well.
                     41: 
                     42:      C data type analysis is also done in this pass, and every tree node
                     43:      that represents an expression has a data type attached.  Variables are
                     44:      represented as declaration nodes.
                     45: 
                     46:      Constant folding and associative-law simplifications are also done
                     47:      during this pass.
                     48: 
                     49:      The source files for parsing are `parse.y', `decl.c', `typecheck.c',
                     50:      `stor-layout.c', `fold-const.c', and `tree.c'.  The last three are
                     51:      intended to be language-independent.  There are also header files
                     52:      `parse.h', `c-tree.h', `tree.h' and `tree.def'.  The last two define
                     53:      the format of the tree representation.
                     54: 
                     55:    * RTL generation.  This is the conversion of syntax tree into RTL code. 
                     56:      It is actually done statement-by-statement during parsing, but for
                     57:      most purposes it can be thought of as a separate pass.
                     58: 
                     59:      This is where the bulk of target-parameter-dependent code is found,
                     60:      since often it is necessary for strategies to apply only when certain
                     61:      standard kinds of instructions are available.  The purpose of named
                     62:      instruction patterns is to provide this information to the RTL
                     63:      generation pass.
                     64: 
                     65:      Optimization is done in this pass for `if'-conditions that are
                     66:      comparisons, boolean operations or conditional expressions.  Tail
                     67:      recursion is detected at this time also.  Decisions are made about how
                     68:      best to arrange loops and how to output `switch' statements.
                     69: 
                     70:      The source files for RTL generation are `stmt.c', `expr.c',
                     71:      `explow.c', `expmed.c', `optabs.c' and `emit-rtl.c'.  Also, the file
                     72:      `insn-emit.c', generated from the machine description by the program
                     73:      `genemit', is used in this pass.  The header files `expr.h' is used
                     74:      for communication within this pass.
                     75: 
                     76:      The header files `insn-flags.h' and `insn-codes.h', generated from the
                     77:      machine description by the programs `genflags' and `gencodes', tell
                     78:      this pass which standard names are available for use and which
                     79:      patterns correspond to them.
                     80: 
                     81:      Aside from debugging information output, none of the following passes
                     82:      refers to the tree structure representation of the function (only part
                     83:      of which is saved).
                     84: 
                     85:      The decision of whether the function can and should be expanded inline
                     86:      in its subsequent callers is made at the end of rtl generation.  The
                     87:      function must meet certain criteria, currently related to the size of
                     88:      the function and the types and number of parameters it has.  Note that
                     89:      this function may contain loops, recursive calls to itself
                     90:      (tail-recursive functions can be inlined!), gotos, in short, all
                     91:      constructs supported by GNU CC.
                     92: 
                     93:      The option `-dr' causes a debugging dump of the RTL code after this
                     94:      pass.  This dump file's name is made by appending `.rtl' to the input
                     95:      file name.
                     96: 
                     97:    * Jump optimization.  This pass simplifies jumps to the following
                     98:      instruction, jumps across jumps, and jumps to jumps.  It deletes
                     99:      unreferenced labels and unreachable code, except that unreachable code
                    100:      that contains a loop is not recognized as unreachable in this pass. 
                    101:      (Such loops are deleted later in the basic block analysis.)
                    102: 
                    103:      Jump optimization is performed two or three times.  The first time is
                    104:      immediately following RTL generation.  The second time is after CSE,
                    105:      but only if CSE says repeated jump optimization is needed.  The last
                    106:      time is right before the final pass.  That time, cross-jumping and
                    107:      deletion of no-op move instructions are done together with the
                    108:      optimizations described above.
                    109: 
                    110:      The source file of this pass is `jump.c'.
                    111: 
                    112:      The option `-dj' causes a debugging dump of the RTL code after this
                    113:      pass is run for the first time.  This dump file's name is made by
                    114:      appending `.jump' to the input file name.
                    115: 
                    116:    * Register scan.  This pass finds the first and last use of each
                    117:      register, as a guide for common subexpression elimination.  Its source
                    118:      is in `regclass.c'.
                    119: 
                    120:    * Common subexpression elimination.  This pass also does constant
                    121:      propagation.  Its source file is `cse.c'.  If constant propagation
                    122:      causes conditional jumps to become unconditional or to become no-ops,
                    123:      jump optimization is run again when CSE is finished.
                    124: 
                    125:      The option `-ds' causes a debugging dump of the RTL code after this
                    126:      pass.  This dump file's name is made by appending `.cse' to the input
                    127:      file name.
                    128: 
                    129:    * Loop optimization.  This pass moves constant expressions out of loops.
                    130:       Its source file is `loop.c'.
                    131: 
                    132:      The option `-dL' causes a debugging dump of the RTL code after this
                    133:      pass.  This dump file's name is made by appending `.loop' to the input
                    134:      file name.
                    135: 
                    136:    * Stupid register allocation is performed at this point in a
                    137:      nonoptimizing compilation.  It does a little data flow analysis as
                    138:      well.  When stupid register allocation is in use, the next pass
                    139:      executed is the reloading pass; the others in between are skipped. 
                    140:      The source file is `stupid.c'.
                    141: 
                    142:    * Data flow analysis (`flow.c').  This pass divides the program into
                    143:      basic blocks (and in the process deletes unreachable loops); then it
                    144:      computes which pseudo-registers are live at each point in the program,
                    145:      and makes the first instruction that uses a value point at the
                    146:      instruction that computed the value.
                    147: 
                    148:      This pass also deletes computations whose results are never used, and
                    149:      combines memory references with add or subtract instructions to make
                    150:      autoincrement or autodecrement addressing.
                    151: 
                    152:      The option `-df' causes a debugging dump of the RTL code after this
                    153:      pass.  This dump file's name is made by appending `.flow' to the input
                    154:      file name.  If stupid register allocation is in use, this dump file
                    155:      reflects the full results of such allocation.
                    156: 
                    157:    * Instruction combination (`combine.c').  This pass attempts to combine
                    158:      groups of two or three instructions that are related by data flow into
                    159:      single instructions.  It combines the RTL expressions for the
                    160:      instructions by substitution, simplifies the result using algebra, and
                    161:      then attempts to match the result against the machine description.
                    162: 
                    163:      The option `-dc' causes a debugging dump of the RTL code after this
                    164:      pass.  This dump file's name is made by appending `.combine' to the
                    165:      input file name.
                    166: 
                    167:    * Register class preferencing.  The RTL code is scanned to find out
                    168:      which register class is best for each pseudo register.  The source
                    169:      file is `regclass.c'.
                    170: 
                    171:    * Local register allocation (`local-alloc.c').  This pass allocates hard
                    172:      registers to pseudo registers that are used only within one basic
                    173:      block.  Because the basic block is linear, it can use fast and
                    174:      powerful techniques to do a very good job.
                    175: 
                    176:      The option `-dl' causes a debugging dump of the RTL code after this
                    177:      pass.  This dump file's name is made by appending `.lreg' to the input
                    178:      file name.
                    179: 
                    180:    * Global register allocation (`global-alloc.c').  This pass allocates
                    181:      hard registers for the remaining pseudo registers (those whose life
                    182:      spans are not contained in one basic block).
                    183: 
                    184:    * Reloading.  This pass renumbers pseudo registers with the hardware
                    185:      registers numbers they were allocated.  Pseudo registers that did not
                    186:      get hard registers are replaced with stack slots.  Then it finds
                    187:      instructions that are invalid because a value has failed to end up in
                    188:      a register, or has ended up in a register of the wrong kind.  It fixes
                    189:      up these instructions by reloading the problematical values
                    190:      temporarily into registers.  Additional instructions are generated to
                    191:      do the copying.
                    192: 
                    193:      Source files are `reload.c' and `reload1.c', plus the header
                    194:      `reload.h' used for communication between them.
                    195: 
                    196:      The option `-dg' causes a debugging dump of the RTL code after this
                    197:      pass.  This dump file's name is made by appending `.greg' to the input
                    198:      file name.
                    199: 
                    200:    * Jump optimization is repeated, this time including cross-jumping and
                    201:      deletion of no-op move instructions.  Machine-specific peephole
                    202:      optimizations are performed at the same time.
                    203: 
                    204:      The option `-dJ' causes a debugging dump of the RTL code after this
                    205:      pass.  This dump file's name is made by appending `.jump2' to the
                    206:      input file name.
                    207: 
                    208:    * Final.  This pass outputs the assembler code for the function.  It is
                    209:      also responsible for identifying spurious test and compare
                    210:      instructions.  The function entry and exit sequences are generated
                    211:      directly as assembler code in this pass; they never exist as RTL.
                    212: 
                    213:      The source files are `final.c' plus `insn-output.c'; the latter is
                    214:      generated automatically from the machine description by the tool
                    215:      `genoutput'.  The header file `conditions.h' is used for communication
                    216:      between these files.
                    217: 
                    218:    * Debugging information output.  This is run after final because it must
                    219:      output the stack slot offsets for pseudo registers that did not get
                    220:      hard registers.  Source files are `dbxout.c' for DBX symbol table
                    221:      format and `symout.c' for GDB's own symbol table format.
                    222: 
                    223: Some additional files are used by all or many passes:
                    224: 
                    225:    * Every pass uses `machmode.def', which defines the machine modes.
                    226: 
                    227:    * All the passes that work with RTL use the header files `rtl.h' and
                    228:      `rtl.def', and subroutines in file `rtl.c'.  The tools `gen*' also use
                    229:      these files to read and work with the machine description RTL.
                    230: 
                    231:    * Several passes refer to the header file `insn-config.h' which contains
                    232:      a few parameters (C macro definitions) generated automatically from
                    233:      the machine description RTL by the tool `genconfig'.
                    234: 
                    235:    * Several passes use the instruction recognizer, which consists of
                    236:      `recog.c' and `recog.h', plus the files `insn-recog.c' and
                    237:      `insn-extract.c' that are generated automatically from the machine
                    238:      description by the tools `genrecog' and `genextract'.
                    239: 
                    240:    * Several passes use the header files `regs.h' which defines the
                    241:      information recorded about pseudo register usage, and `basic-block.h'
                    242:      which defines the information recorded about basic blocks.
                    243: 
                    244:    * `hard-reg-set.h' defines the type `HARD_REG_SET', a bit-vector with a
                    245:      bit for each hard register, and some macros to manipulate it.  This
                    246:      type is just `int' if the machine has few enough hard registers;
                    247:      otherwise it is an array of `int' and some of the macros expand into
                    248:      loops.
                    249: 
                    250: 
                    251: File: internals,  Node: RTL,  Next: Machine Desc,  Prev: Passes,  Up: Top
                    252: 
                    253: RTL Representation
                    254: ******************
                    255: 
                    256: Most of the work of the compiler is done on an intermediate representation
                    257: called register transfer language.  In this language, the instructions to
                    258: be output are described, pretty much one by one, in an algebraic form that
                    259: describes what the instruction does.
                    260: 
                    261: RTL is inspired by Lisp lists.  It has both an internal form, made up of
                    262: structures that point at other structures, and a textual form that is used
                    263: in the machine description and in printed debugging dumps.  The textual
                    264: form uses nested parentheses to indicate the pointers in the internal form.
                    265: 
                    266: * Menu:
                    267: 
                    268: * RTL Objects::       Expressions vs vectors vs strings vs integers.
                    269: * Accessors::         Macros to access expression operands or vector elts.
                    270: * Flags::             Other flags in an RTL expression.
                    271: * Machine Modes::     Describing the size and format of a datum.
                    272: * Constants::         Expressions with constant values.
                    273: * Regs and Memory::   Expressions representing register contents or memory.
                    274: * Arithmetic::        Expressions representing arithmetic on other expressions.
                    275: * Comparisons::       Expressions representing comparison of expressions.
                    276: * Bit Fields::        Expressions representing bit-fields in memory or reg.
                    277: * Conversions::       Extending, truncating, floating or fixing.
                    278: * RTL Declarations::  Declaring volatility, constancy, etc.
                    279: * Side Effects::      Expressions for storing in registers, etc.
                    280: * Incdec::            Embedded side-effects for autoincrement addressing.
                    281: * Assembler::        Representing `asm' with operands.
                    282: * Insns::             Expression types for entire insns.
                    283: * Calls::            RTL representation of function call insns.
                    284: * Sharing::           Some expressions are unique; others *must* be copied.
                    285: 
                    286: 
                    287: 
                    288: File: internals,  Node: RTL Objects,  Next: Accessors,  Prev: RTL,  Up: RTL
                    289: 
                    290: RTL Object Types
                    291: ================
                    292: 
                    293: RTL uses four kinds of objects: expressions, integers, strings and vectors.
                    294:  Expressions are the most important ones.  An RTL expression (``RTX'', for
                    295: short) is a C structure, but it is usually referred to with a pointer; a
                    296: type that is given the typedef name `rtx'.
                    297: 
                    298: An integer is simply an `int', and a string is a `char *'.  Within RTL
                    299: code, strings appear only inside `symbol_ref' expressions, but they appear
                    300: in other contexts in the RTL expressions that make up machine descriptions.
                    301:  Their written form uses decimal digits.
                    302: 
                    303: A string is a sequence of characters.  In core it is represented as a `char
                    304: *' in usual C fashion, and it is written in C syntax as well.  However,
                    305: strings in RTL may never be null.  If you write an empty string in a
                    306: machine description, it is represented in core as a null pointer rather
                    307: than as a pointer to a null character.  In certain contexts, these null
                    308: pointers instead of strings are valid.
                    309: 
                    310: A vector contains an arbitrary, specified number of pointers to
                    311: expressions.  The number of elements in the vector is explicitly present in
                    312: the vector.  The written form of a vector consists of square brackets
                    313: (`[...]') surrounding the elements, in sequence and with whitespace
                    314: separating them.  Vectors of length zero are not created; null pointers are
                    315: used instead.
                    316: 
                    317: Expressions are classified by "expression codes" (also called RTX codes). 
                    318: The expression code is a name defined in `rtl.def', which is also (in upper
                    319: case) a C enumeration constant.  The possible expression codes and their
                    320: meanings are machine-independent.  The code of an RTX can be extracted with
                    321: the macro `GET_CODE (X)' and altered with `PUT_CODE (X, NEWCODE)'.
                    322: 
                    323: The expression code determines how many operands the expression contains,
                    324: and what kinds of objects they are.  In RTL, unlike Lisp, you cannot tell
                    325: by looking at an operand what kind of object it is.  Instead, you must know
                    326: from its context---from the expression code of the containing expression. 
                    327: For example, in an expression of code `subreg', the first operand is to be
                    328: regarded as an expression and the second operand as an integer.  In an
                    329: expression of code `plus', there are two operands, both of which are to be
                    330: regarded as expressions.  In a `symbol_ref' expression, there is one
                    331: operand, which is to be regarded as a string.
                    332: 
                    333: Expressions are written as parentheses containing the name of the
                    334: expression type, its flags and machine mode if any, and then the operands
                    335: of the expression (separated by spaces).
                    336: 
                    337: Expression code names in the `md' file are written in lower case, but when
                    338: they appear in C code they are written in upper case.  In this manual, they
                    339: are shown as follows: `const_int'.
                    340: 
                    341: In a few contexts a null pointer is valid where an expression is normally
                    342: wanted.  The written form of this is `(nil)'.
                    343: 
                    344: 
                    345: File: internals,  Node: Accessors,  Next: Flags,  Prev: RTL Objects,  Up: RTL
                    346: 
                    347: Access to Operands
                    348: ==================
                    349: 
                    350: For each expression type `rtl.def' specifies the number of contained
                    351: objects and their kinds, with four possibilities: `e' for expression
                    352: (actually a pointer to an expression), `i' for integer, `s' for string, and
                    353: `E' for vector of expressions.  The sequence of letters for an expression
                    354: code is called its "format".  Thus, the format of `subreg' is `ei'.
                    355: 
                    356: Two other format characters are used occasionally: `u' and `0'.  `u' is
                    357: equivalent to `e' except that it is printed differently in debugging dumps,
                    358: and `0' means a slot whose contents do not fit any normal category.  `0'
                    359: slots are not printed at all in dumps, and are often used in special ways
                    360: by small parts of the compiler.
                    361: 
                    362: There are macros to get the number of operands and the format of an
                    363: expression code:
                    364: 
                    365: `GET_RTX_LENGTH (CODE)'
                    366:      Number of operands of an RTX of code CODE.
                    367: 
                    368: `GET_RTX_FORMAT (CODE)'
                    369:      The format of an RTX of code CODE, as a C string.
                    370: 
                    371: Operands of expressions are accessed using the macros `XEXP', `XINT' and
                    372: `XSTR'.  Each of these macros takes two arguments: an expression-pointer
                    373: (RTX) and an operand number (counting from zero).  Thus,
                    374: 
                    375:      XEXP (X, 2)
                    376: 
                    377: accesses operand 2 of expression X, as an expression.
                    378: 
                    379:      XINT (X, 2)
                    380: 
                    381: accesses the same operand as an integer.  `XSTR', used in the same fashion,
                    382: would access it as a string.
                    383: 
                    384: Any operand can be accessed as an integer, as an expression or as a string.
                    385:  You must choose the correct method of access for the kind of value
                    386: actually stored in the operand.  You would do this based on the expression
                    387: code of the containing expression.  That is also how you would know how
                    388: many operands there are.
                    389: 
                    390: For example, if X is a `subreg' expression, you know that it has two
                    391: operands which can be correctly accessed as `XEXP (X, 0)' and `XINT (X,
                    392: 1)'.  If you did `XINT (X, 0)', you would get the address of the expression
                    393: operand but cast as an integer; that might occasionally be useful, but it
                    394: would be cleaner to write `(int) XEXP (X, 0)'.  `XEXP (X, 1)' would also
                    395: compile without error, and would return the second, integer operand cast as
                    396: an expression pointer, which would probably result in a crash when
                    397: accessed.  Nothing stops you from writing `XEXP (X, 28)' either, but this
                    398: will access memory past the end of the expression with unpredictable results.
                    399: 
                    400: Access to operands which are vectors is more complicated.  You can use the
                    401: macro `XVEC' to get the vector-pointer itself, or the macros `XVECEXP' and
                    402: `XVECLEN' to access the elements and length of a vector.
                    403: 
                    404: `XVEC (EXP, IDX)'
                    405:      Access the vector-pointer which is operand number IDX in EXP.
                    406: 
                    407: `XVECLEN (EXP, IDX)'
                    408:      Access the length (number of elements) in the vector which is in
                    409:      operand number IDX in EXP.  This value is an `int'.
                    410: 
                    411: `XVECEXP (EXP, IDX, ELTNUM)'
                    412:      Access element number ELTNUM in the vector which is in operand number
                    413:      IDX in EXP.  This value is an RTX.
                    414: 
                    415:      It is up to you to make sure that ELTNUM is not negative and is less
                    416:      than `XVECLEN (EXP, IDX)'.
                    417: 
                    418: All the macros defined in this section expand into lvalues and therefore
                    419: can be used to assign the operands, lengths and vector elements as well as
                    420: to access them.
                    421: 
                    422: 
                    423: File: internals,  Node: Flags,  Next: Machine Modes,  Prev: Accessors,  Up: RTL
                    424: 
                    425: Flags in an RTL Expression
                    426: ==========================
                    427: 
                    428: RTL expressions contain several flags (one-bit bit-fields) that are used in
                    429: certain types of expression.
                    430: 
                    431: `used'
                    432:      This flag is used only momentarily, at the end of RTL generation for a
                    433:      function, to count the number of times an expression appears in insns.
                    434:       Expressions that appear more than once are copied, according to the
                    435:      rules for shared structure (*Note Sharing::.).
                    436: 
                    437: `volatil'
                    438:      This flag is used in `mem' and `reg' expressions and in insns.  In RTL
                    439:      dump files, it is printed as `/v'.
                    440: 
                    441:      In a `mem' expression, it is 1 if the memory reference is volatile. 
                    442:      Volatile memory references may not be deleted, reordered or combined.
                    443: 
                    444:      In a `reg' expression, it is 1 if the value is a user-level variable. 
                    445:      0 indicates an internal compiler temporary.
                    446: 
                    447:      In an insn, 1 means the insn has been deleted.
                    448: 
                    449: `in_struct'
                    450:      This flag is used in `mem' expressions.  It is 1 if the memory datum
                    451:      referred to is all or part of a structure or array; 0 if it is (or
                    452:      might be) a scalar variable.  A reference through a C pointer has 0
                    453:      because the pointer might point to a scalar variable.
                    454: 
                    455:      This information allows the compiler to determine something about
                    456:      possible cases of aliasing.
                    457: 
                    458:      In an RTL dump, this flag is represented as `/s'.
                    459: 
                    460: `unchanging'
                    461:      This flag is used in `reg' and `mem' expressions.  1 means that the
                    462:      value of the expression never changes (at least within the current
                    463:      function).
                    464: 
                    465:      In an RTL dump, this flag is represented as `/u'.
                    466: 
                    467: 
                    468: File: internals,  Node: Machine Modes,  Next: Constants,  Prev: Flags,  Up: RTL
                    469: 
                    470: Machine Modes
                    471: =============
                    472: 
                    473: A machine mode describes a size of data object and the representation used
                    474: for it.  In the C code, machine modes are represented by an enumeration
                    475: type, `enum machine_mode', defined in `machmode.def'.  Each RTL expression
                    476: has room for a machine mode and so do certain kinds of tree expressions
                    477: (declarations and types, to be precise).
                    478: 
                    479: In debugging dumps and machine descriptions, the machine mode of an RTL
                    480: expression is written after the expression code with a colon to separate
                    481: them.  The letters `mode' which appear at the end of each machine mode name
                    482: are omitted.  For example, `(reg:SI 38)' is a `reg' expression with machine
                    483: mode `SImode'.  If the mode is `VOIDmode', it is not written at all.
                    484: 
                    485: Here is a table of machine modes.
                    486: 
                    487: `QImode'
                    488:      ``Quarter-Integer'' mode represents a single byte treated as an integer.
                    489: 
                    490: `HImode'
                    491:      ``Half-Integer'' mode represents a two-byte integer.
                    492: 
                    493: `SImode'
                    494:      ``Single Integer'' mode represents a four-byte integer.
                    495: 
                    496: `DImode'
                    497:      ``Double Integer'' mode represents an eight-byte integer.
                    498: 
                    499: `TImode'
                    500:      ``Tetra Integer'' (?) mode represents a sixteen-byte integer.
                    501: 
                    502: `SFmode'
                    503:      ``Single Floating'' mode represents a single-precision (four byte)
                    504:      floating point number.
                    505: 
                    506: `DFmode'
                    507:      ``Double Floating'' mode represents a double-precision (eight byte)
                    508:      floating point number.
                    509: 
                    510: `TFmode'
                    511:      ``Tetra Floating'' mode represents a quadruple-precision (sixteen
                    512:      byte) floating point number.
                    513: 
                    514: `BLKmode'
                    515:      ``Block'' mode represents values that are aggregates to which none of
                    516:      the other modes apply.  In RTL, only memory references can have this
                    517:      mode, and only if they appear in string-move or vector instructions. 
                    518:      On machines which have no such instructions, `BLKmode' will not appear
                    519:      in RTL.
                    520: 
                    521: `VOIDmode'
                    522:      Void mode means the absence of a mode or an unspecified mode.  For
                    523:      example, RTL expressions of code `const_int' have mode `VOIDmode'
                    524:      because they can be taken to have whatever mode the context requires. 
                    525:      In debugging dumps of RTL, `VOIDmode' is expressed by the absence of
                    526:      any mode.
                    527: 
                    528: `EPmode'
                    529:      ``Entry Pointer'' mode is intended to be used for function variables
                    530:      in Pascal and other block structured languages.  Such values contain
                    531:      both a function address and a static chain pointer for access to
                    532:      automatic variables of outer levels.  This mode is only partially
                    533:      implemented since C does not use it.
                    534: 
                    535: `CSImode, ...'
                    536:      ``Complex Single Integer'' mode stands for a complex number
                    537:      represented as a pair of `SImode' integers.  Any of the integer and
                    538:      floating modes may have `C' prefixed to its name to obtain a complex
                    539:      number mode.  For example, there are `CQImode', `CSFmode', and
                    540:      `CDFmode'.  Since C does not support complex numbers, these machine
                    541:      modes are only partially implemented.
                    542: 
                    543: `BImode'
                    544:      This is the machine mode of a bit-field in a structure.  It is used
                    545:      only in the syntax tree, never in RTL, and in the syntax tree it
                    546:      appears only in declaration nodes.  In C, it appears only in
                    547:      `FIELD_DECL' nodes for structure fields defined with a bit size.
                    548: 
                    549: The machine description defines `Pmode' as a C macro which expands into the
                    550: machine mode used for addresses.  Normally this is `SImode'.
                    551: 
                    552: The only modes which a machine description must support are `QImode',
                    553: `SImode', `SFmode' and `DFmode'.  The compiler will attempt to use `DImode'
                    554: for two-word structures and unions, but it would not be hard to program it
                    555: to avoid this.  Likewise, you can arrange for the C type `short int' to
                    556: avoid using `HImode'.  In the long term it would be desirable to make the
                    557: set of available machine modes machine-dependent and eliminate all
                    558: assumptions about specific machine modes or their uses from the
                    559: machine-independent code of the compiler.
                    560: 
                    561: Here are some C macros that relate to machine modes:
                    562: 
                    563: `GET_MODE (X)'
                    564:      Returns the machine mode of the RTX X.
                    565: 
                    566: `PUT_MODE (X, NEWMODE)'
                    567:      Alters the machine mode of the RTX X to be NEWMODE.
                    568: 
                    569: `GET_MODE_SIZE (M)'
                    570:      Returns the size in bytes of a datum of mode M.
                    571: 
                    572: `GET_MODE_BITSIZE (M)'
                    573:      Returns the size in bits of a datum of mode M.
                    574: 
                    575: `GET_MODE_UNIT_SIZE (M)'
                    576:      Returns the size in bits of the subunits of a datum of mode M.  This
                    577:      is the same as `GET_MODE_SIZE' except in the case of complex modes and
                    578:      `EPmode'.  For them, the unit size is the size of the real or
                    579:      imaginary part, or the size of the function pointer or the context
                    580:      pointer.
                    581: 
                    582: 
                    583: File: internals,  Node: Constants,  Next: Regs and Memory,  Prev: Machine Modes,  Up: RTL
                    584: 
                    585: Constant Expression Types
                    586: =========================
                    587: 
                    588: The simplest RTL expressions are those that represent constant values.
                    589: 
                    590: `(const_int I)'
                    591:      This type of expression represents the integer value I.  I is
                    592:      customarily accessed with the macro `INTVAL' as in `INTVAL (EXP)',
                    593:      which is equivalent to `XINT (EXP, 0)'.
                    594: 
                    595:      There is only one expression object for the integer value zero; it is
                    596:      the value of the variable `const0_rtx'.  Likewise, the only expression
                    597:      for integer value one is found in `const1_rtx'.  Any attempt to create
                    598:      an expression of code `const_int' and value zero or one will return
                    599:      `const0_rtx' or `const1_rtx' as appropriate.
                    600: 
                    601: `(const_double:M I0 I1)'
                    602:      Represents a floating point constant value of mode M.  The two
                    603:      inteGERS I0 and I1 together contain the bits of a `double' value.  To
                    604:      convert them to a `double', do
                    605: 
                    606:           union { double d; int i[2];} u;
                    607:           u.i[0] = XINT (x, 0);
                    608:           u.i[1] = XINT (x, 1);
                    609: 
                    610:      and then refer to `u.d'.  The value of the constant is represented as
                    611:      a double in this fashion even if the value represented is
                    612:      single-precision.
                    613: 
                    614:      The global variables `dconst0_rtx' and `fconst0_rtx' hold
                    615:      `const_double' expressions with value 0, in modes `DFmode' and
                    616:      `SFmode', respectively.
                    617: 
                    618: `(symbol_ref SYMBOL)'
                    619:      Represents the value of an assembler label for data.  SYMBOL is a
                    620:      string that describes the name of the assembler label.  If it starts
                    621:      with a `*', the label is the rest of SYMBOL not including the `*'. 
                    622:      Otherwise, the label is SYMBOL, prefixed with `_'.
                    623: 
                    624: `(label_ref LABEL)'
                    625:      Represents the value of an assembler label for code.  It contains one
                    626:      operand, an expression, which must be a `code_label' that appears in
                    627:      the instruction sequence to identify the place where the label should
                    628:      go.
                    629: 
                    630:      The reason for using a distinct expression type for code label
                    631:      references is so that jump optimization can distinguish them.
                    632: 
                    633: `(const EXP)'
                    634:      Represents a constant that is the result of an assembly-time
                    635:      arithmetic computation.  The operand, EXP, is an expression that
                    636:      contains only constants (`const_int', `symbol_ref' and `label_ref'
                    637:      expressions) combined with `plus' and `minus'.  However, not all
                    638:      combinations are valid, since the assembler cannot do arbitrary
                    639:      arithmetic on relocatable symbols.
                    640: 
                    641: 
                    642: File: internals,  Node: Regs and Memory,  Next: Arithmetic,  Prev: Constants,  Up: RTL
                    643: 
                    644: Registers and Memory
                    645: ====================
                    646: 
                    647: Here are the RTL expression types for describing access to machine
                    648: registers and to main memory.
                    649: 
                    650: `(reg:M N)'
                    651:      For small values of the integer N (less than `FIRST_PSEUDO_REGISTER'),
                    652:      this stands for a reference to machine register number N: a "hard
                    653:      register".  For larger values of N, it stands for a temporary value or
                    654:      "pseudo register".  The compiler's strategy is to generate code
                    655:      assuming an unlimited number of such pseudo registers, and later
                    656:      convert them into hard registers or into memory references.
                    657: 
                    658:      The symbol `FIRST_PSEUDO_REGISTER' is defined by the machine
                    659:      description, since the number of hard registers on the machine is an
                    660:      invariant characteristic of the machine.  Note, however, that not all
                    661:      of the machine registers must be general registers.  All the machine
                    662:      registers that can be used for storage of data are given hard register
                    663:      numbers, even those that can be used only in certain instructions or
                    664:      can hold only certain types of data.
                    665: 
                    666:      Each pseudo register number used in a function's RTL code is
                    667:      represented by a unique `reg' expression.
                    668: 
                    669:      M is the machine mode of the reference.  It is necessary because
                    670:      machines can generally refer to each register in more than one mode. 
                    671:      For example, a register may contain a full word but there may be
                    672:      instructions to refer to it as a half word or as a single byte, as
                    673:      well as instructions to refer to it as a floating point number of
                    674:      various precisions.
                    675: 
                    676:      Even for a register that the machine can access in only one mode, the
                    677:      mode must always be specified.
                    678: 
                    679:      A hard register may be accessed in various modes throughout one
                    680:      function, but each pseudo register is given a natural mode and is
                    681:      accessed only in that mode.  When it is necessary to describe an
                    682:      access to a pseudo register using a nonnatural mode, a `subreg'
                    683:      expression is used.
                    684: 
                    685:      A `reg' expression with a machine mode that specifies more than one
                    686:      word of data may actually stand for several consecutive registers.  If
                    687:      in addition the register number specifies a hardware register, then it
                    688:      actually represents several consecutive hardware registers starting
                    689:      with the specified one.
                    690: 
                    691:      Such multi-word hardware register `reg' expressions may not be live
                    692:      across the boundary of a basic block.  The lifetime analysis pass does
                    693:      not know how to record properly that several consecutive registers are
                    694:      actually live there, and therefore register allocation would be
                    695:      confused.  The CSE pass must go out of its way to make sure the
                    696:      situation does not arise.
                    697: 
                    698: `(subreg:M REG WORDNUM)'
                    699:      `subreg' expressions are used to refer to a register in a machine mode
                    700:      other than its natural one, or to refer to one register of a
                    701:      multi-word `reg' that actually refers to several registers.
                    702: 
                    703:      Each pseudo-register has a natural mode.  If it is necessary to
                    704:      operate on it in a different mode---for example, to perform a fullword
                    705:      move instruction on a pseudo-register that contains a single byte---
                    706:      the pseudo-register must be enclosed in a `subreg'.  In such a case,
                    707:      WORDNUM is zero.
                    708: 
                    709:      The other use of `subreg' is to extract the individual registers of a
                    710:      multi-register value.  Machine modes such as `DImode' and `EPmode'
                    711:      indicate values longer than a word, values which usually require two
                    712:      consecutive registers.  To access one of the registers, use a `subreg'
                    713:      with mode `SImode' and a WORDNUM that says which register.
                    714: 
                    715:      The compilation parameter `WORDS_BIG_ENDIAN', if defined, says that
                    716:      word number zero is the most significant part; otherwise, it is the
                    717:      least significant part.
                    718: 
                    719:      Note that it is not valid to access a `DFmode' value in `SFmode' using
                    720:      a `subreg'.  On some machines the most significant part of a `DFmode'
                    721:      value does not have the same format as a single-precision floating
                    722:      value.
                    723: 
                    724: `(cc0)'
                    725:      This refers to the machine's condition code register.  It has no
                    726:      operands and may not have a machine mode.  It may be validly used in
                    727:      only two contexts: as the destination of an assignment (in test and
                    728:      compare instructions) and in comparison operators comparing against
                    729:      zero (`const_int' with value zero; that is to say, `const0_rtx').
                    730: 
                    731:      There is only one expression object of code `cc0'; it is the value of
                    732:      the variable `cc0_rtx'.  Any attempt to create an expression of code
                    733:      `cc0' will return `cc0_rtx'.
                    734: 
                    735:      One special thing about the condition code register is that
                    736:      instructions can set it implicitly.  On many machines, nearly all
                    737:      instructions set the condition code based on the value that they
                    738:      compute or store.  It is not necessary to record these actions
                    739:      explicitly in the RTL because the machine description includes a
                    740:      prescription for recognizing the instructions that do so (by means of
                    741:      the macro `NOTICE_UPDATE_CC').  Only instructions whose sole purpose
                    742:      is to set the condition code, and instructions that use the condition
                    743:      code, need mention `(cc0)'.
                    744: 
                    745: `(pc)'
                    746:      This represents the machine's program counter.  It has no operands and
                    747:      may not have a machine mode.  `(pc)' may be validly used only in
                    748:      certain specific contexts in jump instructions.
                    749: 
                    750:      There is only one expression object of code `pc'; it is the value of
                    751:      the variable `pc_rtx'.  Any attempt to create an expression of code
                    752:      `pc' will return `pc_rtx'.
                    753: 
                    754:      All instructions that do not jump alter the program counter implicitly
                    755:      by incrementing it, but there is no need to mention this in the RTL.
                    756: 
                    757: `(mem:M ADDR)'
                    758:      This RTX represents a reference to main memory at an address
                    759:      represented by the expression ADDR.  M specifies how large a unit of
                    760:      memory is accessed.
                    761: 
                    762: 
                    763: File: internals,  Node: Arithmetic,  Next: Comparisons,  Prev: Regs and Memory,  Up: RTL
                    764: 
                    765: RTL Expressions for Arithmetic
                    766: ==============================
                    767: 
                    768: `(plus:M X Y)'
                    769:      Represents the sum of the values represented by X and Y carried out in
                    770:      machine mode M.  This is valid only if X and Y both are valid for mode
                    771:      M.
                    772: 
                    773: `(minus:M X Y)'
                    774:      Like `plus' but represents subtraction.
                    775: 
                    776: `(minus X Y)'
                    777:      Represents the result of subtracting Y from X for purposes of
                    778:      comparison.  The absence of a machine mode in the `minus' expression
                    779:      indicates that the result is computed without overflow, as if with
                    780:      infinite precision.
                    781: 
                    782:      Of course, machines can't really subtract with infinite precision. 
                    783:      However, they can pretend to do so when only the sign of the result
                    784:      will be used, which is the case when the result is stored in `(cc0)'. 
                    785:      And that is the only way this kind of expression may validly be used:
                    786:      as a value to be stored in the condition codes.
                    787: 
                    788: `(neg:M X)'
                    789:      Represents the negation (subtraction from zero) of the value
                    790:      represented by X, carried out in mode M.  X must be valid for mode M.
                    791: 
                    792: `(mult:M X Y)'
                    793:      Represents the signed product of the values represented by X and Y
                    794:      carried out in machine mode M.  If X and Y are both valid for mode M,
                    795:      this is ordinary size-preserving multiplication.  Alternatively, both
                    796:      X and Y may be valid for a different, narrower mode.  This represents
                    797:      the kind of multiplication that generates a product wider than the
                    798:      operands.  Widening multiplication and same-size multiplication are
                    799:      completely distinct and supported by different machine instructions;
                    800:      machines may support one but not the other.
                    801: 
                    802:      `mult' may be used for floating point division as well.  Then M is a
                    803:      floating point machine mode.
                    804: 
                    805: `(umult:M X Y)'
                    806:      Like `mult' but represents unsigned multiplication.  It may be used in
                    807:      both same-size and widening forms, like `mult'.  `umult' is used only
                    808:      for fixed-point multiplication.
                    809: 
                    810: `(div:M X Y)'
                    811:      Represents the quotient in signed division of X by Y, carried out in
                    812:      machine mode M.  If M is a floating-point mode, it represents the
                    813:      exact quotient; otherwise, the integerized quotient.  If X and Y are
                    814:      both valid for mode M, this is ordinary size-preserving division. 
                    815:      Some machines have division instructions in which the operands and
                    816:      quotient widths are not all the same; such instructions are
                    817:      represented by `div' expressions in which the machine modes are not
                    818:      all the same.
                    819: 
                    820: `(udiv:M X Y)'
                    821:      Like `div' but represents unsigned division.
                    822: 
                    823: `(mod:M X Y)'
                    824: `(umod:M X Y)'
                    825:      Like `div' and `udiv' but represent the remainder instead of the
                    826:      quotient.
                    827: 
                    828: `(not:M X)'
                    829:      Represents the bitwise complement of the value represented by X,
                    830:      carried out in mode M, which must be a fixed-point machine mode.  X
                    831:      must be valid for mode M, which must be a fixed-point mode.
                    832: 
                    833: `(and:M X Y)'
                    834:      Represents the bitwise logical-and of the values represented by X and
                    835:      Y, carried out in machine mode M.  This is valid only if X and Y both
                    836:      are valid for mode M, which must be a fixed-point mode.
                    837: 
                    838: `(ior:M X Y)'
                    839:      Represents the bitwise inclusive-or of the values represented by X and
                    840:      Y, carried out in machine mode M.  This is valid only if X and Y both
                    841:      are valid for mode M, which must be a fixed-point mode.
                    842: 
                    843: `(xor:M X Y)'
                    844:      Represents the bitwise exclusive-or of the values represented by X and
                    845:      Y, carried out in machine mode M.  This is valid only if X and Y both
                    846:      are valid for mode M, which must be a fixed-point mode.
                    847: 
                    848: `(lshift:M X C)'
                    849:      Represents the result of logically shifting X left by C places.  X
                    850:      must be valid for the mode M, a fixed-point machine mode.  C must be
                    851:      valid for a fixed-point mode; which mode is determined by the mode
                    852:      called for in the machine description entry for the left-shift
                    853:      instruction.  For example, on the Vax, the mode of C is `QImode'
                    854:      regardless of M.
                    855: 
                    856:      On some machines, negative values of C may be meaningful; this is why
                    857:      logical left shift and arithmetic left shift are distinguished.  For
                    858:      example, Vaxes have no right-shift instructions, and right shifts are
                    859:      represented as left-shift instructions whose counts happen to be
                    860:      negative constants or else computed (in a previous instruction) by
                    861:      negation.
                    862: 
                    863: `(ashift:M X C)'
                    864:      Like `lshift' but for arithmetic left shift.
                    865: 
                    866: `(lshiftrt:M X C)'
                    867: `(ashiftrt:M X C)'
                    868:      Like `lshift' and `ashift' but for right shift.
                    869: 
                    870: `(rotate:M X C)'
                    871: `(rotatert:M X C)'
                    872:      Similar but represent left and right rotate.
                    873: 
                    874: `(abs:M X)'
                    875:      Represents the absolute value of X, computed in mode M.  X must be
                    876:      valid for M.
                    877: 
                    878: `(sqrt:M X)'
                    879:      Represents the square root of X, computed in mode M.  X must be valid
                    880:      for M.  Most often M will be a floating point mode.
                    881: 
                    882: `(ffs:M X)'
                    883:      Represents the one plus the index of the least significant 1-bit in X,
                    884:      represented as an integer of mode M.  (The value is zero if X is
                    885:      zero.)  The mode of X need not be M; depending on the target machine,
                    886:      various mode combinations may be valid.
                    887: 
                    888: 
                    889: File: internals,  Node: Comparisons,  Next: Bit Fields,  Prev: Arithmetic,  Up: RTL
                    890: 
                    891: Comparison Operations
                    892: =====================
                    893: 
                    894: Comparison operators test a relation on two operands and are considered to
                    895: represent the value 1 if the relation holds, or zero if it does not.  The
                    896: mode of the comparison is determined by the operands; they must both be
                    897: valid for a common machine mode.  A comparison with both operands constant
                    898: would be invalid as the machine mode could not be deduced from it, but such
                    899: a comparison should never exist in RTL due to constant folding.
                    900: 
                    901: Inequality comparisons come in two flavors, signed and unsigned.  Thus,
                    902: there are distinct expression codes `gt' and `gtu' for signed and unsigned
                    903: greater-than.  These can produce different results for the same pair of
                    904: integer values: for example, 1 is signed greater-than -1 but not unsigned
                    905: greater-than, because -1 when regarded as unsigned is actually `0xffffffff'
                    906: which is greater than 1.
                    907: 
                    908: The signed comparisons are also used for floating point values.  Floating
                    909: point comparisons are distinguished by the machine modes of the operands.
                    910: 
                    911: The comparison operators may be used to compare the condition codes `(cc0)'
                    912: against zero, as in `(eq (cc0) (const_int 0))'.  Such a construct actually
                    913: refers to the result of the preceding instruction in which the condition
                    914: codes were set.  The above example stands for 1 if the condition codes were
                    915: set to say ``zero'' or ``equal'', 0 otherwise.  Although the same
                    916: comparison operators are used for this as may be used in other contexts on
                    917: actual data, no confusion can result since the machine description would
                    918: never allow both kinds of uses in the same context.
                    919: 
                    920: `(eq X Y)'
                    921:      1 if the values represented by X and Y are equal, otherwise 0.
                    922: 
                    923: `(ne X Y)'
                    924:      1 if the values represented by X and Y are not equal, otherwise 0.
                    925: 
                    926: `(gt X Y)'
                    927:      1 if the X is greater than Y.  If they are fixed-point, the comparison
                    928:      is done in a signed sense.
                    929: 
                    930: `(gtu X Y)'
                    931:      Like `gt' but does unsigned comparison, on fixed-point numbers only.
                    932: 
                    933: `(lt X Y)'
                    934: `(ltu X Y)'
                    935:      Like `gt' and `gtu' but test for ``less than''.
                    936: 
                    937: `(ge X Y)'
                    938: `(geu X Y)'
                    939:      Like `gt' and `gtu' but test for ``greater than or equal''.
                    940: 
                    941: `(le X Y)'
                    942: `(leu X Y)'
                    943:      Like `gt' and `gtu' but test for ``less than or equal''.
                    944: 
                    945: `(if_then_else COND THEN ELSE)'
                    946:      This is not a comparison operation but is listed here because it is
                    947:      always used in conjunction with a comparison operation.  To be
                    948:      precISE, COND is a comparison expression.  This expression represents
                    949:      a choice, according to COND, between the value represented by THEN and
                    950:      the one represented by ELSE.
                    951: 
                    952:      On most machines, `if_then_else' expressions are valid only to express
                    953:      conditional jumps.
                    954: 
                    955: 
                    956: File: internals,  Node: Bit Fields,  Next: Conversions,  Prev: Comparisons,  Up: RTL
                    957: 
                    958: Bit-fields
                    959: ==========
                    960: 
                    961: Special expression codes exist to represent bit-field instructions.  These
                    962: types of expressions are lvalues in RTL; they may appear on the left side
                    963: of a assignment, indicating insertion of a value into the specified bit
                    964: field.
                    965: 
                    966: `(sign_extract:SI LOC SIZE POS)'
                    967:      This represents a reference to a sign-extended bit-field contained or
                    968:      starting in LOC (a memory or register reference).  The bit field is
                    969:      SIZE bits wide and starts at bit POS.  The compilation option
                    970:      `BITS_BIG_ENDIAN' says which end of the memory unit POS counts from.
                    971: 
                    972:      Which machine modes are valid for LOC depends on the machine, but
                    973:      typically LOC should be a single byte when in memory or a full word in
                    974:      a register.
                    975: 
                    976: `(zero_extract:SI LOC SIZE POS)'
                    977:      Like `sign_extract' but refers to an unsigned or zero-extended bit
                    978:      field.  The same sequence of bits are extracted, but they are filled
                    979:      to an entire word with zeros instead of by sign-extension.
                    980: 
                    981: 
                    982: File: internals,  Node: Conversions,  Next: RTL Declarations,  Prev: Bit Fields,  Up: RTL
                    983: 
                    984: Conversions
                    985: ===========
                    986: 
                    987: All conversions between machine modes must be represented by explicit
                    988: conversion operations.  For example, an expression which is the sum of a
                    989: byte and a full word cannot be written as `(plus:SI (reg:QI 34) (reg:SI
                    990: 80))' because the `plus' operation requires two operands of the same
                    991: machine mode.  Therefore, the byte-sized operand is enclosed in a
                    992: conversion operation, as in
                    993: 
                    994:      (plus:SI (sign_extend:SI (reg:QI 34)) (reg:SI 80))
                    995: 
                    996: The conversion operation is not a mere placeholder, because there may be
                    997: more than one way of converting from a given starting mode to the desired
                    998: final mode.  The conversion operation code says how to do it.
                    999: 
                   1000: `(sign_extend:M X)'
                   1001:      Represents the result of sign-extending the value X to machine mode M.
                   1002:       M must be a fixed-point mode and X a fixed-point value of a mode
                   1003:      narrower than M.
                   1004: 
                   1005: `(zero_extend:M X)'
                   1006:      Represents the result of zero-extending the value X to machine mode M.
                   1007:       M must be a fixed-point mode and X a fixed-point value of a mode
                   1008:      narrower than M.
                   1009: 
                   1010: `(float_extend:M X)'
                   1011:      Represents the result of extending the value X to machine mode M.  M
                   1012:      must be a floating point mode and X a floating point value of a mode
                   1013:      narrower than M.
                   1014: 
                   1015: `(truncate:M X)'
                   1016:      Represents the result of truncating the value X to machine mode M.  M
                   1017:      must be a fixed-point mode and X a fixed-point value of a mode wider
                   1018:      than M.
                   1019: 
                   1020: `(float_truncate:M X)'
                   1021:      Represents the result of truncating the value X to machine mode M.  M
                   1022:      must be a floating point mode and X a floating point value of a mode
                   1023:      wider than M.
                   1024: 
                   1025: `(float:M X)'
                   1026:      Represents the result of converting fixed point value X, regarded as
                   1027:      signed, to floating point mode M.
                   1028: 
                   1029: `(unsigned_float:M X)'
                   1030:      Represents the result of converting fixed point value X, regarded as
                   1031:      unsigned, to floating point mode M.
                   1032: 
                   1033: `(fix:M X)'
                   1034:      When M is a fixed point mode, represents the result of converting
                   1035:      floating point value X to mode M, regarded as signed.  How rounding is
                   1036:      done is not specified, so this operation may be used validly in
                   1037:      compiling C code only for integer-valued operands.
                   1038: 
                   1039: `(unsigned_fix:M X)'
                   1040:      Represents the result of converting floating point value X to fixed
                   1041:      point mode M, regarded as unsigned.  How rounding is done is not
                   1042:      specified.
                   1043: 
                   1044: `(fix:M X)'
                   1045:      When M is a floating point mode, represents the result of converting
                   1046:      floating point value X (valid for mode M) to an integer, still
                   1047:      represented in floating point mode M, by rounding towards zero.
                   1048: 
                   1049: 
                   1050: File: internals,  Node: RTL Declarations,  Next: Side Effects,  Prev: Conversions,  Up: RTL
                   1051: 
                   1052: Declarations
                   1053: ============
                   1054: 
                   1055: Declaration expression codes do not represent arithmetic operations but
                   1056: rather state assertions about their operands.
                   1057: 
                   1058: `(strict_low_part (subreg:M (reg:N R) 0))'
                   1059:      This expression code is used in only one context: operand 0 of a `set'
                   1060:      expression.  In addition, the operand of this expression must be a
                   1061:      `subreg' expression.
                   1062: 
                   1063:      The presence of `strict_low_part' says that the part of the register
                   1064:      which is meaningful in mode N, but is not part of mode M, is not to be
                   1065:      altered.  Normally, an assignment to such a subreg is allowed to have
                   1066:      undefined effects on the rest of the register when M is less than a
                   1067:      word.
                   1068: 
                   1069: 

unix.superglobalmegacorp.com

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