|
|
1.1 root 1: # To unbundle, sh this file
2: echo 3binstr.c 1>&2
3: sed 's/.//' >3binstr.c <<'//GO.SYSIN DD 3binstr.c'
4: -From research!whuxld!bjb Thu Mar 8 13:23 EST 1984*
5: -To: research!seki!pjw
6: -
7: -/*
8: - * static char *ID_opsout = "@(#) ops.out: 1.5 4/26/83";
9: - */
10: -{"mcomb", IS25|INSTRB, DYAOP1-256, 8, 0x8bL},
11: -{"mcomh", IS25|INSTRH, DYAOP1-256, 8, 0x8aL},
12: -{"mcomw", IS25|INSTRW, DYAOP1-256, 8, 0x88L},
13: -{"movzbh", IS25|INSTRBH, DYAOP7-256, 8, 0x87L},
14: -{"movzbw", IS25|INSTRBW, DYAOP7-256, 8, 0x87L},
15: -{"movzhw", IS25|INSTRHW, DYAOP7-256, 8, 0x86L},
16: -{"pushzb", IS25|INSTRB, PUSHOP1-256, 8, 0x87L},
17: -{"pushzh", IS25|INSTRHW, PUSHOP1-256, 8, 0x84L},
18: -{"movaw", IS25|INSTRW, DYAOP2-256, 8, 0x4L},
19: -{"pushaw", IS25|INSTRW, MONOP2-256, 8, 0xe0L},
20: -{"andb2", IS25|INSTRB, DYAOP1-256, 8, 0xbbL},
21: -{"andh2", IS25|INSTRH, DYAOP1-256, 8, 0xbaL},
22: -{"andw2", IS25|INSTRW, DYAOP1-256, 8, 0xb8L},
23: -{"andb3", IS25|INSTRB, TRIOP1-256, 8, 0xfbL},
24: -{"andh3", IS25|INSTRH, TRIOP1-256, 8, 0xfaL},
25: -{"andw3", IS25|INSTRW, TRIOP1-256, 8, 0xf8L},
26: -{"orb2", IS25|INSTRB, DYAOP1-256, 8, 0xb3L},
27: -{"orh2", IS25|INSTRH, DYAOP1-256, 8, 0xb2L},
28: -{"orw2", IS25|INSTRW, DYAOP1-256, 8, 0xb0L},
29: -{"orb3", IS25|INSTRB, TRIOP1-256, 8, 0xf3L},
30: -{"orh3", IS25|INSTRH, TRIOP1-256, 8, 0xf2L},
31: -{"orw3", IS25|INSTRW, TRIOP1-256, 8, 0xf0L},
32: -{"xorb2", IS25|INSTRB, DYAOP1-256, 8, 0xb7L},
33: -{"xorh2", IS25|INSTRH, DYAOP1-256, 8, 0xb6L},
34: -{"xorw2", IS25|INSTRW, DYAOP1-256, 8, 0xb4L},
35: -{"xorb3", IS25|INSTRB, TRIOP1-256, 8, 0xf7L},
36: -{"xorh3", IS25|INSTRH, TRIOP1-256, 8, 0xf6L},
37: -{"xorw3", IS25|INSTRW, TRIOP1-256, 8, 0xf4L},
38: -{"bitb", IS25|INSTRB, CMPOP2-256, 8, 0x3bL},
39: -{"bith", IS25|INSTRH, CMPOP2-256, 8, 0x3aL},
40: -{"bitw", IS25|INSTRW, CMPOP2-256, 8, 0x38L},
41: -{"llsw2", IS25|INSTRW, DYAOP3-256, 16, 0xd0L},
42: -{"llsw3", IS25|INSTRW, SHFTOP1-256, 16, 0xd0L},
43: -{"lrsw2", IS25|INSTRBW, DYAOP3-256, 16, 0xd4L},
44: -{"lrsw3", IS25|INSTRBW, SHFTOP1-256, 16, 0xd4L},
45: -{"movb", IS25|INSTRB, DYAOP4-256, 16, 0x8387L},
46: -{"movh", IS25|INSTRH, DYAOP4-256, 16, 0x8286L},
47: -{"movw", IS25|INSTRW, DYAOP4-256, 16, 0x8084L},
48: -{"movbbh", IS25|INSTRBH, DYAOP5-256, 16, 0x87E7L},
49: -{"movbbw", IS25|INSTRBW, DYAOP5-256, 16, 0x87E7L},
50: -{"movbhw", IS25|INSTRHW, DYAOP5-256, 8, 0x86L},
51: -{"movthb", IS25|INSTRHB, DYAOP5-256, 8, 0x86L},
52: -{"movtwb", IS25|INSTRWB, DYAOP5-256, 8, 0x84L},
53: -{"movtwh", IS25|INSTRWH, DYAOP5-256, 8, 0x84L},
54: -{"mnegh", IS25|INSTRH, DYAOP1-256, 8, 0x8eL},
55: -{"mnegw", IS25|INSTRW, DYAOP1-256, 8, 0x8cL},
56: -{"pushbb", IS25|INSTRBW, PUSHOP1-256, 8, 0x87L},
57: -{"pushbh", IS25|INSTRH, PUSHOP1-256, 8, 0x86L},
58: -{"pushw", IS25|INSTRW, MONOP1-256, 8, 0xa0L},
59: -{"addb2", IS25|INSTRB, DYAOP6-256, 16, 0x939fL},
60: -{"addh2", IS25|INSTRH, DYAOP6-256, 16, 0x929eL},
61: -{"addw2", IS25|INSTRW, DYAOP6-256, 16, 0x909cL},
62: -{"addb3", IS25|INSTRB, TRIOP1-256, 8, 0xdfL},
63: -{"addh3", IS25|INSTRH, TRIOP1-256, 8, 0xdeL},
64: -{"addw3", IS25|INSTRW, TRIOP1-256, 8, 0xdcL},
65: -{"subb2", IS25|INSTRB, DYAOP6-256, 16, 0x97bfL},
66: -{"subh2", IS25|INSTRH, DYAOP6-256, 16, 0x96beL},
67: -{"subw2", IS25|INSTRW, DYAOP6-256, 16, 0x94bcL},
68: -{"subb3", IS25|INSTRB, TRIOP1-256, 8, 0xffL},
69: -{"subh3", IS25|INSTRH, TRIOP1-256, 8, 0xfeL},
70: -{"subw3", IS25|INSTRW, TRIOP1-256, 8, 0xfcL},
71: -{"mulw2", IS25|INSTRW, DYAOP1-256, 8, 0xa8L},
72: -{"umulw2", IS25|INSTRW, DYAOP8-256, 8, 0xa8L},
73: -{"mulw3", IS25|INSTRW, TRIOP1-256, 8, 0xe8L},
74: -{"umulw3", IS25|INSTRW, TRIOP2-256, 8, 0xe8L},
75: -{"divw2", IS25|INSTRW, DYAOP1-256, 8, 0xacL},
76: -{"udivw2", IS25|INSTRW, DYAOP8-256, 8, 0xacL},
77: -{"divw3", IS25|INSTRW, TRIOP1-256, 8, 0xecL},
78: -{"udivw3", IS25|INSTRW, TRIOP2-256, 8, 0xecL},
79: -{"modw2", IS25|INSTRW, DYAOP1-256, 8, 0xa4L},
80: -{"umodw2", IS25|INSTRW, DYAOP8-256, 8, 0xa4L},
81: -{"modw3", IS25|INSTRW, TRIOP1-256, 8, 0xe4L},
82: -{"umodw3", IS25|INSTRW, TRIOP2-256, 8, 0xe4L},
83: -#if FLOAT
84: -{"fadds2", INSTRW, FPDYAOP1-256, 8, 0x31L},
85: -{"fsubs2", INSTRW, FPDYAOP1-256, 8, 0x41L},
86: -{"fmuls2", INSTRW, FPDYAOP1-256, 8, 0x51L},
87: -{"fdivs2", INSTRW, FPDYAOP1-256, 8, 0x61L},
88: -{"movhs", INSTRHW, FPDYAOP2-256, 8, 0x71L},
89: -{"movws", INSTRW, FPDYAOP2-256, 8, 0x81L},
90: -{"movss", INSTRW, FPDYAOP1-256, 8, 0x91L},
91: -{"movsd", INSTRW, FPDYAOP1-256, 8, 0xa1L},
92: -{"movsh", INSTRW, FPDYAOP1-256, 8, 0xb1L},
93: -{"movtsh", INSTRW, FPDYAOP1-256, 8, 0xc1L},
94: -{"movsw", INSTRW, FPDYAOP1-256, 8, 0xd1L},
95: -{"movtsw", INSTRW, FPDYAOP1-256, 8, 0xe1L},
96: -{"fcmps", INSTRW, FPCMPOP1-256, 8, 0xf1L},
97: -{"faddd2", INSTRD, FPDYAOP1-256, 8, 0x35L},
98: -{"fsubd2", INSTRD, FPDYAOP1-256, 8, 0x45L},
99: -{"fmuld2", INSTRD, FPDYAOP1-256, 8, 0x55L},
100: -{"fdivd2", INSTRD, FPDYAOP1-256, 8, 0x65L},
101: -{"movhd", INSTRH, FPDYAOP2-256, 8, 0x75L},
102: -{"movwd", INSTRW, FPDYAOP2-256, 8, 0x85L},
103: -{"movds", INSTRD, FPDYAOP1-256, 8, 0x95L},
104: -{"movdd", INSTRD, FPDYAOP1-256, 8, 0xa5L},
105: -{"movdh", INSTRD, FPDYAOP1-256, 8, 0xb5},
106: -{"movtdh", INSTRD, FPDYAOP1-256, 8, 0xc5},
107: -{"movdw", INSTRD, FPDYAOP1-256, 8, 0xd5L},
108: -{"movtdw", INSTRD, FPDYAOP1-256, 8, 0xe5L},
109: -{"fcmpd", INSTRD, FPCMPOP1-256, 8, 0xf5L},
110: -{"fadds3", INSTRW, FPTRIOP1-256, 8, 0x39L},
111: -{"fsubs3", INSTRW, FPTRIOP1-256, 8, 0x49L},
112: -{"fmuls3", INSTRW, FPTRIOP1-256, 8, 0x59L},
113: -{"fdivs3", INSTRW, FPTRIOP1-256, 8, 0x69L},
114: -{"faddd3", INSTRD, FPTRIOP1-256, 8, 0x79L},
115: -{"fsubd3", INSTRD, FPTRIOP1-256, 8, 0x89L},
116: -{"fmuld3", INSTRD, FPTRIOP1-256, 8, 0x99L},
117: -{"fdivd3", INSTRD, FPTRIOP1-256, 8, 0xa9L},
118: -#endif
119: -{"alsw2", IS25|INSTRBW, DYAOP3-256, 16, 0xc0L},
120: -{"alsw3", IS25|INSTRBW, SHFTOP1-256, 16, 0xc0L},
121: -{"arsw2", IS25|INSTRW, DYAOP3-256, 16, 0xc4L},
122: -{"arsw3", IS25|INSTRW, SHFTOP1-256, 16, 0xc4L},
123: -{"cmpb", IS25|INSTRB, CMPOP1-256, 16, 0x2b3fL},
124: -{"cmph", IS25|INSTRH, CMPOP1-256, 16, 0x2a3eL},
125: -{"cmpw", IS25|INSTRW, CMPOP1-256, 16, 0x283cL},
126: -{"jbc", IS25|INSTRW, JMBOP1-256, 8, 0x38L},
127: -{"jbs", IS25|INSTRW, JMBOP1-256, 8, 0x38L},
128: -{"rsb", IS25|INSTRW, ZEROP1-256, 8, 0x78L},
129: -{"acjl", IS25|INSTRW, LOOPOP1-256, 24, 0xb83c4bL},
130: -{"acjlu", IS25|INSTRW, LOOPOP1-256, 24, 0xb83c5bL},
131: -{"acjle", IS25|INSTRW, LOOPOP1-256, 24, 0xb83c4fL},
132: -{"acjleu", IS25|INSTRW, LOOPOP1-256, 24, 0xb83c5fL},
133: -{"atjnzb", IS25|INSTRW, LOOPOP2-256, 8, 0x2bL},
134: -{"atjnzh", IS25|INSTRW, LOOPOP2-256, 8, 0x2aL},
135: -{"atjnzw", IS25|INSTRW, LOOPOP2-256, 8, 0x28L},
136: -{"movblb", IS25|INSTRB, BLOCKOP-256, 8, 0x87L},
137: -{"movblh", IS25|INSTRH, BLOCKOP-256, 8, 0x86L},
138: -{"movblw", IS25|INSTRW, ZEROP1-256, 16, 0x3019L},
139: -{"call", IS25|INSTRW, CALOP1-256, 8, 0x2cL},
140: -{"save", IS25|INSTRW, SAVOP1-256, 8, 0x10L},
141: -{"ret", IS25|INSTRW, RETOP1-256, 16, 0x0818L},
142: -{"insv", IS25|INSTRW, FLDOP1-256, 8, 0xc8L},
143: -{"extzv", IS25|INSTRW, FLDOP2-256, 8, 0xccL},
144: -{"jz", IS25|INSTRW, JMPOP1-256, 16, 0x777fL},
145: -{"jnz", IS25|INSTRW, JMPOP1-256, 16, 0x7f77L},
146: -{"jpos", IS25|INSTRW, JMPOP1-256, 16, 0x4f47L},
147: -{"jnpos", IS25|INSTRW, JMPOP1-256, 16, 0x474fL},
148: -{"jneg", IS25|INSTRW, JMPOP1-256, 16, 0x434bL},
149: -{"jnneg", IS25|INSTRW, JMPOP1-256, 16, 0x4b43L},
150: -{"je", IS25|INSTRW, JMPOP1-256, 16, 0x777fL},
151: -{"jne", IS25|INSTRW, JMPOP1-256, 16, 0x7f77L},
152: -{"jl", IS25|INSTRW, JMPOP1-256, 16, 0x434bL},
153: -{"jle", IS25|INSTRW, JMPOP1-256, 16, 0x474fL},
154: -{"jg", IS25|INSTRW, JMPOP1-256, 16, 0x4f47L},
155: -{"jge", IS25|INSTRW, JMPOP1-256, 16, 0x4b43L},
156: -{"jlu", IS25|INSTRW, JMPOP1-256, 16, 0x535bL},
157: -{"jleu", IS25|INSTRW, JMPOP1-256, 16, 0x575fL},
158: -{"jgu", IS25|INSTRW, JMPOP1-256, 16, 0x5f57L},
159: -{"jgeu", IS25|INSTRW, JMPOP1-256, 16, 0x5b53L},
160: -{"jmp", IS25|INSTRW, JMPOP1-256, 8, 0x7bL},
161: -{"jsb", IS25|INSTRW, JSBOP1-256, 16, 0x3437L},
162: -{"BEB", INSTRB, JMPOP1-256, 8, 0x7fL},
163: -{"BNEB", INSTRB, JMPOP1-256, 8, 0x77L},
164: -{"BLB", INSTRB, JMPOP1-256, 8, 0x4bL},
165: -{"BLEB", INSTRB, JMPOP1-256, 8, 0x4fL},
166: -{"BGB", INSTRB, JMPOP1-256, 8, 0x47L},
167: -{"BGEB", INSTRB, JMPOP1-256, 8, 0x43L},
168: -{"BLUB", INSTRB, JMPOP1-256, 8, 0x5bL},
169: -{"BLEUB", INSTRB, JMPOP1-256, 8, 0x5fL},
170: -{"BGUB", INSTRB, JMPOP1-256, 8, 0x57L},
171: -{"BGEUB", INSTRB, JMPOP1-256, 8, 0x53L},
172: -{"BRB", INSTRB, JMPOP1-256, 8, 0x7bL},
173: -{"BSBB", INSTRB, BSBOP1-256, 8, 0x37L},
174: -{"BEH", INSTRH, JMPOP1-256, 8, 0x7eL},
175: -{"BNEH", INSTRH, JMPOP1-256, 8, 0x76L},
176: -{"BLH", INSTRH, JMPOP1-256, 8, 0x4aL},
177: -{"BLEH", INSTRH, JMPOP1-256, 8, 0x4eL},
178: -{"BGH", INSTRH, JMPOP1-256, 8, 0x46L},
179: -{"BGEH", INSTRH, JMPOP1-256, 8, 0x42L},
180: -{"BLUH", INSTRH, JMPOP1-256, 8, 0x5aL},
181: -{"BLEUH", INSTRH, JMPOP1-256, 8, 0x5eL},
182: -{"BGUH", INSTRH, JMPOP1-256, 8, 0x56L},
183: -{"BGEUH", INSTRH, JMPOP1-256, 8, 0x52L},
184: -{"BRH", INSTRH, JMPOP1-256, 8, 0x7aL},
185: -{"BSBH", INSTRH, BSBOP1-256, 8, 0x36L},
186: -{"CALL", INSTRW, CALOP2-256, 8, 0x2cL},
187: -{"SAVE", INSTRW, SAVOP2-256, 8, 0x10L},
188: -{"RESTORE", INSTRW, SAVOP2-256, 8, 0x18L},
189: -{"RET", INSTRW, ZEROP1-256, 8, 0x08L},
190: -{"GATE", INSTRW, ZEROP1-256, 16, 0x3061L},
191: -{"RETG", INSTRW, ZEROP1-256, 16, 0x3045L},
192: -{"CALLPS", INSTRW, ZEROP1-256, 16, 0x30acL},
193: -{"RETPS", INSTRW, ZEROP1-256, 16, 0x30c8L},
194: -{"MVERNO", INSTRW, ZEROP1-256, 16, 0x3009L}, /* 12 */
195: -{"DISVJMP", INSTRW, ZEROP1-256, 16, 0x3013L},
196: -{"ENBVJMP", INSTRW, ZEROP1-256, 16, 0x300dL},
197: -{"STREND", INSTRW, ZEROP1-256, 16, 0x301fL},
198: -{"STRCPY", INSTRW, ZEROP1-256, 16, 0x3035L},
199: -{"SLFTST", INSTRW, ZEROP1-256, 16, 0x303cL},
200: -{"WAIT", INSTRW, ZEROP1-256, 8, 0x2fL},
201: -{"BPT", INSTRW, ZEROP1-256, 8, 0x2eL},
202: -{"SWAPWI", INSTRW, MONOP1-256, 8, 0x1cL},
203: -{"SWAPHI", INSTRH, MONOP1-256, 8, 0x1eL},
204: -{"SWAPBI", INSTRB, MONOP1-256, 8, 0x1fL},
205: -{"POPW", INSTRW, MONOP3-256, 8, 0x20L},
206: -{"TSTW", INSTRW, MONOP1-256, 8, 0x28L},
207: -{"TSTH", INSTRH, MONOP1-256, 8, 0x2aL},
208: -{"TSTB", INSTRB, MONOP1-256, 8, 0x2bL},
209: -{"RGEQ", INSTRW, ZEROP1-256, 8, 0x40L},
210: -{"RGEQU", INSTRW, ZEROP1-256, 8, 0x50L},
211: -{"RGTR", INSTRW, ZEROP1-256, 8, 0x44L},
212: -{"RLSS", INSTRW, ZEROP1-256, 8, 0x48L},
213: -{"RLSSU", INSTRW, ZEROP1-256, 8, 0x58L},
214: -{"RLEQ", INSTRW, ZEROP1-256, 8, 0x4cL},
215: -{"RCC", INSTRW, ZEROP1-256, 8, 0x50L},
216: -{"RGTRU", INSTRW, ZEROP1-256, 8, 0x54L},
217: -{"RCS", INSTRW, ZEROP1-256, 8, 0x58L},
218: -{"RLEQU", INSTRW, ZEROP1-256, 8, 0x5cL},
219: -{"RVC", INSTRW, ZEROP1-256, 8, 0x60L},
220: -{"BVCH", INSTRH, JMPOP1-256, 8, 0x62L},
221: -{"BVCB", INSTRB, JMPOP1-256, 8, 0x63L},
222: -{"RVS", INSTRW, ZEROP1-256, 8, 0x68L},
223: -{"BVSH", INSTRH, JMPOP1-256, 8, 0x6aL},
224: -{"BVSB", INSTRB, JMPOP1-256, 8, 0x6bL},
225: -{"BCCB", INSTRB, JMPOP1-256, 8, 0x53L},
226: -{"BCSB", INSTRB, JMPOP1-256, 8, 0x5bL},
227: -{"BCCH", INSTRH, JMPOP1-256, 8, 0x52L},
228: -{"BCSH", INSTRH, JMPOP1-256, 8, 0x5aL},
229: -{"BEQLBX", INSTRB, JMPOP1-256, 8, 0x6fL},
230: -{"BEQLHX", INSTRH, JMPOP1-256, 8, 0x6eL},
231: -{"BNEQBX", INSTRB, JMPOP1-256, 8, 0x67L},
232: -{"BNEQHX", INSTRH, JMPOP1-256, 8, 0x66L},
233: -{"JMP", INSTRW, JMPOP1-256, 8, 0x24L},
234: -{"JSB", INSTRW, JSBOP2-256, 8, 0x34L},
235: -{"RNEQ", INSTRW, ZEROP1-256, 8, 0x74L},
236: -{"RNEQU", INSTRW, ZEROP1-256, 8, 0x64L},
237: -{"NOP", INSTRW, ZEROP1-256, 8, 0x70L},
238: -{"NOP3", INSTRW, ZEROP1-256, 24, 0x720000L},
239: -{"NOP2", INSTRW, ZEROP1-256, 16, 0x7300L},
240: -{"REQL", INSTRW, ZEROP1-256, 8, 0x7cL},
241: -{"REQLU", INSTRW, ZEROP1-256, 8, 0x6cL},
242: -{"CLRW", INSTRW, MONOP1-256, 8, 0x80L},
243: -{"CLRH", INSTRH, MONOP1-256, 8, 0x82L},
244: -{"CLRB", INSTRB, MONOP1-256, 8, 0x83L},
245: -{"MNEGB", INSTRB, DYAOP1-256, 8, 0x8fL},
246: -{"INCW", INSTRW, MONOP1-256, 8, 0x90L},
247: -{"INCH", INSTRH, MONOP1-256, 8, 0x92L},
248: -{"INCB", INSTRB, MONOP1-256, 8, 0x93L},
249: -{"DECW", INSTRW, MONOP1-256, 8, 0x94L},
250: -{"DECH", INSTRH, MONOP1-256, 8, 0x96L},
251: -{"DECB", INSTRB, MONOP1-256, 8, 0x97L},
252: -{"MODH2", INSTRH, DYAOP1-256, 8, 0xa6L},
253: -{"MODB2", INSTRB, DYAOP1-256, 8, 0xa7L},
254: -{"MULH2", INSTRH, DYAOP1-256, 8, 0xaaL},
255: -{"MULB2", INSTRB, DYAOP1-256, 8, 0xabL},
256: -{"DIVH2", INSTRH, DYAOP1-256, 8, 0xaeL},
257: -{"DIVB2", INSTRB, DYAOP1-256, 8, 0xafL},
258: -{"ALSW3", INSTRW, TRIOP1-256, 8, 0xc0L},
259: -{"ARSW3", INSTRW, TRIOP1-256, 8, 0xc4L},
260: -{"ARSH3", INSTRH, TRIOP1-256, 8, 0xc6L},
261: -{"ARSB3", INSTRB, TRIOP1-256, 8, 0xc7L},
262: -{"LLSW3", INSTRW, TRIOP1-256, 8, 0xd0L},
263: -{"LLSH3", INSTRH, TRIOP1-256, 8, 0xd2L},
264: -{"LLSB3", INSTRB, TRIOP1-256, 8, 0xd3L},
265: -{"LRSW3", INSTRW, TRIOP1-256, 8, 0xd4L},
266: -{"ROTW", INSTRW, TRIOP1-256, 8, 0xd8L},
267: -{"MODH3", INSTRH, TRIOP1-256, 8, 0xe6L},
268: -{"MODB3", INSTRB, TRIOP1-256, 8, 0xe7L},
269: -{"MULH3", INSTRH, TRIOP1-256, 8, 0xeaL},
270: -{"MULB3", INSTRB, TRIOP1-256, 8, 0xebL},
271: -{"DIVH3", INSTRH, TRIOP1-256, 8, 0xeeL},
272: -{"DIVB3", INSTRB, TRIOP1-256, 8, 0xefL},
273: -{"MCOMB", INSTRB, DYAOP1-256, 8, 0x8bL},
274: -{"MCOMH", INSTRH, DYAOP1-256, 8, 0x8aL},
275: -{"MCOMW", INSTRW, DYAOP1-256, 8, 0x88L},
276: -{"MOVTRW", INSTRW, DYAOP2-256, 8, 0xcL},
277: -{"MOVAW", INSTRW, DYAOP2-256, 8, 0x4L},
278: -{"PUSHAW", INSTRW, MONOP2-256, 8, 0xe0L},
279: -{"ANDB2", INSTRB, DYAOP1-256, 8, 0xbbL},
280: -{"ANDH2", INSTRH, DYAOP1-256, 8, 0xbaL},
281: -{"ANDW2", INSTRW, DYAOP1-256, 8, 0xb8L},
282: -{"ANDB3", INSTRB, TRIOP1-256, 8, 0xfbL},
283: -{"ANDH3", INSTRH, TRIOP1-256, 8, 0xfaL},
284: -{"ANDW3", INSTRW, TRIOP1-256, 8, 0xf8L},
285: -{"ORB2", INSTRB, DYAOP1-256, 8, 0xb3L},
286: -{"ORH2", INSTRH, DYAOP1-256, 8, 0xb2L},
287: -{"ORW2", INSTRW, DYAOP1-256, 8, 0xb0L},
288: -{"ORB3", INSTRB, TRIOP1-256, 8, 0xf3L},
289: -{"ORH3", INSTRH, TRIOP1-256, 8, 0xf2L},
290: -{"ORW3", INSTRW, TRIOP1-256, 8, 0xf0L},
291: -{"XORB2", INSTRB, DYAOP1-256, 8, 0xb7L},
292: -{"XORH2", INSTRH, DYAOP1-256, 8, 0xb6L},
293: -{"XORW2", INSTRW, DYAOP1-256, 8, 0xb4L},
294: -{"XORB3", INSTRB, TRIOP1-256, 8, 0xf7L},
295: -{"XORH3", INSTRH, TRIOP1-256, 8, 0xf6L},
296: -{"XORW3", INSTRW, TRIOP1-256, 8, 0xf4L},
297: -{"BITB", INSTRB, CMPOP2-256, 8, 0x3bL},
298: -{"BITH", INSTRH, CMPOP2-256, 8, 0x3aL},
299: -{"BITW", INSTRW, CMPOP2-256, 8, 0x38L},
300: -{"MOVB", INSTRB, DYAOP4-256, 8, 0x87L},
301: -{"MOVH", INSTRH, DYAOP4-256, 8, 0x86L},
302: -{"MOVW", INSTRW, DYAOP4-256, 8, 0x84L},
303: -{"MNEGH", INSTRH, DYAOP1-256, 8, 0x8eL},
304: -{"MNEGW", INSTRW, DYAOP1-256, 8, 0x8cL},
305: -{"PUSHW", INSTRW, MONOP1-256, 8, 0xa0L},
306: -{"ADDB2", INSTRB, DYAOP6-256, 8, 0x9fL},
307: -{"ADDH2", INSTRH, DYAOP6-256, 8, 0x9eL},
308: -{"ADDW2", INSTRW, DYAOP6-256, 8, 0x9cL},
309: -{"ADDB3", INSTRB, TRIOP1-256, 8, 0xdfL},
310: -{"ADDH3", INSTRH, TRIOP1-256, 8, 0xdeL},
311: -{"ADDW3", INSTRW, TRIOP1-256, 8, 0xdcL},
312: -{"SUBB2", INSTRB, DYAOP6-256, 8, 0xbfL},
313: -{"SUBH2", INSTRH, DYAOP6-256, 8, 0xbeL},
314: -{"SUBW2", INSTRW, DYAOP6-256, 8, 0xbcL},
315: -{"SUBB3", INSTRB, TRIOP1-256, 8, 0xffL},
316: -{"SUBH3", INSTRH, TRIOP1-256, 8, 0xfeL},
317: -{"SUBW3", INSTRW, TRIOP1-256, 8, 0xfcL},
318: -{"MULW2", INSTRW, DYAOP1-256, 8, 0xa8L},
319: -{"MULW3", INSTRW, TRIOP1-256, 8, 0xe8L},
320: -{"DIVW2", INSTRW, DYAOP1-256, 8, 0xacL},
321: -{"DIVW3", INSTRW, TRIOP1-256, 8, 0xecL},
322: -{"MODW2", INSTRW, DYAOP1-256, 8, 0xa4L},
323: -{"MODW3", INSTRW, TRIOP1-256, 8, 0xe4L},
324: -{"CMPB", INSTRB, CMPOP1-256, 8, 0x3fL},
325: -{"CMPH", INSTRH, CMPOP1-256, 8, 0x3eL},
326: -{"CMPW", INSTRW, CMPOP1-256, 8, 0x3cL},
327: -{"RSB", INSTRW, ZEROP1-256, 8, 0x78L},
328: -{"MOVBLW", INSTRW, ZEROP1-256, 16, 0x3019L},
329: -{"INSFW", INSTRW, FLDOP4-256, 8, 0xc8L},
330: -{"INSFH", INSTRH, FLDOP4-256, 8, 0xcaL},
331: -{"INSFB", INSTRB, FLDOP4-256, 8, 0xcbL},
332: -{"EXTFW", INSTRW, FLDOP4-256, 8, 0xccL},
333: -{"EXTFH", INSTRH, FLDOP4-256, 8, 0xceL},
334: -{"EXTFB", INSTRB, FLDOP4-256, 8, 0xcfL},
335: -{"EXTOP", INSTRX, SIMOP-256, 8, 0x14L},
336: -{"getsm", INSTRX, ZEROP1-256, 8, 0x1L},
337: -{"putsm", INSTRX, ZEROP1-256, 8, 0x11L},
338: -{"ungetsm", INSTRX, ZEROP1-256, 8, 0x21L},
339: -{"r0", DUMMY, REGISTER-256, 4, 0x0L},
340: -{"r1", DUMMY, REGISTER-256, 4, 0x1L},
341: -{"r2", DUMMY, REGISTER-256, 4, 0x2L},
342: -{"r3", DUMMY, REGISTER-256, 4, 0x3L},
343: -{"r4", DUMMY, REGISTER-256, 4, 0x4L},
344: -{"r5", DUMMY, REGISTER-256, 4, 0x5L},
345: -{"r6", DUMMY, REGISTER-256, 4, 0x6L},
346: -{"r7", DUMMY, REGISTER-256, 4, 0x7L},
347: -{"r8", DUMMY, REGISTER-256, 4, 0x8L},
348: -{"fp", DUMMY, REGISTER-256, 4, 0x9L},
349: -{"ap", DUMMY, REGISTER-256, 4, 0xaL},
350: -{"psw", DUMMY, REGISTER-256, 4, 0xbL},
351: -{"sp", DUMMY, REGISTER-256, 4, 0xcL},
352: -{"pcbp", DUMMY, REGISTER-256, 4, 0xdL},
353: -{"isp", DUMMY, REGISTER-256, 4, 0xeL},
354: -{".globl", PSEUDO, PSGLOBAL-256, 0, 0x0L},
355: -{".comm", PSEUDO, PSCOMM-256, 0, 0x0L},
356: -{".set", PSEUDO, PSSET-256, 0, 0x0L},
357: -{".zero", PSEUDO, PSZERO-256, 0, 0x0L},
358: -{".bss", BSS, PSBSS-256, 0, 0x0L},
359: -{".file", PSEUDO, PSFILE-256, 0, 0x0L},
360: -{".align", PSEUDO, PSALIGN-256, 0, 0x0L},
361: -{".byte", PSEUDO, PSBYTE-256, 0, 0x0L},
362: -{".half", PSEUDO, PSHALF-256, 0, 0x0L},
363: -{".word", PSEUDO, PSWORD-256, 0, 0x0L},
364: -#if FLOAT
365: -{".float", PSEUDO, PSFLOAT-256, 0, 0x0L},
366: -{".double", PSEUDO, PSDOUBLE-256, 0, 0x0L},
367: -#endif
368: -{".def", PSEUDO, PSDEF-256, 0, 0x0L},
369: -{".val", PSEUDO, PSVAL-256, 0, 0x0L},
370: -{".scl", PSEUDO, PSSCL-256, 0, 0x0L},
371: -{".type", PSEUDO, PSTYPE-256, 0, 0x0L},
372: -{".tag", PSEUDO, PSTAG-256, 0, 0x0L},
373: -{".line", PSEUDO, PSLINE-256, 0, 0x0L},
374: -{".size", PSEUDO, PSSIZE-256, 0, 0x0L},
375: -{".dim", PSEUDO, PSDIM-256, 0, 0x0L},
376: -{".endef", PSEUDO, PSENDEF-256, 0, 0x0L},
377: -{".ln", PSEUDO, PSLN-256, 0, 0x0L},
378: -{".text", TXT, SECTIONN-256, 0, 0x0L},
379: -{".data", DAT, SECTIONN-256, 0, 0x0L},
380: -{"sbyte", DUMMY, EXPTYPE-256, 8, 0x7L},
381: -{"ubyte", DUMMY, EXPTYPE-256, 8, 0x3L},
382: -{"byte", DUMMY, EXPTYPE-256, 8, 0x7L},
383: -{"shalf", DUMMY, EXPTYPE-256, 8, 0x6L},
384: -{"half", DUMMY, EXPTYPE-256, 8, 0x6L},
385: -{"uhalf", DUMMY, EXPTYPE-256, 8, 0x2L},
386: -{"sword", DUMMY, EXPTYPE-256, 8, 0x4L},
387: -{"word", DUMMY, EXPTYPE-256, 8, 0x4L},
388: -{"uword", DUMMY, EXPTYPE-256, 8, 0x0L},
389: -
390: //GO.SYSIN DD 3binstr.c
391: echo 5bb.c 1>&2
392: sed 's/.//' >5bb.c <<'//GO.SYSIN DD 5bb.c'
393: -#define unsafe 1 /* pretend killing all but C is as good as killing
394: - * all condition codes */
395: -#ifdef unsafe
396: -#define E (C|K)
397: -#else
398: -#define E K
399: -#endif
400: -#include "stdio.h"
401: -#include "instr.c"
402: -#include "ctype.h"
403: -struct inst *index[128];
404: -
405: -#define SBBLK 1 /* looking for the start of a basic block */
406: -#define SINST 2 /* thinking about generating a tally */
407: -#define SPRO 3 /* thinking about generating prolog code */
408: -#define SMAYBE 4 /* seen _, thinking about SPRO */
409: -
410: -#define MAXLA 5 /* max no. of lines that can be read for lookahead */
411: -
412: -FILE *outs, *fd, *outl; /* outs goes to assembler, outl is for listing */
413: -extern FILE *popen();
414: -char line[256], fname[256]; /* file names must fit in fname */
415: -
416: -char labuf[5][256]; /* look ahead needed for 5.0 stab entries */
417: -int lastla, lookahead;
418: -char begfcn[] = " .def .bf"; /* 5.0 stab entry */
419: -
420: -int lineno, lastline;
421: -int base=0;
422: -
423: -int cnt;
424: -int state = SBBLK;
425: -char *ptr, *curarg;
426: -char curdir[256];
427: -
428: -main(argc, argv)
429: -char **argv;
430: -{ int i;
431: - if(argc <= 1) {
432: - fprintf(stderr, "no files given\n");
433: - exit(1);
434: - }
435: - for(i = 0; insts[i].iname; i++)
436: - ;
437: - for(; i >= 0; i--)
438: - index[insts[i].iname[0]] = insts + i;
439: - fd = popen("pwd", "r");
440: - for(i = 0; i < sizeof(curdir) && !feof(fd); i++)
441: - curdir[i] = getc(fd);
442: - curdir[i-2] = 0; /* thisdir\n */
443: - fclose(fd);
444: - for(i = 1; i < argc; i++) {
445: - if(setfd(argv[i])) /* fix fd, outs, outl */
446: - doarg(); /* do the work */
447: - }
448: - exit(0);
449: -}
450: -
451: -setfd(s)
452: -char *s;
453: -{ char outnams[24], outnaml[24];
454: - fname[0] = 0;
455: - cnt = 3;
456: - if(fd != NULL)
457: - fclose(fd);
458: - if(outs != NULL)
459: - fclose(outs);
460: - if(outl != NULL)
461: - fclose(outl);
462: - sprintf(outnams, "X%s", s);
463: - sprintf(outnaml, "%sL", s);
464: - lastline = lineno = 0;
465: - fd = fopen(s, "r");
466: - if(fd == NULL) {
467: - perror(s);
468: - return(0);
469: - }
470: - outs = fopen(outnams, "w");
471: - if(outs == NULL) {
472: - perror(outnams);
473: - return(0);
474: - }
475: - outl = fopen(outnaml, "w");
476: - if(outl == NULL) {
477: - perror(outnaml);
478: - return(0);
479: - }
480: - curarg = s;
481: - return(1);
482: -}
483: -
484: -doarg()
485: -{ struct inst *x, *firstword();
486: -
487: - state = SBBLK;
488: - lookahead = 0; /* empty buffer */
489: - lastla = 0;
490: - for(;;) {
491: - if (lookahead != lastla){
492: - strcpy(line,labuf[ (lookahead++) % MAXLA ] );
493: - if (lookahead == lastla) lookahead = lastla = 0;
494: - }
495: - else
496: - (void) fgets(line, sizeof(line), fd);
497: - if(feof(fd))
498: - break;
499: - for(ptr = line; isspace(*ptr); *ptr++)
500: - ;
501: - if(*ptr == 0 || *ptr == '#')
502: - continue;
503: - testlabel();
504: - /* deal with symbol table info */
505: - if(*ptr == '.') {
506: - stab();
507: - fprintf(outs, " %s", ptr);
508: - continue;
509: - }
510: - if(*ptr == 0 || *ptr == '\n')
511: - continue;
512: - x = firstword();
513: - if(x == 0){
514: - printf("unknown inst: %s\n",ptr);
515: - continue;
516: - }
517: -#ifdef u3b
518: - if ((state == SMAYBE) && !strncmp(ptr,"save",4)){
519: - state = SPRO;
520: - getlnum(); /* 5.0 true line # */
521: - }
522: -#endif
523: - if(state == SPRO)
524: - prolog(x);
525: - if(state == SINST)
526: - tally(x);
527: - if(state == SBBLK && (x->type & JUMP))
528: - state = SINST;
529: - outinstr();
530: - if(x->type & BYTE)
531: - fixinstr(x);
532: - fprintf(outs, " %s", ptr);
533: - }
534: - finish();
535: -}
536: -
537: -
538: -getlnum(){ /* get true line number from 5.0 sdb info */
539: - char *la;
540: - int l;
541: -
542: - /* get true line number by looking ahead */
543: - /* this is necessary for 5.0 sdb output */
544: - do
545: - (void) fgets(labuf[l = ((lastla++)%MAXLA)], sizeof(line), fd);
546: - while (!feof(fd) && strncmp(begfcn, labuf[l],
547: - 9) && (lookahead != (lastla)%MAXLA ));
548: - if ( strncmp(begfcn, labuf[l], 9) )
549: - return; /* bad input or not 5.0 */
550: - la = labuf[l];
551: - while ( *la != '\0' ){
552: - while ( *la != ';' && *la != '\0') la++;
553: - if ( *la == ';' ) la++;
554: - while ( isspace(*la) ) la++;
555: - if ( !strncmp(la, ".line" , 5) ){
556: - lineno = base = atoi( la + 5 );
557: - return;
558: - }
559: - }
560: -}
561: -
562: -
563: -/* unbelievable variability in sdb info */
564: -stab()
565: -{ char buf[128];
566: - int i, j, k;
567: -
568: -#ifndef u3b
569: - if(state == SMAYBE && strncmp(ptr, ".word", 5) == 0) {
570: - state = SPRO;
571: - getlnum();
572: - return;
573: - }
574: -#endif
575: -
576: - if((i = *(ptr + 1)) != 's' && i != 'f' && i != 'l')
577: - return;
578: - /* real compiler output */
579: - if(sscanf(ptr, ".stabs \"%[^\"]\", %o", buf, &i) == 2 && i == 0144)
580: - strcat(fname, buf);
581: - else if(sscanf(ptr, ".stabd %o,%o,%o", &i, &j, &k) == 3 && i == 0104)
582: - lineno = k;
583: - /* pwb 3.0 */
584: - else if(sscanf(ptr, ".stab %[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%d",
585: - buf, buf+2, buf+4, buf+6, buf+8, buf+10, buf+12, buf+14, &i)
586: - == 9 && i == 144) {
587: - for(i = k = 0; buf[i] ; i++)
588: - if(buf[i] == '\'')
589: - buf[k++] = buf[++i];
590: - buf[k] = 0;
591: - strcat(fname, buf);
592: - }
593: - else if(sscanf(ptr, ".stab %[0,]%d,%d,%d", buf,&i, &j, &k) == 4
594: - && i == 104)
595: - lineno = k;
596: - /* pwb 5.0 */
597: - else if(sscanf(ptr," .file \"%[^\"]\"", buf) == 1)
598: - strcat(fname, buf);
599: - else if(sscanf(ptr, " .ln %d",&k) == 1)
600: - lineno = k + base - 1;
601: -}
602: -
603: -testlabel()
604: -{ char *p;
605: - int i;
606: -
607: -for(;;){
608: - for(p = ptr; *p; p++) {
609: - if(*p == ':')
610: - break;
611: - if(!isalnum(*p) && *p != '_' && *p != '.')
612: - return;
613: - }
614: - if(*p == 0)
615: - return;
616: - *p++ = 0; /* that is overwriting the : */
617: - fprintf(outs, "%s:\n", ptr);
618: - if (lineno != lastline){
619: - for (i=lastline+1; i < lineno ; i++) /* allign label with right inst */
620: - fprintf(outl, "0 %s: %d\n", fname, i);
621: - lastline = lineno - 1;
622: - }
623: - fprintf(outl, "%d %s:\n", 4*(cnt - 1), ptr);
624: -#ifdef u3b
625: - if(*ptr != '.')
626: -#else
627: - if(*ptr == '_' )
628: -#endif
629: - state = SMAYBE;
630: - else
631: - if(state != SPRO)
632: - state = SINST;
633: - for(ptr = p; isspace(*ptr); ptr++)
634: - ;
635: - } /* L68:L70: ... */
636: -}
637: -
638: -struct inst *
639: -firstword()
640: -{ char buf[sizeof(line)], *p, *q;
641: - struct inst *x;
642: - for(p = buf, q = ptr; isalnum(*q); )
643: - *p++ = *q++;
644: - if(p == buf)
645: - return((struct inst *)0);
646: - *p = 0;
647: - for(x = index[buf[0]]; x && x->iname[0] == buf[0]; x++)
648: - if(strcmp(buf, x->iname) == 0)
649: - return(x);
650: - return(0);
651: -}
652: -
653: -outinstr()
654: -{ int i;
655: - for(i = lastline + 1; i < lineno; i++)
656: - fprintf(outl, "0 %s: %d\n", fname, i);
657: - if (lastline != lineno){
658: - fprintf(outl, "%d %s: %d\n", 4*(cnt - 1), fname, lineno);
659: - lastline = lineno;
660: - }
661: - fprintf(outl, "%d %s", 4*(cnt - 1), ptr);
662: -}
663: -
664: -#ifdef u3b
665: -
666: -/* 3b code ***********************************/
667: -tally(x)
668: -struct inst *x;
669: -{
670: - if(x->type & E)
671: - fprintf(outs, " addw2 &1,locprof+%d\n", 4*cnt++);
672: - else {
673: - fprintf(outs, " stsm &1,savecc\n");
674: - fprintf(outs, " gcc %%r0\n");
675: - fprintf(outs, " addw2 &1,locprof+%d\n", 4*cnt++);
676: - fprintf(outs, " scc %%r0\n");
677: - fprintf(outs, " lsm &1,savecc\n");
678: - }
679: - state = SBBLK;
680: -}
681: -
682: -prolog(x) /* no liveness test, presumes can't get here by jump */
683: -struct inst *x;
684: -{ int i;
685: - fprintf(outs, " .data\n");
686: - fprintf(outs, " .globl proFptr\n"); /* the global chain */
687: - fprintf(outs, " .globl savecc\n");
688: - fprintf(outs, " .text\n");
689: - fprintf(outs, " cmpw &0,locprof+4\n");
690: - fprintf(outs, " jne L%da\n", i = cnt);
691: - fprintf(outs, " movw proFptr,locprof+4\n");
692: - fprintf(outs, " movaw locprof,proFptr\n");
693: - fprintf(outs, "L%da: addw2 &1,locprof+%d\n", i, 4*cnt++);
694: - state = SBBLK;
695: -}
696: -
697: -finish()
698: -{ int i;
699: - fprintf(outs, " .data\n");
700: - fprintf(outs, " .align 4\n");
701: - fprintf(outs, "locprof:\n");
702: - fprintf(outs, " .word %d\n", cnt);
703: - fprintf(outs, " .word 0\n");
704: - fprintf(outs, " .word L%db\n", cnt);
705: - fprintf(outs, " .zero %d\n", 4 * cnt);
706: - fprintf(outs, "L%db: .byte ", cnt);
707: - for(i = 0; curdir[i]; i++)
708: - fprintf(outs, " 0x%x,", curdir[i]);
709: - fprintf(outs, " 0x%x\n", '/');
710: - fprintf(outs, " .byte ");
711: - if(fname[0])
712: - for(i = 0; fname[i]; i++)
713: - fprintf(outs, " 0x%x,", fname[i]);
714: - else
715: - for(i = 0; curarg[i]; i++)
716: - fprintf(outs, " 0x%x,", curarg[i]);
717: - fprintf(outs, "0\n");
718: -}
719: -
720: -#else
721: -
722: -/* Vax code **************************/
723: -tally(x)
724: -struct inst *x;
725: -{
726: - if(x->type & E)
727: - fprintf(outs, " incl locprof+%d\n", 4*cnt++);
728: - else {
729: - fprintf(outs, " movpsl -(sp)\n");
730: - fprintf(outs, " incl locprof+%d\n", 4*cnt++);
731: - fprintf(outs, " movw (sp)+,(sp)\n");
732: - fprintf(outs, " bicpsw $0xff\n");
733: - fprintf(outs, " bispsw (sp)+\n");
734: - /* thanks to kirk mckusick */
735: - }
736: - state = SBBLK;
737: -}
738: -
739: -
740: -prolog(x) /* no liveness test, presumes can't get here by jump */
741: -struct inst *x;
742: -{ int i;
743: - fprintf(outs, " .data\n");
744: - fprintf(outs, " .comm _proFptr,4\n"); /* the global chain */
745: - fprintf(outs, " .text\n");
746: - /*if(!(x->type & E))
747: - fprintf(outs, " movpsl -(sp)\n");*/
748: - fprintf(outs, " tstl locprof+4\n");
749: - fprintf(outs, " bneq L%da\n", i = cnt);
750: - fprintf(outs, " movl _proFptr,locprof+4\n");
751: - fprintf(outs, " moval locprof,_proFptr\n");
752: - fprintf(outs, "L%da: incl locprof+%d\n", i, 4*cnt++);
753: - /*if(!(x->type & E)) {
754: - fprintf(outs, " movw (sp)+,(sp)\n");
755: - fprintf(outs, " bicpsw $0xff\n");
756: - fprintf(outs, " bispsw (sp)+\n");
757: - }*/
758: - state = SBBLK;
759: -}
760: -
761: -finish()
762: -{ int i;
763: - fprintf(outs, " .data\n");
764: - fprintf(outs, "locprof: .long %d\n", cnt);
765: - fprintf(outs, " .long 0\n");
766: - fprintf(outs, " .long L%db\n", cnt);
767: - fprintf(outs, " .space %d\n", 4 * cnt);
768: - fprintf(outs, "L%db: .byte ", cnt);
769: - for(i = 0; curdir[i]; i++)
770: - fprintf(outs, "0x%x,", curdir[i]);
771: - fprintf(outs, "0x%x\n", '/');
772: - fprintf(outs, " .byte ");
773: - if(fname[0])
774: - for(i = 0; fname[i]; i++)
775: - fprintf(outs, "0x%x,", fname[i]);
776: - else
777: - for(i = 0; curarg[i]; i++)
778: - fprintf(outs, "0x%x,", curarg[i]);
779: - fprintf(outs, "0\n");
780: -}
781: -
782: -#endif
783: -
784: -
785: -fixinstr(x)
786: -struct inst *x;
787: -{
788: -#ifndef u3b
789: - if(x->iname[0] == 'b')
790: - *ptr = 'j'; /* let assembler worry about branches */
791: - /* this is where the code for aob and sob goes */
792: -#endif
793: -}
794: -
795: -
796: -
797: -
798: -
799: //GO.SYSIN DD 5bb.c
800: echo 68k-instr.c 1>&2
801: sed 's/.//' >68k-instr.c <<'//GO.SYSIN DD 68k-instr.c'
802: -#define K 1 /* kills all condition codes */
803: -#define JUMP 2 /* ends a basic block */
804: -#define BYTE 4 /* target is byte offset */
805: -#define C 8 /* kills all condition codes but for C bit*/
806: -/* if((p->type & EXPAND) && p->iname[0] == 'b') replace first char with j */
807: -/* aob and sob get replaced by two instructions */
808: -
809: -struct inst {
810: - char *iname;
811: - short type;
812: -} insts[] = {
813: -{ "abcd", K},
814: -{ "add", K},
815: -{ "addx", K},
816: -{ "and", K},
817: -{ "asl", K},
818: -{ "asr", K},
819: -{ "bcc", 0},
820: -{ "bchg", 0},
821: -{ "bclr", 0},
822: -{ "bcs", 0},
823: -{ "beq", 0},
824: -{ "bge", 0},
825: -{ "bgt", 0},
826: -{ "bhi", 0},
827: -{ "bhs", 0},
828: -{ "ble", 0},
829: -{ "blo", 0},
830: -{ "bls", 0},
831: -{ "blt", 0},
832: -{ "bmi", 0},
833: -{ "bne", 0},
834: -{ "bpl", 0},
835: -{ "br", 0},
836: -{ "bra", 0},
837: -{ "bset", 0},
838: -{ "bsr", 0},
839: -{ "btst", 0},
840: -{ "bvc", 0},
841: -{ "bvs", 0},
842: -{ "chk", K},
843: -{ "clr", K},
844: -{ "cmp", K},
845: -{ "dbcc", 0},
846: -{ "dbcs", 0},
847: -{ "dbeq", 0},
848: -{ "dbge", 0},
849: -{ "dbgt", 0},
850: -{ "dbhi", 0},
851: -{ "dbhs", 0},
852: -{ "dble", 0},
853: -{ "dblo", 0},
854: -{ "dbls", 0},
855: -{ "dblt", 0},
856: -{ "dbmi", 0},
857: -{ "dbne", 0},
858: -{ "dbpl", 0},
859: -{ "dbr", 0},
860: -{ "dbra", 0},
861: -{ "dbvc", 0},
862: -{ "dbvs", 0},
863: -{ "divs", K},
864: -{ "divu", K},
865: -{ "eor", K},
866: -{ "exg", 0},
867: -{ "ext", K},
868: -{ "jmp", 0},
869: -{ "jsr", 0},
870: -{ "lea", 0},
871: -{ "link", 0},
872: -{ "lsl", K},
873: -{ "lsr", K},
874: -{ "mov", K},
875: -{ "movea", 0},
876: -{ "movm", 0},
877: -{ "muls", K},
878: -{ "mulu", K},
879: -{ "nbcd", K},
880: -{ "neg", K},
881: -{ "negx", K},
882: -{ "nop", 0},
883: -{ "not", K},
884: -{ "or", K},
885: -{ "pea", 0},
886: -{ "reset", 0},
887: -{ "rol", K},
888: -{ "ror", K},
889: -{ "roxl", K},
890: -{ "roxr", K},
891: -{ "rte", K},
892: -{ "rtr", K},
893: -{ "rts", 0},
894: -{ "sbcd", K},
895: -{ "scc", 0},
896: -{ "scs", 0},
897: -{ "seq", 0},
898: -{ "sf", 0},
899: -{ "sge", 0},
900: -{ "sgt", 0},
901: -{ "shi", 0},
902: -{ "shs", 0},
903: -{ "sle", 0},
904: -{ "slo", 0},
905: -{ "sls", 0},
906: -{ "slt", 0},
907: -{ "smi", 0},
908: -{ "sne", 0},
909: -{ "spl", 0},
910: -{ "st", 0},
911: -{ "stop", K},
912: -{ "sub", K},
913: -{ "suba", 0},
914: -{ "subx", K},
915: -{ "svc", 0},
916: -{ "svs", 0},
917: -{ "swap", K},
918: -{ "tas", K},
919: -{ "trap", 0},
920: -{ "trapv", 0},
921: -{ "tst", K},
922: -{ "unlk", 0},
923: -{ 0, 0},
924: -};
925: //GO.SYSIN DD 68k-instr.c
926: echo README 1>&2
927: sed 's/.//' >README <<'//GO.SYSIN DD README'
928: -There's no makefile. Compile bb.c (or 5bb.c if you've unix V) and put
929: -the output in bb. fix the shell scripts lcomp, lcc. good luck. [instr.c is
930: -included in bb.c, so doesn't get compiled.
931: -cc -c nexit.c -o nexit.o; cc -o lprint lprint.c, and that's it]
932: -.
933: //GO.SYSIN DD README
934: echo bb.c 1>&2
935: sed 's/.//' >bb.c <<'//GO.SYSIN DD bb.c'
936: -#define unsafe 1 /* pretend killing all but C is as good as killing
937: - * all condition codes */
938: -#ifdef unsafe
939: -#define E (C|K)
940: -#else
941: -#define E K
942: -#endif
943: -#include "stdio.h"
944: -#include "instr.c"
945: -#include "ctype.h"
946: -struct inst *index[128];
947: -
948: -#define SBBLK 1 /* looking for the start of a basic block */
949: -#define SINST 2 /* thinking about generating a tally */
950: -#define SPRO 3 /* thinking about generating prolog code */
951: -#define SMAYBE 4 /* seen _, thinking about SPRO */
952: -
953: -FILE *outs, *fd, *outl; /* outs goes to assembler, outl is for listing */
954: -extern FILE *popen();
955: -char line[256], fname[256]; /* file names must fit in fname */
956: -char curfunc[256];
957: -int lineno, lastline;
958: -int cnt;
959: -int state = SBBLK;
960: -char *ptr, *curarg;
961: -char curdir[256];
962: -
963: -main(argc, argv)
964: -char **argv;
965: -{ int i;
966: - if(argc <= 1) {
967: - fprintf(stderr, "no files given\n");
968: - exit(1);
969: - }
970: - for(i = 0; insts[i].iname; i++)
971: - ;
972: - for(; i >= 0; i--)
973: - index[insts[i].iname[0]] = insts + i;
974: - fd = popen("pwd", "r");
975: - for(i = 0; i < sizeof(curdir) && !feof(fd); i++)
976: - curdir[i] = getc(fd);
977: - curdir[i-2] = 0; /* thisdir\n */
978: - fclose(fd);
979: - for(i = 1; i < argc; i++) {
980: - if(setfd(argv[i])) /* fix fd, outs, outl */
981: - doarg(); /* do the work */
982: - }
983: - exit(0);
984: -}
985: -
986: -setfd(s)
987: -char *s;
988: -{ char outnams[24], outnaml[24];
989: - fname[0] = 0;
990: - cnt = 3;
991: - if(fd != NULL)
992: - fclose(fd);
993: - if(outs != NULL)
994: - fclose(outs);
995: - if(outl != NULL)
996: - fclose(outl);
997: - sprintf(outnams, "X%s", s);
998: - sprintf(outnaml, "%sL", s);
999: - lastline = lineno = 0;
1000: - fd = fopen(s, "r");
1001: - if(fd == NULL) {
1002: - perror(s);
1003: - return(0);
1004: - }
1005: - outs = fopen(outnams, "w");
1006: - if(outs == NULL) {
1007: - perror(outnams);
1008: - return(0);
1009: - }
1010: - outl = fopen(outnaml, "w");
1011: - if(outl == NULL) {
1012: - perror(outnaml);
1013: - return(0);
1014: - }
1015: - curarg = s;
1016: - return(1);
1017: -}
1018: -
1019: -doarg()
1020: -{ struct inst *x, *firstword();
1021: - state = SBBLK;
1022: - for(;;) {
1023: - (void) fgets(line, sizeof(line), fd);
1024: - if(feof(fd))
1025: - break;
1026: - for(ptr = line; isspace(*ptr); *ptr++)
1027: - ;
1028: - if(*ptr == 0 || *ptr == '#')
1029: - continue;
1030: - testlabel();
1031: - /* deal with symbol table info */
1032: - if(*ptr == '.') {
1033: - stab();
1034: - fprintf(outs, "%s", ptr);
1035: - continue;
1036: - }
1037: - if(*ptr == 0 || *ptr == '\n')
1038: - continue;
1039: - x = firstword();
1040: - if(x == 0)
1041: - continue;
1042: - if(state == SPRO)
1043: - prolog(x);
1044: - if(state == SINST)
1045: - tally(x);
1046: - if(state == SBBLK && (x->type & JUMP))
1047: - state = SINST;
1048: - outinstr();
1049: - if(x->type & BYTE)
1050: - fixinstr(x);
1051: - fprintf(outs, "%s", ptr);
1052: - }
1053: - finish();
1054: -}
1055: -/* unbelievable variability in sdb info */
1056: -stab()
1057: -{ char buf[128];
1058: - int i, j, k;
1059: - if(state == SMAYBE && strncmp(ptr, ".word", 5) == 0) {
1060: - state = SPRO;
1061: - return;
1062: - }
1063: - if((i = *(ptr + 1)) != 's' && i != 'f' && i != 'l')
1064: - return;
1065: - /* real compiler output */
1066: - if(sscanf(ptr, ".stabs \"%[^\"]\", %o", buf, &i) == 2 && i == 0144)
1067: - strcat(fname, buf);
1068: - else if(sscanf(ptr, ".stabs \"%[^\"]\", 0x%x", buf, &i) == 2 && i == 0x64)
1069: - strcat(fname, buf);
1070: - else if(sscanf(ptr, ".stabd %o,%o,%o", &i, &j, &k) == 3 && i == 0104)
1071: - lineno = k;
1072: - else if(sscanf(ptr, ".stabd 0x%x,0,%d", &i, &k) == 2 && i == 0x44)
1073: - lineno = k;
1074: - /* pwb 3.0 */
1075: - else if(sscanf(ptr, ".stab %[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%d",
1076: - buf, buf+2, buf+4, buf+6, buf+8, buf+10, buf+12, buf+14, &i)
1077: - == 9 && i == 144) {
1078: - for(i = k = 0; buf[i] ; i++)
1079: - if(buf[i] == '\'')
1080: - buf[k++] = buf[++i];
1081: - buf[k] = 0;
1082: - strcat(fname, buf);
1083: - }
1084: - else if(sscanf(ptr, ".stab %[0,]%d,%d,%d", buf,&i, &j, &k) == 4
1085: - && i == 104)
1086: - lineno = k;
1087: - /* pwb 5.0 */
1088: - else if(sscanf(ptr," .file \"%[^\"]\"", buf) == 1)
1089: - strcat(fname, buf);
1090: - else if(sscanf(ptr, " .ln %d",&k) == 1)
1091: - lineno = k;
1092: -}
1093: -
1094: -testlabel()
1095: -{ char *p;
1096: -again:
1097: - for(p = ptr; *p; p++) {
1098: - if(*p == ':')
1099: - break;
1100: - if(isalnum(*p) || *p == '_')
1101: - continue;
1102: - if(p > ptr && *p == '.') /* f77 */
1103: - continue;
1104: - return;
1105: - }
1106: - if(*p == 0)
1107: - return;
1108: - *p++ = 0; /* that is overwriting the : */
1109: - fprintf(outs, "%s:\n", ptr);
1110: - if(*ptr == '_') {
1111: - state = SMAYBE;
1112: - strcpy(curfunc, ptr);
1113: - }
1114: - else
1115: - if(state != SPRO)
1116: - state = SINST;
1117: - for(ptr = p; isspace(*ptr); ptr++)
1118: - ;
1119: - goto again; /* L68:L70: ... */
1120: -}
1121: -
1122: -struct inst *
1123: -firstword()
1124: -{ char buf[sizeof(line)], *p, *q;
1125: - struct inst *x;
1126: - for(p = buf, q = ptr; isalnum(*q); )
1127: - *p++ = *q++;
1128: - if(p == buf)
1129: - return((struct inst *)0);
1130: - *p = 0;
1131: - for(x = index[buf[0]]; x && x->iname[0] == buf[0]; x++)
1132: - if(strcmp(buf, x->iname) == 0)
1133: - return(x);
1134: - return(0);
1135: -}
1136: -
1137: -tally(x)
1138: -struct inst *x;
1139: -{
1140: - if(x->type & E)
1141: - fprintf(outs, "incl locprof+%d\n", 4*cnt++);
1142: - else {
1143: - fprintf(outs, "movpsl -(sp)\n");
1144: - fprintf(outs, "incl locprof+%d\n", 4*cnt++);
1145: - fprintf(outs, "movw (sp)+,(sp)\n");
1146: - fprintf(outs, "bicpsw $0xff\n");
1147: - fprintf(outs, "bispsw (sp)+\n");
1148: - /* thanks to kirk mckusick */
1149: - }
1150: - state = SBBLK;
1151: -}
1152: -
1153: -outinstr()
1154: -{ int i;
1155: - for(i = lastline + 1; i <= lineno; i++)
1156: - fprintf(outl, "%d %s: %d\n", 4*(cnt - 1), fname, i);
1157: - lastline = lineno;
1158: - fprintf(outl, "%d %s", 4*(cnt - 1), ptr);
1159: -}
1160: -
1161: -prolog(x) /* no liveness test, presumes can't get here by jump */
1162: -struct inst *x;
1163: -{ int i;
1164: - fprintf(outs, ".data\n");
1165: - fprintf(outs, ".comm _proFptr,4\n"); /* the global chain */
1166: - fprintf(outs, ".text\n");
1167: - fprintf(outs, "tstl locprof+4\n");
1168: - fprintf(outs, "bneq L%da\n", i = cnt);
1169: - fprintf(outs, "movl _proFptr,locprof+4\n");
1170: - fprintf(outs, "moval locprof,_proFptr\n");
1171: - fprintf(outs, "L%da: incl locprof+%d\n", i, 4*cnt++);
1172: - state = SBBLK;
1173: - fprintf(outl, "%d %s: %s\n", 4*(cnt-1), fname, curfunc);
1174: -}
1175: -
1176: -finish()
1177: -{ int i;
1178: - fprintf(outs, ".data\n");
1179: - fprintf(outs, "locprof: .long %d\n", cnt);
1180: - fprintf(outs, ".long 0\n");
1181: - fprintf(outs, ".long L%db\n", cnt);
1182: - fprintf(outs, ".space %d\n", 4 * cnt);
1183: - fprintf(outs, "L%db: .byte ", cnt);
1184: - for(i = 0; curdir[i]; i++)
1185: - fprintf(outs, "0x%x,", curdir[i]);
1186: - fprintf(outs, "0x%x\n", '/');
1187: - fprintf(outs, ".byte ");
1188: - if(fname[0])
1189: - for(i = 0; fname[i]; i++)
1190: - fprintf(outs, "0x%x,", fname[i]);
1191: - else
1192: - for(i = 0; curarg[i]; i++)
1193: - fprintf(outs, "0x%x,", curarg[i]);
1194: - fprintf(outs, "0\n");
1195: -}
1196: -
1197: -fixinstr(x)
1198: -struct inst *x;
1199: -{
1200: - if(x->iname[0] == 'b')
1201: - *ptr = 'j'; /* let assembler worry about branches */
1202: - /* this is where the code for aob and sob goes */
1203: -}
1204: //GO.SYSIN DD bb.c
1205: echo instr.c 1>&2
1206: sed 's/.//' >instr.c <<'//GO.SYSIN DD instr.c'
1207: -#define K 1 /* kills all condition codes */
1208: -#define JUMP 2 /* ends a basic block */
1209: -#define BYTE 4 /* target is byte offset */
1210: -#define C 8 /* kills all condition codes but for C bit*/
1211: -/* if((p->type & EXPAND) && p->iname[0] == 'b') replace first char with j */
1212: -/* aob and sob get replaced by two instructions */
1213: -
1214: -struct inst {
1215: - char *iname;
1216: - short type;
1217: -} insts[] = {
1218: -"acbb", C | JUMP,
1219: -"acbd", C | JUMP,
1220: -"acbf", C | JUMP,
1221: -"acbg", C | JUMP,
1222: -"acbh", C | JUMP,
1223: -"acbl", C | JUMP,
1224: -"acbw", C | JUMP,
1225: -"adawi", K,
1226: -"addb2", K,
1227: -"addb3", K,
1228: -"addd2", K,
1229: -"addd3", K,
1230: -"addf2", K,
1231: -"addf3", K,
1232: -"addg2", K,
1233: -"addg3", K,
1234: -"addh2", K,
1235: -"addh3", K,
1236: -"addl2", K,
1237: -"addl3", K,
1238: -"addp4", K,
1239: -"addp6", K,
1240: -"addw2", K,
1241: -"addw3", K,
1242: -"adwc", K,
1243: -"aobleq", C | JUMP | BYTE,
1244: -"aoblss", C | JUMP | BYTE,
1245: -"ashl", C,
1246: -"ashp", K,
1247: -"ashq", C,
1248: -"bbc", JUMP | BYTE,
1249: -"bbcc", JUMP | BYTE,
1250: -"bbcci", JUMP | BYTE,
1251: -"bbcs", JUMP | BYTE,
1252: -"bbs", JUMP | BYTE,
1253: -"bbsc", JUMP | BYTE,
1254: -"bbss", JUMP | BYTE,
1255: -"bbssi", JUMP | BYTE,
1256: -"bcc", JUMP | BYTE,
1257: -"bcs", JUMP | BYTE,
1258: -"beql", JUMP | BYTE,
1259: -"beqlu", JUMP | BYTE,
1260: -"bgeq", JUMP | BYTE,
1261: -"bgequ", JUMP | BYTE,
1262: -"bgtr", JUMP | BYTE,
1263: -"bgtru", JUMP | BYTE,
1264: -"bicb2", C,
1265: -"bicb3", C,
1266: -"bicl2", C,
1267: -"bicl3", C,
1268: -"bicpsw", K,
1269: -"bicw2", C,
1270: -"bicw3", C,
1271: -"bisb2", C,
1272: -"bisb3", C,
1273: -"bisl2", C,
1274: -"bisl3", C,
1275: -"bispsw", K,
1276: -"bisw2", C,
1277: -"bisw3", C,
1278: -"bitb", C,
1279: -"bitl", C,
1280: -"bitw", C,
1281: -"blbc", JUMP | BYTE,
1282: -"blbs", JUMP | BYTE,
1283: -"bleq", JUMP | BYTE,
1284: -"blequ", JUMP | BYTE,
1285: -"blss", JUMP | BYTE,
1286: -"blssu", JUMP | BYTE,
1287: -"bneq", JUMP | BYTE,
1288: -"bnequ", JUMP | BYTE,
1289: -"bpt", K,
1290: -"brb", JUMP | BYTE,
1291: -"brw", JUMP,
1292: -"bsbb", JUMP | BYTE,
1293: -"bsbw", JUMP,
1294: -"bugl", 0,
1295: -"bugw", 0,
1296: -"bvc", JUMP | BYTE,
1297: -"bvs", JUMP | BYTE,
1298: -"callg", K,
1299: -"calls", K,
1300: -"caseb", K | JUMP,
1301: -"casel", K | JUMP,
1302: -"casew", K | JUMP,
1303: -"chme", K,
1304: -"chmk", K,
1305: -"chms", K,
1306: -"chmu", K,
1307: -"clrb", C,
1308: -"clrd", C,
1309: -"clrf", C,
1310: -"clrg", C,
1311: -"clrh", C,
1312: -"clrl", C,
1313: -"clro", C,
1314: -"clrq", C,
1315: -"clrw", C,
1316: -"cmpb", K,
1317: -"cmpc3", K,
1318: -"cmpc5", K,
1319: -"cmpd", K,
1320: -"cmpf", K,
1321: -"cmpg", K,
1322: -"cmph", K,
1323: -"cmpl", K,
1324: -"cmpp3", C,
1325: -"cmpp4", C,
1326: -"cmpv", K,
1327: -"cmpw", K,
1328: -"cmpzv", K,
1329: -"crc", C,
1330: -"cvtbd", K,
1331: -"cvtbf", K,
1332: -"cvtbg", K,
1333: -"cvtbh", K,
1334: -"cvtbl", K,
1335: -"cvtbw", K,
1336: -"cvtdb", K,
1337: -"cvtdf", K,
1338: -"cvtdh", K,
1339: -"cvtdl", K,
1340: -"cvtdw", K,
1341: -"cvtfb", K,
1342: -"cvtfd", K,
1343: -"cvtfg", K,
1344: -"cvtfh", K,
1345: -"cvtfl", K,
1346: -"cvtfw", K,
1347: -"cvtgb", K,
1348: -"cvtgf", K,
1349: -"cvtgh", K,
1350: -"cvtgl", K,
1351: -"cvtgw", K,
1352: -"cvthb", K,
1353: -"cvthd", K,
1354: -"cvthf", K,
1355: -"cvthg", K,
1356: -"cvthl", K,
1357: -"cvthw", K,
1358: -"cvtlb", K,
1359: -"cvtld", K,
1360: -"cvtlf", K,
1361: -"cvtlg", K,
1362: -"cvtlh", K,
1363: -"cvtlp", K,
1364: -"cvtlw", K,
1365: -"cvtpl", K,
1366: -"cvtps", K,
1367: -"cvtpt", K,
1368: -"cvtrdl", K,
1369: -"cvtrfl", K,
1370: -"cvtrgl", K,
1371: -"cvtrhl", K,
1372: -"cvtsp", K,
1373: -"cvttp", K,
1374: -"cvtwb", K,
1375: -"cvtwd", K,
1376: -"cvtwf", K,
1377: -"cvtwg", K,
1378: -"cvtwh", K,
1379: -"cvtwl", K,
1380: -"decb", K,
1381: -"decl", K,
1382: -"decw", K,
1383: -"divb2", K,
1384: -"divb3", K,
1385: -"divd2", K,
1386: -"divd3", K,
1387: -"divf2", K,
1388: -"divf3", K,
1389: -"divg2", K,
1390: -"divg3", K,
1391: -"divh2", K,
1392: -"divh3", K,
1393: -"divl2", K,
1394: -"divl3", K,
1395: -"divp", K,
1396: -"divw2", K,
1397: -"divw3", K,
1398: -"editpc", K,
1399: -"ediv", K,
1400: -"emodd", K,
1401: -"emodf", K,
1402: -"emodg", K,
1403: -"emodh", K,
1404: -"emul", K,
1405: -"escd", 0,
1406: -"esce", 0,
1407: -"escf", 0,
1408: -"extv", K,
1409: -"extzv", K,
1410: -"ffc", K,
1411: -"ffs", K,
1412: -"halt", JUMP,
1413: -"incb", K,
1414: -"incl", K,
1415: -"incw", K,
1416: -"index", K,
1417: -"insqhi", K,
1418: -"insqti", K,
1419: -"insque", K,
1420: -"insv", 0,
1421: -"jbc", JUMP,
1422: -"jbcc", JUMP,
1423: -"jbcs", JUMP,
1424: -"jbr", JUMP,
1425: -"jbs", JUMP,
1426: -"jbsc", JUMP,
1427: -"jbss", JUMP,
1428: -"jcc", JUMP,
1429: -"jcs", JUMP,
1430: -"jeql", JUMP,
1431: -"jeqlu", JUMP,
1432: -"jgeq", JUMP,
1433: -"jgequ", JUMP,
1434: -"jgtr", JUMP,
1435: -"jgtru", JUMP,
1436: -"jlbc", JUMP,
1437: -"jlbs", JUMP,
1438: -"jleq", JUMP,
1439: -"jlequ", JUMP,
1440: -"jlss", JUMP,
1441: -"jlssu", JUMP,
1442: -"jmp", JUMP,
1443: -"jneq", JUMP,
1444: -"jnequ", JUMP,
1445: -"jsb", JUMP,
1446: -"jvc", JUMP,
1447: -"jvs", JUMP,
1448: -"ldpctx", 0,
1449: -"locc", K,
1450: -"matchc", K,
1451: -"mcomb", C,
1452: -"mcoml", C,
1453: -"mcomw", C,
1454: -"mfpr", C,
1455: -"mnegb", K,
1456: -"mnegd", K,
1457: -"mnegf", K,
1458: -"mnegg", K,
1459: -"mnegh", K,
1460: -"mnegl", K,
1461: -"mnegw", K,
1462: -"movab", C,
1463: -"movad", C,
1464: -"movaf", C,
1465: -"movag", C,
1466: -"movah", C,
1467: -"moval", C,
1468: -"movao", C,
1469: -"movaq", C,
1470: -"movaw", C,
1471: -"movb", C,
1472: -"movc3", K,
1473: -"movc5", K,
1474: -"movd", C,
1475: -"movf", C,
1476: -"movg", C,
1477: -"movh", C,
1478: -"movl", C,
1479: -"movo", C,
1480: -"movp", C,
1481: -"movpsl", 0,
1482: -"movq", C,
1483: -"movtc", K,
1484: -"movtuc", K,
1485: -"movw", C,
1486: -"movzbl", C,
1487: -"movzbw", C,
1488: -"movzwl", C,
1489: -"mtpr", C,
1490: -"mulb2", K,
1491: -"mulb3", K,
1492: -"muld2", K,
1493: -"muld3", K,
1494: -"mulf2", K,
1495: -"mulf3", K,
1496: -"mulg2", K,
1497: -"mulg3", K,
1498: -"mulh2", K,
1499: -"mulh3", K,
1500: -"mull2", K,
1501: -"mull3", K,
1502: -"mulp", K,
1503: -"mulw2", K,
1504: -"mulw3", K,
1505: -"nop", 0,
1506: -"polyd", K,
1507: -"polyf", K,
1508: -"polyg", K,
1509: -"polyh", K,
1510: -"popr", 0,
1511: -"prober", K,
1512: -"probew", K,
1513: -"pushab", C,
1514: -"pushad", C,
1515: -"pushaf", C,
1516: -"pushag", C,
1517: -"pushah", C,
1518: -"pushal", C,
1519: -"pushao", C,
1520: -"pushaq", C,
1521: -"pushaw", C,
1522: -"pushl", C,
1523: -"pushr", 0,
1524: -"rei", K,
1525: -"remqhi", K,
1526: -"remqti", K,
1527: -"remque", K,
1528: -"ret", K | JUMP,
1529: -"rotl", C,
1530: -"rsb", 0,
1531: -"sbwc", K,
1532: -"scanc", K,
1533: -"skpc", K,
1534: -"sobgeq", C | JUMP | BYTE,
1535: -"sobgtr", C | JUMP | BYTE,
1536: -"spanc", K,
1537: -"subb2", K,
1538: -"subb3", K,
1539: -"subd2", K,
1540: -"subd3", K,
1541: -"subf2", K,
1542: -"subf3", K,
1543: -"subg2", K,
1544: -"subg3", K,
1545: -"subh2", K,
1546: -"subh3", K,
1547: -"subl2", K,
1548: -"subl3", K,
1549: -"subp4", K,
1550: -"subp6", K,
1551: -"subw2", K,
1552: -"subw3", K,
1553: -"svpctx", 0,
1554: -"tstb", K,
1555: -"tstd", K,
1556: -"tstf", K,
1557: -"tstg", K,
1558: -"tstl", K,
1559: -"tstw", K,
1560: -"tstw", K,
1561: -"xfc", K | JUMP,
1562: -"xorb2", C,
1563: -"xorb3", C,
1564: -"xorl2", C,
1565: -"xorl3", C,
1566: -"xorw2", C,
1567: -"xorw3", C,
1568: -0, 0
1569: -};
1570: //GO.SYSIN DD instr.c
1571: echo lcomp.1 1>&2
1572: sed 's/.//' >lcomp.1 <<'//GO.SYSIN DD lcomp.1'
1573: -.TH LCOMP 1
1574: -.SH NAME
1575: -lcomp, lprint \(mi line-by-line profiler
1576: -.SH SYNOPSIS
1577: -.B lcomp
1578: -[ option ... ] file ...
1579: -.PP
1580: -.B lprint
1581: -[ option ] [ file ... ]
1582: -.SH DESCRIPTION
1583: -.I Lcomp
1584: -is used in place of
1585: -.I cc (1)
1586: -or
1587: -.I f77 (1)
1588: -to insert instruction-counting code into programs.
1589: -It recognizes options whose initial letters are taken from the string
1590: -.LR CwpDUIRdlNnz ,
1591: -and accepts files whose names end in
1592: -.LR .c ,
1593: -.LR .f ,
1594: -.LR .s ,
1595: -or
1596: -.LR .o .
1597: -From each source file it derives a
1598: -.L .o
1599: -file and a
1600: -.L .sL
1601: -file which
1602: -.I lprint
1603: -uses to correlate source lines with basic blocks.
1604: -.PP
1605: -Option
1606: -.B -C
1607: -declares that
1608: -.L .c
1609: -files (and
1610: -.L .o
1611: -files, if no source files are named)
1612: -are C++ files.
1613: -If the
1614: -.B -c
1615: -option is not present
1616: -.I lcomp
1617: -creates
1618: -.FR a.out .
1619: -Each time
1620: -.F a.out
1621: -is run statistics are added
1622: -to a profiling file
1623: -.FR prof.out .
1624: -.PP
1625: -.I Lprint
1626: -produces on the standard output a listing (in the style of
1627: -.IR pr (1))
1628: -of the programs compiled by
1629: -.I lcomp.
1630: -Without arguments or files,
1631: -each line of the listing is preceded by the number of times it was executed,
1632: -as determined from the data in
1633: -.FR prof.out .
1634: -.I Lprint
1635: -interprets the following options.
1636: -.TP
1637: -.B -a
1638: -Detailed listing of every machine instruction and how often it was executed.
1639: -.TP
1640: -.B -b
1641: -How often each basic block was executed.
1642: -.TP
1643: -.B -c
1644: -Compress the
1645: -.F prof.out
1646: -file, which otherwise grows with every execution of
1647: -.LR a.out .
1648: -.TP
1649: -.B -f
1650: -Print summary information by function: instruction executions, number of
1651: -invocations, source instructions, and number of instructions never executed.
1652: -.TP
1653: -.B -i
1654: -Before each line of source print the number of machine instructions executed.
1655: -.TP
1656: -.B -p
1657: -Before each line of source print the number of times the first basic block
1658: -in that line was executed.
1659: -.TP
1660: -.B -s
1661: -Summarize the counts by source file: instruction exectuions, source
1662: -instructions, instructions never executed, basic block executions, total
1663: -number of source basic blocks, and how many were never executed.
1664: -.PP
1665: -If any file names are given, the arguments
1666: -.L abip
1667: -apply only to them.
1668: -If no options are given,
1669: -.L -p
1670: -is assumed.
1671: -Any combination of options is allowed.
1672: -.SH FILES
1673: -.TF /usr/lib/nexit.o
1674: -.TP
1675: -.F prof.out
1676: -counts
1677: -.TP
1678: -.F *.sL
1679: -for correlating with source
1680: -.TP
1681: -.F /usr/lib/bb
1682: -for finding basic blocks and inserting counting code
1683: -.TP
1684: -.F /usr/lib/nexit.o
1685: -for printing counts when
1686: -.L a.out
1687: -exits
1688: -.SH "SEE ALSO"
1689: -cc(1), f77(1)
1690: -.SH BUGS
1691: -A line in the source file may be in zero, one, or more basic
1692: -blocks;
1693: -the count given in the listing corresponds to some particular
1694: -choice of the basic block to associate with the line.
1695: -.br
1696: -Processing the output of
1697: -.IR yacc (1)
1698: -without removing
1699: -.L #line
1700: -directives will produce unsatisfactory results.
1701: -.br
1702: -Option
1703: -.B -C
1704: -masks an option of
1705: -.IR cc (1).
1706: //GO.SYSIN DD lcomp.1
1707: echo lprint.c 1>&2
1708: sed 's/.//' >lprint.c <<'//GO.SYSIN DD lprint.c'
1709: -#include "stdio.h"
1710: -#include "ctype.h"
1711: -typedef unsigned long ul;
1712: -typedef struct {
1713: - char *fname;
1714: - int len; /* how many counts have been seen */
1715: - int quot; /* how much has been allocated for cnt */
1716: - int flag;
1717: - unsigned long *cnt; /* the basic block counts */
1718: - int *instrcnt; /* instrs per basic block, from .sL */
1719: - int *lastline; /* last source line containing instr from bb */
1720: -} stab;
1721: -stab *tab;
1722: -int ntab, ltab;
1723: -unsigned long N, B, L, V; /* for summary */
1724: -double A, U;
1725: -FILE *fd, *sfd, *cfd;
1726: -extern FILE *popen();
1727: -char fname[512] = "/"; /* not checked for overflow */
1728: -char buf[256];
1729: -char curfunc[256];
1730: -extern char *malloc();
1731: -char flg[128];
1732: -unsigned long val;
1733: -char prcmd[128] = "pr -h %s "; /* space for extra args */
1734: -
1735: -main(argc, argv)
1736: -char **argv;
1737: -{ int i, j, seenpart = 0;
1738: - if((fd = fopen("prof.out", "r")) == 0) {
1739: - perror("prof.out");
1740: - exit(1);
1741: - }
1742: - readall();
1743: - fclose(fd);
1744: - for(i = 1; i < argc; i++)
1745: - if(argv[i][0] != '-') {
1746: - seenpart++;
1747: - okfile(argv[i]);
1748: - }
1749: - else for(j = 1; argv[i][j]; j++)
1750: - switch(argv[i][j]) {
1751: - default: /* assume whole thing is for pr */
1752: - strcat(prcmd, argv[i]);
1753: - strcat(prcmd, " ");
1754: - break;
1755: - case 'b': /* each bb */
1756: - flg['b']++;
1757: - break;
1758: - case 'a': /* intermediate everything */
1759: - flg['a']++;
1760: - break;
1761: - case 'i': /* count machine instrs */
1762: - flg['i']++;
1763: - break;
1764: - case 'f': /* counts by function */
1765: - flg['f']++;
1766: - flg['s']++;
1767: - break;
1768: - case 'p': /* print, in addition */
1769: - flg['p']++;
1770: - break;
1771: - case 's': /* bb summary */
1772: - flg['s']++;
1773: - break;
1774: - case 'c': /* compress prof.out */
1775: - flg['c']++;
1776: - break;
1777: - }
1778: - if(argc <= seenpart + 1)
1779: - flg['p']++;
1780: - if(!seenpart)
1781: - for(i = 0; i < ntab; i++)
1782: - tab[i].flag = 1;
1783: - if(flg['f']) {
1784: - for(i = 0; i < ntab; i++)
1785: - fsum(tab + i);
1786: - }
1787: - if(flg['s']) {
1788: - for(i = 0; i < ntab; i++)
1789: - summary(tab + i);
1790: - if(ntab > 1)
1791: - printf("%.0fie %ui %uin %.0fbbe %ubb %ubbne total\n",
1792: - A, N, B, U, L, V);
1793: - }
1794: - if(flg['c']) {
1795: - fd = fopen("prof.out", "w");
1796: - if(fd == 0) {
1797: - perror("rewriting prof.out");
1798: - exit(1);
1799: - }
1800: - for(i = 0; i < ntab; i++) {
1801: - fprintf(fd, "%s\n", tab[i].fname);
1802: - for(j = 0; j < tab[i].len; j++)
1803: - fprintf(fd, "%u\n", tab[i].cnt[j]);
1804: - }
1805: - fclose(fd);
1806: - }
1807: - if(flg['p'] || flg['i'] || flg['a'] || flg['b'])
1808: - giantprint();
1809: - exit(0);
1810: -}
1811: -
1812: -okfile(s)
1813: -char *s;
1814: -{ int i, j, k;
1815: - j = strlen(s);
1816: - for(i = 0; i < ntab; i++) {
1817: - k = strlen(tab[i].fname);
1818: - if(strcmp(s, tab[i].fname + k - j) == 0) {
1819: - tab[i].flag = 1;
1820: - return;
1821: - }
1822: - }
1823: - fprintf(stderr, "argument %s not a source file\n", s);
1824: - exit(1);
1825: -}
1826: -
1827: -readall()
1828: -{ int c, i, index;
1829: - stab *curtab = 0;
1830: -sawnl:
1831: - if((c = getc(fd)) == EOF)
1832: - return;
1833: - if(c == '\n')
1834: - goto sawnl;
1835: - if(c == '/') {
1836: - fscanf(fd, "%s", fname+1);
1837: - for(i = 0; i < ntab; i++)
1838: - if(strcmp(fname, tab[i].fname) == 0)
1839: - break;
1840: - if(i >= ntab) { /* new file */
1841: - if(ltab == 0) {
1842: - tab = (stab *)malloc(20 * sizeof(stab));
1843: - ltab = 20;
1844: - }
1845: - else if(ntab >= ltab)
1846: - tab = (stab *)realloc((char *)tab,
1847: - (ltab += 20) * sizeof(stab));
1848: - tab[ntab].fname = malloc(sizeof(fname) + 1);
1849: - strcpy(tab[ntab].fname, fname);
1850: - tab[ntab].flag = tab[ntab].len = tab[ntab].quot = 0;
1851: - ntab++;
1852: - }
1853: - curtab = tab + i;
1854: - index = 0;
1855: - }
1856: - else if(c < '0' || c > '9') {
1857: - fprintf(stderr, "prof.out has weird format\n");
1858: - abort();
1859: - }
1860: - else {
1861: - ungetc(c, fd);
1862: - fscanf(fd, "%d", &val);
1863: - if(curtab->len <= index) {
1864: - if(curtab->quot == 0) {
1865: - curtab->cnt = (ul *)malloc(100*sizeof(long));
1866: - curtab->quot = 100;
1867: - for(i = 0; i < 100; i++)
1868: - curtab->cnt[i] = 0;
1869: - }
1870: - else if(curtab->len >= curtab->quot) {
1871: - curtab->cnt = (ul *)realloc((char *)curtab->cnt,
1872: - (curtab->quot += 200) * sizeof(long));
1873: - for(i = curtab->quot-200; i < curtab->quot; i++)
1874: - curtab->cnt[i] = 0;
1875: - }
1876: - curtab->len++;
1877: - }
1878: - curtab->cnt[index++] += val;
1879: - }
1880: - goto sawnl;
1881: -}
1882: -
1883: -summary(x)
1884: -stab *x;
1885: -{ unsigned long i, v, n, b;
1886: - double a, u;
1887: - for(i = u = v = 0; i < x->len; i++)
1888: - if(x->cnt[i])
1889: - u += x->cnt[i];
1890: - else
1891: - v++;
1892: - n = strlen(x->fname);
1893: - strcpy(buf, x->fname);
1894: - strcpy(buf + n - 2, ".sL");
1895: - if((fd = fopen(buf, "r")) == 0) {
1896: - perror(buf);
1897: - printf("%s %u bbs %.0f execs %u untouched\n",
1898: - x->fname, x->len, u, v);
1899: - return;
1900: - }
1901: - for(n = a = b = 0; ;) {
1902: - (void) fgets(buf, sizeof(buf), fd);
1903: - if(feof(fd))
1904: - break;
1905: - if(hascolon(buf))
1906: - continue;
1907: - n++;
1908: - i = atoi(buf)/4 - 3;
1909: - if(x->cnt[i])
1910: - a += x->cnt[i];
1911: - else
1912: - b++;
1913: - }
1914: - printf("%.0fie %ui %uine %.0fbbe %ubb %ubbne %s\n", a, n, b, u, x->len,
1915: - v, x->fname);
1916: - fclose(fd);
1917: - A += a; N += n; B += b; U += u; L += x->len; V += v;
1918: -}
1919: -
1920: -fsum(x)
1921: -stab *x;
1922: -{ unsigned i, v, n, b, cnt;
1923: - double a, u;
1924: - char *p;
1925: - strcpy(buf, x->fname);
1926: - n = strlen(x->fname);
1927: - strcpy(buf + n - 2, ".sL");
1928: - if((fd = fopen(buf, "r")) == 0) {
1929: - perror(buf);
1930: - return;
1931: - }
1932: - curfunc[0] = 0;
1933: - for(cnt = v = n = b = a = u = 0;;) {
1934: - (void) fgets(buf, sizeof(buf), fd);
1935: - if(feof(fd))
1936: - break;
1937: - if(hascolon(buf)) {
1938: - /* 24 foo.c: 456 or
1939: - * 24 foo.c: _funcjunk */
1940: - for(p = buf; *p != ':'; p++)
1941: - ;
1942: - while(isspace(*++p))
1943: - ;
1944: - if(isdigit(*p))
1945: - continue;
1946: - if(curfunc[0] != 0)
1947: - printf("%.0fie %dcalls %ui %uine %s\n",
1948: - a, v, n, b, curfunc);
1949: - for(i = 0; *p && *p != '\n'; i++)
1950: - curfunc[i] = *p++;
1951: - curfunc[i] = 0;
1952: - a = n = b = 0;
1953: - i = atoi(buf)/4 - 3;
1954: - v = x->cnt[i];
1955: - continue;
1956: - }
1957: - n++;
1958: - i = atoi(buf)/4 - 3;
1959: - if(x->cnt[i])
1960: - a += x->cnt[i];
1961: - else
1962: - b++;
1963: - }
1964: - if(n > 0)
1965: - printf("%.0fie %dcalls %ui %uine %s\n", a, v, n, b, curfunc);
1966: - fclose(fd);
1967: -}
1968: -
1969: -giantprint()
1970: -{ int i, n;
1971: - for(i = 0; i < ntab; i++) {
1972: - if(tab[i].flag == 0)
1973: - continue;
1974: - /* the fname file is the source, there should be a corresponding
1975: - * .sL file for correlation between basic blocks and source.
1976: - * If fname is a .s file, the .sL file is all there is */
1977: - n = strlen(tab[i].fname);
1978: - if(strcmp(".s", tab[i].fname + n - 2) == 0) {
1979: - sfile(tab + i);
1980: - continue;
1981: - }
1982: - sfd = fopen(tab[i].fname, "r");
1983: - if(sfd == 0 && !flg['a']) {
1984: - perror(tab[i].fname);
1985: - return;
1986: - }
1987: - strcpy(buf, tab[i].fname);
1988: - strcpy(buf + n - 1, "sL");
1989: - if((cfd = fopen(buf, "r")) == 0) {
1990: - fprintf(stderr, "no intermediate listing file ");
1991: - perror(buf);
1992: - fclose(sfd);
1993: - return;
1994: - }
1995: - sprintf(buf, prcmd, tab[i].fname);
1996: - if(!flg['a'])
1997: - fd = popen(buf, "w");
1998: - if(!flg['a'])
1999: - xlistit(tab + i);
2000: - else
2001: - listit(tab + i);
2002: - if(fd)
2003: - pclose(fd);
2004: - if(sfd)
2005: - fclose(sfd);
2006: - fclose(cfd);
2007: - }
2008: -}
2009: -
2010: -sfile(x)
2011: -stab *x;
2012: -{ int i;
2013: - char *p;
2014: - strcpy(buf, x->fname);
2015: - strcat(buf, "L");
2016: - sfd = fopen(buf, "r");
2017: - if(sfd == 0) {
2018: - perror(buf);
2019: - return;
2020: - }
2021: - sprintf(buf, "pr -h %s", x->fname);
2022: - fd = popen(buf, "w");
2023: - if(fd == 0) {
2024: - perror(buf);
2025: - fclose(sfd);
2026: - return;
2027: - }
2028: - for(;;) {
2029: - (void) fgets(buf, sizeof(buf), sfd);
2030: - if(feof(sfd)) {
2031: - pclose(fd);
2032: - fclose(sfd);
2033: - return;
2034: - }
2035: - for(i = 0, p = buf; *p >= '0' && *p <= '9'; p++)
2036: - i = 10 * i + *p - '0';
2037: - i = i/4 - 3;
2038: - fprintf(fd, "%u\t%s", x->cnt[i], p);
2039: - }
2040: -}
2041: -
2042: -/* function added, so name (stripnum) is now misleading */
2043: -char *
2044: -stripnum(s)
2045: -char *s;
2046: -{ char *p;
2047: - while(*s && (isdigit(*s) || isspace(*s)))
2048: - s++;
2049: - for(p = s; *p && *p != '\n'; p++)
2050: - ;
2051: - if(*p == '\n')
2052: - *p = ' ';
2053: - return(s);
2054: -}
2055: -
2056: -listit(x)
2057: -stab *x;
2058: -{ int i;
2059: - char *p;
2060: - for(;;) {
2061: - (void) fgets(buf, sizeof(buf), cfd);
2062: - if(feof(cfd))
2063: - break;
2064: - for(p = buf; *p && *p != ':' ; p++)
2065: - ;
2066: - if(*p++ != ':') { /* these are instructions */
2067: - i = x->cnt[atoi(buf)/4 - 3];
2068: - printf("%d\t%s\n", i, stripnum(buf));
2069: - continue;
2070: - }
2071: - else {
2072: - printf("%s", stripnum(buf));
2073: - if(atoi(p) == 0) { /* foo.c: _main */
2074: - putchar('\n');
2075: - continue;
2076: - }
2077: - (void) fgets(buf, sizeof(buf), sfd);
2078: - printf("%s", buf);
2079: - continue;
2080: - }
2081: - }
2082: -}
2083: -
2084: -xlistit(x)
2085: -stab *x;
2086: -{ int lnum, i, icnt, bcnt;
2087: - char *p;
2088: - x->instrcnt = (int *) malloc(x->len * sizeof(int));
2089: - x->lastline = (int *) malloc(x->len * sizeof(int));
2090: - if(!x->instrcnt || !x->lastline) {
2091: - fprintf(stderr, "out of memory\n");
2092: - return;
2093: - }
2094: - for(i = 0; i < x->len; i++)
2095: - x->instrcnt[i] = x->lastline[i] = 0;
2096: - for(;;) {
2097: - (void) fgets(buf, sizeof(buf), cfd);
2098: - if(feof(cfd))
2099: - break;
2100: - for(p = buf; *p && *p != ':'; p++)
2101: - ;
2102: - if(*p++ != ':') { /* instruction */
2103: - x->instrcnt[atoi(buf)/4 - 3]++;
2104: - continue;
2105: - }
2106: - lnum = atoi(p); /* hmm (atoi (" x..") is zero?)*/
2107: - if(lnum <= 0)
2108: - continue;
2109: - i = atoi(buf)/4 - 3;
2110: - x->lastline[i] = lnum;
2111: - }
2112: - /* now read all the source lines and print out appropriate stuff */
2113: - for(lnum = 1, i = 0;; lnum++) {
2114: - (void) fgets(buf, sizeof(buf), sfd);
2115: - if(feof(sfd))
2116: - return;
2117: - icnt = bcnt = 0;
2118: - for(; i < x->len && x->lastline[i] <= lnum; i++) {
2119: - if(flg['b'] && flg['i'])
2120: - fprintf(fd, "%u,%ui ", x->cnt[i],
2121: - x->cnt[i] * x->instrcnt[i]);
2122: - else if(flg['b'])
2123: - fprintf(fd, "%u ", x->cnt[i]);
2124: - else {
2125: - icnt += x->cnt[i] * x->instrcnt[i];
2126: - bcnt += x->cnt[i];
2127: - }
2128: - }
2129: - if(!flg['b'] && flg['p'] && bcnt)
2130: - fprintf(fd, "%u ", bcnt);
2131: - if(!flg['b'] && flg['i'] && icnt)
2132: - fprintf(fd, "%ui ", icnt);
2133: - fprintf(fd, "\t%s", buf);
2134: - }
2135: -}
2136: -
2137: -hascolon(s)
2138: -register char *s;
2139: -{
2140: - for(; *s && *s != ':'; s++)
2141: - ;
2142: - if(*s == ':')
2143: - return(1);
2144: - else
2145: - return(0);
2146: -}
2147: //GO.SYSIN DD lprint.c
2148: echo lsub.c 1>&2
2149: sed 's/.//' >lsub.c <<'//GO.SYSIN DD lsub.c'
2150: -#include "stdio.h"
2151: -typedef unsigned long ul;
2152: -typedef struct {
2153: - char *fname;
2154: - int len; /* how many counts have been seen */
2155: - int quot; /* how much has been allocated for cnt */
2156: - unsigned long *cnt;
2157: -} stab;
2158: -stab *tab;
2159: -int ntab, ltab;
2160: -FILE *fd, *sfd, *cfd;
2161: -char buf[256];
2162: -char fname[512] = "/";
2163: -extern char *malloc();
2164: -char flg[128];
2165: -unsigned long val;
2166: -
2167: -main(argc, argv)
2168: -char **argv;
2169: -{ int i, j;
2170: - if(argc <= 1) {
2171: - fprintf(stderr, "subtract from where?\n");
2172: - exit(1);
2173: - }
2174: - if((fd = fopen("prof.out", "r")) == 0) {
2175: - perror("prof.out");
2176: - exit(1);
2177: - }
2178: - readall(fd);
2179: - fclose(fd);
2180: - sfd = fopen(argv[1], "r");
2181: - if(sfd == 0) {
2182: - perror(argv[1]);
2183: - exit(1);
2184: - }
2185: - suball(sfd);
2186: - fclose(sfd);
2187: - if((fd = fopen("prof.out", "w")) == 0) {
2188: - perror(argv[1]);
2189: - exit(1);
2190: - }
2191: - for(i = 0; i < ntab; i++)
2192: - rewrite(tab + i);
2193: - exit(0);
2194: -}
2195: -
2196: -readall(fd)
2197: -FILE *fd;
2198: -{ int c, i, index;
2199: - stab *curtab = 0;
2200: -sawnl:
2201: - if((c = getc(fd)) == EOF)
2202: - return;
2203: - if(c == '\n')
2204: - goto sawnl;
2205: - if(c == '/') {
2206: - fscanf(fd, "%s", fname+1);
2207: - for(i = 0; i < ntab; i++)
2208: - if(strcmp(fname, tab[i].fname) == 0)
2209: - break;
2210: - if(i >= ntab) { /* new file */
2211: - if(ltab == 0) {
2212: - tab = (stab *)malloc(20 * sizeof(stab));
2213: - ltab = 20;
2214: - }
2215: - else if(ntab >= ltab)
2216: - tab = (stab *)realloc((char *)tab,
2217: - (ltab += 20) * sizeof(stab));
2218: - tab[ntab].fname = malloc(sizeof(fname) + 1);
2219: - strcpy(tab[ntab].fname, fname);
2220: - tab[ntab].len = tab[ntab].quot = 0;
2221: - ntab++;
2222: - }
2223: - curtab = tab + i;
2224: - index = 0;
2225: - }
2226: - else if(c < '0' || c > '9') {
2227: - fprintf(stderr, "prof.out has weird format\n");
2228: - abort();
2229: - }
2230: - else {
2231: - ungetc(c, fd);
2232: - fscanf(fd, "%d", &val);
2233: - if(curtab->len <= index) {
2234: - if(curtab->quot == 0) {
2235: - curtab->cnt = (ul *)malloc(100*sizeof(long));
2236: - curtab->quot = 100;
2237: - for(i = 0; i < 100; i++)
2238: - curtab->cnt[i] = 0;
2239: - }
2240: - else if(curtab->len >= curtab->quot) {
2241: - curtab->cnt = (ul *)realloc(curtab->cnt,
2242: - (curtab->quot += 200) * sizeof(long));
2243: - for(i = curtab->quot-200; i < curtab->quot; i++)
2244: - curtab->cnt[i] = 0;
2245: - }
2246: - curtab->len++;
2247: - }
2248: - curtab->cnt[index++] += val;
2249: - }
2250: - goto sawnl;
2251: -}
2252: -
2253: -rewrite(x)
2254: -stab *x;
2255: -{ int i;
2256: - for(i = 0; i < x->len; i++)
2257: - if(x->cnt[i])
2258: - break;
2259: - if(i >= x->len)
2260: - return;
2261: - fprintf(fd, "%s\n", x->fname);
2262: - for(i = 0; i < x->len; i++)
2263: - fprintf(fd, "%u\n", x->cnt[i]);
2264: -}
2265: -suball(fd)
2266: -FILE *fd;
2267: -{ int c, i, index;
2268: - stab *curtab = 0;
2269: -sawnl:
2270: - if((c = getc(fd)) == EOF)
2271: - return;
2272: - if(c == '\n')
2273: - goto sawnl;
2274: - if(c == '/') {
2275: - fscanf(fd, "%s", fname+1);
2276: - for(i = 0; i < ntab; i++)
2277: - if(strcmp(fname, tab[i].fname) == 0)
2278: - break;
2279: - if(i >= ntab) { /* new file */
2280: - fprintf(stderr, "new file %s ignored\n", fname);
2281: - goto sawnl;
2282: - }
2283: - curtab = tab + i;
2284: - index = 0;
2285: - }
2286: - else if(c < '0' || c > '9') {
2287: - fprintf(stderr, "prof.out has weird format\n");
2288: - abort();
2289: - }
2290: - else {
2291: - ungetc(c, fd);
2292: - fscanf(fd, "%d", &val);
2293: - curtab->cnt[index++] -= val;
2294: - }
2295: - goto sawnl;
2296: -}
2297: //GO.SYSIN DD lsub.c
2298: echo lcomp 1>&2
2299: sed 's/.//' >lcomp <<'//GO.SYSIN DD lcomp'
2300: -# lcomp recognizes the following arguments to cc: c, w, p, D, U, I g.
2301: -# lcomp recognizes the following arguments to f77: c, w, p.
2302: -# it does not accept ratfor or efl
2303: -# lcomp recognizes the following argument to as: R
2304: -# lcomp recognizes the following arguments to ld: d, l, N, n, z
2305: -# the output from -c is .o plus .sL
2306: -DIR=/usr/lib
2307: -COMP=${COMP-cc}
2308: -PATH=/bin:/usr/bin
2309: -for i in $*
2310: -do
2311: - case $i in
2312: - -c) compflag=1
2313: - ;;
2314: - *.c) clist="$clist $i"
2315: - u=`basename $i | sed 's/c$//'`
2316: - bblist="$bblist "$u"s"
2317: - rmlist="$rmlist "$u"s"
2318: - slist="$slist "X$u"s"
2319: - llist="$llist "$u"o"
2320: - ;;
2321: - -D*|-I*|-U*)
2322: - clist="$clist $i"
2323: - ;;
2324: - *.f) flist="$flist "$i
2325: - u=`basename $i | sed 's/f$//'`
2326: - bblist="$bblist "$u"s"
2327: - rmlist="$rmlist "$u"s"
2328: - slist="$slist "X$u"s"
2329: - llist="$llist "$u"o"
2330: - ;;
2331: - *.s) bblist="$bblist "$i
2332: - u=`basename $i | sed 's/s$//'`
2333: - slist="$slist "X$u"s"
2334: - llist="$llist "$u"o"
2335: - ;;
2336: - -w|-p|-R|-d|-l*|-N|-n|-t|-z|*.o|*.a)
2337: - llist="$llist "$i
2338: - ;;
2339: - *) echo incomprehensible argument $i ignored
2340: - ;;
2341: - -g)
2342: - ;;
2343: - esac
2344: -done
2345: -# get .s files
2346: -if test "$flist"
2347: -then
2348: - f77 -g -S $flist
2349: -fi
2350: -if test "$clist"
2351: -then
2352: - $COMP -g -S $clist
2353: -fi
2354: -# create X*.s and *.sL files
2355: -if test "$bblist"
2356: -then
2357: - $DIR/bb $bblist
2358: -fi
2359: -# create X*.o files
2360: -if test "$flist"
2361: -then
2362: - f77 -g -c $slist
2363: -elif test "$clist"
2364: -then
2365: - $COMP -g -c $slist
2366: -fi
2367: -# make them into real .o files
2368: -if test "$rmlist"
2369: -then
2370: - for i in X*.o
2371: - do
2372: - mv $i `echo $i | sed s/X//`
2373: - done
2374: -fi
2375: -rm -f X*.s $rmlist prof.out
2376: -
2377: -if test $compflag
2378: -then exit 0
2379: -fi
2380: -if test "$flist"
2381: -then
2382: - f77 -g $DIR/nexit.o $llist
2383: -else
2384: - $COMP -g $DIR/nexit.o $llist $lC
2385: -fi
2386: //GO.SYSIN DD lcomp
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.