Skip to content

Commit c492437

Browse files
committed
nit
1 parent 6b27e1f commit c492437

File tree

5 files changed

+85
-79
lines changed

5 files changed

+85
-79
lines changed

Include/opcode.h

Lines changed: 37 additions & 38 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Lib/opcode.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -226,8 +226,7 @@ def jabs_op(name, op):
226226
"BINARY_ADD_UNICODE",
227227
"BINARY_ADD_UNICODE_INPLACE_FAST",
228228
"BINARY_SUBTRACT_ADAPTIVE",
229-
"BINARY_SUBTRACT_INT",
230-
"BINARY_SUBTRACT_FLOAT",
229+
"BINARY_SUBTRACT_FAST",
231230
"BINARY_MULTIPLY_ADAPTIVE",
232231
"BINARY_MULTIPLY_INT",
233232
"BINARY_MULTIPLY_FLOAT",

Python/ceval.c

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2203,31 +2203,35 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr
22032203
}
22042204
}
22052205

2206-
TARGET(BINARY_SUBTRACT_INT) {
2206+
TARGET(BINARY_SUBTRACT_FAST) {
22072207
PyObject *left = SECOND();
22082208
PyObject *right = TOP();
2209-
DEOPT_IF(!PyLong_CheckExact(left), BINARY_SUBTRACT);
2210-
DEOPT_IF(!PyLong_CheckExact(right), BINARY_SUBTRACT);
2209+
int same = Py_IS_TYPE(left, Py_TYPE(right));
2210+
DEOPT_IF(!PyFloat_CheckExact(left) && !PyLong_CheckExact(left), BINARY_SUBTRACT);
2211+
DEOPT_IF(!PyFloat_CheckExact(right) && !PyLong_CheckExact(right), BINARY_SUBTRACT);
2212+
PyObject *sub = NULL;
22112213
STAT_INC(BINARY_SUBTRACT, hit);
2212-
PyObject *sub = _PyLong_Subtract((PyLongObject *)left, (PyLongObject *)right);
2213-
SET_SECOND(sub);
2214-
Py_DECREF(right);
2215-
Py_DECREF(left);
2216-
STACK_SHRINK(1);
2217-
if (sub == NULL) {
2218-
goto error;
2214+
if (PyLong_CheckExact(left)) {
2215+
if (same != 0) {
2216+
sub = _PyLong_Subtract((PyLongObject *)left, (PyLongObject *)right);
2217+
}
2218+
else {
2219+
double left_double = PyLong_AsDouble(left);
2220+
double dsub = left_double - ((PyFloatObject *)right)->ob_fval;
2221+
sub = PyFloat_FromDouble(dsub);
2222+
}
2223+
}
2224+
else if (PyFloat_CheckExact(left)) {
2225+
if (same != 0) {
2226+
double dsub = ((PyFloatObject *)left)->ob_fval - ((PyFloatObject *)right)->ob_fval;
2227+
sub = PyFloat_FromDouble(dsub);
2228+
}
2229+
else {
2230+
double right_double = PyLong_AsDouble(right);
2231+
double dsub = ((PyFloatObject *)left)->ob_fval - right_double;
2232+
sub = PyFloat_FromDouble(dsub);
2233+
}
22192234
}
2220-
DISPATCH();
2221-
}
2222-
2223-
TARGET(BINARY_SUBTRACT_FLOAT) {
2224-
PyObject *left = SECOND();
2225-
PyObject *right = TOP();
2226-
DEOPT_IF(!PyFloat_CheckExact(left), BINARY_SUBTRACT);
2227-
DEOPT_IF(!PyFloat_CheckExact(right), BINARY_SUBTRACT);
2228-
STAT_INC(BINARY_SUBTRACT, hit);
2229-
double dsub = ((PyFloatObject *)left)->ob_fval - ((PyFloatObject *)right)->ob_fval;
2230-
PyObject *sub = PyFloat_FromDouble(dsub);
22312235
SET_SECOND(sub);
22322236
Py_DECREF(right);
22332237
Py_DECREF(left);

Python/opcode_targets.h

Lines changed: 15 additions & 15 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Python/specialize.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1260,16 +1260,20 @@ _Py_Specialize_BinaryMultiply(PyObject *left, PyObject *right, _Py_CODEUNIT *ins
12601260
int
12611261
_Py_Specialize_BinarySubtract(PyObject *left, PyObject *right, _Py_CODEUNIT *instr)
12621262
{
1263-
if (!Py_IS_TYPE(left, Py_TYPE(right))) {
1263+
if (!PyLong_CheckExact(left) && !PyFloat_CheckExact(right)) {
1264+
SPECIALIZATION_FAIL(BINARY_SUBTRACT, SPEC_FAIL_DIFFERENT_TYPES);
1265+
goto fail;
1266+
}
1267+
if (!PyLong_CheckExact(right) && !PyFloat_CheckExact(right)) {
12641268
SPECIALIZATION_FAIL(BINARY_SUBTRACT, SPEC_FAIL_DIFFERENT_TYPES);
12651269
goto fail;
12661270
}
12671271
if (PyLong_CheckExact(left)) {
1268-
*instr = _Py_MAKECODEUNIT(BINARY_SUBTRACT_INT, initial_counter_value());
1272+
*instr = _Py_MAKECODEUNIT(BINARY_SUBTRACT_FAST, initial_counter_value());
12691273
goto success;
12701274
}
12711275
else if (PyFloat_CheckExact(left)) {
1272-
*instr = _Py_MAKECODEUNIT(BINARY_SUBTRACT_FLOAT, initial_counter_value());
1276+
*instr = _Py_MAKECODEUNIT(BINARY_SUBTRACT_FAST, initial_counter_value());
12731277
goto success;
12741278
}
12751279
else {

0 commit comments

Comments
 (0)