Browse Source

erase(reg) now also erases all register whose contents depend on
the contents of reg.

sater 40 years ago
parent
commit
0cd7d8826e
1 changed files with 31 additions and 9 deletions
  1. 31 9
      mach/proto/cg/reg.c

+ 31 - 9
mach/proto/cg/reg.c

@@ -71,21 +71,43 @@ getrefcount(regno) {
 
 erasereg(regno) {
 	register struct reginfo *rp;
-	register i;
 
 #if MAXMEMBERS==0
-	rp= &machregs[regno];
-	rp->r_contents.t_token = 0;
-	for (i=0;i<TOKENSIZE;i++)
-		rp->r_contents.t_att[i].aw=0;
+	awayreg(regno);
 #else
 	for (rp=machregs;rp<machregs+NREGS;rp++)
-		if (rp->r_clash[regno>>4]&(1<<(regno&017))) {
-			rp->r_contents.t_token = 0;
+		if (rp->r_clash[regno>>4]&(1<<(regno&017)))
+			awayreg(rp-machregs);
+#endif
+}
+
+awayreg(regno) {
+	register struct reginfo *rp;
+	register tkdef_p tdp;
+	register i;
+
+	rp = &machregs[regno];
+	rp->r_contents.t_token = 0;
+	for (i=0;i<TOKENSIZE;i++)
+		rp->r_contents.t_att[i].aw = 0;
+
+	/* Now erase recursively all registers containing
+	 * something using this one
+	 */
+	for (rp=machregs;rp<machregs+NREGS;rp++) {
+		if (rp->r_contents.t_token == -1) {
+			if (rp->r_contents.t_att[0].ar == regno)
+				erasereg(rp-machregs);
+		} else {
+			tdp= & tokens[rp->r_contents.t_token];
 			for (i=0;i<TOKENSIZE;i++)
-				rp->r_contents.t_att[i].aw=0;
+				if (tdp->t_type[i] == EV_REG && 
+				    rp->r_contents.t_att[i].ar == regno) {
+					erasereg(rp-machregs);
+					break;
+				}
 		}
-#endif
+	}
 }
 
 cleanregs() {