#include #include #include int main(int argc, char** argv){ jit_context_t context; jit_function_t f_main; jit_type_t signature_main; jit_type_t params[1]; jit_value_t value; jit_value_t tempValue; jit_value_t oracle; jit_value_t errorValue; jit_value_t correctValue; jit_value_t base; jit_value_t checkValue; jit_label_t label; jit_label_t secondLabel; jit_label_t startLabel; int inputValue; int result; /* Initialize labels */ label = jit_label_undefined; secondLabel = jit_label_undefined; startLabel = jit_label_undefined; /* Initialize the context */ context = jit_context_create(); /* Allocate a new function */ signature_main = jit_type_create_signature(jit_abi_cdecl, jit_type_int, params, 0, 0); f_main = jit_function_create(context, signature_main); /* Make the constants */ oracle = jit_value_create_nint_constant(f_main, jit_type_int, 15); errorValue = jit_value_create_nint_constant(f_main, jit_type_int, 1); correctValue = jit_value_create_nint_constant(f_main, jit_type_int, 0); base = jit_value_create_nint_constant(f_main, jit_type_void_ptr, (unsigned int) &inputValue); /* Make the body of the function */ jit_insn_branch(f_main, &startLabel); jit_insn_label(f_main, &secondLabel); value = jit_insn_load_relative(f_main, base, 0, jit_type_int); checkValue = jit_insn_eq(f_main, value, oracle); jit_insn_branch_if(f_main, checkValue, &label); jit_insn_return(f_main, errorValue); jit_insn_label(f_main, &label); jit_insn_return(f_main, correctValue); jit_insn_label(f_main, &startLabel); tempValue = jit_insn_load_relative(f_main, base, 0, jit_type_int); jit_insn_store(f_main, value, tempValue); checkValue = jit_insn_eq(f_main, value, oracle); jit_insn_branch_if(f_main, checkValue, &secondLabel); jit_insn_return(f_main, errorValue); /* Compile the function */ jit_function_compile(f_main); /* Execute the function */ inputValue = 15; jit_function_apply(f_main, NULL, &result); /* Return */ return result; }