8000 gh-100239: specialize bitwose logical binary ops · iritkatriel/cpython@7a6319b · GitHub
[go: up one dir, main page]

Skip to content

Commit 7a6319b

Browse files
committed
pythongh-100239: specialize bitwose logical binary ops
1 parent 211f413 commit 7a6319b

File tree

1 file changed

+36
-0
lines changed

1 file changed

+36
-0
lines changed

Python/specialize.c

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2414,6 +2414,35 @@ binary_op_fail_kind(int oparg, PyObject *lhs, PyObject *rhs)
24142414

24152415
/** Binary Op Specialization Extensions */
24162416

2417+
/* long-long */
2418+
2419+
static inline int
2420+
is_nonnegative_compactlong(PyObject *v)
2421+
{
2422+
return PyLong_CheckExact(v) &&
2423+
(!_PyLong_IsNegative((PyLongObject *)v)) &&
2424+
_PyLong_IsCompact((PyLongObject *)v);
2425+
}
2426+
2427+
static int
2428+
nonnegative_compactlongs_guard(PyObject *lhs, PyObject *rhs)
2429+
{
2430+
return (is_nonnegative_compactlong(lhs) && is_nonnegative_compactlong(rhs));
2431+
}
2432+
2433+
#define NONNEGATIVE_LONGS_ACTION(NAME, OP) \
2434+
static PyObject * \
2435+
(NAME)(PyObject *lhs, PyObject *rhs) \
2436+
{ \
2437+
Py_ssize_t rhs_val = _PyLong_CompactValue((PyLongObject *)rhs); \
2438+
Py_ssize_t lhs_val = _PyLong_CompactValue((PyLongObject *)lhs); \
2439+
return PyLong_FromLong(lhs_val OP rhs_val); \
2440+
}
2441+
NONNEGATIVE_LONGS_ACTION(nonnegative_compactlongs_or, |)
2442+
NONNEGATIVE_LONGS_ACTION(nonnegative_compactlongs_and, &)
2443+
NONNEGATIVE_LONGS_ACTION(nonnegative_compactlongs_xor, ^)
2444+
#undef NONNEGATIVE_LONGS_ACTION
2445+
24172446
/* float-long */
24182447

24192448
static int
@@ -2466,6 +2495,12 @@ LONG_FLOAT_ACTION(compactlong_float_multiply, *)
24662495
LONG_FLOAT_ACTION(compactlong_float_true_div, /)
24672496
#undef LONG_FLOAT_ACTION
24682497

2498+
static _PyBinaryOpSpecializationDescr nonnegative_compactlongs_specs[NB_OPARG_LAST+1] = {
2499+
[NB_OR] = {nonnegative_compactlongs_guard, nonnegative_compactlongs_or},
2500+
[NB_AND] = {nonnegative_compactlongs_guard, nonnegative_compactlongs_and},
2501+
[NB_XOR] = {nonnegative_compactlongs_guard, nonnegative_compactlongs_xor},
2502+
};
2503+
24692504
static _PyBinaryOpSpecializationDescr float_compactlong_specs[NB_OPARG_LAST+1] = {
24702505
[NB_ADD] = {float_compactlong_guard, float_compactlong_add},
24712506
[NB_SUBTRACT] = {float_compactlong_guard, float_compactlong_subtract},
@@ -2494,6 +2529,7 @@ binary_op_extended_specialization(PyObject *lhs, PyObject *rhs, int oparg,
24942529

24952530
LOOKUP_SPEC(compactlong_float_specs, oparg);
24962531
LOOKUP_SPEC(float_compactlong_specs, oparg);
2532+
LOOKUP_SPEC(nonnegative_compactlongs_specs, oparg);
24972533
#undef LOOKUP_SPEC
24982534
return 0;
24992535
}

0 commit comments

Comments
 (0)
0