File:  [Research Unix] / researchv9 / cmd / sun / c2 / main.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 17:21:59 2018 UTC (8 years, 1 month ago) by root
Branches: belllabs, MAIN
CVS tags: researchv9-SUN3_old, researchv9-SUN3, HEAD
researchv9-SUN3(old)

#ifndef lint
static	char sccsid[] = "@(#)main.c 1.1 86/02/03 Copyr 1985 Sun Micro";
#endif

/*
 * Copyright (c) 1985 by Sun Microsystems, Inc.
 */

#include "as.h"
#include "c2.h"
#include "cctypes.h"

char title[STR_MAX];
struct sym_bkt *dot_bkt ;	/* Ptr to location counter's symbol bucket */
struct ins_ptr *ins_hash_tab[HASH_MAX];
struct ins_ptr *inst;
char *source_name = NULL;
char *out_name = NULL;
char *asm_name;	/* set from argv[0] below: used in error.c */
int  xrefflag;
int  Xperimental;
int  ext_instruction_set;
int  debflag, statflag, verboseflag, globflag;
char	sebuf[BUFSIZ];
struct ins_bkt *moveq, *subql, *addql;
struct ins_bkt *tstw, *tstl;

regmask exitmask = 077; /* d0/d1 long */

init(argc,argv)
	char *argv[];
{

	asm_name = *(argv++);
	while (--argc) {
	  if (argv[0][0] == '-') switch (argv[0][1]) {
	    case 'D':	debflag++;
			break;
	    case 'x':   xrefflag++;
			break;
	    case 'n':   statflag++;
			break;
	    case 'v':   verboseflag++;
			break;
	    case 'g':	globflag++;
			break;
	    case 'X':	Xperimental++;
			break;
	    case '1':	if (argv[0][2]== '0' && argv[0][3] == '\0') {
			    ext_instruction_set = 0;
			    break;
			}
			goto unknown;
	    case '2':	if (argv[0][2]== '0' && argv[0][3] == '\0') {
			    ext_instruction_set = 1;
			    break;
			}
			goto unknown;

	    unknown:
	    default:	fprintf(stderr,"%s: Unknown option '%c' ignored.\n",
				asm_name, argv[0][1]);
	  } else if (source_name != NULL) {
		if (out_name != NULL)
		    fprintf(stderr,"%s: Too many file names given\n", asm_name);
		else
		out_name = argv[0];
		if (freopen(out_name,"w",stdout) == NULL) {
		    fprintf(stderr,"%s: Can't open source file: %s\n",
			asm_name, out_name);
		    exit(1);
		 }
	  } else {
		source_name = argv[0];
		if (freopen(source_name,"r",stdin) == NULL) {
		    fprintf(stderr,"%s: Can't open source file: %s\n",
			asm_name, source_name);
		    exit(1);
		 }
	  }
	  argv++;
	}


	/* Initialize symbols */
	sym_init();
	dot_bkt = lookup(".");		/* make bucket for location counter */
	dot_bkt->csect_s = cur_csect_name;
	dot_bkt->attr_s = S_DEC | S_DEF | S_LABEL; 	/* "S_LABEL" so it cant be redefined as a label */
	init_regs();			/* define register names */
	init_builtins();		/* define magic subroutines */
	init_csects();
	d_ins();			/* set up opcode hash table */
	perm();
	moveq = sopcode("moveq");
	subql = sopcode("subql");
	addql = sopcode("addql");
	tstw = sopcode("tstw");
	tstl = sopcode("tstl");
}

void
freeprogram(){
    register NODE *p;
    register struct oper **op;
    register i,n;

    p = first.forw;
    while( p != &first){
	switch (p->op){
	default:
	    if (n=p->nref){
		op = &p->ref[0];
		for (i=0; i<n; i++)
		    freeoperand( *(op++) );
	    }
	    break;
	case OP_LABEL:
	    p->name->attr_s &= ~S_DEF;
	    break;
	}
	p=p->forw;
	(p->back )->forw = freenodes;
	freenodes = (p->back );
    }
    first.forw = first.back = &first;
}

prstats(){
		fflush(stdout);
		fflush(stderr);
		setbuf(stderr, sebuf);
		fprintf(stderr,"%d jumps to jumps\n", meter.nbrbr);
		fprintf(stderr,"%d inst. after jumps\n", meter.iaftbr);
		fprintf(stderr,"%d inst. after rts\n", meter.ndrop);
		fprintf(stderr,"%d jumps to .+2\n", meter.njp1);
		fprintf(stderr,"%d redundant labels\n", meter.nrlab);
		fprintf(stderr,"%d jump-started loops\n", meter.nxjump);
		fprintf(stderr,"%d inverted loops\n", meter.loopiv);
		fprintf(stderr,"%d code motions\n", meter.ncmot);
		fprintf(stderr,"%d branches reversed\n", meter.nrevbr);
		fprintf(stderr,"%d redundant moves\n", meter.redunm);
		fprintf(stderr,"%d moves weakened\n", meter.nwmov);
		fprintf(stderr,"%d ops weakened\n", meter.nwop);
		fprintf(stderr,"%d simplified addresses\n", meter.nsaddr);
		fprintf(stderr,"%d redundent sign extensions\n", meter.nredext);
		fprintf(stderr,"%d dbra's inserted\n", meter.ndbra);
		fprintf(stderr,"%d jump/dbra's flipped\n", meter.ndbrarev);
		fprintf(stderr,"%d redundant shifts\n", meter.nredshf);
		fprintf(stderr,"%d redundant jumps\n", meter.nredunj);
		fprintf(stderr,"%d common seqs before jmp's\n", meter.ncomj);
		fprintf(stderr,"%d skips over jumps\n", meter.nskip);
		fprintf(stderr,"%d redundant tst's\n", meter.nrtst);
		fprintf(stderr,"%d addl's merged with link's\n", meter.namwl);
		fprintf(stderr,"%d movem's removed\n", meter.nrmtfr);
		fprintf(stderr,"%d movem's changed to move's\n", meter.nmmtmo);
		fprintf(stderr,"%d mov's changed to clr's\n", meter.nmtoc);
		fprintf(stderr,"%d mov's changed to sub's\n", meter.nmtos);
		fprintf(stderr,"%d cmp's changed to tst's\n", meter.nctot);
		fprintf(stderr,"%d cmp's changed to mov's\n", meter.nttomo);
		fprintf(stderr,"%d indirections combined with incr/decr\n", 
			meter.nplusminus);
		fprintf(stderr,"%d single precision SKY operations changed to use registers\n", meter.nskyreg);
		fprintf(stderr,"%d double precision SKY moves simplified\n", 
			meter.ndpsky);
		fprintf(stderr,"%d uses of fmovecr\n", meter.nusecr);
		fflush(stderr);
}

main(argc,argv)
	char *argv[];
{
	int scanflag;
	int iterate;
	init(argc,argv);                       /* Initialization */
	do{
	    scanflag = scan();
	    rectify();
	    onceonly();
	    do {
		if (debflag){
		    printf("________________________________________\n");
		    dumpprogram(verboseflag);
		}
		do {
		    iterate  = relabel();
		    iterate += tangle();
		    iterate += zipper();
		    iterate += tmerge();
		    iterate += invloop();
		    if (debflag>1){
			printf("========================================\n");
			dumpprogram(verboseflag);
			printf("========================================\n");
		    }
		} while (iterate);
		livereg();
		iterate += stackops();
		iterate += coalesce();
		iterate += shorten();
		iterate += content();
	    } while (iterate);
	    quicken();
	    dumpprogram(verboseflag);
	    if (xrefflag) xref();
	    freeprogram();
	} while( scanflag );
	if (statflag) {
	    prstats();
	}
	exit(errors? -1: 0);
}

char *
c2pseudocomment( p )
    char *p;
{
    extern char *term();
    static char procfooey[6] = {'P','R','O','C','#',' ' };
    if (strncmp(p, procfooey, sizeof procfooey) == 0){
	p += sizeof procfooey;
	(void)term( p, &operands[0] );
	if (operands[0].type_o!=T_NORMAL || operands[0].sym_o != NULL)
	    prog_error(E_OPERAND);
	switch (operands[0].value_o){
	case UNDEF: /* void function returns no value */
	    exitmask = regmask0; 
	    break;
	case DOUBLE: /* returns value in d0/d1 */
	    exitmask = addmask(MAKERMASK( D0REG, LR ) , MAKERMASK( D0REG+1, LR));
	    break;
	default:     /* returns value in d0 */
	    exitmask = MAKERMASK( D0REG, LR );
	    break;
	}
	return globflag?p:NULL;
    }
    return p;
}

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.