2 * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
3 * See the copyright notice in the ACK home directory, in the file "Copyright".
6 /* M I S C E L L A N E O U S U T I L I T I E S */
8 /* $Id: util.c,v 1.7 1994/06/27 08:03:14 ceriel Exp $ */
10 /* Code for the allocation and de-allocation of temporary variables,
35 static struct localvar *FreeTmps;
45 extern char options[];
50 C_insertpart(loc_id = C_getid());
58 register struct stack_level *stl = local_level;
60 stl->sl_max_block = - align(sz - stl->sl_max_block, al);
61 return stl->sl_max_block;
65 static struct localvar *regs[TABSIZ];
68 NewLocal(sz, al, regtype, sc)
71 register struct localvar *tmp = FreeTmps;
72 struct localvar *prev = 0;
76 if (tmp->t_align >= al &&
79 tmp->t_regtype == regtype) {
81 prev->next = tmp->next;
83 else FreeTmps = tmp->next;
91 tmp->t_offset = LocalSpace(sz, al);
95 tmp->t_regtype = regtype;
96 tmp->t_count = REG_DEFAULT;
98 index = (int) (tmp->t_offset >> 2) & (TABSIZ - 1);
99 tmp->next = regs[index];
101 return tmp->t_offset;
107 int index = (int) (off >> 2) & (TABSIZ - 1);
108 register struct localvar *tmp = regs[index];
109 struct localvar *prev = 0;
111 while (tmp && tmp->t_offset != off) {
116 if (prev) prev->next = tmp->next;
117 else regs[index] = tmp->next;
118 tmp->next = FreeTmps;
125 register struct localvar *tmp, *tmp1;
134 if (tmp->t_sc == REGISTER) tmp->t_count += REG_BONUS;
135 if (! options['n'] && tmp->t_regtype >= 0) {
136 C_ms_reg(tmp->t_offset, tmp->t_size, tmp->t_regtype, tmp->t_count);
142 for (i = 0; i < TABSIZ; i++) {
145 if (tmp->t_sc == REGISTER) tmp->t_count += REG_BONUS;
147 if (! options['n'] && tmp->t_regtype >= 0) {
148 C_ms_reg(tmp->t_offset,
159 if (! options['n']) {
169 RegisterAccount(offset, size, regtype, sc)
172 register struct localvar *p;
175 if (regtype < 0) return;
178 index = (int) (offset >> 2) & (TABSIZ - 1);
179 p->t_offset = offset;
180 p->t_regtype = regtype;
181 p->t_count = REG_DEFAULT;
184 p->next = regs[index];
188 static struct localvar *
192 register struct localvar *p = regs[(int)(off >> 2) & (TABSIZ - 1)];
194 while (p && p->t_offset != off) p = p->next;
201 register struct localvar *p = find_reg(off);
208 if (p && p->t_size != sz) p->t_regtype = -1;
209 if (sz == word_size) C_lol(off);
210 else if (sz == dword_size) C_ldl(off);
212 if (p) p->t_regtype = -1;
221 register struct localvar *p = find_reg(off);
228 if (p && p->t_size != sz) p->t_regtype = -1;
229 if (sz == word_size) C_stl(off);
230 else if (sz == dword_size) C_sdl(off);
232 if (p) p->t_regtype = -1;
242 register struct localvar *p = find_reg(off);
244 if (p) p->t_regtype = -1;