|
|
1.1 ! root 1: Info file internals, produced by Makeinfo, -*- Text -*- ! 2: from input file internals.texinfo. ! 3: ! 4: ! 5: ! 6: This file documents the internals of the GNU compiler. ! 7: ! 8: Copyright (C) 1988 Free Software Foundation, Inc. ! 9: ! 10: Permission is granted to make and distribute verbatim copies of ! 11: this manual provided the copyright notice and this permission notice ! 12: are preserved on all copies. ! 13: ! 14: Permission is granted to copy and distribute modified versions of this ! 15: manual under the conditions for verbatim copying, provided also that the ! 16: section entitled ``GNU CC General Public License'' is included exactly as ! 17: in the original, and provided that the entire resulting derived work is ! 18: distributed under the terms of a permission notice identical to this one. ! 19: ! 20: Permission is granted to copy and distribute translations of this manual ! 21: into another language, under the above conditions for modified versions, ! 22: except that the section entitled ``GNU CC General Public License'' and ! 23: this permission notice may be included in translations approved by the ! 24: Free Software Foundation instead of in the original English. ! 25: ! 26: ! 27: ! 28: ! 29: ! 30: ! 31: File: internals, Node: Sharing, Prev: Calls, Up: RTL ! 32: ! 33: Structure Sharing Assumptions ! 34: ============================= ! 35: ! 36: The compiler assumes that certain kinds of RTL expressions are unique; ! 37: there do not exist two distinct objects representing the same value. In ! 38: other cases, it makes an opposite assumption: that no RTL expression object ! 39: of a certain kind appears in more than one place in the containing structure. ! 40: ! 41: These assumptions refer to a single function; except for the RTL objects ! 42: that describe global variables and external functions, no RTL objects are ! 43: common to two functions. ! 44: ! 45: * Each pseudo-register has only a single `reg' object to represent it, ! 46: and therefore only a single machine mode. ! 47: ! 48: * For any symbolic label, there is only one `symbol_ref' object ! 49: referring to it. ! 50: ! 51: * There is only one `const_int' expression with value zero, and only one ! 52: with value one. ! 53: ! 54: * There is only one `pc' expression. ! 55: ! 56: * There is only one `cc0' expression. ! 57: ! 58: * There is only one `const_double' expression with mode `SFmode' and ! 59: value zero, and only one with mode `DFmode' and value zero. ! 60: ! 61: * No `label_ref' appears in more than one place in the RTL structure; in ! 62: other words, it is safe to do a tree-walk of all the insns in the ! 63: function and assume that each time a `label_ref' is seen it is ! 64: distinct from all others that are seen. ! 65: ! 66: * Only one `mem' object is normally created for each static variable or ! 67: stack slot, so these objects are frequently shared in all the places ! 68: they appear. However, separate but equal objects for these variables ! 69: are occasionally made. ! 70: ! 71: * No RTL object appears in more than one place in the RTL structure ! 72: except as described above. Many passes of the compiler rely on this ! 73: by assuming that they can modify RTL objects in place without unwanted ! 74: side-effects on other insns. ! 75: ! 76: * During initial RTL generation, shared structure is freely introduced. ! 77: After all the RTL for a function has been generated, all shared ! 78: structure is copied by `unshare_all_rtl' in `emit-rtl.c', after which ! 79: the above rules are guaranteed to be followed. ! 80: ! 81: * During the combiner pass, shared structure with an insn can exist ! 82: temporarily. However, the shared structure is copied before the ! 83: combiner is finished with the insn. This is done by ! 84: `copy_substitutions' in `combine.c'. ! 85: ! 86: ! 87: File: internals, Node: Machine Desc, Next: Machine Macros, Prev: RTL, Up: Top ! 88: ! 89: Machine Descriptions ! 90: ******************** ! 91: ! 92: A machine description has two parts: a file of instruction patterns (`.md' ! 93: file) and a C header file of macro definitions. ! 94: ! 95: The `.md' file for a target machine contains a pattern for each instruction ! 96: that the target machine supports (or at least each instruction that is ! 97: worth telling the compiler about). It may also contain comments. A ! 98: semicolon causes the rest of the line to be a comment, unless the semicolon ! 99: is inside a quoted string. ! 100: ! 101: See the next chapter for information on the C header file. ! 102: ! 103: ! 104: * Menu: ! 105: ! 106: * Patterns:: How to write instruction patterns. ! 107: * Example:: An explained example of a `define_insn' pattern. ! 108: * RTL Template:: The RTL template defines what insns match a pattern. ! 109: * Output Template:: The output template says how to make assembler code ! 110: from such an insn. ! 111: * Output Statement:: For more generality, write C code to output ! 112: the assembler code. ! 113: * Constraints:: When not all operands are general operands. ! 114: * Standard Names:: Names mark patterns to use for code generation. ! 115: * Pattern Ordering:: When the order of patterns makes a difference. ! 116: * Dependent Patterns:: Having one pattern may make you need another. ! 117: * Jump Patterns:: Special considerations for patterns for jump insns. ! 118: * Peephole Definitions::Defining machine-specific peephole optimizations. ! 119: * Expander Definitions::Generating a sequence of several RTL insns ! 120: for a standard operation. ! 121: ! 122: ! 123: ! 124: File: internals, Node: Patterns, Next: Example, Prev: Machine Desc, Up: Machine Desc ! 125: ! 126: Everything about Instruction Patterns ! 127: ===================================== ! 128: ! 129: Each instruction pattern contains an incomplete RTL expression, with pieces ! 130: to be filled in later, operand constraints that restrict how the pieces can ! 131: be filled in, and an output pattern or C code to generate the assembler ! 132: output, all wrapped up in a `define_insn' expression. ! 133: ! 134: A `define_insn' is an RTL expression containing four operands: ! 135: ! 136: 1. An optional name. The presence of a name indicate that this instruction ! 137: pattern can perform a certain standard job for the RTL-generation pass ! 138: of the compiler. This pass knows certain names and will use the ! 139: instruction patterns with those names, if the names are defined in the ! 140: machine description. ! 141: ! 142: The absence of a name is indicated by writing an empty string where ! 143: the name should go. Nameless instruction patterns are never used for ! 144: generating RTL code, but they may permit several simpler insns to be ! 145: combined later on. ! 146: ! 147: Names that are not thus known and used in RTL-generation have no ! 148: effect; they are equivalent to no name at all. ! 149: ! 150: 2. The "RTL template" (*Note RTL Template::.) is a vector of incomplete RTL ! 151: expressions which show what the instruction should look like. It is ! 152: incomplete because it may contain `match_operand' and `match_dup' ! 153: expressions that stand for operands of the instruction. ! 154: ! 155: If the vector has only one element, that element is what the ! 156: instruction should look like. If the vector has multiple elements, ! 157: then the instruction looks like a `parallel' expression containing ! 158: that many elements as described. ! 159: ! 160: 3. A condition. This is a string which contains a C expression that is the ! 161: final test to decide whether an insn body matches this pattern. ! 162: ! 163: For a named pattern, the condition (if present) may not depend on the ! 164: data in the insn being matched, but only the target-machine-type ! 165: flags. The compiler needs to test these conditions during ! 166: initialization in order to learn exactly which named instructions are ! 167: available in a particular run. ! 168: ! 169: For nameless patterns, the condition is applied only when matching an ! 170: individual insn, and only after the insn has matched the pattern's ! 171: recognition template. The insn's operands may be found in the vector ! 172: `operands'. ! 173: ! 174: 4. The "output template": a string that says how to output matching insns ! 175: as assembler code. `%' in this string specifies where to substitute ! 176: the value of an operand. *note Output Template::. ! 177: ! 178: When simple substitution isn't general enough, you can specify a piece ! 179: of C code to compute the output. *note Output Statement::. ! 180: ! 181: ! 182: File: internals, Node: Example, Next: RTL Template, Prev: Patterns, Up: Machine Desc ! 183: ! 184: Example of `define_insn' ! 185: ======================== ! 186: ! 187: Here is an actual example of an instruction pattern, for the 68000/68020. ! 188: ! 189: (define_insn "tstsi" ! 190: [(set (cc0) ! 191: (match_operand:SI 0 "general_operand" "rm"))] ! 192: "" ! 193: "* ! 194: { if (TARGET_68020 || ! ADDRESS_REG_P (operands[0])) ! 195: return \"tstl %0\"; ! 196: return \"cmpl #0,%0\"; }") ! 197: ! 198: ! 199: This is an instruction that sets the condition codes based on the value of ! 200: a general operand. It has no condition, so any insn whose RTL description ! 201: has the form shown may be handled according to this pattern. The name ! 202: `tstsi' means ``test a `SImode' value'' and tells the RTL generation pass ! 203: that, when it is necessary to test such a value, an insn to do so can be ! 204: constructed using this pattern. ! 205: ! 206: The output control string is a piece of C code which chooses which output ! 207: template to return based on the kind of operand and the specific type of ! 208: CPU for which code is being generated. ! 209: ! 210: `"rm"' is an operand constraint. Its meaning is explained below. ! 211: ! 212: ! 213: File: internals, Node: RTL Template, Next: Output Template, Prev: Example, Up: Machine Desc ! 214: ! 215: RTL Template for Generating and Recognizing Insns ! 216: ================================================= ! 217: ! 218: The RTL template is used to define which insns match the particular pattern ! 219: and how to find their operands. For named patterns, the RTL template also ! 220: says how to construct an insn from specified operands. ! 221: ! 222: Construction involves substituting specified operands into a copy of the ! 223: template. Matching involves determining the values that serve as the ! 224: operands in the insn being matched. Both of these activities are ! 225: controlled by special expression types that direct matching and ! 226: substitution of the operands. ! 227: ! 228: `(match_operand:M N TESTFN CONSTRAINT)' ! 229: This expression is a placeholder for operand number N of the insn. ! 230: When constructing an insn, operand number N will be substituted at ! 231: this point. When matching an insn, whatever appears at this position ! 232: in the insn will be taken as operand number N; but it must satisfy ! 233: TESTFN or this instruction pattern will not match at all. ! 234: ! 235: Operand numbers must be chosen consecutively counting from zero in ! 236: each instruction pattern. There may be only one `match_operand' ! 237: expression in the pattern for each expression number, and they must ! 238: appear in order of increasing expression number. ! 239: ! 240: TESTFN is a string that is the name of a C function that accepts two ! 241: arguments, a machine mode and an expression. During matching, the ! 242: function will be called with M as the mode argument and the putative ! 243: operand as the other argument. If it returns zero, this instruction ! 244: pattern fails to match. TESTFN may be an empty string; then it means ! 245: no test is to be done on the operand. ! 246: ! 247: Most often, TESTFN is `"general_operand"'. It checks that the ! 248: putative operand is either a constant, a register or a memory ! 249: reference, and that it is valid for mode M. ! 250: ! 251: For an operand that must be a register, TESTFN should be ! 252: `"register_operand"'. This prevents GNU CC from creating insns that ! 253: have memory references in these operands, insns which would only have ! 254: to be taken apart in the reload pass. ! 255: ! 256: For an operand that must be a constant, either TESTFN should be ! 257: `"immediate_operand"', or the instruction pattern's extra condition ! 258: should check for constants, or both. ! 259: ! 260: CONSTRAINT is explained later (*Note Constraints::.). ! 261: ! 262: `(match_dup N)' ! 263: This expression is also a placeholder for operand number N. It is ! 264: used when the operand needs to appear more than once in the insn. ! 265: ! 266: In construction, `match_dup' behaves exactly like `match_operand': the ! 267: operand is substituted into the insn being constructed. But in ! 268: matching, `match_dup' behaves differently. It assumes that operand ! 269: number N has already been determined by a `match_operand' appearing ! 270: earlier in the recognition template, and it matches only an ! 271: identical-looking expression. ! 272: ! 273: `(address (match_operand:M N "address_operand" ""))' ! 274: This complex of expressions is a placeholder for an operand number N ! 275: in a ``load address'' instruction: an operand which specifies a memory ! 276: location in the usual way, but for which the actual operand value used ! 277: is the address of the location, not the contents of the location. ! 278: ! 279: `address' expressions never appear in RTL code, only in machine ! 280: descriptions. And they are used only in machine descriptions that do ! 281: not use the operand constraint feature. When operand constraints are ! 282: in use, the letter `p' in the constraint serves this purpose. ! 283: ! 284: M is the machine mode of the *memory location being addressed*, not ! 285: the machine mode of the address itself. That mode is always the same ! 286: on a given target machine (it is `Pmode', which normally is `SImode'), ! 287: so there is no point in mentioning it; thus, no machine mode is ! 288: written in the `address' expression. If some day support is added for ! 289: machines in which addresses of different kinds of objects appear ! 290: differently or are used differently (such as the PDP-10), different ! 291: formats would perhaps need different machine modes and these modes ! 292: might be written in the `address' expression. ! 293: ! 294: ! 295: File: internals, Node: Output Template, Next: Output Statement, Prev: RTL Template, Up: Machine Desc ! 296: ! 297: Output Templates and Operand Substitution ! 298: ========================================= ! 299: ! 300: The "output template" is a string which specifies how to output the ! 301: assembler code for an instruction pattern. Most of the template is a fixed ! 302: string which is output literally. The character `%' is used to specify ! 303: where to substitute an operand; it can also be used to identify places ! 304: different variants of the assembler require different syntax. ! 305: ! 306: In the simplest case, a `%' followed by a digit N says to output operand N ! 307: at that point in the string. ! 308: ! 309: `%' followed by a letter and a digit says to output an operand in an ! 310: alternate fashion. Four letters have standard, built-in meanings described ! 311: below. The machine description macro `PRINT_OPERAND' can define additional ! 312: letters with nonstandard meanings. ! 313: ! 314: `%cDIGIT' can be used to substitute an operand that is a constant value ! 315: without the syntax that normally indicates an immediate operand. ! 316: ! 317: `%nDIGIT' is like `%cDIGIT' except that the value of the constant is ! 318: negated before printing. ! 319: ! 320: `%aDIGIT' can be used to substitute an operand as if it were a memory ! 321: reference, with the actual operand treated as the address. This may be ! 322: useful when outputting a ``load address'' instruction, because often the ! 323: assembler syntax for such an instruction requires you to write the operand ! 324: as if it were a memory reference. ! 325: ! 326: `%lDIGIT' is used to substitute a `label_ref' into a jump instruction. ! 327: ! 328: `%' followed by a punctuation character specifies a substitution that does ! 329: not use an operand. Only one case is standard: `%%' outputs a `%' into the ! 330: assembler code. Other nonstandard cases can be defined in the ! 331: `PRINT_OPERAND' macro. ! 332: ! 333: The template may generate multiple assembler instructions. Write the text ! 334: for the instructions, with `\;' between them. ! 335: ! 336: When the RTL contains two operand which are required by constraint to match ! 337: each other, the output template must refer only to the lower-numbered ! 338: operand. Matching operands are not always identical, and the rest of the ! 339: compiler arranges to put the proper RTL expression for printing into the ! 340: lower-numbered operand. ! 341: ! 342: One use of nonstandard letters or punctuation following `%' is to ! 343: distinguish between different assembler languages for the same machine; for ! 344: example, Motorola syntax versus MIT syntax for the 68000. Motorola syntax ! 345: requires periods in most opcode names, while MIT syntax does not. For ! 346: example, the opcode `movel' in MIT syntax is `move.l' in Motorola syntax. ! 347: The same file of patterns is used for both kinds of output syntax, but the ! 348: character sequence `%.' is used in each place where Motorola syntax wants a ! 349: period. The `PRINT_OPERAND' macro for Motorola syntax defines the sequence ! 350: to output a period; the macro for MIT syntax defines it to do nothing. ! 351: ! 352: ! 353: File: internals, Node: Output Statement, Next: Constraints, Prev: Output Template, Up: Machine Desc ! 354: ! 355: C Statements for Generating Assembler Output ! 356: ============================================ ! 357: ! 358: Often a single fixed template string cannot produce correct and efficient ! 359: assembler code for all the cases that are recognized by a single ! 360: instruction pattern. For example, the opcodes may depend on the kinds of ! 361: operands; or some unfortunate combinations of operands may require extra ! 362: machine instructions. ! 363: ! 364: If the output control string starts with a `*', then it is not an output ! 365: template but rather a piece of C program that should compute a template. ! 366: It should execute a `return' statement to return the template-string you ! 367: want. Most such templates use C string literals, which require doublequote ! 368: characters to delimit them. To include these doublequote characters in the ! 369: string, prefix each one with `\'. ! 370: ! 371: The operands may be found in the array `operands', whose C data type is ! 372: `rtx []'. ! 373: ! 374: It is possible to output an assembler instruction and then go on to output ! 375: or compute more of them, using the subroutine `output_asm_insn'. This ! 376: receives two arguments: a template-string and a vector of operands. The ! 377: vector may be `operands', or it may be another array of `rtx' that you ! 378: declare locally and initialize yourself. ! 379: ! 380: When an insn pattern has multiple alternatives in its constraints, often ! 381: the appearance of the assembler code determined mostly by which alternative ! 382: was matched. When this is so, the C code can test the variable ! 383: `which_alternative', which is the ordinal number of the alternative that ! 384: was actually satisfied (0 for the first, 1 for the second alternative, etc.). ! 385: ! 386: For example, suppose there are two opcodes for storing zero, `clrreg' for ! 387: registers and `clrmem' for memory locations. Here is how a pattern could ! 388: use `which_alternative' to choose between them: ! 389: ! 390: (define_insn "" ! 391: [(set (match_operand:SI 0 "general_operand" "r,m") ! 392: (const_int 0))] ! 393: "" ! 394: "* ! 395: return (which_alternative == 0 ! 396: ? \"clrreg %0\" : \"clrmem %0\"); ! 397: ") ! 398: ! 399: ! 400: ! 401: File: internals, Node: Constraints, Next: Standard Names, Prev: Output Statement, Up: Machine Desc ! 402: ! 403: Operand Constraints ! 404: =================== ! 405: ! 406: Each `match_operand' in an instruction pattern can specify a constraint for ! 407: the type of operands allowed. Constraints can say whether an operand may ! 408: be in a register, and which kinds of register; whether the operand can be a ! 409: memory reference, and which kinds of address; whether the operand may be an ! 410: immediate constant, and which possible values it may have. Constraints can ! 411: also require two operands to match. ! 412: ! 413: ! 414: * Menu: ! 415: ! 416: * Simple Constraints:: Basic use of constraints. ! 417: * Multi-Alternative:: When an insn has two alternative constraint-patterns. ! 418: * Class Preferences:: Constraints guide which hard register to put things in. ! 419: * Modifiers:: More precise control over effects of constraints. ! 420: * No Constraints:: Describing a clean machine without constraints. ! 421: ! 422: ! 423: ! 424: File: internals, Node: Simple Constraints, Next: Multi-Alternative, Prev: Constraints, Up: Constraints ! 425: ! 426: Simple Constraints ! 427: ------------------ ! 428: ! 429: The simplest kind of constraint is a string full of letters, each of which ! 430: describes one kind of operand that is permitted. Here are the letters that ! 431: are allowed: ! 432: ! 433: `m' ! 434: A memory operand is allowed, with any kind of address that the machine ! 435: supports in general. ! 436: ! 437: `o' ! 438: A memory operand is allowed, but only if the address is "offsetable". ! 439: This means that adding a small integer (actually, the width in bytes ! 440: of the operand, as determined by its machine mode) may be added to the ! 441: address and the result is also a valid memory address. ! 442: ! 443: For example, an address which is constant is offsetable; so is an ! 444: address that is the sum of a register and a constant (as long as a ! 445: slightly larger constant is also within the range of address-offsets ! 446: supported by the machine); but an autoincrement or autodecrement ! 447: address is not offsetable. More complicated indirect/indexed ! 448: addresses may or may not be offsetable depending on the other ! 449: addressing modes that the machine supports. ! 450: ! 451: Note that in an output operand which can be matched by another ! 452: operand, the constraint letter `o' is valid only when accompanied by ! 453: both `<' (if the target machine has predecrement addressing) and `>' ! 454: (if the target machine has preincrement addressing). ! 455: ! 456: `<' ! 457: A memory operand with autodecrement addressing (either predecrement or ! 458: postdecrement) is allowed. ! 459: ! 460: `>' ! 461: A memory operand with autoincrement addressing (either preincrement or ! 462: postincrement) is allowed. ! 463: ! 464: `r' ! 465: A register operand is allowed provided that it is in a general register. ! 466: ! 467: `d', `a', `f', ... ! 468: Other letters can be defined in machine-dependent fashion to stand for ! 469: particular classes of registers. `d', `a' and `f' are defined on the ! 470: 68000/68020 to stand for data, address and floating point registers. ! 471: ! 472: `i' ! 473: An immediate integer operand (one with constant value) is allowed. ! 474: This includes symbolic constants whose values will be known only at ! 475: assembly time. ! 476: ! 477: `n' ! 478: An immediate integer operand with a known numeric value is allowed. ! 479: Many systems cannot support assembly-time constants for operands less ! 480: than a word wide. Constraints for these operands should use `n' ! 481: rather than `i'. ! 482: ! 483: `I', `J', `K', ... ! 484: Other letters in the range `I' through `M' may be defined in a ! 485: machine-dependent fashion to permit immediate integer operands with ! 486: explicit integer values in specified ranges. For example, on the ! 487: 68000, `I' is defined to stand for the range of values 1 to 8. This ! 488: is the range permitted as a shift count in the shift instructions. ! 489: ! 490: `F' ! 491: An immediate floating operand (expression code `const_double') is ! 492: allowed. ! 493: ! 494: `G', `H' ! 495: `G' and `H' may be defined in a machine-dependent fashion to permit ! 496: immediate floating operands in particular ranges of values. ! 497: ! 498: `s' ! 499: An immediate integer operand whose value is not an explicit integer is ! 500: allowed. ! 501: ! 502: This might appear strange; if an insn allows a constant operand with a ! 503: value not known at compile time, it certainly must allow any known ! 504: value. So why use `s' instead of `i'? Sometimes it allows better ! 505: code to be generated. ! 506: ! 507: For example, on the 68000 in a fullword instruction it is possible to ! 508: use an immediate operand; but if the immediate value is between -32 ! 509: and 31, better code results from loading the value into a register and ! 510: using the register. This is because the load into the register can be ! 511: done with a `moveq' instruction. We arrange for this to happen by ! 512: defining the letter `K' to mean ``any integer outside the range -32 to ! 513: 31'', and then specifying `Ks' in the operand constraints. ! 514: ! 515: `g' ! 516: Any register, memory or immediate integer operand is allowed, except ! 517: for registers that are not general registers. ! 518: ! 519: `N' (a digit) ! 520: An operand that matches operand number N is allowed. If a digit is ! 521: used together with letters, the digit should come last. ! 522: ! 523: This is called a "matching constraint" and what it really means is ! 524: that the assembler has only a single operand that fills two roles ! 525: considered separate in the RTL insn. For example, an add insn has two ! 526: input operands and one output operand in the RTL, but on most machines ! 527: an add instruction really has only two operands, one of them an ! 528: input-output operand. ! 529: ! 530: Matching constraints work only in circumstances like that add insn. ! 531: More precisely, the matching constraint must appear in an input-only ! 532: operand and the operand that it matches must be an output-only operand ! 533: with a lower number. ! 534: ! 535: For operands to match in a particular case usually means that they are ! 536: identical-looking RTL expressions. But in a few special cases ! 537: specific kinds of dissimilarity are allowed. For example, `*x' as an ! 538: input operand will match `*x++' as an output operand. For proper ! 539: results in such cases, the output template should always use the ! 540: output-operand's number when printing the operand. ! 541: ! 542: `p' ! 543: An operand that is a valid memory address is allowed. This is for ! 544: ``load address'' and ``push address'' instructions. ! 545: ! 546: If `p' is used in the constraint, the test-function in the ! 547: `match_operand' must be `address_operand'. ! 548: ! 549: In order to have valid assembler code, each operand must satisfy its ! 550: constraint. But a failure to do so does not prevent the pattern from ! 551: applying to an insn. Instead, it directs the compiler to modify the code ! 552: so that the constraint will be satisfied. Usually this is done by copying ! 553: an operand into a register. ! 554: ! 555: Contrast, therefore, the two instruction patterns that follow: ! 556: ! 557: (define_insn "" ! 558: [(set (match_operand:SI 0 "general_operand" "r") ! 559: (plus:SI (match_dup 0) ! 560: (match_operand:SI 1 "general_operand" "r")))] ! 561: "" ! 562: "...") ! 563: ! 564: ! 565: which has two operands, one of which must appear in two places, and ! 566: ! 567: (define_insn "" ! 568: [(set (match_operand:SI 0 "general_operand" "r") ! 569: (plus:SI (match_operand:SI 1 "general_operand" "0") ! 570: (match_operand:SI 2 "general_operand" "r")))] ! 571: "" ! 572: "...") ! 573: ! 574: ! 575: which has three operands, two of which are required by a constraint to be ! 576: identical. If we are considering an insn of the form ! 577: ! 578: (insn N PREV NEXT ! 579: (set (reg:SI 3) ! 580: (plus:SI (reg:SI 6) (reg:SI 109))) ! 581: ...) ! 582: ! 583: ! 584: the first pattern would not apply at all, because this insn does not ! 585: contain two identical subexpressions in the right place. The pattern would ! 586: say, ``That does not look like an add instruction; try other patterns.'' ! 587: The second pattern would say, ``Yes, that's an add instruction, but there ! 588: is something wrong with it.'' It would direct the reload pass of the ! 589: compiler to generate additional insns to make the constraint true. The ! 590: results might look like this: ! 591: ! 592: (insn N2 PREV N ! 593: (set (reg:SI 3) (reg:SI 6)) ! 594: ...) ! 595: ! 596: (insn N N2 NEXT ! 597: (set (reg:SI 3) ! 598: (plus:SI (reg:SI 3) (reg:SI 109))) ! 599: ...) ! 600: ! 601: ! 602: Because insns that don't fit the constraints are fixed up by loading ! 603: operands into registers, every instruction pattern's constraints must ! 604: permit the case where all the operands are in registers. It need not ! 605: permit all classes of registers; the compiler knows how to copy registers ! 606: into other registers of the proper class in order to make an instruction ! 607: valid. But if no registers are permitted, the compiler will be stymied: it ! 608: does not know how to save a register in memory in order to make an ! 609: instruction valid. Instruction patterns that reject registers can be made ! 610: valid by attaching a condition-expression that refuses to match an insn at ! 611: all if the crucial operand is a register. ! 612: ! 613: ! 614: File: internals, Node: Multi-Alternative, Next: Class Preferences, Prev: Simple Constraints, Up: Constraints ! 615: ! 616: Multiple Alternative Constraints ! 617: -------------------------------- ! 618: ! 619: Sometimes a single instruction has multiple alternative sets of possible ! 620: operands. For example, on the 68000, a logical-or instruction can combine ! 621: register or an immediate value into memory, or it can combine any kind of ! 622: operand into a register; but it cannot combine one memory location into ! 623: another. ! 624: ! 625: These constraints are represented as multiple alternatives. An alternative ! 626: can be described by a series of letters for each operand. The overall ! 627: constraint for an operand is made from the letters for this operand from ! 628: the first alternative, a comma, the letters for this operand from the ! 629: second alternative, a comma, and so on until the last alternative. Here is ! 630: how it is done for fullword logical-or on the 68000: ! 631: ! 632: (define_insn "iorsi3" ! 633: [(set (match_operand:SI 0 "general_operand" "=%m,d") ! 634: (ior:SI (match_operand:SI 1 "general_operand" "0,0") ! 635: (match_operand:SI 2 "general_operand" "dKs,dmKs")))] ! 636: ...) ! 637: ! 638: ! 639: The first alternative has `m' (memory) for operand 0, `0' for operand 1 ! 640: (meaning it must match operand 0), and `dKs' for operand 2. The second ! 641: alternative has `d' (data register) for operand 0, `0' for operand 1, and ! 642: `dmKs' for operand 2. The `=' and `%' in the constraint for operand 0 are ! 643: not part of any alternative; their meaning is explained in the next section. ! 644: ! 645: If all the operands fit any one alternative, the instruction is valid. ! 646: Otherwise, for each alternative, the compiler counts how many instructions ! 647: must be added to copy the operands so that that alternative applies. The ! 648: alternative requiring the least copying is chosen. If two alternatives ! 649: need the same amount of copying, the one that comes first is chosen. These ! 650: choices can be altered with the `?' and `!' characters: ! 651: ! 652: `?' ! 653: Disparage slightly the alternative that the `?' appears in, as a ! 654: choice when no alternative applies exactly. The compiler regards this ! 655: alternative as one unit more costly for each `?' that appears in it. ! 656: ! 657: `!' ! 658: Disparage severely the alternative that the `!' appears in. When ! 659: operands must be copied into registers, the compiler will never choose ! 660: this alternative as the one to strive for. ! 661: ! 662: When an insn pattern has multiple alternatives in its constraints, often ! 663: the appearance of the assembler code determined mostly by which alternative ! 664: was matched. When this is so, the C code for writing the assembler code ! 665: can use the variable `which_alternative', which is the ordinal number of ! 666: the alternative that was actually satisfied (0 for the first, 1 for the ! 667: second alternative, etc.). For example: ! 668: ! 669: (define_insn "" ! 670: [(set (match_operand:SI 0 "general_operand" "r,m") ! 671: (const_int 0))] ! 672: "" ! 673: "* ! 674: return (which_alternative == 0 ! 675: ? \"clrreg %0\" : \"clrmem %0\"); ! 676: ") ! 677: ! 678: ! 679: ! 680: File: internals, Node: Class Preferences, Next: Modifiers, Prev: Multi-Alternative, Up: Constraints ! 681: ! 682: Register Class Preferences ! 683: -------------------------- ! 684: ! 685: The operand constraints have another function: they enable the compiler to ! 686: decide which kind of hardware register a pseudo register is best allocated ! 687: to. The compiler examines the constraints that apply to the insns that use ! 688: the pseudo register, looking for the machine-dependent letters such as `d' ! 689: and `a' that specify classes of registers. The pseudo register is put in ! 690: whichever class gets the most ``votes''. The constraint letters `g' and ! 691: `r' also vote: they vote in favor of a general register. The machine ! 692: description says which registers are considered general. ! 693: ! 694: Of course, on some machines all registers are equivalent, and no register ! 695: classes are defined. Then none of this complexity is relevant. ! 696: ! 697: ! 698: File: internals, Node: Modifiers, Next: No Constraints, Prev: Class Preferences, Up: Constraints ! 699: ! 700: Constraint Modifier Characters ! 701: ------------------------------ ! 702: ! 703: `=' ! 704: Means that this operand is write-only for this instruction: the ! 705: previous value is discarded and replaced by output data. ! 706: ! 707: `+' ! 708: Means that this operand is both read and written by the instruction. ! 709: ! 710: When the compiler fixes up the operands to satisfy the constraints, it ! 711: needs to know which operands are inputs to the instruction and which ! 712: are outputs from it. `=' identifies an output; `+' identifies an ! 713: operand that is both input and output; all other operands are assumed ! 714: to be input only. ! 715: ! 716: `&' ! 717: Means (in a particular alternative) that this operand is written ! 718: before the instruction is finished using the input operands. ! 719: Therefore, this operand may not lie in a register that is used as an ! 720: input operand or as part of any memory address. ! 721: ! 722: `&' applies only to the alternative in which it is written. In ! 723: constraints with multiple alternatives, sometimes one alternative ! 724: requires `&' while others do not. See, for example, the `movdf' insn ! 725: of the 68000. ! 726: ! 727: `&' does not obviate the need to write `='. ! 728: ! 729: `%' ! 730: Declares the instruction to be commutative for this operand and the ! 731: following operand. This means that the compiler may interchange the ! 732: two operands if that is the cheapest way to make all operands fit the ! 733: constraints. This is often used in patterns for addition instructions ! 734: that really have only two operands: the result must go in one of the ! 735: arguments. Here for example, is how the 68000 halfword-add ! 736: instruction is defined: ! 737: ! 738: (define_insn "addhi3" ! 739: [(set (match_operand:HI 0 "general_operand" "=m,r") ! 740: (plus:HI (match_operand:HI 1 "general_operand" "%0,0") ! 741: (match_operand:HI 2 "general_operand" "di,g")))] ! 742: ...) ! 743: ! 744: ! 745: Note that in previous versions of GNU CC the `%' constraint modifier ! 746: always applied to operands 1 and 2 regardless of which operand it was ! 747: written in. The usual custom was to write it in operand 0. Now it ! 748: must be in operand 1 if the operands to be exchanged are 1 and 2. ! 749: ! 750: `#' ! 751: Says that all following characters, up to the next comma, are to be ! 752: ignored as a constraint. They are significant only for choosing ! 753: register preferences. ! 754: ! 755: `*' ! 756: Says that the following character should be ignored when choosing ! 757: register preferences. `*' has no effect on the meaning of the ! 758: constraint as a constraint. ! 759: ! 760: Here is an example: the 68000 has an instruction to sign-extend a ! 761: halfword in a data register, and can also sign-extend a value by ! 762: copying it into an address register. While either kind of register is ! 763: acceptable, the constraints on an address-register destination are ! 764: less strict, so it is best if register allocation makes an address ! 765: register its goal. Therefore, `*' is used so that the `d' constraint ! 766: letter (for data register) is ignored when computing register ! 767: preferences. ! 768: ! 769: (define_insn "extendhisi2" ! 770: [(set (match_operand:SI 0 "general_operand" "=*d,a") ! 771: (sign_extend:SI ! 772: (match_operand:HI 1 "general_operand" "0,g")))] ! 773: ...) ! 774: ! 775: ! 776: ! 777: File: internals, Node: No Constraints, Prev: Modifiers, Up: Constraints ! 778: ! 779: Not Using Constraints ! 780: --------------------- ! 781: ! 782: Some machines are so clean that operand constraints are not required. For ! 783: example, on the Vax, an operand valid in one context is valid in any other ! 784: context. On such a machine, every operand constraint would be `g', ! 785: excepting only operands of ``load address'' instructions which are written ! 786: as if they referred to a memory location's contents but actual refer to its ! 787: address. They would have constraint `p'. ! 788: ! 789: For such machines, instead of writing `g' and `p' for all the constraints, ! 790: you can choose to write a description with empty constraints. Then you ! 791: write `""' for the constraint in every `match_operand'. Address operands ! 792: are identified by writing an `address' expression around the ! 793: `match_operand', not by their constraints. ! 794: ! 795: When the machine description has just empty constraints, certain parts of ! 796: compilation are skipped, making the compiler faster. ! 797: ! 798: ! 799: File: internals, Node: Standard Names, Next: Pattern Ordering, Prev: Constraints, Up: Machine Desc ! 800: ! 801: Standard Names for Patterns Used in Generation ! 802: ============================================== ! 803: ! 804: Here is a table of the instruction names that are meaningful in the RTL ! 805: generation pass of the compiler. Giving one of these names to an ! 806: instruction pattern tells the RTL generation pass that it can use the ! 807: pattern in to accomplish a certain task. ! 808: ! 809: `movM' ! 810: Here M is a two-letter machine mode name, in lower case. This ! 811: instruction pattern moves data with that machine mode from operand 1 ! 812: to operand 0. For example, `movsi' moves full-word data. ! 813: ! 814: If operand 0 is a `subreg' with mode M of a register whose natural ! 815: mode is wider than M, the effect of this instruction is to store the ! 816: specified value in the part of the register that corresponds to mode ! 817: M. The effect on the rest of the register is undefined. ! 818: ! 819: `movstrictM' ! 820: Like `movM' except that if operand 0 is a `subreg' with mode M of a ! 821: register whose natural mode is wider, the `movstrictM' instruction is ! 822: guaranteed not to alter any of the register except the part which ! 823: belongs to mode M. ! 824: ! 825: `addM3' ! 826: Add operand 2 and operand 1, storing the result in operand 0. All ! 827: operands must have mode M. This can be used even on two-address ! 828: machines, by means of constraints requiring operands 1 and 0 to be the ! 829: same location. ! 830: ! 831: `subM3', `mulM3', `umulM3', `divM3', `udivM3', `modM3', `umodM3', `andM3', `iorM3', `xorM3' ! 832: Similar, for other arithmetic operations. ! 833: ! 834: `andcbM3' ! 835: Bitwise logical-and operand 1 with the complement of operand 2 and ! 836: store the result in operand 0. ! 837: ! 838: `mulhisi3' ! 839: Multiply operands 1 and 2, which have mode `HImode', and store a ! 840: `SImode' product in operand 0. ! 841: ! 842: `mulqihi3', `mulsidi3' ! 843: Similar widening-multiplication instructions of other widths. ! 844: ! 845: `umulqihi3', `umulhisi3', `umulsidi3' ! 846: Similar widening-multiplication instructions that do unsigned ! 847: multiplication. ! 848: ! 849: `divmodM4' ! 850: Signed division that produces both a quotient and a remainder. ! 851: Operand 1 is divided by operand 2 to produce a quotient stored in ! 852: operand 0 and a remainder stored in operand 3. ! 853: ! 854: `udivmodM4' ! 855: Similar, but does unsigned division. ! 856: ! 857: `divmodMN4' ! 858: Like `divmodM4' except that only the dividend has mode M; the divisor, ! 859: quotient and remainder have mode N. For example, the Vax has a ! 860: `divmoddisi4' instruction (but it is omitted from the machine ! 861: description, because it is so slow that it is faster to compute ! 862: remainders by the circumlocution that the compiler will use if this ! 863: instruction is not available). ! 864: ! 865: `ashlM3' ! 866: Arithmetic-shift operand 1 left by a number of bits specified by ! 867: operand 2, and store the result in operand 0. Operand 2 has mode ! 868: `SImode', not mode M. ! 869: ! 870: `ashrM3', `lshlM3', `lshrM3', `rotlM3', `rotrM3' ! 871: Other shift and rotate instructions. ! 872: ! 873: Logical and arithmetic left shift are the same. Machines that do not ! 874: allow negative shift counts often have only one instruction for ! 875: shifting left. On such machines, you should define a pattern named ! 876: `ashlM3' and leave `lshlM3' undefined. ! 877: ! 878: `negM2' ! 879: Negate operand 1 and store the result in operand 0. ! 880: ! 881: `absM2' ! 882: Store the absolute value of operand 1 into operand 0. ! 883: ! 884: `sqrtM2' ! 885: Store the square root of operand 1 into operand 0. ! 886: ! 887: `ffsM2' ! 888: Store into operand 0 one plus the index of the least significant 1-bit ! 889: of operand 1. If operand 1 is zero, store zero. M is the mode of ! 890: operand 0; operand 1's mode is specified by the instruction pattern, ! 891: and the compiler will convert the operand to that mode before ! 892: generating the instruction. ! 893: ! 894: `one_cmplM2' ! 895: Store the bitwise-complement of operand 1 into operand 0. ! 896: ! 897: `cmpM' ! 898: Compare operand 0 and operand 1, and set the condition codes. The RTL ! 899: pattern should look like this: ! 900: ! 901: (set (cc0) (minus (match_operand:M 0 ...) ! 902: (match_operand:M 1 ...))) ! 903: ! 904: ! 905: Each such definition in the machine description, for integer mode M, ! 906: must have a corresponding `tstM' pattern, because optimization can ! 907: simplify the compare into a test when operand 1 is zero. ! 908: ! 909: `tstM' ! 910: Compare operand 0 against zero, and set the condition codes. The RTL ! 911: pattern should look like this: ! 912: ! 913: (set (cc0) (match_operand:M 0 ...)) ! 914: ! 915: ! 916: `movstrM' ! 917: Block move instruction. The addresses of the destination and source ! 918: strings are the first two operands, and both are in mode `Pmode'. The ! 919: number of bytes to move is the third operand, in mode M. ! 920: ! 921: `cmpstrM' ! 922: Block compare instruction, with operands like `movstrM' except that ! 923: the two memory blocks are compared byte by byte in lexicographic ! 924: order. The effect of the instruction is to set the condition codes. ! 925: ! 926: `floatMN2' ! 927: Convert operand 1 (valid for fixed point mode M) to floating point ! 928: MODE N and store in operand 0 (which has mode N). ! 929: ! 930: `fixMN2' ! 931: Convert operand 1 (valid for floating point mode M) to fixed point ! 932: MODE N as a signed number and store in operand 0 (which has mode N). ! 933: This instruction's result is defined only when the value of operand 1 ! 934: is an integer. ! 935: ! 936: `fixunsMN2' ! 937: Convert operand 1 (valid for floating point mode M) to fixed point ! 938: MODE N as an unsigned number and store in operand 0 (which has mode ! 939: N). This instruction's result is defined only when the value of ! 940: operand 1 is an integer. ! 941: ! 942: `ftruncM2' ! 943: Convert operand 1 (valid for floating point mode M) to an integer ! 944: value, still represented in floating point mode M, and store it in ! 945: operand 0 (valid for floating point mode M). ! 946: ! 947: `fix_truncMN2' ! 948: Like `fixMN2' but works for any floating point value of mode M by ! 949: converting the value to an integer. ! 950: ! 951: `fixuns_truncMN2' ! 952: Like `fixunsMN2' but works for any floating point value of mode M by ! 953: converting the value to an integer. ! 954: ! 955: `truncMN' ! 956: Truncate operand 1 (valid for mode M) to mode N and store in operand 0 ! 957: (which has mode N). Both modes must be fixed point or both floating ! 958: point. ! 959: ! 960: `extendMN' ! 961: Sign-extend operand 1 (valid for mode M) to mode N and store in ! 962: operand 0 (which has mode N). Both modes must be fixed point or both ! 963: floating point. ! 964: ! 965: `zero_extendMN' ! 966: Zero-extend operand 1 (valid for mode M) to mode N and store in ! 967: operand 0 (which has mode N). Both modes must be fixed point. ! 968: ! 969: `extv' ! 970: Extract a bit-field from operand 1 (a register or memory operand), ! 971: where operand 2 specifies the width in bits and operand 3 the starting ! 972: bit, and store it in operand 0. Operand 0 must have `Simode'. ! 973: Operand 1 may have mode `QImode' or `SImode'; often `SImode' is ! 974: allowed only for registers. Operands 2 and 3 must be valid for ! 975: `SImode'. ! 976: ! 977: The RTL generation pass generates this instruction only with constants ! 978: for operands 2 and 3. ! 979: ! 980: The bit-field value is sign-extended to a full word integer before it ! 981: is stored in operand 0. ! 982: ! 983: `extzv' ! 984: Like `extv' except that the bit-field value is zero-extended. ! 985: ! 986: `insv' ! 987: Store operand 3 (which must be valid for `SImode') into a bit-field in ! 988: operand 0, where operand 1 specifies the width in bits and operand 2 ! 989: the starting bit. Operand 0 may have mode `QImode' or `SImode'; often ! 990: `SImode' is allowed only for registers. Operands 1 and 2 must be ! 991: valid for `SImode'. ! 992: ! 993: The RTL generation pass generates this instruction only with constants ! 994: for operands 1 and 2. ! 995: ! 996: `sCOND' ! 997: Store zero or nonzero in the operand according to the condition codes. ! 998: Value stored is nonzero iff the condition COND is true. COND is the ! 999: name of a comparison operation expression code, such as `eq', `lt' or ! 1000: `leu'. ! 1001: ! 1002: You specify the mode that the operand must have when you write the ! 1003: `match_operand' expression. The compiler automatically sees which ! 1004: mode you have used and supplies an operand of that mode. ! 1005: ! 1006: The value stored for a true condition must have 1 as its low bit. ! 1007: Otherwise the instruction is not suitable and must be omitted from the ! 1008: machine description. You must tell the compiler exactly which value ! 1009: is stored by defining the macro `STORE_FLAG_VALUE'. ! 1010: ! 1011: `bCOND' ! 1012: Conditional branch instruction. Operand 0 is a `label_ref' that ! 1013: refers to the label to jump to. Jump if the condition codes meet ! 1014: condition COND. ! 1015: ! 1016: `call' ! 1017: Subroutine call instruction. Operand 1 is the number of bytes of ! 1018: arguments pushed (in mode `SImode'), and operand 0 is the function to ! 1019: call. Operand 0 should be a `mem' RTX whose address is the address of ! 1020: the function. ! 1021: ! 1022: `return' ! 1023: Subroutine return instruction. This instruction pattern name should ! 1024: be defined only if a single instruction can do all the work of ! 1025: returning from a function. ! 1026: ! 1027: `tablejump' ! 1028: `caseM' ! 1029: ! 1030: File: internals, Node: Pattern Ordering, Next: Dependent Patterns, Prev: Standard Names, Up: Machine Desc ! 1031: ! 1032: When the Order of Patterns Matters ! 1033: ================================== ! 1034: ! 1035: Sometimes an insn can match more than one instruction pattern. Then the ! 1036: pattern that appears first in the machine description is the one used. ! 1037: Therefore, more specific patterns (patterns that will match fewer things) ! 1038: and faster instructions (those that will produce better code when they do ! 1039: match) should usually go first in the description. ! 1040: ! 1041: In some cases the effect of ordering the patterns can be used to hide a ! 1042: pattern when it is not valid. For example, the 68000 has an instruction ! 1043: for converting a fullword to floating point and another for converting a ! 1044: byte to floating point. An instruction converting an integer to floating ! 1045: point could match either one. We put the pattern to convert the fullword ! 1046: first to make sure that one will be used rather than the other. (Otherwise ! 1047: a large integer might be generated as a single-byte immediate quantity, ! 1048: which would not work.) Instead of using this pattern ordering it would be ! 1049: possible to make the pattern for convert-a-byte smart enough to deal ! 1050: properly with any constant value. ! 1051: ! 1052: ! 1053: File: internals, Node: Dependent Patterns, Next: Jump Patterns, Prev: Pattern Ordering, Up: Machine Desc ! 1054: ! 1055: Interdependence of Patterns ! 1056: =========================== ! 1057: ! 1058: Every machine description must have a named pattern for each of the ! 1059: conditional branch names `bCOND'. The recognition template must always ! 1060: have the form ! 1061: ! 1062: (set (pc) ! 1063: (if_then_else (COND (cc0) (const_int 0)) ! 1064: (label_ref (match_operand 0 "" "")) ! 1065: (pc))) ! 1066: ! 1067: ! 1068: In addition, every machine description must have an anonymous pattern for ! 1069: each of the possible reverse-conditional branches. These patterns look like ! 1070: ! 1071: (set (pc) ! 1072: (if_then_else (COND (cc0) (const_int 0)) ! 1073: (pc) ! 1074: (label_ref (match_operand 0 "" "")))) ! 1075: ! 1076: ! 1077: They are necessary because jump optimization can turn direct-conditional ! 1078: branches into reverse-conditional branches. ! 1079: ! 1080: The compiler does more with RTL than just create it from patterns and ! 1081: recognize the patterns: it can perform arithmetic expression codes when ! 1082: constant values for their operands can be determined. As a result, ! 1083: sometimes having one pattern can require other patterns. For example, the ! 1084: Vax has no `and' instruction, but it has `and not' instructions. Here is ! 1085: the definition of one of them: ! 1086: ! 1087: (define_insn "andcbsi2" ! 1088: [(set (match_operand:SI 0 "general_operand" "") ! 1089: (and:SI (match_dup 0) ! 1090: (not:SI (match_operand:SI ! 1091: 1 "general_operand" ""))))] ! 1092: "" ! 1093: "bicl2 %1,%0") ! 1094: ! 1095: ! 1096: If operand 1 is an explicit integer constant, an instruction constructed ! 1097: using that pattern can be simplified into an `and' like this: ! 1098: ! 1099: (set (reg:SI 41) ! 1100: (and:SI (reg:SI 41) ! 1101: (const_int 0xffff7fff))) ! 1102: ! 1103: ! 1104: (where the integer constant is the one's complement of what appeared in the ! 1105: original instruction). ! 1106: ! 1107: To avoid a fatal error, the compiler must have a pattern that recognizes ! 1108: such an instruction. Here is what is used: ! 1109: ! 1110: (define_insn "" ! 1111: [(set (match_operand:SI 0 "general_operand" "") ! 1112: (and:SI (match_dup 0) ! 1113: (match_operand:SI 1 "general_operand" "")))] ! 1114: "GET_CODE (operands[1]) == CONST_INT" ! 1115: "* ! 1116: { operands[1] ! 1117: = gen_rtx (CONST_INT, VOIDmode, ~INTVAL (operands[1])); ! 1118: return \"bicl2 %1,%0\"; ! 1119: }") ! 1120: ! 1121: ! 1122: Whereas a pattern to match a general `and' instruction is impossible to ! 1123: support on the Vax, this pattern is possible because it matches only a ! 1124: constant second argument: a special case that can be output as an `and not' ! 1125: instruction. ! 1126: ! 1127: A ``compare'' instruction whose RTL looks like this: ! 1128: ! 1129: (set (cc0) (minus OPERAND (const_int 0))) ! 1130: ! 1131: ! 1132: may be simplified by optimization into a ``test'' like this: ! 1133: ! 1134: (set (cc0) OPERAND) ! 1135: ! 1136: ! 1137: So in the machine description, each ``compare'' pattern for an integer mode ! 1138: must have a corresponding ``test'' pattern that will match the result of ! 1139: such simplification. ! 1140: ! 1141: In some cases machines support instructions identical except for the ! 1142: machine mode of one or more operands. For example, there may be ! 1143: ``sign-extend halfword'' and ``sign-extend byte'' instructions whose ! 1144: patterns are ! 1145: ! 1146: (set (match_operand:SI 0 ...) ! 1147: (extend:SI (match_operand:HI 1 ...))) ! 1148: ! 1149: (set (match_operand:SI 0 ...) ! 1150: (extend:SI (match_operand:QI 1 ...))) ! 1151: ! 1152: ! 1153: Constant integers do not specify a machine mode, so an instruction to ! 1154: extend a constant value could match either pattern. The pattern it ! 1155: actually will match is the one that appears first in the file. For correct ! 1156: results, this must be the one for the widest possible mode (`HImode', ! 1157: here). If the pattern matches the `QImode' instruction, the results will ! 1158: be incorrect if the constant value does not actually fit that mode. ! 1159: ! 1160: Such instructions to extend constants are rarely generated because they are ! 1161: optimized away, but they do occasionally happen in nonoptimized compilations. ! 1162: ! 1163: ! 1164: File: internals, Node: Jump Patterns, Next: Peephole Definitions, Prev: Dependent Patterns, Up: Machine Desc ! 1165: ! 1166: Defining Jump Instruction Patterns ! 1167: ================================== ! 1168: ! 1169: GNU CC assumes that the machine has a condition code. A comparison insn ! 1170: sets the condition code, recording the results of both signed and unsigned ! 1171: comparison of the given operands. A separate branch insn tests the ! 1172: condition code and branches or not according its value. The branch insns ! 1173: come in distinct signed and unsigned flavors. Many common machines, such ! 1174: as the Vax, the 68000 and the 32000, work this way. ! 1175: ! 1176: Some machines have distinct signed and unsigned compare instructions, and ! 1177: only one set of conditional branch instructions. The easiest way to handle ! 1178: these machines is to treat them just like the others until the final stage ! 1179: where assembly code is written. At this time, when outputting code for the ! 1180: compare instruction, peek ahead at the following branch using `NEXT_INSN ! 1181: (insn)'. (The variable `insn' refers to the insn being output, in the ! 1182: output-writing code in an instruction pattern.) If the RTL says that is an ! 1183: unsigned branch, output an unsigned compare; otherwise output a signed ! 1184: compare. When the branch itself is output, you can treat signed and ! 1185: unsigned branches identically. ! 1186: ! 1187: The reason you can do this is that GNU CC always generates a pair of ! 1188: consecutive RTL insns, one to set the condition code and one to test it, ! 1189: and keeps the pair inviolate until the end. ! 1190: ! 1191: To go with this technique, you must define the machine-description macro ! 1192: `NOTICE_UPDATE_CC' to do `CC_STATUS_INIT'; in other words, no compare ! 1193: instruction is superfluous. ! 1194: ! 1195: Some machines have compare-and-branch instructions and no condition code. ! 1196: A similar technique works for them. When it is time to ``output'' a ! 1197: compare instruction, record its operands in two static variables. When ! 1198: outputting the branch-on-condition-code instruction that follows, actually ! 1199: output a compare-and-branch instruction that uses the remembered operands. ! 1200: ! 1201: It also works to define patterns for compare-and-branch instructions. In ! 1202: optimizing compilation, the pair of compare and branch instructions will be ! 1203: combined accoprding to these patterns. But this does not happen if ! 1204: optimization is not requested. So you must use one of the solutions above ! 1205: in addition to any special patterns you define. ! 1206: ! 1207:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.