summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRaymond Hettinger <python@rcn.com>2003-04-15 10:35:07 (GMT)
committerRaymond Hettinger <python@rcn.com>2003-04-15 10:35:07 (GMT)
commit255a3d08a189fb6aa4acb16c2168eb396f63df0f (patch)
tree249c73d3837aaf8d8f0a518ceff482f0a55ace65
parent8b7a9a38c66aff5633255b63be639ee8592f180b (diff)
downloadcpython-255a3d08a189fb6aa4acb16c2168eb396f63df0f.zip
cpython-255a3d08a189fb6aa4acb16c2168eb396f63df0f.tar.gz
cpython-255a3d08a189fb6aa4acb16c2168eb396f63df0f.tar.bz2
Extend SF patch #707257: Improve code generation
to cover the case for: "x,y,z=1,2,3". Gives a 30% speed-up. Also, added FOR_ITER to the list of opcodes that can jump.
-rw-r--r--Python/compile.c28
1 files changed, 20 insertions, 8 deletions
diff --git a/Python/compile.c b/Python/compile.c
index 3786cd9..57f0edb 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -364,23 +364,35 @@ optimize_code(PyObject *code, PyObject* consts)
break;
/* Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2 JMP+2.
+ Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2 JMP+1.
Note, these opcodes occur together only in assignment
statements. Accordingly, the unpack opcode is never
a jump target. */
case BUILD_TUPLE:
case BUILD_LIST:
- if (codestr[i+3] != UNPACK_SEQUENCE ||
- GETARG(codestr, i) != 2 ||
- GETARG(codestr, i+3) != 2)
+ if (codestr[i+3] != UNPACK_SEQUENCE)
continue;
- codestr[i] = ROT_TWO;
- codestr[i+1] = JUMP_FORWARD;
- SETARG(codestr, i+1, 2);
- codestr[i+4] = DUP_TOP; /* Filler codes used as NOPs */
- codestr[i+5] = POP_TOP;
+ if (GETARG(codestr, i) == 2 && \
+ GETARG(codestr, i+3) == 2) {
+ codestr[i] = ROT_TWO;
+ codestr[i+1] = JUMP_FORWARD;
+ SETARG(codestr, i+1, 2);
+ codestr[i+4] = DUP_TOP; /* Filler codes used as NOPs */
+ codestr[i+5] = POP_TOP;
+ continue;
+ }
+ if (GETARG(codestr, i) == 3 && \
+ GETARG(codestr, i+3) == 3) {
+ codestr[i] = ROT_THREE;
+ codestr[i+1] = ROT_TWO;
+ codestr[i+2] = JUMP_FORWARD;
+ SETARG(codestr, i+2, 1);
+ codestr[i+5] = DUP_TOP;
+ }
break;
/* Replace jumps to unconditional jumps */
+ case FOR_ITER:
case JUMP_FORWARD:
case JUMP_IF_FALSE:
case JUMP_IF_TRUE: