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 static char rcsid[]= "$Id: expr.c,v 0.4 1994/06/24 10:37:14 ceriel Exp $";
21 extern set_t l_sets[];
25 if (e.ex_typ != TYPINT)
26 error("Expression should be integer");
31 if (e.ex_typ != TYPBOOL)
32 error("Expression should be boolean");
36 expr_t make_expr(type,operator,op1,op2) {
40 result.ex_index=ex_lookup(operator,op1,op2);
44 expr_t regno_expr(regno) {
48 result.ex_typ = TYPREG;
49 result.ex_index = ex_lookup(EX_REG,regno,0);
50 for (i=0;i<SZOFSET(MAXREGS);i++)
51 result.ex_regset[i] = 0;
52 BIS(result.ex_regset,regno);
56 expr_t ident_expr(name) char *name; {
57 register symbol *sy_p;
59 sy_p = lookup(name,symany,mustexist);
60 if (sy_p->sy_type==symconst)
61 return(make_expr(TYPINT,EX_CON,
62 (int) (sy_p->sy_value.syv_cstval&0xFFFF),
63 (int) (sy_p->sy_value.syv_cstval>>16)));
64 else if (sy_p->sy_type==symsconst)
65 return(make_expr(TYPADDR,EX_STRING,sy_p->sy_value.syv_stringno,0));
66 else if (sy_p->sy_type!=symreg)
67 error("Wrong type of identifier %s",name);
68 return(regno_expr(sy_p->sy_value.syv_regno));
71 expr_t subreg_expr(tokarg,subreg) {
74 result.ex_typ = TYPREG;
75 subregset(l_sets[tokpatset[tokarg > 0 ? tokarg-1 : tokarg]].set_val,
76 subreg,result.ex_regset);
77 result.ex_index = ex_lookup(EX_SUBREG,tokarg,subreg);
81 subregset(sp,subreg,regset) register short *sp; register short *regset; {
85 for (i=0;i<SZOFSET(MAXREGS);i++)
87 for (i=1;i<nregs;i++) if (BIT(sp,i)) {
90 if (rp->ri_memb[subreg-1]==0)
91 error("Register %s in set has no member %d",
93 BIS(regset,rp->ri_memb[subreg-1]);
97 for(;i<nregs+MAXTOKENS;i++) if(BIT(sp,i))
98 error("Set contains %s, which is not a register",
99 l_tokens[i-nregs]->tk_name);
102 membset(setno,name,regset,appearance,restyp,typp)
103 char *name,*appearance;
114 if (setno < 0) return 0;
115 sp = l_sets[setno].set_val;
116 for (i=1;i<nregs;i++) if (BIT(sp,i)) {
117 error("Set in %s contains %s, which is not a token",
118 appearance,l_regs[i].ri_name);
121 for (i=0;i<SZOFSET(MAXREGS);i++)
123 for (i=nregs;i<nregs+MAXTOKENS;i++) if (BIT(sp,i)) {
124 tp = l_tokens[i-nregs];
126 (tp->tk_att[j].ta_type == -3 ||
127 strcmp(tp->tk_att[j].ta_name,name));j++)
130 error("Token %s does not contain %s",tp->tk_name,name);
131 else if (j!=res_j && res_j != -1)
135 thistyp = tp->tk_att[j].ta_type;
137 if (restyp!=TYPADDR && restyp!=0)
141 } else if (thistyp== -1) {
142 if (restyp!=TYPINT && restyp!=0)
147 if (restyp!=TYPREG && restyp!=0)
151 for(k=0;k<SZOFSET(MAXREGS);k++)
153 l_props[tp->tk_att[j].ta_type].pr_regset[k];
159 error("%s is not a valid expression; types differ in the set",
161 *typp = restyp==0 ? TYPINT : restyp;
162 return(res_j == -1 ? 0 : res_j);
165 expr_t memb_expr(setno,name,appearance,tokarg) char *name,*appearance; {
169 res_j = membset(setno,name,result.ex_regset,appearance,0,&result.ex_typ);
170 result.ex_index = ex_lookup(EX_TOKFIELD,tokarg,res_j+1);
174 expr_t tokm_expr(tokarg,name) char *name; {
176 int tokarg1 = tokarg > 0 ? tokarg : 1;
178 sprintf(app,"%%%d.%s",tokarg1,name);
179 return(memb_expr(tokpatset[tokarg1-1],name,app,tokarg));
182 expr_t perc_ident_expr(name) char *name; {
185 sprintf(app,"%%%s",name);
186 return(memb_expr(cursetno,name,app,0));
189 expr_t all_expr(all_no,subreg) {
195 sp = l_props[allreg[all_no]].pr_regset;
196 for (i=0;i<SETSIZE;i++)
197 localset.set_val[i] = i<SZOFSET(MAXREGS) ? sp[i] : 0;
198 subregset(localset.set_val,subreg,result.ex_regset);
199 result.ex_typ = TYPREG;
200 result.ex_index = ex_lookup(EX_ALLREG,all_no+1,subreg);
204 eq2expr(e1,e2) expr_t e1,e2; {
206 if (e1.ex_typ != e2.ex_typ)
207 error("Expressions around == should have equal type");
211 error("== on booleans not implemented");
221 ne2expr(e1,e2) expr_t e1,e2; {
223 if (e1.ex_typ != e2.ex_typ)
224 error("Expressions around != should have equal type");
228 error("!= on booleans not implemented");
238 expr_t sum_expr(e1,e2) expr_t e1,e2; {
239 int operator,op1,op2;
242 operator = EX_CAT; op1 = e1.ex_index; op2 = e2.ex_index;
243 if (e1.ex_typ==e2.ex_typ) {
244 result.ex_typ = e1.ex_typ;
245 if (e1.ex_typ == TYPINT)
247 else if (e1.ex_typ != TYPADDR)
248 error("+ is not implemented on this type");
250 result.ex_typ = TYPADDR;
251 if (e1.ex_typ != TYPADDR) {
252 if (e1.ex_typ!=TYPINT)
253 error("Wrong left operand of +");
254 op1 = ex_lookup(EX_TOSTRING,op1,0);
256 if (e2.ex_typ != TYPADDR) {
257 if (e2.ex_typ!=TYPINT)
258 error("Wrong right operand of +");
259 op2 = ex_lookup(EX_TOSTRING,op2,0);
262 result.ex_index=ex_lookup(operator,op1,op2);
266 expr_t iextoaddr(e) expr_t e; {
269 result.ex_typ = TYPADDR;
270 result.ex_index = ex_lookup(EX_TOSTRING,e.ex_index,0);
274 expr_t regvar_expr(e,regtyp) expr_t e; {
278 result = make_expr(TYPREG,EX_REGVAR,i_expr(e),0);
279 for(i=0;i<SZOFSET(MAXREGS);i++)
280 result.ex_regset[i]=0;
281 for(i=0;i<nregvar[regtyp];i++)
282 BIS(result.ex_regset,rvnumbers[regtyp][i]);
287 * Node table lookup part
290 node_t nodes[MAXNODES];
295 nodes[0].ex_operator = EX_CON;
296 nodes[0].ex_lnode = 0;
297 nodes[0].ex_rnode = 0;
301 ex_lookup(operator,lnode,rnode) {
304 for(p=nodes+1;p< &nodes[nnodes];p++) {
305 if (p->ex_operator != operator)
307 if (p->ex_lnode != lnode)
309 if (p->ex_rnode != rnode)
313 NEXT(nnodes,MAXNODES,"Node");
314 p->ex_operator = operator;