|
|
1.1 ! root 1: @c Copyright (C) 1988, 1989, 1992 Free Software Foundation, Inc. ! 2: @c This is part of the GCC manual. ! 3: @c For copying conditions, see the file gcc.texi. ! 4: ! 5: @node RTL ! 6: @chapter RTL Representation ! 7: @cindex RTL representation ! 8: @cindex representation of RTL ! 9: @cindex Register Transfer Language (RTL) ! 10: ! 11: Most of the work of the compiler is done on an intermediate representation ! 12: called register transfer language. In this language, the instructions to be ! 13: output are described, pretty much one by one, in an algebraic form that ! 14: describes what the instruction does. ! 15: ! 16: RTL is inspired by Lisp lists. It has both an internal form, made up of ! 17: structures that point at other structures, and a textual form that is used ! 18: in the machine description and in printed debugging dumps. The textual ! 19: form uses nested parentheses to indicate the pointers in the internal form. ! 20: ! 21: @menu ! 22: * RTL Objects:: Expressions vs vectors vs strings vs integers. ! 23: * Accessors:: Macros to access expression operands or vector elts. ! 24: * Flags:: Other flags in an RTL expression. ! 25: * Machine Modes:: Describing the size and format of a datum. ! 26: * Constants:: Expressions with constant values. ! 27: * Regs and Memory:: Expressions representing register contents or memory. ! 28: * Arithmetic:: Expressions representing arithmetic on other expressions. ! 29: * Comparisons:: Expressions representing comparison of expressions. ! 30: * Bit Fields:: Expressions representing bitfields in memory or reg. ! 31: * Conversions:: Extending, truncating, floating or fixing. ! 32: * RTL Declarations:: Declaring volatility, constancy, etc. ! 33: * Side Effects:: Expressions for storing in registers, etc. ! 34: * Incdec:: Embedded side-effects for autoincrement addressing. ! 35: * Assembler:: Representing @code{asm} with operands. ! 36: * Insns:: Expression types for entire insns. ! 37: * Calls:: RTL representation of function call insns. ! 38: * Sharing:: Some expressions are unique; others *must* be copied. ! 39: * Reading RTL:: Reading textual RTL from a file. ! 40: @end menu ! 41: ! 42: @node RTL Objects, Accessors, RTL, RTL ! 43: @section RTL Object Types ! 44: @cindex RTL object types ! 45: ! 46: @cindex RTL integers ! 47: @cindex RTL strings ! 48: @cindex RTL vectors ! 49: @cindex RTL expression ! 50: @cindex RTX (See RTL) ! 51: RTL uses five kinds of objects: expressions, integers, wide integers, ! 52: strings and vectors. Expressions are the most important ones. An RTL ! 53: expression (``RTX'', for short) is a C structure, but it is usually ! 54: referred to with a pointer; a type that is given the typedef name ! 55: @code{rtx}. ! 56: ! 57: An integer is simply an @code{int}; their written form uses decimal digits. ! 58: A wide integer is an integral object whose type is @code{HOST_WIDE_INT} ! 59: (@pxref{Config}); their written form uses decimal digits. ! 60: ! 61: A string is a sequence of characters. In core it is represented as a ! 62: @code{char *} in usual C fashion, and it is written in C syntax as well. ! 63: However, strings in RTL may never be null. If you write an empty string in ! 64: a machine description, it is represented in core as a null pointer rather ! 65: than as a pointer to a null character. In certain contexts, these null ! 66: pointers instead of strings are valid. Within RTL code, strings are most ! 67: commonly found inside @code{symbol_ref} expressions, but they appear in ! 68: other contexts in the RTL expressions that make up machine descriptions. ! 69: ! 70: A vector contains an arbitrary number of pointers to expressions. The ! 71: number of elements in the vector is explicitly present in the vector. ! 72: The written form of a vector consists of square brackets ! 73: (@samp{[@dots{}]}) surrounding the elements, in sequence and with ! 74: whitespace separating them. Vectors of length zero are not created; ! 75: null pointers are used instead. ! 76: ! 77: @cindex expression codes ! 78: @cindex codes, RTL expression ! 79: @findex GET_CODE ! 80: @findex PUT_CODE ! 81: Expressions are classified by @dfn{expression codes} (also called RTX ! 82: codes). The expression code is a name defined in @file{rtl.def}, which is ! 83: also (in upper case) a C enumeration constant. The possible expression ! 84: codes and their meanings are machine-independent. The code of an RTX can ! 85: be extracted with the macro @code{GET_CODE (@var{x})} and altered with ! 86: @code{PUT_CODE (@var{x}, @var{newcode})}. ! 87: ! 88: The expression code determines how many operands the expression contains, ! 89: and what kinds of objects they are. In RTL, unlike Lisp, you cannot tell ! 90: by looking at an operand what kind of object it is. Instead, you must know ! 91: from its context---from the expression code of the containing expression. ! 92: For example, in an expression of code @code{subreg}, the first operand is ! 93: to be regarded as an expression and the second operand as an integer. In ! 94: an expression of code @code{plus}, there are two operands, both of which ! 95: are to be regarded as expressions. In a @code{symbol_ref} expression, ! 96: there is one operand, which is to be regarded as a string. ! 97: ! 98: Expressions are written as parentheses containing the name of the ! 99: expression type, its flags and machine mode if any, and then the operands ! 100: of the expression (separated by spaces). ! 101: ! 102: Expression code names in the @samp{md} file are written in lower case, ! 103: but when they appear in C code they are written in upper case. In this ! 104: manual, they are shown as follows: @code{const_int}. ! 105: ! 106: @cindex (nil) ! 107: @cindex nil ! 108: In a few contexts a null pointer is valid where an expression is normally ! 109: wanted. The written form of this is @code{(nil)}. ! 110: ! 111: @node Accessors, Flags, RTL Objects, RTL ! 112: @section Access to Operands ! 113: @cindex accessors ! 114: @cindex access to operands ! 115: @cindex operand access ! 116: ! 117: @cindex RTL format ! 118: For each expression type @file{rtl.def} specifies the number of ! 119: contained objects and their kinds, with four possibilities: @samp{e} for ! 120: expression (actually a pointer to an expression), @samp{i} for integer, ! 121: @samp{w} for wide integer, @samp{s} for string, and @samp{E} for vector ! 122: of expressions. The sequence of letters for an expression code is ! 123: called its @dfn{format}. Thus, the format of @code{subreg} is ! 124: @samp{ei}.@refill ! 125: ! 126: @cindex RTL format characters ! 127: A few other format characters are used occasionally: ! 128: ! 129: @table @code ! 130: @item u ! 131: @samp{u} is equivalent to @samp{e} except that it is printed differently ! 132: in debugging dumps. It is used for pointers to insns. ! 133: ! 134: @item n ! 135: @samp{n} is equivalent to @samp{i} except that it is printed differently ! 136: in debugging dumps. It is used for the line number or code number of a ! 137: @code{note} insn. ! 138: ! 139: @item S ! 140: @samp{S} indicates a string which is optional. In the RTL objects in ! 141: core, @samp{S} is equivalent to @samp{s}, but when the object is read, ! 142: from an @samp{md} file, the string value of this operand may be omitted. ! 143: An omitted string is taken to be the null string. ! 144: ! 145: @item V ! 146: @samp{V} indicates a vector which is optional. In the RTL objects in ! 147: core, @samp{V} is equivalent to @samp{E}, but when the object is read ! 148: from an @samp{md} file, the vector value of this operand may be omitted. ! 149: An omitted vector is effectively the same as a vector of no elements. ! 150: ! 151: @item 0 ! 152: @samp{0} means a slot whose contents do not fit any normal category. ! 153: @samp{0} slots are not printed at all in dumps, and are often used in ! 154: special ways by small parts of the compiler. ! 155: @end table ! 156: ! 157: There are macros to get the number of operands, the format, and the ! 158: class of an expression code: ! 159: ! 160: @table @code ! 161: @findex GET_RTX_LENGTH ! 162: @item GET_RTX_LENGTH (@var{code}) ! 163: Number of operands of an RTX of code @var{code}. ! 164: ! 165: @findex GET_RTX_FORMAT ! 166: @item GET_RTX_FORMAT (@var{code}) ! 167: The format of an RTX of code @var{code}, as a C string. ! 168: ! 169: @findex GET_RTX_CLASS ! 170: @cindex classes of RTX codes ! 171: @item GET_RTX_CLASS (@var{code}) ! 172: A single character representing the type of RTX operation that code ! 173: @var{code} performs. ! 174: ! 175: The following classes are defined: ! 176: ! 177: @table @code ! 178: @item o ! 179: An RTX code that represents an actual object, such as @code{reg} or ! 180: @code{mem}. @code{subreg} is not in this class. ! 181: ! 182: @item < ! 183: An RTX code for a comparison. The codes in this class are ! 184: @code{NE}, @code{EQ}, @code{LE}, @code{LT}, @code{GE}, @code{GT}, ! 185: @code{LEU}, @code{LTU}, @code{GEU}, @code{GTU}.@refill ! 186: ! 187: @item 1 ! 188: An RTX code for a unary arithmetic operation, such as @code{neg}. ! 189: ! 190: @item c ! 191: An RTX code for a commutative binary operation, other than @code{NE} ! 192: and @code{EQ} (which have class @samp{<}). ! 193: ! 194: @item 2 ! 195: An RTX code for a noncommutative binary operation, such as @code{MINUS}. ! 196: ! 197: @item b ! 198: An RTX code for a bitfield operation, either @code{ZERO_EXTRACT} or ! 199: @code{SIGN_EXTRACT}. ! 200: ! 201: @item 3 ! 202: An RTX code for other three input operations, such as @code{IF_THEN_ELSE}. ! 203: ! 204: @item i ! 205: An RTX code for a machine insn (@code{INSN}, @code{JUMP_INSN}, and ! 206: @code{CALL_INSN}).@refill ! 207: ! 208: @item m ! 209: An RTX code for something that matches in insns, such as @code{MATCH_DUP}. ! 210: ! 211: @item x ! 212: All other RTX codes. ! 213: @end table ! 214: @end table ! 215: ! 216: @findex XEXP ! 217: @findex XINT ! 218: @findex XWINT ! 219: @findex XSTR ! 220: Operands of expressions are accessed using the macros @code{XEXP}, ! 221: @code{XINT}, @code{XWINT} and @code{XSTR}. Each of these macros takes ! 222: two arguments: an expression-pointer (RTX) and an operand number ! 223: (counting from zero). Thus,@refill ! 224: ! 225: @example ! 226: XEXP (@var{x}, 2) ! 227: @end example ! 228: ! 229: @noindent ! 230: accesses operand 2 of expression @var{x}, as an expression. ! 231: ! 232: @example ! 233: XINT (@var{x}, 2) ! 234: @end example ! 235: ! 236: @noindent ! 237: accesses the same operand as an integer. @code{XSTR}, used in the same ! 238: fashion, would access it as a string. ! 239: ! 240: Any operand can be accessed as an integer, as an expression or as a string. ! 241: You must choose the correct method of access for the kind of value actually ! 242: stored in the operand. You would do this based on the expression code of ! 243: the containing expression. That is also how you would know how many ! 244: operands there are. ! 245: ! 246: For example, if @var{x} is a @code{subreg} expression, you know that it has ! 247: two operands which can be correctly accessed as @code{XEXP (@var{x}, 0)} ! 248: and @code{XINT (@var{x}, 1)}. If you did @code{XINT (@var{x}, 0)}, you ! 249: would get the address of the expression operand but cast as an integer; ! 250: that might occasionally be useful, but it would be cleaner to write ! 251: @code{(int) XEXP (@var{x}, 0)}. @code{XEXP (@var{x}, 1)} would also ! 252: compile without error, and would return the second, integer operand cast as ! 253: an expression pointer, which would probably result in a crash when ! 254: accessed. Nothing stops you from writing @code{XEXP (@var{x}, 28)} either, ! 255: but this will access memory past the end of the expression with ! 256: unpredictable results.@refill ! 257: ! 258: Access to operands which are vectors is more complicated. You can use the ! 259: macro @code{XVEC} to get the vector-pointer itself, or the macros ! 260: @code{XVECEXP} and @code{XVECLEN} to access the elements and length of a ! 261: vector. ! 262: ! 263: @table @code ! 264: @findex XVEC ! 265: @item XVEC (@var{exp}, @var{idx}) ! 266: Access the vector-pointer which is operand number @var{idx} in @var{exp}. ! 267: ! 268: @findex XVECLEN ! 269: @item XVECLEN (@var{exp}, @var{idx}) ! 270: Access the length (number of elements) in the vector which is ! 271: in operand number @var{idx} in @var{exp}. This value is an @code{int}. ! 272: ! 273: @findex XVECEXP ! 274: @item XVECEXP (@var{exp}, @var{idx}, @var{eltnum}) ! 275: Access element number @var{eltnum} in the vector which is ! 276: in operand number @var{idx} in @var{exp}. This value is an RTX. ! 277: ! 278: It is up to you to make sure that @var{eltnum} is not negative ! 279: and is less than @code{XVECLEN (@var{exp}, @var{idx})}. ! 280: @end table ! 281: ! 282: All the macros defined in this section expand into lvalues and therefore ! 283: can be used to assign the operands, lengths and vector elements as well as ! 284: to access them. ! 285: ! 286: @node Flags, Machine Modes, Accessors, RTL ! 287: @section Flags in an RTL Expression ! 288: @cindex flags in RTL expression ! 289: ! 290: RTL expressions contain several flags (one-bit bitfields) that are used ! 291: in certain types of expression. Most often they are accessed with the ! 292: following macros: ! 293: ! 294: @table @code ! 295: @findex MEM_VOLATILE_P ! 296: @cindex @code{mem} and @samp{/v} ! 297: @cindex @code{volatil}, in @code{mem} ! 298: @cindex @samp{/v} in RTL dump ! 299: @item MEM_VOLATILE_P (@var{x}) ! 300: In @code{mem} expressions, nonzero for volatile memory references. ! 301: Stored in the @code{volatil} field and printed as @samp{/v}. ! 302: ! 303: @findex MEM_IN_STRUCT_P ! 304: @cindex @code{mem} and @samp{/s} ! 305: @cindex @code{in_struct}, in @code{mem} ! 306: @cindex @samp{/s} in RTL dump ! 307: @item MEM_IN_STRUCT_P (@var{x}) ! 308: In @code{mem} expressions, nonzero for reference to an entire ! 309: structure, union or array, or to a component of one. Zero for ! 310: references to a scalar variable or through a pointer to a scalar. ! 311: Stored in the @code{in_struct} field and printed as @samp{/s}. ! 312: ! 313: @findex REG_LOOP_TEST_P ! 314: @cindex @code{reg} and @samp{/s} ! 315: @cindex @code{in_struct}, in @code{reg} ! 316: @item REG_LOOP_TEST_P ! 317: In @code{reg} expressions, nonzero if this register's entire life is ! 318: contained in the exit test code for some loop. Stored in the ! 319: @code{in_struct} field and printed as @samp{/s}. ! 320: ! 321: @findex REG_USERVAR_P ! 322: @cindex @code{reg} and @samp{/v} ! 323: @cindex @code{volatil}, in @code{reg} ! 324: @item REG_USERVAR_P (@var{x}) ! 325: In a @code{reg}, nonzero if it corresponds to a variable present in ! 326: the user's source code. Zero for temporaries generated internally by ! 327: the compiler. Stored in the @code{volatil} field and printed as ! 328: @samp{/v}. ! 329: ! 330: @cindex @samp{/i} in RTL dump ! 331: @findex REG_FUNCTION_VALUE_P ! 332: @cindex @code{reg} and @samp{/i} ! 333: @cindex @code{integrated}, in @code{reg} ! 334: @item REG_FUNCTION_VALUE_P (@var{x}) ! 335: Nonzero in a @code{reg} if it is the place in which this function's ! 336: value is going to be returned. (This happens only in a hard ! 337: register.) Stored in the @code{integrated} field and printed as ! 338: @samp{/i}. ! 339: ! 340: The same hard register may be used also for collecting the values of ! 341: functions called by this one, but @code{REG_FUNCTION_VALUE_P} is zero ! 342: in this kind of use. ! 343: ! 344: @findex SUBREG_PROMOTED_VAR_P ! 345: @cindex @code{subreg} and @samp{/s} ! 346: @cindex @code{in_struct}, in @code{subreg} ! 347: @item SUBREG_PROMOTED_VAR_P ! 348: Nonzero in a @code{subreg} if it was made when accessing an object that ! 349: was promoted to a wider mode in accord with the @code{PROMOTED_MODE} machine ! 350: description macro (@pxref{Storage Layout}). In this case, the mode of ! 351: the @code{subreg} is the declared mode of the object and the mode of ! 352: @code{SUBREG_REG} is the mode of the register that holds the object. ! 353: Promoted variables are always either sign- or zero-extended to the wider ! 354: mode on every assignment. Stored in the @code{in_struct} field and ! 355: printed as @samp{/s}. ! 356: ! 357: @findex SUBREG_PROMOTED_UNSIGNED_P ! 358: @cindex @code{subreg} and @samp{/u} ! 359: @cindex @code{unchanging}, in @code{subreg} ! 360: @item SUBREG_PROMOTED_UNSIGNED_P ! 361: Nonzero in a @code{subreg} that has @code{SUBREG_PROMOTED_VAR_P} nonzero ! 362: if the object being referenced is kept zero-extended and zero if it ! 363: is kept sign-extended. Stored in the @code{unchanging} field and ! 364: printed as @samp{/u}. ! 365: ! 366: @findex RTX_UNCHANGING_P ! 367: @cindex @code{reg} and @samp{/u} ! 368: @cindex @code{mem} and @samp{/u} ! 369: @cindex @code{unchanging}, in @code{reg} and @code{mem} ! 370: @cindex @samp{/u} in RTL dump ! 371: @item RTX_UNCHANGING_P (@var{x}) ! 372: Nonzero in a @code{reg} or @code{mem} if the value is not changed. ! 373: (This flag is not set for memory references via pointers to constants. ! 374: Such pointers only guarantee that the object will not be changed ! 375: explicitly by the current function. The object might be changed by ! 376: other functions or by aliasing.) Stored in the ! 377: @code{unchanging} field and printed as @samp{/u}. ! 378: ! 379: @findex RTX_INTEGRATED_P ! 380: @cindex @code{integrated}, in @code{insn} ! 381: @item RTX_INTEGRATED_P (@var{insn}) ! 382: Nonzero in an insn if it resulted from an in-line function call. ! 383: Stored in the @code{integrated} field and printed as @samp{/i}. This ! 384: may be deleted; nothing currently depends on it. ! 385: ! 386: @findex SYMBOL_REF_USED ! 387: @cindex @code{used}, in @code{symbol_ref} ! 388: @item SYMBOL_REF_USED (@var{x}) ! 389: In a @code{symbol_ref}, indicates that @var{x} has been used. This is ! 390: normally only used to ensure that @var{x} is only declared external ! 391: once. Stored in the @code{used} field. ! 392: ! 393: @findex SYMBOL_REF_FLAG ! 394: @cindex @code{symbol_ref} and @samp{/v} ! 395: @cindex @code{volatil}, in @code{symbol_ref} ! 396: @item SYMBOL_REF_FLAG (@var{x}) ! 397: In a @code{symbol_ref}, this is used as a flag for machine-specific purposes. ! 398: Stored in the @code{volatil} field and printed as @samp{/v}. ! 399: ! 400: @findex LABEL_OUTSIDE_LOOP_P ! 401: @cindex @code{label_ref} and @samp{/s} ! 402: @cindex @code{in_struct}, in @code{label_ref} ! 403: @item LABEL_OUTSIDE_LOOP_P ! 404: In @code{label_ref} expressions, nonzero if this is a reference to a ! 405: label that is outside the innermost loop containing the reference to the ! 406: label. Stored in the @code{in_struct} field and printed as @samp{/s}. ! 407: ! 408: @findex INSN_DELETED_P ! 409: @cindex @code{volatil}, in @code{insn} ! 410: @item INSN_DELETED_P (@var{insn}) ! 411: In an insn, nonzero if the insn has been deleted. Stored in the ! 412: @code{volatil} field and printed as @samp{/v}. ! 413: ! 414: @findex INSN_ANNULLED_BRANCH_P ! 415: @cindex @code{insn} and @samp{/u} ! 416: @cindex @code{unchanging}, in @code{insn} ! 417: @item INSN_ANNULLED_BRANCH_P (@var{insn}) ! 418: In an @code{insn} in the delay slot of a branch insn, indicates that an ! 419: annulling branch should be used. See the discussion under ! 420: @code{sequence} below. Stored in the @code{unchanging} field and printed ! 421: as @samp{/u}. ! 422: ! 423: @findex INSN_FROM_TARGET_P ! 424: @cindex @code{insn} and @samp{/s} ! 425: @cindex @code{in_struct}, in @code{insn} ! 426: @cindex @samp{/s} in RTL dump ! 427: @item INSN_FROM_TARGET_P (@var{insn}) ! 428: In an @code{insn} in a delay slot of a branch, indicates that the insn ! 429: is from the target of the branch. If the branch insn has ! 430: @code{INSN_ANNULLED_BRANCH_P} set, this insn should only be executed if ! 431: the branch is taken. For annulled branches with this bit clear, the ! 432: insn should be executed only if the branch is not taken. Stored in the ! 433: @code{in_struct} field and printed as @samp{/s}. ! 434: ! 435: @findex CONSTANT_POOL_ADDRESS_P ! 436: @cindex @code{symbol_ref} and @samp{/u} ! 437: @cindex @code{unchanging}, in @code{symbol_ref} ! 438: @item CONSTANT_POOL_ADDRESS_P (@var{x}) ! 439: Nonzero in a @code{symbol_ref} if it refers to part of the current ! 440: function's ``constants pool''. These are addresses close to the ! 441: beginning of the function, and GNU CC assumes they can be addressed ! 442: directly (perhaps with the help of base registers). Stored in the ! 443: @code{unchanging} field and printed as @samp{/u}. ! 444: ! 445: @findex CONST_CALL_P ! 446: @cindex @code{call_insn} and @samp{/u} ! 447: @cindex @code{unchanging}, in @code{call_insn} ! 448: @item CONST_CALL_P (@var{x}) ! 449: In a @code{call_insn}, indicates that the insn represents a call to a const ! 450: function. Stored in the @code{unchanging} field and printed as @samp{/u}. ! 451: ! 452: @findex LABEL_PRESERVE_P ! 453: @cindex @code{code_label} and @samp{/i} ! 454: @cindex @code{in_struct}, in @code{code_label} ! 455: @item LABEL_PRESERVE_P (@var{x}) ! 456: In a @code{code_label}, indicates that the label can never be deleted. ! 457: Labels referenced by a non-local goto will have this bit set. Stored ! 458: in the @code{in_struct} field and printed as @samp{/s}. ! 459: ! 460: @findex SCHED_GROUP_P ! 461: @cindex @code{insn} and @samp{/i} ! 462: @cindex @code{in_struct}, in @code{insn} ! 463: @item SCHED_GROUP_P (@var{insn}) ! 464: During instruction scheduling, in an insn, indicates that the previous insn ! 465: must be scheduled together with this insn. This is used to ensure that ! 466: certain groups of instructions will not be split up by the instruction ! 467: scheduling pass, for example, @code{use} insns before a @code{call_insn} may ! 468: not be separated from the @code{call_insn}. Stored in the @code{in_struct} ! 469: field and printed as @samp{/s}. ! 470: @end table ! 471: ! 472: These are the fields which the above macros refer to: ! 473: ! 474: @table @code ! 475: @findex used ! 476: @item used ! 477: Normally, this flag is used only momentarily, at the end of RTL ! 478: generation for a function, to count the number of times an expression ! 479: appears in insns. Expressions that appear more than once are copied, ! 480: according to the rules for shared structure (@pxref{Sharing}). ! 481: ! 482: In a @code{symbol_ref}, it indicates that an external declaration for ! 483: the symbol has already been written. ! 484: ! 485: In a @code{reg}, it is used by the leaf register renumbering code to ensure ! 486: that each register is only renumbered once. ! 487: ! 488: @findex volatil ! 489: @item volatil ! 490: This flag is used in @code{mem}, @code{symbol_ref} and @code{reg} ! 491: expressions and in insns. In RTL dump files, it is printed as ! 492: @samp{/v}. ! 493: ! 494: @cindex volatile memory references ! 495: In a @code{mem} expression, it is 1 if the memory reference is volatile. ! 496: Volatile memory references may not be deleted, reordered or combined. ! 497: ! 498: In a @code{symbol_ref} expression, it is used for machine-specific ! 499: purposes. ! 500: ! 501: In a @code{reg} expression, it is 1 if the value is a user-level variable. ! 502: 0 indicates an internal compiler temporary. ! 503: ! 504: In an insn, 1 means the insn has been deleted. ! 505: ! 506: @findex in_struct ! 507: @item in_struct ! 508: In @code{mem} expressions, it is 1 if the memory datum referred to is ! 509: all or part of a structure or array; 0 if it is (or might be) a scalar ! 510: variable. A reference through a C pointer has 0 because the pointer ! 511: might point to a scalar variable. This information allows the compiler ! 512: to determine something about possible cases of aliasing. ! 513: ! 514: In an insn in the delay slot of a branch, 1 means that this insn is from ! 515: the target of the branch. ! 516: ! 517: During instruction scheduling, in an insn, 1 means that this insn must be ! 518: scheduled as part of a group together with the previous insn. ! 519: ! 520: In @code{reg} expressions, it is 1 if the register has its entire life ! 521: contained within the test expression of some loop. ! 522: ! 523: In @code{subreg} expressions, 1 means that the @code{subreg} is accessing ! 524: an object that has had its mode promoted from a wider mode. ! 525: ! 526: In @code{label_ref} expressions, 1 means that the referenced label is ! 527: outside the innermost loop containing the insn in which the @code{label_ref} ! 528: was found. ! 529: ! 530: In @code{code_label} expressions, it is 1 if the label may never be deleted. ! 531: This is used for labels which are the target of non-local gotos. ! 532: ! 533: In an RTL dump, this flag is represented as @samp{/s}. ! 534: ! 535: @findex unchanging ! 536: @item unchanging ! 537: In @code{reg} and @code{mem} expressions, 1 means ! 538: that the value of the expression never changes. ! 539: ! 540: In @code{subreg} expressions, it is 1 if the @code{subreg} references an ! 541: unsigned object whose mode has been promoted to a wider mode. ! 542: ! 543: In an insn, 1 means that this is an annulling branch. ! 544: ! 545: In a @code{symbol_ref} expression, 1 means that this symbol addresses ! 546: something in the per-function constants pool. ! 547: ! 548: In a @code{call_insn}, 1 means that this instruction is a call to a ! 549: const function. ! 550: ! 551: In an RTL dump, this flag is represented as @samp{/u}. ! 552: ! 553: @findex integrated ! 554: @item integrated ! 555: In some kinds of expressions, including insns, this flag means the ! 556: rtl was produced by procedure integration. ! 557: ! 558: In a @code{reg} expression, this flag indicates the register ! 559: containing the value to be returned by the current function. On ! 560: machines that pass parameters in registers, the same register number ! 561: may be used for parameters as well, but this flag is not set on such ! 562: uses. ! 563: @end table ! 564: ! 565: @node Machine Modes, Constants, Flags, RTL ! 566: @section Machine Modes ! 567: @cindex machine modes ! 568: ! 569: @findex enum machine_mode ! 570: A machine mode describes a size of data object and the representation used ! 571: for it. In the C code, machine modes are represented by an enumeration ! 572: type, @code{enum machine_mode}, defined in @file{machmode.def}. Each RTL ! 573: expression has room for a machine mode and so do certain kinds of tree ! 574: expressions (declarations and types, to be precise). ! 575: ! 576: In debugging dumps and machine descriptions, the machine mode of an RTL ! 577: expression is written after the expression code with a colon to separate ! 578: them. The letters @samp{mode} which appear at the end of each machine mode ! 579: name are omitted. For example, @code{(reg:SI 38)} is a @code{reg} ! 580: expression with machine mode @code{SImode}. If the mode is ! 581: @code{VOIDmode}, it is not written at all. ! 582: ! 583: Here is a table of machine modes. The term ``byte'' below refers to an ! 584: object of @code{BITS_PER_UNIT} bits (@pxref{Storage Layout}). ! 585: ! 586: @table @code ! 587: @findex QImode ! 588: @item QImode ! 589: ``Quarter-Integer'' mode represents a single byte treated as an integer. ! 590: ! 591: @findex HImode ! 592: @item HImode ! 593: ``Half-Integer'' mode represents a two-byte integer. ! 594: ! 595: @findex PSImode ! 596: @item PSImode ! 597: ``Partial Single Integer'' mode represents an integer which occupies ! 598: four bytes but which doesn't really use all four. On some machines, ! 599: this is the right mode to use for pointers. ! 600: ! 601: @findex SImode ! 602: @item SImode ! 603: ``Single Integer'' mode represents a four-byte integer. ! 604: ! 605: @findex PDImode ! 606: @item PDImode ! 607: ``Partial Double Integer'' mode represents an integer which occupies ! 608: eight bytes but which doesn't really use all eight. On some machines, ! 609: this is the right mode to use for certain pointers. ! 610: ! 611: @findex DImode ! 612: @item DImode ! 613: ``Double Integer'' mode represents an eight-byte integer. ! 614: ! 615: @findex TImode ! 616: @item TImode ! 617: ``Tetra Integer'' (?) mode represents a sixteen-byte integer. ! 618: ! 619: @findex SFmode ! 620: @item SFmode ! 621: ``Single Floating'' mode represents a single-precision (four byte) floating ! 622: point number. ! 623: ! 624: @findex DFmode ! 625: @item DFmode ! 626: ``Double Floating'' mode represents a double-precision (eight byte) floating ! 627: point number. ! 628: ! 629: @findex XFmode ! 630: @item XFmode ! 631: ``Extended Floating'' mode represents a triple-precision (twelve byte) ! 632: floating point number. This mode is used for IEEE extended floating ! 633: point. ! 634: ! 635: @findex TFmode ! 636: @item TFmode ! 637: ``Tetra Floating'' mode represents a quadruple-precision (sixteen byte) ! 638: floating point number. ! 639: ! 640: @findex CCmode ! 641: @item CCmode ! 642: ``Condition Code'' mode represents the value of a condition code, which ! 643: is a machine-specific set of bits used to represent the result of a ! 644: comparison operation. Other machine-specific modes may also be used for ! 645: the condition code. These modes are not used on machines that use ! 646: @code{cc0} (see @pxref{Condition Code}). ! 647: ! 648: @findex BLKmode ! 649: @item BLKmode ! 650: ``Block'' mode represents values that are aggregates to which none of ! 651: the other modes apply. In RTL, only memory references can have this mode, ! 652: and only if they appear in string-move or vector instructions. On machines ! 653: which have no such instructions, @code{BLKmode} will not appear in RTL. ! 654: ! 655: @findex VOIDmode ! 656: @item VOIDmode ! 657: Void mode means the absence of a mode or an unspecified mode. ! 658: For example, RTL expressions of code @code{const_int} have mode ! 659: @code{VOIDmode} because they can be taken to have whatever mode the context ! 660: requires. In debugging dumps of RTL, @code{VOIDmode} is expressed by ! 661: the absence of any mode. ! 662: ! 663: @findex SCmode ! 664: @findex DCmode ! 665: @findex XCmode ! 666: @findex TCmode ! 667: @item SCmode, DCmode, XCmode, TCmode ! 668: These modes stand for a complex number represented as a pair of floating ! 669: point values. The floating point values are in @code{SFmode}, ! 670: @code{DFmode}, @code{XFmode}, and @code{TFmode}, respectively. ! 671: ! 672: @findex CQImode ! 673: @findex CHImode ! 674: @findex CSImode ! 675: @findex CDImode ! 676: @findex CTImode ! 677: @findex COImode ! 678: @item CQImode, CHImode, CSImode, CDImode, CTImode, COImode ! 679: These modes stand for a complex number represented as a pair of integer ! 680: values. The integer values are in @code{QImode}, @code{HImode}, ! 681: @code{SImode}, @code{DImode}, @code{TImode}, and @code{OImode}, ! 682: respectively. ! 683: @end table ! 684: ! 685: The machine description defines @code{Pmode} as a C macro which expands ! 686: into the machine mode used for addresses. Normally this is the mode ! 687: whose size is @code{BITS_PER_WORD}, @code{SImode} on 32-bit machines. ! 688: ! 689: The only modes which a machine description @i{must} support are ! 690: @code{QImode}, and the modes corresponding to @code{BITS_PER_WORD}, ! 691: @code{FLOAT_TYPE_SIZE} and @code{DOUBLE_TYPE_SIZE}. ! 692: The compiler will attempt to use @code{DImode} for 8-byte structures and ! 693: unions, but this can be prevented by overriding the definition of ! 694: @code{MAX_FIXED_MODE_SIZE}. Alternatively, you can have the compiler ! 695: use @code{TImode} for 16-byte structures and unions. Likewise, you can ! 696: arrange for the C type @code{short int} to avoid using @code{HImode}. ! 697: ! 698: @cindex mode classes ! 699: Very few explicit references to machine modes remain in the compiler and ! 700: these few references will soon be removed. Instead, the machine modes ! 701: are divided into mode classes. These are represented by the enumeration ! 702: type @code{enum mode_class} defined in @file{machmode.h}. The possible ! 703: mode classes are: ! 704: ! 705: @table @code ! 706: @findex MODE_INT ! 707: @item MODE_INT ! 708: Integer modes. By default these are @code{QImode}, @code{HImode}, ! 709: @code{SImode}, @code{DImode}, and @code{TImode}. ! 710: ! 711: @findex MODE_PARTIAL_INT ! 712: @item MODE_PARTIAL_INT ! 713: The ``partial integer'' modes, @code{PSImode} and @code{PDImode}. ! 714: ! 715: @findex MODE_FLOAT ! 716: @item MODE_FLOAT ! 717: floating point modes. By default these are @code{SFmode}, @code{DFmode}, ! 718: @code{XFmode} and @code{TFmode}. ! 719: ! 720: @findex MODE_COMPLEX_INT ! 721: @item MODE_COMPLEX_INT ! 722: Complex integer modes. (These are not currently implemented). ! 723: ! 724: @findex MODE_COMPLEX_FLOAT ! 725: @item MODE_COMPLEX_FLOAT ! 726: Complex floating point modes. By default these are @code{SCmode}, ! 727: @code{DCmode}, @code{XCmode}, and @code{TCmode}. ! 728: ! 729: @findex MODE_FUNCTION ! 730: @item MODE_FUNCTION ! 731: Algol or Pascal function variables including a static chain. ! 732: (These are not currently implemented). ! 733: ! 734: @findex MODE_CC ! 735: @item MODE_CC ! 736: Modes representing condition code values. These are @code{CCmode} plus ! 737: any modes listed in the @code{EXTRA_CC_MODES} macro. @xref{Jump Patterns}, ! 738: also see @ref{Condition Code}. ! 739: ! 740: @findex MODE_RANDOM ! 741: @item MODE_RANDOM ! 742: This is a catchall mode class for modes which don't fit into the above ! 743: classes. Currently @code{VOIDmode} and @code{BLKmode} are in ! 744: @code{MODE_RANDOM}. ! 745: @end table ! 746: ! 747: Here are some C macros that relate to machine modes: ! 748: ! 749: @table @code ! 750: @findex GET_MODE ! 751: @item GET_MODE (@var{x}) ! 752: Returns the machine mode of the RTX @var{x}. ! 753: ! 754: @findex PUT_MODE ! 755: @item PUT_MODE (@var{x}, @var{newmode}) ! 756: Alters the machine mode of the RTX @var{x} to be @var{newmode}. ! 757: ! 758: @findex NUM_MACHINE_MODES ! 759: @item NUM_MACHINE_MODES ! 760: Stands for the number of machine modes available on the target ! 761: machine. This is one greater than the largest numeric value of any ! 762: machine mode. ! 763: ! 764: @findex GET_MODE_NAME ! 765: @item GET_MODE_NAME (@var{m}) ! 766: Returns the name of mode @var{m} as a string. ! 767: ! 768: @findex GET_MODE_CLASS ! 769: @item GET_MODE_CLASS (@var{m}) ! 770: Returns the mode class of mode @var{m}. ! 771: ! 772: @findex GET_MODE_WIDER_MODE ! 773: @item GET_MODE_WIDER_MODE (@var{m}) ! 774: Returns the next wider natural mode. For example, the expression ! 775: @code{GET_MODE_WIDER_MODE (QImode)} returns @code{HImode}. ! 776: ! 777: @findex GET_MODE_SIZE ! 778: @item GET_MODE_SIZE (@var{m}) ! 779: Returns the size in bytes of a datum of mode @var{m}. ! 780: ! 781: @findex GET_MODE_BITSIZE ! 782: @item GET_MODE_BITSIZE (@var{m}) ! 783: Returns the size in bits of a datum of mode @var{m}. ! 784: ! 785: @findex GET_MODE_MASK ! 786: @item GET_MODE_MASK (@var{m}) ! 787: Returns a bitmask containing 1 for all bits in a word that fit within ! 788: mode @var{m}. This macro can only be used for modes whose bitsize is ! 789: less than or equal to @code{HOST_BITS_PER_INT}. ! 790: ! 791: @findex GET_MODE_ALIGNMENT ! 792: @item GET_MODE_ALIGNMENT (@var{m)}) ! 793: Return the required alignment, in bits, for an object of mode @var{m}. ! 794: ! 795: @findex GET_MODE_UNIT_SIZE ! 796: @item GET_MODE_UNIT_SIZE (@var{m}) ! 797: Returns the size in bytes of the subunits of a datum of mode @var{m}. ! 798: This is the same as @code{GET_MODE_SIZE} except in the case of complex ! 799: modes. For them, the unit size is the size of the real or imaginary ! 800: part. ! 801: ! 802: @findex GET_MODE_NUNITS ! 803: @item GET_MODE_NUNITS (@var{m}) ! 804: Returns the number of units contained in a mode, i.e., ! 805: @code{GET_MODE_SIZE} divided by @code{GET_MODE_UNIT_SIZE}. ! 806: ! 807: @findex GET_CLASS_NARROWEST_MODE ! 808: @item GET_CLASS_NARROWEST_MODE (@var{c}) ! 809: Returns the narrowest mode in mode class @var{c}. ! 810: @end table ! 811: ! 812: @findex byte_mode ! 813: @findex word_mode ! 814: The global variables @code{byte_mode} and @code{word_mode} contain modes ! 815: whose classes are @code{MODE_INT} and whose bitsizes are either ! 816: @code{BITS_PER_UNIT} or @code{BITS_PER_WORD}, respectively. On 32-bit ! 817: machines, these are @code{QImode} and @code{SImode}, respectively. ! 818: ! 819: @node Constants, Regs and Memory, Machine Modes, RTL ! 820: @section Constant Expression Types ! 821: @cindex RTL constants ! 822: @cindex RTL constant expression types ! 823: ! 824: The simplest RTL expressions are those that represent constant values. ! 825: ! 826: @table @code ! 827: @findex const_int ! 828: @item (const_int @var{i}) ! 829: This type of expression represents the integer value @var{i}. @var{i} ! 830: is customarily accessed with the macro @code{INTVAL} as in ! 831: @code{INTVAL (@var{exp})}, which is equivalent to @code{XWINT (@var{exp}, 0)}. ! 832: ! 833: @findex const0_rtx ! 834: @findex const1_rtx ! 835: @findex const2_rtx ! 836: @findex constm1_rtx ! 837: There is only one expression object for the integer value zero; it is ! 838: the value of the variable @code{const0_rtx}. Likewise, the only ! 839: expression for integer value one is found in @code{const1_rtx}, the only ! 840: expression for integer value two is found in @code{const2_rtx}, and the ! 841: only expression for integer value negative one is found in ! 842: @code{constm1_rtx}. Any attempt to create an expression of code ! 843: @code{const_int} and value zero, one, two or negative one will return ! 844: @code{const0_rtx}, @code{const1_rtx}, @code{const2_rtx} or ! 845: @code{constm1_rtx} as appropriate.@refill ! 846: ! 847: @findex const_true_rtx ! 848: Similarly, there is only one object for the integer whose value is ! 849: @code{STORE_FLAG_VALUE}. It is found in @code{const_true_rtx}. If ! 850: @code{STORE_FLAG_VALUE} is one, @code{const_true_rtx} and ! 851: @code{const1_rtx} will point to the same object. If ! 852: @code{STORE_FLAG_VALUE} is -1, @code{const_true_rtx} and ! 853: @code{constm1_rtx} will point to the same object.@refill ! 854: ! 855: @findex const_double ! 856: @item (const_double:@var{m} @var{addr} @var{i0} @var{i1} @dots{}) ! 857: Represents either a floating-point constant of mode @var{m} or an ! 858: integer constant too large to fit into @code{HOST_BITS_PER_WIDE_INT} ! 859: bits but small enough to fit within twice that number of bits (GNU CC ! 860: does not provide a mechanism to represent even larger constants). In ! 861: the latter case, @var{m} will be @code{VOIDmode}. ! 862: ! 863: @findex CONST_DOUBLE_MEM ! 864: @findex CONST_DOUBLE_CHAIN ! 865: @var{addr} is used to contain the @code{mem} expression that corresponds ! 866: to the location in memory that at which the constant can be found. If ! 867: it has not been allocated a memory location, but is on the chain of all ! 868: @code{const_double} expressions in this compilation (maintained using an ! 869: undisplayed field), @var{addr} contains @code{const0_rtx}. If it is not ! 870: on the chain, @var{addr} contains @code{cc0_rtx}. @var{addr} is ! 871: customarily accessed with the macro @code{CONST_DOUBLE_MEM} and the ! 872: chain field via @code{CONST_DOUBLE_CHAIN}.@refill ! 873: ! 874: @findex CONST_DOUBLE_LOW ! 875: If @var{m} is @code{VOIDmode}, the bits of the value are stored in ! 876: @var{i0} and @var{i1}. @var{i0} is customarily accessed with the macro ! 877: @code{CONST_DOUBLE_LOW} and @var{i1} with @code{CONST_DOUBLE_HIGH}. ! 878: ! 879: If the constant is floating point (regardless of its precision), then ! 880: the number of integers used to store the value depends on the size of ! 881: @code{REAL_VALUE_TYPE} (@pxref{Cross-compilation}). The integers ! 882: represent a floating point number, but not precisely in the target ! 883: machine's or host machine's floating point format. To convert them to ! 884: the precise bit pattern used by the target machine, use the macro ! 885: @code{REAL_VALUE_TO_TARGET_DOUBLE} and friends (@pxref{Data Output}). ! 886: ! 887: @findex CONST0_RTX ! 888: @findex CONST1_RTX ! 889: @findex CONST2_RTX ! 890: The macro @code{CONST0_RTX (@var{mode})} refers to an expression with ! 891: value 0 in mode @var{mode}. If mode @var{mode} is of mode class ! 892: @code{MODE_INT}, it returns @code{const0_rtx}. Otherwise, it returns a ! 893: @code{CONST_DOUBLE} expression in mode @var{mode}. Similarly, the macro ! 894: @code{CONST1_RTX (@var{mode})} refers to an expression with value 1 in ! 895: mode @var{mode} and similarly for @code{CONST2_RTX}. ! 896: ! 897: @findex const_string ! 898: @item (const_string @var{str}) ! 899: Represents a constant string with value @var{str}. Currently this is ! 900: used only for insn attributes (@pxref{Insn Attributes}) since constant ! 901: strings in C are placed in memory. ! 902: ! 903: @findex symbol_ref ! 904: @item (symbol_ref:@var{mode} @var{symbol}) ! 905: Represents the value of an assembler label for data. @var{symbol} is ! 906: a string that describes the name of the assembler label. If it starts ! 907: with a @samp{*}, the label is the rest of @var{symbol} not including ! 908: the @samp{*}. Otherwise, the label is @var{symbol}, usually prefixed ! 909: with @samp{_}. ! 910: ! 911: The @code{symbol_ref} contains a mode, which is usually @code{Pmode}. ! 912: Usually that is the only mode for which a symbol is directly valid. ! 913: ! 914: @findex label_ref ! 915: @item (label_ref @var{label}) ! 916: Represents the value of an assembler label for code. It contains one ! 917: operand, an expression, which must be a @code{code_label} that appears ! 918: in the instruction sequence to identify the place where the label ! 919: should go. ! 920: ! 921: The reason for using a distinct expression type for code label ! 922: references is so that jump optimization can distinguish them. ! 923: ! 924: @item (const:@var{m} @var{exp}) ! 925: Represents a constant that is the result of an assembly-time ! 926: arithmetic computation. The operand, @var{exp}, is an expression that ! 927: contains only constants (@code{const_int}, @code{symbol_ref} and ! 928: @code{label_ref} expressions) combined with @code{plus} and ! 929: @code{minus}. However, not all combinations are valid, since the ! 930: assembler cannot do arbitrary arithmetic on relocatable symbols. ! 931: ! 932: @var{m} should be @code{Pmode}. ! 933: ! 934: @findex high ! 935: @item (high:@var{m} @var{exp}) ! 936: Represents the high-order bits of @var{exp}, usually a ! 937: @code{symbol_ref}. The number of bits is machine-dependent and is ! 938: normally the number of bits specified in an instruction that initializes ! 939: the high order bits of a register. It is used with @code{lo_sum} to ! 940: represent the typical two-instruction sequence used in RISC machines to ! 941: reference a global memory location. ! 942: ! 943: @var{m} should be @code{Pmode}. ! 944: @end table ! 945: ! 946: @node Regs and Memory, Arithmetic, Constants, RTL ! 947: @section Registers and Memory ! 948: @cindex RTL register expressions ! 949: @cindex RTL memory expressions ! 950: ! 951: Here are the RTL expression types for describing access to machine ! 952: registers and to main memory. ! 953: ! 954: @table @code ! 955: @findex reg ! 956: @cindex hard registers ! 957: @cindex pseudo registers ! 958: @item (reg:@var{m} @var{n}) ! 959: For small values of the integer @var{n} (those that are less than ! 960: @code{FIRST_PSEUDO_REGISTER}), this stands for a reference to machine ! 961: register number @var{n}: a @dfn{hard register}. For larger values of ! 962: @var{n}, it stands for a temporary value or @dfn{pseudo register}. ! 963: The compiler's strategy is to generate code assuming an unlimited ! 964: number of such pseudo registers, and later convert them into hard ! 965: registers or into memory references. ! 966: ! 967: @var{m} is the machine mode of the reference. It is necessary because ! 968: machines can generally refer to each register in more than one mode. ! 969: For example, a register may contain a full word but there may be ! 970: instructions to refer to it as a half word or as a single byte, as ! 971: well as instructions to refer to it as a floating point number of ! 972: various precisions. ! 973: ! 974: Even for a register that the machine can access in only one mode, ! 975: the mode must always be specified. ! 976: ! 977: The symbol @code{FIRST_PSEUDO_REGISTER} is defined by the machine ! 978: description, since the number of hard registers on the machine is an ! 979: invariant characteristic of the machine. Note, however, that not ! 980: all of the machine registers must be general registers. All the ! 981: machine registers that can be used for storage of data are given ! 982: hard register numbers, even those that can be used only in certain ! 983: instructions or can hold only certain types of data. ! 984: ! 985: A hard register may be accessed in various modes throughout one ! 986: function, but each pseudo register is given a natural mode ! 987: and is accessed only in that mode. When it is necessary to describe ! 988: an access to a pseudo register using a nonnatural mode, a @code{subreg} ! 989: expression is used. ! 990: ! 991: A @code{reg} expression with a machine mode that specifies more than ! 992: one word of data may actually stand for several consecutive registers. ! 993: If in addition the register number specifies a hardware register, then ! 994: it actually represents several consecutive hardware registers starting ! 995: with the specified one. ! 996: ! 997: Each pseudo register number used in a function's RTL code is ! 998: represented by a unique @code{reg} expression. ! 999: ! 1000: @findex FIRST_VIRTUAL_REGISTER ! 1001: @findex LAST_VIRTUAL_REGISTER ! 1002: Some pseudo register numbers, those within the range of ! 1003: @code{FIRST_VIRTUAL_REGISTER} to @code{LAST_VIRTUAL_REGISTER} only ! 1004: appear during the RTL generation phase and are eliminated before the ! 1005: optimization phases. These represent locations in the stack frame that ! 1006: cannot be determined until RTL generation for the function has been ! 1007: completed. The following virtual register numbers are defined: ! 1008: ! 1009: @table @code ! 1010: @findex VIRTUAL_INCOMING_ARGS_REGNUM ! 1011: @item VIRTUAL_INCOMING_ARGS_REGNUM ! 1012: This points to the first word of the incoming arguments passed on the ! 1013: stack. Normally these arguments are placed there by the caller, but the ! 1014: callee may have pushed some arguments that were previously passed in ! 1015: registers. ! 1016: ! 1017: @cindex @code{FIRST_PARM_OFFSET} and virtual registers ! 1018: @cindex @code{ARG_POINTER_REGNUM} and virtual registers ! 1019: When RTL generation is complete, this virtual register is replaced ! 1020: by the sum of the register given by @code{ARG_POINTER_REGNUM} and the ! 1021: value of @code{FIRST_PARM_OFFSET}. ! 1022: ! 1023: @findex VIRTUAL_STACK_VARS_REGNUM ! 1024: @cindex @code{FRAME_GROWS_DOWNWARD} and virtual registers ! 1025: @item VIRTUAL_STACK_VARS_REGNUM ! 1026: If @code{FRAME_GROWS_DOWNWARD} is defined, this points to immediately ! 1027: above the first variable on the stack. Otherwise, it points to the ! 1028: first variable on the stack. ! 1029: ! 1030: @cindex @code{STARTING_FRAME_OFFSET} and virtual registers ! 1031: @cindex @code{FRAME_POINTER_REGNUM} and virtual registers ! 1032: @code{VIRTUAL_STACK_VARS_REGNUM} is replaced with the sum of the ! 1033: register given by @code{FRAME_POINTER_REGNUM} and the value ! 1034: @code{STARTING_FRAME_OFFSET}. ! 1035: ! 1036: @findex VIRTUAL_STACK_DYNAMIC_REGNUM ! 1037: @item VIRTUAL_STACK_DYNAMIC_REGNUM ! 1038: This points to the location of dynamically allocated memory on the stack ! 1039: immediately after the stack pointer has been adjusted by the amount of ! 1040: memory desired. ! 1041: ! 1042: @cindex @code{STACK_DYNAMIC_OFFSET} and virtual registers ! 1043: @cindex @code{STACK_POINTER_REGNUM} and virtual registers ! 1044: This virtual register is replaced by the sum of the register given by ! 1045: @code{STACK_POINTER_REGNUM} and the value @code{STACK_DYNAMIC_OFFSET}. ! 1046: ! 1047: @findex VIRTUAL_OUTGOING_ARGS_REGNUM ! 1048: @item VIRTUAL_OUTGOING_ARGS_REGNUM ! 1049: This points to the location in the stack at which outgoing arguments ! 1050: should be written when the stack is pre-pushed (arguments pushed using ! 1051: push insns should always use @code{STACK_POINTER_REGNUM}). ! 1052: ! 1053: @cindex @code{STACK_POINTER_OFFSET} and virtual registers ! 1054: This virtual register is replaced by the sum of the register given by ! 1055: @code{STACK_POINTER_REGNUM} and the value @code{STACK_POINTER_OFFSET}. ! 1056: @end table ! 1057: ! 1058: @findex subreg ! 1059: @item (subreg:@var{m} @var{reg} @var{wordnum}) ! 1060: @code{subreg} expressions are used to refer to a register in a machine ! 1061: mode other than its natural one, or to refer to one register of ! 1062: a multi-word @code{reg} that actually refers to several registers. ! 1063: ! 1064: Each pseudo-register has a natural mode. If it is necessary to ! 1065: operate on it in a different mode---for example, to perform a fullword ! 1066: move instruction on a pseudo-register that contains a single ! 1067: byte---the pseudo-register must be enclosed in a @code{subreg}. In ! 1068: such a case, @var{wordnum} is zero. ! 1069: ! 1070: Usually @var{m} is at least as narrow as the mode of @var{reg}, in which ! 1071: case it is restricting consideration to only the bits of @var{reg} that ! 1072: are in @var{m}. ! 1073: ! 1074: Sometimes @var{m} is wider than the mode of @var{reg}. These ! 1075: @code{subreg} expressions are often called @dfn{paradoxical}. They are ! 1076: used in cases where we want to refer to an object in a wider mode but do ! 1077: not care what value the additional bits have. The reload pass ensures ! 1078: that paradoxical references are only made to hard registers. ! 1079: ! 1080: The other use of @code{subreg} is to extract the individual registers of ! 1081: a multi-register value. Machine modes such as @code{DImode} and ! 1082: @code{TImode} can indicate values longer than a word, values which ! 1083: usually require two or more consecutive registers. To access one of the ! 1084: registers, use a @code{subreg} with mode @code{SImode} and a ! 1085: @var{wordnum} that says which register. ! 1086: ! 1087: Storing in a non-paradoxical @code{subreg} has undefined results for ! 1088: bits belonging to the same word as the @code{subreg}. This laxity makes ! 1089: it easier to generate efficient code for such instructions. To ! 1090: represent an instruction that preserves all the bits outside of those in ! 1091: the @code{subreg}, use @code{strict_low_part} around the @code{subreg}. ! 1092: ! 1093: @cindex @code{WORDS_BIG_ENDIAN}, effect on @code{subreg} ! 1094: The compilation parameter @code{WORDS_BIG_ENDIAN}, if set to 1, says ! 1095: that word number zero is the most significant part; otherwise, it is ! 1096: the least significant part. ! 1097: ! 1098: @cindex combiner pass ! 1099: @cindex reload pass ! 1100: @cindex @code{subreg}, special reload handling ! 1101: Between the combiner pass and the reload pass, it is possible to have a ! 1102: paradoxical @code{subreg} which contains a @code{mem} instead of a ! 1103: @code{reg} as its first operand. After the reload pass, it is also ! 1104: possible to have a non-paradoxical @code{subreg} which contains a ! 1105: @code{mem}; this usually occurs when the @code{mem} is a stack slot ! 1106: which replaced a pseudo register. ! 1107: ! 1108: Note that it is not valid to access a @code{DFmode} value in @code{SFmode} ! 1109: using a @code{subreg}. On some machines the most significant part of a ! 1110: @code{DFmode} value does not have the same format as a single-precision ! 1111: floating value. ! 1112: ! 1113: It is also not valid to access a single word of a multi-word value in a ! 1114: hard register when less registers can hold the value than would be ! 1115: expected from its size. For example, some 32-bit machines have ! 1116: floating-point registers that can hold an entire @code{DFmode} value. ! 1117: If register 10 were such a register @code{(subreg:SI (reg:DF 10) 1)} ! 1118: would be invalid because there is no way to convert that reference to ! 1119: a single machine register. The reload pass prevents @code{subreg} ! 1120: expressions such as these from being formed. ! 1121: ! 1122: @findex SUBREG_REG ! 1123: @findex SUBREG_WORD ! 1124: The first operand of a @code{subreg} expression is customarily accessed ! 1125: with the @code{SUBREG_REG} macro and the second operand is customarily ! 1126: accessed with the @code{SUBREG_WORD} macro. ! 1127: ! 1128: @findex scratch ! 1129: @cindex scratch operands ! 1130: @item (scratch:@var{m}) ! 1131: This represents a scratch register that will be required for the ! 1132: execution of a single instruction and not used subsequently. It is ! 1133: converted into a @code{reg} by either the local register allocator or ! 1134: the reload pass. ! 1135: ! 1136: @code{scratch} is usually present inside a @code{clobber} operation ! 1137: (@pxref{Side Effects}). ! 1138: ! 1139: @findex cc0 ! 1140: @cindex condition code register ! 1141: @item (cc0) ! 1142: This refers to the machine's condition code register. It has no ! 1143: operands and may not have a machine mode. There are two ways to use it: ! 1144: ! 1145: @itemize @bullet ! 1146: @item ! 1147: To stand for a complete set of condition code flags. This is best on ! 1148: most machines, where each comparison sets the entire series of flags. ! 1149: ! 1150: With this technique, @code{(cc0)} may be validly used in only two ! 1151: contexts: as the destination of an assignment (in test and compare ! 1152: instructions) and in comparison operators comparing against zero ! 1153: (@code{const_int} with value zero; that is to say, @code{const0_rtx}). ! 1154: ! 1155: @item ! 1156: To stand for a single flag that is the result of a single condition. ! 1157: This is useful on machines that have only a single flag bit, and in ! 1158: which comparison instructions must specify the condition to test. ! 1159: ! 1160: With this technique, @code{(cc0)} may be validly used in only two ! 1161: contexts: as the destination of an assignment (in test and compare ! 1162: instructions) where the source is a comparison operator, and as the ! 1163: first operand of @code{if_then_else} (in a conditional branch). ! 1164: @end itemize ! 1165: ! 1166: @findex cc0_rtx ! 1167: There is only one expression object of code @code{cc0}; it is the ! 1168: value of the variable @code{cc0_rtx}. Any attempt to create an ! 1169: expression of code @code{cc0} will return @code{cc0_rtx}. ! 1170: ! 1171: Instructions can set the condition code implicitly. On many machines, ! 1172: nearly all instructions set the condition code based on the value that ! 1173: they compute or store. It is not necessary to record these actions ! 1174: explicitly in the RTL because the machine description includes a ! 1175: prescription for recognizing the instructions that do so (by means of ! 1176: the macro @code{NOTICE_UPDATE_CC}). @xref{Condition Code}. Only ! 1177: instructions whose sole purpose is to set the condition code, and ! 1178: instructions that use the condition code, need mention @code{(cc0)}. ! 1179: ! 1180: On some machines, the condition code register is given a register number ! 1181: and a @code{reg} is used instead of @code{(cc0)}. This is usually the ! 1182: preferable approach if only a small subset of instructions modify the ! 1183: condition code. Other machines store condition codes in general ! 1184: registers; in such cases a pseudo register should be used. ! 1185: ! 1186: Some machines, such as the Sparc and RS/6000, have two sets of ! 1187: arithmetic instructions, one that sets and one that does not set the ! 1188: condition code. This is best handled by normally generating the ! 1189: instruction that does not set the condition code, and making a pattern ! 1190: that both performs the arithmetic and sets the condition code register ! 1191: (which would not be @code{(cc0)} in this case). For examples, search ! 1192: for @samp{addcc} and @samp{andcc} in @file{sparc.md}. ! 1193: ! 1194: @findex pc ! 1195: @item (pc) ! 1196: @cindex program counter ! 1197: This represents the machine's program counter. It has no operands and ! 1198: may not have a machine mode. @code{(pc)} may be validly used only in ! 1199: certain specific contexts in jump instructions. ! 1200: ! 1201: @findex pc_rtx ! 1202: There is only one expression object of code @code{pc}; it is the value ! 1203: of the variable @code{pc_rtx}. Any attempt to create an expression of ! 1204: code @code{pc} will return @code{pc_rtx}. ! 1205: ! 1206: All instructions that do not jump alter the program counter implicitly ! 1207: by incrementing it, but there is no need to mention this in the RTL. ! 1208: ! 1209: @findex mem ! 1210: @item (mem:@var{m} @var{addr}) ! 1211: This RTX represents a reference to main memory at an address ! 1212: represented by the expression @var{addr}. @var{m} specifies how large ! 1213: a unit of memory is accessed. ! 1214: @end table ! 1215: ! 1216: @node Arithmetic, Comparisons, Regs and Memory, RTL ! 1217: @section RTL Expressions for Arithmetic ! 1218: @cindex arithmetic, in RTL ! 1219: @cindex math, in RTL ! 1220: @cindex RTL expressions for arithmetic ! 1221: ! 1222: Unless otherwise specified, all the operands of arithmetic expressions ! 1223: must be valid for mode @var{m}. An operand is valid for mode @var{m} ! 1224: if it has mode @var{m}, or if it is a @code{const_int} or ! 1225: @code{const_double} and @var{m} is a mode of class @code{MODE_INT}. ! 1226: ! 1227: For commutative binary operations, constants should be placed in the ! 1228: second operand. ! 1229: ! 1230: @table @code ! 1231: @findex plus ! 1232: @cindex RTL addition ! 1233: @cindex RTL sum ! 1234: @item (plus:@var{m} @var{x} @var{y}) ! 1235: Represents the sum of the values represented by @var{x} and @var{y} ! 1236: carried out in machine mode @var{m}. ! 1237: ! 1238: @findex lo_sum ! 1239: @item (lo_sum:@var{m} @var{x} @var{y}) ! 1240: Like @code{plus}, except that it represents that sum of @var{x} and the ! 1241: low-order bits of @var{y}. The number of low order bits is ! 1242: machine-dependent but is normally the number of bits in a @code{Pmode} ! 1243: item minus the number of bits set by the @code{high} code ! 1244: (@pxref{Constants}). ! 1245: ! 1246: @var{m} should be @code{Pmode}. ! 1247: ! 1248: @findex minus ! 1249: @cindex RTL subtraction ! 1250: @cindex RTL difference ! 1251: @item (minus:@var{m} @var{x} @var{y}) ! 1252: Like @code{plus} but represents subtraction. ! 1253: ! 1254: @findex compare ! 1255: @cindex RTL comparison ! 1256: @item (compare:@var{m} @var{x} @var{y}) ! 1257: Represents the result of subtracting @var{y} from @var{x} for purposes ! 1258: of comparison. The result is computed without overflow, as if with ! 1259: infinite precision. ! 1260: ! 1261: Of course, machines can't really subtract with infinite precision. ! 1262: However, they can pretend to do so when only the sign of the ! 1263: result will be used, which is the case when the result is stored ! 1264: in the condition code. And that is the only way this kind of expression ! 1265: may validly be used: as a value to be stored in the condition codes. ! 1266: ! 1267: The mode @var{m} is not related to the modes of @var{x} and @var{y}, ! 1268: but instead is the mode of the condition code value. If @code{(cc0)} ! 1269: is used, it is @code{VOIDmode}. Otherwise it is some mode in class ! 1270: @code{MODE_CC}, often @code{CCmode}. @xref{Condition Code}. ! 1271: ! 1272: Normally, @var{x} and @var{y} must have the same mode. Otherwise, ! 1273: @code{compare} is valid only if the mode of @var{x} is in class ! 1274: @code{MODE_INT} and @var{y} is a @code{const_int} or ! 1275: @code{const_double} with mode @code{VOIDmode}. The mode of @var{x} ! 1276: determines what mode the comparison is to be done in; thus it must not ! 1277: be @code{VOIDmode}. ! 1278: ! 1279: If one of the operands is a constant, it should be placed in the ! 1280: second operand and the comparison code adjusted as appropriate. ! 1281: ! 1282: A @code{compare} specifying two @code{VOIDmode} constants is not valid ! 1283: since there is no way to know in what mode the comparison is to be ! 1284: performed; the comparison must either be folded during the compilation ! 1285: or the first operand must be loaded into a register while its mode is ! 1286: still known. ! 1287: ! 1288: @findex neg ! 1289: @item (neg:@var{m} @var{x}) ! 1290: Represents the negation (subtraction from zero) of the value represented ! 1291: by @var{x}, carried out in mode @var{m}. ! 1292: ! 1293: @findex mult ! 1294: @cindex multiplication ! 1295: @cindex product ! 1296: @item (mult:@var{m} @var{x} @var{y}) ! 1297: Represents the signed product of the values represented by @var{x} and ! 1298: @var{y} carried out in machine mode @var{m}. ! 1299: ! 1300: Some machines support a multiplication that generates a product wider ! 1301: than the operands. Write the pattern for this as ! 1302: ! 1303: @example ! 1304: (mult:@var{m} (sign_extend:@var{m} @var{x}) (sign_extend:@var{m} @var{y})) ! 1305: @end example ! 1306: ! 1307: where @var{m} is wider than the modes of @var{x} and @var{y}, which need ! 1308: not be the same. ! 1309: ! 1310: Write patterns for unsigned widening multiplication similarly using ! 1311: @code{zero_extend}. ! 1312: ! 1313: @findex div ! 1314: @cindex division ! 1315: @cindex signed division ! 1316: @cindex quotient ! 1317: @item (div:@var{m} @var{x} @var{y}) ! 1318: Represents the quotient in signed division of @var{x} by @var{y}, ! 1319: carried out in machine mode @var{m}. If @var{m} is a floating point ! 1320: mode, it represents the exact quotient; otherwise, the integerized ! 1321: quotient. ! 1322: ! 1323: Some machines have division instructions in which the operands and ! 1324: quotient widths are not all the same; you should represent ! 1325: such instructions using @code{truncate} and @code{sign_extend} as in, ! 1326: ! 1327: @example ! 1328: (truncate:@var{m1} (div:@var{m2} @var{x} (sign_extend:@var{m2} @var{y}))) ! 1329: @end example ! 1330: ! 1331: @findex udiv ! 1332: @cindex unsigned division ! 1333: @cindex division ! 1334: @item (udiv:@var{m} @var{x} @var{y}) ! 1335: Like @code{div} but represents unsigned division. ! 1336: ! 1337: @findex mod ! 1338: @findex umod ! 1339: @cindex remainder ! 1340: @cindex division ! 1341: @item (mod:@var{m} @var{x} @var{y}) ! 1342: @itemx (umod:@var{m} @var{x} @var{y}) ! 1343: Like @code{div} and @code{udiv} but represent the remainder instead of ! 1344: the quotient. ! 1345: ! 1346: @findex smin ! 1347: @findex smax ! 1348: @cindex signed minimum ! 1349: @cindex signed maximum ! 1350: @item (smin:@var{m} @var{x} @var{y}) ! 1351: @itemx (smax:@var{m} @var{x} @var{y}) ! 1352: Represents the smaller (for @code{smin}) or larger (for @code{smax}) of ! 1353: @var{x} and @var{y}, interpreted as signed integers in mode @var{m}. ! 1354: ! 1355: @findex umin ! 1356: @findex umax ! 1357: @cindex unsigned minimum and maximum ! 1358: @item (umin:@var{m} @var{x} @var{y}) ! 1359: @itemx (umax:@var{m} @var{x} @var{y}) ! 1360: Like @code{smin} and @code{smax}, but the values are interpreted as unsigned ! 1361: integers. ! 1362: ! 1363: @findex not ! 1364: @cindex complement, bitwise ! 1365: @cindex bitwise complement ! 1366: @item (not:@var{m} @var{x}) ! 1367: Represents the bitwise complement of the value represented by @var{x}, ! 1368: carried out in mode @var{m}, which must be a fixed-point machine mode. ! 1369: ! 1370: @findex and ! 1371: @cindex logical-and, bitwise ! 1372: @cindex bitwise logical-and ! 1373: @item (and:@var{m} @var{x} @var{y}) ! 1374: Represents the bitwise logical-and of the values represented by ! 1375: @var{x} and @var{y}, carried out in machine mode @var{m}, which must be ! 1376: a fixed-point machine mode. ! 1377: ! 1378: @findex ior ! 1379: @cindex inclusive-or, bitwise ! 1380: @cindex bitwise inclusive-or ! 1381: @item (ior:@var{m} @var{x} @var{y}) ! 1382: Represents the bitwise inclusive-or of the values represented by @var{x} ! 1383: and @var{y}, carried out in machine mode @var{m}, which must be a ! 1384: fixed-point mode. ! 1385: ! 1386: @findex xor ! 1387: @cindex exclusive-or, bitwise ! 1388: @cindex bitwise exclusive-or ! 1389: @item (xor:@var{m} @var{x} @var{y}) ! 1390: Represents the bitwise exclusive-or of the values represented by @var{x} ! 1391: and @var{y}, carried out in machine mode @var{m}, which must be a ! 1392: fixed-point mode. ! 1393: ! 1394: @findex ashift ! 1395: @cindex left shift ! 1396: @cindex shift ! 1397: @cindex arithmetic shift ! 1398: @item (ashift:@var{m} @var{x} @var{c}) ! 1399: Represents the result of arithmetically shifting @var{x} left by @var{c} ! 1400: places. @var{x} have mode @var{m}, a fixed-point machine mode. @var{c} ! 1401: be a fixed-point mode or be a constant with mode @code{VOIDmode}; which ! 1402: mode is determined by the mode called for in the machine description ! 1403: entry for the left-shift instruction. For example, on the Vax, the mode ! 1404: of @var{c} is @code{QImode} regardless of @var{m}. ! 1405: ! 1406: @findex lshift ! 1407: @cindex left shift ! 1408: @cindex logical shift ! 1409: @item (lshift:@var{m} @var{x} @var{c}) ! 1410: Like @code{ashift} but for logical left shift. @code{ashift} and ! 1411: @code{lshift} are identical operations; we customarily use @code{ashift} ! 1412: for both. ! 1413: ! 1414: @findex lshiftrt ! 1415: @cindex right shift ! 1416: @findex ashiftrt ! 1417: @item (lshiftrt:@var{m} @var{x} @var{c}) ! 1418: @itemx (ashiftrt:@var{m} @var{x} @var{c}) ! 1419: Like @code{lshift} and @code{ashift} but for right shift. Unlike ! 1420: the case for left shift, these two operations are distinct. ! 1421: ! 1422: @findex rotate ! 1423: @cindex rotate ! 1424: @cindex left rotate ! 1425: @findex rotatert ! 1426: @cindex right rotate ! 1427: @item (rotate:@var{m} @var{x} @var{c}) ! 1428: @itemx (rotatert:@var{m} @var{x} @var{c}) ! 1429: Similar but represent left and right rotate. If @var{c} is a constant, ! 1430: use @code{rotate}. ! 1431: ! 1432: @findex abs ! 1433: @cindex absolute value ! 1434: @item (abs:@var{m} @var{x}) ! 1435: Represents the absolute value of @var{x}, computed in mode @var{m}. ! 1436: ! 1437: @findex sqrt ! 1438: @cindex square root ! 1439: @item (sqrt:@var{m} @var{x}) ! 1440: Represents the square root of @var{x}, computed in mode @var{m}. ! 1441: Most often @var{m} will be a floating point mode. ! 1442: ! 1443: @findex ffs ! 1444: @item (ffs:@var{m} @var{x}) ! 1445: Represents one plus the index of the least significant 1-bit in ! 1446: @var{x}, represented as an integer of mode @var{m}. (The value is ! 1447: zero if @var{x} is zero.) The mode of @var{x} need not be @var{m}; ! 1448: depending on the target machine, various mode combinations may be ! 1449: valid. ! 1450: @end table ! 1451: ! 1452: @node Comparisons, Bit Fields, Arithmetic, RTL ! 1453: @section Comparison Operations ! 1454: @cindex RTL comparison operations ! 1455: ! 1456: Comparison operators test a relation on two operands and are considered ! 1457: to represent a machine-dependent nonzero value described by, but not ! 1458: necessarily equal to, @code{STORE_FLAG_VALUE} (@pxref{Misc}) ! 1459: if the relation holds, or zero if it does not. The mode of the ! 1460: comparison operation is independent of the mode of the data being ! 1461: compared. If the comparison operation is being tested (e.g., the first ! 1462: operand of an @code{if_then_else}), the mode must be @code{VOIDmode}. ! 1463: If the comparison operation is producing data to be stored in some ! 1464: variable, the mode must be in class @code{MODE_INT}. All comparison ! 1465: operations producing data must use the same mode, which is ! 1466: machine-specific. ! 1467: ! 1468: @cindex condition codes ! 1469: There are two ways that comparison operations may be used. The ! 1470: comparison operators may be used to compare the condition codes ! 1471: @code{(cc0)} against zero, as in @code{(eq (cc0) (const_int 0))}. Such ! 1472: a construct actually refers to the result of the preceding instruction ! 1473: in which the condition codes were set. The instructing setting the ! 1474: condition code must be adjacent to the instruction using the condition ! 1475: code; only @code{note} insns may separate them. ! 1476: ! 1477: Alternatively, a comparison operation may directly compare two data ! 1478: objects. The mode of the comparison is determined by the operands; they ! 1479: must both be valid for a common machine mode. A comparison with both ! 1480: operands constant would be invalid as the machine mode could not be ! 1481: deduced from it, but such a comparison should never exist in RTL due to ! 1482: constant folding. ! 1483: ! 1484: In the example above, if @code{(cc0)} were last set to ! 1485: @code{(compare @var{x} @var{y})}, the comparison operation is ! 1486: identical to @code{(eq @var{x} @var{y})}. Usually only one style ! 1487: of comparisons is supported on a particular machine, but the combine ! 1488: pass will try to merge the operations to produce the @code{eq} shown ! 1489: in case it exists in the context of the particular insn involved. ! 1490: ! 1491: Inequality comparisons come in two flavors, signed and unsigned. Thus, ! 1492: there are distinct expression codes @code{gt} and @code{gtu} for signed and ! 1493: unsigned greater-than. These can produce different results for the same ! 1494: pair of integer values: for example, 1 is signed greater-than -1 but not ! 1495: unsigned greater-than, because -1 when regarded as unsigned is actually ! 1496: @code{0xffffffff} which is greater than 1. ! 1497: ! 1498: The signed comparisons are also used for floating point values. Floating ! 1499: point comparisons are distinguished by the machine modes of the operands. ! 1500: ! 1501: @table @code ! 1502: @findex eq ! 1503: @cindex equal ! 1504: @item (eq:@var{m} @var{x} @var{y}) ! 1505: 1 if the values represented by @var{x} and @var{y} are equal, ! 1506: otherwise 0. ! 1507: ! 1508: @findex ne ! 1509: @cindex not equal ! 1510: @item (ne:@var{m} @var{x} @var{y}) ! 1511: 1 if the values represented by @var{x} and @var{y} are not equal, ! 1512: otherwise 0. ! 1513: ! 1514: @findex gt ! 1515: @cindex greater than ! 1516: @item (gt:@var{m} @var{x} @var{y}) ! 1517: 1 if the @var{x} is greater than @var{y}. If they are fixed-point, ! 1518: the comparison is done in a signed sense. ! 1519: ! 1520: @findex gtu ! 1521: @cindex greater than ! 1522: @cindex unsigned greater than ! 1523: @item (gtu:@var{m} @var{x} @var{y}) ! 1524: Like @code{gt} but does unsigned comparison, on fixed-point numbers only. ! 1525: ! 1526: @findex lt ! 1527: @cindex less than ! 1528: @findex ltu ! 1529: @cindex unsigned less than ! 1530: @item (lt:@var{m} @var{x} @var{y}) ! 1531: @itemx (ltu:@var{m} @var{x} @var{y}) ! 1532: Like @code{gt} and @code{gtu} but test for ``less than''. ! 1533: ! 1534: @findex ge ! 1535: @cindex greater than ! 1536: @findex geu ! 1537: @cindex unsigned greater than ! 1538: @item (ge:@var{m} @var{x} @var{y}) ! 1539: @itemx (geu:@var{m} @var{x} @var{y}) ! 1540: Like @code{gt} and @code{gtu} but test for ``greater than or equal''. ! 1541: ! 1542: @findex le ! 1543: @cindex less than or equal ! 1544: @findex leu ! 1545: @cindex unsigned less than ! 1546: @item (le:@var{m} @var{x} @var{y}) ! 1547: @itemx (leu:@var{m} @var{x} @var{y}) ! 1548: Like @code{gt} and @code{gtu} but test for ``less than or equal''. ! 1549: ! 1550: @findex if_then_else ! 1551: @item (if_then_else @var{cond} @var{then} @var{else}) ! 1552: This is not a comparison operation but is listed here because it is ! 1553: always used in conjunction with a comparison operation. To be ! 1554: precise, @var{cond} is a comparison expression. This expression ! 1555: represents a choice, according to @var{cond}, between the value ! 1556: represented by @var{then} and the one represented by @var{else}. ! 1557: ! 1558: On most machines, @code{if_then_else} expressions are valid only ! 1559: to express conditional jumps. ! 1560: ! 1561: @findex cond ! 1562: @item (cond [@var{test1} @var{value1} @var{test2} @var{value2} @dots{}] @var{default}) ! 1563: Similar to @code{if_then_else}, but more general. Each of @var{test1}, ! 1564: @var{test2}, @dots{} is performed in turn. The result of this expression is ! 1565: the @var{value} corresponding to the first non-zero test, or @var{default} if ! 1566: none of the tests are non-zero expressions. ! 1567: ! 1568: This is currently not valid for instruction patterns and is supported only ! 1569: for insn attributes. @xref{Insn Attributes}. ! 1570: @end table ! 1571: ! 1572: @node Bit Fields, Conversions, Comparisons, RTL ! 1573: @section Bit Fields ! 1574: @cindex bit fields ! 1575: ! 1576: Special expression codes exist to represent bitfield instructions. ! 1577: These types of expressions are lvalues in RTL; they may appear ! 1578: on the left side of an assignment, indicating insertion of a value ! 1579: into the specified bit field. ! 1580: ! 1581: @table @code ! 1582: @findex sign_extract ! 1583: @cindex @code{BITS_BIG_ENDIAN}, effect on @code{sign_extract} ! 1584: @item (sign_extract:@var{m} @var{loc} @var{size} @var{pos}) ! 1585: This represents a reference to a sign-extended bit field contained or ! 1586: starting in @var{loc} (a memory or register reference). The bit field ! 1587: is @var{size} bits wide and starts at bit @var{pos}. The compilation ! 1588: option @code{BITS_BIG_ENDIAN} says which end of the memory unit ! 1589: @var{pos} counts from. ! 1590: ! 1591: If @var{loc} is in memory, its mode must be a single-byte integer mode. ! 1592: If @var{loc} is in a register, the mode to use is specified by the ! 1593: operand of the @code{insv} or @code{extv} pattern ! 1594: (@pxref{Standard Names}) and is usually a full-word integer mode. ! 1595: ! 1596: The mode of @var{pos} is machine-specific and is also specified ! 1597: in the @code{insv} or @code{extv} pattern. ! 1598: ! 1599: The mode @var{m} is the same as the mode that would be used for ! 1600: @var{loc} if it were a register. ! 1601: ! 1602: @findex zero_extract ! 1603: @item (zero_extract:@var{m} @var{loc} @var{size} @var{pos}) ! 1604: Like @code{sign_extract} but refers to an unsigned or zero-extended ! 1605: bit field. The same sequence of bits are extracted, but they ! 1606: are filled to an entire word with zeros instead of by sign-extension. ! 1607: @end table ! 1608: ! 1609: @node Conversions, RTL Declarations, Bit Fields, RTL ! 1610: @section Conversions ! 1611: @cindex conversions ! 1612: @cindex machine mode conversions ! 1613: ! 1614: All conversions between machine modes must be represented by ! 1615: explicit conversion operations. For example, an expression ! 1616: which is the sum of a byte and a full word cannot be written as ! 1617: @code{(plus:SI (reg:QI 34) (reg:SI 80))} because the @code{plus} ! 1618: operation requires two operands of the same machine mode. ! 1619: Therefore, the byte-sized operand is enclosed in a conversion ! 1620: operation, as in ! 1621: ! 1622: @example ! 1623: (plus:SI (sign_extend:SI (reg:QI 34)) (reg:SI 80)) ! 1624: @end example ! 1625: ! 1626: The conversion operation is not a mere placeholder, because there ! 1627: may be more than one way of converting from a given starting mode ! 1628: to the desired final mode. The conversion operation code says how ! 1629: to do it. ! 1630: ! 1631: For all conversion operations, @var{x} must not be @code{VOIDmode} ! 1632: because the mode in which to do the conversion would not be known. ! 1633: The conversion must either be done at compile-time or @var{x} ! 1634: must be placed into a register. ! 1635: ! 1636: @table @code ! 1637: @findex sign_extend ! 1638: @item (sign_extend:@var{m} @var{x}) ! 1639: Represents the result of sign-extending the value @var{x} ! 1640: to machine mode @var{m}. @var{m} must be a fixed-point mode ! 1641: and @var{x} a fixed-point value of a mode narrower than @var{m}. ! 1642: ! 1643: @findex zero_extend ! 1644: @item (zero_extend:@var{m} @var{x}) ! 1645: Represents the result of zero-extending the value @var{x} ! 1646: to machine mode @var{m}. @var{m} must be a fixed-point mode ! 1647: and @var{x} a fixed-point value of a mode narrower than @var{m}. ! 1648: ! 1649: @findex float_extend ! 1650: @item (float_extend:@var{m} @var{x}) ! 1651: Represents the result of extending the value @var{x} ! 1652: to machine mode @var{m}. @var{m} must be a floating point mode ! 1653: and @var{x} a floating point value of a mode narrower than @var{m}. ! 1654: ! 1655: @findex truncate ! 1656: @item (truncate:@var{m} @var{x}) ! 1657: Represents the result of truncating the value @var{x} ! 1658: to machine mode @var{m}. @var{m} must be a fixed-point mode ! 1659: and @var{x} a fixed-point value of a mode wider than @var{m}. ! 1660: ! 1661: @findex float_truncate ! 1662: @item (float_truncate:@var{m} @var{x}) ! 1663: Represents the result of truncating the value @var{x} ! 1664: to machine mode @var{m}. @var{m} must be a floating point mode ! 1665: and @var{x} a floating point value of a mode wider than @var{m}. ! 1666: ! 1667: @findex float ! 1668: @item (float:@var{m} @var{x}) ! 1669: Represents the result of converting fixed point value @var{x}, ! 1670: regarded as signed, to floating point mode @var{m}. ! 1671: ! 1672: @findex unsigned_float ! 1673: @item (unsigned_float:@var{m} @var{x}) ! 1674: Represents the result of converting fixed point value @var{x}, ! 1675: regarded as unsigned, to floating point mode @var{m}. ! 1676: ! 1677: @findex fix ! 1678: @item (fix:@var{m} @var{x}) ! 1679: When @var{m} is a fixed point mode, represents the result of ! 1680: converting floating point value @var{x} to mode @var{m}, regarded as ! 1681: signed. How rounding is done is not specified, so this operation may ! 1682: be used validly in compiling C code only for integer-valued operands. ! 1683: ! 1684: @findex unsigned_fix ! 1685: @item (unsigned_fix:@var{m} @var{x}) ! 1686: Represents the result of converting floating point value @var{x} to ! 1687: fixed point mode @var{m}, regarded as unsigned. How rounding is done ! 1688: is not specified. ! 1689: ! 1690: @findex fix ! 1691: @item (fix:@var{m} @var{x}) ! 1692: When @var{m} is a floating point mode, represents the result of ! 1693: converting floating point value @var{x} (valid for mode @var{m}) to an ! 1694: integer, still represented in floating point mode @var{m}, by rounding ! 1695: towards zero. ! 1696: @end table ! 1697: ! 1698: @node RTL Declarations, Side Effects, Conversions, RTL ! 1699: @section Declarations ! 1700: @cindex RTL declarations ! 1701: @cindex declarations, RTL ! 1702: ! 1703: Declaration expression codes do not represent arithmetic operations ! 1704: but rather state assertions about their operands. ! 1705: ! 1706: @table @code ! 1707: @findex strict_low_part ! 1708: @cindex @code{subreg}, in @code{strict_low_part} ! 1709: @item (strict_low_part (subreg:@var{m} (reg:@var{n} @var{r}) 0)) ! 1710: This expression code is used in only one context: as the destination operand of a ! 1711: @code{set} expression. In addition, the operand of this expression ! 1712: must be a non-paradoxical @code{subreg} expression. ! 1713: ! 1714: The presence of @code{strict_low_part} says that the part of the ! 1715: register which is meaningful in mode @var{n}, but is not part of ! 1716: mode @var{m}, is not to be altered. Normally, an assignment to such ! 1717: a subreg is allowed to have undefined effects on the rest of the ! 1718: register when @var{m} is less than a word. ! 1719: @end table ! 1720: ! 1721: @node Side Effects, Incdec, RTL Declarations, RTL ! 1722: @section Side Effect Expressions ! 1723: @cindex RTL side effect expressions ! 1724: ! 1725: The expression codes described so far represent values, not actions. ! 1726: But machine instructions never produce values; they are meaningful ! 1727: only for their side effects on the state of the machine. Special ! 1728: expression codes are used to represent side effects. ! 1729: ! 1730: The body of an instruction is always one of these side effect codes; ! 1731: the codes described above, which represent values, appear only as ! 1732: the operands of these. ! 1733: ! 1734: @table @code ! 1735: @findex set ! 1736: @item (set @var{lval} @var{x}) ! 1737: Represents the action of storing the value of @var{x} into the place ! 1738: represented by @var{lval}. @var{lval} must be an expression ! 1739: representing a place that can be stored in: @code{reg} (or ! 1740: @code{subreg} or @code{strict_low_part}), @code{mem}, @code{pc} or ! 1741: @code{cc0}.@refill ! 1742: ! 1743: If @var{lval} is a @code{reg}, @code{subreg} or @code{mem}, it has a ! 1744: machine mode; then @var{x} must be valid for that mode.@refill ! 1745: ! 1746: If @var{lval} is a @code{reg} whose machine mode is less than the full ! 1747: width of the register, then it means that the part of the register ! 1748: specified by the machine mode is given the specified value and the ! 1749: rest of the register receives an undefined value. Likewise, if ! 1750: @var{lval} is a @code{subreg} whose machine mode is narrower than ! 1751: the mode of the register, the rest of the register can be changed in ! 1752: an undefined way. ! 1753: ! 1754: If @var{lval} is a @code{strict_low_part} of a @code{subreg}, then the ! 1755: part of the register specified by the machine mode of the ! 1756: @code{subreg} is given the value @var{x} and the rest of the register ! 1757: is not changed.@refill ! 1758: ! 1759: If @var{lval} is @code{(cc0)}, it has no machine mode, and @var{x} may ! 1760: be either a @code{compare} expression or a value that may have any mode. ! 1761: The latter case represents a ``test'' instruction. The expression ! 1762: @code{(set (cc0) (reg:@var{m} @var{n}))} is equivalent to ! 1763: @code{(set (cc0) (compare (reg:@var{m} @var{n}) (const_int 0)))}. ! 1764: Use the former expression to save space during the compilation. ! 1765: ! 1766: @cindex jump instructions and @code{set} ! 1767: @cindex @code{if_then_else} usage ! 1768: If @var{lval} is @code{(pc)}, we have a jump instruction, and the ! 1769: possibilities for @var{x} are very limited. It may be a ! 1770: @code{label_ref} expression (unconditional jump). It may be an ! 1771: @code{if_then_else} (conditional jump), in which case either the ! 1772: second or the third operand must be @code{(pc)} (for the case which ! 1773: does not jump) and the other of the two must be a @code{label_ref} ! 1774: (for the case which does jump). @var{x} may also be a @code{mem} or ! 1775: @code{(plus:SI (pc) @var{y})}, where @var{y} may be a @code{reg} or a ! 1776: @code{mem}; these unusual patterns are used to represent jumps through ! 1777: branch tables.@refill ! 1778: ! 1779: If @var{lval} is neither @code{(cc0)} nor @code{(pc)}, the mode of ! 1780: @var{lval} must not be @code{VOIDmode} and the mode of @var{x} must be ! 1781: valid for the mode of @var{lval}. ! 1782: ! 1783: @findex SET_DEST ! 1784: @findex SET_SRC ! 1785: @var{lval} is customarily accessed with the @code{SET_DEST} macro and ! 1786: @var{x} with the @code{SET_SRC} macro. ! 1787: ! 1788: @findex return ! 1789: @item (return) ! 1790: As the sole expression in a pattern, represents a return from the ! 1791: current function, on machines where this can be done with one ! 1792: instruction, such as Vaxes. On machines where a multi-instruction ! 1793: ``epilogue'' must be executed in order to return from the function, ! 1794: returning is done by jumping to a label which precedes the epilogue, and ! 1795: the @code{return} expression code is never used. ! 1796: ! 1797: Inside an @code{if_then_else} expression, represents the value to be ! 1798: placed in @code{pc} to return to the caller. ! 1799: ! 1800: Note that an insn pattern of @code{(return)} is logically equivalent to ! 1801: @code{(set (pc) (return))}, but the latter form is never used. ! 1802: ! 1803: @findex call ! 1804: @item (call @var{function} @var{nargs}) ! 1805: Represents a function call. @var{function} is a @code{mem} expression ! 1806: whose address is the address of the function to be called. ! 1807: @var{nargs} is an expression which can be used for two purposes: on ! 1808: some machines it represents the number of bytes of stack argument; on ! 1809: others, it represents the number of argument registers. ! 1810: ! 1811: Each machine has a standard machine mode which @var{function} must ! 1812: have. The machine description defines macro @code{FUNCTION_MODE} to ! 1813: expand into the requisite mode name. The purpose of this mode is to ! 1814: specify what kind of addressing is allowed, on machines where the ! 1815: allowed kinds of addressing depend on the machine mode being ! 1816: addressed. ! 1817: ! 1818: @findex clobber ! 1819: @item (clobber @var{x}) ! 1820: Represents the storing or possible storing of an unpredictable, ! 1821: undescribed value into @var{x}, which must be a @code{reg}, ! 1822: @code{scratch} or @code{mem} expression. ! 1823: ! 1824: One place this is used is in string instructions that store standard ! 1825: values into particular hard registers. It may not be worth the ! 1826: trouble to describe the values that are stored, but it is essential to ! 1827: inform the compiler that the registers will be altered, lest it ! 1828: attempt to keep data in them across the string instruction. ! 1829: ! 1830: If @var{x} is @code{(mem:BLK (const_int 0))}, it means that all memory ! 1831: locations must be presumed clobbered. ! 1832: ! 1833: Note that the machine description classifies certain hard registers as ! 1834: ``call-clobbered''. All function call instructions are assumed by ! 1835: default to clobber these registers, so there is no need to use ! 1836: @code{clobber} expressions to indicate this fact. Also, each function ! 1837: call is assumed to have the potential to alter any memory location, ! 1838: unless the function is declared @code{const}. ! 1839: ! 1840: If the last group of expressions in a @code{parallel} are each a ! 1841: @code{clobber} expression whose arguments are @code{reg} or ! 1842: @code{match_scratch} (@pxref{RTL Template}) expressions, the combiner ! 1843: phase can add the appropriate @code{clobber} expressions to an insn it ! 1844: has constructed when doing so will cause a pattern to be matched. ! 1845: ! 1846: This feature can be used, for example, on a machine that whose multiply ! 1847: and add instructions don't use an MQ register but which has an ! 1848: add-accumulate instruction that does clobber the MQ register. Similarly, ! 1849: a combined instruction might require a temporary register while the ! 1850: constituent instructions might not. ! 1851: ! 1852: When a @code{clobber} expression for a register appears inside a ! 1853: @code{parallel} with other side effects, the register allocator ! 1854: guarantees that the register is unoccupied both before and after that ! 1855: insn. However, the reload phase may allocate a register used for one of ! 1856: the inputs unless the @samp{&} constraint is specified for the selected ! 1857: alternative (@pxref{Modifiers}). You can clobber either a specific hard ! 1858: register, a pseudo register, or a @code{scratch} expression; in the ! 1859: latter two cases, GNU CC will allocate a hard register that is available ! 1860: there for use as a temporary. ! 1861: ! 1862: For instructions that require a temporary register, you should use ! 1863: @code{scratch} instead of a pseudo-register because this will allow the ! 1864: combiner phase to add the @code{clobber} when required. You do this by ! 1865: coding (@code{clobber} (@code{match_scratch} @dots{})). If you do ! 1866: clobber a pseudo register, use one which appears nowhere else---generate ! 1867: a new one each time. Otherwise, you may confuse CSE. ! 1868: ! 1869: There is one other known use for clobbering a pseudo register in a ! 1870: @code{parallel}: when one of the input operands of the insn is also ! 1871: clobbered by the insn. In this case, using the same pseudo register in ! 1872: the clobber and elsewhere in the insn produces the expected results. ! 1873: ! 1874: @findex use ! 1875: @item (use @var{x}) ! 1876: Represents the use of the value of @var{x}. It indicates that the ! 1877: value in @var{x} at this point in the program is needed, even though ! 1878: it may not be apparent why this is so. Therefore, the compiler will ! 1879: not attempt to delete previous instructions whose only effect is to ! 1880: store a value in @var{x}. @var{x} must be a @code{reg} expression. ! 1881: ! 1882: During the delayed branch scheduling phase, @var{x} may be an insn. ! 1883: This indicates that @var{x} previously was located at this place in the ! 1884: code and its data dependencies need to be taken into account. These ! 1885: @code{use} insns will be deleted before the delayed branch scheduling ! 1886: phase exits. ! 1887: ! 1888: @findex parallel ! 1889: @item (parallel [@var{x0} @var{x1} @dots{}]) ! 1890: Represents several side effects performed in parallel. The square ! 1891: brackets stand for a vector; the operand of @code{parallel} is a ! 1892: vector of expressions. @var{x0}, @var{x1} and so on are individual ! 1893: side effect expressions---expressions of code @code{set}, @code{call}, ! 1894: @code{return}, @code{clobber} or @code{use}.@refill ! 1895: ! 1896: ``In parallel'' means that first all the values used in the individual ! 1897: side-effects are computed, and second all the actual side-effects are ! 1898: performed. For example, ! 1899: ! 1900: @example ! 1901: (parallel [(set (reg:SI 1) (mem:SI (reg:SI 1))) ! 1902: (set (mem:SI (reg:SI 1)) (reg:SI 1))]) ! 1903: @end example ! 1904: ! 1905: @noindent ! 1906: says unambiguously that the values of hard register 1 and the memory ! 1907: location addressed by it are interchanged. In both places where ! 1908: @code{(reg:SI 1)} appears as a memory address it refers to the value ! 1909: in register 1 @emph{before} the execution of the insn. ! 1910: ! 1911: It follows that it is @emph{incorrect} to use @code{parallel} and ! 1912: expect the result of one @code{set} to be available for the next one. ! 1913: For example, people sometimes attempt to represent a jump-if-zero ! 1914: instruction this way: ! 1915: ! 1916: @example ! 1917: (parallel [(set (cc0) (reg:SI 34)) ! 1918: (set (pc) (if_then_else ! 1919: (eq (cc0) (const_int 0)) ! 1920: (label_ref @dots{}) ! 1921: (pc)))]) ! 1922: @end example ! 1923: ! 1924: @noindent ! 1925: But this is incorrect, because it says that the jump condition depends ! 1926: on the condition code value @emph{before} this instruction, not on the ! 1927: new value that is set by this instruction. ! 1928: ! 1929: @cindex peephole optimization, RTL representation ! 1930: Peephole optimization, which takes place together with final assembly ! 1931: code output, can produce insns whose patterns consist of a @code{parallel} ! 1932: whose elements are the operands needed to output the resulting ! 1933: assembler code---often @code{reg}, @code{mem} or constant expressions. ! 1934: This would not be well-formed RTL at any other stage in compilation, ! 1935: but it is ok then because no further optimization remains to be done. ! 1936: However, the definition of the macro @code{NOTICE_UPDATE_CC}, if ! 1937: any, must deal with such insns if you define any peephole optimizations. ! 1938: ! 1939: @findex sequence ! 1940: @item (sequence [@var{insns} @dots{}]) ! 1941: Represents a sequence of insns. Each of the @var{insns} that appears ! 1942: in the vector is suitable for appearing in the chain of insns, so it ! 1943: must be an @code{insn}, @code{jump_insn}, @code{call_insn}, ! 1944: @code{code_label}, @code{barrier} or @code{note}. ! 1945: ! 1946: A @code{sequence} RTX is never placed in an actual insn during RTL ! 1947: generation. It represents the sequence of insns that result from a ! 1948: @code{define_expand} @emph{before} those insns are passed to ! 1949: @code{emit_insn} to insert them in the chain of insns. When actually ! 1950: inserted, the individual sub-insns are separated out and the ! 1951: @code{sequence} is forgotten. ! 1952: ! 1953: After delay-slot scheduling is completed, an insn and all the insns that ! 1954: reside in its delay slots are grouped together into a @code{sequence}. ! 1955: The insn requiring the delay slot is the first insn in the vector; ! 1956: subsequent insns are to be placed in the delay slot. ! 1957: ! 1958: @code{INSN_ANNULLED_BRANCH_P} is set on an insn in a delay slot to ! 1959: indicate that a branch insn should be used that will conditionally annul ! 1960: the effect of the insns in the delay slots. In such a case, ! 1961: @code{INSN_FROM_TARGET_P} indicates that the insn is from the target of ! 1962: the branch and should be executed only if the branch is taken; otherwise ! 1963: the insn should be executed only if the branch is not taken. ! 1964: @xref{Delay Slots}. ! 1965: @end table ! 1966: ! 1967: These expression codes appear in place of a side effect, as the body of ! 1968: an insn, though strictly speaking they do not always describe side ! 1969: effects as such: ! 1970: ! 1971: @table @code ! 1972: @findex asm_input ! 1973: @item (asm_input @var{s}) ! 1974: Represents literal assembler code as described by the string @var{s}. ! 1975: ! 1976: @findex unspec ! 1977: @findex unspec_volatile ! 1978: @item (unspec [@var{operands} @dots{}] @var{index}) ! 1979: @itemx (unspec_volatile [@var{operands} @dots{}] @var{index}) ! 1980: Represents a machine-specific operation on @var{operands}. @var{index} ! 1981: selects between multiple machine-specific operations. ! 1982: @code{unspec_volatile} is used for volatile operations and operations ! 1983: that may trap; @code{unspec} is used for other operations. ! 1984: ! 1985: These codes may appear inside a @code{pattern} of an ! 1986: insn, inside a @code{parallel}, or inside an expression. ! 1987: ! 1988: @findex addr_vec ! 1989: @item (addr_vec:@var{m} [@var{lr0} @var{lr1} @dots{}]) ! 1990: Represents a table of jump addresses. The vector elements @var{lr0}, ! 1991: etc., are @code{label_ref} expressions. The mode @var{m} specifies ! 1992: how much space is given to each address; normally @var{m} would be ! 1993: @code{Pmode}. ! 1994: ! 1995: @findex addr_diff_vec ! 1996: @item (addr_diff_vec:@var{m} @var{base} [@var{lr0} @var{lr1} @dots{}]) ! 1997: Represents a table of jump addresses expressed as offsets from ! 1998: @var{base}. The vector elements @var{lr0}, etc., are @code{label_ref} ! 1999: expressions and so is @var{base}. The mode @var{m} specifies how much ! 2000: space is given to each address-difference.@refill ! 2001: @end table ! 2002: ! 2003: @node Incdec, Assembler, Side Effects, RTL ! 2004: @section Embedded Side-Effects on Addresses ! 2005: @cindex RTL preincrement ! 2006: @cindex RTL postincrement ! 2007: @cindex RTL predecrement ! 2008: @cindex RTL postdecrement ! 2009: ! 2010: Four special side-effect expression codes appear as memory addresses. ! 2011: ! 2012: @table @code ! 2013: @findex pre_dec ! 2014: @item (pre_dec:@var{m} @var{x}) ! 2015: Represents the side effect of decrementing @var{x} by a standard ! 2016: amount and represents also the value that @var{x} has after being ! 2017: decremented. @var{x} must be a @code{reg} or @code{mem}, but most ! 2018: machines allow only a @code{reg}. @var{m} must be the machine mode ! 2019: for pointers on the machine in use. The amount @var{x} is decremented ! 2020: by is the length in bytes of the machine mode of the containing memory ! 2021: reference of which this expression serves as the address. Here is an ! 2022: example of its use:@refill ! 2023: ! 2024: @example ! 2025: (mem:DF (pre_dec:SI (reg:SI 39))) ! 2026: @end example ! 2027: ! 2028: @noindent ! 2029: This says to decrement pseudo register 39 by the length of a @code{DFmode} ! 2030: value and use the result to address a @code{DFmode} value. ! 2031: ! 2032: @findex pre_inc ! 2033: @item (pre_inc:@var{m} @var{x}) ! 2034: Similar, but specifies incrementing @var{x} instead of decrementing it. ! 2035: ! 2036: @findex post_dec ! 2037: @item (post_dec:@var{m} @var{x}) ! 2038: Represents the same side effect as @code{pre_dec} but a different ! 2039: value. The value represented here is the value @var{x} has @i{before} ! 2040: being decremented. ! 2041: ! 2042: @findex post_inc ! 2043: @item (post_inc:@var{m} @var{x}) ! 2044: Similar, but specifies incrementing @var{x} instead of decrementing it. ! 2045: @end table ! 2046: ! 2047: These embedded side effect expressions must be used with care. Instruction ! 2048: patterns may not use them. Until the @samp{flow} pass of the compiler, ! 2049: they may occur only to represent pushes onto the stack. The @samp{flow} ! 2050: pass finds cases where registers are incremented or decremented in one ! 2051: instruction and used as an address shortly before or after; these cases are ! 2052: then transformed to use pre- or post-increment or -decrement. ! 2053: ! 2054: If a register used as the operand of these expressions is used in ! 2055: another address in an insn, the original value of the register is used. ! 2056: Uses of the register outside of an address are not permitted within the ! 2057: same insn as a use in an embedded side effect expression because such ! 2058: insns behave differently on different machines and hence must be treated ! 2059: as ambiguous and disallowed. ! 2060: ! 2061: An instruction that can be represented with an embedded side effect ! 2062: could also be represented using @code{parallel} containing an additional ! 2063: @code{set} to describe how the address register is altered. This is not ! 2064: done because machines that allow these operations at all typically ! 2065: allow them wherever a memory address is called for. Describing them as ! 2066: additional parallel stores would require doubling the number of entries ! 2067: in the machine description. ! 2068: ! 2069: @node Assembler, Insns, Incdec, RTL ! 2070: @section Assembler Instructions as Expressions ! 2071: @cindex assembler instructions in RTL ! 2072: ! 2073: @cindex @code{asm_operands}, usage ! 2074: The RTX code @code{asm_operands} represents a value produced by a ! 2075: user-specified assembler instruction. It is used to represent ! 2076: an @code{asm} statement with arguments. An @code{asm} statement with ! 2077: a single output operand, like this: ! 2078: ! 2079: @smallexample ! 2080: asm ("foo %1,%2,%0" : "=a" (outputvar) : "g" (x + y), "di" (*z)); ! 2081: @end smallexample ! 2082: ! 2083: @noindent ! 2084: is represented using a single @code{asm_operands} RTX which represents ! 2085: the value that is stored in @code{outputvar}: ! 2086: ! 2087: @smallexample ! 2088: (set @var{rtx-for-outputvar} ! 2089: (asm_operands "foo %1,%2,%0" "a" 0 ! 2090: [@var{rtx-for-addition-result} @var{rtx-for-*z}] ! 2091: [(asm_input:@var{m1} "g") ! 2092: (asm_input:@var{m2} "di")])) ! 2093: @end smallexample ! 2094: ! 2095: @noindent ! 2096: Here the operands of the @code{asm_operands} RTX are the assembler ! 2097: template string, the output-operand's constraint, the index-number of the ! 2098: output operand among the output operands specified, a vector of input ! 2099: operand RTX's, and a vector of input-operand modes and constraints. The ! 2100: mode @var{m1} is the mode of the sum @code{x+y}; @var{m2} is that of ! 2101: @code{*z}. ! 2102: ! 2103: When an @code{asm} statement has multiple output values, its insn has ! 2104: several such @code{set} RTX's inside of a @code{parallel}. Each @code{set} ! 2105: contains a @code{asm_operands}; all of these share the same assembler ! 2106: template and vectors, but each contains the constraint for the respective ! 2107: output operand. They are also distinguished by the output-operand index ! 2108: number, which is 0, 1, @dots{} for successive output operands. ! 2109: ! 2110: @node Insns, Calls, Assembler, RTL ! 2111: @section Insns ! 2112: @cindex insns ! 2113: ! 2114: The RTL representation of the code for a function is a doubly-linked ! 2115: chain of objects called @dfn{insns}. Insns are expressions with ! 2116: special codes that are used for no other purpose. Some insns are ! 2117: actual instructions; others represent dispatch tables for @code{switch} ! 2118: statements; others represent labels to jump to or various sorts of ! 2119: declarative information. ! 2120: ! 2121: In addition to its own specific data, each insn must have a unique ! 2122: id-number that distinguishes it from all other insns in the current ! 2123: function (after delayed branch scheduling, copies of an insn with the ! 2124: same id-number may be present in multiple places in a function, but ! 2125: these copies will always be identical and will only appear inside a ! 2126: @code{sequence}), and chain pointers to the preceding and following ! 2127: insns. These three fields occupy the same position in every insn, ! 2128: independent of the expression code of the insn. They could be accessed ! 2129: with @code{XEXP} and @code{XINT}, but instead three special macros are ! 2130: always used: ! 2131: ! 2132: @table @code ! 2133: @findex INSN_UID ! 2134: @item INSN_UID (@var{i}) ! 2135: Accesses the unique id of insn @var{i}. ! 2136: ! 2137: @findex PREV_INSN ! 2138: @item PREV_INSN (@var{i}) ! 2139: Accesses the chain pointer to the insn preceding @var{i}. ! 2140: If @var{i} is the first insn, this is a null pointer. ! 2141: ! 2142: @findex NEXT_INSN ! 2143: @item NEXT_INSN (@var{i}) ! 2144: Accesses the chain pointer to the insn following @var{i}. ! 2145: If @var{i} is the last insn, this is a null pointer. ! 2146: @end table ! 2147: ! 2148: @findex get_insns ! 2149: @findex get_last_insn ! 2150: The first insn in the chain is obtained by calling @code{get_insns}; the ! 2151: last insn is the result of calling @code{get_last_insn}. Within the ! 2152: chain delimited by these insns, the @code{NEXT_INSN} and ! 2153: @code{PREV_INSN} pointers must always correspond: if @var{insn} is not ! 2154: the first insn, ! 2155: ! 2156: @example ! 2157: NEXT_INSN (PREV_INSN (@var{insn})) == @var{insn} ! 2158: @end example ! 2159: ! 2160: @noindent ! 2161: is always true and if @var{insn} is not the last insn, ! 2162: ! 2163: @example ! 2164: PREV_INSN (NEXT_INSN (@var{insn})) == @var{insn} ! 2165: @end example ! 2166: ! 2167: @noindent ! 2168: is always true. ! 2169: ! 2170: After delay slot scheduling, some of the insns in the chain might be ! 2171: @code{sequence} expressions, which contain a vector of insns. The value ! 2172: of @code{NEXT_INSN} in all but the last of these insns is the next insn ! 2173: in the vector; the value of @code{NEXT_INSN} of the last insn in the vector ! 2174: is the same as the value of @code{NEXT_INSN} for the @code{sequence} in ! 2175: which it is contained. Similar rules apply for @code{PREV_INSN}. ! 2176: ! 2177: This means that the above invariants are not necessarily true for insns ! 2178: inside @code{sequence} expressions. Specifically, if @var{insn} is the ! 2179: first insn in a @code{sequence}, @code{NEXT_INSN (PREV_INSN (@var{insn}))} ! 2180: is the insn containing the @code{sequence} expression, as is the value ! 2181: of @code{PREV_INSN (NEXT_INSN (@var{insn}))} is @var{insn} is the last ! 2182: insn in the @code{sequence} expression. You can use these expressions ! 2183: to find the containing @code{sequence} expression.@refill ! 2184: ! 2185: Every insn has one of the following six expression codes: ! 2186: ! 2187: @table @code ! 2188: @findex insn ! 2189: @item insn ! 2190: The expression code @code{insn} is used for instructions that do not jump ! 2191: and do not do function calls. @code{sequence} expressions are always ! 2192: contained in insns with code @code{insn} even if one of those insns ! 2193: should jump or do function calls. ! 2194: ! 2195: Insns with code @code{insn} have four additional fields beyond the three ! 2196: mandatory ones listed above. These four are described in a table below. ! 2197: ! 2198: @findex jump_insn ! 2199: @item jump_insn ! 2200: The expression code @code{jump_insn} is used for instructions that may ! 2201: jump (or, more generally, may contain @code{label_ref} expressions). If ! 2202: there is an instruction to return from the current function, it is ! 2203: recorded as a @code{jump_insn}. ! 2204: ! 2205: @findex JUMP_LABEL ! 2206: @code{jump_insn} insns have the same extra fields as @code{insn} insns, ! 2207: accessed in the same way and in addition contains a field ! 2208: @code{JUMP_LABEL} which is defined once jump optimization has completed. ! 2209: ! 2210: For simple conditional and unconditional jumps, this field contains the ! 2211: @code{code_label} to which this insn will (possibly conditionally) ! 2212: branch. In a more complex jump, @code{JUMP_LABEL} records one of the ! 2213: labels that the insn refers to; the only way to find the others ! 2214: is to scan the entire body of the insn. ! 2215: ! 2216: Return insns count as jumps, but since they do not refer to any labels, ! 2217: they have zero in the @code{JUMP_LABEL} field. ! 2218: ! 2219: @findex call_insn ! 2220: @item call_insn ! 2221: The expression code @code{call_insn} is used for instructions that may do ! 2222: function calls. It is important to distinguish these instructions because ! 2223: they imply that certain registers and memory locations may be altered ! 2224: unpredictably. ! 2225: ! 2226: A @code{call_insn} insn may be preceded by insns that contain a single ! 2227: @code{use} expression and be followed by insns the contain a single ! 2228: @code{clobber} expression. If so, these @code{use} and @code{clobber} ! 2229: expressions are treated as being part of the function call. ! 2230: There must not even be a @code{note} between the @code{call_insn} and ! 2231: the @code{use} or @code{clobber} insns for this special treatment to ! 2232: take place. This is somewhat of a kludge and will be removed in a later ! 2233: version of GNU CC. ! 2234: ! 2235: @code{call_insn} insns have the same extra fields as @code{insn} insns, ! 2236: accessed in the same way. ! 2237: ! 2238: @findex code_label ! 2239: @findex CODE_LABEL_NUMBER ! 2240: @item code_label ! 2241: A @code{code_label} insn represents a label that a jump insn can jump ! 2242: to. It contains two special fields of data in addition to the three ! 2243: standard ones. @code{CODE_LABEL_NUMBER} is used to hold the @dfn{label ! 2244: number}, a number that identifies this label uniquely among all the ! 2245: labels in the compilation (not just in the current function). ! 2246: Ultimately, the label is represented in the assembler output as an ! 2247: assembler label, usually of the form @samp{L@var{n}} where @var{n} is ! 2248: the label number. ! 2249: ! 2250: When a @code{code_label} appears in an RTL expression, it normally ! 2251: appears within a @code{label_ref} which represents the address of ! 2252: the label, as a number. ! 2253: ! 2254: @findex LABEL_NUSES ! 2255: The field @code{LABEL_NUSES} is only defined once the jump optimization ! 2256: phase is completed and contains the number of times this label is ! 2257: referenced in the current function. ! 2258: ! 2259: @findex barrier ! 2260: @item barrier ! 2261: Barriers are placed in the instruction stream when control cannot flow ! 2262: past them. They are placed after unconditional jump instructions to ! 2263: indicate that the jumps are unconditional and after calls to ! 2264: @code{volatile} functions, which do not return (e.g., @code{exit}). ! 2265: They contain no information beyond the three standard fields. ! 2266: ! 2267: @findex note ! 2268: @findex NOTE_LINE_NUMBER ! 2269: @findex NOTE_SOURCE_FILE ! 2270: @item note ! 2271: @code{note} insns are used to represent additional debugging and ! 2272: declarative information. They contain two nonstandard fields, an ! 2273: integer which is accessed with the macro @code{NOTE_LINE_NUMBER} and a ! 2274: string accessed with @code{NOTE_SOURCE_FILE}. ! 2275: ! 2276: If @code{NOTE_LINE_NUMBER} is positive, the note represents the ! 2277: position of a source line and @code{NOTE_SOURCE_FILE} is the source file name ! 2278: that the line came from. These notes control generation of line ! 2279: number data in the assembler output. ! 2280: ! 2281: Otherwise, @code{NOTE_LINE_NUMBER} is not really a line number but a ! 2282: code with one of the following values (and @code{NOTE_SOURCE_FILE} ! 2283: must contain a null pointer): ! 2284: ! 2285: @table @code ! 2286: @findex NOTE_INSN_DELETED ! 2287: @item NOTE_INSN_DELETED ! 2288: Such a note is completely ignorable. Some passes of the compiler ! 2289: delete insns by altering them into notes of this kind. ! 2290: ! 2291: @findex NOTE_INSN_BLOCK_BEG ! 2292: @findex NOTE_INSN_BLOCK_END ! 2293: @item NOTE_INSN_BLOCK_BEG ! 2294: @itemx NOTE_INSN_BLOCK_END ! 2295: These types of notes indicate the position of the beginning and end ! 2296: of a level of scoping of variable names. They control the output ! 2297: of debugging information. ! 2298: ! 2299: @findex NOTE_INSN_LOOP_BEG ! 2300: @findex NOTE_INSN_LOOP_END ! 2301: @item NOTE_INSN_LOOP_BEG ! 2302: @itemx NOTE_INSN_LOOP_END ! 2303: These types of notes indicate the position of the beginning and end ! 2304: of a @code{while} or @code{for} loop. They enable the loop optimizer ! 2305: to find loops quickly. ! 2306: ! 2307: @findex NOTE_INSN_LOOP_CONT ! 2308: @item NOTE_INSN_LOOP_CONT ! 2309: Appears at the place in a loop that @code{continue} statements jump to. ! 2310: ! 2311: @findex NOTE_INSN_LOOP_VTOP ! 2312: @item NOTE_INSN_LOOP_VTOP ! 2313: This note indicates the place in a loop where the exit test begins for ! 2314: those loops in which the exit test has been duplicated. This position ! 2315: becomes another virtual start of the loop when considering loop ! 2316: invariants. ! 2317: ! 2318: @findex NOTE_INSN_FUNCTION_END ! 2319: @item NOTE_INSN_FUNCTION_END ! 2320: Appears near the end of the function body, just before the label that ! 2321: @code{return} statements jump to (on machine where a single instruction ! 2322: does not suffice for returning). This note may be deleted by jump ! 2323: optimization. ! 2324: ! 2325: @findex NOTE_INSN_SETJMP ! 2326: @item NOTE_INSN_SETJMP ! 2327: Appears following each call to @code{setjmp} or a related function. ! 2328: @end table ! 2329: ! 2330: These codes are printed symbolically when they appear in debugging dumps. ! 2331: @end table ! 2332: ! 2333: @cindex @code{HImode}, in @code{insn} ! 2334: @cindex @code{QImode}, in @code{insn} ! 2335: The machine mode of an insn is normally @code{VOIDmode}, but some ! 2336: phases use the mode for various purposes; for example, the reload pass ! 2337: sets it to @code{HImode} if the insn needs reloading but not register ! 2338: elimination and @code{QImode} if both are required. The common ! 2339: subexpression elimination pass sets the mode of an insn to @code{QImode} ! 2340: when it is the first insn in a block that has already been processed. ! 2341: ! 2342: Here is a table of the extra fields of @code{insn}, @code{jump_insn} ! 2343: and @code{call_insn} insns: ! 2344: ! 2345: @table @code ! 2346: @findex PATTERN ! 2347: @item PATTERN (@var{i}) ! 2348: An expression for the side effect performed by this insn. This must be ! 2349: one of the following codes: @code{set}, @code{call}, @code{use}, ! 2350: @code{clobber}, @code{return}, @code{asm_input}, @code{asm_output}, ! 2351: @code{addr_vec}, @code{addr_diff_vec}, @code{trap_if}, @code{unspec}, ! 2352: @code{unspec_volatile}, @code{parallel}, or @code{sequence}. If it is a @code{parallel}, ! 2353: each element of the @code{parallel} must be one these codes, except that ! 2354: @code{parallel} expressions cannot be nested and @code{addr_vec} and ! 2355: @code{addr_diff_vec} are not permitted inside a @code{parallel} expression. ! 2356: ! 2357: @findex INSN_CODE ! 2358: @item INSN_CODE (@var{i}) ! 2359: An integer that says which pattern in the machine description matches ! 2360: this insn, or -1 if the matching has not yet been attempted. ! 2361: ! 2362: Such matching is never attempted and this field remains -1 on an insn ! 2363: whose pattern consists of a single @code{use}, @code{clobber}, ! 2364: @code{asm_input}, @code{addr_vec} or @code{addr_diff_vec} expression. ! 2365: ! 2366: @findex asm_noperands ! 2367: Matching is also never attempted on insns that result from an @code{asm} ! 2368: statement. These contain at least one @code{asm_operands} expression. ! 2369: The function @code{asm_noperands} returns a non-negative value for ! 2370: such insns. ! 2371: ! 2372: In the debugging output, this field is printed as a number followed by ! 2373: a symbolic representation that locates the pattern in the @file{md} ! 2374: file as some small positive or negative offset from a named pattern. ! 2375: ! 2376: @findex LOG_LINKS ! 2377: @item LOG_LINKS (@var{i}) ! 2378: A list (chain of @code{insn_list} expressions) giving information about ! 2379: dependencies between instructions within a basic block. Neither a jump ! 2380: nor a label may come between the related insns. ! 2381: ! 2382: @findex REG_NOTES ! 2383: @item REG_NOTES (@var{i}) ! 2384: A list (chain of @code{expr_list} and @code{insn_list} expressions) ! 2385: giving miscellaneous information about the insn. It is often information ! 2386: pertaining to the registers used in this insn. ! 2387: @end table ! 2388: ! 2389: The @code{LOG_LINKS} field of an insn is a chain of @code{insn_list} ! 2390: expressions. Each of these has two operands: the first is an insn, ! 2391: and the second is another @code{insn_list} expression (the next one in ! 2392: the chain). The last @code{insn_list} in the chain has a null pointer ! 2393: as second operand. The significant thing about the chain is which ! 2394: insns appear in it (as first operands of @code{insn_list} ! 2395: expressions). Their order is not significant. ! 2396: ! 2397: This list is originally set up by the flow analysis pass; it is a null ! 2398: pointer until then. Flow only adds links for those data dependencies ! 2399: which can be used for instruction combination. For each insn, the flow ! 2400: analysis pass adds a link to insns which store into registers values ! 2401: that are used for the first time in this insn. The instruction ! 2402: scheduling pass adds extra links so that every dependence will be ! 2403: represented. Links represent data dependencies, antidependencies and ! 2404: output dependencies; the machine mode of the link distinguishes these ! 2405: three types: antidependencies have mode @code{REG_DEP_ANTI}, output ! 2406: dependencies have mode @code{REG_DEP_OUTPUT}, and data dependencies have ! 2407: mode @code{VOIDmode}. ! 2408: ! 2409: The @code{REG_NOTES} field of an insn is a chain similar to the ! 2410: @code{LOG_LINKS} field but it includes @code{expr_list} expressions in ! 2411: addition to @code{insn_list} expressions. There are several kinds ! 2412: of register notes, which are distinguished by the machine mode, which ! 2413: in a register note is really understood as being an @code{enum reg_note}. ! 2414: The first operand @var{op} of the note is data whose meaning depends on ! 2415: the kind of note. ! 2416: ! 2417: @findex REG_NOTE_KIND ! 2418: @findex PUT_REG_NOTE_KIND ! 2419: The macro @code{REG_NOTE_KIND (@var{x})} returns the kind of ! 2420: register note. Its counterpart, the macro @code{PUT_REG_NOTE_KIND ! 2421: (@var{x}, @var{newkind})} sets the register note type of @var{x} to be ! 2422: @var{newkind}. ! 2423: ! 2424: Register notes are of three classes: They may say something about an ! 2425: input to an insn, they may say something about an output of an insn, or ! 2426: they may create a linkage between two insns. There are also a set ! 2427: of values that are only used in @code{LOG_LINKS}. ! 2428: ! 2429: These register notes annotate inputs to an insn: ! 2430: ! 2431: @table @code ! 2432: @findex REG_DEAD ! 2433: @item REG_DEAD ! 2434: The value in @var{op} dies in this insn; that is to say, altering the ! 2435: value immediately after this insn would not affect the future behavior ! 2436: of the program. ! 2437: ! 2438: This does not necessarily mean that the register @var{op} has no useful ! 2439: value after this insn since it may also be an output of the insn. In ! 2440: such a case, however, a @code{REG_DEAD} note would be redundant and is ! 2441: usually not present until after the reload pass, but no code relies on ! 2442: this fact. ! 2443: ! 2444: @findex REG_INC ! 2445: @item REG_INC ! 2446: The register @var{op} is incremented (or decremented; at this level ! 2447: there is no distinction) by an embedded side effect inside this insn. ! 2448: This means it appears in a @code{post_inc}, @code{pre_inc}, ! 2449: @code{post_dec} or @code{pre_dec} expression. ! 2450: ! 2451: @findex REG_NONNEG ! 2452: @item REG_NONNEG ! 2453: The register @var{op} is known to have a nonnegative value when this ! 2454: insn is reached. This is used so that decrement and branch until zero ! 2455: instructions, such as the m68k dbra, can be matched. ! 2456: ! 2457: The @code{REG_NONNEG} note is added to insns only if the machine ! 2458: description has a @samp{decrement_and_branch_until_zero} pattern. ! 2459: ! 2460: @findex REG_NO_CONFLICT ! 2461: @item REG_NO_CONFLICT ! 2462: This insn does not cause a conflict between @var{op} and the item ! 2463: being set by this insn even though it might appear that it does. ! 2464: In other words, if the destination register and @var{op} could ! 2465: otherwise be assigned the same register, this insn does not ! 2466: prevent that assignment. ! 2467: ! 2468: Insns with this note are usually part of a block that begins with a ! 2469: @code{clobber} insn specifying a multi-word pseudo register (which will ! 2470: be the output of the block), a group of insns that each set one word of ! 2471: the value and have the @code{REG_NO_CONFLICT} note attached, and a final ! 2472: insn that copies the output to itself with an attached @code{REG_EQUAL} ! 2473: note giving the expression being computed. This block is encapsulated ! 2474: with @code{REG_LIBCALL} and @code{REG_RETVAL} notes on the first and ! 2475: last insns, respectively. ! 2476: ! 2477: @findex REG_LABEL ! 2478: @item REG_LABEL ! 2479: This insn uses @var{op}, a @code{code_label}, but is not a ! 2480: @code{jump_insn}. The presence of this note allows jump optimization to ! 2481: be aware that @var{op} is, in fact, being used. ! 2482: @end table ! 2483: ! 2484: The following notes describe attributes of outputs of an insn: ! 2485: ! 2486: @table @code ! 2487: @findex REG_EQUIV ! 2488: @findex REG_EQUAL ! 2489: @item REG_EQUIV ! 2490: @itemx REG_EQUAL ! 2491: This note is only valid on an insn that sets only one register and ! 2492: indicates that that register will be equal to @var{op} at run time; the ! 2493: scope of this equivalence differs between the two types of notes. The ! 2494: value which the insn explicitly copies into the register may look ! 2495: different from @var{op}, but they will be equal at run time. If the ! 2496: output of the single @code{set} is a @code{strict_low_part} expression, ! 2497: the note refers to the register that is contained in @code{SUBREG_REG} ! 2498: of the @code{subreg} expression. ! 2499: ! 2500: For @code{REG_EQUIV}, the register is equivalent to @var{op} throughout ! 2501: the entire function, and could validly be replaced in all its ! 2502: occurrences by @var{op}. (``Validly'' here refers to the data flow of ! 2503: the program; simple replacement may make some insns invalid.) For ! 2504: example, when a constant is loaded into a register that is never ! 2505: assigned any other value, this kind of note is used. ! 2506: ! 2507: When a parameter is copied into a pseudo-register at entry to a function, ! 2508: a note of this kind records that the register is equivalent to the stack ! 2509: slot where the parameter was passed. Although in this case the register ! 2510: may be set by other insns, it is still valid to replace the register ! 2511: by the stack slot throughout the function. ! 2512: ! 2513: In the case of @code{REG_EQUAL}, the register that is set by this insn ! 2514: will be equal to @var{op} at run time at the end of this insn but not ! 2515: necessarily elsewhere in the function. In this case, @var{op} ! 2516: is typically an arithmetic expression. For example, when a sequence of ! 2517: insns such as a library call is used to perform an arithmetic operation, ! 2518: this kind of note is attached to the insn that produces or copies the ! 2519: final value. ! 2520: ! 2521: These two notes are used in different ways by the compiler passes. ! 2522: @code{REG_EQUAL} is used by passes prior to register allocation (such as ! 2523: common subexpression elimination and loop optimization) to tell them how ! 2524: to think of that value. @code{REG_EQUIV} notes are used by register ! 2525: allocation to indicate that there is an available substitute expression ! 2526: (either a constant or a @code{mem} expression for the location of a ! 2527: parameter on the stack) that may be used in place of a register if ! 2528: insufficient registers are available. ! 2529: ! 2530: Except for stack homes for parameters, which are indicated by a ! 2531: @code{REG_EQUIV} note and are not useful to the early optimization ! 2532: passes and pseudo registers that are equivalent to a memory location ! 2533: throughout there entire life, which is not detected until later in ! 2534: the compilation, all equivalences are initially indicated by an attached ! 2535: @code{REG_EQUAL} note. In the early stages of register allocation, a ! 2536: @code{REG_EQUAL} note is changed into a @code{REG_EQUIV} note if ! 2537: @var{op} is a constant and the insn represents the only set of its ! 2538: destination register. ! 2539: ! 2540: Thus, compiler passes prior to register allocation need only check for ! 2541: @code{REG_EQUAL} notes and passes subsequent to register allocation ! 2542: need only check for @code{REG_EQUIV} notes. ! 2543: ! 2544: @findex REG_UNUSED ! 2545: @item REG_UNUSED ! 2546: The register @var{op} being set by this insn will not be used in a ! 2547: subsequent insn. This differs from a @code{REG_DEAD} note, which ! 2548: indicates that the value in an input will not be used subsequently. ! 2549: These two notes are independent; both may be present for the same ! 2550: register. ! 2551: ! 2552: @findex REG_WAS_0 ! 2553: @item REG_WAS_0 ! 2554: The single output of this insn contained zero before this insn. ! 2555: @var{op} is the insn that set it to zero. You can rely on this note if ! 2556: it is present and @var{op} has not been deleted or turned into a @code{note}; ! 2557: its absence implies nothing. ! 2558: @end table ! 2559: ! 2560: These notes describe linkages between insns. They occur in pairs: one ! 2561: insn has one of a pair of notes that points to a second insn, which has ! 2562: the inverse note pointing back to the first insn. ! 2563: ! 2564: @table @code ! 2565: @findex REG_RETVAL ! 2566: @item REG_RETVAL ! 2567: This insn copies the value of a multi-insn sequence (for example, a ! 2568: library call), and @var{op} is the first insn of the sequence (for a ! 2569: library call, the first insn that was generated to set up the arguments ! 2570: for the library call). ! 2571: ! 2572: Loop optimization uses this note to treat such a sequence as a single ! 2573: operation for code motion purposes and flow analysis uses this note to ! 2574: delete such sequences whose results are dead. ! 2575: ! 2576: A @code{REG_EQUAL} note will also usually be attached to this insn to ! 2577: provide the expression being computed by the sequence. ! 2578: ! 2579: @findex REG_LIBCALL ! 2580: @item REG_LIBCALL ! 2581: This is the inverse of @code{REG_RETVAL}: it is placed on the first ! 2582: insn of a multi-insn sequence, and it points to the last one. ! 2583: ! 2584: @findex REG_CC_SETTER ! 2585: @findex REG_CC_USER ! 2586: @item REG_CC_SETTER ! 2587: @itemx REG_CC_USER ! 2588: On machines that use @code{cc0}, the insns which set and use @code{cc0} ! 2589: set and use @code{cc0} are adjacent. However, when branch delay slot ! 2590: filling is done, this may no longer be true. In this case a ! 2591: @code{REG_CC_USER} note will be placed on the insn setting @code{cc0} to ! 2592: point to the insn using @code{cc0} and a @code{REG_CC_SETTER} note will ! 2593: be placed on the insn using @code{cc0} to point to the insn setting ! 2594: @code{cc0}.@refill ! 2595: @end table ! 2596: ! 2597: These values are only used in the @code{LOG_LINKS} field, and indicate ! 2598: the type of dependency that each link represents. Links which indicate ! 2599: a data dependence (a read after write dependence) do not use any code, ! 2600: they simply have mode @code{VOIDmode}, and are printed without any ! 2601: descriptive text. ! 2602: ! 2603: @table @code ! 2604: @findex REG_DEP_ANTI ! 2605: @item REG_DEP_ANTI ! 2606: This indicates an anti dependence (a write after read dependence). ! 2607: ! 2608: @findex REG_DEP_OUTPUT ! 2609: @item REG_DEP_OUTPUT ! 2610: This indicates an output dependence (a write after write dependence). ! 2611: @end table ! 2612: ! 2613: For convenience, the machine mode in an @code{insn_list} or ! 2614: @code{expr_list} is printed using these symbolic codes in debugging dumps. ! 2615: ! 2616: @findex insn_list ! 2617: @findex expr_list ! 2618: The only difference between the expression codes @code{insn_list} and ! 2619: @code{expr_list} is that the first operand of an @code{insn_list} is ! 2620: assumed to be an insn and is printed in debugging dumps as the insn's ! 2621: unique id; the first operand of an @code{expr_list} is printed in the ! 2622: ordinary way as an expression. ! 2623: ! 2624: @node Calls, Sharing, Insns, RTL ! 2625: @section RTL Representation of Function-Call Insns ! 2626: @cindex calling functions in RTL ! 2627: @cindex RTL function-call insns ! 2628: @cindex function-call insns ! 2629: ! 2630: Insns that call subroutines have the RTL expression code @code{call_insn}. ! 2631: These insns must satisfy special rules, and their bodies must use a special ! 2632: RTL expression code, @code{call}. ! 2633: ! 2634: @cindex @code{call} usage ! 2635: A @code{call} expression has two operands, as follows: ! 2636: ! 2637: @example ! 2638: (call (mem:@var{fm} @var{addr}) @var{nbytes}) ! 2639: @end example ! 2640: ! 2641: @noindent ! 2642: Here @var{nbytes} is an operand that represents the number of bytes of ! 2643: argument data being passed to the subroutine, @var{fm} is a machine mode ! 2644: (which must equal as the definition of the @code{FUNCTION_MODE} macro in ! 2645: the machine description) and @var{addr} represents the address of the ! 2646: subroutine. ! 2647: ! 2648: For a subroutine that returns no value, the @code{call} expression as ! 2649: shown above is the entire body of the insn, except that the insn might ! 2650: also contain @code{use} or @code{clobber} expressions. ! 2651: ! 2652: @cindex @code{BLKmode}, and function return values ! 2653: For a subroutine that returns a value whose mode is not @code{BLKmode}, ! 2654: the value is returned in a hard register. If this register's number is ! 2655: @var{r}, then the body of the call insn looks like this: ! 2656: ! 2657: @example ! 2658: (set (reg:@var{m} @var{r}) ! 2659: (call (mem:@var{fm} @var{addr}) @var{nbytes})) ! 2660: @end example ! 2661: ! 2662: @noindent ! 2663: This RTL expression makes it clear (to the optimizer passes) that the ! 2664: appropriate register receives a useful value in this insn. ! 2665: ! 2666: When a subroutine returns a @code{BLKmode} value, it is handled by ! 2667: passing to the subroutine the address of a place to store the value. ! 2668: So the call insn itself does not ``return'' any value, and it has the ! 2669: same RTL form as a call that returns nothing. ! 2670: ! 2671: On some machines, the call instruction itself clobbers some register, ! 2672: for example to contain the return address. @code{call_insn} insns ! 2673: on these machines should have a body which is a @code{parallel} ! 2674: that contains both the @code{call} expression and @code{clobber} ! 2675: expressions that indicate which registers are destroyed. Similarly, ! 2676: if the call instruction requires some register other than the stack ! 2677: pointer that is not explicitly mentioned it its RTL, a @code{use} ! 2678: subexpression should mention that register. ! 2679: ! 2680: Functions that are called are assumed to modify all registers listed in ! 2681: the configuration macro @code{CALL_USED_REGISTERS} (@pxref{Register ! 2682: Basics}) and, with the exception of @code{const} functions and library ! 2683: calls, to modify all of memory. ! 2684: ! 2685: Insns containing just @code{use} expressions directly precede the ! 2686: @code{call_insn} insn to indicate which registers contain inputs to the ! 2687: function. Similarly, if registers other than those in ! 2688: @code{CALL_USED_REGISTERS} are clobbered by the called function, insns ! 2689: containing a single @code{clobber} follow immediately after the call to ! 2690: indicate which registers. ! 2691: ! 2692: @node Sharing ! 2693: @section Structure Sharing Assumptions ! 2694: @cindex sharing of RTL components ! 2695: @cindex RTL structure sharing assumptions ! 2696: ! 2697: The compiler assumes that certain kinds of RTL expressions are unique; ! 2698: there do not exist two distinct objects representing the same value. ! 2699: In other cases, it makes an opposite assumption: that no RTL expression ! 2700: object of a certain kind appears in more than one place in the ! 2701: containing structure. ! 2702: ! 2703: These assumptions refer to a single function; except for the RTL ! 2704: objects that describe global variables and external functions, ! 2705: and a few standard objects such as small integer constants, ! 2706: no RTL objects are common to two functions. ! 2707: ! 2708: @itemize @bullet ! 2709: @cindex @code{reg}, RTL sharing ! 2710: @item ! 2711: Each pseudo-register has only a single @code{reg} object to represent it, ! 2712: and therefore only a single machine mode. ! 2713: ! 2714: @cindex symbolic label ! 2715: @cindex @code{symbol_ref}, RTL sharing ! 2716: @item ! 2717: For any symbolic label, there is only one @code{symbol_ref} object ! 2718: referring to it. ! 2719: ! 2720: @cindex @code{const_int}, RTL sharing ! 2721: @item ! 2722: There is only one @code{const_int} expression with value 0, only ! 2723: one with value 1, and only one with value @minus{}1. ! 2724: Some other integer values are also stored uniquely. ! 2725: ! 2726: @cindex @code{pc}, RTL sharing ! 2727: @item ! 2728: There is only one @code{pc} expression. ! 2729: ! 2730: @cindex @code{cc0}, RTL sharing ! 2731: @item ! 2732: There is only one @code{cc0} expression. ! 2733: ! 2734: @cindex @code{const_double}, RTL sharing ! 2735: @item ! 2736: There is only one @code{const_double} expression with value 0 for ! 2737: each floating point mode. Likewise for values 1 and 2. ! 2738: ! 2739: @cindex @code{label_ref}, RTL sharing ! 2740: @cindex @code{scratch}, RTL sharing ! 2741: @item ! 2742: No @code{label_ref} or @code{scratch} appears in more than one place in ! 2743: the RTL structure; in other words, it is safe to do a tree-walk of all ! 2744: the insns in the function and assume that each time a @code{label_ref} ! 2745: or @code{scratch} is seen it is distinct from all others that are seen. ! 2746: ! 2747: @cindex @code{mem}, RTL sharing ! 2748: @item ! 2749: Only one @code{mem} object is normally created for each static ! 2750: variable or stack slot, so these objects are frequently shared in all ! 2751: the places they appear. However, separate but equal objects for these ! 2752: variables are occasionally made. ! 2753: ! 2754: @cindex @code{asm_operands}, RTL sharing ! 2755: @item ! 2756: When a single @code{asm} statement has multiple output operands, a ! 2757: distinct @code{asm_operands} expression is made for each output operand. ! 2758: However, these all share the vector which contains the sequence of input ! 2759: operands. This sharing is used later on to test whether two ! 2760: @code{asm_operands} expressions come from the same statement, so all ! 2761: optimizations must carefully preserve the sharing if they copy the ! 2762: vector at all. ! 2763: ! 2764: @item ! 2765: No RTL object appears in more than one place in the RTL structure ! 2766: except as described above. Many passes of the compiler rely on this ! 2767: by assuming that they can modify RTL objects in place without unwanted ! 2768: side-effects on other insns. ! 2769: ! 2770: @findex unshare_all_rtl ! 2771: @item ! 2772: During initial RTL generation, shared structure is freely introduced. ! 2773: After all the RTL for a function has been generated, all shared ! 2774: structure is copied by @code{unshare_all_rtl} in @file{emit-rtl.c}, ! 2775: after which the above rules are guaranteed to be followed. ! 2776: ! 2777: @findex copy_rtx_if_shared ! 2778: @item ! 2779: During the combiner pass, shared structure within an insn can exist ! 2780: temporarily. However, the shared structure is copied before the ! 2781: combiner is finished with the insn. This is done by calling ! 2782: @code{copy_rtx_if_shared}, which is a subroutine of ! 2783: @code{unshare_all_rtl}. ! 2784: @end itemize ! 2785: ! 2786: @node Reading RTL ! 2787: @section Reading RTL ! 2788: ! 2789: To read an RTL object from a file, call @code{read_rtx}. It takes one ! 2790: argument, a stdio stream, and returns a single RTL object. ! 2791: ! 2792: Reading RTL from a file is very slow. This is no currently not a ! 2793: problem because reading RTL occurs only as part of building the ! 2794: compiler. ! 2795: ! 2796: People frequently have the idea of using RTL stored as text in a file as ! 2797: an interface between a language front end and the bulk of GNU CC. This ! 2798: idea is not feasible. ! 2799: ! 2800: GNU CC was designed to use RTL internally only. Correct RTL for a given ! 2801: program is very dependent on the particular target machine. And the RTL ! 2802: does not contain all the information about the program. ! 2803: ! 2804: The proper way to interface GNU CC to a new language front end is with ! 2805: the ``tree'' data structure. There is no manual for this data ! 2806: structure, but it is described in the files @file{tree.h} and ! 2807: @file{tree.def}.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.