Annotation of researchv9/cmd/sun/c2/main.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

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