@@ -6,7 +6,10 @@ use openvm_stark_backend::p3_field::PrimeField32;
66use super :: { common:: * , AotInstance , AsmRunFn } ;
77use crate :: {
88 arch:: {
9- aot:: { asm_to_lib, extern_handler, get_vm_address_space_addr, get_vm_pc_ptr, set_pc_shim} ,
9+ aot:: {
10+ asm_to_lib, extern_handler, get_vm_address_space_addr, get_vm_pc_ptr,
11+ set_instret_left_shim, set_pc_shim,
12+ } ,
1013 execution_mode:: ExecutionCtx ,
1114 interpreter:: {
1215 alloc_pre_compute_buf, get_pre_compute_instructions, get_pre_compute_max_size,
@@ -112,6 +115,7 @@ where
112115 format ! ( "{:p}" , extern_handler:: <F , ExecutionCtx , true > as * const ( ) ) ;
113116 let set_pc_ptr = format ! ( "{:p}" , set_pc_shim:: <F , ExecutionCtx > as * const ( ) ) ;
114117 let pre_compute_insns_ptr = format ! ( "{:p}" , pre_compute_insns_ptr as * const ( ) ) ;
118+ let instret_left_ptr = format ! ( "{:p}" , set_instret_left_shim:: <F > as * const ( ) ) ;
115119
116120 for ( pc, instruction, _) in exe. program . enumerate_by_pc ( ) {
117121 /* Preprocessing step, to check if we should suspend or not */
@@ -129,6 +133,11 @@ where
129133 asm_str += & Self :: push_address_space_start ( ) ;
130134 asm_str += & Self :: push_internal_registers ( ) ;
131135
136+ asm_str += & format ! ( " mov {REG_FIRST_ARG}, {REG_EXEC_STATE_PTR}\n " ) ;
137+ asm_str += & format ! ( " mov {REG_SECOND_ARG}, {REG_INSTRET_END}\n " ) ;
138+ asm_str += & format ! ( " mov {REG_D}, {instret_left_ptr}\n " ) ;
139+ asm_str += & format ! ( " call {REG_D}\n " ) ;
140+
132141 asm_str += & format ! ( " mov {REG_FIRST_ARG}, {REG_EXEC_STATE_PTR}\n " ) ;
133142 asm_str += & format ! ( " mov {REG_SECOND_ARG}, {pre_compute_insns_ptr}\n " ) ;
134143 asm_str += & format ! ( " mov {REG_THIRD_ARG}, {pc}\n " ) ;
@@ -199,6 +208,10 @@ where
199208 // asm_run_end part
200209 for ( pc, _instruction, _) in exe. program . enumerate_by_pc ( ) {
201210 asm_str += & format ! ( "asm_run_end_{pc}:\n " ) ;
211+ asm_str += & format ! ( " mov {REG_FIRST_ARG}, {REG_EXEC_STATE_PTR}\n " ) ;
212+ asm_str += & format ! ( " mov {REG_SECOND_ARG}, {REG_INSTRET_END}\n " ) ;
213+ asm_str += & format ! ( " mov {REG_D}, {instret_left_ptr}\n " ) ;
214+ asm_str += & format ! ( " call {REG_D}\n " ) ;
202215 asm_str += & Self :: xmm_to_rv32_regs ( ) ;
203216 asm_str += & format ! ( " mov {REG_FIRST_ARG}, rbx\n " ) ;
204217 asm_str += & format ! ( " mov {REG_SECOND_ARG}, {pc}\n " ) ;
0 commit comments