use super::value_ffi::*;
#[allow(dead_code)]
const SIMD_THRESHOLD: usize = 16;
pub extern "C" fn jit_sin(value_bits: u64) -> u64 {
let x = if is_number(value_bits) {
unbox_number(value_bits)
} else {
return box_number(f64::NAN);
};
box_number(x.sin())
}
pub extern "C" fn jit_cos(value_bits: u64) -> u64 {
let x = if is_number(value_bits) {
unbox_number(value_bits)
} else {
return box_number(f64::NAN);
};
box_number(x.cos())
}
pub extern "C" fn jit_tan(value_bits: u64) -> u64 {
let x = if is_number(value_bits) {
unbox_number(value_bits)
} else {
return box_number(f64::NAN);
};
box_number(x.tan())
}
pub extern "C" fn jit_asin(value_bits: u64) -> u64 {
let x = if is_number(value_bits) {
unbox_number(value_bits)
} else {
return box_number(f64::NAN);
};
box_number(x.asin())
}
pub extern "C" fn jit_acos(value_bits: u64) -> u64 {
let x = if is_number(value_bits) {
unbox_number(value_bits)
} else {
return box_number(f64::NAN);
};
box_number(x.acos())
}
pub extern "C" fn jit_atan(value_bits: u64) -> u64 {
let x = if is_number(value_bits) {
unbox_number(value_bits)
} else {
return box_number(f64::NAN);
};
box_number(x.atan())
}
pub extern "C" fn jit_exp(value_bits: u64) -> u64 {
let x = if is_number(value_bits) {
unbox_number(value_bits)
} else {
return box_number(f64::NAN);
};
box_number(x.exp())
}
pub extern "C" fn jit_ln(value_bits: u64) -> u64 {
let x = if is_number(value_bits) {
unbox_number(value_bits)
} else {
return box_number(f64::NAN);
};
box_number(x.ln())
}
pub extern "C" fn jit_log(value_bits: u64, base_bits: u64) -> u64 {
let x = if is_number(value_bits) {
unbox_number(value_bits)
} else {
return box_number(f64::NAN);
};
let base = if is_number(base_bits) {
unbox_number(base_bits)
} else {
return box_number(f64::NAN);
};
box_number(x.log(base))
}
pub extern "C" fn jit_pow(base_bits: u64, exp_bits: u64) -> u64 {
let base = if is_number(base_bits) {
unbox_number(base_bits)
} else {
return box_number(f64::NAN);
};
let exp = if is_number(exp_bits) {
unbox_number(exp_bits)
} else {
return box_number(f64::NAN);
};
box_number(base.powf(exp))
}
#[allow(dead_code)]
fn series_add_simd(a_bits: u64, b_bits: u64) -> u64 {
series_simd_binary_op(
a_bits,
b_bits,
super::simd::jit_simd_add,
super::simd::jit_simd_add_scalar,
)
}
#[allow(dead_code)]
fn series_sub_simd(a_bits: u64, b_bits: u64) -> u64 {
series_simd_binary_op(
a_bits,
b_bits,
super::simd::jit_simd_sub,
super::simd::jit_simd_sub_scalar,
)
}
#[allow(dead_code)]
fn series_mul_simd(a_bits: u64, b_bits: u64) -> u64 {
series_simd_binary_op(
a_bits,
b_bits,
super::simd::jit_simd_mul,
super::simd::jit_simd_mul_scalar,
)
}
#[allow(dead_code)]
fn series_div_simd(a_bits: u64, b_bits: u64) -> u64 {
series_simd_binary_op(
a_bits,
b_bits,
super::simd::jit_simd_div,
super::simd::jit_simd_div_scalar,
)
}
fn series_simd_binary_op(
_a_bits: u64,
_b_bits: u64,
_simd_binary: extern "C" fn(*const f64, *const f64, u64) -> *mut f64,
_simd_scalar: extern "C" fn(*const f64, f64, u64) -> *mut f64,
) -> u64 {
TAG_NULL
}
#[allow(dead_code)]
fn series_binary_op<F>(_a_bits: u64, _b_bits: u64, _op: F) -> u64
where
F: Fn(f64, f64) -> f64,
{
TAG_NULL
}
pub extern "C" fn jit_series_gt(a_bits: u64, b_bits: u64) -> u64 {
series_comparison_op(a_bits, b_bits, |a, b| a > b)
}
pub extern "C" fn jit_series_lt(a_bits: u64, b_bits: u64) -> u64 {
series_comparison_op(a_bits, b_bits, |a, b| a < b)
}
pub extern "C" fn jit_series_gte(a_bits: u64, b_bits: u64) -> u64 {
series_comparison_op(a_bits, b_bits, |a, b| a >= b)
}
pub extern "C" fn jit_series_lte(a_bits: u64, b_bits: u64) -> u64 {
series_comparison_op(a_bits, b_bits, |a, b| a <= b)
}
fn series_comparison_op<F>(a_bits: u64, b_bits: u64, op: F) -> u64
where
F: Fn(f64, f64) -> bool,
{
if is_number(a_bits) && is_number(b_bits) {
let a = unbox_number(a_bits);
let b = unbox_number(b_bits);
return if op(a, b) {
TAG_BOOL_TRUE
} else {
TAG_BOOL_FALSE
};
}
TAG_BOOL_FALSE
}