Initial revision
authorsater <none@none>
Mon, 25 Jun 1984 11:02:34 +0000 (11:02 +0000)
committersater <none@none>
Mon, 25 Jun 1984 11:02:34 +0000 (11:02 +0000)
mach/pdp/cg/peep.c [new file with mode: 0644]

diff --git a/mach/pdp/cg/peep.c b/mach/pdp/cg/peep.c
new file mode 100644 (file)
index 0000000..9a485de
--- /dev/null
@@ -0,0 +1,130 @@
+#include <stdio.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
+ */
+
+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);
+}