You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
py, vm: Replace save_ip, save_sp with code_state->{ip, sp}.
This may seem a bit of a risky change, in that it may introduce crazy
bugs with respect to volatile variables in the VM loop. But, I think it
should be fine: code_state points to some external memory, so the
compiler should always read/write to that memory when accessing the
ip/sp variables (ie not put them in registers).
Anyway, it passes all tests and improves on all efficiency fronts: about
2-4% faster (64-bit unix), 16 bytes less stack space per call (64-bit
unix) and slightly less executable size (unix and stmhal).
The reason it's more efficient is save_ip and save_sp were volatile
variables, so were anyway stored on the stack (in memory, not regs).
Thus converting them to code_state->{ip, sp} doesn't cost an extra
memory dereference (except maybe to get code_state, but that can be put
in a register and then made more efficient for other uses of it).
// variables that are visible to the exception handler (declared volatile)
249
249
volatileboolcurrently_in_except_block=MP_TAGPTR_TAG(code_state->exc_sp); // 0 or 1, to detect nested exceptions
250
250
mp_exc_stack_t*volatileexc_sp=MP_TAGPTR_PTR(code_state->exc_sp); // stack grows up, exc_sp points to top of stack
251
-
constbyte*volatilesave_ip=code_state->ip; // this is so we can access ip in the exception handler without making ip volatile (which means the compiler can't keep it in a register in the main loop)
252
-
mp_obj_t*volatilesave_sp=code_state->sp; // this is so we can access sp in the exception handler when needed
0 commit comments