@@ -641,67 +641,6 @@ impl InstrEncoder {
641
641
Ok ( ( ) )
642
642
}
643
643
644
- /// Encodes an conditional `return` instruction.
645
- pub fn encode_return_nez (
646
- & mut self ,
647
- stack : & mut ValueStack ,
648
- condition : Reg ,
649
- values : & [ TypedProvider ] ,
650
- fuel_info : FuelInfo ,
651
- ) -> Result < ( ) , Error > {
652
- // Note: We bump fuel unconditionally even if the conditional return is not taken.
653
- // This is very conservative and may lead to more fuel costs than
654
- // actually needed for the computation. We might revisit this decision
655
- // later. An alternative solution would consume fuel during execution
656
- // time only when the return is taken.
657
- let instr = match values {
658
- [ ] => Instruction :: return_nez ( condition) ,
659
- [ TypedProvider :: Register ( reg) ] => Instruction :: return_nez_reg ( condition, * reg) ,
660
- [ TypedProvider :: Const ( value) ] => match value. ty ( ) {
661
- ValType :: I32 => Instruction :: return_nez_imm32 ( condition, i32:: from ( * value) ) ,
662
- ValType :: I64 => match <Const32 < i64 > >:: try_from ( i64:: from ( * value) ) . ok ( ) {
663
- Some ( value) => Instruction :: return_nez_i64imm32 ( condition, value) ,
664
- None => Instruction :: return_nez_reg ( condition, stack. alloc_const ( * value) ?) ,
665
- } ,
666
- ValType :: F32 => Instruction :: return_nez_imm32 ( condition, f32:: from ( * value) ) ,
667
- ValType :: F64 => match <Const32 < f64 > >:: try_from ( f64:: from ( * value) ) . ok ( ) {
668
- Some ( value) => Instruction :: return_nez_f64imm32 ( condition, value) ,
669
- None => Instruction :: return_nez_reg ( condition, stack. alloc_const ( * value) ?) ,
670
- } ,
671
- ValType :: V128 | ValType :: FuncRef | ValType :: ExternRef => {
672
- Instruction :: return_nez_reg ( condition, stack. alloc_const ( * value) ?)
673
- }
674
- } ,
675
- [ v0, v1] => {
676
- let reg0 = stack. provider2reg ( v0) ?;
677
- let reg1 = stack. provider2reg ( v1) ?;
678
- Instruction :: return_nez_reg2_ext ( condition, reg0, reg1)
679
- }
680
- [ v0, v1, rest @ ..] => {
681
- debug_assert ! ( !rest. is_empty( ) ) ;
682
- // Note: The fuel for return values might result in 0 charges if there aren't
683
- // enough return values to account for at least 1 fuel. Therefore we need
684
- // to also bump by `FuelCosts::base` to charge at least 1 fuel.
685
- self . bump_fuel_consumption ( & fuel_info, FuelCostsProvider :: base) ?;
686
- self . bump_fuel_consumption ( & fuel_info, |costs| {
687
- costs. fuel_for_copying_values ( rest. len ( ) as u64 + 3 )
688
- } ) ?;
689
- if let Some ( span) = BoundedRegSpan :: from_providers ( values) {
690
- self . push_instr ( Instruction :: return_nez_span ( condition, span) ) ?;
691
- return Ok ( ( ) ) ;
692
- }
693
- let reg0 = stack. provider2reg ( v0) ?;
694
- let reg1 = stack. provider2reg ( v1) ?;
695
- self . push_instr ( Instruction :: return_nez_many_ext ( condition, reg0, reg1) ) ?;
696
- self . encode_register_list ( stack, rest) ?;
697
- return Ok ( ( ) ) ;
698
- }
699
- } ;
700
- self . bump_fuel_consumption ( & fuel_info, FuelCostsProvider :: base) ?;
701
- self . push_instr ( instr) ?;
702
- Ok ( ( ) )
703
- }
704
-
705
644
/// Encode the given slice of [`TypedProvider`] as a list of [`Reg`].
706
645
///
707
646
/// # Note
0 commit comments