Fix bad code generation due to not correctly flushing the stack before
authorDavid Given <dg@cowlark.com>
Tue, 12 Feb 2019 21:19:07 +0000 (22:19 +0100)
committerDavid Given <dg@cowlark.com>
Tue, 12 Feb 2019 21:19:07 +0000 (22:19 +0100)
comparisons.

mach/i80/ncg/table
tests/plat/bugs/bug-157-i80-varargs_c.c

index 1af1055..405a7bf 100644 (file)
@@ -2048,14 +2048,15 @@ gen xra a
 
 #ifdef USE_I80_RSTS
    pat lol zeq sfit($1, 8)
-      uses hlreg, areg
-      gen
-         rst {const1, 3}
-         data1 {const1, $1}
-         mov a, {m}
-         inx hl
-         ora {m}
-         jz {label, $2}
+      with STACK
+         uses hlreg, areg
+         gen
+            rst {const1, 3}
+            data1 {const1, $1}
+            mov a, {m}
+            inx hl
+            ora {m}
+            jz {label, $2}
 #endif
 
 pat lol zeq
@@ -2070,25 +2071,26 @@ pat lol zeq
 
 #ifdef USE_I80_RSTS
    pat lol zne sfit($1, 8)
-      uses hlreg, areg
-      gen
-         rst {const1, 3}
-         data1 {const1, $1}
-         mov a, {m}
-         inx hl
-         ora {m}
-         jnz {label, $2}
+      with STACK
+         uses hlreg, areg
+         gen
+            rst {const1, 3}
+            data1 {const1, $1}
+            mov a, {m}
+            inx hl
+            ora {m}
+            jnz {label, $2}
 #endif
 
 pat lol zne
    with STACK
-   uses hlreg={const2,$1}, areg
-   gen
-      dad lb
-      mov a,{m}
-      inx hl
-      ora {m}
-      jnz {label,$2}
+      uses hlreg={const2,$1}, areg
+      gen
+         dad lb
+         mov a,{m}
+         inx hl
+         ora {m}
+         jnz {label,$2}
 
 pat ior zeq $1==2
 with hl_or_de hl_or_de STACK
index 5eb34ec..028ab74 100644 (file)
@@ -56,7 +56,7 @@ void demo2(int lval, va_list ap)
     ASSERT(strcmp(ptmp, "35") == 0);
 }
 
-void doit1(char *x, ...)
+void doit1a(char *x, ...)
 {
     va_list ptr;
     va_start(ptr, x);
@@ -64,7 +64,15 @@ void doit1(char *x, ...)
     va_end(ptr);
 }
 
-void doit2(char *x, ...)
+void doit1b(char *x, ...)
+{
+    va_list ptr;
+    va_start(ptr, x);
+    demo(1,ptr);
+    va_end(ptr);
+}
+
+void doit2a(char *x, ...)
 {
     va_list ptr;
     va_start(ptr, x);
@@ -72,10 +80,20 @@ void doit2(char *x, ...)
     va_end(ptr);
 }
 
+void doit2b(char *x, ...)
+{
+    va_list ptr;
+    va_start(ptr, x);
+    demo2(1,ptr);
+    va_end(ptr);
+}
+
 int main(int argc, char *argv[])
 {
-    doit1("", 35);
-    doit2("", 35);
+    doit1a("", 35);
+    doit1b("", 35L);
+    doit2a("", 35);
+    doit2b("", 35L);
     finished();
     return 0;
 }