]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Extend SF patch #707257: Improve code generation
authorRaymond Hettinger <python@rcn.com>
Tue, 15 Apr 2003 10:35:07 +0000 (10:35 +0000)
committerRaymond Hettinger <python@rcn.com>
Tue, 15 Apr 2003 10:35:07 +0000 (10:35 +0000)
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.

Python/compile.c

index 3786cd91c585c1912c1973d5c65cf6a480c99f15..57f0edb8f9c0edeabcc2a3119647668e4054c8ca 100644 (file)
@@ -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: