Browse Source

Initial revision

sater 40 years ago
parent
commit
2ef7ee3efc
1 changed files with 130 additions and 0 deletions
  1. 130 0
      mach/pdp/cg/peep.c

+ 130 - 0
mach/pdp/cg/peep.c

@@ -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);
+}