summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
authorRaymond Hettinger <python@rcn.com>2003-03-16 20:14:44 (GMT)
committerRaymond Hettinger <python@rcn.com>2003-03-16 20:14:44 (GMT)
commit7dc52212aa022e7417d3fc32422db646b8a881a0 (patch)
treed5c79e41e9b65b1c0b10760ceec3f1a8a6945934 /Python
parentac2072920dd9bad7734dfff20ff6515ace7ab1e9 (diff)
downloadcpython-7dc52212aa022e7417d3fc32422db646b8a881a0.zip
cpython-7dc52212aa022e7417d3fc32422db646b8a881a0.tar.gz
cpython-7dc52212aa022e7417d3fc32422db646b8a881a0.tar.bz2
Eliminate data dependency in predict macro.
Added two predictions: GET_ITER --> FOR_ITER FOR_ITER --> STORE_FAST or UNPACK_SEQUENCE Improves timings on pybench and timeit.py. Pystone results are neutral.
Diffstat (limited to 'Python')
-rw-r--r--Python/ceval.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/Python/ceval.c b/Python/ceval.c
index 38edb73..f965d38 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -620,8 +620,8 @@ eval_frame(PyFrameObject *f)
#define PREDICT(op) if (*next_instr == op) goto PRED_##op
#define PREDICTED(op) PRED_##op: next_instr++
-#define PREDICTED_WITH_ARG(op) PRED_##op: oparg = (next_instr += 3, \
- (next_instr[-1]<<8) + next_instr[-2])
+#define PREDICTED_WITH_ARG(op) PRED_##op: oparg = (next_instr[2]<<8) + \
+ next_instr[1]; next_instr += 3
/* Stack manipulation macros */
@@ -889,6 +889,7 @@ eval_frame(PyFrameObject *f)
PUSH(x);
goto fast_next_opcode;
+ PREDICTED_WITH_ARG(STORE_FAST);
case STORE_FAST:
v = POP();
SETLOCAL(oparg, v);
@@ -1675,6 +1676,7 @@ eval_frame(PyFrameObject *f)
NAME_ERROR_MSG ,w);
break;
+ PREDICTED_WITH_ARG(UNPACK_SEQUENCE);
case UNPACK_SEQUENCE:
v = POP();
if (PyTuple_CheckExact(v)) {
@@ -2051,17 +2053,21 @@ eval_frame(PyFrameObject *f)
Py_DECREF(v);
if (x != NULL) {
SET_TOP(x);
+ PREDICT(FOR_ITER);
continue;
}
STACKADJ(-1);
break;
+ PREDICTED_WITH_ARG(FOR_ITER);
case FOR_ITER:
/* before: [iter]; after: [iter, iter()] *or* [] */
v = TOP();
x = PyIter_Next(v);
if (x != NULL) {
PUSH(x);
+ PREDICT(STORE_FAST);
+ PREDICT(UNPACK_SEQUENCE);
continue;
}
if (!PyErr_Occurred()) {