Kaydet (Commit) da9c5134 authored tarafından Serhiy Storchaka's avatar Serhiy Storchaka

Issue #27255: Added more predictions in ceval.c.

üst 61d1e999
...@@ -1000,8 +1000,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) ...@@ -1000,8 +1000,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
/* OpCode prediction macros /* OpCode prediction macros
Some opcodes tend to come in pairs thus making it possible to Some opcodes tend to come in pairs thus making it possible to
predict the second code when the first is run. For example, predict the second code when the first is run. For example,
COMPARE_OP is often followed by JUMP_IF_FALSE or JUMP_IF_TRUE. And, COMPARE_OP is often followed by POP_JUMP_IF_FALSE or POP_JUMP_IF_TRUE.
those opcodes are often followed by a POP_TOP.
Verifying the prediction costs a single high-speed test of a register Verifying the prediction costs a single high-speed test of a register
variable against a constant. If the pairing was good, then the variable against a constant. If the pairing was good, then the
...@@ -1379,6 +1378,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) ...@@ -1379,6 +1378,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
FAST_DISPATCH(); FAST_DISPATCH();
} }
PREDICTED(LOAD_CONST);
TARGET(LOAD_CONST) { TARGET(LOAD_CONST) {
PyObject *value = GETITEM(consts, oparg); PyObject *value = GETITEM(consts, oparg);
Py_INCREF(value); Py_INCREF(value);
...@@ -2008,6 +2008,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) ...@@ -2008,6 +2008,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
} }
SET_TOP(awaitable); SET_TOP(awaitable);
PREDICT(LOAD_CONST);
DISPATCH(); DISPATCH();
} }
...@@ -2050,9 +2051,11 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) ...@@ -2050,9 +2051,11 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
Py_DECREF(next_iter); Py_DECREF(next_iter);
PUSH(awaitable); PUSH(awaitable);
PREDICT(LOAD_CONST);
DISPATCH(); DISPATCH();
} }
PREDICTED(GET_AWAITABLE);
TARGET(GET_AWAITABLE) { TARGET(GET_AWAITABLE) {
PyObject *iterable = TOP(); PyObject *iterable = TOP();
PyObject *iter = _PyCoro_GetAwaitableIter(iterable); PyObject *iter = _PyCoro_GetAwaitableIter(iterable);
...@@ -2080,6 +2083,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) ...@@ -2080,6 +2083,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
goto error; goto error;
} }
PREDICT(LOAD_CONST);
DISPATCH(); DISPATCH();
} }
...@@ -2135,6 +2139,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) ...@@ -2135,6 +2139,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
DISPATCH(); DISPATCH();
} }
PREDICTED(POP_BLOCK);
TARGET(POP_BLOCK) { TARGET(POP_BLOCK) {
PyTryBlock *b = PyFrame_BlockPop(f); PyTryBlock *b = PyFrame_BlockPop(f);
UNWIND_BLOCK(b); UNWIND_BLOCK(b);
...@@ -3015,6 +3020,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) ...@@ -3015,6 +3020,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
if (iter == NULL) if (iter == NULL)
goto error; goto error;
PREDICT(FOR_ITER); PREDICT(FOR_ITER);
PREDICT(CALL_FUNCTION);
DISPATCH(); DISPATCH();
} }
...@@ -3043,6 +3049,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) ...@@ -3043,6 +3049,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
if (iter == NULL) if (iter == NULL)
goto error; goto error;
} }
PREDICT(LOAD_CONST);
DISPATCH(); DISPATCH();
} }
...@@ -3068,6 +3075,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) ...@@ -3068,6 +3075,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
STACKADJ(-1); STACKADJ(-1);
Py_DECREF(iter); Py_DECREF(iter);
JUMPBY(oparg); JUMPBY(oparg);
PREDICT(POP_BLOCK);
DISPATCH(); DISPATCH();
} }
...@@ -3117,6 +3125,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) ...@@ -3117,6 +3125,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
if (res == NULL) if (res == NULL)
goto error; goto error;
PUSH(res); PUSH(res);
PREDICT(GET_AWAITABLE);
DISPATCH(); DISPATCH();
} }
...@@ -3265,6 +3274,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) ...@@ -3265,6 +3274,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
DISPATCH(); DISPATCH();
} }
PREDICTED(CALL_FUNCTION);
TARGET(CALL_FUNCTION) { TARGET(CALL_FUNCTION) {
PyObject **sp, *res; PyObject **sp, *res;
PCALL(PCALL_ALL); PCALL(PCALL_ALL);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment