xref: /csrg-svn/usr.bin/pascal/src/tmps.c (revision 15939)
13219Smckusick /* Copyright (c) 1979 Regents of the University of California */
23219Smckusick 
3*15939Smckusick #ifndef lint
4*15939Smckusick static char sccsid[] = "@(#)tmps.c 1.9.1.1 02/04/84";
5*15939Smckusick #endif
63219Smckusick 
73219Smckusick #include "whoami.h"
83219Smckusick #include "0.h"
910657Speter #include "objfmt.h"
103280Smckusic #ifdef PC
113280Smckusic #   include "pc.h"
123280Smckusic #endif PC
1311853Speter #include "align.h"
1411332Speter #include "tmps.h"
153219Smckusick 
163219Smckusick /*
173280Smckusic  * This routine defines the register allocation strategy
183280Smckusic  * All temporaries are allocated here, and this routines decides
193280Smckusic  * where they are to be put.
203280Smckusic  */
213281Smckusic #ifdef PC
2211332Speter     /*
23*15939Smckusick      *	registers are allocated from highreg towards lowreg.
24*15939Smckusick      *	registers are of size regsize.
25*15939Smckusick      *	stack variables are allocated on a downward growing stack.
2611332Speter      */
2711332Speter 
2810657Speter #ifdef vax
2911332Speter     /*
3011332Speter      *	first pass register declaration constants
3111332Speter      */
32*15939Smckusick #   define	LONGREGTYPE	0
3311332Speter struct	regtype {
3411332Speter     long	lowreg;
3511332Speter     long	highreg;
3611332Speter     long	regsize;
3711332Speter } regtypes[NUMREGTYPES] = {
38*15939Smckusick 	{ 6, 11, 4 },
3911332Speter };
4010657Speter #endif vax
4111332Speter 
4211332Speter #ifdef mc68000
4311332Speter     /*
4411332Speter      *	first pass register declaration constants
4511332Speter      */
46*15939Smckusick #   define	DATAREGTYPE	0
47*15939Smckusick #   define	ADDRREGTYPE	1
4811332Speter struct	regtype {
4911332Speter     long	lowreg;
5011332Speter     long	highreg;
5111332Speter     long	regsize;
5211332Speter } regtypes[NUMREGTYPES] = {
53*15939Smckusick 	{ 2, 7, 0 },		/* off for now */
54*15939Smckusick 	{ 2, 5, 0 },		/* off for now */
5511332Speter };
5611332Speter #endif mc68000
573281Smckusic #endif PC
583280Smckusic 
5911332Speter tmpinit(cbn)
6011332Speter 	int	cbn;
6111332Speter {
6211332Speter 	struct om	*sizesp = &sizes[cbn];
63*15939Smckusick #	ifdef PC
6411332Speter 	int	i;
65*15939Smckusick #	endif PC
6611332Speter 
6711332Speter 	sizesp->om_max = -DPOFF1;
6811332Speter 	sizesp->curtmps.om_off = -DPOFF1;
6911332Speter #	ifdef PC
7011332Speter 		for (i = 0; i < NUMREGTYPES; i++) {
7111332Speter 			sizesp->low_water[i] = regtypes[i].highreg + 1;
7211332Speter 			sizesp->curtmps.next_avail[i] = regtypes[i].highreg;
7311332Speter 		}
7411332Speter #	endif PC
7511332Speter }
7611332Speter 
773280Smckusic /*
783219Smckusick  * allocate runtime temporary variables
793219Smckusick  */
80*15939Smckusick /*ARGSUSED*/
813839Speter struct nl *
823280Smckusic tmpalloc(size, type, mode)
833219Smckusick 	long size;
843219Smckusick 	struct nl *type;
853280Smckusic 	int mode;
863219Smckusick {
8711332Speter 	register struct om	*op = &sizes[ cbn ];
8811332Speter 	register int		offset;
893839Speter 	register struct nl	*nlp;
9011853Speter 	long			alignment;
913219Smckusick 
923280Smckusic #	ifdef PC
9311332Speter #	    ifdef vax
9411332Speter 		if (  mode == REGOK
9511332Speter 		   && size == regtypes[REG_GENERAL].regsize
9611332Speter 		   && op->curtmps.next_avail[REG_GENERAL]
9711332Speter 			    >= regtypes[REG_GENERAL].lowreg) {
9811332Speter 			offset = op->curtmps.next_avail[REG_GENERAL]--;
9911332Speter 			if (offset < op->low_water[REG_GENERAL]) {
10011332Speter 				op->low_water[REG_GENERAL] = offset;
10111332Speter 			}
102*15939Smckusick 			nlp = defnl( (char *) 0 , VAR , type , offset );
10311332Speter 			nlp -> extra_flags = NLOCAL | NREGVAR;
10411332Speter 			putlbracket(ftnno, op);
10511332Speter 			return nlp;
10611332Speter 		}
10711332Speter #	    endif vax
1083280Smckusic #	endif PC
10911853Speter 	if (type == NIL) {
11011853Speter 	    alignment = A_STACK;
11111853Speter 	} else {
11211853Speter 	    alignment = align(type);
11311853Speter 	}
11411332Speter         op->curtmps.om_off =
11511853Speter 	    roundup((int)(op->curtmps.om_off - size), alignment);
11611332Speter 	offset = op->curtmps.om_off;
1173280Smckusic 	if ( offset < op->om_max ) {
1183280Smckusic 	        op->om_max = offset;
1193219Smckusick 	}
120*15939Smckusick 	nlp = defnl( (char *) 0 , VAR , type , offset );
1213219Smckusick #	ifdef PC
1223839Speter 	    nlp -> extra_flags = NLOCAL;
12311332Speter 	    putlbracket(ftnno, op);
1243219Smckusick #	endif PC
1253839Speter 	return nlp;
1263219Smckusick }
12711332Speter 
1283219Smckusick /*
1293219Smckusick  * deallocate runtime temporary variables
1303219Smckusick  */
131*15939Smckusick /*ARGSUSED*/
1323219Smckusick tmpfree(restore)
13311332Speter     register struct tmps	*restore;
1343219Smckusick {
135*15939Smckusick #   ifdef PC
13611332Speter     register struct om		*op = &sizes[ cbn ];
13711332Speter     bool			change = FALSE;
1383219Smckusick 
139*15939Smckusick 	    /* i think this never gives back storage!	... peter */
14011332Speter #	ifdef vax
14111332Speter 	    if (restore->next_avail[REG_GENERAL]
14211332Speter 		> op->curtmps.next_avail[REG_GENERAL]) {
14311332Speter 		    op->curtmps.next_avail[REG_GENERAL]
14411332Speter 			= restore->next_avail[REG_GENERAL];
14511332Speter 		    change = TRUE;
1463280Smckusic 	    }
14711332Speter #	endif vax
14811332Speter     if (restore->om_off > op->curtmps.om_off) {
14911332Speter 	    op->curtmps.om_off = restore->om_off;
15011332Speter 	    change = TRUE;
15111332Speter     }
15211332Speter 	if (change) {
15311332Speter 	    putlbracket(ftnno, op);
1543219Smckusick 	}
155*15939Smckusick #endif PC
1563219Smckusick }
15711332Speter 
1583281Smckusic #ifdef PC
15910657Speter #ifdef vax
1603280Smckusic /*
1613280Smckusic  * create a save mask for registers which have been used
1623280Smckusic  * in this level
1633280Smckusic  */
1643280Smckusic savmask()
1653280Smckusic {
1663839Speter 	int mask;
1673280Smckusic 	int i;
1683280Smckusic 
1693280Smckusic 	mask = RSAVEMASK;
1703280Smckusic 	if (opt('t'))
1713280Smckusic 	        mask |= RUNCHECK;
17211332Speter 	for (i = 0; i <= regtypes[REG_GENERAL].highreg; i++) {
17311332Speter 	    if (i >= sizes[cbn].low_water[REG_GENERAL]) {
17411332Speter 		mask |= 1 << i;
17511332Speter 	    }
17611332Speter 	}
1773280Smckusic 	return mask;
1783280Smckusic }
17910657Speter #endif vax
1803281Smckusic #endif PC
181