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: subr.c,v 0.7 1994/06/24 10:38:23 ceriel Exp $";
22 n_proc(name) char *name; {
23 register symbol *sy_p;
26 sy_p = lookup(name,symproc,newsymbol);
27 sy_p->sy_value.syv_procoff = npatbytes + 1;
31 make_erase(name) char *name; {
32 expr_t e,ident_expr();
33 struct varinfo *result;
36 if (e.ex_typ != TYPREG)
37 error("Register name required here");
38 NEW(result,struct varinfo);
39 result->vi_next = VI_NULL;
40 result->vi_int[0] = e.ex_index;
44 n_instr(name,asname,oplist,eraselist,cost)
47 struct varinfo *eraselist,*cost;
53 instrno = NEXT(ninstr,MAXINSTR,"Instructions");
54 ip = &l_instr[instrno];
56 ip->i_asname = strlookup(asname!=0 ? asname : name);
58 ip->i_oplist = oplist;
59 ip->i_erases = eraselist;
61 ip->i_cost.ct_space = 0;
62 ip->i_cost.ct_time = 0;
64 ip->i_cost.ct_space = cost->vi_int[0];
65 ip->i_cost.ct_space = cost->vi_int[1];
67 for (cc_count=0; oplist!=0; oplist = oplist->o_next) {
69 if(oplist->o_adorn&AD_CC)
72 while (eraselist!=VI_NULL) {
73 if (eraselist->vi_int[0] == -1 && cc_count)
74 error("Instruction can't both set and break the condition codes");
75 eraselist=eraselist->vi_next;
78 error("No instruction can set condition codes more than once");
81 n_set(name,number) char *name; {
82 register symbol *sy_p;
84 sy_p = lookup(name,symset,newsymbol);
85 sy_p->sy_value.syv_setno = number;
88 n_tok(name,atts,size,cost,format)
90 struct varinfo *atts,*cost,*format;
92 register symbol *sy_p;
94 register struct varinfo *vip;
98 char formstr[50],smallstr[2];
100 sy_p = lookup(name,symtok,newsymbol);
102 tokno = NEXT(ntokens,MAXTOKENS,"Tokens");
103 sy_p->sy_value.syv_tokno = tokno;
104 l_tokens[tokno] = tp;
105 tp->tk_name = sy_p->sy_name;
108 tp->tk_cost.ct_space = cost->vi_int[0];
109 tp->tk_cost.ct_time = cost->vi_int[1];
111 tp->tk_cost.ct_space = 0;
112 tp->tk_cost.ct_time = 0;
114 for(i=0,vip=atts;i<MAXATT && vip!=0;i++,vip=vip->vi_next) {
115 tp->tk_att[i].ta_type = vip->vi_int[0];
116 tp->tk_att[i].ta_name = vip->vi_str[0];
123 error("More then %d attributes, rest discarded",MAXATT);
125 tp->tk_att[i].ta_type= -3;
128 for (vip=format;vip!=0;vip=vip->vi_next) {
129 if (vip->vi_int[0]==0)
130 strcat(formstr,vip->vi_str[0]);
132 for(i=0;i<thistokensize;i++) {
133 if (strcmp(vip->vi_str[0],tp->tk_att[i].ta_name)==0) {
136 strcat(formstr,smallstr);
140 if (i==thistokensize)
141 error("%s not a known attribute",
145 tp->tk_format = strlookup(formstr);
150 checkprintformat(n) {
153 extern set_t l_sets[];
155 s= l_sets[n].set_val;
156 for(i=nregs;i<nregs+ntokens;i++)
157 if (BIT(s,i) && l_tokens[i-nregs]->tk_format<0)
158 error("Token %s in set does not have printformat",
159 l_tokens[i-nregs]->tk_name);
162 n_prop(name,size) char *name; int size; {
166 propno = NEXT(nprops,MAXPROPS,"Properties");
167 sp = lookup(name,symprop,newsymbol);
168 sp->sy_value.syv_propno = propno;
170 error("Size of property must be >0");
173 l_props[propno].pr_size = size;
178 short hallset[SETSIZE];
181 for(i=0;i<SETSIZE;i++)
182 hallset[i] = i<SZOFSET(MAXREGS) ? l_props[n].pr_regset[i] : 0;
186 n_reg(name,printstring,nmemb,member1,member2) char *name,*printstring; {
187 register symbol *sy_p;
188 register reginfo *ri_p;
191 sy_p = lookup(name,symreg,newsymbol);
192 sy_p->sy_value.syv_regno = regno = NEXT(nregs,MAXREGS,"Number of registers");
193 ri_p = &l_regs[regno];
194 ri_p->ri_name = mystrcpy(name);
195 ri_p->ri_repr = printstring!=0 ? mystrcpy(printstring) : ri_p->ri_name;
196 ri_p->ri_memb[0] = member1;
197 ri_p->ri_memb[1] = member2;
198 if (nmemb>maxmembers)
205 wordsize = cmustbeset("EM_WSIZE");
206 pointersize = cmustbeset("EM_PSIZE");
209 cmustbeset(ident) char *ident; {
211 return(lookup(ident,symconst,mustexist)->sy_value.syv_cstval);
214 n_const(ident,val) char *ident; {
215 register symbol *sy_p;
217 sy_p = lookup(ident,symconst,newsymbol);
218 sy_p->sy_value.syv_cstval = val;
221 n_sconst(ident,val) char *ident,*val; {
222 register symbol *sy_p;
224 sy_p = lookup(ident,symsconst,newsymbol);
225 sy_p->sy_value.syv_stringno = strlookup(val);
228 regline(rl,pl,rv) varinfo *rl,*pl; {
229 register varinfo *rrl,*rpl;
231 register reginfo *regp;
235 for(rrl=rl;rrl!=0;rrl=rrl->vi_next) {
236 regp = &l_regs[rrl->vi_int[0]];
238 for(rpl=pl;rpl!=0;rpl=rpl->vi_next) {
239 propno = rpl->vi_int[0];
240 sp= l_props[propno].pr_regset;
241 BIS(sp,rrl->vi_int[0]);
243 thissize = l_props[propno].pr_size;
244 else if (thissize!=-1 && thissize!=l_props[propno].pr_size)
245 error("Register %s has no clear size",
248 regp->ri_size = thissize;
249 regp->ri_class = regclass;
250 regp->ri_rregvar = rv;
252 if (regp->ri_memb[0]!=0)
253 error("Register variables may not have subregisters");
254 rvused |= ANY_REGVAR;
255 if (regp->ri_size == wordsize)
257 else if (regp->ri_size == 2*wordsize)
260 rvsize[rv] = regp->ri_size;
261 else if (rvsize[rv]!=regp->ri_size)
262 error("All register variables of one type must have the same size");
263 NEXT(nregvar[rv],MAXREGVAR,"Register variable");
264 rvnumbers[rv][nregvar[rv]-1] = rrl->vi_int[0];
270 setallreg(vi) struct varinfo *vi; {
273 for(;vi!=0;vi=vi->vi_next) {
276 allreg[nallreg++] = vi->vi_int[0];
280 freevi(vip) register struct varinfo *vip; {
286 freevi(vip->vi_next);
288 for (i=0;i<VI_NSTR;i++)
289 if (vip->vi_str[i]>end)
290 free((char *) vip->vi_str[i]);
294 int myatoi(s) register char *s; {
295 register int base=10;
308 default: return(sum);
311 if (base==8) error("Bad digit in octal number");
320 sum = sum*base + *s++ - '0';
328 if (base!=16) error("Hexletter in number not expected");
329 sum = sum*base + 10 + *s++ - 'a';
337 if (base!=16) error("Hexletter in number not expected");
338 sum = sum*base + 10 + *s++ - 'A';
344 char *mystrcpy(s) char *s; {
348 p=myalloc(strlen(s)+1);
353 char *myalloc(n) register n; {
354 register char *p,*result;
359 fatal("Out of memory");
360 do *p++=0; while (--n);
364 chkincl(value,lwb,upb) {
366 if (value<lwb || value>upb)
367 error("Number %d should have been between %d and %d",
372 subset(sp1,sp2,setsize) short *sp1,*sp2; {
375 for(i=0;i<setsize;i++)
376 if ( (sp1[i] | sp2[i]) != sp2[i])
381 vilength(vip) register struct varinfo *vip; {