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