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