@@ -387,6 +387,25 @@ impl FuncTranslator {
387387 Ok ( ( ) )
388388 }
389389
390+ /// Pushes the `instr` to the function with the associated `fuel_costs`.
391+ fn push_instr_with_result (
392+ & mut self ,
393+ result_ty : ValType ,
394+ make_instr : impl FnOnce ( Reg ) -> Instruction ,
395+ fuel_costs : impl FnOnce ( & FuelCostsProvider ) -> u64 ,
396+ ) -> Result < ( ) , Error > {
397+ let consume_fuel_instr = self . stack . consume_fuel_instr ( ) ;
398+ let expected_iidx = self . instrs . next_instr ( ) ;
399+ let result = self
400+ . layout
401+ . temp_to_reg ( self . stack . push_temp ( result_ty, Some ( expected_iidx) ) ?) ?;
402+ let actual_iidx =
403+ self . instrs
404+ . push_instr ( make_instr ( result) , consume_fuel_instr, fuel_costs) ?;
405+ assert_eq ! ( expected_iidx, actual_iidx) ;
406+ Ok ( ( ) )
407+ }
408+
390409 /// Encodes a generic return instruction.
391410 fn encode_return ( & mut self , consume_fuel : Option < Instr > ) -> Result < Instr , Error > {
392411 let len_results = self . func_type_with ( FuncType :: len_results) ;
@@ -714,21 +733,12 @@ impl FuncTranslator {
714733 . push_immediate ( consteval ( input. val ( ) . into ( ) ) . into ( ) ) ?;
715734 return Ok ( ( ) ) ;
716735 }
717- let consume_fuel_instr = self . stack . consume_fuel_instr ( ) ;
718736 let input = self . layout . operand_to_reg ( input) ?;
719- let iidx = self . instrs . next_instr ( ) ;
720- let result = self
721- . layout
722- . temp_to_reg ( self . stack . push_temp ( <R as Typed >:: TY , Some ( iidx) ) ?) ?;
723- assert_eq ! (
724- self . instrs. push_instr(
725- make_instr( result, input) ,
726- consume_fuel_instr,
727- FuelCostsProvider :: base
728- ) ?,
729- iidx
730- ) ;
731- Ok ( ( ) )
737+ self . push_instr_with_result (
738+ <R as Typed >:: TY ,
739+ |result| make_instr ( result, input) ,
740+ FuelCostsProvider :: base,
741+ )
732742 }
733743
734744 /// Translates a commutative binary Wasm operator to Wasmi bytecode.
@@ -743,7 +753,6 @@ impl FuncTranslator {
743753 R : Into < TypedVal > + Typed ,
744754 {
745755 bail_unreachable ! ( self ) ;
746- let consume_fuel = self . stack . consume_fuel_instr ( ) ;
747756 match self . stack . pop2 ( ) {
748757 ( Operand :: Immediate ( lhs) , Operand :: Immediate ( rhs) ) => {
749758 let value = consteval ( lhs. val ( ) . into ( ) , rhs. val ( ) . into ( ) ) ;
@@ -752,40 +761,30 @@ impl FuncTranslator {
752761 }
753762 ( val, Operand :: Immediate ( imm) ) | ( Operand :: Immediate ( imm) , val) => {
754763 let lhs = self . layout . operand_to_reg ( val) ?;
755- let iidx = self . instrs . next_instr ( ) ;
756- let result = self
757- . layout
758- . temp_to_reg ( self . stack . push_temp ( <R as Typed >:: TY , Some ( iidx) ) ?) ?;
759- let instr = match T :: from ( imm. val ( ) ) . try_into ( ) {
760- Ok ( rhs) => make_instr_imm16 ( result, lhs, rhs) ,
764+ let rhs16 = match T :: from ( imm. val ( ) ) . try_into ( ) {
765+ Ok ( rhs) => Ok ( rhs) ,
761766 Err ( _) => {
762767 let rhs = self . layout . const_to_reg ( imm. val ( ) ) ?;
763- make_instr ( result , lhs , rhs)
768+ Err ( rhs)
764769 }
765770 } ;
766- assert_eq ! (
767- self . instrs
768- . push_instr( instr, consume_fuel, FuelCostsProvider :: base) ?,
769- iidx
770- ) ;
771- Ok ( ( ) )
771+ self . push_instr_with_result (
772+ <R as Typed >:: TY ,
773+ |result| match rhs16 {
774+ Ok ( rhs) => make_instr_imm16 ( result, lhs, rhs) ,
775+ Err ( rhs) => make_instr ( result, lhs, rhs) ,
776+ } ,
777+ FuelCostsProvider :: base,
778+ )
772779 }
773780 ( lhs, rhs) => {
774781 let lhs = self . layout . operand_to_reg ( lhs) ?;
775782 let rhs = self . layout . operand_to_reg ( rhs) ?;
776- let iidx = self . instrs . next_instr ( ) ;
777- let result = self
778- . layout
779- . temp_to_reg ( self . stack . push_temp ( <R as Typed >:: TY , Some ( iidx) ) ?) ?;
780- assert_eq ! (
781- self . instrs. push_instr(
782- make_instr( result, lhs, rhs) ,
783- consume_fuel,
784- FuelCostsProvider :: base
785- ) ?,
786- iidx
787- ) ;
788- Ok ( ( ) )
783+ self . push_instr_with_result (
784+ <R as Typed >:: TY ,
785+ |result| make_instr ( result, lhs, rhs) ,
786+ FuelCostsProvider :: base,
787+ )
789788 }
790789 }
791790 }
0 commit comments