diff options
author | Quentin Carbonneaux <quentin.carbonneaux@yale.edu> | 2016-03-07 11:54:10 -0500 |
---|---|---|
committer | Quentin Carbonneaux <quentin.carbonneaux@yale.edu> | 2016-03-07 11:54:10 -0500 |
commit | a7ba1c3d2ed3d7b00e6a41331a9c28325db451e9 (patch) | |
tree | 6a5ab018a1b9f347e87e9001879a3ad5867559f6 | |
parent | 6deb301f3eeec3061da7fb72996023187b98463f (diff) | |
download | roux-a7ba1c3d2ed3d7b00e6a41331a9c28325db451e9.tar.gz |
complete abi3 test (fails)
-rw-r--r-- | lisc/test/abi3.ssa | 42 |
1 files changed, 27 insertions, 15 deletions
diff --git a/lisc/test/abi3.ssa b/lisc/test/abi3.ssa index 0755783..37abb06 100644 --- a/lisc/test/abi3.ssa +++ b/lisc/test/abi3.ssa @@ -1,26 +1,20 @@ - -# l is for long word (64bits) -# w is for word (32bits) -# h is for half word (16bits) -# b is for byte (8bits) - type :four = {l, b, w} +data $a = { w 0 } + function $test() { @start - %y =w copy 0 + %a =w loadw $a + %y =w add %a, %a %s =l alloc8 16 # allocate a :four struct %s1 =l add %s, 12 # get address of the w - storel 3, %s # set the l - storew 4, %s1 # set the w + storel 4, %s # set the l + storew 5, %s1 # set the w - # function call with the above :four - # struct as first argument and 5 int - # arguments - - %f =l copy $F - %x =w call %f(w %y, w 1, w 2, :four %s, w 5, w 6) + # only the last argument should be on the stack + %f =l add $F, 0 + %x =w call %f(w %y, w 1, w 2, w 3, :four %s, w 6) # store the result in the # global variable a @@ -29,3 +23,21 @@ function $test() { storew %x1, $a ret } + +# >>> driver +# #include <stdio.h> +# struct four { long l; char c; int i; }; +# extern void test(void); +# int F(int a0, int a1, int a2, int a3, struct four s, int a6) { +# printf("%d %d %d %d %d %d %d\n", +# a0, a1, a2, a3, (int)s.l, s.i, a6); +# return 42; +# } +# int a; +# int main() { test(); printf("%d\n", a); return 0; } +# <<< + +# >>> output +# 0 1 2 3 4 5 6 +# 42 +# <<< |