aboutsummaryrefslogtreecommitdiff
path: root/Python
diff options
context:
space:
mode:
authorDong-hee Na <donghee.na@python.org>2021-11-18 18:19:58 +0900
committerGitHub <noreply@github.com>2021-11-18 09:19:58 +0000
commit345ba3f080c140dee3102f472bc166c2db191bcc (patch)
tree302e16c6c660da6dcb5b5400447c24e90e4f4f2b /Python
parent0920b61a0cb30128287ebafab1df8cad3a3dffdb (diff)
downloadcpython3-345ba3f080c140dee3102f472bc166c2db191bcc.tar.gz
bpo-45510: Specialize BINARY_SUBTRACT (GH-29523)
Diffstat (limited to 'Python')
-rw-r--r--Python/ceval.c35
-rw-r--r--Python/opcode_targets.h24
-rw-r--r--Python/specialize.c13
3 files changed, 60 insertions, 12 deletions
diff --git a/Python/ceval.c b/Python/ceval.c
index c02e3517d4..e579edefdb 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -2009,6 +2009,41 @@ check_eval_breaker:
DISPATCH();
}
+ TARGET(BINARY_OP_SUBTRACT_INT) {
+ PyObject *left = SECOND();
+ PyObject *right = TOP();
+ DEOPT_IF(!PyLong_CheckExact(left), BINARY_OP);
+ DEOPT_IF(!PyLong_CheckExact(right), BINARY_OP);
+ STAT_INC(BINARY_OP, hit);
+ PyObject *sub = _PyLong_Subtract((PyLongObject *)left, (PyLongObject *)right);
+ SET_SECOND(sub);
+ Py_DECREF(right);
+ Py_DECREF(left);
+ STACK_SHRINK(1);
+ if (sub == NULL) {
+ goto error;
+ }
+ DISPATCH();
+ }
+
+ TARGET(BINARY_OP_SUBTRACT_FLOAT) {
+ PyObject *left = SECOND();
+ PyObject *right = TOP();
+ DEOPT_IF(!PyFloat_CheckExact(left), BINARY_OP);
+ DEOPT_IF(!PyFloat_CheckExact(right), BINARY_OP);
+ STAT_INC(BINARY_OP, hit);
+ double dsub = ((PyFloatObject *)left)->ob_fval - ((PyFloatObject *)right)->ob_fval;
+ PyObject *sub = PyFloat_FromDouble(dsub);
+ SET_SECOND(sub);
+ Py_DECREF(right);
+ Py_DECREF(left);
+ STACK_SHRINK(1);
+ if (sub == NULL) {
+ goto error;
+ }
+ DISPATCH();
+ }
+
TARGET(BINARY_OP_ADD_UNICODE) {
PyObject *left = SECOND();
PyObject *right = TOP();
diff --git a/Python/opcode_targets.h b/Python/opcode_targets.h
index a57617e022..07852d167c 100644
--- a/Python/opcode_targets.h
+++ b/Python/opcode_targets.h
@@ -18,25 +18,27 @@ static void *opcode_targets[256] = {
&&TARGET_BINARY_OP_INPLACE_ADD_UNICODE,
&&TARGET_BINARY_OP_MULTIPLY_INT,
&&TARGET_BINARY_OP_MULTIPLY_FLOAT,
+ &&TARGET_BINARY_OP_SUBTRACT_INT,
+ &&TARGET_BINARY_OP_SUBTRACT_FLOAT,
&&TARGET_BINARY_SUBSCR_ADAPTIVE,
&&TARGET_BINARY_SUBSCR_LIST_INT,
&&TARGET_BINARY_SUBSCR_TUPLE_INT,
&&TARGET_BINARY_SUBSCR_DICT,
+ &&TARGET_BINARY_SUBSCR,
&&TARGET_CALL_FUNCTION_ADAPTIVE,
&&TARGET_CALL_FUNCTION_BUILTIN_O,
- &&TARGET_BINARY_SUBSCR,
&&TARGET_CALL_FUNCTION_BUILTIN_FAST,
&&TARGET_CALL_FUNCTION_LEN,
- &&TARGET_CALL_FUNCTION_ISINSTANCE,
- &&TARGET_CALL_FUNCTION_PY_SIMPLE,
&&TARGET_GET_LEN,
&&TARGET_MATCH_MAPPING,
&&TARGET_MATCH_SEQUENCE,
&&TARGET_MATCH_KEYS,
- &&TARGET_JUMP_ABSOLUTE_QUICK,
+ &&TARGET_CALL_FUNCTION_ISINSTANCE,
&&TARGET_PUSH_EXC_INFO,
- &&TARGET_LOAD_ATTR_ADAPTIVE,
+ &&TARGET_CALL_FUNCTION_PY_SIMPLE,
&&TARGET_POP_EXCEPT_AND_RERAISE,
+ &&TARGET_JUMP_ABSOLUTE_QUICK,
+ &&TARGET_LOAD_ATTR_ADAPTIVE,
&&TARGET_LOAD_ATTR_INSTANCE_VALUE,
&&TARGET_LOAD_ATTR_WITH_HINT,
&&TARGET_LOAD_ATTR_SLOT,
@@ -46,27 +48,25 @@ static void *opcode_targets[256] = {
&&TARGET_LOAD_GLOBAL_BUILTIN,
&&TARGET_LOAD_METHOD_ADAPTIVE,
&&TARGET_LOAD_METHOD_CACHED,
- &&TARGET_LOAD_METHOD_CLASS,
- &&TARGET_LOAD_METHOD_MODULE,
&&TARGET_WITH_EXCEPT_START,
&&TARGET_GET_AITER,
&&TARGET_GET_ANEXT,
&&TARGET_BEFORE_ASYNC_WITH,
&&TARGET_BEFORE_WITH,
&&TARGET_END_ASYNC_FOR,
+ &&TARGET_LOAD_METHOD_CLASS,
+ &&TARGET_LOAD_METHOD_MODULE,
&&TARGET_LOAD_METHOD_NO_DICT,
&&TARGET_STORE_ATTR_ADAPTIVE,
&&TARGET_STORE_ATTR_INSTANCE_VALUE,
- &&TARGET_STORE_ATTR_SLOT,
- &&TARGET_STORE_ATTR_WITH_HINT,
&&TARGET_STORE_SUBSCR,
&&TARGET_DELETE_SUBSCR,
+ &&TARGET_STORE_ATTR_SLOT,
+ &&TARGET_STORE_ATTR_WITH_HINT,
&&TARGET_LOAD_FAST__LOAD_FAST,
&&TARGET_STORE_FAST__LOAD_FAST,
&&TARGET_LOAD_FAST__LOAD_CONST,
&&TARGET_LOAD_CONST__LOAD_FAST,
- &&TARGET_STORE_FAST__STORE_FAST,
- &&_unknown_opcode,
&&TARGET_GET_ITER,
&&TARGET_GET_YIELD_FROM_ITER,
&&TARGET_PRINT_EXPR,
@@ -74,7 +74,7 @@ static void *opcode_targets[256] = {
&&TARGET_YIELD_FROM,
&&TARGET_GET_AWAITABLE,
&&TARGET_LOAD_ASSERTION_ERROR,
- &&_unknown_opcode,
+ &&TARGET_STORE_FAST__STORE_FAST,
&&_unknown_opcode,
&&_unknown_opcode,
&&_unknown_opcode,
diff --git a/Python/specialize.c b/Python/specialize.c
index cfc21bf70a..dd15de72d2 100644
--- a/Python/specialize.c
+++ b/Python/specialize.c
@@ -1424,6 +1424,19 @@ _Py_Specialize_BinaryOp(PyObject *lhs, PyObject *rhs, _Py_CODEUNIT *instr,
goto success;
}
break;
+ case NB_SUBTRACT:
+ case NB_INPLACE_SUBTRACT:
+ if (PyLong_CheckExact(lhs)) {
+ *instr = _Py_MAKECODEUNIT(BINARY_OP_SUBTRACT_INT,
+ _Py_OPARG(*instr));
+ goto success;
+ }
+ if (PyFloat_CheckExact(lhs)) {
+ *instr = _Py_MAKECODEUNIT(BINARY_OP_SUBTRACT_FLOAT,
+ _Py_OPARG(*instr));
+ goto success;
+ }
+ break;
default:
// These operators don't have any available specializations. Rather
// than repeatedly attempting to specialize them, just convert them