@@ -23,7 +23,7 @@ use macros::*;
2323use traits:: * ;
2424
2525impl InterpreterRuntime {
26- #[ inline( always) ] // a small 2-3% performance improvement in some cases
26+ // #[inline(always)] // a small 2-3% performance improvement in some cases
2727 pub ( crate ) fn exec ( & self , store : & mut Store , stack : & mut Stack ) -> Result < ( ) > {
2828 // The current call frame, gets updated inside of exec_one
2929 let mut cf = stack. call_stack . pop ( ) ?;
@@ -388,6 +388,42 @@ fn exec_one(cf: &mut CallFrame, stack: &mut Stack, store: &mut Store, module: &M
388388 }
389389 }
390390
391+ // Bulk memory operations
392+ MemoryCopy ( from, to) => {
393+ let size = stack. values . pop_t :: < i32 > ( ) ?;
394+ let src = stack. values . pop_t :: < i32 > ( ) ?;
395+ let dst = stack. values . pop_t :: < i32 > ( ) ?;
396+
397+ let mem = store. get_mem ( module. resolve_mem_addr ( * from) as usize ) ?;
398+ let mut mem = mem. borrow_mut ( ) ;
399+
400+ if from == to {
401+ // copy within the same memory
402+ mem. copy_within ( dst as usize , src as usize , size as usize ) ?;
403+ } else {
404+ // copy between two memories
405+ let mem2 = store. get_mem ( module. resolve_mem_addr ( * to) as usize ) ?;
406+ let mut mem2 = mem2. borrow_mut ( ) ;
407+ mem2. copy_from_slice ( dst as usize , mem. load ( src as usize , 0 , size as usize ) ?) ?;
408+ }
409+ }
410+
411+ MemoryFill ( addr) => {
412+ let size = stack. values . pop_t :: < i32 > ( ) ?;
413+ let val = stack. values . pop_t :: < i32 > ( ) ?;
414+ let dst = stack. values . pop_t :: < i32 > ( ) ?;
415+
416+ let mem = store. get_mem ( module. resolve_mem_addr ( * addr) as usize ) ?;
417+ let mut mem = mem. borrow_mut ( ) ;
418+ mem. fill ( dst as usize , size as usize , val as u8 ) ?;
419+ }
420+
421+ // MemoryInit(data_index, mem_index) => {}
422+ // DataDrop(data_index) => {
423+ // // let data_idx = module.resolve_data_addr(*data_index);
424+ // // let data = store.get_data(data_idx as usize)?;
425+ // // data.borrow_mut().drop()?;
426+ // }
391427 I32Store ( arg) => mem_store ! ( i32 , arg, stack, store, module) ,
392428 I64Store ( arg) => mem_store ! ( i64 , arg, stack, store, module) ,
393429 F32Store ( arg) => mem_store ! ( f32 , arg, stack, store, module) ,
0 commit comments