GitHub

@@ -1,8 +1,5 @@

11

use crate::{Device, Uxn};

223-

#[cfg(target_arch = "aarch64")]

4-

mod aarch64;

5-63

#[cfg(not(target_arch = "aarch64"))]

74

compile_error!("no native implementation for this platform");

85

@@ -92,35 +89,32 @@ extern "C" fn dei_2kr_entry(vm: &mut Uxn, dev: &mut DeviceHandle) -> bool {

92899390

////////////////////////////////////////////////////////////////////////////////

949195-

#[repr(C)]

96-

pub(crate) struct EntryHandle {

97-

stack_data: *mut u8,

98-

stack_index: *mut u8,

99-

ret_data: *mut u8,

100-

ret_index: *mut u8,

101-

ram: *mut u8,

102-

vm: *mut core::ffi::c_void, // *Uxn

103-

dev: *mut core::ffi::c_void, // *DeviceHandle

104-

}

105-10692

struct DeviceHandle<'a>(&'a mut dyn Device);

1079310894

pub fn entry(vm: &mut Uxn, dev: &mut dyn Device, pc: u16) -> u16 {

10995

let mut h = DeviceHandle(dev);

110-

let mut e = EntryHandle {

111-

stack_data: vm.stack.data.as_mut_ptr(),

112-

stack_index: &mut vm.stack.index as *mut _,

113-

ret_data: vm.ret.data.as_mut_ptr(),

114-

ret_index: &mut vm.ret.index as *mut _,

115-

ram: (*vm.ram).as_mut_ptr(),

116-

vm: vm as *mut _ as *mut _,

117-

dev: &mut h as *mut _ as *mut _,

118-

};

96+

let r: usize;

1199712098

// SAFETY: do you trust me?

121-

unsafe { aarch64::aarch64_entry(&mut e as *mut _, pc, JUMP_TABLE.as_ptr()) }

99+

unsafe {

100+

core::arch::asm!(

101+

"bl aarch64_entry",

102+

inout("x0") vm.stack.data.as_mut_ptr() as usize => r,

103+

in("x1") &mut vm.stack.index as *mut _,

104+

in("x2") vm.ret.data.as_mut_ptr(),

105+

in("x3") &mut vm.ret.index as *mut _,

106+

in("x4") (*vm.ram).as_mut_ptr(),

107+

in("x5") pc,

108+

in("x6") vm as *mut _,

109+

in("x7") &mut h as *mut _,

110+

in("x8") JUMP_TABLE.as_ptr(),

111+

);

112+

}

113+

r as u16

122114

}

123115116+

core::arch::global_asm!(include_str!("aarch64.s"));

117+124118

// Helper macro to generate opcode tables

125119

macro_rules! opcodes {

126120

($($op:ident),+ $(,)?) => {

Read the original on github.com ↗