mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-11 22:31:12 +02:00
Add simple test case to test argument and return values.
* check/call.ok, check/call.tst: New test cases to validate simple typed argument and return values in function calls. * check/lightning.c: Properly handle jit_movi of labels for backward and forward code labels. * check/Makefile.am: Update for new test case.
This commit is contained in:
parent
afd665d471
commit
3ee09ecc64
5 changed files with 282 additions and 2 deletions
10
ChangeLog
10
ChangeLog
|
@ -1,3 +1,13 @@
|
|||
2012-12-23 Paulo Andrade <pcpa@gnu.org>
|
||||
|
||||
* check/call.ok, check/call.tst: New test cases to validate
|
||||
simple typed argument and return values in function calls.
|
||||
|
||||
* check/lightning.c: Properly handle jit_movi of labels for
|
||||
backward and forward code labels.
|
||||
|
||||
* check/Makefile.am: Update for new test case.
|
||||
|
||||
2012-12-23 Paulo Andrade <pcpa@gnu.org>
|
||||
|
||||
* check/carry.ok, check/carry.tst: New test case to validate
|
||||
|
|
|
@ -63,6 +63,7 @@ EXTRA_DIST = \
|
|||
stack.tst stack.ok \
|
||||
clobber.tst clobber.ok \
|
||||
carry.tst carry.ok \
|
||||
call.tst call.ok \
|
||||
check.sh \
|
||||
check.x87.sh \
|
||||
check.arm.sh check.swf.sh \
|
||||
|
@ -83,7 +84,7 @@ base_TESTS = \
|
|||
alu_com alu_neg \
|
||||
fop_abs fop_sqrt \
|
||||
varargs stack \
|
||||
clobber carry
|
||||
clobber carry call
|
||||
|
||||
$(base_TESTS): check.sh
|
||||
$(LN_S) $(srcdir)/check.sh $@
|
||||
|
|
4
check/call.ok
Normal file
4
check/call.ok
Normal file
|
@ -0,0 +1,4 @@
|
|||
forward
|
||||
backward
|
||||
forward
|
||||
backward
|
262
check/call.tst
Normal file
262
check/call.tst
Normal file
|
@ -0,0 +1,262 @@
|
|||
#define def_wi(i) \
|
||||
_w##i: \
|
||||
prolog \
|
||||
arg $arg##i \
|
||||
getarg##i %r0 $arg##i \
|
||||
retr %r0 \
|
||||
epilog
|
||||
#define def_wf(f) \
|
||||
_w##f: \
|
||||
prolog \
|
||||
arg##f $arg##f \
|
||||
getarg##f %f0 $arg##f \
|
||||
truncr##f %r0 %f0 \
|
||||
retr %r0 \
|
||||
epilog
|
||||
#define def_fi(f, i) \
|
||||
f##i: \
|
||||
prolog \
|
||||
arg $arg##i \
|
||||
getarg##i %r0 $arg##i \
|
||||
extr##f %f0 %r0 \
|
||||
retr##f %f0 \
|
||||
epilog
|
||||
#define def_f(f) \
|
||||
f##f: \
|
||||
prolog \
|
||||
arg##f $arg##f \
|
||||
getarg##f %f0 $arg##f \
|
||||
retr##f %f0 \
|
||||
epilog
|
||||
#define def_ff(f, g) \
|
||||
f##g: \
|
||||
prolog \
|
||||
arg##g $arg##g \
|
||||
getarg##g %f0 $arg##g \
|
||||
extr##g##f %f0 %f0 \
|
||||
retr##f %f0 \
|
||||
epilog
|
||||
|
||||
.data 32
|
||||
fstr:
|
||||
.c "forward"
|
||||
bstr:
|
||||
.c "backward"
|
||||
|
||||
.code
|
||||
jmpi main
|
||||
|
||||
def_wi(_c)
|
||||
def_wi(_uc)
|
||||
def_wi(_s)
|
||||
def_wi(_us)
|
||||
#if __WORDSIZE == 64
|
||||
def_wi(_i)
|
||||
def_wi(_ui)
|
||||
#endif
|
||||
def_wf(_f)
|
||||
def_wf(_d)
|
||||
def_fi(_f, _c)
|
||||
def_fi(_f, _uc)
|
||||
def_fi(_f, _s)
|
||||
def_fi(_f, _us)
|
||||
def_fi(_f, _i)
|
||||
#if __WORDSIZE == 64
|
||||
def_fi(_f, _ui)
|
||||
def_fi(_f, _l)
|
||||
#endif
|
||||
def_fi(_d, _c)
|
||||
def_fi(_d, _uc)
|
||||
def_fi(_d, _s)
|
||||
def_fi(_d, _us)
|
||||
def_fi(_d, _i)
|
||||
#if __WORDSIZE == 64
|
||||
def_fi(_d, _ui)
|
||||
def_fi(_d, _l)
|
||||
#endif
|
||||
def_f(_f)
|
||||
def_f(_d)
|
||||
def_ff(_f, _d)
|
||||
def_ff(_d, _f)
|
||||
|
||||
main:
|
||||
prolog
|
||||
|
||||
#define _call_w(n, i, a, r) \
|
||||
prepare \
|
||||
pushargi a \
|
||||
finishi _w##i \
|
||||
retval %r0 \
|
||||
extr##i %r0 %r0 \
|
||||
beqi _w##i##_##n %r0 r \
|
||||
calli @abort \
|
||||
_w##i##_##n:
|
||||
#define call_w(n, i, a, r) _call_w(n, i, a, r)
|
||||
#define _call_wf(n, f, a, r) \
|
||||
prepare \
|
||||
pushargi##f a \
|
||||
finishi _w##f \
|
||||
retval %r0 \
|
||||
extr##f %f0 %r0 \
|
||||
beqi##f _w##f##_##n %f0 r \
|
||||
calli @abort \
|
||||
_w##f##_##n:
|
||||
#define call_wf(n, f, a, r) _call_wf(n, f, a, r)
|
||||
#define _call_fi(n, f, i, a, r) \
|
||||
prepare \
|
||||
pushargi a \
|
||||
finishi f##i \
|
||||
retval##f %f0 \
|
||||
beqi##f f##i##n %f0 r \
|
||||
calli @abort \
|
||||
f##i##n:
|
||||
#define call_fi(n, f, i, a, r) _call_fi(n, f, i, a, r)
|
||||
#define _call_f(n, f, a, r) \
|
||||
prepare \
|
||||
pushargi##f a \
|
||||
finishi f##f \
|
||||
retval##f %f0 \
|
||||
beqi##f f##f##n %f0 r \
|
||||
calli @abort \
|
||||
f##f##n:
|
||||
#define call_f(n, f, a, r) _call_f(n, f, a, r)
|
||||
#define _call_ff(n, f, g, a, r) \
|
||||
prepare \
|
||||
pushargi##g a \
|
||||
finishi f##g \
|
||||
retval##f %f0 \
|
||||
beqi##f f##g##n %f0 r \
|
||||
calli @abort \
|
||||
f##g##n:
|
||||
#define call_ff(n, f, g, a, r) _call_ff(n, f, g, a, r)
|
||||
|
||||
#define c7f 0x7f
|
||||
#define c80 0x80
|
||||
#define c81 0x81
|
||||
#define cff 0xff
|
||||
#define s7f 0x7fff
|
||||
#define s80 0x8000
|
||||
#define s81 0x8001
|
||||
#define i7f 0x7fffffff
|
||||
#define i80 0x80000000
|
||||
#define i81 0x80000001
|
||||
#define iff 0xffffffff
|
||||
#define l7f 0x7fffffffffffffff
|
||||
#define l80 0x8000000000000000
|
||||
#define l81 0x8000000000000001
|
||||
#define f7f 127.0
|
||||
#define f80 -128.0
|
||||
#define f81 -127.0
|
||||
#define uf80 128.0
|
||||
#define uf81 127.0
|
||||
#if __WORDSIZE == 32
|
||||
# define wc80 0xffffff80
|
||||
# define wc81 0xffffff81
|
||||
# define ws80 0xffff8000
|
||||
# define ws81 0xffff8001
|
||||
#else
|
||||
# define wc80 0xffffffffffffff80
|
||||
# define wc81 0xffffffffffffff81
|
||||
# define ws80 0xffffffffffff8000
|
||||
# define ws81 0xffffffffffff8001
|
||||
# define wi80 0xffffffff80000000
|
||||
# define wi81 0xffffffff80000001
|
||||
#endif
|
||||
|
||||
call_w(__LINE__, _c, c7f, c7f)
|
||||
call_w(__LINE__, _c, c80, wc80)
|
||||
call_w(__LINE__, _c, c81, wc81)
|
||||
call_w(__LINE__, _uc, c7f, c7f)
|
||||
call_w(__LINE__, _uc, c80, c80)
|
||||
call_w(__LINE__, _uc, c81, c81)
|
||||
call_w(__LINE__, _s, s7f, s7f)
|
||||
call_w(__LINE__, _s, s80, ws80)
|
||||
call_w(__LINE__, _s, s81, ws81)
|
||||
call_w(__LINE__, _us, s7f, s7f)
|
||||
call_w(__LINE__, _us, s80, s80)
|
||||
call_w(__LINE__, _us, s81, s81)
|
||||
#if __WORDSIZE == 64
|
||||
call_w(__LINE__, _i, i7f, i7f)
|
||||
call_w(__LINE__, _i, i80, wi80)
|
||||
call_w(__LINE__, _i, i81, wi81)
|
||||
call_w(__LINE__, _ui, i7f, i7f)
|
||||
call_w(__LINE__, _ui, i80, i80)
|
||||
call_w(__LINE__, _ui, i81, i81)
|
||||
#endif
|
||||
call_wf(__LINE__, _f, c7f, f7f)
|
||||
call_wf(__LINE__, _f, wc80, f80)
|
||||
call_wf(__LINE__, _f, wc81, f81)
|
||||
call_wf(__LINE__, _d, c7f, f7f)
|
||||
call_wf(__LINE__, _d, wc80, f80)
|
||||
call_wf(__LINE__, _d, wc81, f81)
|
||||
call_fi(__LINE__, _f, _c, c7f, f7f)
|
||||
call_fi(__LINE__, _f, _c, c80, f80)
|
||||
call_fi(__LINE__, _f, _uc, c7f, f7f)
|
||||
call_fi(__LINE__, _f, _uc, c80, uf80)
|
||||
call_fi(__LINE__, _f, _s, c7f, f7f)
|
||||
call_fi(__LINE__, _f, _s, c80, uf80)
|
||||
call_fi(__LINE__, _f, _us, c7f, f7f)
|
||||
call_fi(__LINE__, _f, _us, c80, uf80)
|
||||
call_fi(__LINE__, _f, _i, c7f, f7f)
|
||||
call_fi(__LINE__, _f, _i, c80, uf80)
|
||||
#if __WORDSIZE == 64
|
||||
call_fi(__LINE__, _f, _ui, c7f, f7f)
|
||||
call_fi(__LINE__, _f, _ui, c80, uf80)
|
||||
call_fi(__LINE__, _f, _l, c7f, f7f)
|
||||
call_fi(__LINE__, _f, _l, c80, uf80)
|
||||
#endif
|
||||
call_fi(__LINE__, _d, _c, c7f, f7f)
|
||||
call_fi(__LINE__, _d, _c, c80, f80)
|
||||
call_fi(__LINE__, _d, _uc, c7f, f7f)
|
||||
call_fi(__LINE__, _d, _uc, c80, uf80)
|
||||
call_fi(__LINE__, _d, _s, c7f, f7f)
|
||||
call_fi(__LINE__, _d, _s, c80, uf80)
|
||||
call_fi(__LINE__, _d, _us, c7f, f7f)
|
||||
call_fi(__LINE__, _d, _us, c80, uf80)
|
||||
call_fi(__LINE__, _d, _i, c7f, f7f)
|
||||
call_fi(__LINE__, _d, _i, c80, uf80)
|
||||
#if __WORDSIZE == 64
|
||||
call_fi(__LINE__, _d, _ui, c7f, f7f)
|
||||
call_fi(__LINE__, _d, _ui, c80, uf80)
|
||||
call_fi(__LINE__, _d, _l, c7f, f7f)
|
||||
call_fi(__LINE__, _d, _l, c80, uf80)
|
||||
#endif
|
||||
call_f(__LINE__, _f, f7f, f7f)
|
||||
call_f(__LINE__, _d, f7f, f7f)
|
||||
call_ff(__LINE__, _f, _d, f80, f80)
|
||||
call_ff(__LINE__, _d, _f, f81, f81)
|
||||
|
||||
movi %r0 forward
|
||||
callr %r0
|
||||
|
||||
calli iforward
|
||||
|
||||
ret
|
||||
epilog
|
||||
|
||||
backward:
|
||||
prolog
|
||||
prepare
|
||||
pushargi bstr
|
||||
finishi @puts
|
||||
ret
|
||||
epilog
|
||||
|
||||
forward:
|
||||
prolog
|
||||
prepare
|
||||
pushargi fstr
|
||||
finishi @puts
|
||||
movi %r0 backward
|
||||
callr %r0
|
||||
ret
|
||||
epilog
|
||||
|
||||
iforward:
|
||||
prolog
|
||||
prepare
|
||||
pushargi fstr
|
||||
finishi @puts
|
||||
calli backward
|
||||
ret
|
||||
epilog
|
|
@ -1291,8 +1291,11 @@ movi(void)
|
|||
default:
|
||||
ungetch(ch);
|
||||
label = get_label(skip_none);
|
||||
if (label->kind == label_kind_code_forward)
|
||||
if (label->kind == label_kind_code ||
|
||||
label->kind == label_kind_code_forward) {
|
||||
mov_forward((void *)jit_movi(r0, 0), label);
|
||||
return;
|
||||
}
|
||||
value = label->value;
|
||||
break;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue