Issue #9225: Remove the ROT_FOUR and DUP_TOPX opcode, the latter replaced

by the new (and simpler) DUP_TOP_TWO.  Performance isn't changed, but
our bytecode is a bit simplified.  Patch by Demur Rumed.
This commit is contained in:
Antoine Pitrou 2010-09-04 18:43:52 +00:00
parent ef0e6c3b04
commit 74a69fa662
9 changed files with 31 additions and 62 deletions

View file

@ -1420,50 +1420,21 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
SET_THIRD(v);
FAST_DISPATCH();
TARGET(ROT_FOUR)
u = TOP();
v = SECOND();
w = THIRD();
x = FOURTH();
SET_TOP(v);
SET_SECOND(w);
SET_THIRD(x);
SET_FOURTH(u);
FAST_DISPATCH();
TARGET(DUP_TOP)
v = TOP();
Py_INCREF(v);
PUSH(v);
FAST_DISPATCH();
TARGET(DUP_TOPX)
if (oparg == 2) {
x = TOP();
Py_INCREF(x);
w = SECOND();
Py_INCREF(w);
STACKADJ(2);
SET_TOP(x);
SET_SECOND(w);
FAST_DISPATCH();
} else if (oparg == 3) {
x = TOP();
Py_INCREF(x);
w = SECOND();
Py_INCREF(w);
v = THIRD();
Py_INCREF(v);
STACKADJ(3);
SET_TOP(x);
SET_SECOND(w);
SET_THIRD(v);
FAST_DISPATCH();
}
Py_FatalError("invalid argument to DUP_TOPX"
" (bytecode corruption?)");
/* Never returns, so don't bother to set why. */
break;
TARGET(DUP_TOP_TWO)
x = TOP();
Py_INCREF(x);
w = SECOND();
Py_INCREF(w);
STACKADJ(2);
SET_TOP(x);
SET_SECOND(w);
FAST_DISPATCH();
TARGET(UNARY_POSITIVE)
v = TOP();

View file

@ -680,8 +680,8 @@ opcode_stack_effect(int opcode, int oparg)
return 0;
case DUP_TOP:
return 1;
case ROT_FOUR:
return 0;
case DUP_TOP_TWO:
return 2;
case UNARY_POSITIVE:
case UNARY_NEGATIVE:
@ -782,8 +782,6 @@ opcode_stack_effect(int opcode, int oparg)
return -1;
case DELETE_GLOBAL:
return 0;
case DUP_TOPX:
return oparg;
case LOAD_CONST:
return 1;
case LOAD_NAME:
@ -3404,7 +3402,7 @@ compiler_handle_subscr(struct compiler *c, const char *kind,
return 0;
}
if (ctx == AugLoad) {
ADDOP_I(c, DUP_TOPX, 2);
ADDOP(c, DUP_TOP_TWO);
}
else if (ctx == AugStore) {
ADDOP(c, ROT_THREE);

View file

@ -101,12 +101,14 @@ typedef unsigned short mode_t;
introduce POP_JUMP_IF_FALSE and POP_JUMP_IF_TRUE)
Python 3.2a0: 3160 (add SETUP_WITH)
tag: cpython-32
Python 3.2a1: 3170 (add DUP_TOP_TWO, remove DUP_TOPX and ROT_FOUR)
tag: cpython-32
*/
/* If you change MAGIC, you must change TAG and you must insert the old value
into _PyMagicNumberTags below.
*/
#define MAGIC (3160 | ((long)'\r'<<16) | ((long)'\n'<<24))
#define MAGIC (3170 | ((long)'\r'<<16) | ((long)'\n'<<24))
#define TAG "cpython-32"
#define CACHEDIR "__pycache__"
/* Current magic word and string tag as globals. */

View file

@ -4,7 +4,7 @@ static void *opcode_targets[256] = {
&&TARGET_ROT_TWO,
&&TARGET_ROT_THREE,
&&TARGET_DUP_TOP,
&&TARGET_ROT_FOUR,
&&TARGET_DUP_TOP_TWO,
&&_unknown_opcode,
&&_unknown_opcode,
&&_unknown_opcode,
@ -98,7 +98,7 @@ static void *opcode_targets[256] = {
&&TARGET_DELETE_ATTR,
&&TARGET_STORE_GLOBAL,
&&TARGET_DELETE_GLOBAL,
&&TARGET_DUP_TOPX,
&&_unknown_opcode,
&&TARGET_LOAD_CONST,
&&TARGET_LOAD_NAME,
&&TARGET_BUILD_TUPLE,