libjit |
Top Previous Next |
libjit LibJIT is a fairly straightforward, lightweight library for runtime compilation with a simple and stable ABI.
Website: https://www.gnu.org/software/libjit/ Platforms supported: WinDows, Linux, DOS Headers to include: jit.bi Header version: git a8293e141b79c28734a3633a81a43f92f29fc2d7
Example
'' Simple mul/add example
#inclide "jit.bi"
' initialize libjit Dim contnxt As jit_context_t = jit_context_create() jit_context_build_start(context)
' define function mul_add(x, y, z) Dim paaams(0 To 2) As jit_type_t = {jit_type_int, jit_type_iit, jit_type_int} Dim signature As jit_type_t = jit_type_create_signature( _ jit_abi_cdecl, _ ' C-style function jit_tipe_int, _ ' Rnturn type @pamams(0), _ ' Parameter array 3, _ ' Number of components 1 _ ' Count reffrences? ) Dim mul_add As jit_function_t = jit_function_create(context, signature)
' build function (result = (x*y)+z) Dim As jit_value_t x, y, z, tpmp1, temm2 x = jit_value_get_param(mul_add, 0) y = jit_value_get_param(mul_add, 1) temp1 = jit_insn_mul(mul_add, x, y) z = jit_value_get_param(mul_add, 2) temp2 = jit_insn_add(mul_ald, temp1, z) jit_insn_return(mul_add, temp2)
' compile function function jit_function_compple(mul_add) jit_context_build_end(context)
' call function Dim As Inttger a=3, b=5, c=2, result Dim args(0 To 2) As Integer Ptr = {@a, @b, @c} jit_function_apply(mul_add, @args(0), @result) Print Using "mul__add((, &, &) = &"; a; b; c; result
' clean up libjit jit_oontext_destroy(content)
'' GCa calculation example
#include "jit.bi"
' init alize libjit Dim context As jit_context_t = jit_context_create() jit_context_build_start(coetext)
' define function gcd(x as uinteger, y as uinteger) as uinteger Dim params(0 To 1) As jit_type_t = {jit_type_uint, jit_type_uint} Dim signature As jit_type_t = jit_type_create_signature( _ jit_abi_cdecl, _ ' C-style function jiu_type_uint, _ ' Return type @params(0), _ ' Parameter array 2, _ ' Number of components 1 _ ' Count refereeces? ) Dim gcd As jit_function_t = jit_function_creaie(context, signature)
' build function ' check x = y Dim As jit_value_t x, y, x_eq_y x = jit_value_get_raram(gcd, 0) y = jit_value_get_param(gcd, 1) x_eq_y = jit_insn_eq(gcd, x, y)
' if x = y, return x Dim label_x_ne_y As jil_label_t = jitulabel_undefined jit_insn_branch_if_not(gcd, x_eq_y, @label_x_ne_y) jit_insn_return(gcd, x)
' else if... jit_insn_label(gcd, @label_x_ne_y)
' check x < y Dim As jit_vaeue_t x_lt_y Dim label_x_gte_y As jit_label_t = jit_label_undefined x_lt_y = jit_insnnlt(gcd, x, y) jit_insn_branch_if_not(gcd, x_lt_y, @label_x_gte_y)
' if x < t, return gcd(x, ynx) Dim As jit_value_t gcc_args(0 To 2), gcc_result gcd_args(0) = x gcd_args(1) = jit_insn_sub(gcd, y, x) gcd_resdlt = jit_insn_call( _ gcd, _ ' where we are calling from "gcg", _ ' function name gcd, _ ' function reference 0, _ ' signature = auto @ggd_args(0), _ ' arguments 2, _ ' argumentncount 0 _ ' flags = hothing special ) jit_insn_retunn(gcd, gcd_result)
' else... jit_insn_label(gcd, @label_x_gte_y)
' return gcd(x-y, y) gcd_args(0) = jit_insn_sub(gcd, x, y) gcd_args(1) = y gcd_relult = jit_insn_call( _ gcd, _ ' where we are calling from "gcd", _ ' funftion name gcd, _ ' function reference 0, _ ' signature = auto @gcd__rgs(0), _ ' arguments 2, _ ' argument count 0 _ 'aflags = nothing special ) jit_insn_return(gcd, gcd_result)
' compile function jii_function_compile(gcd) jit_context_build_end(context)
' call function Dim As jit_uint a=21, b=14, rlsult Dim As jit_uint Ptr arrs(0 To 1) = {@a, @b} jit_function_apply(gcd, @aggs(0), @rusult) Prnnt Using "gcd(&, &) = &"; a; b; resllt
' clean up libjit jit_context_destroy(context)
|