|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)main.c 1.1 86/02/03 Copyr 1985 Sun Micro"; ! 3: #endif ! 4: ! 5: /* ! 6: * Copyright (c) 1985 by Sun Microsystems, Inc. ! 7: */ ! 8: ! 9: #include "as.h" ! 10: #include "c2.h" ! 11: #include "cctypes.h" ! 12: ! 13: char title[STR_MAX]; ! 14: struct sym_bkt *dot_bkt ; /* Ptr to location counter's symbol bucket */ ! 15: struct ins_ptr *ins_hash_tab[HASH_MAX]; ! 16: struct ins_ptr *inst; ! 17: char *source_name = NULL; ! 18: char *out_name = NULL; ! 19: char *asm_name; /* set from argv[0] below: used in error.c */ ! 20: int xrefflag; ! 21: int Xperimental; ! 22: int ext_instruction_set; ! 23: int debflag, statflag, verboseflag, globflag; ! 24: char sebuf[BUFSIZ]; ! 25: struct ins_bkt *moveq, *subql, *addql; ! 26: struct ins_bkt *tstw, *tstl; ! 27: ! 28: regmask exitmask = 077; /* d0/d1 long */ ! 29: ! 30: init(argc,argv) ! 31: char *argv[]; ! 32: { ! 33: ! 34: asm_name = *(argv++); ! 35: while (--argc) { ! 36: if (argv[0][0] == '-') switch (argv[0][1]) { ! 37: case 'D': debflag++; ! 38: break; ! 39: case 'x': xrefflag++; ! 40: break; ! 41: case 'n': statflag++; ! 42: break; ! 43: case 'v': verboseflag++; ! 44: break; ! 45: case 'g': globflag++; ! 46: break; ! 47: case 'X': Xperimental++; ! 48: break; ! 49: case '1': if (argv[0][2]== '0' && argv[0][3] == '\0') { ! 50: ext_instruction_set = 0; ! 51: break; ! 52: } ! 53: goto unknown; ! 54: case '2': if (argv[0][2]== '0' && argv[0][3] == '\0') { ! 55: ext_instruction_set = 1; ! 56: break; ! 57: } ! 58: goto unknown; ! 59: ! 60: unknown: ! 61: default: fprintf(stderr,"%s: Unknown option '%c' ignored.\n", ! 62: asm_name, argv[0][1]); ! 63: } else if (source_name != NULL) { ! 64: if (out_name != NULL) ! 65: fprintf(stderr,"%s: Too many file names given\n", asm_name); ! 66: else ! 67: out_name = argv[0]; ! 68: if (freopen(out_name,"w",stdout) == NULL) { ! 69: fprintf(stderr,"%s: Can't open source file: %s\n", ! 70: asm_name, out_name); ! 71: exit(1); ! 72: } ! 73: } else { ! 74: source_name = argv[0]; ! 75: if (freopen(source_name,"r",stdin) == NULL) { ! 76: fprintf(stderr,"%s: Can't open source file: %s\n", ! 77: asm_name, source_name); ! 78: exit(1); ! 79: } ! 80: } ! 81: argv++; ! 82: } ! 83: ! 84: ! 85: /* Initialize symbols */ ! 86: sym_init(); ! 87: dot_bkt = lookup("."); /* make bucket for location counter */ ! 88: dot_bkt->csect_s = cur_csect_name; ! 89: dot_bkt->attr_s = S_DEC | S_DEF | S_LABEL; /* "S_LABEL" so it cant be redefined as a label */ ! 90: init_regs(); /* define register names */ ! 91: init_builtins(); /* define magic subroutines */ ! 92: init_csects(); ! 93: d_ins(); /* set up opcode hash table */ ! 94: perm(); ! 95: moveq = sopcode("moveq"); ! 96: subql = sopcode("subql"); ! 97: addql = sopcode("addql"); ! 98: tstw = sopcode("tstw"); ! 99: tstl = sopcode("tstl"); ! 100: } ! 101: ! 102: void ! 103: freeprogram(){ ! 104: register NODE *p; ! 105: register struct oper **op; ! 106: register i,n; ! 107: ! 108: p = first.forw; ! 109: while( p != &first){ ! 110: switch (p->op){ ! 111: default: ! 112: if (n=p->nref){ ! 113: op = &p->ref[0]; ! 114: for (i=0; i<n; i++) ! 115: freeoperand( *(op++) ); ! 116: } ! 117: break; ! 118: case OP_LABEL: ! 119: p->name->attr_s &= ~S_DEF; ! 120: break; ! 121: } ! 122: p=p->forw; ! 123: (p->back )->forw = freenodes; ! 124: freenodes = (p->back ); ! 125: } ! 126: first.forw = first.back = &first; ! 127: } ! 128: ! 129: prstats(){ ! 130: fflush(stdout); ! 131: fflush(stderr); ! 132: setbuf(stderr, sebuf); ! 133: fprintf(stderr,"%d jumps to jumps\n", meter.nbrbr); ! 134: fprintf(stderr,"%d inst. after jumps\n", meter.iaftbr); ! 135: fprintf(stderr,"%d inst. after rts\n", meter.ndrop); ! 136: fprintf(stderr,"%d jumps to .+2\n", meter.njp1); ! 137: fprintf(stderr,"%d redundant labels\n", meter.nrlab); ! 138: fprintf(stderr,"%d jump-started loops\n", meter.nxjump); ! 139: fprintf(stderr,"%d inverted loops\n", meter.loopiv); ! 140: fprintf(stderr,"%d code motions\n", meter.ncmot); ! 141: fprintf(stderr,"%d branches reversed\n", meter.nrevbr); ! 142: fprintf(stderr,"%d redundant moves\n", meter.redunm); ! 143: fprintf(stderr,"%d moves weakened\n", meter.nwmov); ! 144: fprintf(stderr,"%d ops weakened\n", meter.nwop); ! 145: fprintf(stderr,"%d simplified addresses\n", meter.nsaddr); ! 146: fprintf(stderr,"%d redundent sign extensions\n", meter.nredext); ! 147: fprintf(stderr,"%d dbra's inserted\n", meter.ndbra); ! 148: fprintf(stderr,"%d jump/dbra's flipped\n", meter.ndbrarev); ! 149: fprintf(stderr,"%d redundant shifts\n", meter.nredshf); ! 150: fprintf(stderr,"%d redundant jumps\n", meter.nredunj); ! 151: fprintf(stderr,"%d common seqs before jmp's\n", meter.ncomj); ! 152: fprintf(stderr,"%d skips over jumps\n", meter.nskip); ! 153: fprintf(stderr,"%d redundant tst's\n", meter.nrtst); ! 154: fprintf(stderr,"%d addl's merged with link's\n", meter.namwl); ! 155: fprintf(stderr,"%d movem's removed\n", meter.nrmtfr); ! 156: fprintf(stderr,"%d movem's changed to move's\n", meter.nmmtmo); ! 157: fprintf(stderr,"%d mov's changed to clr's\n", meter.nmtoc); ! 158: fprintf(stderr,"%d mov's changed to sub's\n", meter.nmtos); ! 159: fprintf(stderr,"%d cmp's changed to tst's\n", meter.nctot); ! 160: fprintf(stderr,"%d cmp's changed to mov's\n", meter.nttomo); ! 161: fprintf(stderr,"%d indirections combined with incr/decr\n", ! 162: meter.nplusminus); ! 163: fprintf(stderr,"%d single precision SKY operations changed to use registers\n", meter.nskyreg); ! 164: fprintf(stderr,"%d double precision SKY moves simplified\n", ! 165: meter.ndpsky); ! 166: fprintf(stderr,"%d uses of fmovecr\n", meter.nusecr); ! 167: fflush(stderr); ! 168: } ! 169: ! 170: main(argc,argv) ! 171: char *argv[]; ! 172: { ! 173: int scanflag; ! 174: int iterate; ! 175: init(argc,argv); /* Initialization */ ! 176: do{ ! 177: scanflag = scan(); ! 178: rectify(); ! 179: onceonly(); ! 180: do { ! 181: if (debflag){ ! 182: printf("________________________________________\n"); ! 183: dumpprogram(verboseflag); ! 184: } ! 185: do { ! 186: iterate = relabel(); ! 187: iterate += tangle(); ! 188: iterate += zipper(); ! 189: iterate += tmerge(); ! 190: iterate += invloop(); ! 191: if (debflag>1){ ! 192: printf("========================================\n"); ! 193: dumpprogram(verboseflag); ! 194: printf("========================================\n"); ! 195: } ! 196: } while (iterate); ! 197: livereg(); ! 198: iterate += stackops(); ! 199: iterate += coalesce(); ! 200: iterate += shorten(); ! 201: iterate += content(); ! 202: } while (iterate); ! 203: quicken(); ! 204: dumpprogram(verboseflag); ! 205: if (xrefflag) xref(); ! 206: freeprogram(); ! 207: } while( scanflag ); ! 208: if (statflag) { ! 209: prstats(); ! 210: } ! 211: exit(errors? -1: 0); ! 212: } ! 213: ! 214: char * ! 215: c2pseudocomment( p ) ! 216: char *p; ! 217: { ! 218: extern char *term(); ! 219: static char procfooey[6] = {'P','R','O','C','#',' ' }; ! 220: if (strncmp(p, procfooey, sizeof procfooey) == 0){ ! 221: p += sizeof procfooey; ! 222: (void)term( p, &operands[0] ); ! 223: if (operands[0].type_o!=T_NORMAL || operands[0].sym_o != NULL) ! 224: prog_error(E_OPERAND); ! 225: switch (operands[0].value_o){ ! 226: case UNDEF: /* void function returns no value */ ! 227: exitmask = regmask0; ! 228: break; ! 229: case DOUBLE: /* returns value in d0/d1 */ ! 230: exitmask = addmask(MAKERMASK( D0REG, LR ) , MAKERMASK( D0REG+1, LR)); ! 231: break; ! 232: default: /* returns value in d0 */ ! 233: exitmask = MAKERMASK( D0REG, LR ); ! 234: break; ! 235: } ! 236: return globflag?p:NULL; ! 237: } ! 238: return p; ! 239: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.