Annotation of researchv9/cmd/sun/c2/main.c, revision 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.