Parcourir la source

Added labeldef stuff

ceriel il y a 33 ans
Parent
commit
2751c6eef5
2 fichiers modifiés avec 54 ajouts et 8 suppressions
  1. 24 7
      mach/i386/ncg/mach.c
  2. 30 1
      mach/i386/ncg/table

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

@@ -57,10 +57,16 @@ string holstr(n) word n; {
 }
 */
 
+#ifdef REGVARS
+full lbytes;
+#endif
+
 prolog(nlocals) full nlocals; {
 
 	fputs("push ebp\nmov ebp,esp\n", codefile);
-	if (nlocals == 0) return;
+#ifdef REGVARS
+	lbytes = nlocals;
+#else
 #ifdef NOTDEF
 	probably not better on 386.
 	switch(nlocals) {
@@ -77,6 +83,7 @@ prolog(nlocals) full nlocals; {
 		break;
 	}
 #endif
+#endif
 }
 
 #ifdef REGVARS
@@ -105,6 +112,22 @@ 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 (firstreg == 1) {
+		fputs("push edi\n", codefile);
+		if (si_off != -1) fputs("push esi\n", codefile);
+	}
+	else if (firstreg == -1) {
+		fputs("push esi\n", codefile);
+		if (di_off != -1) fputs("push edi\n", codefile);
+	}
+	if (si_off >= 0)
+		fprintf(codefile, "mov esi,%ld(ebp)\n", si_off);
+	if (di_off >= 0)
+		fprintf(codefile, "mov edi,%ld(ebp)\n", di_off);
 }
 
 regsave(regstr, off, size)
@@ -114,16 +137,10 @@ regsave(regstr, off, size)
 	if (strcmp(regstr, "esi") == 0) {
 		if (! firstreg) firstreg = -1;
 		si_off = off;
-		fputs("push esi\n", codefile);
-		if (off >= 0)
-			fprintf(codefile, "mov esi,%ld(ebp)\n", off);
 	}
 	else {
 		if (! firstreg) firstreg = 1;
 		di_off = off;
-		fputs("push edi\n", codefile);
-		if (off >= 0)
-			fprintf(codefile, "mov edi,%ld(ebp)\n", off);
 	}
 }
 

+ 30 - 1
mach/i386/ncg/table

@@ -2062,6 +2062,16 @@ pat cui					leaving cuu
 
 pat cuu
 
+pat loc loc cii zeq $1==1
+with GENREG STACK
+gen test %1.1
+    je {label, $4}
+
+pat loc loc cii zne $1==1
+with GENREG STACK
+gen test %1.1
+    jne {label, $4}
+
 pat loc loc cii loc and zeq $4<256 && $4>=0 && $5==4 && $1==1 && $2==4
 		leaving loc $4 and $5 zeq $6
 pat loc loc cii loc and zne $4<256 && $4>=0 && $5==4 && $1==1 && $2==4
@@ -2620,7 +2630,26 @@ pat loc cmu zne $1<256 && $1>=0 && $2==4 call loccmuzxx("jne")
  *  Group 13 : Branch Instructions				   *
  *******************************************************************/
 
-pat bra
+pat lab topeltsize($1)==4 && !fallthrough($1)
+  with STACK
+  kills ALL
+  gen labeldef $1                 yields eax
+
+pat lab topeltsize($1)==4 && fallthrough($1)
+  with ACC STACK
+  kills ALL
+  gen labeldef $1                 yields eax
+
+pat lab topeltsize($1)!=4
+  with STACK
+  kills ALL
+  gen labeldef $1
+
+pat bra topeltsize($1)==4
+  with ACC STACK
+  gen jmp {label,$1}
+
+pat bra topeltsize($1)!=4
   with STACK
   gen jmp {label,$1}