2022-03-13 09:19:48 -05:00
|
|
|
macro_rules! builtin_functions {
|
|
|
|
($register:ident; $(fn $name:ident($($arg_name:ident: $arg_ty:ty),*) -> $ret_ty:ty;)*) => {
|
|
|
|
#[cfg(feature = "jit")]
|
|
|
|
#[allow(improper_ctypes)]
|
|
|
|
extern "C" {
|
|
|
|
$(fn $name($($arg_name: $arg_ty),*) -> $ret_ty;)*
|
|
|
|
}
|
2021-03-29 03:45:09 -05:00
|
|
|
|
2022-03-13 09:19:48 -05:00
|
|
|
#[cfg(feature = "jit")]
|
|
|
|
pub(crate) fn $register(builder: &mut cranelift_jit::JITBuilder) {
|
|
|
|
for (name, val) in [$((stringify!($name), $name as *const u8)),*] {
|
|
|
|
builder.symbol(name, val);
|
|
|
|
}
|
2021-03-29 03:45:09 -05:00
|
|
|
}
|
2022-03-13 09:19:48 -05:00
|
|
|
};
|
2021-03-29 03:45:09 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
builtin_functions! {
|
|
|
|
register_functions_for_jit;
|
|
|
|
|
|
|
|
// integers
|
|
|
|
fn __multi3(a: i128, b: i128) -> i128;
|
|
|
|
fn __udivti3(n: u128, d: u128) -> u128;
|
|
|
|
fn __divti3(n: i128, d: i128) -> i128;
|
|
|
|
fn __umodti3(n: u128, d: u128) -> u128;
|
|
|
|
fn __modti3(n: i128, d: i128) -> i128;
|
|
|
|
fn __rust_u128_addo(a: u128, b: u128) -> (u128, bool);
|
|
|
|
fn __rust_i128_addo(a: i128, b: i128) -> (i128, bool);
|
|
|
|
fn __rust_u128_subo(a: u128, b: u128) -> (u128, bool);
|
|
|
|
fn __rust_i128_subo(a: i128, b: i128) -> (i128, bool);
|
|
|
|
fn __rust_u128_mulo(a: u128, b: u128) -> (u128, bool);
|
|
|
|
fn __rust_i128_mulo(a: i128, b: i128) -> (i128, bool);
|
|
|
|
|
|
|
|
// floats
|
|
|
|
fn __floattisf(i: i128) -> f32;
|
|
|
|
fn __floattidf(i: i128) -> f64;
|
|
|
|
fn __floatuntisf(i: u128) -> f32;
|
|
|
|
fn __floatuntidf(i: u128) -> f64;
|
|
|
|
fn __fixsfti(f: f32) -> i128;
|
|
|
|
fn __fixdfti(f: f64) -> i128;
|
|
|
|
fn __fixunssfti(f: f32) -> u128;
|
|
|
|
fn __fixunsdfti(f: f64) -> u128;
|
|
|
|
}
|