#ifndef NORCSID static char rcsid[] = "$Header$"; #endif #include /* * (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 */ char buf[512]; char *index(); main() { register n,sa; register char *p; sa=0; for (;;) { getline(buf); if (n=stackadjust()) { sa += n; continue; } if (nullinstruction()) continue; if (sa) { if (buf[0]=='t' && buf[1]=='s' && buf[2]=='t' && buf[3]==' ') { sa -= 2; buf[0]='m'; buf[1]='o'; buf[2]='v'; strcat(buf,",(sp)+"); } else if (buf[0]=='m' && buf[1]=='o' && buf[2]=='v' && buf[3]==' ' && (p=index(&buf[5],','))!=0 && p[1]=='-' && p[2]=='(' && p[3]=='s') { sa -= 2; p[1]=' '; } } switch(sa) { case 0:break; case 2:puts("tst (sp)+");sa=0;break; case 4:puts("cmp (sp)+,(sp)+");sa=0;break; case 6:puts("add $06,sp");sa=0;break; } puts(buf); } } getline(buf) register char *buf; { register c; while ((c=getchar())==' ' || c=='\t') ; if (c==EOF) exit(0); do *buf++=c; while ((c=getchar())!='\n'); *buf=0; } stackadjust() { if (buf[0]=='t' && buf[1]=='s' && buf[2]=='t' && buf[3]==' ' && buf[4]=='(' && buf[5]=='s' && buf[6]=='p' && buf[7]==')' && buf[8]=='+') return(2); if (buf[0]=='c' && buf[1]=='m' && buf[2]=='p' && buf[3]==' ' && buf[4]=='(' && buf[5]=='s' && buf[6]=='p' && buf[7]==')' && buf[8]=='+' && buf[9]==',' && buf[10]=='(' && buf[11]=='s' && buf[12]=='p' && buf[13]==')' && buf[14]=='+') return(4); if (buf[0]=='a' && buf[1]=='d' && buf[2]=='d' && buf[3]==' ' && buf[4]=='$' && buf[5]=='0' && buf[6]=='6' && buf[7]==',' && buf[8]=='s' && buf[9]=='p' && buf[10]==0) return(6); return(0); } nullinstruction() { register char *p; if (buf[4]=='$' && buf[5]=='0' && buf[6]=='0' && buf[7]==',') { p=index(buf,'-'); if (p!=0 && p[1]=='(') return(0); p=index(buf,'+'); if (p!=0 && p[-1]==')') return(0); if (buf[0]=='b' && buf[1]=='i' && (buf[2]=='s' || buf[2]=='c')) return(1); if (buf[0]=='a' && buf[1]=='d' && buf[2]=='d') return(1); if (buf[0]=='s' && buf[1]=='u' && buf[2]=='b') return(1); } return(0); }