1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-08 02:40:17 +02:00
guile/check/cva_list.c
pcpa 0b6cc01eea Intermediate, fully functional, rework for variadic functions
* check/cva_list.c: New file implementing a test to ensure
	the value returned by jit_va_start is a valid C va_list.

	* check/va_list.ok: New simple helper file, as now the
	va_list.tst test is enabled.

	* check/va_list.tst: Rewritten for an extensive variadic
	jit functions test.

	* check/Makefile.am: Update for the new tests.

	* lib/jit_arm-cpu.c, lib/jit_arm-swf.c, lib/jit_arm-vfp.c,
	lib/jit_arm.c: Correct broken software float in a previous
	commit. Note that the hard float abi implementation is known
	broken at this time, for special cases involving variadic
	functions, and should be corrected next.

	lib/jit_x86-cpu.c, lib/jit_x86-sz.c, lib/jit_x86.c: Correct
	the jit_va_list_t semantics to match C va_list.
2015-05-25 15:20:24 -03:00

1187 lines
27 KiB
C

#include <lightning.h>
#include <stdarg.h>
#include <stdio.h>
#define W jit_word_t
#define D jit_float64_t
#define VASTART(A) \
va_list ap; \
va_start(ap, A)
#define VARG2() a2 = va_arg(ap, jit_word_t); VARG3()
#define VARG3() a3 = va_arg(ap, jit_word_t); VARG4()
#define VARG4() a4 = va_arg(ap, jit_word_t); VARG5()
#define VARG5() a5 = va_arg(ap, jit_word_t); VARG6()
#define VARG6() a6 = va_arg(ap, jit_word_t); VARG7()
#define VARG7() a7 = va_arg(ap, jit_word_t); VARG8()
#define VARG8() a8 = va_arg(ap, jit_word_t); VARG9()
#define VARG9() a9 = va_arg(ap, jit_word_t); VARG10()
#define VARG10() a10 = va_arg(ap, jit_word_t); va_end(ap)
#define VARGD2() a2 = va_arg(ap, jit_float64_t); VARGD3()
#define VARGD3() a3 = va_arg(ap, jit_float64_t); VARGD4()
#define VARGD4() a4 = va_arg(ap, jit_float64_t); VARGD5()
#define VARGD5() a5 = va_arg(ap, jit_float64_t); VARGD6()
#define VARGD6() a6 = va_arg(ap, jit_float64_t); VARGD7()
#define VARGD7() a7 = va_arg(ap, jit_float64_t); VARGD8()
#define VARGD8() a8 = va_arg(ap, jit_float64_t); VARGD9()
#define VARGD9() a9 = va_arg(ap, jit_float64_t); VARGD10()
#define VARGD10() a10 = va_arg(ap, jit_float64_t);va_end(ap)
#define IDVARG2() a2 = va_arg(ap, jit_float64_t); IDVARG3()
#define IDVARG3() a3 = va_arg(ap, jit_word_t); IDVARG4()
#define IDVARG4() a4 = va_arg(ap, jit_float64_t); IDVARG5()
#define IDVARG5() a5 = va_arg(ap, jit_word_t); IDVARG6()
#define IDVARG6() a6 = va_arg(ap, jit_float64_t); IDVARG7()
#define IDVARG7() a7 = va_arg(ap, jit_word_t); IDVARG8()
#define IDVARG8() a8 = va_arg(ap, jit_float64_t); IDVARG9()
#define IDVARG9() a9 = va_arg(ap, jit_word_t); IDVARG10()
#define IDVARG10() a10 = va_arg(ap, jit_float64_t);va_end(ap)
#define DIVARG2() a2 = va_arg(ap, jit_word_t); DIVARG3()
#define DIVARG3() a3 = va_arg(ap, jit_float64_t); DIVARG4()
#define DIVARG4() a4 = va_arg(ap, jit_word_t); DIVARG5()
#define DIVARG5() a5 = va_arg(ap, jit_float64_t); DIVARG6()
#define DIVARG6() a6 = va_arg(ap, jit_word_t); DIVARG7()
#define DIVARG7() a7 = va_arg(ap, jit_float64_t); DIVARG8()
#define DIVARG8() a8 = va_arg(ap, jit_word_t); DIVARG9()
#define DIVARG9() a9 = va_arg(ap, jit_float64_t); DIVARG10()
#define DIVARG10() a10 = va_arg(ap, jit_word_t); va_end(ap)
#define CHECK() \
do { \
if (a1 != 1 || a2 != 2 || a3 != 3 || a4 != 4 || a5 != 5 || \
a6 != 6 || a7 != 7 || a8 != 8 || a9 != 9 || a10 != 10) \
abort(); \
} while (0)
void i_iiiiiiiii(W a1, ...)
{
W a2, a3, a4, a5, a6, a7, a8, a9, a10;
VASTART(a1);
VARG2();
CHECK();
}
void ii_iiiiiiii(W a1, W a2, ...)
{
W a3, a4, a5, a6, a7, a8, a9, a10;
VASTART(a2);
VARG3();
CHECK();
}
void iii_iiiiiii(W a1, W a2, W a3, ...)
{
W a4, a5, a6, a7, a8, a9, a10;
VASTART(a3);
VARG4();
CHECK();
}
void iiii_iiiiii(W a1, W a2, W a3, W a4, ...)
{
W a5, a6, a7, a8, a9, a10;
VASTART(a4);
VARG5();
CHECK();
}
void iiiii_iiiii(W a1, W a2, W a3, W a4, W a5, ...)
{
W a6, a7, a8, a9, a10;
VASTART(a5);
VARG6();
CHECK();
}
void iiiiii_iiii(W a1, W a2, W a3, W a4, W a5, W a6, ...)
{
W a7, a8, a9, a10;
VASTART(a6);
VARG7();
CHECK();
}
void iiiiiii_iii(W a1, W a2, W a3, W a4, W a5, W a6, W a7, ...)
{
W a8, a9, a10;
VASTART(a7);
VARG8();
CHECK();
}
void iiiiiiii_ii(W a1, W a2, W a3, W a4, W a5, W a6, W a7, W a8, ...)
{
W a9, a10;
VASTART(a8);
VARG9();
CHECK();
}
void iiiiiiiii_i(W a1, W a2, W a3, W a4, W a5, W a6, W a7, W a8, W a9, ...)
{
W a10;
VASTART(a9);
VARG10();
CHECK();
}
void d_ddddddddd(D a1, ...)
{
D a2, a3, a4, a5, a6, a7, a8, a9, a10;
VASTART(a1);
VARGD2();
CHECK();
}
void dd_dddddddd(D a1, D a2, ...)
{
D a3, a4, a5, a6, a7, a8, a9, a10;
VASTART(a2);
VARGD3();
CHECK();
}
void ddd_ddddddd(D a1, D a2, D a3, ...)
{
D a4, a5, a6, a7, a8, a9, a10;
VASTART(a3);
VARGD4();
CHECK();
}
void dddd_dddddd(D a1, D a2, D a3, D a4, ...)
{
D a5, a6, a7, a8, a9, a10;
VASTART(a4);
VARGD5();
CHECK();
}
void ddddd_ddddd(D a1, D a2, D a3, D a4, D a5, ...)
{
D a6, a7, a8, a9, a10;
VASTART(a5);
VARGD6();
CHECK();
}
void dddddd_dddd(D a1, D a2, D a3, D a4, D a5, D a6, ...)
{
D a7, a8, a9, a10;
VASTART(a6);
VARGD7();
CHECK();
}
void ddddddd_ddd(D a1, D a2, D a3, D a4, D a5, D a6, D a7, ...)
{
D a8, a9, a10;
VASTART(a7);
VARGD8();
CHECK();
}
void dddddddd_dd(D a1, D a2, D a3, D a4, D a5, D a6, D a7, D a8, ...)
{
D a9, a10;
VASTART(a8);
VARGD9();
CHECK();
}
void ddddddddd_d(D a1, D a2, D a3, D a4, D a5, D a6, D a7, D a8, D a9, ...)
{
D a10;
VASTART(a9);
VARGD10();
CHECK();
}
void i_didididid(W a1, ...)
{
W a3, a5, a7, a9;
D a2, a4, a6, a8, a10;
VASTART(a1);
IDVARG2();
CHECK();
}
void id_idididid(W a1, D a2, ...)
{
W a3, a5, a7, a9;
D a4, a6, a8, a10;
VASTART(a2);
IDVARG3();
CHECK();
}
void idi_dididid(W a1, D a2, W a3, ...)
{
W a5, a7, a9;
D a4, a6, a8, a10;
VASTART(a3);
IDVARG4();
CHECK();
}
void idid_ididid(W a1, D a2, W a3, D a4, ...)
{
W a5, a7, a9;
D a6, a8, a10;
VASTART(a4);
IDVARG5();
CHECK();
}
void ididi_didid(W a1, D a2, W a3, D a4, W a5, ...)
{
W a7, a9;
D a6, a8, a10;
VASTART(a5);
IDVARG6();
CHECK();
}
void ididid_idid(W a1, D a2, W a3, D a4, W a5, D a6, ...)
{
W a7, a9;
D a8, a10;
VASTART(a6);
IDVARG7();
CHECK();
}
void idididi_did(W a1, D a2, W a3, D a4, W a5, D a6, W a7, ...)
{
W a9;
D a8, a10;
VASTART(a7);
IDVARG8();
CHECK();
}
void idididid_id(W a1, D a2, W a3, D a4, W a5, D a6, W a7, D a8, ...)
{
W a9;
D a10;
VASTART(a8);
IDVARG9();
CHECK();
}
void ididididi_d(W a1, D a2, W a3, D a4, W a5, D a6, W a7, D a8, W a9, ...)
{
D a10;
VASTART(a9);
IDVARG10();
CHECK();
}
void d_ididididi(D a1, ...)
{
W a2, a4, a6, a8, a10;
D a3, a5, a7, a9;
VASTART(a1);
DIVARG2();
CHECK();
}
void di_didididi(D a1, W a2, ...)
{
W a4, a6, a8, a10;
D a3, a5, a7, a9;
VASTART(a2);
DIVARG3();
CHECK();
}
void did_idididi(D a1, W a2, D a3, ...)
{
W a4, a6, a8, a10;
D a5, a7, a9;
VASTART(a3);
DIVARG4();
CHECK();
}
void didi_dididi(D a1, W a2, D a3, W a4, ...)
{
W a6, a8, a10;
D a5, a7, a9;
VASTART(a4);
DIVARG5();
CHECK();
}
void didid_ididi(D a1, W a2, D a3, W a4, D a5, ...)
{
W a6, a8, a10;
D a7, a9;
VASTART(a5);
DIVARG6();
CHECK();
}
void dididi_didi(D a1, W a2, D a3, W a4, D a5, W a6, ...)
{
W a8, a10;
D a7, a9;
VASTART(a6);
DIVARG7();
CHECK();
}
void dididid_idi(D a1, W a2, D a3, W a4, D a5, W a6, D a7, ...)
{
W a8, a10;
D a9;
VASTART(a7);
DIVARG8();
CHECK();
}
void didididi_di(D a1, W a2, D a3, W a4, D a5, W a6, D a7, W a8, ...)
{
W a10;
D a9;
VASTART(a8);
DIVARG9();
CHECK();
}
void didididid_i(D a1, W a2, D a3, W a4, D a5, W a6, D a7, W a8, D a9, ...)
{
W a10;
VASTART(a9);
DIVARG10();
CHECK();
}
void va_i_iiiiiiiii(W a1, va_list ap)
{
W a2, a3, a4, a5, a6, a7, a8, a9, a10;
VARG2();
CHECK();
}
void va_ii_iiiiiiii(W a1, W a2, va_list ap)
{
W a3, a4, a5, a6, a7, a8, a9, a10;
VARG3();
CHECK();
}
void va_iii_iiiiiii(W a1, W a2, W a3, va_list ap)
{
W a4, a5, a6, a7, a8, a9, a10;
VARG4();
CHECK();
}
void va_iiii_iiiiii(W a1, W a2, W a3, W a4, va_list ap)
{
W a5, a6, a7, a8, a9, a10;
VARG5();
CHECK();
}
void va_d_ddddddddd(D a1, va_list ap)
{
D a2, a3, a4, a5, a6, a7, a8, a9, a10;
VARGD2();
CHECK();
}
void va_dd_dddddddd(D a1, D a2, va_list ap)
{
D a3, a4, a5, a6, a7, a8, a9, a10;
VARGD3();
CHECK();
}
void va_ddd_ddddddd(D a1, D a2, D a3, va_list ap)
{
D a4, a5, a6, a7, a8, a9, a10;
VARGD4();
CHECK();
}
void va_dddd_dddddd(D a1, D a2, D a3, D a4, va_list ap)
{
D a5, a6, a7, a8, a9, a10;
VARGD5();
CHECK();
}
void va_i_didididid(W a1, va_list ap)
{
W a3, a5, a7, a9;
D a2, a4, a6, a8, a10;
IDVARG2();
CHECK();
}
void va_id_idididid(W a1, D a2, va_list ap)
{
W a3, a5, a7, a9;
D a4, a6, a8, a10;
IDVARG3();
CHECK();
}
void va_idi_dididid(W a1, D a2, W a3, va_list ap)
{
W a5, a7, a9;
D a4, a6, a8, a10;
IDVARG4();
CHECK();
}
void va_idid_ididid(W a1, D a2, W a3, D a4, va_list ap)
{
W a5, a7, a9;
D a6, a8, a10;
IDVARG5();
CHECK();
}
void va_d_ididididi(D a1, va_list ap)
{
W a2, a4, a6, a8, a10;
D a3, a5, a7, a9;
DIVARG2();
CHECK();
}
void va_di_didididi(D a1, W a2, va_list ap)
{
W a4, a6, a8, a10;
D a3, a5, a7, a9;
DIVARG3();
CHECK();
}
void va_did_idididi(D a1, W a2, D a3, va_list ap)
{
W a4, a6, a8, a10;
D a5, a7, a9;
DIVARG4();
CHECK();
}
void va_didi_dididi(D a1, W a2, D a3, W a4, va_list ap)
{
W a6, a8, a10;
D a5, a7, a9;
DIVARG5();
CHECK();
}
#define PUSH1() jit_pushargi(1)
#define PUSH2() PUSH1(); jit_pushargi(2)
#define PUSH3() PUSH2(); jit_pushargi(3)
#define PUSH4() PUSH3(); jit_pushargi(4)
#define PUSH5() PUSH4(); jit_pushargi(5)
#define PUSH6() PUSH5(); jit_pushargi(6)
#define PUSH7() PUSH6(); jit_pushargi(7)
#define PUSH8() PUSH7(); jit_pushargi(8)
#define PUSH9() PUSH8(); jit_pushargi(9)
#define VPUSH2() jit_pushargi(2); VPUSH3()
#define VPUSH3() jit_pushargi(3); VPUSH4()
#define VPUSH4() jit_pushargi(4); VPUSH5()
#define VPUSH5() jit_pushargi(5); VPUSH6()
#define VPUSH6() jit_pushargi(6); VPUSH7()
#define VPUSH7() jit_pushargi(7); VPUSH8()
#define VPUSH8() jit_pushargi(8); VPUSH9()
#define VPUSH9() jit_pushargi(9); VPUSH10()
#define VPUSH10() jit_pushargi(10);
#define PUSHD1() jit_pushargi_d(1)
#define PUSHD2() PUSHD1(); jit_pushargi_d(2)
#define PUSHD3() PUSHD2(); jit_pushargi_d(3)
#define PUSHD4() PUSHD3(); jit_pushargi_d(4)
#define PUSHD5() PUSHD4(); jit_pushargi_d(5)
#define PUSHD6() PUSHD5(); jit_pushargi_d(6)
#define PUSHD7() PUSHD6(); jit_pushargi_d(7)
#define PUSHD8() PUSHD7(); jit_pushargi_d(8)
#define PUSHD9() PUSHD8(); jit_pushargi_d(9)
#define VPUSHD2() jit_pushargi_d(2); VPUSHD3()
#define VPUSHD3() jit_pushargi_d(3); VPUSHD4()
#define VPUSHD4() jit_pushargi_d(4); VPUSHD5()
#define VPUSHD5() jit_pushargi_d(5); VPUSHD6()
#define VPUSHD6() jit_pushargi_d(6); VPUSHD7()
#define VPUSHD7() jit_pushargi_d(7); VPUSHD8()
#define VPUSHD8() jit_pushargi_d(8); VPUSHD9()
#define VPUSHD9() jit_pushargi_d(9); VPUSHD10()
#define VPUSHD10() jit_pushargi_d(10);
#define IDPUSH1() jit_pushargi(1)
#define IDPUSH2() IDPUSH1(); jit_pushargi_d(2)
#define IDPUSH3() IDPUSH2(); jit_pushargi(3)
#define IDPUSH4() IDPUSH3(); jit_pushargi_d(4)
#define IDPUSH5() IDPUSH4(); jit_pushargi(5)
#define IDPUSH6() IDPUSH5(); jit_pushargi_d(6)
#define IDPUSH7() IDPUSH6(); jit_pushargi(7)
#define IDPUSH8() IDPUSH7(); jit_pushargi_d(8)
#define IDPUSH9() IDPUSH8(); jit_pushargi(9)
#define IDVPUSH2() jit_pushargi_d(2); IDVPUSH3()
#define IDVPUSH3() jit_pushargi(3); IDVPUSH4()
#define IDVPUSH4() jit_pushargi_d(4); IDVPUSH5()
#define IDVPUSH5() jit_pushargi(5); IDVPUSH6()
#define IDVPUSH6() jit_pushargi_d(6); IDVPUSH7()
#define IDVPUSH7() jit_pushargi(7); IDVPUSH8()
#define IDVPUSH8() jit_pushargi_d(8); IDVPUSH9()
#define IDVPUSH9() jit_pushargi(9); IDVPUSH10()
#define IDVPUSH10() jit_pushargi_d(10);
#define DIPUSH1() jit_pushargi_d(1)
#define DIPUSH2() DIPUSH1(); jit_pushargi(2)
#define DIPUSH3() DIPUSH2(); jit_pushargi_d(3)
#define DIPUSH4() DIPUSH3(); jit_pushargi(4)
#define DIPUSH5() DIPUSH4(); jit_pushargi_d(5)
#define DIPUSH6() DIPUSH5(); jit_pushargi(6)
#define DIPUSH7() DIPUSH6(); jit_pushargi_d(7)
#define DIPUSH8() DIPUSH7(); jit_pushargi(8)
#define DIPUSH9() DIPUSH8(); jit_pushargi_d(9)
#define DIVPUSH2() jit_pushargi(2); DIVPUSH3()
#define DIVPUSH3() jit_pushargi_d(3); DIVPUSH4()
#define DIVPUSH4() jit_pushargi(4); DIVPUSH5()
#define DIVPUSH5() jit_pushargi_d(5); DIVPUSH6()
#define DIVPUSH6() jit_pushargi(6); DIVPUSH7()
#define DIVPUSH7() jit_pushargi_d(7); DIVPUSH8()
#define DIVPUSH8() jit_pushargi(8); DIVPUSH9()
#define DIVPUSH9() jit_pushargi_d(9); DIVPUSH10()
#define DIVPUSH10() jit_pushargi(10);
jit_state_t *_jit;
int main(int argc, char *argv[])
{
void (*function)(void);
jit_node_t *jmpi_main;
jit_node_t *a1, *a2, *node;
jit_node_t *jva_i_iiiiiiiii, *jva_ii_iiiiiiii;
jit_node_t *jva_d_ddddddddd, *jva_dd_dddddddd;
jit_node_t *jva_i_didididid, *jva_id_idididid;
jit_node_t *jva_d_ididididi, *jva_di_didididi;
jit_node_t *jva_iii_iiiiiii, *jva_iiii_iiiiii;
jit_node_t *jva_ddd_ddddddd, *jva_dddd_dddddd;
jit_node_t *jva_idi_dididid, *jva_idid_ididid;
jit_node_t *jva_did_idididi, *jva_didi_dididi;
init_jit(argv[0]);
_jit = jit_new_state();
jmpi_main = jit_jmpi();
/* Define simple functions to validate a jit_va_list_t
* is a valid va_list; these do not fetch arguments from
* the va_list. */
jva_i_iiiiiiiii = jit_label();
jit_name("va_i_iiiiiiiii");
jit_prolog();
a1 = jit_arg();
jit_getarg(JIT_V1, a1);
jit_ellipsis();
jit_va_start(JIT_V0);
jit_prepare();
jit_pushargr(JIT_V1);
jit_pushargr(JIT_V0);
jit_finishi(va_i_iiiiiiiii);
jit_va_end(JIT_V0);
jit_ret();
jit_epilog();
jva_ii_iiiiiiii = jit_label();
jit_name("va_ii_iiiiiiii");
jit_prolog();
a1 = jit_arg();
a2 = jit_arg();
jit_getarg(JIT_V1, a1);
jit_getarg(JIT_V2, a2);
jit_ellipsis();
jit_va_start(JIT_V0);
jit_prepare();
jit_pushargr(JIT_V1);
jit_pushargr(JIT_V2);
jit_pushargr(JIT_V0);
jit_finishi(va_ii_iiiiiiii);
jit_va_end(JIT_V0);
jit_ret();
jit_epilog();
jva_d_ddddddddd = jit_label();
jit_name("va_d_ddddddddd");
jit_prolog();
a1 = jit_arg_d();
jit_getarg_d(JIT_F3, a1);
jit_ellipsis();
jit_va_start(JIT_V0);
jit_prepare();
jit_pushargr_d(JIT_F3);
jit_pushargr(JIT_V0);
jit_finishi(va_d_ddddddddd);
jit_va_end(JIT_V0);
jit_ret();
jit_epilog();
jva_dd_dddddddd = jit_label();
jit_name("va_dd_dddddddd");
jit_prolog();
a1 = jit_arg_d();
a2 = jit_arg_d();
jit_getarg_d(JIT_F3, a1);
jit_getarg_d(JIT_F4, a2);
jit_ellipsis();
jit_va_start(JIT_V0);
jit_prepare();
jit_pushargr_d(JIT_F3);
jit_pushargr_d(JIT_F4);
jit_pushargr(JIT_V0);
jit_finishi(va_dd_dddddddd);
jit_va_end(JIT_V0);
jit_ret();
jit_epilog();
jva_i_didididid = jit_label();
jit_name("va_i_didididid");
jit_prolog();
a1 = jit_arg();
jit_getarg(JIT_V1, a1);
jit_ellipsis();
jit_va_start(JIT_V0);
jit_prepare();
jit_pushargr(JIT_V1);
jit_pushargr(JIT_V0);
jit_finishi(va_i_didididid);
jit_va_end(JIT_V0);
jit_ret();
jit_epilog();
jva_id_idididid = jit_label();
jit_name("va_id_idididid");
jit_prolog();
a1 = jit_arg();
a2 = jit_arg_d();
jit_getarg(JIT_V1, a1);
jit_getarg_d(JIT_F3, a2);
jit_ellipsis();
jit_va_start(JIT_V0);
jit_prepare();
jit_pushargr(JIT_V1);
jit_pushargr_d(JIT_F3);
jit_pushargr(JIT_V0);
jit_finishi(va_id_idididid);
jit_va_end(JIT_V0);
jit_ret();
jit_epilog();
jva_d_ididididi = jit_label();
jit_name("va_d_ididididi");
jit_prolog();
a1 = jit_arg_d();
jit_getarg_d(JIT_F3, a1);
jit_ellipsis();
jit_va_start(JIT_V0);
jit_prepare();
jit_pushargr_d(JIT_F3);
jit_pushargr(JIT_V0);
jit_finishi(va_d_ididididi);
jit_va_end(JIT_V0);
jit_ret();
jit_epilog();
jva_di_didididi = jit_label();
jit_name("va_di_didididi");
jit_prolog();
a1 = jit_arg_d();
a2 = jit_arg();
jit_getarg_d(JIT_F3, a1);
jit_getarg(JIT_V1, a2);
jit_ellipsis();
jit_va_start(JIT_V0);
jit_prepare();
jit_pushargr_d(JIT_F3);
jit_pushargr(JIT_V1);
jit_pushargr(JIT_V0);
jit_finishi(va_di_didididi);
jit_va_end(JIT_V0);
jit_ret();
jit_epilog();
/* Define complex functions to validate a jit_va_list_t
* is a valid va_list; these do fetch arguments from
* the va_list, to ensure it does the correct operations
* fetching arguments, and pass a valid va_list to the
* C function. */
jva_iii_iiiiiii = jit_label();
jit_name("va_iii_iiiiiii");
jit_prolog();
a1 = jit_arg();
jit_getarg(JIT_V1, a1);
node = jit_beqi(JIT_V1, 1);
jit_calli(abort);
jit_patch(node);
jit_ellipsis();
jit_va_start(JIT_V0);
jit_va_arg(JIT_V1, JIT_V0);
jit_va_arg(JIT_V2, JIT_V0);
jit_prepare();
jit_pushargi(1);
jit_pushargr(JIT_V1);
jit_pushargr(JIT_V2);
jit_pushargr(JIT_V0);
jit_finishi(va_iii_iiiiiii);
jit_va_end(JIT_V0);
jit_ret();
jit_epilog();
jva_iiii_iiiiii = jit_label();
jit_name("va_iiii_iiiiii");
jit_prolog();
a1 = jit_arg();
a2 = jit_arg();
jit_getarg(JIT_V1, a1);
node = jit_beqi(JIT_V1, 1);
jit_calli(abort);
jit_patch(node);
jit_getarg(JIT_V1, a2);
node = jit_beqi(JIT_V1, 2);
jit_calli(abort);
jit_patch(node);
jit_ellipsis();
jit_va_start(JIT_V0);
jit_va_arg(JIT_V1, JIT_V0);
jit_va_arg(JIT_V2, JIT_V0);
jit_prepare();
jit_pushargi(1);
jit_pushargi(2);
jit_pushargr(JIT_V1);
jit_pushargr(JIT_V2);
jit_pushargr(JIT_V0);
jit_finishi(va_iiii_iiiiii);
jit_va_end(JIT_V0);
jit_ret();
jit_epilog();
jva_ddd_ddddddd = jit_label();
jit_name("va_ddd_ddddddd");
jit_prolog();
a1 = jit_arg_d();
jit_getarg_d(JIT_F3, a1);
node = jit_beqi_d(JIT_F3, 1);
jit_calli(abort);
jit_patch(node);
jit_ellipsis();
jit_va_start(JIT_V0);
jit_va_arg_d(JIT_F3, JIT_V0);
jit_va_arg_d(JIT_F4, JIT_V0);
jit_prepare();
jit_pushargi_d(1);
jit_pushargr_d(JIT_F3);
jit_pushargr_d(JIT_F4);
jit_pushargr(JIT_V0);
jit_finishi(va_ddd_ddddddd);
jit_va_end(JIT_V0);
jit_ret();
jit_epilog();
jva_dddd_dddddd = jit_label();
jit_name("va_dddd_dddddd");
jit_prolog();
a1 = jit_arg_d();
a2 = jit_arg_d();
jit_getarg_d(JIT_F3, a1);
node = jit_beqi_d(JIT_F3, 1);
jit_calli(abort);
jit_patch(node);
jit_getarg_d(JIT_F3, a2);
node = jit_beqi_d(JIT_F3, 2);
jit_calli(abort);
jit_patch(node);
jit_ellipsis();
jit_va_start(JIT_V0);
jit_va_arg_d(JIT_F3, JIT_V0);
jit_va_arg_d(JIT_F4, JIT_V0);
jit_prepare();
jit_pushargi_d(1);
jit_pushargi_d(2);
jit_pushargr_d(JIT_F3);
jit_pushargr_d(JIT_F4);
jit_pushargr(JIT_V0);
jit_finishi(va_dddd_dddddd);
jit_va_end(JIT_V0);
jit_ret();
jit_epilog();
jva_idi_dididid = jit_label();
jit_name("va_idi_dididid");
jit_prolog();
a1 = jit_arg();
jit_getarg(JIT_V1, a1);
node = jit_beqi(JIT_V1, 1);
jit_calli(abort);
jit_patch(node);
jit_ellipsis();
jit_va_start(JIT_V0);
jit_va_arg_d(JIT_F3, JIT_V0);
jit_va_arg(JIT_V1, JIT_V0);
jit_prepare();
jit_pushargi(1);
jit_pushargr_d(JIT_F3);
jit_pushargr(JIT_V1);
jit_pushargr(JIT_V0);
jit_finishi(va_idi_dididid);
jit_va_end(JIT_V0);
jit_ret();
jit_epilog();
jva_idid_ididid = jit_label();
jit_name("va_idid_ididid");
jit_prolog();
a1 = jit_arg();
a2 = jit_arg_d();
jit_getarg(JIT_V1, a1);
node = jit_beqi(JIT_V1, 1);
jit_calli(abort);
jit_patch(node);
jit_getarg_d(JIT_F3, a2);
node = jit_beqi_d(JIT_F3, 2);
jit_calli(abort);
jit_patch(node);
jit_ellipsis();
jit_va_start(JIT_V0);
jit_va_arg(JIT_V1, JIT_V0);
jit_va_arg_d(JIT_F3, JIT_V0);
jit_prepare();
jit_pushargi(1);
jit_pushargi_d(2);
jit_pushargr(JIT_V1);
jit_pushargr_d(JIT_F3);
jit_pushargr(JIT_V0);
jit_finishi(va_idid_ididid);
jit_va_end(JIT_V0);
jit_ret();
jit_epilog();
jva_did_idididi = jit_label();
jit_name("va_did_idididi");
jit_prolog();
a1 = jit_arg_d();
jit_getarg_d(JIT_F3, a1);
node = jit_beqi_d(JIT_F3, 1);
jit_calli(abort);
jit_patch(node);
jit_ellipsis();
jit_va_start(JIT_V0);
jit_va_arg(JIT_V1, JIT_V0);
jit_va_arg_d(JIT_F3, JIT_V0);
jit_prepare();
jit_pushargi_d(1);
jit_pushargr(JIT_V1);
jit_pushargr_d(JIT_F3);
jit_pushargr(JIT_V0);
jit_finishi(va_did_idididi);
jit_va_end(JIT_V0);
jit_ret();
jit_epilog();
jva_didi_dididi = jit_label();
jit_name("va_didi_dididi");
jit_prolog();
a1 = jit_arg_d();
a2 = jit_arg();
jit_getarg_d(JIT_F3, a1);
node = jit_beqi_d(JIT_F3, 1);
jit_calli(abort);
jit_patch(node);
jit_getarg(JIT_V1, a2);
node = jit_beqi(JIT_V1, 2);
jit_calli(abort);
jit_patch(node);
jit_ellipsis();
jit_va_start(JIT_V0);
jit_va_arg_d(JIT_F3, JIT_V0);
jit_va_arg(JIT_V1, JIT_V0);
jit_prepare();
jit_pushargi_d(1);
jit_pushargi(2);
jit_pushargr_d(JIT_F3);
jit_pushargr(JIT_V1);
jit_pushargr(JIT_V0);
jit_finishi(va_didi_dididi);
jit_va_end(JIT_V0);
jit_ret();
jit_epilog();
jit_patch(jmpi_main);
jit_name("main");
jit_prolog();
/* Check that lightning properly calls vararg functions */
jit_prepare();
PUSH1();
jit_ellipsis();
VPUSH2();
jit_finishi(i_iiiiiiiii);
jit_prepare();
PUSH2();
jit_ellipsis();
VPUSH3();
jit_finishi(ii_iiiiiiii);
jit_prepare();
PUSH3();
jit_ellipsis();
VPUSH4();
jit_finishi(iii_iiiiiii);
jit_prepare();
PUSH4();
jit_ellipsis();
VPUSH5();
jit_finishi(iiii_iiiiii);
jit_prepare();
PUSH5();
jit_ellipsis();
VPUSH6();
jit_finishi(iiiii_iiiii);
jit_prepare();
PUSH6();
jit_ellipsis();
VPUSH7();
jit_finishi(iiiiii_iiii);
jit_prepare();
PUSH7();
jit_ellipsis();
VPUSH8();
jit_finishi(iiiiiii_iii);
jit_prepare();
PUSH8();
jit_ellipsis();
VPUSH9();
jit_finishi(iiiiiiii_ii);
jit_prepare();
PUSH9();
jit_ellipsis();
VPUSH10();
jit_finishi(iiiiiiiii_i);
jit_prepare();
PUSHD1();
jit_ellipsis();
VPUSHD2();
jit_finishi(d_ddddddddd);
jit_prepare();
PUSHD2();
jit_ellipsis();
VPUSHD3();
jit_finishi(dd_dddddddd);
jit_prepare();
PUSHD3();
jit_ellipsis();
VPUSHD4();
jit_finishi(ddd_ddddddd);
jit_prepare();
PUSHD4();
jit_ellipsis();
VPUSHD5();
jit_finishi(dddd_dddddd);
jit_prepare();
PUSHD5();
jit_ellipsis();
VPUSHD6();
jit_finishi(ddddd_ddddd);
jit_prepare();
PUSHD6();
jit_ellipsis();
VPUSHD7();
jit_finishi(dddddd_dddd);
jit_prepare();
PUSHD7();
jit_ellipsis();
VPUSHD8();
jit_finishi(ddddddd_ddd);
jit_prepare();
PUSHD8();
jit_ellipsis();
VPUSHD9();
jit_finishi(dddddddd_dd);
jit_prepare();
PUSHD9();
jit_ellipsis();
VPUSHD10();
jit_finishi(ddddddddd_d);
jit_prepare();
IDPUSH1();
jit_ellipsis();
IDVPUSH2();
jit_finishi(i_didididid);
jit_prepare();
IDPUSH2();
jit_ellipsis();
IDVPUSH3();
jit_finishi(id_idididid);
jit_prepare();
IDPUSH3();
jit_ellipsis();
IDVPUSH4();
jit_finishi(idi_dididid);
jit_prepare();
IDPUSH4();
jit_ellipsis();
IDVPUSH5();
jit_finishi(idid_ididid);
jit_prepare();
IDPUSH5();
jit_ellipsis();
IDVPUSH6();
jit_finishi(ididi_didid);
jit_prepare();
IDPUSH6();
jit_ellipsis();
IDVPUSH7();
jit_finishi(ididid_idid);
jit_prepare();
IDPUSH7();
jit_ellipsis();
IDVPUSH8();
jit_finishi(idididi_did);
jit_prepare();
IDPUSH8();
jit_ellipsis();
IDVPUSH9();
jit_finishi(idididid_id);
jit_prepare();
IDPUSH9();
jit_ellipsis();
IDVPUSH10();
jit_finishi(ididididi_d);
jit_prepare();
DIPUSH1();
jit_ellipsis();
DIVPUSH2();
jit_finishi(d_ididididi);
jit_prepare();
DIPUSH2();
jit_ellipsis();
DIVPUSH3();
jit_finishi(di_didididi);
jit_prepare();
DIPUSH3();
jit_ellipsis();
DIVPUSH4();
jit_finishi(did_idididi);
jit_prepare();
DIPUSH4();
jit_ellipsis();
DIVPUSH5();
jit_finishi(didi_dididi);
jit_prepare();
DIPUSH5();
jit_ellipsis();
DIVPUSH6();
jit_finishi(didid_ididi);
jit_prepare();
DIPUSH6();
jit_ellipsis();
DIVPUSH7();
jit_finishi(dididi_didi);
jit_prepare();
DIPUSH7();
jit_ellipsis();
DIVPUSH8();
jit_finishi(dididid_idi);
jit_prepare();
DIPUSH8();
jit_ellipsis();
DIVPUSH9();
jit_finishi(didididi_di);
jit_prepare();
DIPUSH9();
jit_ellipsis();
DIVPUSH10();
jit_finishi(didididid_i);
/* Check that unmodified jit_va_list_t is a valid va_list */
jit_prepare();
PUSH1();
jit_ellipsis();
VPUSH2();
jit_patch_at(jit_finishi(NULL), jva_i_iiiiiiiii);
jit_prepare();
PUSH2();
jit_ellipsis();
VPUSH3();
jit_patch_at(jit_finishi(NULL), jva_ii_iiiiiiii);
jit_prepare();
PUSHD1();
jit_ellipsis();
VPUSHD2();
jit_patch_at(jit_finishi(NULL), jva_d_ddddddddd);
jit_prepare();
PUSHD2();
jit_ellipsis();
VPUSHD3();
jit_patch_at(jit_finishi(NULL), jva_dd_dddddddd);
jit_prepare();
IDPUSH1();
jit_ellipsis();
IDVPUSH2();
jit_patch_at(jit_finishi(NULL), jva_i_didididid);
jit_prepare();
IDPUSH2();
jit_ellipsis();
IDVPUSH3();
jit_patch_at(jit_finishi(NULL), jva_id_idididid);
jit_prepare();
DIPUSH1();
jit_ellipsis();
DIVPUSH2();
jit_patch_at(jit_finishi(NULL), jva_d_ididididi);
jit_prepare();
DIPUSH2();
jit_ellipsis();
DIVPUSH3();
jit_patch_at(jit_finishi(NULL), jva_di_didididi);
/* Check that modified jit_va_list_t is a valid va_list */
jit_prepare();
PUSH1();
jit_ellipsis();
VPUSH2();
jit_patch_at(jit_finishi(NULL), jva_iii_iiiiiii);
jit_prepare();
PUSH2();
jit_ellipsis();
VPUSH3();
jit_patch_at(jit_finishi(NULL), jva_iiii_iiiiii);
jit_prepare();
PUSHD1();
jit_ellipsis();
VPUSHD2();
jit_patch_at(jit_finishi(NULL), jva_ddd_ddddddd);
jit_prepare();
PUSHD2();
jit_ellipsis();
VPUSHD3();
jit_patch_at(jit_finishi(NULL), jva_dddd_dddddd);
jit_prepare();
IDPUSH1();
jit_ellipsis();
IDVPUSH2();
jit_patch_at(jit_finishi(NULL), jva_idi_dididid);
jit_prepare();
IDPUSH2();
jit_ellipsis();
IDVPUSH3();
jit_patch_at(jit_finishi(NULL), jva_idid_ididid);
jit_prepare();
DIPUSH1();
jit_ellipsis();
DIVPUSH2();
jit_patch_at(jit_finishi(NULL), jva_did_idididi);
jit_prepare();
DIPUSH2();
jit_ellipsis();
DIVPUSH3();
jit_patch_at(jit_finishi(NULL), jva_didi_dididi);
jit_ret();
jit_epilog();
function = jit_emit();
jit_clear_state();
//jit_disassemble();
(*function)();
jit_destroy_state();
finish_jit();
printf("ok\n");
return 0;
}