Annotation of gcc/gcc.info-11, revision 1.1

1.1     ! root        1: This is Info file gcc.info, produced by Makeinfo-1.43 from the input
        !             2: file gcc.texi.
        !             3: 
        !             4:    This file documents the use and the internals of the GNU compiler.
        !             5: 
        !             6:    Copyright (C) 1988, 1989, 1992 Free Software Foundation, Inc.
        !             7: 
        !             8:    Permission is granted to make and distribute verbatim copies of
        !             9: this manual provided the copyright notice and this permission notice
        !            10: are preserved on all copies.
        !            11: 
        !            12:    Permission is granted to copy and distribute modified versions of
        !            13: this manual under the conditions for verbatim copying, provided also
        !            14: that the section entitled "GNU General Public License" is included
        !            15: exactly as in the original, and provided that the entire resulting
        !            16: derived work is distributed under the terms of a permission notice
        !            17: identical to this one.
        !            18: 
        !            19:    Permission is granted to copy and distribute translations of this
        !            20: manual into another language, under the above conditions for modified
        !            21: versions, except that the section entitled "GNU General Public
        !            22: License" and this permission notice may be included in translations
        !            23: approved by the Free Software Foundation instead of in the original
        !            24: English.
        !            25: 
        !            26: 
        !            27: File: gcc.info,  Node: Insn Splitting,  Next: Insn Attributes,  Prev: Expander Definitions,  Up: Machine Desc
        !            28: 
        !            29: Splitting Instructions into Multiple Instructions
        !            30: =================================================
        !            31: 
        !            32:    On machines that have instructions requiring delay slots (*note
        !            33: Delay Slots::.) or that have instructions whose output is not
        !            34: available for multiple cycles (*note Function Units::.), the compiler
        !            35: phases that optimize these cases need to be able to move insns into
        !            36: one-cycle delay slots.  However, some insns may generate more than one
        !            37: machine instruction.  These insns would be unable to be placed into a
        !            38: delay slot.
        !            39: 
        !            40:    It is often possible to write the single insn as a list of
        !            41: individual insns, each corresponding to one machine instruction.  The
        !            42: disadvantage of doing so is that it will cause the compilation to be
        !            43: slower and require more space.  If the resulting insns are too
        !            44: complex, it may also suppress some optimizations.
        !            45: 
        !            46:    The `define_split' definition tells the compiler how to split a
        !            47: complex insn into several simpler insns.  This spilling will be
        !            48: performed if there is a reason to believe that it might improve
        !            49: instruction or delay slot scheduling.  The definition looks like this:
        !            50: 
        !            51:      (define_split
        !            52:        [INSN-PATTERN]
        !            53:        "CONDITION"
        !            54:        [NEW-INSN-PATTERN-1
        !            55:         NEW-INSN-PATTERN-2
        !            56:         ...]
        !            57:        "PREPARATION STATEMENTS")
        !            58: 
        !            59:    INSN-PATTERN is a pattern that needs to be split and CONDITION is
        !            60: the final condition to be tested, as in a `define_insn'.  Any insn
        !            61: matched by a `define_split' must also be matched by a `define_insn' in
        !            62: case it does not need to be split.
        !            63: 
        !            64:    When an insn matching INSN-PATTERN and satisfying CONDITION is
        !            65: found, it is replaced in the insn list with the insns given by
        !            66: NEW-INSN-PATTERN-1, NEW-INSN-PATTERN-2, etc.
        !            67: 
        !            68:    The PREPARATION STATEMENTS are similar to those specified for
        !            69: `define_expand' (*note Expander Definitions::.) and are executed
        !            70: before the new RTL is generated to prepare for the generated code or
        !            71: emit some insns whose pattern is not fixed.
        !            72: 
        !            73:    As a simple case, consider the following example from the AMD 29000
        !            74: machine description, which splits a `sign_extend' from `HImode' to
        !            75: `SImode' into a pair of shift insns:
        !            76: 
        !            77:      (define_split
        !            78:        [(set (match_operand:SI 0 "gen_reg_operand" "")
        !            79:        (sign_extend:SI (match_operand:HI 1 "gen_reg_operand" "")))]
        !            80:        ""
        !            81:        [(set (match_dup 0)
        !            82:        (ashift:SI (match_dup 1)
        !            83:                   (const_int 16)))
        !            84:         (set (match_dup 0)
        !            85:        (ashiftrt:SI (match_dup 0)
        !            86:                     (const_int 16)))]
        !            87:        "
        !            88:      { operands[1] = gen_lowpart (SImode, operands[1]); }")
        !            89: 
        !            90: 
        !            91: File: gcc.info,  Node: Insn Attributes,  Prev: Insn Splitting,  Up: Machine Desc
        !            92: 
        !            93: Instruction Attributes
        !            94: ======================
        !            95: 
        !            96:    In addition to describing the instruction supported by the target
        !            97: machine, the `md' file also defines a group of "attributes" and a set
        !            98: of values for each.  Every generated insn is assigned a value for each
        !            99: attribute.  One possible attribute would be the effect that the insn
        !           100: has on the machine's condition code.  This attribute can then be used
        !           101: by `NOTICE_UPDATE_CC' to track the condition codes.
        !           102: 
        !           103: * Menu:
        !           104: 
        !           105: * Defining Attributes:: Specifying attributes and their values.
        !           106: * Expressions::         Valid expressions for attribute values.
        !           107: * Tagging Insns::       Assigning attribute values to insns.
        !           108: * Attr Example::        An example of assigning attributes.
        !           109: * Insn Lengths::        Computing the length of insns.
        !           110: * Delay Slots::         Defining delay slots required for a machine.
        !           111: * Function Units::      Specifying information for insn scheduling.
        !           112: 
        !           113: 
        !           114: File: gcc.info,  Node: Defining Attributes,  Next: Expressions,  Prev: Insn Attributes,  Up: Insn Attributes
        !           115: 
        !           116: Defining Attributes and their Values
        !           117: ------------------------------------
        !           118: 
        !           119:    The `define_attr' expression is used to define each attribute
        !           120: required by the target machine.  It looks like:
        !           121: 
        !           122:      (define_attr NAME LIST-OF-VALUES DEFAULT)
        !           123: 
        !           124:    NAME is a string specifying the name of the attribute being defined.
        !           125: 
        !           126:    LIST-OF-VALUES is either a string that specifies a comma-separated
        !           127: list of values that can be assigned to the attribute, or a null string
        !           128: to indicate that the attribute takes numeric values.
        !           129: 
        !           130:    DEFAULT is an attribute expression that gives the value of this
        !           131: attribute for insns that match patterns whose definition does not
        !           132: include an explicit value for this attribute.  *Note Attr Example::,
        !           133: for more information on the handling of defaults.
        !           134: 
        !           135:    For each defined attribute, a number of definitions are written to
        !           136: the `insn-attr.h' file.  For cases where an explicit set of values is
        !           137: specified for an attribute, the following are defined:
        !           138: 
        !           139:    * A `#define' is written for the symbol `HAVE_ATTR_NAME'.
        !           140: 
        !           141:    * An enumeral class is defined for `attr_NAME' with elements of the
        !           142:      form `UPPER-NAME_UPPER-VALUE' where the attribute name and value
        !           143:      are first converted to upper case.
        !           144: 
        !           145:    * A function `get_attr_NAME' is defined that is passed an insn and
        !           146:      returns the attribute value for that insn.
        !           147: 
        !           148:    For example, if the following is present in the `md' file:
        !           149: 
        !           150:      (define_attr "type" "branch,fp,load,store,arith" ...)
        !           151: 
        !           152: the following lines will be written to the file `insn-attr.h'.
        !           153: 
        !           154:      #define HAVE_ATTR_type
        !           155:      enum attr_type {TYPE_BRANCH, TYPE_FP, TYPE_LOAD,
        !           156:                 TYPE_STORE, TYPE_ARITH};
        !           157:      extern enum attr_type get_attr_type ();
        !           158: 
        !           159:    If the attribute takes numeric values, no `enum' type will be
        !           160: defined and the function to obtain the attribute's value will return
        !           161: `int'.
        !           162: 
        !           163: 
        !           164: File: gcc.info,  Node: Expressions,  Next: Tagging Insns,  Prev: Defining Attributes,  Up: Insn Attributes
        !           165: 
        !           166: Attribute Expressions
        !           167: ---------------------
        !           168: 
        !           169:    RTL expressions used to define attributes use the codes described
        !           170: above plus a few specific to attribute definitions, to be discussed
        !           171: below.  Attribute value expressions must have one of the following
        !           172: forms:
        !           173: 
        !           174: `(const_int I)'
        !           175:      The integer I specifies the value of a numeric attribute.  I must
        !           176:      be non-negative.
        !           177: 
        !           178:      The value of a numeric attribute can be specified either with a
        !           179:      `const_int' or as an integer represented as a string in
        !           180:      `const_string', `eq_attr' (see below), and `set_attr' (*note
        !           181:      Tagging Insns::.) expressions.
        !           182: 
        !           183: `(const_string VALUE)'
        !           184:      The string VALUE specifies a constant attribute value.  If VALUE
        !           185:      is specified as `"*"', it means that the default value of the
        !           186:      attribute is to be used for the insn containing this expression. 
        !           187:      `"*"' obviously cannot be used in the DEFAULT expression of a
        !           188:      `define_attr'.
        !           189: 
        !           190:      If the attribute whose value is being specified is numeric, VALUE
        !           191:      must be a string containing a non-negative integer (normally
        !           192:      `const_int' would be used in this case).  Otherwise, it must
        !           193:      contain one of the valid values for the attribute.
        !           194: 
        !           195: `(if_then_else TEST TRUE-VALUE FALSE-VALUE)'
        !           196:      TEST specifies an attribute test, whose format is defined below. 
        !           197:      The value of this expression is TRUE-VALUE if TEST is true,
        !           198:      otherwise it is FALSE-VALUE.
        !           199: 
        !           200: `(cond [TEST1 VALUE1 ...] DEFAULT)'
        !           201:      The first operand of this expression is a vector containing an
        !           202:      even number of expressions and consisting of pairs of TEST and
        !           203:      VALUE expressions.  The value of the `cond' expression is that of
        !           204:      the VALUE corresponding to the first true TEST expression.  If
        !           205:      none of the TEST expressions are true, the value of the `cond'
        !           206:      expression is that of the DEFAULT expression.
        !           207: 
        !           208:    TEST expressions can have one of the following forms:
        !           209: 
        !           210: `(const_int I)'
        !           211:      This test is true if I is non-zero and false otherwise.
        !           212: 
        !           213: `(not TEST)'
        !           214: `(ior TEST1 TEST2)'
        !           215: `(and TEST1 TEST2)'
        !           216:      These tests are true if the indicated logical function is true.
        !           217: 
        !           218: `(match_operand:M N PRED CONSTRAINTS)'
        !           219:      This test is true if operand N of the insn whose attribute value
        !           220:      is being determined has mode M (this part of the test is ignored
        !           221:      if M is `VOIDmode') and the function specified by the string PRED
        !           222:      returns a non-zero value when passed operand N and mode M (this
        !           223:      part of the test is ignored if PRED is the null string).
        !           224: 
        !           225:      The CONSTRAINTS operand is ignored and should be the null string.
        !           226: 
        !           227: `(le ARITH1 ARITH2)'
        !           228: `(leu ARITH1 ARITH2)'
        !           229: `(lt ARITH1 ARITH2)'
        !           230: `(ltu ARITH1 ARITH2)'
        !           231: `(gt ARITH1 ARITH2)'
        !           232: `(gtu ARITH1 ARITH2)'
        !           233: `(ge ARITH1 ARITH2)'
        !           234: `(geu ARITH1 ARITH2)'
        !           235: `(ne ARITH1 ARITH2)'
        !           236: `(eq ARITH1 ARITH2)'
        !           237:      These tests are true if the indicated comparison of the two
        !           238:      arithmetic expressions is true.  Arithmetic expressions are
        !           239:      formed with `plus', `minus', `mult', `div', `mod', `abs', `neg',
        !           240:      `and', `ior', `xor', `not', `lshift', `ashift', `lshiftrt', and
        !           241:      `ashiftrt' expressions.
        !           242: 
        !           243:      `const_int' and `symbol_ref' are always valid terms (*note Insn
        !           244:      Lengths::.,for additional forms).  `symbol_ref' is a string
        !           245:      denoting a C expression that yields an `int' when evaluated by the
        !           246:      `get_attr_...' routine.  It should normally be a global variable.
        !           247: 
        !           248: `(eq_attr NAME VALUE)'
        !           249:      NAME is a string specifying the name of an attribute.
        !           250: 
        !           251:      VALUE is a string that is either a valid value for attribute
        !           252:      NAME, a comma-separated list of values, or `!' followed by a
        !           253:      value or list.  If VALUE does not begin with a `!', this test is
        !           254:      true if the value of the NAME attribute of the current insn is in
        !           255:      the list specified by VALUE.  If VALUE begins with a `!', this
        !           256:      test is true if the attribute's value is *not* in the specified
        !           257:      list.
        !           258: 
        !           259:      For example,
        !           260: 
        !           261:           (eq_attr "type" "load,store")
        !           262: 
        !           263:      is equivalent to
        !           264: 
        !           265:           (ior (eq_attr "type" "load") (eq_attr "type" "store"))
        !           266: 
        !           267:      If NAME specifies an attribute of `alternative', it refers to the
        !           268:      value of the compiler variable `which_alternative' (*note Output
        !           269:      Statement::.) and the values must be small integers.  For example,
        !           270: 
        !           271:           (eq_attr "alternative" "2,3")
        !           272: 
        !           273:      is equivalent to
        !           274: 
        !           275:           (ior (eq (symbol_ref "which_alternative") (const_int 2))
        !           276:                (eq (symbol_ref "which_alternative") (const_int 3)))
        !           277: 
        !           278:      Note that, for most attributes, an `eq_attr' test is simplified
        !           279:      in cases where the value of the attribute being tested is known
        !           280:      for all insns matching a particular pattern.  This is by far the
        !           281:      most common case.
        !           282: 
        !           283: 
        !           284: File: gcc.info,  Node: Tagging Insns,  Next: Attr Example,  Prev: Expressions,  Up: Insn Attributes
        !           285: 
        !           286: Assigning Attribute Values to Insns
        !           287: -----------------------------------
        !           288: 
        !           289:    The value assigned to an attribute of an insn is primarily
        !           290: determined by which pattern is matched by that insn (or which
        !           291: `define_peephole' generated it).  Every `define_insn' and
        !           292: `define_peephole' can have an optional last argument to specify the
        !           293: values of attributes for matching insns.  The value of any attribute
        !           294: not specified in a particular insn is set to the default value for
        !           295: that attribute, as specified in its `define_attr'.  Extensive use of
        !           296: default values for attributes permits the specification of the values
        !           297: for only one or two attributes in the definition of most insn
        !           298: patterns, as seen in the example in the next section.
        !           299: 
        !           300:    The optional last argument of `define_insn' and `define_peephole'
        !           301: is a vector of expressions, each of which defines the value for a
        !           302: single attribute.  The most general way of assigning an attribute's
        !           303: value is to use a `set' expression whose first operand is an `attr'
        !           304: expression giving the name of the attribute being set.  The second
        !           305: operand of the `set' is an attribute expression (*note Expressions::.)
        !           306: giving the value of the attribute.
        !           307: 
        !           308:    When the attribute value depends on the `alternative' attribute
        !           309: (i.e., which is the applicable alternative in the constraint of the
        !           310: insn), the `set_attr_alternative' expression can can be used.  It
        !           311: allows the specification of a vector of attribute expressions, one for
        !           312: each alternative.
        !           313: 
        !           314:    When the generality of arbitrary attribute expressions is not
        !           315: required, the simpler `set_attr' expression can be used, which allows
        !           316: specifying a string giving either a single attribute value or a list
        !           317: of attribute values, one for each alternative.
        !           318: 
        !           319:    The form of each of the above specifications is shown below.  In
        !           320: each case, NAME is a string specifying the attribute to be set.
        !           321: 
        !           322: `(set_attr NAME VALUE-STRING)'
        !           323:      VALUE-STRING is either a string giving the desired attribute
        !           324:      value, or a string containing a comma-separated list giving the
        !           325:      values for succeeding alternatives.  The number of elements must
        !           326:      match the number of alternatives in the constraint of the insn
        !           327:      pattern.
        !           328: 
        !           329:      Note that it may be useful to specify `*' for some alternative, in
        !           330:      which case the attribute will assume its default value for insns
        !           331:      matching that alternative.
        !           332: 
        !           333: `(set_attr_alternative NAME [VALUE1 VALUE2 ...])'
        !           334:      Depending on the alternative of the insn, the value will be one
        !           335:      of the specified values.  This is a shorthand for using a `cond'
        !           336:      with tests on the `alternative' attribute.
        !           337: 
        !           338: `(set (attr NAME) VALUE)'
        !           339:      The first operand of this `set' must be the special RTL expression
        !           340:      `attr', whose sole operand is a string giving the name of the
        !           341:      attribute being set.  VALUE is the value of the attribute.
        !           342: 
        !           343:    The following shows three different ways of representing the same
        !           344: attribute value specification:
        !           345: 
        !           346:      (set_attr "type" "load,store,arith")
        !           347:      
        !           348:      (set_attr_alternative "type"
        !           349:                            [(const_string "load") (const_string "store")
        !           350:                             (const_string "arith")])
        !           351:      
        !           352:      (set (attr "type")
        !           353:           (cond [(eq_attr "alternative" "1") (const_string "load")
        !           354:                  (eq_attr "alternative" "2") (const_string "store")]
        !           355:                 (const_string "arith")))
        !           356: 
        !           357:    The `define_asm_attributes' expression provides a mechanism to
        !           358: specify the attributes assigned to insns produced from an `asm'
        !           359: statement. It has the form:
        !           360: 
        !           361:      (define_asm_attributes [ATTR-SETS])
        !           362: 
        !           363: where ATTR-SETS is specified the same as for `define_insn' and
        !           364: `define_peephole' expressions.
        !           365: 
        !           366:    These values will typically be the "worst case" attribute values. 
        !           367: For example, they might indicate that the condition code will be
        !           368: clobbered.
        !           369: 
        !           370:    A specification for a `length' attribute is handled specially.  To
        !           371: compute the length of an `asm' insn, the length specified in the
        !           372: `define_asm_attributes' expression is multiplied by the number of
        !           373: machine instructions specified in the `asm' statement, determined by
        !           374: counting the number of semicolons and newlines in the string. 
        !           375: Therefore, the value of the `length' attribute specified in a
        !           376: `define_asm_attributes' should be the maximum possible length of a
        !           377: single machine instruction.
        !           378: 
        !           379: 
        !           380: File: gcc.info,  Node: Attr Example,  Next: Insn Lengths,  Prev: Tagging Insns,  Up: Insn Attributes
        !           381: 
        !           382: Example of Attribute Specifications
        !           383: -----------------------------------
        !           384: 
        !           385:    The judicious use of defaulting is important in the efficient use of
        !           386: insn attributes.  Typically, insns are divided into "types" and an
        !           387: attribute, customarily called `type', is used to represent this value.
        !           388:  This attribute is normally used only to define the default value for
        !           389: other attributes.  An example will clarify this usage.
        !           390: 
        !           391:    Assume we have a RISC machine with a condition code and in which
        !           392: only full-word operations are performed in registers.  Let us assume
        !           393: that we can divide all insns into loads, stores, (integer) arithmetic
        !           394: operations, floating point operations, and branches.
        !           395: 
        !           396:    Here we will concern ourselves with determining the effect of an
        !           397: insn on the condition code and will limit ourselves to the following
        !           398: possible effects:  The condition code can be set unpredictably
        !           399: (clobbered), not be changed, be set to agree with the results of the
        !           400: operation, or only changed if the item previously set into the
        !           401: condition code has been modified.
        !           402: 
        !           403:    Here is part of a sample `md' file for such a machine:
        !           404: 
        !           405:      (define_attr "type" "load,store,arith,fp,branch" (const_string "arith"))
        !           406:      
        !           407:      (define_attr "cc" "clobber,unchanged,set,change0"
        !           408:                   (cond [(eq_attr "type" "load")
        !           409:                              (const_string "change0")
        !           410:                          (eq_attr "type" "store,branch")
        !           411:                              (const_string "unchanged")
        !           412:                          (eq_attr "type" "arith")
        !           413:                              (if_then_else (match_operand:SI 0 "" "")
        !           414:                                            (const_string "set")
        !           415:                                            (const_string "clobber"))]
        !           416:                         (const_string "clobber")))
        !           417:      
        !           418:      (define_insn ""
        !           419:        [(set (match_operand:SI 0 "general_operand" "=r,r,m")
        !           420:              (match_operand:SI 1 "general_operand" "r,m,r"))]
        !           421:        ""
        !           422:        "@
        !           423:         move %0,%1
        !           424:         load %0,%1
        !           425:         store %0,%1"
        !           426:        [(set_attr "type" "arith,load,store")])
        !           427: 
        !           428:    Note that we assume in the above example that arithmetic operations
        !           429: performed on quantities smaller than a machine word clobber the
        !           430: condition code since they will set the condition code to a value
        !           431: corresponding to the full-word result.
        !           432: 
        !           433: 
        !           434: File: gcc.info,  Node: Insn Lengths,  Next: Delay Slots,  Prev: Attr Example,  Up: Insn Attributes
        !           435: 
        !           436: Computing the Length of an Insn
        !           437: -------------------------------
        !           438: 
        !           439:    For many machines, multiple types of branch instructions are
        !           440: provided, each for different length branch displacements.  In most
        !           441: cases, the assembler will choose the correct instruction to use. 
        !           442: However, when the assembler cannot do so, GCC can when a special
        !           443: attribute, the `length' attribute, is defined.  This attribute must be
        !           444: defined to have numeric values by specifying a null string in its
        !           445: `define_attr'.
        !           446: 
        !           447:    In the case of the `length' attribute, two additional forms of
        !           448: arithmetic terms are allowed in test expressions:
        !           449: 
        !           450: `(match_dup N)'
        !           451:      This refers to the address of operand N of the current insn, which
        !           452:      must be a `label_ref'.
        !           453: 
        !           454: `(pc)'
        !           455:      This refers to the address of the *current* insn.  It might have
        !           456:      been more consistent with other usage to make this the address of
        !           457:      the *next* insn but this would be confusing because the length of
        !           458:      the current insn is to be computed.
        !           459: 
        !           460:    For normal insns, the length will be determined by value of the
        !           461: `length' attribute.  In the case of `addr_vec' and `addr_diff_vec'
        !           462: insn patterns, the length will be computed as the number of vectors
        !           463: multiplied by the size of each vector.
        !           464: 
        !           465:    The following macros can be used to refine the length computation:
        !           466: 
        !           467: `FIRST_INSN_ADDRESS'
        !           468:      When the `length' insn attribute is used, this macro specifies the
        !           469:      value to be assigned to the address of the first insn in a
        !           470:      function.  If not specified, 0 is used.
        !           471: 
        !           472: `ADJUST_INSN_LENGTH (INSN, LENGTH)'
        !           473:      If defined, modifies the length assigned to instruction INSN as a
        !           474:      function of the context in which it is used.  LENGTH is an lvalue
        !           475:      that contains the initially computed length of the insn and
        !           476:      should be updated with the correct length of the insn.  If
        !           477:      updating is required, INSN must not be a varying-length insn.
        !           478: 
        !           479:      This macro will normally not be required.  A case in which it is
        !           480:      required is the ROMP.  On this machine, the size of an `addr_vec'
        !           481:      insn must be increased by two to compensate for the fact that
        !           482:      alignment may be required.
        !           483: 
        !           484:    The routine that returns the value of the `length' attribute,
        !           485: `get_attr_value', can be used by the output routine to determine the
        !           486: form of the branch instruction to be written, as the example below
        !           487: illustrates.
        !           488: 
        !           489:    As an example of the specification of variable-length branches,
        !           490: consider the IBM 360.  If we adopt the convention that a register will
        !           491: be set to the starting address of a function, we can jump to labels
        !           492: within 4K of the start using a four-byte instruction.  Otherwise, we
        !           493: need a six-byte sequence to load the address from memory and then
        !           494: branch to it.
        !           495: 
        !           496:    On such a machine, a pattern for a branch instruction might be
        !           497: specified as follows:
        !           498: 
        !           499:      (define_insn "jump"
        !           500:        [(set (pc)
        !           501:              (label_ref (match_operand 0 "" "")))]
        !           502:        ""
        !           503:        "*
        !           504:      {
        !           505:         return (get_attr_length (insn) == 4
        !           506:                 ? \"b %l0\" : \"l r15,=a(%l0); br r15\");
        !           507:      }"
        !           508:        [(set (attr "length") (if_then_else (lt (match_dup 0) (const_int 4096))
        !           509:                                            (const_int 4)
        !           510:                                            (const_int 6)))])
        !           511: 
        !           512: 
        !           513: File: gcc.info,  Node: Delay Slots,  Next: Function Units,  Prev: Insn Lengths,  Up: Insn Attributes
        !           514: 
        !           515: Delay Slot Scheduling
        !           516: ---------------------
        !           517: 
        !           518:    The insn attribute mechanism can be used to specify the
        !           519: requirements for delay slots, if any, on a target machine.  An
        !           520: instruction is said to require a "delay slot" if some instructions
        !           521: that are physically after the instruction are executed as if they were
        !           522: located before it.  Classic examples are branch and call instructions,
        !           523: which often execute the following instruction before the branch or
        !           524: call is performed.
        !           525: 
        !           526:    On some machines, conditional branch instructions can optionally
        !           527: "annul" instructions in the delay slot.  This means that the
        !           528: instruction will not be executed for certain branch outcomes.  Both
        !           529: instructions that annul if the branch is true and instructions that
        !           530: annul if the branch is false are supported.
        !           531: 
        !           532:    Delay slot scheduling differs from instruction scheduling in that
        !           533: determining whether an instruction needs a delay slot is dependent only
        !           534: on the type of instruction being generated, not on data flow between
        !           535: the instructions.  See the next section for a discussion of
        !           536: data-dependent instruction scheduling.
        !           537: 
        !           538:    The requirement of an insn needing one or more delay slots is
        !           539: indicated via the `define_delay' expression.  It has the following
        !           540: form:
        !           541: 
        !           542:      (define_delay TEST
        !           543:                    [DELAY-1 ANNUL-TRUE-1 ANNUL-FALSE-1
        !           544:                     DELAY-2 ANNUL-TRUE-2 ANNUL-FALSE-2
        !           545:                     ...])
        !           546: 
        !           547:    TEST is an attribute test that indicates whether this
        !           548: `define_delay' applies to a particular insn.  If so, the number of
        !           549: required delay slots is determined by the length of the vector
        !           550: specified as the second argument.  An insn placed in delay slot N must
        !           551: satisfy attribute test DELAY-N.  ANNUL-TRUE-N is an attribute test
        !           552: that specifies which insns may be annulled if the branch is true. 
        !           553: Similarly, ANNUL-FALSE-N specifies which insns in the delay slot may
        !           554: be annulled if the branch is false.  If annulling is not supported for
        !           555: that delay slot, `(nil)' should be coded.
        !           556: 
        !           557:    For example, in the common case where branch and call insns require
        !           558: a single delay slot, which may contain any insn other than a branch or
        !           559: call, the following would be placed in the `md' file:
        !           560: 
        !           561:      (define_delay (eq_attr "type" "branch,call")
        !           562:                    [(eq_attr "type" "!branch,call") (nil) (nil)])
        !           563: 
        !           564:    Multiple `define_delay' expressions may be specified.  In this
        !           565: case, each such expression specifies different delay slot requirements
        !           566: and there must be no insn for which tests in two `define_delay'
        !           567: expressions are both true.
        !           568: 
        !           569:    For example, if we have a machine that requires one delay slot for
        !           570: branches but two for calls,  no delay slot can contain a branch or
        !           571: call insn, and any valid insn in the delay slot for the branch can be
        !           572: annulled if the branch is true, we might represent this as follows:
        !           573: 
        !           574:      (define_delay (eq_attr "type" "branch")
        !           575:         [(eq_attr "type" "!branch,call") (eq_attr "type" "!branch,call") (nil)])
        !           576:      
        !           577:      (define_delay (eq_attr "type" "call")
        !           578:                    [(eq_attr "type" "!branch,call") (nil) (nil)
        !           579:                     (eq_attr "type" "!branch,call") (nil) (nil)])
        !           580: 
        !           581: 
        !           582: File: gcc.info,  Node: Function Units,  Prev: Delay Slots,  Up: Insn Attributes
        !           583: 
        !           584: Specifying Function Units
        !           585: -------------------------
        !           586: 
        !           587:    On most RISC machines, there are instructions whose results are not
        !           588: available for a specific number of cycles.  Common cases are
        !           589: instructions that load data from memory.  On many machines, a pipeline
        !           590: stall will result if the data is referenced too soon after the load
        !           591: instruction.
        !           592: 
        !           593:    In addition, many newer microprocessors have multiple function
        !           594: units, usually one for integer and one for floating point, and often
        !           595: will incur pipeline stalls when a result that is needed is not yet
        !           596: ready.
        !           597: 
        !           598:    The descriptions in this section allow the specification of how much
        !           599: time must elapse between the execution of an instruction and the time
        !           600: when its result is used.  It also allows specification of when the
        !           601: execution of an instruction will delay execution of similar
        !           602: instructions due to function unit conflicts.
        !           603: 
        !           604:    For the purposes of the specifications in this section, a machine is
        !           605: divided into "function units", each of which execute a specific class
        !           606: of instructions.  Function units that accept one instruction each
        !           607: cycle and allow a result to be used in the succeeding instruction
        !           608: (usually via forwarding) need not be specified.  Classic RISC
        !           609: microprocessors will normally have a single function unit, which we can
        !           610: call `memory'.  The newer "superscalar" processors will often have
        !           611: function units for floating point operations, usually at least a
        !           612: floating point adder and multiplier.
        !           613: 
        !           614:    Each usage of a function units by a class of insns is specified
        !           615: with a `define_function_unit' expression, which looks like this:
        !           616: 
        !           617:      (define_function_unit NAME MULTIPLICITY SIMULTANEITY
        !           618:                      TEST READY-DELAY BUSY-DELAY
        !           619:                     [CONFLICT-LIST])
        !           620: 
        !           621:    NAME is a string giving the name of the function unit.
        !           622: 
        !           623:    MULTIPLICITY is an integer specifying the number of identical units
        !           624: in the processor.  If more than one unit is specified, they will be
        !           625: scheduled independently.  Only truly independent units should be
        !           626: counted; a pipelined unit should be specified as a single unit.  (The
        !           627: only common example of a machine that has multiple function units for a
        !           628: single instruction class that are truly independent and not pipelined
        !           629: are the two multiply and two increment units of the CDC 6600.)
        !           630: 
        !           631:    SIMULTANEITY specifies the maximum number of insns that can be
        !           632: executing in each instance of the function unit simultaneously or zero
        !           633: if the unit is pipelined and has no limit.
        !           634: 
        !           635:    All `define_function_unit' definitions referring to function unit
        !           636: NAME must have the same name and values for MULTIPLICITY and
        !           637: SIMULTANEITY.
        !           638: 
        !           639:    TEST is an attribute test that selects the insns we are describing
        !           640: in this definition.  Note that an insn may use more than one function
        !           641: unit and a function unit may be specified in more than one
        !           642: `define_function_unit'.
        !           643: 
        !           644:    READY-DELAY is an integer that specifies the number of cycles after
        !           645: which the result of the instruction can be used without introducing
        !           646: any stalls.
        !           647: 
        !           648:    BUSY-DELAY is an integer that represents the default cost if an
        !           649: insn is scheduled for this unit while the unit is active with another
        !           650: insn.  If SIMULTANEITY is zero, this specification is ignored. 
        !           651: Otherwise, a zero value indicates that these insns execute on NAME in
        !           652: a fully pipelined fashion, even if SIMULTANEITY is non-zero.  A
        !           653: non-zero value indicates that scheduling a new insn on this unit while
        !           654: another is active will incur a cost.  A cost of two indicates a single
        !           655: cycle delay.  For a normal non-pipelined function unit, BUSY-DELAY
        !           656: will be twice READY-DELAY.
        !           657: 
        !           658:    CONFLICT-LIST is an optional list giving detailed conflict costs
        !           659: for this unit.  If specified, it is a list of condition test
        !           660: expressions which are applied to insns already executing in NAME.  For
        !           661: each insn that is in the list, BUSY-DELAY will be used for the conflict
        !           662: cost, while a value of zero will be used for insns not in the list.
        !           663: 
        !           664:    Typical uses of this vector are where a floating point function
        !           665: unit can pipeline either single- or double-precision operations, but
        !           666: not both, or where a memory unit can pipeline loads, but not stores,
        !           667: etc.
        !           668: 
        !           669:    As an example, consider a classic RISC machine where the result of a
        !           670: load instruction is not available for two cycles (a single "delay"
        !           671: instruction is required) and where only one load instruction can be
        !           672: executed simultaneously.  This would be specified as:
        !           673: 
        !           674:      (define_function_unit "memory" 1 1 (eq_attr "type" "load") 2 4)
        !           675: 
        !           676:    For the case of a floating point function unit that can pipeline
        !           677: either single or double precision, but not both, the following could
        !           678: be specified:
        !           679: 
        !           680:      (define_function_unit
        !           681:         "fp" 1 1 (eq_attr "type" "sp_fp") 4 8 (eq_attr "type" "dp_fp")]
        !           682:      (define_function_unit
        !           683:         "fp" 1 1 (eq_attr "type" "dp_fp") 4 8 (eq_attr "type" "sp_fp")]
        !           684: 
        !           685:    *Note:* No code currently exists to avoid function unit conflicts,
        !           686: only data conflicts.  Hence MULTIPLICITY, SIMULTANEITY, BUSY-COST, and
        !           687: CONFLICT-LIST are currently ignored.  When such code is written, it is
        !           688: possible that the specifications for these values may be changed.  It
        !           689: has recently come to our attention that these specifications may not
        !           690: allow modeling of some of the newer "superscalar" processors that have
        !           691: insns using multiple pipelined units.  These insns will cause a
        !           692: potential conflict for the second unit used during their execution and
        !           693: there is no way of representing that conflict.  We welcome any
        !           694: examples of how function unit conflicts work in such processors and
        !           695: suggestions for their representation.
        !           696: 
        !           697: 
        !           698: File: gcc.info,  Node: Machine Macros,  Next: Config,  Prev: Machine Desc,  Up: Top
        !           699: 
        !           700: Machine Description Macros
        !           701: **************************
        !           702: 
        !           703:    In addition to the file `MACHINE.md', a machine description
        !           704: includes a C header file conventionally given the name `MACHINE.h'. 
        !           705: This header file defines numerous macros that convey the information
        !           706: about the target machine that does not fit into the scheme of the
        !           707: `.md' file.  The file `tm.h' should be a link to `MACHINE.h'.  The
        !           708: header file `config.h' includes `tm.h' and most compiler source files
        !           709: include `config.h'.
        !           710: 
        !           711: * Menu:
        !           712: 
        !           713: * Driver::              Controlling how the driver runs the compilation passes.
        !           714: * Run-time Target::     Defining `-m' options like `-m68000' and `-m68020'.
        !           715: * Storage Layout::      Defining sizes and alignments of data.
        !           716: * Type Layout::         Defining sizes and properties of basic user data types.
        !           717: * Registers::           Naming and describing the hardware registers.
        !           718: * Register Classes::    Defining the classes of hardware registers.
        !           719: * Stack and Calling::   Defining which way the stack grows and by how much.
        !           720: * Varargs::            Defining the varargs macros.
        !           721: * Trampolines::         Code set up at run time to enter a nested function.
        !           722: * Library Calls::       Controlling how library routines are implicitly called.
        !           723: * Addressing Modes::    Defining addressing modes valid for memory operands.
        !           724: * Condition Code::      Defining how insns update the condition code.
        !           725: * Costs::               Defining relative costs of different operations.
        !           726: * Sections::            Dividing storage into text, data, and other sections.
        !           727: * PIC::                        Macros for position independent code.
        !           728: * Assembler Format::    Defining how to write insns and pseudo-ops to output.
        !           729: * Debugging Info::      Defining the format of debugging output.
        !           730: * Cross-compilation::   Handling floating point for cross-compilers.
        !           731: * Misc::                Everything else.
        !           732: 
        !           733: 
        !           734: File: gcc.info,  Node: Driver,  Next: Run-time Target,  Prev: Machine Macros,  Up: Machine Macros
        !           735: 
        !           736: Controlling the Compilation Driver, `gcc'
        !           737: =========================================
        !           738: 
        !           739: `SWITCH_TAKES_ARG (CHAR)'
        !           740:      A C expression which determines whether the option `-CHAR' takes
        !           741:      arguments.  The value should be the number of arguments that
        !           742:      option takes--zero, for many options.
        !           743: 
        !           744:      By default, this macro is defined to handle the standard options
        !           745:      properly.  You need not define it unless you wish to add
        !           746:      additional options which take arguments.
        !           747: 
        !           748: `WORD_SWITCH_TAKES_ARG (NAME)'
        !           749:      A C expression which determines whether the option `-NAME' takes
        !           750:      arguments.  The value should be the number of arguments that
        !           751:      option takes--zero, for many options.  This macro rather than
        !           752:      `SWITCH_TAKES_ARG' is used for multi-character option names.
        !           753: 
        !           754:      By default, this macro is defined to handle the standard options
        !           755:      properly.  You need not define it unless you wish to add
        !           756:      additional options which take arguments.
        !           757: 
        !           758: `SWITCHES_NEED_SPACES'
        !           759:      A string-valued C expression which is nonempty if the linker
        !           760:      needs a space between the `-L' or `-o' option and its argument.
        !           761: 
        !           762:      If this macro is not defined, the default value is 0.
        !           763: 
        !           764: `CPP_SPEC'
        !           765:      A C string constant that tells the GNU CC driver program options
        !           766:      to pass to CPP.  It can also specify how to translate options you
        !           767:      give to GNU CC into options for GNU CC to pass to the CPP.
        !           768: 
        !           769:      Do not define this macro if it does not need to do anything.
        !           770: 
        !           771: `SIGNED_CHAR_SPEC'
        !           772:      A C string constant that tells the GNU CC driver program options
        !           773:      to pass to CPP.  By default, this macro is defined to pass the
        !           774:      option `-D__CHAR_UNSIGNED__' to CPP if `char' will be treated as
        !           775:      `unsigned char' by `cc1'.
        !           776: 
        !           777:      Do not define this macro unless you need to override the default
        !           778:      definition.
        !           779: 
        !           780: `CC1_SPEC'
        !           781:      A C string constant that tells the GNU CC driver program options
        !           782:      to pass to `cc1'.  It can also specify how to translate options
        !           783:      you give to GNU CC into options for GNU CC to pass to the `cc1'.
        !           784: 
        !           785:      Do not define this macro if it does not need to do anything.
        !           786: 
        !           787: `CC1PLUS_SPEC'
        !           788:      A C string constant that tells the GNU CC driver program options
        !           789:      to pass to `cc1plus'.  It can also specify how to translate
        !           790:      options you give to GNU CC into options for GNU CC to pass to the
        !           791:      `cc1plus'.
        !           792: 
        !           793:      Do not define this macro if it does not need to do anything.
        !           794: 
        !           795: `ASM_SPEC'
        !           796:      A C string constant that tells the GNU CC driver program options
        !           797:      to pass to the assembler.  It can also specify how to translate
        !           798:      options you give to GNU CC into options for GNU CC to pass to the
        !           799:      assembler.  See the file `sun3.h' for an example of this.
        !           800: 
        !           801:      Do not define this macro if it does not need to do anything.
        !           802: 
        !           803: `ASM_FINAL_SPEC'
        !           804:      A C string constant that tells the GNU CC driver program how to
        !           805:      run any programs which cleanup after the normal assembler. 
        !           806:      Normally, this is not needed.  See the file `mips.h' for an
        !           807:      example of this.
        !           808: 
        !           809:      Do not define this macro if it does not need to do anything.
        !           810: 
        !           811: `LINK_SPEC'
        !           812:      A C string constant that tells the GNU CC driver program options
        !           813:      to pass to the linker.  It can also specify how to translate
        !           814:      options you give to GNU CC into options for GNU CC to pass to the
        !           815:      linker.
        !           816: 
        !           817:      Do not define this macro if it does not need to do anything.
        !           818: 
        !           819: `LIB_SPEC'
        !           820:      Another C string constant used much like `LINK_SPEC'.  The
        !           821:      difference between the two is that `LIB_SPEC' is used at the end
        !           822:      of the command given to the linker.
        !           823: 
        !           824:      If this macro is not defined, a default is provided that loads
        !           825:      the standard C library from the usual place.  See `gcc.c'.
        !           826: 
        !           827: `STARTFILE_SPEC'
        !           828:      Another C string constant used much like `LINK_SPEC'.  The
        !           829:      difference between the two is that `STARTFILE_SPEC' is used at
        !           830:      the very beginning of the command given to the linker.
        !           831: 
        !           832:      If this macro is not defined, a default is provided that loads the
        !           833:      standard C startup file from the usual place.  See `gcc.c'.
        !           834: 
        !           835: `ENDFILE_SPEC'
        !           836:      Another C string constant used much like `LINK_SPEC'.  The
        !           837:      difference between the two is that `ENDFILE_SPEC' is used at the
        !           838:      very end of the command given to the linker.
        !           839: 
        !           840:      Do not define this macro if it does not need to do anything.
        !           841: 
        !           842: `LINK_LIBGCC_SPECIAL'
        !           843:      Define this macro meaning that `gcc' should find the library
        !           844:      `libgcc.a' by hand, rather than passing the argument `-lgcc' to
        !           845:      tell the linker to do the search.
        !           846: 
        !           847: `RELATIVE_PREFIX_NOT_LINKDIR'
        !           848:      Define this macro to tell `gcc' that it should only translate a
        !           849:      `-B' prefix into a `-L' linker option if the prefix indicates an
        !           850:      absolute file name.
        !           851: 
        !           852: `STANDARD_EXEC_PREFIX'
        !           853:      Define this macro as a C string constant if you wish to override
        !           854:      the standard choice of `/usr/local/lib/gcc/' as the default
        !           855:      prefix to try when searching for the executable files of the
        !           856:      compiler.
        !           857: 
        !           858: `MD_EXEC_PREFIX'
        !           859:      If defined, this macro is an additional prefix to try after
        !           860:      `STANDARD_EXEC_PREFIX'.  `MD_EXEC_PREFIX' is not searched when
        !           861:      the `-b' option is used, or the compiler is built as a cross
        !           862:      compiler.
        !           863: 
        !           864: `STANDARD_STARTFILE_PREFIX'
        !           865:      Define this macro as a C string constant if you wish to override
        !           866:      the standard choice of `/usr/local/lib/gcc/' as the default
        !           867:      prefix to try when searching for startup files such as `crt0.o'.
        !           868: 
        !           869: `MD_STARTFILE_PREFIX'
        !           870:      If defined, this macro supplies an additional prefix to try after
        !           871:      the standard prefixes.  `MD_EXEC_PREFIX' is not searched when the
        !           872:      `-b' option is used, or the compiler is built as a cross compiler.
        !           873: 
        !           874: `LOCAL_INCLUDE_DIR'
        !           875:      Define this macro as a C string constant if you wish to override
        !           876:      the standard choice of `/usr/local/include' as the default prefix
        !           877:      to try when searching for local header files.  `LOCAL_INCLUDE_DIR'
        !           878:      comes before `SYSTEM_INCLUDE_DIR' in the search order.
        !           879: 
        !           880:      Cross compilers do not use this macro and do not search either
        !           881:      `/usr/local/include' or its replacement.
        !           882: 
        !           883: `SYSTEM_INCLUDE_DIR'
        !           884:      Define this macro as a C string constant if you wish to specify a
        !           885:      system-specific directory to search for header files before the
        !           886:      standard directory.  `SYSTEM_INCLUDE_DIR' comes before
        !           887:      `STANDARD_INCLUDE_DIR' in the search order.
        !           888: 
        !           889:      Cross compilers do not use this macro and do not search the
        !           890:      directory specified.
        !           891: 
        !           892: `STANDARD_INCLUDE_DIR'
        !           893:      Define this macro as a C string constant if you wish to override
        !           894:      the standard choice of `/usr/include' as the default prefix to
        !           895:      try when searching for header files.
        !           896: 
        !           897:      Cross compilers do not use this macro and do not search either
        !           898:      `/usr/include' or its replacement.
        !           899: 
        !           900: `INCLUDE_DEFAULTS'
        !           901:      Define this macro if you wish to override the entire default
        !           902:      search path for include files.  The default search path includes
        !           903:      `GPLUSPLUS_INCLUDE_DIR', `GCC_INCLUDE_DIR', `LOCAL_INCLUDE_DIR',
        !           904:      `SYSTEM_INCLUDE_DIR', and `STANDARD_INCLUDE_DIR'.  In addition,
        !           905:      the macros `GPLUSPLUS_INCLUDE_DIR' and `GCC_INCLUDE_DIR' are
        !           906:      defined automatically by `Makefile', and specify private search
        !           907:      areas for GCC.  The directory `GPLUSPLUS_INCLUDE_DIR' is used
        !           908:      only for C++ programs.
        !           909: 
        !           910:      The definition should be an initializer for an array of
        !           911:      structures.  Each array element should have two elements: the
        !           912:      directory name (a string constant) and a flag for C++-only
        !           913:      directories.  Mark the end of the array with a null element.  For
        !           914:      example, here is the definition used for VMS:
        !           915: 
        !           916:           #define INCLUDE_DEFAULTS \
        !           917:           {                                       \
        !           918:             { "GNU_GXX_INCLUDE:", 1},             \
        !           919:             { "GNU_CC_INCLUDE:", 0},              \
        !           920:             { "SYS$SYSROOT:[SYSLIB.]", 0},        \
        !           921:             { ".", 0},                            \
        !           922:             { 0, 0}                               \
        !           923:           }
        !           924: 
        !           925:    Here is the order of prefixes tried for exec files:
        !           926: 
        !           927:   1. Any prefixes specified by the user with `-B'.
        !           928: 
        !           929:   2. The environment variable `GCC_EXEC_PREFIX', if any.
        !           930: 
        !           931:   3. The directories specified by the environment variable
        !           932:      `COMPILER_PATH'.
        !           933: 
        !           934:   4. The macro `STANDARD_EXEC_PREFIX'.
        !           935: 
        !           936:   5. `/usr/lib/gcc/'.
        !           937: 
        !           938:   6. The macro `MD_EXEC_PREFIX', if any.
        !           939: 
        !           940:    Here is the order of prefixes tried for startfiles:
        !           941: 
        !           942:   1. Any prefixes specified by the user with `-B'.
        !           943: 
        !           944:   2. The environment variable `GCC_EXEC_PREFIX', if any.
        !           945: 
        !           946:   3. The directories specified by the environment variable
        !           947:      `LIBRARY_PATH'.
        !           948: 
        !           949:   4. The macro `STANDARD_EXEC_PREFIX'.
        !           950: 
        !           951:   5. `/usr/lib/gcc/'.
        !           952: 
        !           953:   6. The macro `MD_EXEC_PREFIX', if any.
        !           954: 
        !           955:   7. The macro `MD_STARTFILE_PREFIX', if any.
        !           956: 
        !           957:   8. The macro `STANDARD_STARTFILE_PREFIX'.
        !           958: 
        !           959:   9. `/lib/'.
        !           960: 
        !           961:  10. `/usr/lib/'.
        !           962: 
        !           963: 
        !           964: File: gcc.info,  Node: Run-time Target,  Next: Storage Layout,  Prev: Driver,  Up: Machine Macros
        !           965: 
        !           966: Run-time Target Specification
        !           967: =============================
        !           968: 
        !           969: `CPP_PREDEFINES'
        !           970:      Define this to be a string constant containing `-D' options to
        !           971:      define the predefined macros that identify this machine and
        !           972:      system.  These macros will be predefined unless the `-ansi'
        !           973:      option is specified.
        !           974: 
        !           975:      In addition, a parallel set of macros are predefined, whose names
        !           976:      are made by appending `__' at the beginning and at the end.  These
        !           977:      `__' macros are permitted by the ANSI standard, so they are
        !           978:      predefined regardless of whether `-ansi' is specified.
        !           979: 
        !           980:      For example, on the Sun, one can use the following value:
        !           981: 
        !           982:           "-Dmc68000 -Dsun -Dunix"
        !           983: 
        !           984:      The result is to define the macros `__mc68000__', `__sun__' and
        !           985:      `__unix__' unconditionally, and the macros `mc68000', `sun' and
        !           986:      `unix' provided `-ansi' is not specified.
        !           987: 
        !           988: `STDC_VALUE'
        !           989:      Define the value to be assigned to the built-in macro `__STDC__'. 
        !           990:      The default is the value `1'.
        !           991: 
        !           992: `extern int target_flags;'
        !           993:      This declaration should be present.
        !           994: 
        !           995: `TARGET_...'
        !           996:      This series of macros is to allow compiler command arguments to
        !           997:      enable or disable the use of optional features of the target
        !           998:      machine.  For example, one machine description serves both the
        !           999:      68000 and the 68020; a command argument tells the compiler
        !          1000:      whether it should use 68020-only instructions or not.  This
        !          1001:      command argument works by means of a macro `TARGET_68020' that
        !          1002:      tests a bit in `target_flags'.
        !          1003: 
        !          1004:      Define a macro `TARGET_FEATURENAME' for each such option.  Its
        !          1005:      definition should test a bit in `target_flags'; for example:
        !          1006: 
        !          1007:           #define TARGET_68020 (target_flags & 1)
        !          1008: 
        !          1009:      One place where these macros are used is in the
        !          1010:      condition-expressions of instruction patterns.  Note how
        !          1011:      `TARGET_68020' appears frequently in the 68000 machine
        !          1012:      description file, `m68k.md'.  Another place they are used is in
        !          1013:      the definitions of the other macros in the `MACHINE.h' file.
        !          1014: 
        !          1015: `TARGET_SWITCHES'
        !          1016:      This macro defines names of command options to set and clear bits
        !          1017:      in `target_flags'.  Its definition is an initializer with a
        !          1018:      subgrouping for each command option.
        !          1019: 
        !          1020:      Each subgrouping contains a string constant, that defines the
        !          1021:      option name, and a number, which contains the bits to set in
        !          1022:      `target_flags'.  A negative number says to clear bits instead;
        !          1023:      the negative of the number is which bits to clear.  The actual
        !          1024:      option name is made by appending `-m' to the specified name.
        !          1025: 
        !          1026:      One of the subgroupings should have a null string.  The number in
        !          1027:      this grouping is the default value for `target_flags'.  Any
        !          1028:      target options act starting with that value.
        !          1029: 
        !          1030:      Here is an example which defines `-m68000' and `-m68020' with
        !          1031:      opposite meanings, and picks the latter as the default:
        !          1032: 
        !          1033:           #define TARGET_SWITCHES \
        !          1034:             { { "68020", 1},      \
        !          1035:               { "68000", -1},     \
        !          1036:               { "", 1}}
        !          1037: 
        !          1038: `TARGET_OPTIONS'
        !          1039:      This macro is similar to `TARGET_SWITCHES' but defines names of
        !          1040:      command options that have values.  Its definition is an
        !          1041:      initializer with a subgrouping for each command option.
        !          1042: 
        !          1043:      Each subgrouping contains a string constant, that defines the
        !          1044:      fixed part of the option name, and the address of a variable. 
        !          1045:      The variable, type `char *', is set to the variable part of the
        !          1046:      given option if the fixed part matches.  The actual option name
        !          1047:      is made by appending `-m' to the specified name.
        !          1048: 
        !          1049:      Here is an example which defines `-mshort-data-NUMBER'.  If the
        !          1050:      given option is `-mshort-data-512', the variable `m88k_short_data'
        !          1051:      will be set to the string `"512"'.
        !          1052: 
        !          1053:           extern char *m88k_short_data;
        !          1054:           #define TARGET_OPTIONS { { "short-data-", &m88k_short_data } }
        !          1055: 
        !          1056: `TARGET_VERSION'
        !          1057:      This macro is a C statement to print on `stderr' a string
        !          1058:      describing the particular machine description choice.  Every
        !          1059:      machine description should define `TARGET_VERSION'.  For example:
        !          1060: 
        !          1061:           #ifdef MOTOROLA
        !          1062:           #define TARGET_VERSION fprintf (stderr, " (68k, Motorola syntax)");
        !          1063:           #else
        !          1064:           #define TARGET_VERSION fprintf (stderr, " (68k, MIT syntax)");
        !          1065:           #endif
        !          1066: 
        !          1067: `OVERRIDE_OPTIONS'
        !          1068:      Sometimes certain combinations of command options do not make
        !          1069:      sense on a particular target machine.  You can define a macro
        !          1070:      `OVERRIDE_OPTIONS' to take account of this.  This macro, if
        !          1071:      defined, is executed once just after all the command options have
        !          1072:      been parsed.
        !          1073: 
        !          1074:      Don't use this macro to turn on various extra optimizations for
        !          1075:      `-O'.  That is what `OPTIMIZATION_OPTIONS' is for.
        !          1076: 
        !          1077: `OPTIMIZATION_OPTIONS (LEVEL)'
        !          1078:      Some machines may desire to change what optimizations are
        !          1079:      performed for various optimization levels.   This macro, if
        !          1080:      defined, is executed once just after the optimization level is
        !          1081:      determined and before the remainder of the command options have
        !          1082:      been parsed.  Values set in this macro are used as the default
        !          1083:      values for the other command line options.
        !          1084: 
        !          1085:      LEVEL is the optimization level specified; 2 if -O2 is specified,
        !          1086:      1 if -O is specified, and 0 if neither is specified.
        !          1087: 
        !          1088:      *Do not examine `write_symbols' in this macro!* The debugging
        !          1089:      options are not supposed to alter the generated code.
        !          1090: 
        !          1091: 

unix.superglobalmegacorp.com

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