From f4b45f1ed7a523737e3bf9c680ee7e5487846d96 Mon Sep 17 00:00:00 2001 From: David Given Date: Tue, 12 Feb 2019 22:19:07 +0100 Subject: [PATCH] Fix bad code generation due to not correctly flushing the stack before comparisons. --- mach/i80/ncg/table | 48 +++++++++++++------------ tests/plat/bugs/bug-157-i80-varargs_c.c | 26 +++++++++++--- 2 files changed, 47 insertions(+), 27 deletions(-) diff --git a/mach/i80/ncg/table b/mach/i80/ncg/table index 1af10558a..405a7bfac 100644 --- a/mach/i80/ncg/table +++ b/mach/i80/ncg/table @@ -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 diff --git a/tests/plat/bugs/bug-157-i80-varargs_c.c b/tests/plat/bugs/bug-157-i80-varargs_c.c index 5eb34ec13..028ab7461 100644 --- a/tests/plat/bugs/bug-157-i80-varargs_c.c +++ b/tests/plat/bugs/bug-157-i80-varargs_c.c @@ -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; } -- 2.34.1