|
|
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.