Browse Source

Fix: sometimes did not reserve space for local on a mes ms_gto

ceriel 32 years ago
parent
commit
46f084d660
2 changed files with 12 additions and 8 deletions
  1. 7 5
      mach/i386/ncg/mach.c
  2. 5 3
      mach/i86/ncg/mach.c

+ 7 - 5
mach/i386/ncg/mach.c

@@ -78,7 +78,7 @@ prolog(nlocals) full nlocals; {
 		break;
 	default:
 #endif
-		fprintf(codefile, "\tsub\tesp,%ld\n",nlocals);
+		fprintf(codefile, "sub\tesp,%ld\n",nlocals);
 #ifdef NOTDEF
 		break;
 	}
@@ -112,10 +112,12 @@ i_regsave()
 
 f_regsave()
 {
-	if (si_off == -lbytes) lbytes -= 4;
-	if (di_off == -lbytes) lbytes -= 4;
-	if (si_off == -lbytes) lbytes -= 4;
-	if (lbytes) fprintf(codefile, "\tsub\tesp,%ld\n",(long) lbytes);
+	if (si_off != di_off) {
+		if (si_off == -lbytes) lbytes -= 4;
+		if (di_off == -lbytes) lbytes -= 4;
+		if (si_off == -lbytes) lbytes -= 4;
+	}
+	if (lbytes) fprintf(codefile, "sub\tesp,%ld\n",(long) lbytes);
 	if (firstreg == 1) {
 		fputs("push edi\n", codefile);
 		if (si_off != -1) fputs("push esi\n", codefile);

+ 5 - 3
mach/i86/ncg/mach.c

@@ -103,9 +103,11 @@ i_regsave()
 
 f_regsave()
 {
-	if (di_off == -lbytes) lbytes -= 2;
-	if (si_off == -lbytes) lbytes -= 2;
-	if (di_off == -lbytes) lbytes -= 2;
+	if (si_off != di_off) {
+		if (di_off == -lbytes) lbytes -= 2;
+		if (si_off == -lbytes) lbytes -= 2;
+		if (di_off == -lbytes) lbytes -= 2;
+	}
 	switch (lbytes) {
 	case 4: fputs("\tpush\tax\n", codefile);
 	case 2: fputs("\tpush\tax\n", codefile);