1 /* $Id: cs_vnm.c,v 1.7 1994/06/24 10:22:52 ceriel Exp $ */
3 * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
4 * See the copyright notice in the ACK home directory, in the file "Copyright".
7 /* V A L U E N U M B E R I N G M E T H O D */
10 #include "../share/types.h"
11 #include "../share/global.h"
12 #include "../share/debug.h"
13 #include "../share/aux.h"
17 #include "cs_entity.h"
21 #include "cs_partit.h"
22 #include "cs_getent.h"
24 STATIC push_entity(enp, lfirst)
28 /* Build token and Push it. */
32 tk.tk_vn = enp->en_vn;
33 tk.tk_size = enp->en_size;
34 tk.tk_lfirst = lfirst;
38 STATIC put_expensive_load(bp, lnp, lfirst, enp)
46 av.av_instr = INSTR(lnp);
47 av.av_size = enp->en_size;
48 av.av_operand = enp->en_vn;
50 ocp = newoccur(lfirst, lnp, bp);
52 av_enter(&av, ocp, EXPENSIVE_LOAD);
55 STATIC put_aar(bp, lnp, lfirst, enp)
60 /* Enp points to an ENARRELEM. We do as if its address was computed. */
65 assert(enp->en_kind == ENARRELEM);
68 av.av_ofirst = enp->en_arbase;
69 av.av_osecond = enp->en_index;
70 av.av_othird = enp->en_adesc;
72 ocp = newoccur(lfirst, lnp, bp);
74 av_enter(&av, ocp, TERNAIR_OP);
77 STATIC push_avail(avp, lfirst)
83 tk.tk_vn = avp->av_result;
84 tk.tk_size = avp->av_size;
85 tk.tk_lfirst = lfirst;
89 STATIC push_unair_op(bp, lnp, tkp1)
97 av.av_instr = INSTR(lnp);
98 av.av_size = avsize(lnp);
99 av.av_operand = tkp1->tk_vn;
101 ocp = newoccur(tkp1->tk_lfirst, lnp, bp);
103 push_avail(av_enter(&av, ocp, UNAIR_OP), tkp1->tk_lfirst);
106 STATIC push_binair_op(bp, lnp, tkp1, tkp2)
114 av.av_instr = INSTR(lnp);
115 av.av_size = avsize(lnp);
116 av.av_oleft = tkp1->tk_vn;
117 av.av_oright = tkp2->tk_vn;
119 ocp = newoccur(tkp1->tk_lfirst, lnp, bp);
121 push_avail(av_enter(&av, ocp, BINAIR_OP), tkp1->tk_lfirst);
124 STATIC push_ternair_op(bp, lnp, tkp1, tkp2, tkp3)
127 token_p tkp1, tkp2, tkp3;
132 av.av_instr = INSTR(lnp);
133 av.av_size = avsize(lnp);
134 av.av_ofirst = tkp1->tk_vn;
135 av.av_osecond = tkp2->tk_vn;
136 av.av_othird = tkp3->tk_vn;
138 ocp = newoccur(tkp1->tk_lfirst, lnp, bp);
140 push_avail(av_enter(&av, ocp, TERNAIR_OP), tkp1->tk_lfirst);
143 STATIC fiddle_stack(lnp)
146 /* The instruction in lnp does something to the valuenumber-stack. */
151 /* Partly initialize dummy. */
152 dummy.tk_lfirst = lnp;
154 switch (INSTR(lnp)) {
159 dummy.tk_vn = newvalnum(); dummy.tk_size = ps;
163 if ((size = off_set(lnp)) > 0) {
166 dummy.tk_vn = newvalnum();
167 dummy.tk_size = size;
178 /* Don't waste effort. */
182 Pop(&dummy, (offset) ps);
185 dummy.tk_vn = newvalnum();
186 dummy.tk_size = off_set(lnp);
195 Pop(&dummy, (offset) ws);
196 Pop(&dummy, (offset) ws);
199 case op_csa:/* ??? */
200 case op_csb:/* ??? */
201 case op_gto:/* ??? */
202 case op_ret:/* ??? */
203 case op_rtt:/* ??? */
212 Pop(&dummy, (offset) ws);
215 Pop(&dummy, (offset) ps);
220 STATIC proc_p find_proc(vn)
223 /* Find the procedure-identifier with valuenumber vn. */
227 enp = find_entity(vn);
229 if (enp != (entity_p) 0 && enp->en_kind == ENPROC)
235 STATIC side_effects(lnp)
238 /* Lnp contains a cai or cal instruction. We try to find the callee
239 * and see what side-effects it has.
244 if (INSTR(lnp) == op_cai) {
245 Pop(&tk, (offset) ps);
246 pp = find_proc(tk.tk_vn);
248 assert(INSTR(lnp) == op_cal);
251 if (pp != (proc_p) 0) {
261 /* The effect of `instr' is too difficult to
262 * compute. We assume worst case behaviour.
270 case op_nop: /* for volatiles */
271 /* We can't even trust "static" entities. */
288 register entity_p rep;
290 struct token tk, tk1, tk2, tk3;
292 for (lnp = bp->b_start; lnp != (line_p) 0; lnp = lnp->l_next) {
294 rep = getentity(lnp, &lfirst);
295 switch (instrgroup(lnp)) {
297 push_entity(rep, lfirst);
300 put_aar(bp, lnp, lfirst, rep);
301 /* Fall through ... */
303 push_entity(rep, lfirst);
304 put_expensive_load(bp, lnp, lfirst, rep);
308 Pop(&tk, rep->en_size);
309 rep->en_vn = tk.tk_vn;
312 put_aar(bp, lnp, lfirst, rep);
313 /* Fall through ... */
316 Pop(&tk, rep->en_size);
317 rep->en_vn = tk.tk_vn;
320 Pop(&tk1, op11size(lnp));
321 push_unair_op(bp, lnp, &tk1);
324 Pop(&tk2, op22size(lnp));
325 Pop(&tk1, op12size(lnp));
326 push_binair_op(bp, lnp, &tk1, &tk2);
329 Pop(&tk3, op33size(lnp));
330 Pop(&tk2, op23size(lnp));
331 Pop(&tk1, op13size(lnp));
332 push_ternair_op(bp, lnp, &tk1, &tk2, &tk3);
346 hopeless(INSTR(lnp));