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

This commit is contained in:
Serhiy Storchaka 2016-06-27 18:58:57 +03:00
parent 61d1e99923
commit da9c513414
1 changed files with 12 additions and 2 deletions

View File

@ -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)
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)
} }
SET_TOP(awaitable); SET_TOP(awaitable);
PREDICT(LOAD_CONST);
DISPATCH(); DISPATCH();
} }
@ -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)
goto error; goto error;
} }
PREDICT(LOAD_CONST);
DISPATCH(); DISPATCH();
} }
@ -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)
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)
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)
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)
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)
DISPATCH(); DISPATCH();
} }
PREDICTED(CALL_FUNCTION);
TARGET(CALL_FUNCTION) { TARGET(CALL_FUNCTION) {
PyObject **sp, *res; PyObject **sp, *res;
PCALL(PCALL_ALL); PCALL(PCALL_ALL);