From 345ba3f080c140dee3102f472bc166c2db191bcc Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Thu, 18 Nov 2021 18:19:58 +0900 Subject: bpo-45510: Specialize BINARY_SUBTRACT (GH-29523) --- Python/ceval.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) (limited to 'Python/ceval.c') 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(); -- cgit v1.2.1