Skip to content

Commit 7d63316

Browse files
committed
reduce duplication in new opcodes
1 parent 8af7b51 commit 7d63316

File tree

3 files changed

+43
-194
lines changed

3 files changed

+43
-194
lines changed

Python/bytecodes.c

Lines changed: 6 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -793,46 +793,23 @@ dummy_func(
793793
// assignment (+=) on ob_fval, which generates problematic JIT
794794
// stencils on i686-pc-windows-msvc.
795795
tier2 op(_BINARY_OP_ADD_FLOAT_INPLACE, (left, right -- res, l, r)) {
796-
PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
797-
PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
798-
assert(PyFloat_CheckExact(left_o));
799-
assert(PyFloat_CheckExact(right_o));
800-
assert(_PyObject_IsUniquelyReferenced(left_o));
801-
STAT_INC(BINARY_OP, hit);
802-
double dres = ((PyFloatObject *)left_o)->ob_fval + ((PyFloatObject *)right_o)->ob_fval;
803-
((PyFloatObject *)left_o)->ob_fval = dres;
804-
// Transfer ownership of left to res.
805-
// Original left is now dead.
796+
FLOAT_INPLACE_OP(left, right, left, +);
806797
res = left;
807798
l = PyStackRef_NULL;
808799
r = right;
809800
INPUTS_DEAD();
810801
}
811802

812803
tier2 op(_BINARY_OP_SUBTRACT_FLOAT_INPLACE, (left, right -- res, l, r)) {
813-
PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
814-
PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
815-
assert(PyFloat_CheckExact(left_o));
816-
assert(PyFloat_CheckExact(right_o));
817-
assert(_PyObject_IsUniquelyReferenced(left_o));
818-
STAT_INC(BINARY_OP, hit);
819-
double dres = ((PyFloatObject *)left_o)->ob_fval - ((PyFloatObject *)right_o)->ob_fval;
820-
((PyFloatObject *)left_o)->ob_fval = dres;
804+
FLOAT_INPLACE_OP(left, right, left, -);
821805
res = left;
822806
l = PyStackRef_NULL;
823807
r = right;
824808
INPUTS_DEAD();
825809
}
826810

827811
tier2 op(_BINARY_OP_MULTIPLY_FLOAT_INPLACE, (left, right -- res, l, r)) {
828-
PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
829-
PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
830-
assert(PyFloat_CheckExact(left_o));
831-
assert(PyFloat_CheckExact(right_o));
832-
assert(_PyObject_IsUniquelyReferenced(left_o));
833-
STAT_INC(BINARY_OP, hit);
834-
double dres = ((PyFloatObject *)left_o)->ob_fval * ((PyFloatObject *)right_o)->ob_fval;
835-
((PyFloatObject *)left_o)->ob_fval = dres;
812+
FLOAT_INPLACE_OP(left, right, left, *);
836813
res = left;
837814
l = PyStackRef_NULL;
838815
r = right;
@@ -841,44 +818,23 @@ dummy_func(
841818

842819
// Inplace RIGHT variants: mutate the uniquely-referenced right operand.
843820
tier2 op(_BINARY_OP_ADD_FLOAT_INPLACE_RIGHT, (left, right -- res, l, r)) {
844-
PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
845-
PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
846-
assert(PyFloat_CheckExact(left_o));
847-
assert(PyFloat_CheckExact(right_o));
848-
assert(_PyObject_IsUniquelyReferenced(right_o));
849-
STAT_INC(BINARY_OP, hit);
850-
double dres = ((PyFloatObject *)left_o)->ob_fval + ((PyFloatObject *)right_o)->ob_fval;
851-
((PyFloatObject *)right_o)->ob_fval = dres;
821+
FLOAT_INPLACE_OP(left, right, right, +);
852822
res = right;
853823
l = left;
854824
r = PyStackRef_NULL;
855825
INPUTS_DEAD();
856826
}
857827

858828
tier2 op(_BINARY_OP_MULTIPLY_FLOAT_INPLACE_RIGHT, (left, right -- res, l, r)) {
859-
PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
860-
PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
861-
assert(PyFloat_CheckExact(left_o));
862-
assert(PyFloat_CheckExact(right_o));
863-
assert(_PyObject_IsUniquelyReferenced(right_o));
864-
STAT_INC(BINARY_OP, hit);
865-
double dres = ((PyFloatObject *)left_o)->ob_fval * ((PyFloatObject *)right_o)->ob_fval;
866-
((PyFloatObject *)right_o)->ob_fval = dres;
829+
FLOAT_INPLACE_OP(left, right, right, *);
867830
res = right;
868831
l = left;
869832
r = PyStackRef_NULL;
870833
INPUTS_DEAD();
871834
}
872835

873836
tier2 op(_BINARY_OP_SUBTRACT_FLOAT_INPLACE_RIGHT, (left, right -- res, l, r)) {
874-
PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
875-
PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
876-
assert(PyFloat_CheckExact(left_o));
877-
assert(PyFloat_CheckExact(right_o));
878-
assert(_PyObject_IsUniquelyReferenced(right_o));
879-
STAT_INC(BINARY_OP, hit);
880-
double dres = ((PyFloatObject *)left_o)->ob_fval - ((PyFloatObject *)right_o)->ob_fval;
881-
((PyFloatObject *)right_o)->ob_fval = dres;
837+
FLOAT_INPLACE_OP(left, right, right, -);
882838
res = right;
883839
l = left;
884840
r = PyStackRef_NULL;

Python/ceval_macros.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -543,3 +543,22 @@ gen_try_set_executing(PyGenObject *gen)
543543
}
544544
return false;
545545
}
546+
547+
// Macro for inplace float binary ops (tier 2 only).
548+
// Mutates the uniquely-referenced TARGET operand in place.
549+
// TARGET must be either left or right.
550+
#define FLOAT_INPLACE_OP(left, right, TARGET, OP) \
551+
do { \
552+
PyObject *left_o = PyStackRef_AsPyObjectBorrow(left); \
553+
PyObject *right_o = PyStackRef_AsPyObjectBorrow(right); \
554+
assert(PyFloat_CheckExact(left_o)); \
555+
assert(PyFloat_CheckExact(right_o)); \
556+
assert(_PyObject_IsUniquelyReferenced( \
557+
PyStackRef_AsPyObjectBorrow(TARGET))); \
558+
STAT_INC(BINARY_OP, hit); \
559+
double _dres = \
560+
((PyFloatObject *)left_o)->ob_fval \
561+
OP ((PyFloatObject *)right_o)->ob_fval; \
562+
((PyFloatObject *)PyStackRef_AsPyObjectBorrow(TARGET)) \
563+
->ob_fval = _dres; \
564+
} while (0)

0 commit comments

Comments
 (0)