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 3.11 1994/06/24 12:06:47 ceriel Exp $ */
10 /* Code for the allocation and de-allocation of temporary variables,
34 static struct localvar *FreeTmps;
44 extern char options[];
49 C_insertpart(loc_id = C_getid());
57 register struct stack_level *stl = local_level;
59 stl->sl_max_block = - align(sz - stl->sl_max_block, al);
60 return stl->sl_max_block;
64 static struct localvar *regs[TABSIZ];
67 NewLocal(sz, al, regtype, sc)
70 register struct localvar *tmp = FreeTmps;
71 struct localvar *prev = 0;
75 if (tmp->t_align >= al &&
78 tmp->t_regtype == regtype) {
80 prev->next = tmp->next;
82 else FreeTmps = tmp->next;
90 tmp->t_offset = LocalSpace(sz, al);
94 tmp->t_regtype = regtype;
95 tmp->t_count = REG_DEFAULT;
97 index = (int) (tmp->t_offset >> 2) & (TABSIZ - 1);
98 tmp->next = regs[index];
100 return tmp->t_offset;
106 int index = (int) (off >> 2) & (TABSIZ - 1);
107 register struct localvar *tmp = regs[index];
108 struct localvar *prev = 0;
110 while (tmp && tmp->t_offset != off) {
115 if (prev) prev->next = tmp->next;
116 else regs[index] = tmp->next;
117 tmp->next = FreeTmps;
124 register struct localvar *tmp, *tmp1;
133 if (tmp->t_sc == REGISTER) tmp->t_count += REG_BONUS;
134 if (! options['n'] && tmp->t_regtype >= 0) {
135 C_ms_reg(tmp->t_offset, tmp->t_size, tmp->t_regtype, tmp->t_count);
141 for (i = 0; i < TABSIZ; i++) {
144 if (tmp->t_sc == REGISTER) tmp->t_count += REG_BONUS;
146 if (! options['n'] && tmp->t_regtype >= 0) {
147 C_ms_reg(tmp->t_offset,
157 if (! options['n']) {
166 RegisterAccount(offset, size, regtype, sc)
169 register struct localvar *p;
172 if (regtype < 0) return;
175 index = (int) (offset >> 2) & (TABSIZ - 1);
176 p->t_offset = offset;
177 p->t_regtype = regtype;
178 p->t_count = REG_DEFAULT;
181 p->next = regs[index];
185 static struct localvar *
189 register struct localvar *p = regs[(int)(off >> 2) & (TABSIZ - 1)];
191 while (p && p->t_offset != off) p = p->next;
198 register struct localvar *p = find_reg(off);
205 if (sz == word_size) C_lol(off);
206 else if (sz == dword_size) C_ldl(off);
208 if (p) p->t_regtype = -1;
217 register struct localvar *p = find_reg(off);
224 if (sz == word_size) C_stl(off);
225 else if (sz == dword_size) C_sdl(off);
227 if (p) p->t_regtype = -1;
237 register struct localvar *p = find_reg(off);
239 if (p) p->t_regtype = -1;