use cranelift::prelude::*;
use cranelift_jit::JITBuilder;
use cranelift_jit::JITModule;
use cranelift_module::{FuncId, Linkage, Module};
use std::collections::HashMap;
use super::super::ffi::math::{
jit_acos, jit_asin, jit_atan, jit_cos, jit_exp, jit_ln, jit_log, jit_pow, jit_sin, jit_tan,
};
use super::super::ffi::v2_math::{jit_pow_f64, jit_pow_i64};
use super::super::ffi::v2_math::{
jit_abs_f64, jit_acos_f64, jit_asin_f64, jit_atan_f64, jit_ceil_f64, jit_cos_f64, jit_exp_f64,
jit_floor_f64, jit_ln_f64, jit_round_f64, jit_sin_f64, jit_sqrt_f64, jit_tan_f64,
};
use super::intrinsics::{
jit_intrinsic_correlation, jit_intrinsic_covariance, jit_intrinsic_max, jit_intrinsic_mean,
jit_intrinsic_median, jit_intrinsic_min, jit_intrinsic_percentile, jit_intrinsic_std,
jit_intrinsic_sum, jit_intrinsic_variance, jit_series_broadcast, jit_series_clip,
jit_series_cumprod, jit_series_diff, jit_series_ema, jit_series_highest_index,
jit_series_lowest_index, jit_series_pct_change, jit_series_rolling_max, jit_series_rolling_min,
};
pub fn register_math_symbols(builder: &mut JITBuilder) {
builder.symbol("jit_sin", jit_sin as *const u8);
builder.symbol("jit_cos", jit_cos as *const u8);
builder.symbol("jit_tan", jit_tan as *const u8);
builder.symbol("jit_asin", jit_asin as *const u8);
builder.symbol("jit_acos", jit_acos as *const u8);
builder.symbol("jit_atan", jit_atan as *const u8);
builder.symbol("jit_exp", jit_exp as *const u8);
builder.symbol("jit_ln", jit_ln as *const u8);
builder.symbol("jit_log", jit_log as *const u8);
builder.symbol("jit_pow", jit_pow as *const u8);
builder.symbol("jit_pow_f64", jit_pow_f64 as *const u8);
builder.symbol("jit_pow_i64", jit_pow_i64 as *const u8);
builder.symbol("jit_sqrt_f64", jit_sqrt_f64 as *const u8);
builder.symbol("jit_abs_f64", jit_abs_f64 as *const u8);
builder.symbol("jit_floor_f64", jit_floor_f64 as *const u8);
builder.symbol("jit_ceil_f64", jit_ceil_f64 as *const u8);
builder.symbol("jit_round_f64", jit_round_f64 as *const u8);
builder.symbol("jit_sin_f64", jit_sin_f64 as *const u8);
builder.symbol("jit_cos_f64", jit_cos_f64 as *const u8);
builder.symbol("jit_tan_f64", jit_tan_f64 as *const u8);
builder.symbol("jit_asin_f64", jit_asin_f64 as *const u8);
builder.symbol("jit_acos_f64", jit_acos_f64 as *const u8);
builder.symbol("jit_atan_f64", jit_atan_f64 as *const u8);
builder.symbol("jit_exp_f64", jit_exp_f64 as *const u8);
builder.symbol("jit_ln_f64", jit_ln_f64 as *const u8);
builder.symbol(
"jit_series_gt",
super::super::ffi::math::jit_series_gt as *const u8,
);
builder.symbol(
"jit_series_lt",
super::super::ffi::math::jit_series_lt as *const u8,
);
builder.symbol(
"jit_series_gte",
super::super::ffi::math::jit_series_gte as *const u8,
);
builder.symbol(
"jit_series_lte",
super::super::ffi::math::jit_series_lte as *const u8,
);
builder.symbol("jit_intrinsic_sum", jit_intrinsic_sum as *const u8);
builder.symbol("jit_intrinsic_mean", jit_intrinsic_mean as *const u8);
builder.symbol("jit_intrinsic_min", jit_intrinsic_min as *const u8);
builder.symbol("jit_intrinsic_max", jit_intrinsic_max as *const u8);
builder.symbol("jit_intrinsic_std", jit_intrinsic_std as *const u8);
builder.symbol(
"jit_intrinsic_variance",
jit_intrinsic_variance as *const u8,
);
builder.symbol("jit_intrinsic_median", jit_intrinsic_median as *const u8);
builder.symbol(
"jit_intrinsic_percentile",
jit_intrinsic_percentile as *const u8,
);
builder.symbol(
"jit_intrinsic_correlation",
jit_intrinsic_correlation as *const u8,
);
builder.symbol(
"jit_intrinsic_covariance",
jit_intrinsic_covariance as *const u8,
);
builder.symbol(
"jit_series_rolling_min",
jit_series_rolling_min as *const u8,
);
builder.symbol(
"jit_series_rolling_max",
jit_series_rolling_max as *const u8,
);
builder.symbol("jit_series_ema", jit_series_ema as *const u8);
builder.symbol("jit_series_diff", jit_series_diff as *const u8);
builder.symbol("jit_series_pct_change", jit_series_pct_change as *const u8);
builder.symbol("jit_series_cumprod", jit_series_cumprod as *const u8);
builder.symbol("jit_series_clip", jit_series_clip as *const u8);
builder.symbol("jit_series_broadcast", jit_series_broadcast as *const u8);
builder.symbol(
"jit_series_highest_index",
jit_series_highest_index as *const u8,
);
builder.symbol(
"jit_series_lowest_index",
jit_series_lowest_index as *const u8,
);
}
pub fn declare_math_functions(module: &mut JITModule, ffi_funcs: &mut HashMap<String, FuncId>) {
for name in [
"jit_sin", "jit_cos", "jit_tan", "jit_asin", "jit_acos", "jit_atan", "jit_exp", "jit_ln",
] {
let mut sig = module.make_signature();
sig.params.push(AbiParam::new(types::I64));
sig.returns.push(AbiParam::new(types::I64));
let func_id = module
.declare_function(name, Linkage::Import, &sig)
.unwrap_or_else(|_| panic!("Failed to declare {}", name));
ffi_funcs.insert(name.to_string(), func_id);
}
{
let mut sig = module.make_signature();
sig.params.push(AbiParam::new(types::I64)); sig.params.push(AbiParam::new(types::I64)); sig.returns.push(AbiParam::new(types::I64));
let func_id = module
.declare_function("jit_log", Linkage::Import, &sig)
.expect("Failed to declare jit_log");
ffi_funcs.insert("jit_log".to_string(), func_id);
}
{
let mut sig = module.make_signature();
sig.params.push(AbiParam::new(types::I64)); sig.params.push(AbiParam::new(types::I64)); sig.returns.push(AbiParam::new(types::I64));
let func_id = module
.declare_function("jit_pow", Linkage::Import, &sig)
.expect("Failed to declare jit_pow");
ffi_funcs.insert("jit_pow".to_string(), func_id);
}
{
let mut sig = module.make_signature();
sig.params.push(AbiParam::new(types::F64));
sig.params.push(AbiParam::new(types::F64));
sig.returns.push(AbiParam::new(types::F64));
let func_id = module
.declare_function("jit_pow_f64", Linkage::Import, &sig)
.expect("Failed to declare jit_pow_f64");
ffi_funcs.insert("jit_pow_f64".to_string(), func_id);
}
{
let mut sig = module.make_signature();
sig.params.push(AbiParam::new(types::I64));
sig.params.push(AbiParam::new(types::I64));
sig.returns.push(AbiParam::new(types::I64));
let func_id = module
.declare_function("jit_pow_i64", Linkage::Import, &sig)
.expect("Failed to declare jit_pow_i64");
ffi_funcs.insert("jit_pow_i64".to_string(), func_id);
}
for name in [
"jit_sqrt_f64",
"jit_abs_f64",
"jit_floor_f64",
"jit_ceil_f64",
"jit_round_f64",
"jit_sin_f64",
"jit_cos_f64",
"jit_tan_f64",
"jit_asin_f64",
"jit_acos_f64",
"jit_atan_f64",
"jit_exp_f64",
"jit_ln_f64",
] {
let mut sig = module.make_signature();
sig.params.push(AbiParam::new(types::F64));
sig.returns.push(AbiParam::new(types::F64));
let func_id = module
.declare_function(name, Linkage::Import, &sig)
.unwrap_or_else(|_| panic!("Failed to declare {}", name));
ffi_funcs.insert(name.to_string(), func_id);
}
for name in [
"jit_series_gt",
"jit_series_lt",
"jit_series_gte",
"jit_series_lte",
] {
let mut sig = module.make_signature();
sig.params.push(AbiParam::new(types::I64)); sig.params.push(AbiParam::new(types::I64)); sig.returns.push(AbiParam::new(types::I64)); let func_id = module
.declare_function(name, Linkage::Import, &sig)
.unwrap_or_else(|_| panic!("Failed to declare {}", name));
ffi_funcs.insert(name.to_string(), func_id);
}
for name in [
"jit_intrinsic_sum",
"jit_intrinsic_mean",
"jit_intrinsic_min",
"jit_intrinsic_max",
"jit_intrinsic_std",
"jit_intrinsic_variance",
"jit_intrinsic_median",
"jit_series_cumprod",
] {
let mut sig = module.make_signature();
sig.params.push(AbiParam::new(types::I64)); sig.returns.push(AbiParam::new(types::I64)); let func_id = module
.declare_function(name, Linkage::Import, &sig)
.unwrap_or_else(|_| panic!("Failed to declare {}", name));
ffi_funcs.insert(name.to_string(), func_id);
}
for name in [
"jit_intrinsic_percentile",
"jit_series_rolling_min",
"jit_series_rolling_max",
"jit_series_ema",
"jit_series_diff",
"jit_series_pct_change",
] {
let mut sig = module.make_signature();
sig.params.push(AbiParam::new(types::I64)); sig.params.push(AbiParam::new(types::I64)); sig.returns.push(AbiParam::new(types::I64)); let func_id = module
.declare_function(name, Linkage::Import, &sig)
.unwrap_or_else(|_| panic!("Failed to declare {}", name));
ffi_funcs.insert(name.to_string(), func_id);
}
for name in ["jit_intrinsic_correlation", "jit_intrinsic_covariance"] {
let mut sig = module.make_signature();
sig.params.push(AbiParam::new(types::I64)); sig.params.push(AbiParam::new(types::I64)); sig.returns.push(AbiParam::new(types::I64)); let func_id = module
.declare_function(name, Linkage::Import, &sig)
.unwrap_or_else(|_| panic!("Failed to declare {}", name));
ffi_funcs.insert(name.to_string(), func_id);
}
{
let mut sig = module.make_signature();
sig.params.push(AbiParam::new(types::I64)); sig.params.push(AbiParam::new(types::I64)); sig.params.push(AbiParam::new(types::I64)); sig.returns.push(AbiParam::new(types::I64)); let func_id = module
.declare_function("jit_series_clip", Linkage::Import, &sig)
.expect("Failed to declare jit_series_clip");
ffi_funcs.insert("jit_series_clip".to_string(), func_id);
}
{
let mut sig = module.make_signature();
sig.params.push(AbiParam::new(types::I64)); sig.params.push(AbiParam::new(types::I64)); sig.returns.push(AbiParam::new(types::I64)); let func_id = module
.declare_function("jit_series_broadcast", Linkage::Import, &sig)
.expect("Failed to declare jit_series_broadcast");
ffi_funcs.insert("jit_series_broadcast".to_string(), func_id);
}
{
let mut sig = module.make_signature();
sig.params.push(AbiParam::new(types::I64)); sig.returns.push(AbiParam::new(types::I64)); let func_id = module
.declare_function("jit_series_highest_index", Linkage::Import, &sig)
.expect("Failed to declare jit_series_highest_index");
ffi_funcs.insert("jit_series_highest_index".to_string(), func_id);
}
{
let mut sig = module.make_signature();
sig.params.push(AbiParam::new(types::I64)); sig.returns.push(AbiParam::new(types::I64)); let func_id = module
.declare_function("jit_series_lowest_index", Linkage::Import, &sig)
.expect("Failed to declare jit_series_lowest_index");
ffi_funcs.insert("jit_series_lowest_index".to_string(), func_id);
}
}