xref: /csrg-svn/usr.bin/pascal/src/tmps.c (revision 11853)
13219Smckusick /* Copyright (c) 1979 Regents of the University of California */
23219Smckusick 
3*11853Speter static char sccsid[] = "@(#)tmps.c 1.9 04/06/83";
43219Smckusick 
53219Smckusick #include "whoami.h"
63219Smckusick #include "0.h"
710657Speter #include "objfmt.h"
83280Smckusic #ifdef PC
93280Smckusic #   include "pc.h"
103280Smckusic #endif PC
11*11853Speter #include "align.h"
1211332Speter #include "tmps.h"
133219Smckusick 
143219Smckusick /*
153280Smckusic  * This routine defines the register allocation strategy
163280Smckusic  * All temporaries are allocated here, and this routines decides
173280Smckusic  * where they are to be put.
183280Smckusic  */
193281Smckusic #ifdef PC
2011332Speter     /*
2111332Speter      *	registers are allocated from highreg towards lowreg.
2211332Speter      *	registers are of size regsize.
2311332Speter      *	stack variables are allocated on a downward growing stack.
2411332Speter      */
2511332Speter 
2610657Speter #ifdef vax
2711332Speter     /*
2811332Speter      *	first pass register declaration constants
2911332Speter      */
3011332Speter #   define	LONGREGTYPE	0
3111332Speter struct	regtype {
3211332Speter     long	lowreg;
3311332Speter     long	highreg;
3411332Speter     long	regsize;
3511332Speter } regtypes[NUMREGTYPES] = {
3611332Speter 	{ 6, 11, 4 },
3711332Speter };
3810657Speter #endif vax
3911332Speter 
4011332Speter #ifdef mc68000
4111332Speter     /*
4211332Speter      *	first pass register declaration constants
4311332Speter      */
4411332Speter #   define	DATAREGTYPE	0
4511332Speter #   define	ADDRREGTYPE	1
4611332Speter struct	regtype {
4711332Speter     long	lowreg;
4811332Speter     long	highreg;
4911332Speter     long	regsize;
5011332Speter } regtypes[NUMREGTYPES] = {
5111332Speter 	{ 2, 7, 0 },		/* off for now */
5211332Speter 	{ 2, 5, 0 },		/* off for now */
5311332Speter };
5411332Speter #endif mc68000
553281Smckusic #endif PC
563280Smckusic 
5711332Speter tmpinit(cbn)
5811332Speter 	int	cbn;
5911332Speter {
6011332Speter 	struct om	*sizesp = &sizes[cbn];
6111332Speter 	int	i;
6211332Speter 
6311332Speter 	sizesp->om_max = -DPOFF1;
6411332Speter 	sizesp->curtmps.om_off = -DPOFF1;
6511332Speter #	ifdef PC
6611332Speter 		for (i = 0; i < NUMREGTYPES; i++) {
6711332Speter 			sizesp->low_water[i] = regtypes[i].highreg + 1;
6811332Speter 			sizesp->curtmps.next_avail[i] = regtypes[i].highreg;
6911332Speter 		}
7011332Speter #	endif PC
7111332Speter }
7211332Speter 
733280Smckusic /*
743219Smckusick  * allocate runtime temporary variables
753219Smckusick  */
763839Speter struct nl *
773280Smckusic tmpalloc(size, type, mode)
783219Smckusick 	long size;
793219Smckusick 	struct nl *type;
803280Smckusic 	int mode;
813219Smckusick {
8211332Speter 	register struct om	*op = &sizes[ cbn ];
8311332Speter 	register int		offset;
843839Speter 	register struct nl	*nlp;
85*11853Speter 	long			alignment;
863219Smckusick 
873280Smckusic #	ifdef PC
8811332Speter #	    ifdef vax
8911332Speter 		if (  mode == REGOK
9011332Speter 		   && size == regtypes[REG_GENERAL].regsize
9111332Speter 		   && op->curtmps.next_avail[REG_GENERAL]
9211332Speter 			    >= regtypes[REG_GENERAL].lowreg) {
9311332Speter 			offset = op->curtmps.next_avail[REG_GENERAL]--;
9411332Speter 			if (offset < op->low_water[REG_GENERAL]) {
9511332Speter 				op->low_water[REG_GENERAL] = offset;
9611332Speter 			}
9711332Speter 			nlp = defnl( 0 , VAR , type , offset );
9811332Speter 			nlp -> extra_flags = NLOCAL | NREGVAR;
9911332Speter 			putlbracket(ftnno, op);
10011332Speter 			return nlp;
10111332Speter 		}
10211332Speter #	    endif vax
1033280Smckusic #	endif PC
104*11853Speter 	if (type == NIL) {
105*11853Speter 	    alignment = A_STACK;
106*11853Speter 	} else {
107*11853Speter 	    alignment = align(type);
108*11853Speter 	}
10911332Speter         op->curtmps.om_off =
110*11853Speter 	    roundup((int)(op->curtmps.om_off - size), alignment);
11111332Speter 	offset = op->curtmps.om_off;
1123280Smckusic 	if ( offset < op->om_max ) {
1133280Smckusic 	        op->om_max = offset;
1143219Smckusick 	}
1153839Speter 	nlp = defnl( 0 , VAR , type , offset );
1163219Smckusick #	ifdef PC
1173839Speter 	    nlp -> extra_flags = NLOCAL;
11811332Speter 	    putlbracket(ftnno, op);
1193219Smckusick #	endif PC
1203839Speter 	return nlp;
1213219Smckusick }
12211332Speter 
1233219Smckusick /*
1243219Smckusick  * deallocate runtime temporary variables
1253219Smckusick  */
1263219Smckusick tmpfree(restore)
12711332Speter     register struct tmps	*restore;
1283219Smckusick {
12911332Speter     register struct om		*op = &sizes[ cbn ];
13011332Speter     bool			change = FALSE;
1313219Smckusick 
13211332Speter #   ifdef PC
13311332Speter 	    /* i think this never gives back storage!	... peter */
13411332Speter #	ifdef vax
13511332Speter 	    if (restore->next_avail[REG_GENERAL]
13611332Speter 		> op->curtmps.next_avail[REG_GENERAL]) {
13711332Speter 		    op->curtmps.next_avail[REG_GENERAL]
13811332Speter 			= restore->next_avail[REG_GENERAL];
13911332Speter 		    change = TRUE;
1403280Smckusic 	    }
14111332Speter #	endif vax
14211332Speter #   endif PC
14311332Speter     if (restore->om_off > op->curtmps.om_off) {
14411332Speter 	    op->curtmps.om_off = restore->om_off;
14511332Speter 	    change = TRUE;
14611332Speter     }
14711332Speter #   ifdef PC
14811332Speter 	if (change) {
14911332Speter 	    putlbracket(ftnno, op);
1503219Smckusick 	}
15111332Speter #   endif PC
1523219Smckusick }
15311332Speter 
1543281Smckusic #ifdef PC
15510657Speter #ifdef vax
1563280Smckusic /*
1573280Smckusic  * create a save mask for registers which have been used
1583280Smckusic  * in this level
1593280Smckusic  */
1603280Smckusic savmask()
1613280Smckusic {
1623839Speter 	int mask;
1633280Smckusic 	int i;
1643280Smckusic 
1653280Smckusic 	mask = RSAVEMASK;
1663280Smckusic 	if (opt('t'))
1673280Smckusic 	        mask |= RUNCHECK;
16811332Speter 	for (i = 0; i <= regtypes[REG_GENERAL].highreg; i++) {
16911332Speter 	    if (i >= sizes[cbn].low_water[REG_GENERAL]) {
17011332Speter 		mask |= 1 << i;
17111332Speter 	    }
17211332Speter 	}
1733280Smckusic 	return mask;
1743280Smckusic }
17510657Speter #endif vax
1763281Smckusic #endif PC
177