aboutsummaryrefslogtreecommitdiff
path: root/deps/lightening/tests/z_call.c
diff options
context:
space:
mode:
Diffstat (limited to 'deps/lightening/tests/z_call.c')
-rw-r--r--deps/lightening/tests/z_call.c307
1 files changed, 307 insertions, 0 deletions
diff --git a/deps/lightening/tests/z_call.c b/deps/lightening/tests/z_call.c
new file mode 100644
index 0000000..be1c072
--- /dev/null
+++ b/deps/lightening/tests/z_call.c
@@ -0,0 +1,307 @@
+#include "test.h"
+
+#define operand_c JIT_OPERAND_ABI_INT8
+#define operand_s JIT_OPERAND_ABI_INT16
+#define operand_i JIT_OPERAND_ABI_INT32
+#define operand_uc JIT_OPERAND_ABI_UINT8
+#define operand_us JIT_OPERAND_ABI_UINT16
+#define operand_ui JIT_OPERAND_ABI_UINT32
+#define operand_l JIT_OPERAND_ABI_INT64
+#define operand_f JIT_OPERAND_ABI_FLOAT
+#define operand_d JIT_OPERAND_ABI_DOUBLE
+
+#define def_wi(i) \
+ void *_w##i = jit_address(_jit); \
+{ \
+ size_t frame = jit_enter_jit_abi(_jit, 0, 0, 0); \
+ jit_load_args_1(_jit, jit_operand_gpr(operand##i, JIT_R0)); \
+ jit_leave_jit_abi(_jit, 0, 0, frame); \
+ jit_retr(_jit, JIT_R0); \
+}
+
+#define def_wf(f) \
+ void *_w##f = jit_address(_jit); \
+{ \
+ size_t frame = jit_enter_jit_abi(_jit, 0, 0, 0); \
+ jit_load_args_1(_jit, jit_operand_fpr(operand##f, JIT_F0)); \
+ jit_truncr##f(_jit, JIT_R0, JIT_F0); \
+ jit_leave_jit_abi(_jit, 0, 0, frame); \
+ jit_retr(_jit, JIT_R0); \
+}
+
+#define def_fi(f, i) \
+ void *f##i = jit_address(_jit); \
+{ \
+ size_t frame = jit_enter_jit_abi(_jit, 0, 0, 0); \
+ jit_load_args_1(_jit, jit_operand_gpr(operand##i, JIT_R0)); \
+ jit_extr##f(_jit, JIT_F0, JIT_R0); \
+ jit_leave_jit_abi(_jit, 0, 0, frame); \
+ jit_retr##f(_jit, JIT_F0); \
+}
+
+#define def_f(f) \
+ void *f##f = jit_address(_jit); \
+{ \
+ size_t frame = jit_enter_jit_abi(_jit, 0, 0, 0); \
+ jit_load_args_1(_jit, jit_operand_fpr(operand##f, JIT_F0)); \
+ jit_leave_jit_abi(_jit, 0, 0, frame); \
+ jit_retr##f(_jit, JIT_F0); \
+}
+
+#define def_ff(f, g) \
+ void *f##g = jit_address(_jit); \
+{ \
+ size_t frame = jit_enter_jit_abi(_jit, 0, 0, 0); \
+ jit_load_args_1(_jit, jit_operand_fpr(operand##f, JIT_F0)); \
+ jit_extr##f##g(_jit, JIT_F0, JIT_F0); \
+ jit_leave_jit_abi(_jit, 0, 0, frame); \
+ jit_retr##g(_jit, JIT_F0); \
+}
+
+#if defined(DEBUG)
+#define dump_args(n, f, i, a, r) \
+ jit_calli_1(_jit, puts, \
+ jit_operand_imm(JIT_OPERAND_ABI_POINTER, \
+ (jit_imm_t)#n " " #f " " #i " " #a " " #r))
+#else
+#define dump_args(n, f, i, a, r)
+#endif
+
+#define _call_w(n, i, a, r) \
+{ \
+ dump_args(n, , i, a, r); \
+ jit_calli_1(_jit, _w##i, jit_operand_imm(operand##i, a)); \
+ jit_retval(_jit, JIT_R0); \
+ jit_extr##i(_jit, JIT_R0, JIT_R0); \
+ jit_reloc_t ok = jit_beqi(_jit, JIT_R0, r); \
+ jit_calli_0(_jit, abort); \
+ jit_patch_here(_jit, ok); \
+}
+#define call_w(n, i, a, r) _call_w(n, i, a, r)
+
+#define _call_wf(n, f, a, r) \
+{ \
+ dump_args(n, f, , a, r); \
+ jit_movi##f(_jit, JIT_F0, (long long)a); \
+ jit_calli_1(_jit, _w##f, jit_operand_fpr(operand##f, JIT_F0)); \
+ jit_retval(_jit, JIT_R0); \
+ jit_extr##f(_jit, JIT_F0, JIT_R0); \
+ jit_movi##f(_jit, JIT_F1, r); \
+ jit_reloc_t ok = jit_beqr##f(_jit, JIT_F0, JIT_F1); \
+ jit_calli_0(_jit, abort); \
+ jit_patch_here(_jit, ok); \
+}
+#define call_wf(n, f, a, r) _call_wf(n, f, a, r)
+
+#define _call_fi(n, f, i, a, r) \
+{ \
+ dump_args(n, f, i, a, r); \
+ jit_calli_1(_jit, f##i, jit_operand_imm(operand##i, a)); \
+ jit_retval##f(_jit, JIT_F0); \
+ jit_movi##f(_jit, JIT_F1, r); \
+ jit_reloc_t ok = jit_beqr##f(_jit, JIT_F0, JIT_F1); \
+ jit_calli_0(_jit, abort); \
+ jit_patch_here(_jit, ok); \
+}
+#define call_fi(n, f, i, a, r) _call_fi(n, f, i, a, r)
+
+#define _call_f(n, f, a, r) \
+{ \
+ dump_args(n, f, , a, r); \
+ jit_movi##f(_jit, JIT_F0, a); \
+ jit_calli_1(_jit, f##f, jit_operand_fpr(operand##f, JIT_F0)); \
+ jit_retval##f(_jit, JIT_F0); \
+ jit_movi##f(_jit, JIT_F1, r); \
+ jit_reloc_t ok = jit_beqr##f(_jit, JIT_F0, JIT_F1); \
+ jit_calli_0(_jit, abort); \
+ jit_patch_here(_jit, ok); \
+}
+#define call_f(n, f, a, r) _call_f(n, f, a, r)
+
+#define _call_ff(n, f, g, a, r) \
+{ \
+ dump_args(n, f, g, a, r); \
+ jit_movi##f(_jit, JIT_F0, a); \
+ jit_calli_1(_jit, f##g, jit_operand_fpr(operand##f, JIT_F0)); \
+ jit_retval##g(_jit, JIT_F0); \
+ jit_movi##g(_jit, JIT_F1, r); \
+ jit_reloc_t ok = jit_beqr##g(_jit, JIT_F0, JIT_F1); \
+ jit_calli_0(_jit, abort); \
+ jit_patch_here(_jit, ok); \
+}
+#define call_ff(n, f, g, a, r) _call_ff(n, f, g, a, r)
+
+#define c7f (int8_t)0x7f
+#define c80 (int8_t)0x80
+#define c81 (int8_t)0x81
+#define cff (int8_t)0xff
+#define s7f (int16_t)0x7fff
+#define s80 (int16_t)0x8000
+#define s81 (int16_t)0x8001
+#define i7f (int32_t)0x7fffffff
+#define i80 (int32_t)0x80000000
+#define i81 (int32_t)0x80000001
+#define iff (int32_t)0xffffffff
+#define l7f (int64_t)0x7fffffffffffffff
+#define l80 (int64_t)0x8000000000000000
+#define l81 (int64_t)0x8000000000000001
+
+#define uc7f (uint8_t)0x7f
+#define uc80 (uint8_t)0x80
+#define uc81 (uint8_t)0x81
+#define ucff (uint8_t)0xff
+#define us7f (uint16_t)0x7fff
+#define us80 (uint16_t)0x8000
+#define us81 (uint16_t)0x8001
+#define ui7f (uint32_t)0x7fffffff
+#define ui80 (uint32_t)0x80000000
+#define ui81 (uint32_t)0x80000001
+#define uiff (uint32_t)0xffffffff
+#define ul7f (uint64_t)0x7fffffffffffffff
+#define ul80 (uint64_t)0x8000000000000000
+#define ul81 (uint64_t)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 (long)0xffffff80
+# define wc81 (long)0xffffff81
+# define ws80 (long)0xffff8000
+# define ws81 (long)0xffff8001
+#else
+# define wc80 (long)0xffffffffffffff80
+# define wc81 (long)0xffffffffffffff81
+# define ws80 (long)0xffffffffffff8000
+# define ws81 (long)0xffffffffffff8001
+# define wi80 (long)0xffffffff80000000
+# define wi81 (long)0xffffffff80000001
+#endif
+
+static size_t
+run_test(jit_state_t *_jit, uint8_t *arena_base, size_t arena_size)
+{
+ void (*function)();
+ jit_begin(_jit, arena_base, arena_size);
+ jit_reloc_t main = jit_jmp(_jit);
+
+ 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)
+
+ jit_patch_here(_jit, main);
+ size_t frame = jit_enter_jit_abi(_jit, 0, 0, 0);
+
+ call_w(__LINE__, _c, c7f, c7f)
+ call_w(__LINE__, _c, c80, wc80)
+ call_w(__LINE__, _c, c81, wc81)
+ call_w(__LINE__, _uc, uc7f, c7f)
+ call_w(__LINE__, _uc, uc80, uc80)
+ call_w(__LINE__, _uc, uc81, uc81)
+ call_w(__LINE__, _s, s7f, s7f)
+ call_w(__LINE__, _s, s80, ws80)
+ call_w(__LINE__, _s, s81, ws81)
+ call_w(__LINE__, _us, us7f, us7f)
+ call_w(__LINE__, _us, us80, us80)
+ call_w(__LINE__, _us, us81, us81)
+#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, ui7f, ui7f)
+ call_w(__LINE__, _ui, ui80, ui80)
+ call_w(__LINE__, _ui, ui81, ui81)
+#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, uc7f, f7f)
+ call_fi(__LINE__, _f, _uc, uc80, uf80)
+ call_fi(__LINE__, _f, _s, c7f, f7f)
+ call_fi(__LINE__, _f, _s, uc80, uf80)
+ call_fi(__LINE__, _f, _us, uc7f, f7f)
+ call_fi(__LINE__, _f, _us, uc80, uf80)
+ call_fi(__LINE__, _f, _i, c7f, f7f)
+ call_fi(__LINE__, _f, _i, uc80, uf80)
+#if __WORDSIZE == 64
+ call_fi(__LINE__, _f, _ui, uc7f, f7f)
+ call_fi(__LINE__, _f, _ui, uc80, uf80)
+ call_fi(__LINE__, _f, _l, c7f, f7f)
+ call_fi(__LINE__, _f, _l, uc80, uf80)
+#endif
+ call_fi(__LINE__, _d, _c, c7f, f7f)
+ call_fi(__LINE__, _d, _c, c80, f80)
+ call_fi(__LINE__, _d, _uc, uc7f, f7f)
+ call_fi(__LINE__, _d, _uc, uc80, uf80)
+ call_fi(__LINE__, _d, _s, c7f, f7f)
+ call_fi(__LINE__, _d, _s, uc80, uf80)
+ call_fi(__LINE__, _d, _us, uc7f, f7f)
+ call_fi(__LINE__, _d, _us, uc80, uf80)
+ call_fi(__LINE__, _d, _i, c7f, f7f)
+ call_fi(__LINE__, _d, _i, uc80, uf80)
+#if __WORDSIZE == 64
+ call_fi(__LINE__, _d, _ui, uc7f, f7f)
+ call_fi(__LINE__, _d, _ui, uc80, uf80)
+ call_fi(__LINE__, _d, _l, c7f, f7f)
+ call_fi(__LINE__, _d, _l, uc80, 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)
+
+ jit_leave_jit_abi(_jit, 0, 0, frame);
+ jit_ret(_jit);
+
+ size_t size = 0;
+ function = jit_end(_jit, &size);
+
+ if (function)
+ (*function)();
+ else
+ return size;
+
+ return 0;
+}
+
+int main(int argc, char *argv[])
+{
+ return main_compiler(argc, argv, run_test);
+}