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