Merge pull request #158 from davidgiven/dtrg-b157

i80: fix bad code in comparisons
This commit is contained in:
David Given 2019-02-12 22:29:01 +01:00 committed by GitHub
commit 55f3880f43
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 124 additions and 23 deletions

View 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

View file

@ -0,0 +1,99 @@
#include <stdio.h>
#include <stdarg.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include "test.h"
static char buf[34];
char * __ultostr(unsigned long val, int radix)
{
register char *p;
register int c;
if( radix > 36 || radix < 2 ) return 0;
p = buf+sizeof(buf);
*--p = '\0';
do
{
c = val%radix;
val/=radix;
if( c > 9 ) *--p = 'a'-10+c; else *--p = '0'+c;
}
while(val);
return p;
}
char * __ltostr(long val, int radix)
{
char *p;
int flg = 0;
if( val < 0 ) { flg++; val= -val; }
p = __ultostr(val, radix);
if(p && flg) *--p = '-';
return p;
}
void demo(int lval, va_list ap)
{
char *ptmp = __ltostr((long) ((lval) ?
va_arg(ap, long) :
va_arg(ap, int)), 10);
ASSERT(strcmp(ptmp, "35") == 0);
}
void demo2(int lval, va_list ap)
{
long l;
char *ptmp;
l = (lval) ?va_arg(ap, long) :
va_arg(ap, int);
ptmp = __ltostr(l, 10);
ASSERT(strcmp(ptmp, "35") == 0);
}
void doit1a(char *x, ...)
{
va_list ptr;
va_start(ptr, x);
demo(0,ptr);
va_end(ptr);
}
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);
demo2(0,ptr);
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[])
{
doit1a("", 35);
doit1b("", 35L);
doit2a("", 35);
doit2b("", 35L);
finished();
return 0;
}