#include #include #include static jit_function_t compile(jit_context_t c) { /* void swap(jit_int *p1, jit_int *p2) { jit_int v1 = *p1, v2 = *p2; *p1 = v2; *p2 = v1; } */ jit_function_t f; jit_type_t params[2]; jit_type_t signature; jit_value_t o1p, o2p, o1, o2; params[0] = jit_type_create_pointer(jit_type_int, 1); params[1] = jit_type_copy(params[0]); signature = jit_type_create_signature(jit_abi_cdecl, jit_type_void, params, 2, 1); f = jit_function_create(c, signature); o1p = jit_value_get_param(f, 0); o2p = jit_value_get_param(f, 1); o1 = jit_insn_load_relative(f, o1p, 0, jit_type_int); o2 = jit_insn_load_relative(f, o2p, 0, jit_type_int); jit_insn_store_relative(f, o1p, 0, o2); jit_insn_store_relative(f, o2p, 0, o1); jit_insn_return(f, NULL); jit_dump_function(stderr, f, "function"); jit_function_compile(f); jit_dump_function(stderr, f, "function"); return f; } int main(void) { jit_int o1, o2; jit_context_t c; jit_function_t f; c = jit_context_create(); jit_context_build_start(c); f = compile(c); jit_context_build_end(c); scanf("%i,%i", &o1, &o2); if (0) { void (*ff) (int *, int *) = jit_function_to_closure(f); ff(&o1, &o2); } else { int *do1 = &o1, *do2 = &o2; void *a[] = { &do1, &do2 }; jit_function_apply(f, a, NULL); } printf("%i,%i\n", o1, o2); jit_context_destroy(c); return 0; }