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: coerc.c,v 0.6 1994/06/24 10:37:00 ceriel Exp $";
21 extern set_t l_sets[];
24 move_t l_moves[MAXMOVES];
25 short posmoves[MAXREGS+MAXTOKENS][SETSIZE];
27 n_move(s1,e1,s2,e2,vi) struct varinfo *vi; {
31 NEXT(nmoves,MAXMOVES,"Moves");
32 mp = &l_moves[nmoves-1];
37 mp->m_cindex = codeindex;
38 dopattern(0,VI_NULL,VI_NULL,vi,VI_NULL,VI_NULL);
39 if (mp->m_expr1!=0 || mp->m_expr2!=0)
41 for (i=0;i<MAXREGS+MAXTOKENS;i++)
42 if (BIT(l_sets[mp->m_set1].set_val,i))
43 for(j=0;j<SETSIZE;j++)
44 posmoves[i][j] |= l_sets[mp->m_set2].set_val[j];
47 existmove(from,sp) iocc_t from; short *sp; {
50 for (i=0;i<MAXREGS+MAXTOKENS;i++)
51 if(BIT(from.in_set,i))
52 if (!subset(sp,posmoves[i],SETSIZE))
57 existalmove(from,prpno) iocc_t from; {
61 for (i=0;i<SETSIZE;i++)
62 s[i] = i<SZOFSET(MAXREGS) ? l_props[prpno].pr_regset[i] : 0;
63 return(existmove(from,s));
66 struct varinfo *gen_move(from,to) iocc_t from,to; {
67 register struct varinfo *vp;
69 if (existmove(from,to.in_set)==0) {
70 error("No such move defined");
73 NEW(vp,struct varinfo);
74 vp->vi_int[0] = INSMOVE;
75 vp->vi_int[1] = from.in_index;
76 vp->vi_int[2] = to.in_index;
81 test_t l_tests[MAXTESTS];
82 short postests[SETSIZE];
84 n_test(s,e,vi) struct varinfo *vi; {
88 NEXT(ntests,MAXTESTS,"Tests");
89 tp = &l_tests[ntests-1];
92 tp->t_cindex = codeindex;
93 dopattern(0,VI_NULL,VI_NULL,vi,VI_NULL,VI_NULL);
96 for(i=0;i<SETSIZE;i++)
97 postests[i] |= l_sets[tp->t_set].set_val[i];
100 struct varinfo *gen_test(from) iocc_t from; {
101 register struct varinfo *vp;
103 if (!subset(from.in_set,postests,SETSIZE)) {
104 error("No such test");
107 NEW(vp,struct varinfo);
108 vp->vi_int[0] = INSTEST;
109 vp->vi_int[1] = from.in_index;
113 struct varinfo *gen_label(arg) int arg; {
114 register struct varinfo *vp;
116 NEW(vp,struct varinfo);
117 vp->vi_int[0] = INSLABDEF;
122 struct varinfo *gen_preturn() {
123 register struct varinfo *vp;
125 NEW(vp,struct varinfo);
126 vp->vi_int[0] = INSPRETURN;
130 struct varinfo *gen_tlab(n) {
131 register struct varinfo *vp;
133 assert(n>=0 && n<=9);
134 NEW(vp,struct varinfo);
135 vp->vi_int[0] = INSTLAB;
141 c1_t l_stacks[MAXSTACKS];
142 set_t ustackset,cstackset;
144 n_stack(s,e,p,vi) struct varinfo *vi; {
149 NEXT(nstacks,MAXSTACKS,"Stacks");
150 c1p= & l_stacks[nstacks-1];
154 c1p->c1_codep = codeindex;
155 dopattern(0,VI_NULL,VI_NULL,vi,VI_NULL,VI_NULL);
158 sp = ustackset.set_val;
160 sp = cstackset.set_val;
161 for(i=0;i<SETSIZE;i++)
162 sp[i] |= l_sets[s].set_val[i];
165 checkstacking(sp) register short *sp; {
167 register short *chkset;
170 if (subset(sp,ustackset.set_val,SETSIZE))
172 chkset = ustackset.set_val; warn = "";
173 for (i=1;i<nregs;i++)
174 if (BIT(sp,i) && !BIT(chkset,i))
175 error("No %sstacking rule for register %s",warn,
177 for(;i<nregs+MAXTOKENS;i++)
178 if (BIT(sp,i) && !BIT(chkset,i))
179 error("No %sstacking rule for token %s",warn,
180 l_tokens[i-nregs]->tk_name);
184 c3_t l_coercs[MAXCOERCS];
189 n_coerc(ti,be,al,ge,rp,in) struct varinfo *al,*ge,*rp; iocc_t in; {
192 register struct varinfo *vi;
195 for(i=0,vi=rp;vi!=0;vi=vi->vi_next,i++)
198 n_split(ti,be,al,ge,rp,i);
202 error("Coercion should have a result!");
207 NEW(rp,struct varinfo);
209 rp->vi_int[0] = in.in_index;
212 error("More than 1 register may not be allocated");
213 NEXT(ncoercs,MAXCOERCS,"Coercions");
214 c3p = & l_coercs[ncoercs-1];
217 c3p->c3_prop = nallreg==0 ? -1 : allreg[0];
218 c3p->c3_repl = rp->vi_int[0];
219 c3p->c3_codep = codeindex;
220 dopattern(ti==0,VI_NULL,al,ge,rp,VI_NULL);
222 for(i=0;i<SETSIZE;i++)
223 unstackset.set_val[i] |= in.in_set[i];
227 checkunstacking(setno) {
230 short hallset[SETSIZE];
232 sp = l_sets[setno].set_val;
233 for (i=0;i<SETSIZE;i++)
234 hallset[i]=sp[i]&unstackset.set_val[i];
239 c2_t l_split[MAXSPLCOERC];
241 n_split(ti,be,al,ge,rp,n) struct varinfo *al,*ge,*rp; {
244 register struct varinfo *vi;
246 NEXT(nsplit,MAXSPLCOERC,"Splitting coercions");
247 c2p = &l_split[nsplit-1];
249 error("Maximum split factor is %d",MAXSPLIT);
252 if (n>maxsplit) maxsplit=n;
256 error("No register uses allowed in splitting coercion");
258 for (i=0,vi=rp; i<n; i++,vi=vi->vi_next)
259 c2p->c2_repl[i] = vi->vi_int[0];
260 c2p->c2_codep = codeindex;
261 dopattern(0,VI_NULL,al,ge,rp,VI_NULL);