wasmi/engine/executor/instrs/
utils.rs1use super::Executor;
2use crate::{
3 ir::{index::Memory, Offset64Hi, Reg},
4 store::StoreInner,
5};
6
7#[cfg(doc)]
8use crate::ir::Instruction;
9
10macro_rules! impl_unary_executors {
11 ( $( (Instruction::$var_name:ident, $fn_name:ident, $op:expr) ),* $(,)? ) => {
12 $(
13 #[doc = concat!("Executes an [`Instruction::", stringify!($var_name), "`].")]
14 pub fn $fn_name(&mut self, result: Reg, input: Reg) {
15 self.execute_unary(result, input, $op)
16 }
17 )*
18 };
19}
20
21macro_rules! impl_binary_executors {
22 ( $( (Instruction::$var_name:ident, $fn_name:ident, $op:expr) ),* $(,)? ) => {
23 $(
24 #[doc = concat!("Executes an [`Instruction::", stringify!($var_name), "`].")]
25 pub fn $fn_name(&mut self, result: Reg, lhs: Reg, rhs: Reg) {
26 self.execute_binary(result, lhs, rhs, $op)
27 }
28 )*
29 };
30}
31
32impl Executor<'_> {
33 pub fn fetch_value_and_offset_hi(&self) -> (Reg, Offset64Hi) {
35 unsafe { self.fetch_reg_and_offset_hi() }
37 }
38
39 pub fn fetch_default_memory_bytes(&self) -> &[u8] {
41 unsafe { self.cache.memory.data() }
44 }
45
46 pub fn fetch_memory_bytes<'exec, 'store, 'bytes>(
48 &'exec self,
49 memory: Memory,
50 store: &'store StoreInner,
51 ) -> &'bytes [u8]
52 where
53 'exec: 'bytes,
54 'store: 'bytes,
55 {
56 match memory.is_default() {
57 true => self.fetch_default_memory_bytes(),
58 false => self.fetch_non_default_memory_bytes(memory, store),
59 }
60 }
61
62 #[cold]
64 pub fn fetch_non_default_memory_bytes<'exec, 'store, 'bytes>(
65 &'exec self,
66 memory: Memory,
67 store: &'store StoreInner,
68 ) -> &'bytes [u8]
69 where
70 'exec: 'bytes,
71 'store: 'bytes,
72 {
73 let memory = self.get_memory(memory);
74 store.resolve_memory(&memory).data()
75 }
76
77 #[inline]
79 pub fn fetch_default_memory_bytes_mut(&mut self) -> &mut [u8] {
80 unsafe { self.cache.memory.data_mut() }
83 }
84
85 #[inline]
87 pub fn fetch_memory_bytes_mut<'exec, 'store, 'bytes>(
88 &'exec mut self,
89 memory: Memory,
90 store: &'store mut StoreInner,
91 ) -> &'bytes mut [u8]
92 where
93 'exec: 'bytes,
94 'store: 'bytes,
95 {
96 match memory.is_default() {
97 true => self.fetch_default_memory_bytes_mut(),
98 false => self.fetch_non_default_memory_bytes_mut(memory, store),
99 }
100 }
101
102 #[cold]
104 #[inline]
105 pub fn fetch_non_default_memory_bytes_mut<'exec, 'store, 'bytes>(
106 &'exec mut self,
107 memory: Memory,
108 store: &'store mut StoreInner,
109 ) -> &'bytes mut [u8]
110 where
111 'exec: 'bytes,
112 'store: 'bytes,
113 {
114 let memory = self.get_memory(memory);
115 store.resolve_memory_mut(&memory).data_mut()
116 }
117}