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