diff options
author | Quentin Carbonneaux <quentin.carbonneaux@yale.edu> | 2016-03-17 13:41:12 -0400 |
---|---|---|
committer | Quentin Carbonneaux <quentin.carbonneaux@yale.edu> | 2016-03-17 13:41:12 -0400 |
commit | 240cfcd5cdda9301457867f9d26edcd0cf272b24 (patch) | |
tree | 83cf01d43ad41163c96c34f16f2d24a4e8f9eff9 /lisc/test | |
parent | 2889d44f24d8017f527f6f5aa1163065cc57e994 (diff) | |
download | roux-240cfcd5cdda9301457867f9d26edcd0cf272b24.tar.gz |
support return of structs
Diffstat (limited to 'lisc/test')
-rw-r--r-- | lisc/test/abi4.ssa | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/lisc/test/abi4.ssa b/lisc/test/abi4.ssa new file mode 100644 index 0000000..4c3d89b --- /dev/null +++ b/lisc/test/abi4.ssa @@ -0,0 +1,38 @@ +# return a large struct to C + +type :mem = { b 17 } + +function $alpha(l %p, w %l, l %n) { +@ini + %pe =l add %p, %n +@lop + %p1 =l phi @ini %p, @lop %p2 + %l1 =w phi @ini %l, @lop %l2 + storeb %l1, %p1 + %p2 =l add %p1, 1 + %l2 =w add %l1, 1 + %c1 =w ceql %p1, %pe + jnz %c1, @end, @lop +@end + storeb 0, %pe + ret +} + +function :mem $test() { +@start + %p =l alloc4 17 + %r0 =w call $alpha(l %p, w 65, l 16) + ret %p +} + + +# >>> driver +# #include <stdio.h> +# typedef struct { char t[17]; } mem; +# extern mem test(void); +# int main() { mem m = test(); printf("%s\n", m.t); return 0; } +# <<< + +# >>> output +# ABCDEFGHIJKLMNOP +# <<< |