mirror of
https://github.com/python/cpython.git
synced 2025-08-30 21:48:47 +00:00
GH-91719: Make MSVC generate somewhat faster switch code (#91718)
Apparently a switch on an 8-bit quantity where all cases are present generates a more efficient jump (doing only one indexed memory load instead of two). So we make opcode and use_tracing uint8_t, and generate a macro full of extra `case NNN:` lines for all unused opcodes. See https://github.com/faster-cpython/ideas/issues/321#issuecomment-1103263673
This commit is contained in:
parent
d44815cabc
commit
f8dc6186d1
4 changed files with 90 additions and 3 deletions
|
@ -1662,7 +1662,9 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int
|
|||
#ifdef Py_STATS
|
||||
int lastopcode = 0;
|
||||
#endif
|
||||
int opcode; /* Current opcode */
|
||||
// opcode is an 8-bit value to improve the code generated by MSVC
|
||||
// for the big switch below (in combination with the EXTRA_CASES macro).
|
||||
uint8_t opcode; /* Current opcode */
|
||||
int oparg; /* Current opcode argument, if any */
|
||||
_Py_atomic_int * const eval_breaker = &tstate->interp->ceval.eval_breaker;
|
||||
|
||||
|
@ -5645,7 +5647,7 @@ handle_eval_breaker:
|
|||
#if USE_COMPUTED_GOTOS
|
||||
_unknown_opcode:
|
||||
#else
|
||||
default:
|
||||
EXTRA_CASES // From opcode.h, a 'case' for each unused opcode
|
||||
#endif
|
||||
fprintf(stderr, "XXX lineno: %d, opcode: %d\n",
|
||||
_PyInterpreterFrame_GetLine(frame), opcode);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue