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