Skip to content

Commit ab9e021

Browse files
committed
gh-100239: specialize mixed int/float inplace binary ops
1 parent 426f99c commit ab9e021

2 files changed

Lines changed: 32 additions & 0 deletions

File tree

Lib/test/test_opcache.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1419,6 +1419,30 @@ def binary_op_add_extend():
14191419
self.assertEqual(c, 2.0)
14201420
c = b / a
14211421
self.assertEqual(c, 0.5)
1422+
c = a
1423+
c += b
1424+
self.assertEqual(c, 9.0)
1425+
c = b
1426+
c += a
1427+
self.assertEqual(c, 9.0)
1428+
c = a
1429+
c -= b
1430+
self.assertEqual(c, 3.0)
1431+
c = b
1432+
c -= a
1433+
self.assertEqual(c, -3.0)
1434+
c = a
1435+
c *= b
1436+
self.assertEqual(c, 18.0)
1437+
c = b
1438+
c *= a
1439+
self.assertEqual(c, 18.0)
1440+
c = a
1441+
c /= b
1442+
self.assertEqual(c, 2.0)
1443+
c = b
1444+
c /= a
1445+
self.assertEqual(c, 0.5)
14221446

14231447
binary_op_add_extend()
14241448
self.assert_specialized(binary_op_add_extend, "BINARY_OP_EXTEND")

Python/specialize.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2278,12 +2278,20 @@ static _PyBinaryOpSpecializationDescr binaryop_extend_descrs[] = {
22782278
{NB_SUBTRACT, float_compactlong_guard, float_compactlong_subtract, &PyFloat_Type, 1, NULL, NULL},
22792279
{NB_TRUE_DIVIDE, nonzero_float_compactlong_guard, float_compactlong_true_div, &PyFloat_Type, 1, NULL, NULL},
22802280
{NB_MULTIPLY, float_compactlong_guard, float_compactlong_multiply, &PyFloat_Type, 1, NULL, NULL},
2281+
{NB_INPLACE_ADD, float_compactlong_guard, float_compactlong_add, &PyFloat_Type, 1, NULL, NULL},
2282+
{NB_INPLACE_SUBTRACT, float_compactlong_guard, float_compactlong_subtract, &PyFloat_Type, 1, NULL, NULL},
2283+
{NB_INPLACE_TRUE_DIVIDE, nonzero_float_compactlong_guard, float_compactlong_true_div, &PyFloat_Type, 1, NULL, NULL},
2284+
{NB_INPLACE_MULTIPLY, float_compactlong_guard, float_compactlong_multiply, &PyFloat_Type, 1, NULL, NULL},
22812285

22822286
/* long-float arithmetic: guards also check NaN and compactness. */
22832287
{NB_ADD, compactlong_float_guard, compactlong_float_add, &PyFloat_Type, 1, NULL, NULL},
22842288
{NB_SUBTRACT, compactlong_float_guard, compactlong_float_subtract, &PyFloat_Type, 1, NULL, NULL},
22852289
{NB_TRUE_DIVIDE, nonzero_compactlong_float_guard, compactlong_float_true_div, &PyFloat_Type, 1, NULL, NULL},
22862290
{NB_MULTIPLY, compactlong_float_guard, compactlong_float_multiply, &PyFloat_Type, 1, NULL, NULL},
2291+
{NB_INPLACE_ADD, compactlong_float_guard, compactlong_float_add, &PyFloat_Type, 1, NULL, NULL},
2292+
{NB_INPLACE_SUBTRACT, compactlong_float_guard, compactlong_float_subtract, &PyFloat_Type, 1, NULL, NULL},
2293+
{NB_INPLACE_TRUE_DIVIDE, nonzero_compactlong_float_guard, compactlong_float_true_div, &PyFloat_Type, 1, NULL, NULL},
2294+
{NB_INPLACE_MULTIPLY, compactlong_float_guard, compactlong_float_multiply, &PyFloat_Type, 1, NULL, NULL},
22872295

22882296
/* list-list concatenation: _PyList_Concat always allocates a new list */
22892297
{NB_ADD, NULL, _PyList_Concat, &PyList_Type, 1, &PyList_Type, &PyList_Type},

0 commit comments

Comments
 (0)