From 2ef7ee3efcb5113c69de4e6810924e819104abeb Mon Sep 17 00:00:00 2001 From: sater Date: Mon, 25 Jun 1984 11:02:34 +0000 Subject: [PATCH] Initial revision --- mach/pdp/cg/peep.c | 130 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 mach/pdp/cg/peep.c diff --git a/mach/pdp/cg/peep.c b/mach/pdp/cg/peep.c new file mode 100644 index 000000000..9a485de72 --- /dev/null +++ b/mach/pdp/cg/peep.c @@ -0,0 +1,130 @@ +#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]; + +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 $6.,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]=='6' && + buf[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]=='.' && 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); +}