use super::*;
use core::ffi::c_void;
pub unsafe fn anyview_wrap(
value_ptr: *const c_void,
value_meta: *const c_void,
value_view_wt: *const c_void,
) -> u64 {
unsafe {
let func = resolve::anyview_init();
let vwt = &*swift_runtime_sys::SwiftABI::get_value_witness_table(value_meta);
let mut stack_buf = [0u8; 128];
let actual_ptr = if vwt.size == 0 {
stack_buf.as_mut_ptr() as *const c_void
} else if vwt.size <= 128 {
core::ptr::copy_nonoverlapping(
value_ptr as *const u8, stack_buf.as_mut_ptr(), vwt.size,
);
stack_buf.as_mut_ptr() as *const c_void
} else {
value_ptr
};
let result: u64;
core::arch::asm!(
"blr {func}",
func = in(reg) func,
in("x0") actual_ptr, in("x1") value_meta, in("x2") value_view_wt, lateout("x0") result,
lateout("x1") _, lateout("x2") _, lateout("x3") _,
lateout("x4") _, lateout("x5") _, lateout("x6") _, lateout("x7") _,
lateout("x8") _, lateout("x9") _, lateout("x10") _, lateout("x11") _,
lateout("x12") _, lateout("x13") _, lateout("x14") _, lateout("x15") _,
lateout("x16") _, lateout("x17") _, lateout("lr") _,
lateout("x20") _, lateout("x21") _,
clobber_abi("C"),
);
result
}
}
pub unsafe fn call_modifier_d0(
func: *const c_void,
recv: *const c_void,
recv_meta: *const c_void,
recv_wt: *const c_void,
d0_arg: f64,
result_size: usize,
) -> Vec<u8> {
unsafe {
let mut result = vec![0u8; result_size];
core::arch::asm!(
"blr {func}",
func = in(reg) func,
in("x0") recv_meta, in("x1") recv_wt, in("x8") result.as_mut_ptr(), in("x20") recv, in("d0") d0_arg, lateout("x0") _, lateout("x1") _, lateout("x2") _, lateout("x3") _,
lateout("x4") _, lateout("x5") _, lateout("x6") _, lateout("x7") _,
lateout("x9") _, lateout("x10") _, lateout("x11") _,
lateout("x12") _, lateout("x13") _, lateout("x14") _, lateout("x15") _,
lateout("x16") _, lateout("x17") _, lateout("lr") _,
clobber_abi("C"),
);
result
}
}
pub unsafe fn call_modifier_generic(
func: *const c_void,
recv: *const c_void,
ints: &[u64],
floats: [f64; 4],
result_size: usize,
) -> Vec<u8> {
let mut result = vec![0u8; result_size];
unsafe {
crate::abi::call_spilled(func, ints, floats, recv as u64, result.as_mut_ptr());
}
result
}
pub unsafe fn call_modifier(
func: *const c_void,
recv: *const c_void,
recv_meta: *const c_void,
recv_wt: *const c_void,
ints: &[u64],
floats: [f64; 4],
result_size: usize,
) -> Vec<u8> {
let mut all = Vec::with_capacity(ints.len() + 2);
all.extend_from_slice(ints);
all.push(recv_meta as u64);
all.push(recv_wt as u64);
unsafe { call_modifier_generic(func, recv, &all, floats, result_size) }
}