Annotation of 43BSD/ucb/pascal/src/tmps.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1980 Regents of the University of California.
                      3:  * All rights reserved.  The Berkeley software License Agreement
                      4:  * specifies the terms and conditions for redistribution.
                      5:  */
                      6: 
                      7: #ifndef lint
                      8: static char sccsid[] = "@(#)tmps.c     5.1 (Berkeley) 6/5/85";
                      9: #endif not lint
                     10: 
                     11: #include "whoami.h"
                     12: #include "0.h"
                     13: #include "objfmt.h"
                     14: #ifdef PC
                     15: #   include "pc.h"
                     16: #endif PC
                     17: #include "align.h"
                     18: #include "tmps.h"
                     19: 
                     20: /*
                     21:  * This routine defines the register allocation strategy
                     22:  * All temporaries are allocated here, and this routines decides
                     23:  * where they are to be put.
                     24:  */
                     25: #ifdef PC
                     26:     /*
                     27:      * register temporaries
                     28:      * - are allocated from highreg towards lowreg.
                     29:      * - are of size regsize.
                     30:      * - register numbers from the various register types are mapped to 
                     31:      *   integer register numbers using the offsets.  (cf. pcc/mac2defs)
                     32:      *
                     33:      * stack temporaries
                     34:      * - are allocated on a downward growing stack.
                     35:      */
                     36: 
                     37: #ifdef vax
                     38:     /*
                     39:      * first pass register declaration constants
                     40:      */
                     41: struct regtype {
                     42:     long       lowreg;
                     43:     long       highreg;
                     44:     long       regsize;
                     45: } regtypes[NUMREGTYPES] = {
                     46:        { 6, 11, 4 },           /* r6..r11 */
                     47: };
                     48: #endif vax
                     49: 
                     50: #ifdef mc68000
                     51:     /*
                     52:      * first pass register declaration constants
                     53:      */
                     54: struct regtype {
                     55:     long       lowreg;
                     56:     long       highreg;
                     57:     long       regsize;
                     58: } regtypes[NUMREGTYPES] = {
                     59:        { 2, 7, 4 },            /* d2..d7 */
                     60:        { 2, 5, 4 },            /* a2..a5 */
                     61: };
                     62: #endif mc68000
                     63: #endif PC
                     64: 
                     65: tmpinit(cbn)
                     66:        int     cbn;
                     67: {
                     68:        struct om       *sizesp = &sizes[cbn];
                     69: #      ifdef PC
                     70:        int     i;
                     71: #      endif PC
                     72: 
                     73:        sizesp->om_max = -DPOFF1;
                     74:        sizesp->curtmps.om_off = -DPOFF1;
                     75: #      ifdef PC
                     76:                for (i = 0; i < NUMREGTYPES; i++) {
                     77:                        sizesp->low_water[i] = regtypes[i].highreg + 1;
                     78:                        sizesp->curtmps.next_avail[i] = regtypes[i].highreg;
                     79:                }
                     80: #      endif PC
                     81: }
                     82: 
                     83: /*
                     84:  * allocate runtime temporary variables
                     85:  */
                     86: /*ARGSUSED*/
                     87: struct nl *
                     88: tmpalloc(size, type, mode)
                     89:        long size;
                     90:        struct nl *type;
                     91:        int mode;
                     92: {
                     93:        register struct om      *op = &sizes[ cbn ];
                     94:        register int            offset;
                     95:        register struct nl      *nlp;
                     96:        long                    alignment;
                     97: 
                     98: #      ifdef PC
                     99: #          ifdef vax
                    100:                if (  mode == REGOK
                    101:                   && size == regtypes[REG_GENERAL].regsize
                    102:                   && op->curtmps.next_avail[REG_GENERAL]
                    103:                            >= regtypes[REG_GENERAL].lowreg) {
                    104:                        offset = op->curtmps.next_avail[REG_GENERAL]--;
                    105:                        if (offset < op->low_water[REG_GENERAL]) {
                    106:                                op->low_water[REG_GENERAL] = offset;
                    107:                        }
                    108:                        nlp = defnl( (char *) 0 , VAR , type , offset );
                    109:                        nlp -> extra_flags = NLOCAL | NREGVAR;
                    110:                        putlbracket(ftnno, op);
                    111:                        return nlp;
                    112:                }
                    113: #          endif vax
                    114: #          ifdef mc68000
                    115:                if (  mode == REGOK
                    116:                   && type != nl + TPTR
                    117:                   && size == regtypes[REG_DATA].regsize
                    118:                   && op->curtmps.next_avail[REG_DATA]
                    119:                            >= regtypes[REG_DATA].lowreg) {
                    120:                        offset = op->curtmps.next_avail[REG_DATA]--;
                    121:                        if (offset < op->low_water[REG_DATA]) {
                    122:                                op->low_water[REG_DATA] = offset;
                    123:                        }
                    124:                        nlp = defnl(0, VAR, type, offset + DATA_REG_OFFSET );
                    125:                        nlp -> extra_flags = NLOCAL | NREGVAR;
                    126:                        putlbracket(ftnno, op);
                    127:                        return nlp;
                    128:                }
                    129:                if (  mode == REGOK
                    130:                   && type == nl + TPTR
                    131:                   && size == regtypes[REG_ADDR].regsize
                    132:                   && op->curtmps.next_avail[REG_ADDR]
                    133:                            >= regtypes[REG_ADDR].lowreg) {
                    134:                        offset = op->curtmps.next_avail[REG_ADDR]--;
                    135:                        if (offset < op->low_water[REG_ADDR]) {
                    136:                                op->low_water[REG_ADDR] = offset;
                    137:                        }
                    138:                        nlp = defnl(0, VAR, type, offset + ADDR_REG_OFFSET );
                    139:                        nlp -> extra_flags = NLOCAL | NREGVAR;
                    140:                        putlbracket(ftnno, op);
                    141:                        return nlp;
                    142:                }
                    143: #          endif mc68000
                    144: #      endif PC
                    145:        if (type == NIL) {
                    146:            alignment = A_STACK;
                    147:        } else if (type == nl+TPTR) {
                    148:            alignment = A_POINT;
                    149:        } else {
                    150:            alignment = align(type);
                    151:        }
                    152:         op->curtmps.om_off =
                    153:            roundup((int)(op->curtmps.om_off - size), alignment);
                    154:        offset = op->curtmps.om_off;
                    155:        if ( offset < op->om_max ) {
                    156:                op->om_max = offset;
                    157:        }
                    158:        nlp = defnl( (char *) 0 , VAR , type , offset );
                    159: #      ifdef PC
                    160:            nlp -> extra_flags = NLOCAL;
                    161:            putlbracket(ftnno, op);
                    162: #      endif PC
                    163:        return nlp;
                    164: }
                    165: 
                    166: /*
                    167:  * deallocate runtime temporary variables
                    168:  */
                    169: /*ARGSUSED*/
                    170: tmpfree(restore)
                    171:     register struct tmps       *restore;
                    172: {
                    173: #   ifdef PC
                    174:     register struct om         *op = &sizes[ cbn ];
                    175:     bool                       change = FALSE;
                    176: 
                    177: #      ifdef vax
                    178:            if (restore->next_avail[REG_GENERAL]
                    179:                > op->curtmps.next_avail[REG_GENERAL]) {
                    180:                    op->curtmps.next_avail[REG_GENERAL]
                    181:                        = restore->next_avail[REG_GENERAL];
                    182:                    change = TRUE;
                    183:            }
                    184: #      endif vax
                    185: #      ifdef mc68000
                    186:            if (restore->next_avail[REG_DATA]
                    187:                > op->curtmps.next_avail[REG_DATA]) {
                    188:                    op->curtmps.next_avail[REG_DATA]
                    189:                        = restore->next_avail[REG_DATA];
                    190:                    change = TRUE;
                    191:            }
                    192:            if (restore->next_avail[REG_ADDR]
                    193:                > op->curtmps.next_avail[REG_ADDR]) {
                    194:                    op->curtmps.next_avail[REG_ADDR]
                    195:                        = restore->next_avail[REG_ADDR];
                    196:                    change = TRUE;
                    197:            }
                    198: #      endif mc68000
                    199:     if (restore->om_off > op->curtmps.om_off) {
                    200:            op->curtmps.om_off = restore->om_off;
                    201:            change = TRUE;
                    202:     }
                    203:        if (change) {
                    204:            putlbracket(ftnno, op);
                    205:        }
                    206: #endif PC
                    207: }
                    208: 
                    209: #ifdef PC
                    210: #ifdef vax
                    211: /*
                    212:  * create a save mask for registers which have been used
                    213:  * in this level
                    214:  */
                    215: savmask()
                    216: {
                    217:        int mask;
                    218:        int i;
                    219: 
                    220:        mask = RSAVEMASK;
                    221:        if (opt('t'))
                    222:                mask |= RUNCHECK;
                    223:        for (i = 0; i <= regtypes[REG_GENERAL].highreg; i++) {
                    224:            if (i >= sizes[cbn].low_water[REG_GENERAL]) {
                    225:                mask |= 1 << i;
                    226:            }
                    227:        }
                    228:        return mask;
                    229: }
                    230: #endif vax
                    231: #endif PC

unix.superglobalmegacorp.com

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