@@ -2414,6 +2414,35 @@ binary_op_fail_kind(int oparg, PyObject *lhs, PyObject *rhs)
2414
2414
2415
2415
/** Binary Op Specialization Extensions */
2416
2416
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
+
2417
2446
/* float-long */
2418
2447
2419
2448
static int
@@ -2466,6 +2495,12 @@ LONG_FLOAT_ACTION(compactlong_float_multiply, *)
2466
2495
LONG_FLOAT_ACTION (compactlong_float_true_div , /)
2467
2496
#undef LONG_FLOAT_ACTION
2468
2497
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
+
2469
2504
static _PyBinaryOpSpecializationDescr float_compactlong_specs [NB_OPARG_LAST + 1 ] = {
2470
2505
[NB_ADD ] = {float_compactlong_guard , float_compactlong_add },
2471
2506
[NB_SUBTRACT ] = {float_compactlong_guard , float_compactlong_subtract },
@@ -2494,6 +2529,7 @@ binary_op_extended_specialization(PyObject *lhs, PyObject *rhs, int oparg,
2494
2529
2495
2530
LOOKUP_SPEC (compactlong_float_specs , oparg );
2496
2531
LOOKUP_SPEC (float_compactlong_specs , oparg );
2532
+ LOOKUP_SPEC (nonnegative_compactlongs_specs , oparg );
2497
2533
#undef LOOKUP_SPEC
2498
2534
return 0 ;
2499
2535
}
0 commit comments