summaryrefslogtreecommitdiffstats
path: root/Python/ceval.c
diff options
context:
space:
mode:
authorDennis Sweeney <36520290+sweeneyde@users.noreply.github.com>2021-10-14 14:56:33 (GMT)
committerGitHub <noreply@github.com>2021-10-14 14:56:33 (GMT)
commit3b3d30e8f78271a488965c9cd11136e1aa890757 (patch)
tree34670d2b9ba58a187d5b777fd77523720056e334 /Python/ceval.c
parentc96d1546b11b4c282a7e21737cb1f5d16349656d (diff)
downloadcpython-3b3d30e8f78271a488965c9cd11136e1aa890757.zip
cpython-3b3d30e8f78271a488965c9cd11136e1aa890757.tar.gz
cpython-3b3d30e8f78271a488965c9cd11136e1aa890757.tar.bz2
bpo-45367: Specialize BINARY_MULTIPLY (GH-28727)
Diffstat (limited to 'Python/ceval.c')
-rw-r--r--Python/ceval.c62
1 files changed, 61 insertions, 1 deletions
diff --git a/Python/ceval.c b/Python/ceval.c
index aef83b9..de71ae5 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -1933,14 +1933,73 @@ check_eval_breaker:
}
TARGET(BINARY_MULTIPLY) {
+ PREDICTED(BINARY_MULTIPLY);
+ STAT_INC(BINARY_MULTIPLY, unquickened);
PyObject *right = POP();
PyObject *left = TOP();
PyObject *res = PyNumber_Multiply(left, right);
Py_DECREF(left);
Py_DECREF(right);
SET_TOP(res);
- if (res == NULL)
+ if (res == NULL) {
goto error;
+ }
+ DISPATCH();
+ }
+
+ TARGET(BINARY_MULTIPLY_ADAPTIVE) {
+ if (oparg == 0) {
+ PyObject *left = SECOND();
+ PyObject *right = TOP();
+ next_instr--;
+ if (_Py_Specialize_BinaryMultiply(left, right, next_instr) < 0) {
+ goto error;
+ }
+ DISPATCH();
+ }
+ else {
+ STAT_INC(BINARY_MULTIPLY, deferred);
+ UPDATE_PREV_INSTR_OPARG(next_instr, oparg - 1);
+ STAT_DEC(BINARY_MULTIPLY, unquickened);
+ JUMP_TO_INSTRUCTION(BINARY_MULTIPLY);
+ }
+ }
+
+ TARGET(BINARY_MULTIPLY_INT) {
+ PyObject *left = SECOND();
+ PyObject *right = TOP();
+ DEOPT_IF(!PyLong_CheckExact(left), BINARY_MULTIPLY);
+ DEOPT_IF(!PyLong_CheckExact(right), BINARY_MULTIPLY);
+ STAT_INC(BINARY_MULTIPLY, hit);
+ record_hit_inline(next_instr, oparg);
+ PyObject *prod = _PyLong_Multiply((PyLongObject *)left, (PyLongObject *)right);
+ SET_SECOND(prod);
+ Py_DECREF(right);
+ Py_DECREF(left);
+ STACK_SHRINK(1);
+ if (prod == NULL) {
+ goto error;
+ }
+ DISPATCH();
+ }
+
+ TARGET(BINARY_MULTIPLY_FLOAT) {
+ PyObject *left = SECOND();
+ PyObject *right = TOP();
+ DEOPT_IF(!PyFloat_CheckExact(left), BINARY_MULTIPLY);
+ DEOPT_IF(!PyFloat_CheckExact(right), BINARY_MULTIPLY);
+ STAT_INC(BINARY_MULTIPLY, hit);
+ record_hit_inline(next_instr, oparg);
+ double dprod = ((PyFloatObject *)left)->ob_fval *
+ ((PyFloatObject *)right)->ob_fval;
+ PyObject *prod = PyFloat_FromDouble(dprod);
+ SET_SECOND(prod);
+ Py_DECREF(right);
+ Py_DECREF(left);
+ STACK_SHRINK(1);
+ if (prod == NULL) {
+ goto error;
+ }
DISPATCH();
}
@@ -4954,6 +5013,7 @@ MISS_WITH_CACHE(LOAD_GLOBAL)
MISS_WITH_CACHE(LOAD_METHOD)
MISS_WITH_OPARG_COUNTER(BINARY_SUBSCR)
MISS_WITH_OPARG_COUNTER(BINARY_ADD)
+MISS_WITH_OPARG_COUNTER(BINARY_MULTIPLY)
binary_subscr_dict_error:
{