Annotation of 43BSDReno/pgrm/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.2 (Berkeley) 11/12/86";
                      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 tahoe
                     51:     /*
                     52:      * first pass register declaration constants
                     53:      */
                     54: struct regtype {
                     55:     long       lowreg;
                     56:     long       highreg;
                     57:     long       regsize;
                     58: } regtypes[NUMREGTYPES] = {
                     59:        { 6, 12, 4 },           /* r6..r12 */
                     60: };
                     61: #endif tahoe
                     62: 
                     63: #ifdef mc68000
                     64:     /*
                     65:      * first pass register declaration constants
                     66:      */
                     67: struct regtype {
                     68:     long       lowreg;
                     69:     long       highreg;
                     70:     long       regsize;
                     71: } regtypes[NUMREGTYPES] = {
                     72:        { 2, 7, 4 },            /* d2..d7 */
                     73:        { 2, 5, 4 },            /* a2..a5 */
                     74: };
                     75: #endif mc68000
                     76: #endif PC
                     77: 
                     78: tmpinit(cbn)
                     79:        int     cbn;
                     80: {
                     81:        struct om       *sizesp = &sizes[cbn];
                     82: #      ifdef PC
                     83:        int     i;
                     84: #      endif PC
                     85: 
                     86:        sizesp->om_max = -DPOFF1;
                     87:        sizesp->curtmps.om_off = -DPOFF1;
                     88: #      ifdef PC
                     89:                for (i = 0; i < NUMREGTYPES; i++) {
                     90:                        sizesp->low_water[i] = regtypes[i].highreg + 1;
                     91:                        sizesp->curtmps.next_avail[i] = regtypes[i].highreg;
                     92:                }
                     93: #      endif PC
                     94: }
                     95: 
                     96: /*
                     97:  * allocate runtime temporary variables
                     98:  */
                     99: /*ARGSUSED*/
                    100: struct nl *
                    101: tmpalloc(size, type, mode)
                    102:        long size;
                    103:        struct nl *type;
                    104:        int mode;
                    105: {
                    106:        register struct om      *op = &sizes[ cbn ];
                    107:        register int            offset;
                    108:        register struct nl      *nlp;
                    109:        long                    alignment;
                    110: 
                    111: #      ifdef PC
                    112: #          if defined(vax) || defined(tahoe)
                    113:                if (  mode == REGOK
                    114:                   && size == regtypes[REG_GENERAL].regsize
                    115:                   && op->curtmps.next_avail[REG_GENERAL]
                    116:                            >= regtypes[REG_GENERAL].lowreg) {
                    117:                        offset = op->curtmps.next_avail[REG_GENERAL]--;
                    118:                        if (offset < op->low_water[REG_GENERAL]) {
                    119:                                op->low_water[REG_GENERAL] = offset;
                    120:                        }
                    121:                        nlp = defnl( (char *) 0 , VAR , type , offset );
                    122:                        nlp -> extra_flags = NLOCAL | NREGVAR;
                    123:                        putlbracket(ftnno, op);
                    124:                        return nlp;
                    125:                }
                    126: #          endif vax || tahoe
                    127: #          ifdef mc68000
                    128:                if (  mode == REGOK
                    129:                   && type != nl + TPTR
                    130:                   && size == regtypes[REG_DATA].regsize
                    131:                   && op->curtmps.next_avail[REG_DATA]
                    132:                            >= regtypes[REG_DATA].lowreg) {
                    133:                        offset = op->curtmps.next_avail[REG_DATA]--;
                    134:                        if (offset < op->low_water[REG_DATA]) {
                    135:                                op->low_water[REG_DATA] = offset;
                    136:                        }
                    137:                        nlp = defnl(0, VAR, type, offset + DATA_REG_OFFSET );
                    138:                        nlp -> extra_flags = NLOCAL | NREGVAR;
                    139:                        putlbracket(ftnno, op);
                    140:                        return nlp;
                    141:                }
                    142:                if (  mode == REGOK
                    143:                   && type == nl + TPTR
                    144:                   && size == regtypes[REG_ADDR].regsize
                    145:                   && op->curtmps.next_avail[REG_ADDR]
                    146:                            >= regtypes[REG_ADDR].lowreg) {
                    147:                        offset = op->curtmps.next_avail[REG_ADDR]--;
                    148:                        if (offset < op->low_water[REG_ADDR]) {
                    149:                                op->low_water[REG_ADDR] = offset;
                    150:                        }
                    151:                        nlp = defnl(0, VAR, type, offset + ADDR_REG_OFFSET );
                    152:                        nlp -> extra_flags = NLOCAL | NREGVAR;
                    153:                        putlbracket(ftnno, op);
                    154:                        return nlp;
                    155:                }
                    156: #          endif mc68000
                    157: #      endif PC
                    158:        if (type == NIL) {
                    159:            alignment = A_STACK;
                    160:        } else if (type == nl+TPTR) {
                    161:            alignment = A_POINT;
                    162:        } else {
                    163:            alignment = align(type);
                    164:        }
                    165:         op->curtmps.om_off =
                    166:            roundup((int)(op->curtmps.om_off - size), alignment);
                    167:        offset = op->curtmps.om_off;
                    168:        if ( offset < op->om_max ) {
                    169:                op->om_max = offset;
                    170:        }
                    171:        nlp = defnl( (char *) 0 , VAR , type , offset );
                    172: #      ifdef PC
                    173:            nlp -> extra_flags = NLOCAL;
                    174:            putlbracket(ftnno, op);
                    175: #      endif PC
                    176:        return nlp;
                    177: }
                    178: 
                    179: /*
                    180:  * deallocate runtime temporary variables
                    181:  */
                    182: /*ARGSUSED*/
                    183: tmpfree(restore)
                    184:     register struct tmps       *restore;
                    185: {
                    186: #   ifdef PC
                    187:     register struct om         *op = &sizes[ cbn ];
                    188:     bool                       change = FALSE;
                    189: 
                    190: #      if defined(vax) || defined(tahoe)
                    191:            if (restore->next_avail[REG_GENERAL]
                    192:                > op->curtmps.next_avail[REG_GENERAL]) {
                    193:                    op->curtmps.next_avail[REG_GENERAL]
                    194:                        = restore->next_avail[REG_GENERAL];
                    195:                    change = TRUE;
                    196:            }
                    197: #      endif vax || tahoe
                    198: #      ifdef mc68000
                    199:            if (restore->next_avail[REG_DATA]
                    200:                > op->curtmps.next_avail[REG_DATA]) {
                    201:                    op->curtmps.next_avail[REG_DATA]
                    202:                        = restore->next_avail[REG_DATA];
                    203:                    change = TRUE;
                    204:            }
                    205:            if (restore->next_avail[REG_ADDR]
                    206:                > op->curtmps.next_avail[REG_ADDR]) {
                    207:                    op->curtmps.next_avail[REG_ADDR]
                    208:                        = restore->next_avail[REG_ADDR];
                    209:                    change = TRUE;
                    210:            }
                    211: #      endif mc68000
                    212:     if (restore->om_off > op->curtmps.om_off) {
                    213:            op->curtmps.om_off = restore->om_off;
                    214:            change = TRUE;
                    215:     }
                    216:        if (change) {
                    217:            putlbracket(ftnno, op);
                    218:        }
                    219: #endif PC
                    220: }
                    221: 
                    222: #ifdef PC
                    223: #if defined(vax) || defined(tahoe)
                    224: /*
                    225:  * create a save mask for registers which have been used
                    226:  * in this level
                    227:  */
                    228: savmask()
                    229: {
                    230:        int mask;
                    231:        int i;
                    232: 
                    233:        mask = RSAVEMASK;
                    234:        if (opt('t'))
                    235:                mask |= RUNCHECK;
                    236:        for (i = 0; i <= regtypes[REG_GENERAL].highreg; i++) {
                    237:            if (i >= sizes[cbn].low_water[REG_GENERAL]) {
                    238:                mask |= 1 << i;
                    239:            }
                    240:        }
                    241:        return mask;
                    242: }
                    243: #endif vax || tahoe
                    244: #endif PC

unix.superglobalmegacorp.com

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