@@ -747,22 +747,56 @@ impl<'store, 'stack> Executor<'store, 'stack> {
747747
748748 #[ inline( always) ]
749749 fn enter_block ( & mut self , instr_ptr : usize , end_instr_offset : u32 , ty : BlockType , args : BlockArgs ) {
750- let ( params, results) = match args {
751- BlockArgs :: Empty => ( 0 , 0 ) ,
752- BlockArgs :: Type ( _) => ( 0 , 1 ) ,
753- BlockArgs :: FuncType ( t) => {
754- let ty = self . module . func_ty ( t) ;
755- ( ty. params . len ( ) as u8 , ty. results . len ( ) as u8 )
756- }
750+ #[ cfg( not( feature = "simd" ) ) ]
751+ {
752+ let ( params, results) = match args {
753+ BlockArgs :: Empty => ( 0 , 0 ) ,
754+ BlockArgs :: Type ( _) => ( 0 , 1 ) ,
755+ BlockArgs :: FuncType ( t) => {
756+ let ty = self . module . func_ty ( t) ;
757+ ( ty. params . len ( ) as u8 , ty. results . len ( ) as u8 )
758+ }
759+ } ;
760+
761+ self . stack . blocks . push ( BlockFrame {
762+ instr_ptr,
763+ end_instr_offset,
764+ stack_ptr : self . stack . values . len ( ) as u32 - params as u32 ,
765+ results,
766+ params,
767+ ty,
768+ } ) ;
757769 } ;
758770
759- self . stack . blocks . push ( BlockFrame {
760- instr_ptr,
761- end_instr_offset,
762- stack_ptr : self . stack . values . len ( ) as u32 - params as u32 ,
763- results,
764- params,
765- ty,
766- } ) ;
771+ #[ cfg( feature = "simd" ) ]
772+ {
773+ let ( params, results, simd_params, simd_results) = match args {
774+ BlockArgs :: Empty => ( 0 , 0 , 0 , 0 ) ,
775+ BlockArgs :: Type ( t) => match t {
776+ ValType :: V128 => ( 0 , 0 , 0 , 1 ) ,
777+ _ => ( 0 , 1 , 0 , 0 ) ,
778+ } ,
779+ BlockArgs :: FuncType ( t) => {
780+ let ty = self . module . func_ty ( t) ;
781+ let simd_params = ty. params . iter ( ) . filter ( |t| t. is_simd ( ) ) . count ( ) as u8 ;
782+ let params = ty. params . len ( ) as u8 - simd_params;
783+ let simd_results = ty. results . iter ( ) . filter ( |t| t. is_simd ( ) ) . count ( ) as u8 ;
784+ let results = ty. results . len ( ) as u8 - simd_results;
785+ ( params, results, simd_params, simd_results)
786+ }
787+ } ;
788+
789+ self . stack . blocks . push ( BlockFrame {
790+ instr_ptr,
791+ end_instr_offset,
792+ stack_ptr : self . stack . values . len ( ) as u32 - params as u32 ,
793+ simd_stack_ptr : self . stack . values . simd_len ( ) as u32 - simd_params as u32 ,
794+ results,
795+ simd_params,
796+ simd_results,
797+ params,
798+ ty,
799+ } ) ;
800+ } ;
767801 }
768802}
0 commit comments