Annotation of 43BSDReno/libexec/pcc/ccom.vax/INFO, revision 1.1.1.1

1.1       root        1: Copyright (c) 1985 Regents of the University of California.
                      2: All rights reserved.  The Berkeley software License Agreement
                      3: specifies the terms and conditions for redistribution.
                      4: 
                      5:        @(#)INFO        5.1 (Berkeley) 1/8/86
                      6: 
                      7: HOW TO INTERPRET TEMPLATES:
                      8: 
                      9: Goals (represented by 'visit' fields) indicate the shape of what is
                     10: produced by using a template:
                     11: 
                     12:        Goal            Form of result
                     13: 
                     14:        FOREFF          Can be used for just side effects.  Used for things
                     15:                        like initializing data, or gotos.
                     16:        INAREG          Result can end up in a register.
                     17:        INTAREG         Result can end up in a scratch register.
                     18:        INBREG          Result can end up in an index, address or floating
                     19:                        point register -- not used on the VAX.
                     20:        INTBREG         The same except for temporary index registers.
                     21:        FORCC           Condition codes are set.
                     22:        INTEMP          Computes into a temporary location.
                     23:        FORARG          Computes a function argument onto the stack.
                     24:        FORREW          Forces the code generator to rewrite the tree.
                     25: 
                     26: Shapes are restrictions on operands:
                     27: 
                     28:        Shape           Form of operand
                     29: 
                     30:        SANY            Anything.
                     31: 
                     32:        SAREG           A register.
                     33:        STAREG          A temporary register (one that can be stomped on).
                     34:        SBREG           A secondary register -- not used on the VAX.
                     35:        STBREG          Ditto except this a temporary register.
                     36: 
                     37:        SCON            An int (32-bit or smaller) constant.
                     38:        SCCON           A short (16-bit) constant.
                     39:        SSCON           A char (8-bit) constant.
                     40:        SZERO           The constant 0.
                     41:        SONE            The constant 1.
                     42:        SMONE           The constant -1.
                     43: 
                     44:        SCC             Condition codes.
                     45: 
                     46:        SNAME           A constant address; not on the stack or indirect
                     47:                        through a pointer.
                     48: 
                     49:        SFLD            A bit field.
                     50: 
                     51:        SOREG           A value whose address is the sum of a register and an
                     52:                        offset.  E.g. 8(ap).
                     53:        SSOREG          A 'simple' OREG: not a pointer (e.g. rules out *8(ap)).
                     54:        SWADD           A value with an offset that is larger than a byte.
                     55:        STARNM          A value whose address is at some known address.
                     56:                        An indirect value.  E.g. *_a, *8(ap).
                     57:        STARREG         Indirect through a register with auto-increment or
                     58:                        -decrement.
                     59: 
                     60: Types restrict the type of an operand.  There are two ways of
                     61: representing types in the compiler; one is a specific type that
                     62: indicates things like indirection, and the other is used as a template
                     63: for the first.  To see whether a type matches a template, you call
                     64: ttype().  The template variety is what you see in code templates, and
                     65: has its own typedef, TWORD.  Here are some things you can ask for in
                     66: the way of type templates:
                     67: 
                     68:        Name            What it buys you
                     69: 
                     70:        TANY            Matches anything 'within reason'.
                     71: 
                     72:        TCHAR           Chars.
                     73:        TUCHAR          Unsigned chars.
                     74:        TSHORT          Shorts.
                     75:        TUSHORT         Unsigned shorts.
                     76:        TINT            Ints.
                     77:        TLONG           Longs.  (VAX ints.)
                     78:        TULONG          Unsigned longs.
                     79:        TUNSIGNED       Any unsigned type.
                     80:        TWORD           An integral type the size of an int, or a pointer.
                     81: 
                     82:        TFLOAT          Floats.
                     83:        TDOUBLE         Doubles.
                     84: 
                     85:        TSTRUCT         Structures or unions.
                     86: 
                     87:        TPTRTO          A pointer.  This must be or'ed in with other types;
                     88:                        e.g.  TPTRTO|TFLOAT|TDOUBLE matches pointers to floats
                     89:                        or pointers to doubles.  Can be multiply indirect.
                     90:        TPOINT          Complex types -- things with stars or brackets or etc.
                     91: 
                     92:        WPTR            Pointer to anything except structures/unions.
                     93:        ANYSIGNED       Pointers or signed integral types.
                     94:        ANYUSIGNED      Any unsigned integral type.
                     95:        ANYFIXED        Any integral type (excludes floating point or structs).
                     96: 
                     97: The template may request special resources.  These are indicated by
                     98: things in the needs field of a template:
                     99: 
                    100:        Needs           Resource wanted
                    101: 
                    102:        NAREG           Needs a register.  Can be multiplied up to 4 times
                    103:                        to get up to 4 registers.
                    104:        NBREG           Ditto for secondary registers (not used on the VAX).
                    105:        NASL            Can share a register with the left operand.
                    106:        NASR            Can share a register with the right operand.
                    107:        NTEMP           Needs stack space.  Can be multiplied up to 8 times.
                    108:        EITHER          Don't settle for some of A and some of B.
                    109: 
                    110: The template indicates where the results end up, too.  The symbols in the
                    111: rewrite field have the following meanings:
                    112: 
                    113:        Result          Where the result is
                    114: 
                    115:        RNULL           Don't care about the result -- clobber it.
                    116:        RLEFT           Register associated with the left operand.
                    117:        RRIGHT          Register associated with the right operand.
                    118:        RESC1           First register requested by 'needs'.
                    119:        RESC2           Second register requested by 'needs'.
                    120:        RESC3           Third register requested by 'needs'.
                    121:        RESCC           The condition codes.
                    122:        RNOP            Doesn't make anything -- e.g. initializations, gotos.
                    123: 
                    124: The assembly language templates contain capital letter abbreviations
                    125: which are expanded in context to whatever is useful.  These
                    126: abbreviations may be 1, 2 or 3 characters long; the first character
                    127: codes for the length and generally tells what to do.  A standard second
                    128: or third character often indicates the location of an object in the
                    129: following way:
                    130: 
                    131:        Modifier        Meaning
                    132: 
                    133:        L               Left operand.
                    134:        R               Right operand
                    135:        1, 2, 3         Nth requested register (from 'needs').
                    136: 
                    137: Below are the various abbreviations; 'n' is used to indicate one of the
                    138: standard modifiers:
                    139: 
                    140:        Abbreviation    Rewrites as
                    141: 
                    142:        An              Address of operand n -- the most common abbreviation.
                    143:                        Produces register names, externals, almost everything.
                    144:        Bn              Byte offset in a word (? -- not used on VAX).
                    145:        Cn              Only constants may be written this way.
                    146:        F               The rest of the line is ignored if this value is
                    147:                        only being computed for side effects.
                    148:        H               Field shift; used with masks and bit fields.
                    149:        In              Illegal -- not currently used.
                    150:        L               A label.
                    151:        M               Field mask.
                    152:        N               Field mask, complemented.
                    153:        O[BWLFD]        Opcode string; used to rewrite operands of templates
                    154:                        with generic opcodes like add, sub, mul.  The modifier
                    155:                        is changed to lower case and appended.  For example if
                    156:                        the template is OPFLOAT, the abbreviation is 'OD2' and
                    157:                        the current node's operand is OPMUL, you get 'muld2'.
                    158:        S               Field size.
                    159:        T               Rewriting of the register type is suppressed.  I'm not
                    160:                        sure what's going on but here's the explanation:  'The C
                    161:                        language requires intermediate results to change type.
                    162:                        This is inefficient or impossible on some machines; the
                    163:                        "T" command in match supresses this type changing.'
                    164:        Un              Illegal -- not currently used.
                    165:        Zx              Local abbreviations (zzzcode()).  The x's are spelled
                    166:                        out below:
                    167:        ZA              Used for straightforward conversions and assignments.
                    168:                        Clever perhaps to excess in its coding.
                    169:        ZB              Gets difficult shapes into register prior to a shift.
                    170:        ZC              Interpolates the argument count in a function call.
                    171:        ZD              Get the value of the operand, then increment or
                    172:                        decrement the original, depending on the opcode.
                    173:        ZE              Increment or decrement the operand.
                    174:        ZF              Produces 'd', 'f' or 'l' depending on whether the
                    175:                        right operand (the node itself, for unary operators)
                    176:                        is double, float or long; used for moves into register.
                    177:        ZI              Produces the appropriate conditional branch.
                    178:        ZL              Opcode type [bwlfd] for the left operand.
                    179:        ZN              Produces a jump and a clear to get logical values
                    180:                        converted into 0 or 1.
                    181:        ZP              Just like ZI.
                    182:        ZR              Opcode type [bwlfd] for the right operand.
                    183:        ZS              Generates a structure assignment.
                    184:        ZT              Rounds up structure lengths for struct arguments.
                    185:        ZU              Subtracts the value of the constant right operand from
                    186:                        32 and uses that for unsigned right shift offsets.
                    187:        ZZ              Complements the value of the constant right operand of
                    188:                        a bit instruction and produces it.

unix.superglobalmegacorp.com

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