|
|
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.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.