|
|
1.1 ! root 1: ! 2: ! 3: File: internals, Node: Multi-Alternative, Next: Class Preferences, Prev: Simple Constraints, Up: Constraints ! 4: ! 5: Multiple Alternative Constraints ! 6: -------------------------------- ! 7: ! 8: Sometimes a single instruction has multiple alternative sets of possible ! 9: operands. For example, on the 68000, a logical-or instruction can combine ! 10: register or an immediate value into memory, or it can combine any kind of ! 11: operand into a register; but it cannot combine one memory location into ! 12: another. ! 13: ! 14: These constraints are represented as multiple alternatives. An alternative ! 15: can be described by a series of letters for each operand. The overall ! 16: constraint for an operand is made from the letters for this operand from ! 17: the first alternative, a comma, the letters for this operand from the ! 18: second alternative, a comma, and so on until the last alternative. Here is ! 19: how it is done for fullword logical-or on the 68000: ! 20: ! 21: (define_insn "iorsi3" ! 22: [(set (match_operand:SI 0 "general_operand" "=%m,d") ! 23: (ior:SI (match_operand:SI 1 "general_operand" "0,0") ! 24: (match_operand:SI 2 "general_operand" "dKs,dmKs")))] ! 25: ...) ! 26: ! 27: The first alternative has `m' (memory) for operand 0, `0' for operand 1 ! 28: (meaning it must match operand 0), and `dKs' for operand 2. The second ! 29: alternative has `d' (data register) for operand 0, `0' for operand 1, and ! 30: `dmKs' for operand 2. The `=' and `%' in the constraint for operand 0 are ! 31: not part of any alternative; their meaning is explained in the next section. ! 32: ! 33: If all the operands fit any one alternative, the instruction is valid. ! 34: Otherwise, for each alternative, the compiler counts how many instructions ! 35: must be added to copy the operands so that that alternative applies. The ! 36: alternative requiring the least copying is chosen. If two alternatives ! 37: need the same amount of copying, the one that comes first is chosen. These ! 38: choices can be altered with the `?' and `!' characters: ! 39: ! 40: `?' ! 41: Disparage slightly the alternative that the `?' appears in, as a ! 42: choice when no alternative applies exactly. The compiler regards this ! 43: alternative as one unit more costly for each `?' that appears in it. ! 44: ! 45: `!' ! 46: Disparage severely the alternative that the `!' appears in. When ! 47: operands must be copied into registers, the compiler will never choose ! 48: this alternative as the one to strive for. ! 49: ! 50: When an insn pattern has multiple alternatives in its constraints, often ! 51: the appearance of the assembler code determined mostly by which alternative ! 52: was matched. When this is so, the C code for writing the assembler code ! 53: can use the variable `which_alternative', which is the ordinal number of ! 54: the alternative that was actually satisfied (0 for the first, 1 for the ! 55: second alternative, etc.). For example: ! 56: ! 57: (define_insn "" ! 58: [(set (match_operand:SI 0 "general_operand" "r,m") ! 59: (const_int 0))] ! 60: "" ! 61: "* ! 62: return (which_alternative == 0 ! 63: ? \"clrreg %0\" : \"clrmem %0\"); ! 64: ") ! 65: ! 66: ! 67: File: internals, Node: Class Preferences, Next: Modifiers, Prev: Multi-Alternative, Up: Constraints ! 68: ! 69: Register Class Preferences ! 70: -------------------------- ! 71: ! 72: The operand constraints have another function: they enable the compiler to ! 73: decide which kind of hardware register a pseudo register is best allocated ! 74: to. The compiler examines the constraints that apply to the insns that use ! 75: the pseudo register, looking for the machine-dependent letters such as `d' ! 76: and `a' that specify classes of registers. The pseudo register is put in ! 77: whichever class gets the most ``votes''. The constraint letters `g' and ! 78: `r' also vote: they vote in favor of a general register. The machine ! 79: description says which registers are considered general. ! 80: ! 81: Of course, on some machines all registers are equivalent, and no register ! 82: classes are defined. Then none of this complexity is relevant. ! 83: ! 84: ! 85: File: internals, Node: Modifiers, Next: No Constraints, Prev: Class Preferences, Up: Constraints ! 86: ! 87: Constraint Modifier Characters ! 88: ------------------------------ ! 89: ! 90: `=' ! 91: Means that this operand is write-only for this instruction: the ! 92: previous value is discarded and replaced by output data. ! 93: ! 94: `+' ! 95: Means that this operand is both read and written by the instruction. ! 96: ! 97: When the compiler fixes up the operands to satisfy the constraints, it ! 98: needs to know which operands are inputs to the instruction and which ! 99: are outputs from it. `=' identifies an output; `+' identifies an ! 100: operand that is both input and output; all other operands are assumed ! 101: to be input only. ! 102: ! 103: `&' ! 104: Means (in a particular alternative) that this operand is written ! 105: before the instruction is finished using the input operands. ! 106: Therefore, this operand may not lie in a register that is used as an ! 107: input operand or as part of any memory address. ! 108: ! 109: `&' applies only to the alternative in which it is written. In ! 110: constraints with multiple alternatives, sometimes one alternative ! 111: requires `&' while others do not. See, for example, the `movdf' insn ! 112: of the 68000. ! 113: ! 114: `&' does not obviate the need to write `='. ! 115: ! 116: `%' ! 117: Declares the instruction to be commutative for this operand and the ! 118: following operand. This means that the compiler may interchange the ! 119: two operands if that is the cheapest way to make all operands fit the ! 120: constraints. This is often used in patterns for addition instructions ! 121: that really have only two operands: the result must go in one of the ! 122: arguments. Here for example, is how the 68000 halfword-add ! 123: instruction is defined: ! 124: ! 125: (define_insn "addhi3" ! 126: [(set (match_operand:HI 0 "general_operand" "=m,r") ! 127: (plus:HI (match_operand:HI 1 "general_operand" "%0,0") ! 128: (match_operand:HI 2 "general_operand" "di,g")))] ! 129: ...) ! 130: ! 131: Note that in previous versions of GNU CC the `%' constraint modifier ! 132: always applied to operands 1 and 2 regardless of which operand it was ! 133: written in. The usual custom was to write it in operand 0. Now it ! 134: must be in operand 1 if the operands to be exchanged are 1 and 2. ! 135: ! 136: `#' ! 137: Says that all following characters, up to the next comma, are to be ! 138: ignored as a constraint. They are significant only for choosing ! 139: register preferences. ! 140: ! 141: `*' ! 142: Says that the following character should be ignored when choosing ! 143: register preferences. `*' has no effect on the meaning of the ! 144: constraint as a constraint. ! 145: ! 146: Here is an example: the 68000 has an instruction to sign-extend a ! 147: halfword in a data register, and can also sign-extend a value by ! 148: copying it into an address register. While either kind of register is ! 149: acceptable, the constraints on an address-register destination are ! 150: less strict, so it is best if register allocation makes an address ! 151: register its goal. Therefore, `*' is used so that the `d' constraint ! 152: letter (for data register) is ignored when computing register ! 153: preferences. ! 154: ! 155: (define_insn "extendhisi2" ! 156: [(set (match_operand:SI 0 "general_operand" "=*d,a") ! 157: (sign_extend:SI ! 158: (match_operand:HI 1 "general_operand" "0,g")))] ! 159: ...) ! 160: ! 161: ! 162: File: internals, Node: No Constraints, Prev: Modifiers, Up: Constraints ! 163: ! 164: Not Using Constraints ! 165: --------------------- ! 166: ! 167: Some machines are so clean that operand constraints are not required. For ! 168: example, on the Vax, an operand valid in one context is valid in any other ! 169: context. On such a machine, every operand constraint would be `g', ! 170: excepting only operands of ``load address'' instructions which are written ! 171: as if they referred to a memory location's contents but actual refer to its ! 172: address. They would have constraint `p'. ! 173: ! 174: For such machines, instead of writing `g' and `p' for all the constraints, ! 175: you can choose to write a description with empty constraints. Then you ! 176: write `""' for the constraint in every `match_operand'. Address operands ! 177: are identified by writing an `address' expression around the ! 178: `match_operand', not by their constraints. ! 179: ! 180: When the machine description has just empty constraints, certain parts of ! 181: compilation are skipped, making the compiler faster. ! 182: ! 183: ! 184: File: internals, Node: Standard Names, Next: Pattern Ordering, Prev: Constraints, Up: Machine Desc ! 185: ! 186: Standard Names for Patterns Used in Generation ! 187: ============================================== ! 188: ! 189: Here is a table of the instruction names that are meaningful in the RTL ! 190: generation pass of the compiler. Giving one of these names to an ! 191: instruction pattern tells the RTL generation pass that it can use the ! 192: pattern in to accomplish a certain task. ! 193: ! 194: `movM' ! 195: Here M is a two-letter machine mode name, in lower case. This ! 196: instruction pattern moves data with that machine mode from operand 1 ! 197: to operand 0. For example, `movsi' moves full-word data. ! 198: ! 199: If operand 0 is a `subreg' with mode M of a register whose natural ! 200: mode is wider than M, the effect of this instruction is to store the ! 201: specified value in the part of the register that corresponds to mode ! 202: M. The effect on the rest of the register is undefined. ! 203: ! 204: This class of patterns is special in several ways. First of all, each ! 205: of these names *must* be defined, because there is no other way to ! 206: copy a datum from one place to another. ! 207: ! 208: Second, these patterns are not used solely in the RTL generation pass. ! 209: Even the reload pass can generate move insns to copy values from ! 210: stack slots into temporary registers. When it does so, one of the ! 211: operands is a hard register and the other is an operand that can have ! 212: a reload. ! 213: ! 214: Therefore, when given such a pair of operands, the pattern must ! 215: generate RTL which needs no temporary registers---no registers other ! 216: than the operands. For example, if you support the pattern with a ! 217: `define_expand', then in such a case you mustn't call `force_reg' or ! 218: any other such function which might generate new pseudo registers. ! 219: ! 220: This requirement exists even for subword modes on a RISC machine where ! 221: fetching those modes from memory normally requires several insns and ! 222: some temporary registers. Look in `spur.md' to see how the ! 223: requirement is satisfied. ! 224: ! 225: The variety of operands that have reloads depends on the rest of the ! 226: machine description, but typically on a RISC machine these can only be ! 227: pseudo registers that did not get hard registers, while on other ! 228: machines explicit memory references will get optional reloads. ! 229: ! 230: `movstrictM' ! 231: Like `movM' except that if operand 0 is a `subreg' with mode M of a ! 232: register whose natural mode is wider, the `movstrictM' instruction is ! 233: guaranteed not to alter any of the register except the part which ! 234: belongs to mode M. ! 235: ! 236: `addM3' ! 237: Add operand 2 and operand 1, storing the result in operand 0. All ! 238: operands must have mode M. This can be used even on two-address ! 239: machines, by means of constraints requiring operands 1 and 0 to be the ! 240: same location. ! 241: ! 242: `subM3', `mulM3', `umulM3', `divM3', `udivM3', `modM3', `umodM3', `andM3', `iorM3', `xorM3' ! 243: Similar, for other arithmetic operations. ! 244: ! 245: `andcbM3' ! 246: Bitwise logical-and operand 1 with the complement of operand 2 and ! 247: store the result in operand 0. ! 248: ! 249: `mulhisi3' ! 250: Multiply operands 1 and 2, which have mode `HImode', and store a ! 251: `SImode' product in operand 0. ! 252: ! 253: `mulqihi3', `mulsidi3' ! 254: Similar widening-multiplication instructions of other widths. ! 255: ! 256: `umulqihi3', `umulhisi3', `umulsidi3' ! 257: Similar widening-multiplication instructions that do unsigned ! 258: multiplication. ! 259: ! 260: `divmodM4' ! 261: Signed division that produces both a quotient and a remainder. ! 262: Operand 1 is divided by operand 2 to produce a quotient stored in ! 263: operand 0 and a remainder stored in operand 3. ! 264: ! 265: `udivmodM4' ! 266: Similar, but does unsigned division. ! 267: ! 268: `divmodMN4' ! 269: Like `divmodM4' except that only the dividend has mode M; the divisor, ! 270: quotient and remainder have mode N. For example, the Vax has a ! 271: `divmoddisi4' instruction (but it is omitted from the machine ! 272: description, because it is so slow that it is faster to compute ! 273: remainders by the circumlocution that the compiler will use if this ! 274: instruction is not available). ! 275: ! 276: `ashlM3' ! 277: Arithmetic-shift operand 1 left by a number of bits specified by ! 278: operand 2, and store the result in operand 0. Operand 2 has mode ! 279: `SImode', not mode M. ! 280: ! 281: `ashrM3', `lshlM3', `lshrM3', `rotlM3', `rotrM3' ! 282: Other shift and rotate instructions. ! 283: ! 284: Logical and arithmetic left shift are the same. Machines that do not ! 285: allow negative shift counts often have only one instruction for ! 286: shifting left. On such machines, you should define a pattern named ! 287: `ashlM3' and leave `lshlM3' undefined. ! 288: ! 289: `negM2' ! 290: Negate operand 1 and store the result in operand 0. ! 291: ! 292: `absM2' ! 293: Store the absolute value of operand 1 into operand 0. ! 294: ! 295: `sqrtM2' ! 296: Store the square root of operand 1 into operand 0. ! 297: ! 298: `ffsM2' ! 299: Store into operand 0 one plus the index of the least significant 1-bit ! 300: of operand 1. If operand 1 is zero, store zero. M is the mode of ! 301: operand 0; operand 1's mode is specified by the instruction pattern, ! 302: and the compiler will convert the operand to that mode before ! 303: generating the instruction. ! 304: ! 305: `one_cmplM2' ! 306: Store the bitwise-complement of operand 1 into operand 0. ! 307: ! 308: `cmpM' ! 309: Compare operand 0 and operand 1, and set the condition codes. The RTL ! 310: pattern should look like this: ! 311: ! 312: (set (cc0) (minus (match_operand:M 0 ...) ! 313: (match_operand:M 1 ...))) ! 314: ! 315: Each such definition in the machine description, for integer mode M, ! 316: must have a corresponding `tstM' pattern, because optimization can ! 317: simplify the compare into a test when operand 1 is zero. ! 318: ! 319: `tstM' ! 320: Compare operand 0 against zero, and set the condition codes. The RTL ! 321: pattern should look like this: ! 322: ! 323: (set (cc0) (match_operand:M 0 ...)) ! 324: ! 325: `movstrM' ! 326: Block move instruction. The addresses of the destination and source ! 327: strings are the first two operands, and both are in mode `Pmode'. The ! 328: number of bytes to move is the third operand, in mode M. ! 329: ! 330: `cmpstrM' ! 331: Block compare instruction, with operands like `movstrM' except that ! 332: the two memory blocks are compared byte by byte in lexicographic ! 333: order. The effect of the instruction is to set the condition codes. ! 334: ! 335: `floatMN2' ! 336: Convert operand 1 (valid for fixed point mode M) to floating point ! 337: MODE N and store in operand 0 (which has mode N). ! 338: ! 339: `fixMN2' ! 340: Convert operand 1 (valid for floating point mode M) to fixed point ! 341: MODE N as a signed number and store in operand 0 (which has mode N). ! 342: This instruction's result is defined only when the value of operand 1 ! 343: is an integer. ! 344: ! 345: `fixunsMN2' ! 346: Convert operand 1 (valid for floating point mode M) to fixed point ! 347: MODE N as an unsigned number and store in operand 0 (which has mode ! 348: N). This instruction's result is defined only when the value of ! 349: operand 1 is an integer. ! 350: ! 351: `ftruncM2' ! 352: Convert operand 1 (valid for floating point mode M) to an integer ! 353: value, still represented in floating point mode M, and store it in ! 354: operand 0 (valid for floating point mode M). ! 355: ! 356: `fix_truncMN2' ! 357: Like `fixMN2' but works for any floating point value of mode M by ! 358: converting the value to an integer. ! 359: ! 360: `fixuns_truncMN2' ! 361: Like `fixunsMN2' but works for any floating point value of mode M by ! 362: converting the value to an integer. ! 363: ! 364: `truncMN' ! 365: Truncate operand 1 (valid for mode M) to mode N and store in operand 0 ! 366: (which has mode N). Both modes must be fixed point or both floating ! 367: point. ! 368: ! 369: `extendMN' ! 370: Sign-extend operand 1 (valid for mode M) to mode N and store in ! 371: operand 0 (which has mode N). Both modes must be fixed point or both ! 372: floating point. ! 373: ! 374: `zero_extendMN' ! 375: Zero-extend operand 1 (valid for mode M) to mode N and store in ! 376: operand 0 (which has mode N). Both modes must be fixed point. ! 377: ! 378: `extv' ! 379: Extract a bit-field from operand 1 (a register or memory operand), ! 380: where operand 2 specifies the width in bits and operand 3 the starting ! 381: bit, and store it in operand 0. Operand 0 must have `Simode'. ! 382: Operand 1 may have mode `QImode' or `SImode'; often `SImode' is ! 383: allowed only for registers. Operands 2 and 3 must be valid for ! 384: `SImode'. ! 385: ! 386: The RTL generation pass generates this instruction only with constants ! 387: for operands 2 and 3. ! 388: ! 389: The bit-field value is sign-extended to a full word integer before it ! 390: is stored in operand 0. ! 391: ! 392: `extzv' ! 393: Like `extv' except that the bit-field value is zero-extended. ! 394: ! 395: `insv' ! 396: Store operand 3 (which must be valid for `SImode') into a bit-field in ! 397: operand 0, where operand 1 specifies the width in bits and operand 2 ! 398: the starting bit. Operand 0 may have mode `QImode' or `SImode'; often ! 399: `SImode' is allowed only for registers. Operands 1 and 2 must be ! 400: valid for `SImode'. ! 401: ! 402: The RTL generation pass generates this instruction only with constants ! 403: for operands 1 and 2. ! 404: ! 405: `sCOND' ! 406: Store zero or nonzero in the operand according to the condition codes. ! 407: Value stored is nonzero iff the condition COND is true. COND is the ! 408: name of a comparison operation expression code, such as `eq', `lt' or ! 409: `leu'. ! 410: ! 411: You specify the mode that the operand must have when you write the ! 412: `match_operand' expression. The compiler automatically sees which ! 413: mode you have used and supplies an operand of that mode. ! 414: ! 415: The value stored for a true condition must have 1 as its low bit. ! 416: Otherwise the instruction is not suitable and must be omitted from the ! 417: machine description. You must tell the compiler exactly which value ! 418: is stored by defining the macro `STORE_FLAG_VALUE'. ! 419: ! 420: `bCOND' ! 421: Conditional branch instruction. Operand 0 is a `label_ref' that ! 422: refers to the label to jump to. Jump if the condition codes meet ! 423: condition COND. ! 424: ! 425: `call' ! 426: Subroutine call instruction. Operand 1 is the number of bytes of ! 427: arguments pushed (in mode `SImode'), and operand 0 is the function to ! 428: call. Operand 0 should be a `mem' RTX whose address is the address of ! 429: the function. ! 430: ! 431: `return' ! 432: Subroutine return instruction. This instruction pattern name should ! 433: be defined only if a single instruction can do all the work of ! 434: returning from a function. ! 435: ! 436: `casesi' ! 437: Instruction to jump through a dispatch table, including bounds checking. ! 438: This instruction takes five operands: ! 439: ! 440: 1. The index to dispatch on, which has mode `SImode'. ! 441: ! 442: 2. The lower bound for indices in the table, an integer constant. ! 443: ! 444: 3. The upper bound for indices in the table, an integer constant. ! 445: ! 446: 4. A label to jump to if the index has a value outside the bounds. (If the ! 447: machine-description macro `CASE_DROPS_THROUGH' is defined, then ! 448: an out-of-bounds index drops through to the code following the ! 449: jump table instead of jumping to this label. In that case, this ! 450: label is not actually used by the `casesi' instruction, but it is ! 451: always provided as an operand.) ! 452: ! 453: 5. A label that precedes the table itself. ! 454: ! 455: The table is a `addr_vec' or `addr_diff_vec' inside of a `jump_insn'. ! 456: The number of elements in the table is one plus the difference between ! 457: the upper bound and the lower bound. ! 458: ! 459: `tablejump' ! 460: Instruction to jump to a variable address. This is a low-level ! 461: capability which can be used to implement a dispatch table when there ! 462: is no `casesi' pattern. ! 463: ! 464: This pattern requires two operands: the address or offset, and a label ! 465: which should immediately precede the jump table. If the macro ! 466: `CASE_VECTOR_PC_RELATIVE' is defined then the first operand is an ! 467: absolute address to jump to; otherwise, it is an offset which counts ! 468: from the address of the table. ! 469: ! 470: The `tablejump' insn is always the last insn before the jump table it ! 471: uses. Its assembler code normally has no need to use the second ! 472: operand, but you should incorporate it in the RTL pattern so that the ! 473: jump optimizer will not delete the table as unreachable code. ! 474: ! 475: ! 476: File: internals, Node: Pattern Ordering, Next: Dependent Patterns, Prev: Standard Names, Up: Machine Desc ! 477: ! 478: When the Order of Patterns Matters ! 479: ================================== ! 480: ! 481: Sometimes an insn can match more than one instruction pattern. Then the ! 482: pattern that appears first in the machine description is the one used. ! 483: Therefore, more specific patterns (patterns that will match fewer things) ! 484: and faster instructions (those that will produce better code when they do ! 485: match) should usually go first in the description. ! 486: ! 487: In some cases the effect of ordering the patterns can be used to hide a ! 488: pattern when it is not valid. For example, the 68000 has an instruction ! 489: for converting a fullword to floating point and another for converting a ! 490: byte to floating point. An instruction converting an integer to floating ! 491: point could match either one. We put the pattern to convert the fullword ! 492: first to make sure that one will be used rather than the other. (Otherwise ! 493: a large integer might be generated as a single-byte immediate quantity, ! 494: which would not work.) Instead of using this pattern ordering it would be ! 495: possible to make the pattern for convert-a-byte smart enough to deal ! 496: properly with any constant value. ! 497: ! 498: ! 499: File: internals, Node: Dependent Patterns, Next: Jump Patterns, Prev: Pattern Ordering, Up: Machine Desc ! 500: ! 501: Interdependence of Patterns ! 502: =========================== ! 503: ! 504: Every machine description must have a named pattern for each of the ! 505: conditional branch names `bCOND'. The recognition template must always ! 506: have the form ! 507: ! 508: (set (pc) ! 509: (if_then_else (COND (cc0) (const_int 0)) ! 510: (label_ref (match_operand 0 "" "")) ! 511: (pc))) ! 512: ! 513: In addition, every machine description must have an anonymous pattern for ! 514: each of the possible reverse-conditional branches. These patterns look like ! 515: ! 516: (set (pc) ! 517: (if_then_else (COND (cc0) (const_int 0)) ! 518: (pc) ! 519: (label_ref (match_operand 0 "" "")))) ! 520: ! 521: They are necessary because jump optimization can turn direct-conditional ! 522: branches into reverse-conditional branches. ! 523: ! 524: The compiler does more with RTL than just create it from patterns and ! 525: recognize the patterns: it can perform arithmetic expression codes when ! 526: constant values for their operands can be determined. As a result, ! 527: sometimes having one pattern can require other patterns. For example, the ! 528: Vax has no `and' instruction, but it has `and not' instructions. Here is ! 529: the definition of one of them: ! 530: ! 531: (define_insn "andcbsi2" ! 532: [(set (match_operand:SI 0 "general_operand" "") ! 533: (and:SI (match_dup 0) ! 534: (not:SI (match_operand:SI ! 535: 1 "general_operand" ""))))] ! 536: "" ! 537: "bicl2 %1,%0") ! 538: ! 539: If operand 1 is an explicit integer constant, an instruction constructed ! 540: using that pattern can be simplified into an `and' like this: ! 541: ! 542: (set (reg:SI 41) ! 543: (and:SI (reg:SI 41) ! 544: (const_int 0xffff7fff))) ! 545: ! 546: (where the integer constant is the one's complement of what appeared in the ! 547: original instruction). ! 548: ! 549: To avoid a fatal error, the compiler must have a pattern that recognizes ! 550: such an instruction. Here is what is used: ! 551: ! 552: (define_insn "" ! 553: [(set (match_operand:SI 0 "general_operand" "") ! 554: (and:SI (match_dup 0) ! 555: (match_operand:SI 1 "general_operand" "")))] ! 556: "GET_CODE (operands[1]) == CONST_INT" ! 557: "* ! 558: { operands[1] ! 559: = gen_rtx (CONST_INT, VOIDmode, ~INTVAL (operands[1])); ! 560: return \"bicl2 %1,%0\"; ! 561: }") ! 562: ! 563: Whereas a pattern to match a general `and' instruction is impossible to ! 564: support on the Vax, this pattern is possible because it matches only a ! 565: constant second argument: a special case that can be output as an `and not' ! 566: instruction. ! 567: ! 568: A ``compare'' instruction whose RTL looks like this: ! 569: ! 570: (set (cc0) (minus OPERAND (const_int 0))) ! 571: ! 572: may be simplified by optimization into a ``test'' like this: ! 573: ! 574: (set (cc0) OPERAND) ! 575: ! 576: So in the machine description, each ``compare'' pattern for an integer mode ! 577: must have a corresponding ``test'' pattern that will match the result of ! 578: such simplification. ! 579: ! 580: In some cases machines support instructions identical except for the ! 581: machine mode of one or more operands. For example, there may be ! 582: ``sign-extend halfword'' and ``sign-extend byte'' instructions whose ! 583: patterns are ! 584: ! 585: (set (match_operand:SI 0 ...) ! 586: (extend:SI (match_operand:HI 1 ...))) ! 587: ! 588: (set (match_operand:SI 0 ...) ! 589: (extend:SI (match_operand:QI 1 ...))) ! 590: ! 591: Constant integers do not specify a machine mode, so an instruction to ! 592: extend a constant value could match either pattern. The pattern it ! 593: actually will match is the one that appears first in the file. For correct ! 594: results, this must be the one for the widest possible mode (`HImode', ! 595: here). If the pattern matches the `QImode' instruction, the results will ! 596: be incorrect if the constant value does not actually fit that mode. ! 597: ! 598: Such instructions to extend constants are rarely generated because they are ! 599: optimized away, but they do occasionally happen in nonoptimized compilations. ! 600: ! 601: ! 602: File: internals, Node: Jump Patterns, Next: Peephole Definitions, Prev: Dependent Patterns, Up: Machine Desc ! 603: ! 604: Defining Jump Instruction Patterns ! 605: ================================== ! 606: ! 607: GNU CC assumes that the machine has a condition code. A comparison insn ! 608: sets the condition code, recording the results of both signed and unsigned ! 609: comparison of the given operands. A separate branch insn tests the ! 610: condition code and branches or not according its value. The branch insns ! 611: come in distinct signed and unsigned flavors. Many common machines, such ! 612: as the Vax, the 68000 and the 32000, work this way. ! 613: ! 614: Some machines have distinct signed and unsigned compare instructions, and ! 615: only one set of conditional branch instructions. The easiest way to handle ! 616: these machines is to treat them just like the others until the final stage ! 617: where assembly code is written. At this time, when outputting code for the ! 618: compare instruction, peek ahead at the following branch using `NEXT_INSN ! 619: (insn)'. (The variable `insn' refers to the insn being output, in the ! 620: output-writing code in an instruction pattern.) If the RTL says that is an ! 621: unsigned branch, output an unsigned compare; otherwise output a signed ! 622: compare. When the branch itself is output, you can treat signed and ! 623: unsigned branches identically. ! 624: ! 625: The reason you can do this is that GNU CC always generates a pair of ! 626: consecutive RTL insns, one to set the condition code and one to test it, ! 627: and keeps the pair inviolate until the end. ! 628: ! 629: To go with this technique, you must define the machine-description macro ! 630: `NOTICE_UPDATE_CC' to do `CC_STATUS_INIT'; in other words, no compare ! 631: instruction is superfluous. ! 632: ! 633: Some machines have compare-and-branch instructions and no condition code. ! 634: A similar technique works for them. When it is time to ``output'' a ! 635: compare instruction, record its operands in two static variables. When ! 636: outputting the branch-on-condition-code instruction that follows, actually ! 637: output a compare-and-branch instruction that uses the remembered operands. ! 638: ! 639: It also works to define patterns for compare-and-branch instructions. In ! 640: optimizing compilation, the pair of compare and branch instructions will be ! 641: combined accoprding to these patterns. But this does not happen if ! 642: optimization is not requested. So you must use one of the solutions above ! 643: in addition to any special patterns you define. ! 644: ! 645: ! 646: File: internals, Node: Peephole Definitions, Next: Expander Definitions, Prev: Jump Patterns, Up: Machine Desc ! 647: ! 648: Defining Machine-Specific Peephole Optimizers ! 649: ============================================= ! 650: ! 651: In addition to instruction patterns the `md' file may contain definitions ! 652: of machine-specific peephole optimizations. ! 653: ! 654: The combiner does not notice certain peephole optimizations when the data ! 655: flow in the program does not suggest that it should try them. For example, ! 656: sometimes two consecutive insns related in purpose can be combined even ! 657: though the second one does not appear to use a register computed in the ! 658: first one. A machine-specific peephole optimizer can detect such ! 659: opportunities. ! 660: ! 661: A definition looks like this: ! 662: ! 663: (define_peephole ! 664: [INSN-PATTERN-1 ! 665: INSN-PATTERN-2 ! 666: ...] ! 667: "CONDITION" ! 668: "TEMPLATE") ! 669: ! 670: In this skeleton, INSN-PATTERN-1 and so on are patterns to match ! 671: consecutive instructions. The optimization applies to a sequence of ! 672: instructions when INSN-PATTERN-1 matches the first one, INSN-PATTERN-2 ! 673: matches the next, and so on. ! 674: ! 675: INSN-PATTERN-1 and so on look *almost* like the second operand of ! 676: `define_insn'. There is one important difference: this pattern is an RTX, ! 677: not a vector. If the `define_insn' pattern would be a vector of one ! 678: element, the INSN-PATTERN should be just that element, no vector. If the ! 679: `define_insn' pattern would have multiple elements then the INSN-PATTERN ! 680: must place the vector inside an explicit `parallel' RTX. ! 681: ! 682: The operands of the instructions are matched with `match_operands' and ! 683: `match_dup', as usual). What is not usual is that the operand numbers ! 684: apply to all the instruction patterns in the definition. So, you can check ! 685: for identical operands in two instructions by using `match_operand' in one ! 686: instruction and `match_dup' in the other. ! 687: ! 688: The operand constraints used in `match_operand' patterns do not have any ! 689: direct effect on the applicability of the optimization, but they will be ! 690: validated afterward, so write constraints that are sure to fit whenever the ! 691: optimization is applied. It is safe to use `"g"' for each operand. ! 692: ! 693: Once a sequence of instructions matches the patterns, the CONDITION is ! 694: checked. This is a C expression which makes the final decision whether to ! 695: perform the optimization (do so if the expression is nonzero). If ! 696: CONDITION is omitted (in other words, the string is empty) then the ! 697: optimization is applied to every sequence of instructions that matches the ! 698: patterns. ! 699: ! 700: The defined peephole optimizations are applied after register allocation is ! 701: complete. Therefore, the optimizer can check which operands have ended up ! 702: in which kinds of registers, just by looking at the operands. ! 703: ! 704: The way to refer to the operands in CONDITION is to write `operands[I]' for ! 705: operand number I (as matched by `(match_operand I ...)'). Use the variable ! 706: `insn' to refer to the last of the insns being matched; use `PREV_INSN' to ! 707: find the preceding insns (but be careful to skip over any `note' insns that ! 708: intervene). ! 709: ! 710: When optimizing computations with intermediate results, you can use ! 711: CONDITION to match only when the intermediate results are not used ! 712: elsewhere. Use the C expression `dead_or_set_p (INSN, OP)', where INSN is ! 713: the insn in which you expect the value to be used for the last time (from ! 714: the value of `insn', together with use of `PREV_INSN'), and OP is the ! 715: intermediate value (from `operands[I]'). ! 716: ! 717: Applying the optimization means replacing the sequence of instructions with ! 718: one new instruction. The TEMPLATE controls ultimate output of assembler ! 719: code for this combined instruction. It works exactly like the template of ! 720: a `define_insn'. Operand numbers in this template are the same ones used ! 721: in matching the original sequence of instructions. ! 722: ! 723: The result of a defined peephole optimizer does not need to match any of ! 724: the instruction patterns, and it does not have an opportunity to match ! 725: them. The peephole optimizer definition itself serves as the instruction ! 726: pattern to control how the instruction is output. ! 727: ! 728: Defined peephole optimizers are run in the last jump optimization pass, so ! 729: the instructions they produce are never combined or rearranged ! 730: automatically in any way. ! 731: ! 732: Here is an example, taken from the 68000 machine description: ! 733: ! 734: (define_peephole ! 735: [(set (reg:SI 15) (plus:SI (reg:SI 15) (const_int 4))) ! 736: (set (match_operand:DF 0 "register_operand" "f") ! 737: (match_operand:DF 1 "register_operand" "ad"))] ! 738: "FP_REG_P (operands[0]) && ! FP_REG_P (operands[1])" ! 739: "* ! 740: { ! 741: rtx xoperands[2]; ! 742: xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1); ! 743: #ifdef MOTOROLA ! 744: output_asm_insn (\"move.l %1,(sp)\", xoperands); ! 745: output_asm_insn (\"move.l %1,-(sp)\", operands); ! 746: return \"fmove.d (sp)+,%0\"; ! 747: #else ! 748: output_asm_insn (\"movel %1,sp@\", xoperands); ! 749: output_asm_insn (\"movel %1,sp@-\", operands); ! 750: return \"fmoved sp@+,%0\"; ! 751: #endif ! 752: } ! 753: ") ! 754: ! 755: The effect of this optimization is to change ! 756: ! 757: jbsr _foobar ! 758: addql #4,sp ! 759: movel d1,sp@- ! 760: movel d0,sp@- ! 761: fmoved sp@+,fp0 ! 762: ! 763: into ! 764: ! 765: jbsr _foobar ! 766: movel d1,sp@ ! 767: movel d0,sp@- ! 768: fmoved sp@+,fp0 ! 769: ! 770: ! 771: File: internals, Node: Expander Definitions, Prev: Peephole Definitions, Up: Machine Desc ! 772: ! 773: Defining RTL Sequences for Code Generation ! 774: ========================================== ! 775: ! 776: On some target machines, some standard pattern names for RTL generation ! 777: cannot be handled with single insn, but a sequence of RTL insns can ! 778: represent them. For these target machines, you can write a `define_expand' ! 779: to specify how to generate the sequence of RTL. ! 780: ! 781: A `define_expand' is an RTL expression that looks almost like a ! 782: `define_insn'; but, unlike the latter, a `define_expand' is used only for ! 783: RTL generation and it can produce more than one RTL insn. ! 784: ! 785: A `define_expand' RTX has four operands: ! 786: ! 787: * The name. Each `define_expand' must have a name, since the only use ! 788: for it is to refer to it by name. ! 789: ! 790: * The RTL template. This is just like the RTL template for a ! 791: `define_peephole' in that it is a vector of RTL expressions each being ! 792: one insn. ! 793: ! 794: * The condition, a string containing a C expression. This expression is ! 795: used to express how the availability of this pattern depends on ! 796: subclasses of target machine, selected by command-line options when ! 797: GNU CC is run. This is just like the condition of a `define_insn' ! 798: that has a standard name. ! 799: ! 800: * The preparation statements, a string containing zero or more C ! 801: statements which are to be executed before RTL code is generated from ! 802: the RTL template. ! 803: ! 804: Usually these statements prepare temporary registers for use as ! 805: internal operands in the RTL template, but they can also generate RTL ! 806: insns directly by calling routines such as `emit_insn', etc. Any such ! 807: insns precede the ones that come from the RTL template. ! 808: ! 809: The RTL template, in addition to controlling generation of RTL insns, also ! 810: describes the operands that need to be specified when this pattern is used. ! 811: In particular, it gives a predicate for each operand. ! 812: ! 813: A true operand, which need to be specified in order to generate RTL from ! 814: the pattern, should be described with a `match_operand' in its first ! 815: occurrence in the RTL template. This enters information on the operand's ! 816: predicate into the tables that record such things. GNU CC uses the ! 817: information to preload the operand into a register if that is required for ! 818: valid RTL code. If the operand is referred to more than once, subsequent ! 819: references should use `match_dup'. ! 820: ! 821: The RTL template may also refer to internal ``operands'' which are ! 822: temporary registers or labels used only within the sequence made by the ! 823: `define_expand'. Internal operands are substituted into the RTL template ! 824: with `match_dup', never with `match_operand'. The values of the internal ! 825: operands are not passed in as arguments by the compiler when it requests ! 826: use of this pattern. Instead, they are computed within the pattern, in the ! 827: preparation statements. These statements compute the values and store them ! 828: into the appropriate elements of `operands' so that `match_dup' can find ! 829: them. ! 830: ! 831: There are two special macros defined for use in the preparation statements: ! 832: `DONE' and `FAIL'. Use them with a following semicolon, as a statement. ! 833: ! 834: `DONE' ! 835: Use the `DONE' macro to end RTL generation for the pattern. The only ! 836: RTL insns resulting from the pattern on this occasion will be those ! 837: already emitted by explicit calls to `emit_insn' within the ! 838: preparation statements; the RTL template will not be generated. ! 839: ! 840: `FAIL' ! 841: Make the pattern fail on this occasion. When a pattern fails, it ! 842: means that the pattern was not truly available. The calling routines ! 843: in the compiler will try other strategies for code generation using ! 844: other patterns. ! 845: ! 846: Failure is currently supported only for binary operations (addition, ! 847: multiplication, shifting, etc.). ! 848: ! 849: Do not emit any insns explicitly with `emit_insn' before failing. ! 850: ! 851: Here is an example, the definition of left-shift for the SPUR chip: ! 852: ! 853: (define_expand "ashlsi3" ! 854: [(set (match_operand:SI 0 "register_operand" "") ! 855: (ashift:SI ! 856: (match_operand:SI 1 "register_operand" "") ! 857: (match_operand:SI 2 "nonmemory_operand" "")))] ! 858: "" ! 859: " ! 860: { ! 861: if (GET_CODE (operands[2]) != CONST_INT ! 862: || (unsigned) INTVAL (operands[2]) > 3) ! 863: FAIL; ! 864: }") ! 865: ! 866: This example uses `define_expand' so that it can generate an RTL insn for ! 867: shifting when the shift-count is in the supported range of 0 to 3 but fail ! 868: in other cases where machine insns aren't available. When it fails, the ! 869: compiler tries another strategy using different patterns (such as, a ! 870: library call). ! 871: ! 872: If the compiler were able to handle nontrivial condition-strings in ! 873: patterns with names, then there would be possible to use a `define_insn' in ! 874: that case. Here is another case (zero-extension on the 68000) which makes ! 875: more use of the power of `define_expand': ! 876: ! 877: (define_expand "zero_extendhisi2" ! 878: [(set (match_operand:SI 0 "general_operand" "") ! 879: (const_int 0)) ! 880: (set (strict_low_part ! 881: (subreg:HI ! 882: (match_operand:SI 0 "general_operand" "") ! 883: 0)) ! 884: (match_operand:HI 1 "general_operand" ""))] ! 885: "" ! 886: "operands[1] = make_safe_from (operands[1], operands[0]);") ! 887: ! 888: Here two RTL insns are generated, one to clear the entire output operand ! 889: and the other to copy the input operand into its low half. This sequence ! 890: is incorrect if the input operand refers to [the old value of] the output ! 891: operand, so the preparation statement makes sure this isn't so. The ! 892: function `make_safe_from' copies the `operands[1]' into a temporary ! 893: register if it refers to `operands[0]'. It does this by emitting another ! 894: RTL insn. ! 895: ! 896: Finally, a third example shows the use of an internal operand. ! 897: Zero-extension on the SPUR chip is done by `and'-ing the result against a ! 898: halfword mask. But this mask cannot be represented by a `const_int' ! 899: because the constant value is too large to be legitimate on this machine. ! 900: So it must be copied into a register with `force_reg' and then the register ! 901: used in the `and'. ! 902: ! 903: (define_expand "zero_extendhisi2" ! 904: [(set (match_operand:SI 0 "register_operand" "") ! 905: (and:SI (subreg:SI ! 906: (match_operand:HI 1 "register_operand" "") ! 907: 0) ! 908: (match_dup 2)))] ! 909: "" ! 910: "operands[2] ! 911: = force_reg (SImode, gen_rtx (CONST_INT, ! 912: VOIDmode, 65535)); ") ! 913: ! 914: ! 915: File: internals, Node: Machine Macros, Next: Config, Prev: Machine Desc, Up: Top ! 916: ! 917: Machine Description Macros ! 918: ************************** ! 919: ! 920: The other half of the machine description is a C header file conventionally ! 921: given the name `tm-MACHINE.h'. The file `tm.h' should be a link to it. ! 922: The header file `config.h' includes `tm.h' and most compiler source files ! 923: include `config.h'. ! 924: ! 925: * Menu: ! 926: ! 927: * Run-time Target:: Defining -m options like -m68000 and -m68020. ! 928: * Storage Layout:: Defining sizes and alignments of data types. ! 929: * Registers:: Naming and describing the hardware registers. ! 930: * Register Classes:: Defining the classes of hardware registers. ! 931: * Stack Layout:: Defining which way the stack grows and by how much. ! 932: * Library Names:: Specifying names of subroutines to call automatically. ! 933: * Addressing Modes:: Defining addressing modes valid for memory operands. ! 934: * Condition Code:: Defining how insns update the condition code. ! 935: * Assembler Format:: Defining how to write insns and pseudo-ops to output. ! 936: * Misc:: Everything else. ! 937: ! 938: ! 939: ! 940: File: internals, Node: Run-time Target, Next: Storage Layout, Prev: Machine Macros, Up: Machine Macros ! 941: ! 942: Run-time Target Specification ! 943: ============================= ! 944: ! 945: `CPP_PREDEFINES' ! 946: Define this to be a string constant containing `-D' options to define ! 947: the predefined macros that identify this machine and system. ! 948: ! 949: For example, on the Sun, one can use the value ! 950: ! 951: "-Dmc68000 -Dsun -Dunix" ! 952: ! 953: `extern int target_flags;' ! 954: This declaration should be present. ! 955: ! 956: `TARGET_...' ! 957: This series of macros is to allow compiler command arguments to enable ! 958: or disable the use of optional features of the target machine. For ! 959: example, one machine description serves both the 68000 and the 68020; ! 960: a command argument tells the compiler whether it should use 68020-only ! 961: instructions or not. This command argument works by means of a macro ! 962: `TARGET_68020' that tests a bit in `target_flags'. ! 963: ! 964: Define a macro `TARGET_FEATURENAME' for each such option. Its ! 965: definition should test a bit in `target_flags'; for example: ! 966: ! 967: #define TARGET_68020 (target_flags & 1) ! 968: ! 969: One place where these macros are used is in the condition-expressions ! 970: of instruction patterns. Note how `TARGET_68020' appears frequently ! 971: in the 68000 machine description file, `m68k.md'. Another place they ! 972: are used is in the definitions of the other macros in the ! 973: `tm-MACHINE.h' file. ! 974: ! 975: `TARGET_SWITCHES' ! 976: This macro defines names of command options to set and clear bits in ! 977: `target_flags'. Its definition is an initializer with a subgrouping ! 978: for each command option. ! 979: ! 980: Each subgrouping contains a string constant, that defines the option ! 981: name, and a number, which contains the bits to set in `target_flags'. ! 982: A negative number says to clear bits instead; the negative of the ! 983: number is which bits to clear. The actual option name is made by ! 984: appending `-m' to the specified name. ! 985: ! 986: One of the subgroupings should have a null string. The number in this ! 987: grouping is the default value for `target_flags'. Any target options ! 988: act starting with that value. ! 989: ! 990: Here is an example which defines `-m68000' and `-m68020' with opposite ! 991: meanings, and picks the latter as the default: ! 992: ! 993: #define TARGET_SWITCHES \ ! 994: { { "68020", 1}, \ ! 995: { "68000", -1}, \ ! 996: { "", 1}} ! 997: ! 998: Sometimes certain combinations of command options do not make sense on a ! 999: particular target machine. You can define a macro `OVERRIDE_OPTIONS' to ! 1000: take account of this. This macro, if defined, is executed once just after ! 1001: all the command options have been parsed. ! 1002: ! 1003: ! 1004: File: internals, Node: Storage Layout, Next: Registers, Prev: Run-time Target, Up: Machine Macros ! 1005: ! 1006: Storage Layout ! 1007: ============== ! 1008: ! 1009: Note that the definitions of the macros in this table which are sizes or ! 1010: alignments measured in bits do not need to be constant. They can be C ! 1011: expressions that refer to static variables, such as the `target_flags'. ! 1012: *note Run-time Target::. ! 1013: ! 1014: `BITS_BIG_ENDIAN' ! 1015: Define this macro if the most significant bit in a byte has the lowest ! 1016: number. This means that bit-field instructions count from the most ! 1017: significant bit. If the machine has no bit-field instructions, this ! 1018: macro is irrelevant. ! 1019: ! 1020: `BYTES_BIG_ENDIAN' ! 1021: Define this macro if the most significant byte in a word has the ! 1022: lowest number. ! 1023: ! 1024: `WORDS_BIG_ENDIAN' ! 1025: Define this macro if, in a multiword object, the most significant word ! 1026: has the lowest number. ! 1027: ! 1028: `BITS_PER_UNIT' ! 1029: Number of bits in an addressable storage unit (byte); normally 8. ! 1030: ! 1031: `BITS_PER_WORD' ! 1032: Number of bits in a word; normally 32. ! 1033: ! 1034: `UNITS_PER_WORD' ! 1035: Number of storage units in a word; normally 4. ! 1036: ! 1037: `POINTER_SIZE' ! 1038: Width of a pointer, in bits. ! 1039: ! 1040: `PARM_BOUNDARY' ! 1041: Alignment required for function parameters on the stack, in bits. ! 1042: ! 1043: `STACK_BOUNDARY' ! 1044: Define this macro if you wish to preserve a certain alignment for the ! 1045: stack pointer at all times. The definition is a C expression for the ! 1046: desired alignment (measured in bits). ! 1047: ! 1048: `FUNCTION_BOUNDARY' ! 1049: Alignment required for a function entry point, in bits. ! 1050: ! 1051: `BIGGEST_ALIGNMENT' ! 1052: Biggest alignment that any data type can require on this machine, in ! 1053: bits. ! 1054: ! 1055: `EMPTY_FIELD_ALIGNMENT' ! 1056: Alignment in bits to be given to a structure bit field that follows an ! 1057: empty field such as `int : 0;'. ! 1058: ! 1059: `STRUCTURE_SIZE_BOUNDARY' ! 1060: Number of bits which any structure or union's size must be a multiple ! 1061: of. Each structure or union's size is rounded up to a multiple of this. ! 1062: ! 1063: If you do not define this macro, the default is the same as ! 1064: `BITS_PER_UNIT'. ! 1065: ! 1066: `STRICT_ALIGNMENT' ! 1067: Define this if instructions will fail to work if given data not on the ! 1068: nominal alignment. If instructions will merely go slower in that ! 1069: case, do not define this macro. ! 1070: ! 1071:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.