#ifndef NORCSID static char rcsid[] = "$Header$"; #endif #include "assert.h" #include "param.h" #include "tables.h" #include "types.h" #include #include "data.h" #include "result.h" #include "extern.h" /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * * Author: Hans van Staveren */ unsigned costcalc(); move(tp1,tp2,ply,toplevel,maxcost) token_p tp1,tp2; unsigned maxcost; { register move_p mp; register unsigned t; register struct reginfo *rp; tkdef_p tdp; int i; unsigned codegen(); if (eqtoken(tp1,tp2)) return(0); if (tp2->t_token == -1) { if (tp1->t_token == -1) { if (eqtoken(&machregs[tp1->t_att[0].ar].r_contents, &machregs[tp2->t_att[0].ar].r_contents) && machregs[tp1->t_att[0].ar].r_contents.t_token!=0) return(0); if (tp1->t_att[0].ar!=1) { /* COCO reg; tmp kludge */ erasereg(tp2->t_att[0].ar); machregs[tp2->t_att[0].ar].r_contents = machregs[tp1->t_att[0].ar].r_contents ; } else machregs[tp1->t_att[0].ar].r_contents = machregs[tp2->t_att[0].ar].r_contents ; } else { if (eqtoken(&machregs[tp2->t_att[0].ar].r_contents,tp1)) return(0); erasereg(tp2->t_att[0].ar); machregs[tp2->t_att[0].ar].r_contents = *tp1; } for (rp=machregs;rpr_contents.t_token == 0) continue; assert(rp->r_contents.t_token > 0); tdp = &tokens[rp->r_contents.t_token]; for (i=0;it_type[i] == EV_REG && clash(rp->r_contents.t_att[i].ar,tp2->t_att[0].ar)) { erasereg(rp-machregs); break; } } } else if (tp1->t_token == -1) { if (eqtoken(tp2,&machregs[tp1->t_att[0].ar].r_contents)) return(0); machregs[tp1->t_att[0].ar].r_contents = *tp2; } /* * If we arrive here the move must really be executed */ for (mp=moves;mpm_set1],mp->m_expr1)) continue; if (match(tp2,&machsets[mp->m_set2],mp->m_expr2)) break; /* * Correct move rule is found */ } assert(mpm_cindex!=0) { fakestack[stackheight] = *tp2; fakestack[stackheight+1] = *tp1; stackheight += 2; t = codegen(&coderules[mp->m_cindex],ply,toplevel,maxcost,0); if (t <= maxcost) t += costcalc(mp->m_cost); stackheight -= 2; } else { t = 0; } return(t); }