|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1980 Regents of the University of California. ! 3: * All rights reserved. The Berkeley software License Agreement ! 4: * specifies the terms and conditions for redistribution. ! 5: */ ! 6: ! 7: #ifndef lint ! 8: static char sccsid[] = "@(#)tmps.c 5.1 (Berkeley) 6/5/85"; ! 9: #endif not lint ! 10: ! 11: #include "whoami.h" ! 12: #include "0.h" ! 13: #include "objfmt.h" ! 14: #ifdef PC ! 15: # include "pc.h" ! 16: #endif PC ! 17: #include "align.h" ! 18: #include "tmps.h" ! 19: ! 20: /* ! 21: * This routine defines the register allocation strategy ! 22: * All temporaries are allocated here, and this routines decides ! 23: * where they are to be put. ! 24: */ ! 25: #ifdef PC ! 26: /* ! 27: * register temporaries ! 28: * - are allocated from highreg towards lowreg. ! 29: * - are of size regsize. ! 30: * - register numbers from the various register types are mapped to ! 31: * integer register numbers using the offsets. (cf. pcc/mac2defs) ! 32: * ! 33: * stack temporaries ! 34: * - are allocated on a downward growing stack. ! 35: */ ! 36: ! 37: #ifdef vax ! 38: /* ! 39: * first pass register declaration constants ! 40: */ ! 41: struct regtype { ! 42: long lowreg; ! 43: long highreg; ! 44: long regsize; ! 45: } regtypes[NUMREGTYPES] = { ! 46: { 6, 11, 4 }, /* r6..r11 */ ! 47: }; ! 48: #endif vax ! 49: ! 50: #ifdef mc68000 ! 51: /* ! 52: * first pass register declaration constants ! 53: */ ! 54: struct regtype { ! 55: long lowreg; ! 56: long highreg; ! 57: long regsize; ! 58: } regtypes[NUMREGTYPES] = { ! 59: { 2, 7, 4 }, /* d2..d7 */ ! 60: { 2, 5, 4 }, /* a2..a5 */ ! 61: }; ! 62: #endif mc68000 ! 63: #endif PC ! 64: ! 65: tmpinit(cbn) ! 66: int cbn; ! 67: { ! 68: struct om *sizesp = &sizes[cbn]; ! 69: # ifdef PC ! 70: int i; ! 71: # endif PC ! 72: ! 73: sizesp->om_max = -DPOFF1; ! 74: sizesp->curtmps.om_off = -DPOFF1; ! 75: # ifdef PC ! 76: for (i = 0; i < NUMREGTYPES; i++) { ! 77: sizesp->low_water[i] = regtypes[i].highreg + 1; ! 78: sizesp->curtmps.next_avail[i] = regtypes[i].highreg; ! 79: } ! 80: # endif PC ! 81: } ! 82: ! 83: /* ! 84: * allocate runtime temporary variables ! 85: */ ! 86: /*ARGSUSED*/ ! 87: struct nl * ! 88: tmpalloc(size, type, mode) ! 89: long size; ! 90: struct nl *type; ! 91: int mode; ! 92: { ! 93: register struct om *op = &sizes[ cbn ]; ! 94: register int offset; ! 95: register struct nl *nlp; ! 96: long alignment; ! 97: ! 98: # ifdef PC ! 99: # ifdef vax ! 100: if ( mode == REGOK ! 101: && size == regtypes[REG_GENERAL].regsize ! 102: && op->curtmps.next_avail[REG_GENERAL] ! 103: >= regtypes[REG_GENERAL].lowreg) { ! 104: offset = op->curtmps.next_avail[REG_GENERAL]--; ! 105: if (offset < op->low_water[REG_GENERAL]) { ! 106: op->low_water[REG_GENERAL] = offset; ! 107: } ! 108: nlp = defnl( (char *) 0 , VAR , type , offset ); ! 109: nlp -> extra_flags = NLOCAL | NREGVAR; ! 110: putlbracket(ftnno, op); ! 111: return nlp; ! 112: } ! 113: # endif vax ! 114: # ifdef mc68000 ! 115: if ( mode == REGOK ! 116: && type != nl + TPTR ! 117: && size == regtypes[REG_DATA].regsize ! 118: && op->curtmps.next_avail[REG_DATA] ! 119: >= regtypes[REG_DATA].lowreg) { ! 120: offset = op->curtmps.next_avail[REG_DATA]--; ! 121: if (offset < op->low_water[REG_DATA]) { ! 122: op->low_water[REG_DATA] = offset; ! 123: } ! 124: nlp = defnl(0, VAR, type, offset + DATA_REG_OFFSET ); ! 125: nlp -> extra_flags = NLOCAL | NREGVAR; ! 126: putlbracket(ftnno, op); ! 127: return nlp; ! 128: } ! 129: if ( mode == REGOK ! 130: && type == nl + TPTR ! 131: && size == regtypes[REG_ADDR].regsize ! 132: && op->curtmps.next_avail[REG_ADDR] ! 133: >= regtypes[REG_ADDR].lowreg) { ! 134: offset = op->curtmps.next_avail[REG_ADDR]--; ! 135: if (offset < op->low_water[REG_ADDR]) { ! 136: op->low_water[REG_ADDR] = offset; ! 137: } ! 138: nlp = defnl(0, VAR, type, offset + ADDR_REG_OFFSET ); ! 139: nlp -> extra_flags = NLOCAL | NREGVAR; ! 140: putlbracket(ftnno, op); ! 141: return nlp; ! 142: } ! 143: # endif mc68000 ! 144: # endif PC ! 145: if (type == NIL) { ! 146: alignment = A_STACK; ! 147: } else if (type == nl+TPTR) { ! 148: alignment = A_POINT; ! 149: } else { ! 150: alignment = align(type); ! 151: } ! 152: op->curtmps.om_off = ! 153: roundup((int)(op->curtmps.om_off - size), alignment); ! 154: offset = op->curtmps.om_off; ! 155: if ( offset < op->om_max ) { ! 156: op->om_max = offset; ! 157: } ! 158: nlp = defnl( (char *) 0 , VAR , type , offset ); ! 159: # ifdef PC ! 160: nlp -> extra_flags = NLOCAL; ! 161: putlbracket(ftnno, op); ! 162: # endif PC ! 163: return nlp; ! 164: } ! 165: ! 166: /* ! 167: * deallocate runtime temporary variables ! 168: */ ! 169: /*ARGSUSED*/ ! 170: tmpfree(restore) ! 171: register struct tmps *restore; ! 172: { ! 173: # ifdef PC ! 174: register struct om *op = &sizes[ cbn ]; ! 175: bool change = FALSE; ! 176: ! 177: # ifdef vax ! 178: if (restore->next_avail[REG_GENERAL] ! 179: > op->curtmps.next_avail[REG_GENERAL]) { ! 180: op->curtmps.next_avail[REG_GENERAL] ! 181: = restore->next_avail[REG_GENERAL]; ! 182: change = TRUE; ! 183: } ! 184: # endif vax ! 185: # ifdef mc68000 ! 186: if (restore->next_avail[REG_DATA] ! 187: > op->curtmps.next_avail[REG_DATA]) { ! 188: op->curtmps.next_avail[REG_DATA] ! 189: = restore->next_avail[REG_DATA]; ! 190: change = TRUE; ! 191: } ! 192: if (restore->next_avail[REG_ADDR] ! 193: > op->curtmps.next_avail[REG_ADDR]) { ! 194: op->curtmps.next_avail[REG_ADDR] ! 195: = restore->next_avail[REG_ADDR]; ! 196: change = TRUE; ! 197: } ! 198: # endif mc68000 ! 199: if (restore->om_off > op->curtmps.om_off) { ! 200: op->curtmps.om_off = restore->om_off; ! 201: change = TRUE; ! 202: } ! 203: if (change) { ! 204: putlbracket(ftnno, op); ! 205: } ! 206: #endif PC ! 207: } ! 208: ! 209: #ifdef PC ! 210: #ifdef vax ! 211: /* ! 212: * create a save mask for registers which have been used ! 213: * in this level ! 214: */ ! 215: savmask() ! 216: { ! 217: int mask; ! 218: int i; ! 219: ! 220: mask = RSAVEMASK; ! 221: if (opt('t')) ! 222: mask |= RUNCHECK; ! 223: for (i = 0; i <= regtypes[REG_GENERAL].highreg; i++) { ! 224: if (i >= sizes[cbn].low_water[REG_GENERAL]) { ! 225: mask |= 1 << i; ! 226: } ! 227: } ! 228: return mask; ! 229: } ! 230: #endif vax ! 231: #endif PC
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.