@@ -228,7 +228,8 @@ impl<'store, const BUDGETED: bool> Executor<'store, BUDGETED> {
228228 if !is_non_null { ValueRef :: stack_pop ( & mut self . store . value_stack ) ; }
229229 is_non_null
230230 } ) { return Ok ( None ) } ,
231- BrOnCast ( idx) => { let v = idx. get ( & self . func . data ) ; if self . exec_ref_matches ( v. ref_type ( ) ) == ( v. branch_on_fail != 0 ) { self . cf . instr_ptr = v. target as usize ; return Ok ( None ) ; } } ,
231+ BrOnCast ( idx) => { let v = idx. get ( & self . func . data ) ; if !self . exec_ref_matches ( v. ref_type ( ) ) { self . cf . instr_ptr = v. target as usize ; return Ok ( None ) ; } } ,
232+ BrOnCastFail ( idx) => { let v = idx. get ( & self . func . data ) ; if self . exec_ref_matches ( v. ref_type ( ) ) { self . cf . instr_ptr = v. target as usize ; return Ok ( None ) ; } } ,
232233 JumpIfLocalZero32 ( arg) => if Self :: exec_jump_if ( & mut self . cf , arg. target_ip , |cf| Value32 :: local_get ( & self . store . value_stack , cf, arg. local ) == 0 ) { return Ok ( None ) } ,
233234 JumpIfLocalNonZero32 ( arg) => if Self :: exec_jump_if ( & mut self . cf , arg. target_ip , |cf| Value32 :: local_get ( & self . store . value_stack , cf, arg. local ) != 0 ) { return Ok ( None ) } ,
234235 JumpIfLocalZero64 ( arg) => if Self :: exec_jump_if ( & mut self . cf , arg. target_ip , |cf| Value64 :: local_get ( & self . store . value_stack , cf, arg. local ) == 0 ) { return Ok ( None ) } ,
@@ -286,7 +287,7 @@ impl<'store, const BUDGETED: bool> Executor<'store, BUDGETED> {
286287 AddConst32 ( c) => exec_op ! ( unary i32 => i32 , |v| v. wrapping_add( * c) ) ,
287288 AddConst64 ( idx) => { let c = idx. get ( & self . func . data ) . value ; exec_op ! ( unary i64 => i64 , |v| v. wrapping_add( c) ) ; } ,
288289 IncLocal32 ( arg) => i32:: local_update ( & mut self . store . value_stack , & self . cf , arg. local , |v| v. wrapping_add ( arg. value ) ) ,
289- IncLocal64 ( idx ) => { let v = idx . get ( & self . func . data ) ; i64:: local_update ( & mut self . store . value_stack , & self . cf , v . local , |n| n. wrapping_add ( v. value ) ) ; } ,
290+ IncLocal64 ( packed ) => { let v = packed . index . get ( & self . func . data ) . value ; i64:: local_update ( & mut self . store . value_stack , & self . cf , packed . op , |n| n. wrapping_add ( v) ) ; } ,
290291 I32Add3 => exec_op ! ( ternary i32 => i32 , |a, b, c| a. wrapping_add( b) . wrapping_add( c) ) ,
291292 I64Add3 => exec_op ! ( ternary i64 => i64 , |a, b, c| a. wrapping_add( b) . wrapping_add( c) ) ,
292293 MulAccLocal32 ( acc) => exec_op ! ( binop_acc_local i32 , acc, |a: i32 , b| a. wrapping_mul( b) , |a: i32 , b| a. wrapping_add( b) ) ,
@@ -328,8 +329,8 @@ impl<'store, const BUDGETED: bool> Executor<'store, BUDGETED> {
328329 BinOpStackLocalTee32 ( op, local, dst) => exec_op ! ( binop_stack_local_tee Value32 , exec_binop_32, op, local, dst) ,
329330 BinOpStackLocal128 ( op, local) => exec_op ! ( binop_stack_local Value128 , exec_binop_128, op, local) ,
330331 SetLocalConst32 ( arg) => i32:: local_set ( & mut self . store . value_stack , & self . cf , arg. local , arg. value ) ,
331- SetLocalConst64 ( idx ) => { let v = idx . get ( & self . func . data ) ; i64:: local_set ( & mut self . store . value_stack , & self . cf , v . local , v. value ) ; } ,
332- SetLocalConst128 ( arg ) => Value128 :: local_set ( & mut self . store . value_stack , & self . cf , arg . local , Value128 ( arg . value . get ( & self . func . data ) . value ) ) ,
332+ SetLocalConst64 ( packed ) => { let v = packed . index . get ( & self . func . data ) . value ; i64:: local_set ( & mut self . store . value_stack , & self . cf , packed . op , v) ; } ,
333+ SetLocalConst128 ( packed ) => Value128 :: local_set ( & mut self . store . value_stack , & self . cf , packed . op , Value128 ( packed . index . get ( & self . func . data ) . value ) ) ,
333334 IncMemoryLocal32 ( arg) => self . exec_inc_memory_local :: < i32 , 4 > ( arg. memory_arg_idx . get ( & self . func . data ) , arg. local1 , |v| v. wrapping_add ( 1 ) ) ?,
334335 IncMemoryLocal64 ( arg) => self . exec_inc_memory_local :: < i64 , 8 > ( arg. memory_arg_idx . get ( & self . func . data ) , arg. local1 , |v| v. wrapping_add ( 1 ) ) ?,
335336 StoreLocalLocal32 ( arg) => self . exec_store_local_local :: < u32 , 4 > ( arg. memory_arg_idx . get ( & self . func . data ) , arg. local1 , arg. local2 ) ?,
@@ -355,8 +356,8 @@ impl<'store, const BUDGETED: bool> Executor<'store, BUDGETED> {
355356 LoadLocalSet128 ( arg) => self . exec_load_local :: < Value128 , 16 , _ , true , false > ( arg. memory_arg_idx . get ( & self . func . data ) , arg. local1 , arg. local2 , |v| v) ?,
356357 AndConstTee32 ( arg) => { exec_op ! ( unary i32 => i32 , |v| v & arg. value) ; let value = i32:: stack_peek ( & self . store . value_stack ) ; i32:: local_set ( & mut self . store . value_stack , & self . cf , arg. local , value) ; } ,
357358 SubConstTee32 ( arg) => { exec_op ! ( unary i32 => i32 , |v| v. wrapping_sub( arg. value) ) ; let value = i32:: stack_peek ( & self . store . value_stack ) ; i32:: local_set ( & mut self . store . value_stack , & self . cf , arg. local , value) ; } ,
358- AndConstTee64 ( idx ) => { let v = idx . get ( & self . func . data ) ; exec_op ! ( unary i64 => i64 , |n| n & v. value ) ; let value = i64:: stack_peek ( & self . store . value_stack ) ; i64:: local_set ( & mut self . store . value_stack , & self . cf , v . local , value) ; } ,
359- SubConstTee64 ( idx ) => { let v = idx . get ( & self . func . data ) ; exec_op ! ( unary i64 => i64 , |n| n. wrapping_sub( v. value ) ) ; let value = i64:: stack_peek ( & self . store . value_stack ) ; i64:: local_set ( & mut self . store . value_stack , & self . cf , v . local , value) ; } ,
359+ AndConstTee64 ( packed ) => { let v = packed . index . get ( & self . func . data ) . value ; exec_op ! ( unary i64 => i64 , |n| n & v) ; let value = i64:: stack_peek ( & self . store . value_stack ) ; i64:: local_set ( & mut self . store . value_stack , & self . cf , packed . op , value) ; } ,
360+ SubConstTee64 ( packed ) => { let v = packed . index . get ( & self . func . data ) . value ; exec_op ! ( unary i64 => i64 , |n| n. wrapping_sub( v) ) ; let value = i64:: stack_peek ( & self . store . value_stack ) ; i64:: local_set ( & mut self . store . value_stack , & self . cf , packed . op , value) ; } ,
360361 LocalTee32 ( local_index) => exec_op ! ( local_tee Value32 , local_index) ,
361362 LocalTee64 ( local_index) => exec_op ! ( local_tee Value64 , local_index) ,
362363 LocalTee128 ( local_index) => exec_op ! ( local_tee Value128 , local_index) ,
0 commit comments