xref: /csrg-svn/usr.bin/pascal/src/tmps.c (revision 11332)
13219Smckusick /* Copyright (c) 1979 Regents of the University of California */
23219Smckusick 
3*11332Speter static char sccsid[] = "@(#)tmps.c 1.8 02/28/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*11332Speter #include "tmps.h"
123219Smckusick 
133219Smckusick /*
143280Smckusic  * This routine defines the register allocation strategy
153280Smckusic  * All temporaries are allocated here, and this routines decides
163280Smckusic  * where they are to be put.
173280Smckusic  */
183281Smckusic #ifdef PC
19*11332Speter     /*
20*11332Speter      *	registers are allocated from highreg towards lowreg.
21*11332Speter      *	registers are of size regsize.
22*11332Speter      *	stack variables are allocated on a downward growing stack.
23*11332Speter      */
24*11332Speter 
2510657Speter #ifdef vax
26*11332Speter     /*
27*11332Speter      *	first pass register declaration constants
28*11332Speter      */
29*11332Speter #   define	LONGREGTYPE	0
30*11332Speter struct	regtype {
31*11332Speter     long	lowreg;
32*11332Speter     long	highreg;
33*11332Speter     long	regsize;
34*11332Speter } regtypes[NUMREGTYPES] = {
35*11332Speter 	{ 6, 11, 4 },
36*11332Speter };
3710657Speter #endif vax
38*11332Speter 
39*11332Speter #ifdef mc68000
40*11332Speter     /*
41*11332Speter      *	first pass register declaration constants
42*11332Speter      */
43*11332Speter #   define	DATAREGTYPE	0
44*11332Speter #   define	ADDRREGTYPE	1
45*11332Speter struct	regtype {
46*11332Speter     long	lowreg;
47*11332Speter     long	highreg;
48*11332Speter     long	regsize;
49*11332Speter } regtypes[NUMREGTYPES] = {
50*11332Speter 	{ 2, 7, 0 },		/* off for now */
51*11332Speter 	{ 2, 5, 0 },		/* off for now */
52*11332Speter };
53*11332Speter #endif mc68000
543281Smckusic #endif PC
553280Smckusic 
56*11332Speter tmpinit(cbn)
57*11332Speter 	int	cbn;
58*11332Speter {
59*11332Speter 	struct om	*sizesp = &sizes[cbn];
60*11332Speter 	int	i;
61*11332Speter 
62*11332Speter 	sizesp->om_max = -DPOFF1;
63*11332Speter 	sizesp->curtmps.om_off = -DPOFF1;
64*11332Speter #	ifdef PC
65*11332Speter 		for (i = 0; i < NUMREGTYPES; i++) {
66*11332Speter 			sizesp->low_water[i] = regtypes[i].highreg + 1;
67*11332Speter 			sizesp->curtmps.next_avail[i] = regtypes[i].highreg;
68*11332Speter 		}
69*11332Speter #	endif PC
70*11332Speter }
71*11332Speter 
723280Smckusic /*
733219Smckusick  * allocate runtime temporary variables
743219Smckusick  */
753839Speter struct nl *
763280Smckusic tmpalloc(size, type, mode)
773219Smckusick 	long size;
783219Smckusick 	struct nl *type;
793280Smckusic 	int mode;
803219Smckusick {
81*11332Speter 	register struct om	*op = &sizes[ cbn ];
82*11332Speter 	register int		offset;
833839Speter 	register struct nl	*nlp;
843219Smckusick 
853280Smckusic #	ifdef PC
86*11332Speter #	    ifdef vax
87*11332Speter 		if (  mode == REGOK
88*11332Speter 		   && size == regtypes[REG_GENERAL].regsize
89*11332Speter 		   && op->curtmps.next_avail[REG_GENERAL]
90*11332Speter 			    >= regtypes[REG_GENERAL].lowreg) {
91*11332Speter 			offset = op->curtmps.next_avail[REG_GENERAL]--;
92*11332Speter 			if (offset < op->low_water[REG_GENERAL]) {
93*11332Speter 				op->low_water[REG_GENERAL] = offset;
94*11332Speter 			}
95*11332Speter 			nlp = defnl( 0 , VAR , type , offset );
96*11332Speter 			nlp -> extra_flags = NLOCAL | NREGVAR;
97*11332Speter 			putlbracket(ftnno, op);
98*11332Speter 			return nlp;
99*11332Speter 		}
100*11332Speter #	    endif vax
1013280Smckusic #	endif PC
102*11332Speter         op->curtmps.om_off =
1034027Smckusic 	    roundup((int)(op->curtmps.om_off - size), (long)align(type));
104*11332Speter 	offset = op->curtmps.om_off;
1053280Smckusic 	if ( offset < op->om_max ) {
1063280Smckusic 	        op->om_max = offset;
1073219Smckusick 	}
1083839Speter 	nlp = defnl( 0 , VAR , type , offset );
1093219Smckusick #	ifdef PC
1103839Speter 	    nlp -> extra_flags = NLOCAL;
111*11332Speter 	    putlbracket(ftnno, op);
1123219Smckusick #	endif PC
1133839Speter 	return nlp;
1143219Smckusick }
115*11332Speter 
1163219Smckusick /*
1173219Smckusick  * deallocate runtime temporary variables
1183219Smckusick  */
1193219Smckusick tmpfree(restore)
120*11332Speter     register struct tmps	*restore;
1213219Smckusick {
122*11332Speter     register struct om		*op = &sizes[ cbn ];
123*11332Speter     bool			change = FALSE;
1243219Smckusick 
125*11332Speter #   ifdef PC
126*11332Speter 	    /* i think this never gives back storage!	... peter */
127*11332Speter #	ifdef vax
128*11332Speter 	    if (restore->next_avail[REG_GENERAL]
129*11332Speter 		> op->curtmps.next_avail[REG_GENERAL]) {
130*11332Speter 		    op->curtmps.next_avail[REG_GENERAL]
131*11332Speter 			= restore->next_avail[REG_GENERAL];
132*11332Speter 		    change = TRUE;
1333280Smckusic 	    }
134*11332Speter #	endif vax
135*11332Speter #   endif PC
136*11332Speter     if (restore->om_off > op->curtmps.om_off) {
137*11332Speter 	    op->curtmps.om_off = restore->om_off;
138*11332Speter 	    change = TRUE;
139*11332Speter     }
140*11332Speter #   ifdef PC
141*11332Speter 	if (change) {
142*11332Speter 	    putlbracket(ftnno, op);
1433219Smckusick 	}
144*11332Speter #   endif PC
1453219Smckusick }
146*11332Speter 
1473281Smckusic #ifdef PC
14810657Speter #ifdef vax
1493280Smckusic /*
1503280Smckusic  * create a save mask for registers which have been used
1513280Smckusic  * in this level
1523280Smckusic  */
1533280Smckusic savmask()
1543280Smckusic {
1553839Speter 	int mask;
1563280Smckusic 	int i;
1573280Smckusic 
1583280Smckusic 	mask = RSAVEMASK;
1593280Smckusic 	if (opt('t'))
1603280Smckusic 	        mask |= RUNCHECK;
161*11332Speter 	for (i = 0; i <= regtypes[REG_GENERAL].highreg; i++) {
162*11332Speter 	    if (i >= sizes[cbn].low_water[REG_GENERAL]) {
163*11332Speter 		mask |= 1 << i;
164*11332Speter 	    }
165*11332Speter 	}
1663280Smckusic 	return mask;
1673280Smckusic }
16810657Speter #endif vax
1693281Smckusic #endif PC
170