#include #include #define MAX_STACK 20 int test_max(int a, int b) { return (a < b) ? 100 : 200; } int compile_on_demand(jit_function_t function) { jit_value_t tmp; jit_value_t stack[MAX_STACK]; jit_label_t label1 = jit_label_undefined; jit_label_t label2 = jit_label_undefined; stack[0] = jit_value_create(function, jit_type_int); stack[1] = jit_value_create(function, jit_type_int); tmp = jit_value_get_param(function, 0); jit_insn_store(function, stack[0], tmp); printf("stack[0] kind %d\n", jit_type_get_kind(jit_value_get_type(stack[0]))); tmp = jit_value_get_param(function, 1); jit_insn_store(function, stack[1], tmp); tmp = jit_insn_lt(function, stack[0], stack[1]); jit_insn_store(function, stack[0], tmp); jit_insn_branch_if_not(function, tmp, &label1); /* true */ /* HOW TO create value on stack when other expressions are evaluated? */ /* HOW TO change value type when other type is returned? */ tmp = jit_value_create_nint_constant(function, jit_type_int, 100); jit_insn_store(function, stack[0], tmp); printf("stack[0] kind %d\n", jit_type_get_kind(jit_value_get_type(stack[0]))); /* go to end */ jit_insn_branch(function, &label2); /* label1 */ jit_insn_label(function, &label1); /* false */ tmp = jit_value_create_nint_constant(function, jit_type_int, 200); jit_insn_store(function, stack[0], tmp); printf("stack[1] kind %d\n", jit_type_get_kind(jit_value_get_type(stack[1]))); /* label2 end */ jit_insn_label(function, &label2); jit_insn_return(function, stack[0]); return JIT_RESULT_OK; } void test_jit() { jit_context_t context; jit_function_t function; jit_type_t signature; jit_type_t params[2]; params[0] = jit_type_int; params[1] = jit_type_int; context = jit_context_create(); jit_context_build_start(context); signature = jit_type_create_signature(jit_abi_cdecl, jit_type_int, params, 2, 0); function = jit_function_create(context, signature); jit_type_free(signature); jit_function_set_optimization_level(function, 0); jit_function_set_on_demand_compiler(function, compile_on_demand); jit_context_build_end(context); int param0 = 100; int param1 = 200; void * args[2]; args[0] = ¶m0; args[1] = ¶m1; jit_int ret; jit_function_apply(function, args, &ret); printf("ret %d\n", ret); args[0] = ¶m1; args[1] = ¶m0; jit_function_apply(function, args, &ret); printf("ret %d\n", ret); //jit_dump_function(stdout, function, "test_jit"); jit_context_destroy(context); } void test_myself() { printf("test_max ret %d\n", test_max(100, 200)); printf("test_max ret %d\n", test_max(200, 100)); } int main() { test_myself(); test_jit(); return 0; }