From 74a69fa662fb844ad3c60eb27b09e5fa1e577305 Mon Sep 17 00:00:00 2001 From: Antoine Pitrou Date: Sat, 4 Sep 2010 18:43:52 +0000 Subject: [PATCH] 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. --- Doc/library/dis.rst | 18 ++++++---------- Include/opcode.h | 4 ++-- Lib/opcode.py | 3 +-- Misc/ACKS | 1 + Misc/NEWS | 4 ++++ Python/ceval.c | 47 ++++++++--------------------------------- Python/compile.c | 8 +++---- Python/import.c | 4 +++- Python/opcode_targets.h | 4 ++-- 9 files changed, 31 insertions(+), 62 deletions(-) diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index e5c1c1a6566..a377fc83947 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -184,17 +184,17 @@ The Python compiler currently generates the following bytecode instructions. three. -.. opcode:: ROT_FOUR - - Lifts second, third and forth stack item one position up, moves top down to - position four. - - .. opcode:: DUP_TOP Duplicates the reference on top of the stack. +.. opcode:: DUP_TOP_TWO + + Duplicates the two references on top of the stack, leaving them in the + same order. + + **Unary operations** Unary operations take the top of the stack, apply the operation, and push the @@ -531,12 +531,6 @@ the more significant byte last. are put onto the stack right-to-left. -.. opcode:: DUP_TOPX (count) - - Duplicate *count* items, keeping them in the same order. Due to implementation - limits, *count* should be between 1 and 5 inclusive. - - .. opcode:: STORE_ATTR (namei) Implements ``TOS.name = TOS1``, where *namei* is the index of name in diff --git a/Include/opcode.h b/Include/opcode.h index 7ffa359bca0..1114c9386a8 100644 --- a/Include/opcode.h +++ b/Include/opcode.h @@ -12,7 +12,7 @@ extern "C" { #define ROT_TWO 2 #define ROT_THREE 3 #define DUP_TOP 4 -#define ROT_FOUR 5 +#define DUP_TOP_TWO 5 #define NOP 9 #define UNARY_POSITIVE 10 @@ -83,7 +83,7 @@ extern "C" { #define DELETE_ATTR 96 /* "" */ #define STORE_GLOBAL 97 /* "" */ #define DELETE_GLOBAL 98 /* "" */ -#define DUP_TOPX 99 /* number of items to duplicate */ + #define LOAD_CONST 100 /* Index in const list */ #define LOAD_NAME 101 /* Index in name list */ #define BUILD_TUPLE 102 /* Number of tuple items */ diff --git a/Lib/opcode.py b/Lib/opcode.py index e8cccc32ea1..9833b6ca64c 100644 --- a/Lib/opcode.py +++ b/Lib/opcode.py @@ -48,7 +48,7 @@ def_op('POP_TOP', 1) def_op('ROT_TWO', 2) def_op('ROT_THREE', 3) def_op('DUP_TOP', 4) -def_op('ROT_FOUR', 5) +def_op('DUP_TOP_TWO', 5) def_op('NOP', 9) def_op('UNARY_POSITIVE', 10) @@ -116,7 +116,6 @@ name_op('STORE_ATTR', 95) # Index in name list name_op('DELETE_ATTR', 96) # "" name_op('STORE_GLOBAL', 97) # "" name_op('DELETE_GLOBAL', 98) # "" -def_op('DUP_TOPX', 99) # number of items to duplicate def_op('LOAD_CONST', 100) # Index in const list hasconst.append(100) name_op('LOAD_NAME', 101) # Index in name list diff --git a/Misc/ACKS b/Misc/ACKS index dc0a6346dc0..2c24d2f060c 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -700,6 +700,7 @@ Craig Rowland Clinton Roy Paul Rubin Sam Ruby +Demur Rumed Audun S. Runde Rauli Ruohonen Jeff Rush diff --git a/Misc/NEWS b/Misc/NEWS index d7976bc062e..77e9dd5a3d5 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -12,6 +12,10 @@ What's New in Python 3.2 Alpha 2? Core and Builtins ----------------- +- 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. + - Issue #9766: Rename poorly named variables exposed by _warnings to prevent confusion with the proper variables names from 'warnings' itself. diff --git a/Python/ceval.c b/Python/ceval.c index 4d583a57dee..1f78f95b499 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -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(); diff --git a/Python/compile.c b/Python/compile.c index aae0339c2cf..6963a151a76 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -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); diff --git a/Python/import.c b/Python/import.c index a5277af9382..d6b19e8f975 100644 --- a/Python/import.c +++ b/Python/import.c @@ -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. */ diff --git a/Python/opcode_targets.h b/Python/opcode_targets.h index 20c9f258e49..8b59c2db788 100644 --- a/Python/opcode_targets.h +++ b/Python/opcode_targets.h @@ -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,