2 static char rcsid[] = "$Id: compute.c,v 2.4 1994/06/24 13:23:22 ceriel Exp $";
9 #include <cg_pattern.h>
16 * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
17 * See the copyright notice in the ACK home directory, in the file "Copyright".
19 * Author: Hans van Staveren
26 #define LLDEF LLEAF|LDEF
27 #define RLDEF RLEAF|RDEF
34 LLDEF|RLDEF, /* EX_SAMESIGN */
35 LLDEF|RLDEF, /* EX_SFIT */
36 LLDEF|RLDEF, /* EX_UFIT */
38 LLDEF|RLDEF, /* EX_NCPEQ */
39 LLDEF|RLDEF, /* EX_SCPEQ */
40 LLDEF|RLDEF, /* EX_RCPEQ */
41 LLDEF|RLDEF, /* EX_NCPNE */
42 LLDEF|RLDEF, /* EX_SCPNE */
43 LLDEF|RLDEF, /* EX_RCPNE */
44 LLDEF|RLDEF, /* EX_NCPGT */
45 LLDEF|RLDEF, /* EX_NCPGE */
46 LLDEF|RLDEF, /* EX_NCPLT */
47 LLDEF|RLDEF, /* EX_NCPLE */
50 LLDEF|RLDEF, /* EX_PLUS */
51 LLDEF|RLDEF, /* EX_CAT */
52 LLDEF|RLDEF, /* EX_MINUS */
53 LLDEF|RLDEF, /* EX_TIMES */
54 LLDEF|RLDEF, /* EX_DIVIDE */
55 LLDEF|RLDEF, /* EX_MOD */
56 LLDEF|RLDEF, /* EX_LSHIFT */
57 LLDEF|RLDEF, /* EX_RSHIFT */
62 LLEAF, /* EX_DEFINED */
64 LLDEF, /* EX_TOSTRING */
65 LLDEF, /* EX_UMINUS */
70 LLDEF, /* EX_REGVAR */
73 string salloc(),strcpy(),strcat();
75 string mycat(s1,s2) string s1,s2; {
78 s=salloc(strlen(s1)+strlen(s2));
84 string mystrcpy(s) string s; {
94 string tostring(n) word n; {
97 if (n>=-20 && n<=20 && (n&1)==0) {
98 if (digstr[(n>>1)+10][0]==0)
99 sprintf(digstr[(n>>1)+10],WRD_FMT,n);
100 return(digstr[(n>>1)+10]);
102 sprintf(buf,WRD_FMT,n);
103 return(mystrcpy(buf));
106 result_t undefres= {EV_UNDEF};
108 result_t compute(node) register node_p node; {
109 result_t leaf1,leaf2,result;
116 desc=opdesc[node->ex_operator];
118 leaf1 = compute(&enodes[node->ex_lnode]);
119 if (desc&LDEF && leaf1.e_typ==EV_UNDEF)
123 leaf2 = compute(&enodes[node->ex_rnode]);
124 if (desc&RDEF && leaf2.e_typ==EV_UNDEF)
128 switch(node->ex_operator) {
129 default: assert(FALSE);
131 if (node->ex_lnode!=0)
132 tp = &fakestack[stackheight-node->ex_lnode];
135 switch(result.e_typ = tokens[tp->t_token].t_type[node->ex_rnode-1]) {
139 result.e_v.e_con = tp->t_att[node->ex_rnode-1].aw;
142 result.e_v.e_str = tp->t_att[node->ex_rnode-1].as;
145 result.e_v.e_reg = tp->t_att[node->ex_rnode-1].ar;
150 return(dollar[node->ex_lnode-1]);
152 result.e_typ = EV_INT;
153 result.e_v.e_con = ((long) node->ex_rnode << 16) | ((long)node->ex_lnode&0xffff);
156 result.e_typ = EV_REG;
157 result.e_v.e_reg = node->ex_lnode;
160 result.e_typ = EV_REG;
161 result.e_v.e_reg = allreg[node->ex_lnode-1];
163 if (node->ex_rnode!=0)
164 result.e_v.e_reg = machregs[result.e_v.e_reg].
165 r_members[node->ex_rnode-1];
169 assert(leaf1.e_typ == EV_INT && leaf2.e_typ == EV_INT);
170 result.e_typ = EV_INT;
171 if (leaf1.e_v.e_con>=0)
172 result.e_v.e_con= leaf2.e_v.e_con>=0;
174 result.e_v.e_con= leaf2.e_v.e_con<0;
177 assert(leaf1.e_typ == EV_INT && leaf2.e_typ == EV_INT);
179 for (i=0;i<leaf2.e_v.e_con-1;i++)
181 tmp = leaf1.e_v.e_con&mask;
182 result.e_v.e_con = tmp==0||tmp==mask;
185 assert(leaf1.e_typ == EV_INT && leaf2.e_typ == EV_INT);
187 for (i=0;i<leaf2.e_v.e_con;i++)
189 result.e_v.e_con = (leaf1.e_v.e_con&mask)==0;
192 assert(node->ex_rnode>=0 &&node->ex_rnode<MAXROM);
193 leaf2=dollar[node->ex_lnode];
194 if (leaf2.e_typ != EV_STR)
196 gp = lookglo(leaf2.e_v.e_str);
197 if (gp == (glosym_p) 0)
199 if ((gp->gl_rom[MAXROM]&(1<<node->ex_rnode))==0)
201 result.e_v.e_con = gp->gl_rom[node->ex_rnode];
204 result.e_v.e_con = saveemp[node->ex_lnode].em_u.em_loper&0xFFFF;
207 result.e_v.e_con = saveemp[node->ex_lnode].em_u.em_loper>>16;
210 assert(leaf1.e_typ == EV_INT && leaf2.e_typ == EV_INT);
211 result.e_v.e_con = leaf1.e_v.e_con==leaf2.e_v.e_con;
214 assert(leaf1.e_typ == EV_STR && leaf2.e_typ == EV_STR);
215 result.e_v.e_con = !strcmp(leaf1.e_v.e_str,leaf2.e_v.e_str);
218 assert(leaf1.e_typ == EV_REG && leaf2.e_typ == EV_REG);
219 result.e_v.e_con = leaf1.e_v.e_reg==leaf2.e_v.e_reg;
222 assert(leaf1.e_typ == EV_INT && leaf2.e_typ == EV_INT);
223 result.e_v.e_con = leaf1.e_v.e_con!=leaf2.e_v.e_con;
226 assert(leaf1.e_typ == EV_STR && leaf2.e_typ == EV_STR);
227 result.e_v.e_con = strcmp(leaf1.e_v.e_str,leaf2.e_v.e_str);
230 assert(leaf1.e_typ == EV_REG && leaf2.e_typ == EV_REG);
231 result.e_v.e_con = leaf1.e_v.e_reg!=leaf2.e_v.e_reg;
234 assert(leaf1.e_typ == EV_INT && leaf2.e_typ == EV_INT);
235 result.e_v.e_con = leaf1.e_v.e_con>leaf2.e_v.e_con;
238 assert(leaf1.e_typ == EV_INT && leaf2.e_typ == EV_INT);
239 result.e_v.e_con = leaf1.e_v.e_con>=leaf2.e_v.e_con;
242 assert(leaf1.e_typ == EV_INT && leaf2.e_typ == EV_INT);
243 result.e_v.e_con = leaf1.e_v.e_con<leaf2.e_v.e_con;
246 assert(leaf1.e_typ == EV_INT && leaf2.e_typ == EV_INT);
247 result.e_v.e_con = leaf1.e_v.e_con<=leaf2.e_v.e_con;
250 assert(leaf1.e_typ == EV_INT);
251 if (leaf1.e_v.e_con==0)
252 return(compute(&enodes[node->ex_rnode]));
255 assert(leaf1.e_typ == EV_INT);
256 if (leaf1.e_v.e_con!=0)
257 return(compute(&enodes[node->ex_rnode]));
260 assert(leaf1.e_typ == EV_INT && leaf2.e_typ == EV_INT);
261 result.e_v.e_con=leaf1.e_v.e_con+leaf2.e_v.e_con;
264 assert(leaf1.e_typ == EV_STR && leaf2.e_typ == EV_STR);
265 result.e_typ = EV_STR;
266 result.e_v.e_str = mycat(leaf1.e_v.e_str,leaf2.e_v.e_str);
269 assert(leaf1.e_typ == EV_INT && leaf2.e_typ == EV_INT);
270 result.e_v.e_con = leaf1.e_v.e_con - leaf2.e_v.e_con;
273 assert(leaf1.e_typ == EV_INT && leaf2.e_typ == EV_INT);
274 result.e_v.e_con = leaf1.e_v.e_con * leaf2.e_v.e_con;
277 assert(leaf1.e_typ == EV_INT && leaf2.e_typ == EV_INT);
278 result.e_v.e_con = leaf1.e_v.e_con / leaf2.e_v.e_con;
281 assert(leaf1.e_typ == EV_INT && leaf2.e_typ == EV_INT);
282 result.e_v.e_con = leaf1.e_v.e_con % leaf2.e_v.e_con;
285 assert(leaf1.e_typ == EV_INT && leaf2.e_typ == EV_INT);
286 result.e_v.e_con = leaf1.e_v.e_con << leaf2.e_v.e_con;
289 assert(leaf1.e_typ == EV_INT && leaf2.e_typ == EV_INT);
290 result.e_v.e_con = leaf1.e_v.e_con >> leaf2.e_v.e_con;
293 assert(leaf1.e_typ == EV_INT);
294 result.e_v.e_con = !leaf1.e_v.e_con;
297 assert(leaf1.e_typ == EV_INT);
298 result.e_v.e_con = ~leaf1.e_v.e_con;
301 if (node->ex_rnode==0)
302 return(compute(&enodes[tokens[node->ex_lnode].t_cost.c_size]));
304 return(compute(&enodes[tokens[node->ex_lnode].t_cost.c_time]));
306 result.e_typ = EV_STR;
307 result.e_v.e_str = codestrings[node->ex_lnode];
310 result.e_v.e_con=leaf1.e_typ!=EV_UNDEF;
313 result.e_typ = EV_REG;
314 tp= &fakestack[stackheight-node->ex_lnode];
315 assert(tp->t_token == -1);
316 tmpreg= tp->t_att[0].ar;
319 tmpreg=machregs[tmpreg].r_members[node->ex_rnode-1];
321 result.e_v.e_reg=tmpreg;
324 assert(leaf1.e_typ == EV_INT);
325 result.e_typ = EV_STR;
326 result.e_v.e_str = tostring(leaf1.e_v.e_con);
330 assert(leaf1.e_typ == EV_INT);
331 i = isregvar((long) leaf1.e_v.e_con);
333 result.e_v.e_con = 0;
335 result.e_v.e_con = 1;
337 result.e_v.e_con = 2;
340 assert(leaf1.e_typ == EV_INT);
341 i = isregvar((long) leaf1.e_v.e_con);
344 result.e_typ = EV_REG;
349 assert(leaf1.e_typ == EV_INT);
350 result.e_v.e_con = -leaf1.e_v.e_con;