7#include "nuitka/prelude.h"
12#if PYTHON_VERSION < 0x300
14static PyObject *_BINARY_OPERATION_SUB_OBJECT_INT_INT(PyObject *operand1, PyObject *operand2) {
15 CHECK_OBJECT(operand1);
16 assert(PyInt_CheckExact(operand1));
17 CHECK_OBJECT(operand2);
18 assert(PyInt_CheckExact(operand2));
25#pragma warning(disable : 4101)
27 NUITKA_MAY_BE_UNUSED
bool cbool_result;
28 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
29 NUITKA_MAY_BE_UNUSED
long clong_result;
30 NUITKA_MAY_BE_UNUSED
double cfloat_result;
35 CHECK_OBJECT(operand1);
36 assert(PyInt_CheckExact(operand1));
37 CHECK_OBJECT(operand2);
38 assert(PyInt_CheckExact(operand2));
40 const long a = PyInt_AS_LONG(operand1);
41 const long b = PyInt_AS_LONG(operand2);
43 const long x = (long)((
unsigned long)a - b);
44 bool no_overflow = ((x ^ a) >= 0 || (x ^ ~b) >= 0);
45 if (likely(no_overflow)) {
47 goto exit_result_ok_clong;
51 PyObject *operand1_object = operand1;
52 PyObject *operand2_object = operand2;
54 PyObject *r = PyLong_Type.tp_as_number->nb_subtract(operand1_object, operand2_object);
55 assert(r != Py_NotImplemented);
58 goto exit_result_object;
62 result = Nuitka_PyInt_FromLong(clong_result);
66 if (unlikely(obj_result == NULL)) {
67 goto exit_result_exception;
79PyObject *BINARY_OPERATION_SUB_OBJECT_INT_INT(PyObject *operand1, PyObject *operand2) {
80 return _BINARY_OPERATION_SUB_OBJECT_INT_INT(operand1, operand2);
84#if PYTHON_VERSION < 0x300
86static HEDLEY_NEVER_INLINE PyObject *__BINARY_OPERATION_SUB_OBJECT_OBJECT_INT(PyObject *operand1, PyObject *operand2) {
87 PyTypeObject *type1 = Py_TYPE(operand1);
91#pragma warning(disable : 4101)
93 NUITKA_MAY_BE_UNUSED
bool cbool_result;
94 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
100 (type1->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type1)) ? type1->tp_as_number->nb_subtract : NULL;
101 binaryfunc slot2 = NULL;
103 if (!(type1 == &PyInt_Type)) {
106 slot2 = PyInt_Type.tp_as_number->nb_subtract;
108 if (slot1 == slot2) {
114 PyObject *x = slot1(operand1, operand2);
116 if (x != Py_NotImplemented) {
118 goto exit_binary_result_object;
121 Py_DECREF_IMMORTAL(x);
125 PyObject *x = slot2(operand1, operand2);
127 if (x != Py_NotImplemented) {
129 goto exit_binary_result_object;
132 Py_DECREF_IMMORTAL(x);
135#if PYTHON_VERSION < 0x300
136 if (!NEW_STYLE_NUMBER_TYPE(type1) || !1) {
138 (type1->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type1)) ? type1->tp_as_number->nb_coerce : NULL;
141 PyObject *coerced1 = operand1;
142 PyObject *coerced2 = operand2;
144 int err = c1(&coerced1, &coerced2);
146 if (unlikely(err < 0)) {
147 goto exit_binary_exception;
151 PyNumberMethods *mv = Py_TYPE(coerced1)->tp_as_number;
153 if (likely(mv == NULL)) {
154 binaryfunc slot = mv->nb_subtract;
156 if (likely(slot != NULL)) {
157 PyObject *x = slot(coerced1, coerced2);
163 goto exit_binary_result_object;
172 coercion c2 = PyInt_Type.tp_as_number->nb_coerce;
175 PyObject *coerced1 = operand1;
176 PyObject *coerced2 = operand2;
178 int err = c2(&coerced2, &coerced1);
180 if (unlikely(err < 0)) {
181 goto exit_binary_exception;
185 PyNumberMethods *mv = Py_TYPE(coerced1)->tp_as_number;
187 if (likely(mv == NULL)) {
188 binaryfunc slot = mv->nb_subtract;
190 if (likely(slot != NULL)) {
191 PyObject *x = slot(coerced1, coerced2);
197 goto exit_binary_result_object;
209 PyErr_Format(PyExc_TypeError,
"unsupported operand type(s) for -: '%s' and 'int'", type1->tp_name);
210 goto exit_binary_exception;
212exit_binary_result_object:
215exit_binary_exception:
218static PyObject *_BINARY_OPERATION_SUB_OBJECT_OBJECT_INT(PyObject *operand1, PyObject *operand2) {
219 CHECK_OBJECT(operand1);
220 CHECK_OBJECT(operand2);
221 assert(PyInt_CheckExact(operand2));
223 PyTypeObject *type1 = Py_TYPE(operand1);
225 if (type1 == &PyInt_Type) {
233#pragma warning(disable : 4101)
235 NUITKA_MAY_BE_UNUSED
bool cbool_result;
236 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
237 NUITKA_MAY_BE_UNUSED
long clong_result;
238 NUITKA_MAY_BE_UNUSED
double cfloat_result;
243 CHECK_OBJECT(operand1);
244 assert(PyInt_CheckExact(operand1));
245 CHECK_OBJECT(operand2);
246 assert(PyInt_CheckExact(operand2));
248 const long a = PyInt_AS_LONG(operand1);
249 const long b = PyInt_AS_LONG(operand2);
251 const long x = (long)((
unsigned long)a - b);
252 bool no_overflow = ((x ^ a) >= 0 || (x ^ ~b) >= 0);
253 if (likely(no_overflow)) {
255 goto exit_result_ok_clong;
259 PyObject *operand1_object = operand1;
260 PyObject *operand2_object = operand2;
262 PyObject *r = PyLong_Type.tp_as_number->nb_subtract(operand1_object, operand2_object);
263 assert(r != Py_NotImplemented);
266 goto exit_result_object;
269 exit_result_ok_clong:
270 result = Nuitka_PyInt_FromLong(clong_result);
274 if (unlikely(obj_result == NULL)) {
275 goto exit_result_exception;
283 exit_result_exception:
287 return __BINARY_OPERATION_SUB_OBJECT_OBJECT_INT(operand1, operand2);
290PyObject *BINARY_OPERATION_SUB_OBJECT_OBJECT_INT(PyObject *operand1, PyObject *operand2) {
291 return _BINARY_OPERATION_SUB_OBJECT_OBJECT_INT(operand1, operand2);
295#if PYTHON_VERSION < 0x300
297static HEDLEY_NEVER_INLINE PyObject *__BINARY_OPERATION_SUB_OBJECT_INT_OBJECT(PyObject *operand1, PyObject *operand2) {
298 PyTypeObject *type2 = Py_TYPE(operand2);
302#pragma warning(disable : 4101)
304 NUITKA_MAY_BE_UNUSED
bool cbool_result;
305 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
310 binaryfunc slot1 = PyInt_Type.tp_as_number->nb_subtract;
311 binaryfunc slot2 = NULL;
313 if (!(&PyInt_Type == type2)) {
316 slot2 = (type2->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type2)) ? type2->tp_as_number->nb_subtract : NULL;
318 if (slot1 == slot2) {
325 if (Nuitka_Type_IsSubtype(type2, &PyInt_Type)) {
326 PyObject *x = slot2(operand1, operand2);
328 if (x != Py_NotImplemented) {
330 goto exit_binary_result_object;
333 Py_DECREF_IMMORTAL(x);
338 PyObject *x = slot1(operand1, operand2);
340 if (x != Py_NotImplemented) {
342 goto exit_binary_result_object;
345 Py_DECREF_IMMORTAL(x);
349 PyObject *x = slot2(operand1, operand2);
351 if (x != Py_NotImplemented) {
353 goto exit_binary_result_object;
356 Py_DECREF_IMMORTAL(x);
359#if PYTHON_VERSION < 0x300
360 if (!1 || !NEW_STYLE_NUMBER_TYPE(type2)) {
361 coercion c1 = PyInt_Type.tp_as_number->nb_coerce;
364 PyObject *coerced1 = operand1;
365 PyObject *coerced2 = operand2;
367 int err = c1(&coerced1, &coerced2);
369 if (unlikely(err < 0)) {
370 goto exit_binary_exception;
374 PyNumberMethods *mv = Py_TYPE(coerced1)->tp_as_number;
376 if (likely(mv == NULL)) {
377 binaryfunc slot = mv->nb_subtract;
379 if (likely(slot != NULL)) {
380 PyObject *x = slot(coerced1, coerced2);
386 goto exit_binary_result_object;
396 (type2->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type2)) ? type2->tp_as_number->nb_coerce : NULL;
399 PyObject *coerced1 = operand1;
400 PyObject *coerced2 = operand2;
402 int err = c2(&coerced2, &coerced1);
404 if (unlikely(err < 0)) {
405 goto exit_binary_exception;
409 PyNumberMethods *mv = Py_TYPE(coerced1)->tp_as_number;
411 if (likely(mv == NULL)) {
412 binaryfunc slot = mv->nb_subtract;
414 if (likely(slot != NULL)) {
415 PyObject *x = slot(coerced1, coerced2);
421 goto exit_binary_result_object;
433 PyErr_Format(PyExc_TypeError,
"unsupported operand type(s) for -: 'int' and '%s'", type2->tp_name);
434 goto exit_binary_exception;
436exit_binary_result_object:
439exit_binary_exception:
442static PyObject *_BINARY_OPERATION_SUB_OBJECT_INT_OBJECT(PyObject *operand1, PyObject *operand2) {
443 CHECK_OBJECT(operand1);
444 assert(PyInt_CheckExact(operand1));
445 CHECK_OBJECT(operand2);
447 PyTypeObject *type2 = Py_TYPE(operand2);
449 if (&PyInt_Type == type2) {
457#pragma warning(disable : 4101)
459 NUITKA_MAY_BE_UNUSED
bool cbool_result;
460 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
461 NUITKA_MAY_BE_UNUSED
long clong_result;
462 NUITKA_MAY_BE_UNUSED
double cfloat_result;
467 CHECK_OBJECT(operand1);
468 assert(PyInt_CheckExact(operand1));
469 CHECK_OBJECT(operand2);
470 assert(PyInt_CheckExact(operand2));
472 const long a = PyInt_AS_LONG(operand1);
473 const long b = PyInt_AS_LONG(operand2);
475 const long x = (long)((
unsigned long)a - b);
476 bool no_overflow = ((x ^ a) >= 0 || (x ^ ~b) >= 0);
477 if (likely(no_overflow)) {
479 goto exit_result_ok_clong;
483 PyObject *operand1_object = operand1;
484 PyObject *operand2_object = operand2;
486 PyObject *r = PyLong_Type.tp_as_number->nb_subtract(operand1_object, operand2_object);
487 assert(r != Py_NotImplemented);
490 goto exit_result_object;
493 exit_result_ok_clong:
494 result = Nuitka_PyInt_FromLong(clong_result);
498 if (unlikely(obj_result == NULL)) {
499 goto exit_result_exception;
507 exit_result_exception:
511 return __BINARY_OPERATION_SUB_OBJECT_INT_OBJECT(operand1, operand2);
514PyObject *BINARY_OPERATION_SUB_OBJECT_INT_OBJECT(PyObject *operand1, PyObject *operand2) {
515 return _BINARY_OPERATION_SUB_OBJECT_INT_OBJECT(operand1, operand2);
520static PyObject *_BINARY_OPERATION_SUB_OBJECT_LONG_LONG(PyObject *operand1, PyObject *operand2) {
521 CHECK_OBJECT(operand1);
522 assert(PyLong_CheckExact(operand1));
523 CHECK_OBJECT(operand2);
524 assert(PyLong_CheckExact(operand2));
531#pragma warning(disable : 4101)
533 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
534 NUITKA_MAY_BE_UNUSED
long clong_result;
539 PyLongObject *operand1_long_object = (PyLongObject *)operand1;
541 PyLongObject *operand2_long_object = (PyLongObject *)operand2;
543 if (Nuitka_LongGetDigitSize(operand1_long_object) <= 1 && Nuitka_LongGetDigitSize(operand2_long_object) <= 1) {
544 long r = (long)(MEDIUM_VALUE(operand1_long_object) - MEDIUM_VALUE(operand2_long_object));
547 goto exit_result_ok_clong;
553 digit
const *a_digits = Nuitka_LongGetDigitPointer(operand1_long_object);
554 Py_ssize_t a_digit_count = Nuitka_LongGetDigitSize(operand1_long_object);
555 bool a_negative = Nuitka_LongIsNegative(operand1_long_object);
556 digit
const *b_digits = Nuitka_LongGetDigitPointer(operand2_long_object);
557 Py_ssize_t b_digit_count = Nuitka_LongGetDigitSize(operand2_long_object);
558 bool b_negative = Nuitka_LongIsNegative(operand2_long_object);
562 z = _Nuitka_LongSubDigits(a_digits, a_digit_count, b_digits, b_digit_count);
564 z = _Nuitka_LongAddDigits(a_digits, a_digit_count, b_digits, b_digit_count);
567 Nuitka_LongFlipSign(z);
570 z = _Nuitka_LongAddDigits(a_digits, a_digit_count, b_digits, b_digit_count);
572 z = _Nuitka_LongSubDigits(a_digits, a_digit_count, b_digits, b_digit_count);
576 obj_result = (PyObject *)z;
577 goto exit_result_object;
581 if (unlikely(obj_result == NULL)) {
582 goto exit_result_exception;
588 result = Nuitka_LongFromCLong(clong_result);
594exit_result_exception:
598PyObject *BINARY_OPERATION_SUB_OBJECT_LONG_LONG(PyObject *operand1, PyObject *operand2) {
599 return _BINARY_OPERATION_SUB_OBJECT_LONG_LONG(operand1, operand2);
603static HEDLEY_NEVER_INLINE PyObject *__BINARY_OPERATION_SUB_OBJECT_OBJECT_LONG(PyObject *operand1, PyObject *operand2) {
604 PyTypeObject *type1 = Py_TYPE(operand1);
608#pragma warning(disable : 4101)
610 NUITKA_MAY_BE_UNUSED
bool cbool_result;
611 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
617 (type1->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type1)) ? type1->tp_as_number->nb_subtract : NULL;
618 binaryfunc slot2 = NULL;
620 if (!(type1 == &PyLong_Type)) {
623 slot2 = PyLong_Type.tp_as_number->nb_subtract;
625 if (slot1 == slot2) {
631 PyObject *x = slot1(operand1, operand2);
633 if (x != Py_NotImplemented) {
635 goto exit_binary_result_object;
638 Py_DECREF_IMMORTAL(x);
642 PyObject *x = slot2(operand1, operand2);
644 if (x != Py_NotImplemented) {
646 goto exit_binary_result_object;
649 Py_DECREF_IMMORTAL(x);
652#if PYTHON_VERSION < 0x300
653 if (!NEW_STYLE_NUMBER_TYPE(type1) || !1) {
655 (type1->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type1)) ? type1->tp_as_number->nb_coerce : NULL;
658 PyObject *coerced1 = operand1;
659 PyObject *coerced2 = operand2;
661 int err = c1(&coerced1, &coerced2);
663 if (unlikely(err < 0)) {
664 goto exit_binary_exception;
668 PyNumberMethods *mv = Py_TYPE(coerced1)->tp_as_number;
670 if (likely(mv == NULL)) {
671 binaryfunc slot = mv->nb_subtract;
673 if (likely(slot != NULL)) {
674 PyObject *x = slot(coerced1, coerced2);
680 goto exit_binary_result_object;
689 coercion c2 = PyLong_Type.tp_as_number->nb_coerce;
692 PyObject *coerced1 = operand1;
693 PyObject *coerced2 = operand2;
695 int err = c2(&coerced2, &coerced1);
697 if (unlikely(err < 0)) {
698 goto exit_binary_exception;
702 PyNumberMethods *mv = Py_TYPE(coerced1)->tp_as_number;
704 if (likely(mv == NULL)) {
705 binaryfunc slot = mv->nb_subtract;
707 if (likely(slot != NULL)) {
708 PyObject *x = slot(coerced1, coerced2);
714 goto exit_binary_result_object;
726#if PYTHON_VERSION < 0x300
727 PyErr_Format(PyExc_TypeError,
"unsupported operand type(s) for -: '%s' and 'long'", type1->tp_name);
729 PyErr_Format(PyExc_TypeError,
"unsupported operand type(s) for -: '%s' and 'int'", type1->tp_name);
731 goto exit_binary_exception;
733exit_binary_result_object:
736exit_binary_exception:
739static PyObject *_BINARY_OPERATION_SUB_OBJECT_OBJECT_LONG(PyObject *operand1, PyObject *operand2) {
740 CHECK_OBJECT(operand1);
741 CHECK_OBJECT(operand2);
742 assert(PyLong_CheckExact(operand2));
744 PyTypeObject *type1 = Py_TYPE(operand1);
746 if (type1 == &PyLong_Type) {
754#pragma warning(disable : 4101)
756 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
757 NUITKA_MAY_BE_UNUSED
long clong_result;
762 PyLongObject *operand1_long_object = (PyLongObject *)operand1;
764 PyLongObject *operand2_long_object = (PyLongObject *)operand2;
766 if (Nuitka_LongGetDigitSize(operand1_long_object) <= 1 && Nuitka_LongGetDigitSize(operand2_long_object) <= 1) {
767 long r = (long)(MEDIUM_VALUE(operand1_long_object) - MEDIUM_VALUE(operand2_long_object));
770 goto exit_result_ok_clong;
776 digit
const *a_digits = Nuitka_LongGetDigitPointer(operand1_long_object);
777 Py_ssize_t a_digit_count = Nuitka_LongGetDigitSize(operand1_long_object);
778 bool a_negative = Nuitka_LongIsNegative(operand1_long_object);
779 digit
const *b_digits = Nuitka_LongGetDigitPointer(operand2_long_object);
780 Py_ssize_t b_digit_count = Nuitka_LongGetDigitSize(operand2_long_object);
781 bool b_negative = Nuitka_LongIsNegative(operand2_long_object);
785 z = _Nuitka_LongSubDigits(a_digits, a_digit_count, b_digits, b_digit_count);
787 z = _Nuitka_LongAddDigits(a_digits, a_digit_count, b_digits, b_digit_count);
790 Nuitka_LongFlipSign(z);
793 z = _Nuitka_LongAddDigits(a_digits, a_digit_count, b_digits, b_digit_count);
795 z = _Nuitka_LongSubDigits(a_digits, a_digit_count, b_digits, b_digit_count);
799 obj_result = (PyObject *)z;
800 goto exit_result_object;
804 if (unlikely(obj_result == NULL)) {
805 goto exit_result_exception;
810 exit_result_ok_clong:
811 result = Nuitka_LongFromCLong(clong_result);
817 exit_result_exception:
821 return __BINARY_OPERATION_SUB_OBJECT_OBJECT_LONG(operand1, operand2);
824PyObject *BINARY_OPERATION_SUB_OBJECT_OBJECT_LONG(PyObject *operand1, PyObject *operand2) {
825 return _BINARY_OPERATION_SUB_OBJECT_OBJECT_LONG(operand1, operand2);
829static HEDLEY_NEVER_INLINE PyObject *__BINARY_OPERATION_SUB_OBJECT_LONG_OBJECT(PyObject *operand1, PyObject *operand2) {
830 PyTypeObject *type2 = Py_TYPE(operand2);
834#pragma warning(disable : 4101)
836 NUITKA_MAY_BE_UNUSED
bool cbool_result;
837 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
842 binaryfunc slot1 = PyLong_Type.tp_as_number->nb_subtract;
843 binaryfunc slot2 = NULL;
845 if (!(&PyLong_Type == type2)) {
848 slot2 = (type2->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type2)) ? type2->tp_as_number->nb_subtract : NULL;
850 if (slot1 == slot2) {
857 if (Nuitka_Type_IsSubtype(type2, &PyLong_Type)) {
858 PyObject *x = slot2(operand1, operand2);
860 if (x != Py_NotImplemented) {
862 goto exit_binary_result_object;
865 Py_DECREF_IMMORTAL(x);
870 PyObject *x = slot1(operand1, operand2);
872 if (x != Py_NotImplemented) {
874 goto exit_binary_result_object;
877 Py_DECREF_IMMORTAL(x);
881 PyObject *x = slot2(operand1, operand2);
883 if (x != Py_NotImplemented) {
885 goto exit_binary_result_object;
888 Py_DECREF_IMMORTAL(x);
891#if PYTHON_VERSION < 0x300
892 if (!1 || !NEW_STYLE_NUMBER_TYPE(type2)) {
893 coercion c1 = PyLong_Type.tp_as_number->nb_coerce;
896 PyObject *coerced1 = operand1;
897 PyObject *coerced2 = operand2;
899 int err = c1(&coerced1, &coerced2);
901 if (unlikely(err < 0)) {
902 goto exit_binary_exception;
906 PyNumberMethods *mv = Py_TYPE(coerced1)->tp_as_number;
908 if (likely(mv == NULL)) {
909 binaryfunc slot = mv->nb_subtract;
911 if (likely(slot != NULL)) {
912 PyObject *x = slot(coerced1, coerced2);
918 goto exit_binary_result_object;
928 (type2->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type2)) ? type2->tp_as_number->nb_coerce : NULL;
931 PyObject *coerced1 = operand1;
932 PyObject *coerced2 = operand2;
934 int err = c2(&coerced2, &coerced1);
936 if (unlikely(err < 0)) {
937 goto exit_binary_exception;
941 PyNumberMethods *mv = Py_TYPE(coerced1)->tp_as_number;
943 if (likely(mv == NULL)) {
944 binaryfunc slot = mv->nb_subtract;
946 if (likely(slot != NULL)) {
947 PyObject *x = slot(coerced1, coerced2);
953 goto exit_binary_result_object;
965#if PYTHON_VERSION < 0x300
966 PyErr_Format(PyExc_TypeError,
"unsupported operand type(s) for -: 'long' and '%s'", type2->tp_name);
968 PyErr_Format(PyExc_TypeError,
"unsupported operand type(s) for -: 'int' and '%s'", type2->tp_name);
970 goto exit_binary_exception;
972exit_binary_result_object:
975exit_binary_exception:
978static PyObject *_BINARY_OPERATION_SUB_OBJECT_LONG_OBJECT(PyObject *operand1, PyObject *operand2) {
979 CHECK_OBJECT(operand1);
980 assert(PyLong_CheckExact(operand1));
981 CHECK_OBJECT(operand2);
983 PyTypeObject *type2 = Py_TYPE(operand2);
985 if (&PyLong_Type == type2) {
993#pragma warning(disable : 4101)
995 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
996 NUITKA_MAY_BE_UNUSED
long clong_result;
1001 PyLongObject *operand1_long_object = (PyLongObject *)operand1;
1003 PyLongObject *operand2_long_object = (PyLongObject *)operand2;
1005 if (Nuitka_LongGetDigitSize(operand1_long_object) <= 1 && Nuitka_LongGetDigitSize(operand2_long_object) <= 1) {
1006 long r = (long)(MEDIUM_VALUE(operand1_long_object) - MEDIUM_VALUE(operand2_long_object));
1009 goto exit_result_ok_clong;
1015 digit
const *a_digits = Nuitka_LongGetDigitPointer(operand1_long_object);
1016 Py_ssize_t a_digit_count = Nuitka_LongGetDigitSize(operand1_long_object);
1017 bool a_negative = Nuitka_LongIsNegative(operand1_long_object);
1018 digit
const *b_digits = Nuitka_LongGetDigitPointer(operand2_long_object);
1019 Py_ssize_t b_digit_count = Nuitka_LongGetDigitSize(operand2_long_object);
1020 bool b_negative = Nuitka_LongIsNegative(operand2_long_object);
1024 z = _Nuitka_LongSubDigits(a_digits, a_digit_count, b_digits, b_digit_count);
1026 z = _Nuitka_LongAddDigits(a_digits, a_digit_count, b_digits, b_digit_count);
1029 Nuitka_LongFlipSign(z);
1032 z = _Nuitka_LongAddDigits(a_digits, a_digit_count, b_digits, b_digit_count);
1034 z = _Nuitka_LongSubDigits(a_digits, a_digit_count, b_digits, b_digit_count);
1038 obj_result = (PyObject *)z;
1039 goto exit_result_object;
1043 if (unlikely(obj_result == NULL)) {
1044 goto exit_result_exception;
1046 result = obj_result;
1047 goto exit_result_ok;
1049 exit_result_ok_clong:
1050 result = Nuitka_LongFromCLong(clong_result);
1051 goto exit_result_ok;
1056 exit_result_exception:
1060 return __BINARY_OPERATION_SUB_OBJECT_LONG_OBJECT(operand1, operand2);
1063PyObject *BINARY_OPERATION_SUB_OBJECT_LONG_OBJECT(PyObject *operand1, PyObject *operand2) {
1064 return _BINARY_OPERATION_SUB_OBJECT_LONG_OBJECT(operand1, operand2);
1068static PyObject *_BINARY_OPERATION_SUB_OBJECT_FLOAT_FLOAT(PyObject *operand1, PyObject *operand2) {
1069 CHECK_OBJECT(operand1);
1070 assert(PyFloat_CheckExact(operand1));
1071 CHECK_OBJECT(operand2);
1072 assert(PyFloat_CheckExact(operand2));
1076#if defined(_MSC_VER)
1077#pragma warning(push)
1078#pragma warning(disable : 4101)
1081 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
1082 NUITKA_MAY_BE_UNUSED
long clong_result;
1083 NUITKA_MAY_BE_UNUSED
double cfloat_result;
1084#if defined(_MSC_VER)
1088 CHECK_OBJECT(operand1);
1089 assert(PyFloat_CheckExact(operand1));
1090 CHECK_OBJECT(operand2);
1091 assert(PyFloat_CheckExact(operand2));
1093 const double a = PyFloat_AS_DOUBLE(operand1);
1094 const double b = PyFloat_AS_DOUBLE(operand2);
1099 goto exit_result_ok_cfloat;
1101exit_result_ok_cfloat:
1102 result = MAKE_FLOAT_FROM_DOUBLE(cfloat_result);
1103 goto exit_result_ok;
1109PyObject *BINARY_OPERATION_SUB_OBJECT_FLOAT_FLOAT(PyObject *operand1, PyObject *operand2) {
1110 return _BINARY_OPERATION_SUB_OBJECT_FLOAT_FLOAT(operand1, operand2);
1114static HEDLEY_NEVER_INLINE PyObject *__BINARY_OPERATION_SUB_OBJECT_OBJECT_FLOAT(PyObject *operand1,
1115 PyObject *operand2) {
1116 PyTypeObject *type1 = Py_TYPE(operand1);
1118#if defined(_MSC_VER)
1119#pragma warning(push)
1120#pragma warning(disable : 4101)
1122 NUITKA_MAY_BE_UNUSED
bool cbool_result;
1123 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
1124#if defined(_MSC_VER)
1129 (type1->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type1)) ? type1->tp_as_number->nb_subtract : NULL;
1130 binaryfunc slot2 = NULL;
1132 if (!(type1 == &PyFloat_Type)) {
1135 slot2 = PyFloat_Type.tp_as_number->nb_subtract;
1137 if (slot1 == slot2) {
1142 if (slot1 != NULL) {
1143 PyObject *x = slot1(operand1, operand2);
1145 if (x != Py_NotImplemented) {
1147 goto exit_binary_result_object;
1150 Py_DECREF_IMMORTAL(x);
1153 if (slot2 != NULL) {
1154 PyObject *x = slot2(operand1, operand2);
1156 if (x != Py_NotImplemented) {
1158 goto exit_binary_result_object;
1161 Py_DECREF_IMMORTAL(x);
1164#if PYTHON_VERSION < 0x300
1165 if (!NEW_STYLE_NUMBER_TYPE(type1) || !1) {
1167 (type1->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type1)) ? type1->tp_as_number->nb_coerce : NULL;
1170 PyObject *coerced1 = operand1;
1171 PyObject *coerced2 = operand2;
1173 int err = c1(&coerced1, &coerced2);
1175 if (unlikely(err < 0)) {
1176 goto exit_binary_exception;
1180 PyNumberMethods *mv = Py_TYPE(coerced1)->tp_as_number;
1182 if (likely(mv == NULL)) {
1183 binaryfunc slot = mv->nb_subtract;
1185 if (likely(slot != NULL)) {
1186 PyObject *x = slot(coerced1, coerced2);
1188 Py_DECREF(coerced1);
1189 Py_DECREF(coerced2);
1192 goto exit_binary_result_object;
1197 Py_DECREF(coerced1);
1198 Py_DECREF(coerced2);
1201 coercion c2 = PyFloat_Type.tp_as_number->nb_coerce;
1204 PyObject *coerced1 = operand1;
1205 PyObject *coerced2 = operand2;
1207 int err = c2(&coerced2, &coerced1);
1209 if (unlikely(err < 0)) {
1210 goto exit_binary_exception;
1214 PyNumberMethods *mv = Py_TYPE(coerced1)->tp_as_number;
1216 if (likely(mv == NULL)) {
1217 binaryfunc slot = mv->nb_subtract;
1219 if (likely(slot != NULL)) {
1220 PyObject *x = slot(coerced1, coerced2);
1222 Py_DECREF(coerced1);
1223 Py_DECREF(coerced2);
1226 goto exit_binary_result_object;
1231 Py_DECREF(coerced1);
1232 Py_DECREF(coerced2);
1238 PyErr_Format(PyExc_TypeError,
"unsupported operand type(s) for -: '%s' and 'float'", type1->tp_name);
1239 goto exit_binary_exception;
1241exit_binary_result_object:
1244exit_binary_exception:
1247static PyObject *_BINARY_OPERATION_SUB_OBJECT_OBJECT_FLOAT(PyObject *operand1, PyObject *operand2) {
1248 CHECK_OBJECT(operand1);
1249 CHECK_OBJECT(operand2);
1250 assert(PyFloat_CheckExact(operand2));
1252 PyTypeObject *type1 = Py_TYPE(operand1);
1254 if (type1 == &PyFloat_Type) {
1259#if defined(_MSC_VER)
1260#pragma warning(push)
1261#pragma warning(disable : 4101)
1264 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
1265 NUITKA_MAY_BE_UNUSED
long clong_result;
1266 NUITKA_MAY_BE_UNUSED
double cfloat_result;
1267#if defined(_MSC_VER)
1271 CHECK_OBJECT(operand1);
1272 assert(PyFloat_CheckExact(operand1));
1273 CHECK_OBJECT(operand2);
1274 assert(PyFloat_CheckExact(operand2));
1276 const double a = PyFloat_AS_DOUBLE(operand1);
1277 const double b = PyFloat_AS_DOUBLE(operand2);
1282 goto exit_result_ok_cfloat;
1284 exit_result_ok_cfloat:
1285 result = MAKE_FLOAT_FROM_DOUBLE(cfloat_result);
1286 goto exit_result_ok;
1292 return __BINARY_OPERATION_SUB_OBJECT_OBJECT_FLOAT(operand1, operand2);
1295PyObject *BINARY_OPERATION_SUB_OBJECT_OBJECT_FLOAT(PyObject *operand1, PyObject *operand2) {
1296 return _BINARY_OPERATION_SUB_OBJECT_OBJECT_FLOAT(operand1, operand2);
1300static HEDLEY_NEVER_INLINE PyObject *__BINARY_OPERATION_SUB_OBJECT_FLOAT_OBJECT(PyObject *operand1,
1301 PyObject *operand2) {
1302 PyTypeObject *type2 = Py_TYPE(operand2);
1304#if defined(_MSC_VER)
1305#pragma warning(push)
1306#pragma warning(disable : 4101)
1308 NUITKA_MAY_BE_UNUSED
bool cbool_result;
1309 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
1310#if defined(_MSC_VER)
1314 binaryfunc slot1 = PyFloat_Type.tp_as_number->nb_subtract;
1315 binaryfunc slot2 = NULL;
1317 if (!(&PyFloat_Type == type2)) {
1320 slot2 = (type2->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type2)) ? type2->tp_as_number->nb_subtract : NULL;
1322 if (slot1 == slot2) {
1327 if (slot1 != NULL) {
1328 if (slot2 != NULL) {
1329 if (Nuitka_Type_IsSubtype(type2, &PyFloat_Type)) {
1330 PyObject *x = slot2(operand1, operand2);
1332 if (x != Py_NotImplemented) {
1334 goto exit_binary_result_object;
1337 Py_DECREF_IMMORTAL(x);
1342 PyObject *x = slot1(operand1, operand2);
1344 if (x != Py_NotImplemented) {
1346 goto exit_binary_result_object;
1349 Py_DECREF_IMMORTAL(x);
1352 if (slot2 != NULL) {
1353 PyObject *x = slot2(operand1, operand2);
1355 if (x != Py_NotImplemented) {
1357 goto exit_binary_result_object;
1360 Py_DECREF_IMMORTAL(x);
1363#if PYTHON_VERSION < 0x300
1364 if (!1 || !NEW_STYLE_NUMBER_TYPE(type2)) {
1365 coercion c1 = PyFloat_Type.tp_as_number->nb_coerce;
1368 PyObject *coerced1 = operand1;
1369 PyObject *coerced2 = operand2;
1371 int err = c1(&coerced1, &coerced2);
1373 if (unlikely(err < 0)) {
1374 goto exit_binary_exception;
1378 PyNumberMethods *mv = Py_TYPE(coerced1)->tp_as_number;
1380 if (likely(mv == NULL)) {
1381 binaryfunc slot = mv->nb_subtract;
1383 if (likely(slot != NULL)) {
1384 PyObject *x = slot(coerced1, coerced2);
1386 Py_DECREF(coerced1);
1387 Py_DECREF(coerced2);
1390 goto exit_binary_result_object;
1395 Py_DECREF(coerced1);
1396 Py_DECREF(coerced2);
1400 (type2->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type2)) ? type2->tp_as_number->nb_coerce : NULL;
1403 PyObject *coerced1 = operand1;
1404 PyObject *coerced2 = operand2;
1406 int err = c2(&coerced2, &coerced1);
1408 if (unlikely(err < 0)) {
1409 goto exit_binary_exception;
1413 PyNumberMethods *mv = Py_TYPE(coerced1)->tp_as_number;
1415 if (likely(mv == NULL)) {
1416 binaryfunc slot = mv->nb_subtract;
1418 if (likely(slot != NULL)) {
1419 PyObject *x = slot(coerced1, coerced2);
1421 Py_DECREF(coerced1);
1422 Py_DECREF(coerced2);
1425 goto exit_binary_result_object;
1430 Py_DECREF(coerced1);
1431 Py_DECREF(coerced2);
1437 PyErr_Format(PyExc_TypeError,
"unsupported operand type(s) for -: 'float' and '%s'", type2->tp_name);
1438 goto exit_binary_exception;
1440exit_binary_result_object:
1443exit_binary_exception:
1446static PyObject *_BINARY_OPERATION_SUB_OBJECT_FLOAT_OBJECT(PyObject *operand1, PyObject *operand2) {
1447 CHECK_OBJECT(operand1);
1448 assert(PyFloat_CheckExact(operand1));
1449 CHECK_OBJECT(operand2);
1451 PyTypeObject *type2 = Py_TYPE(operand2);
1453 if (&PyFloat_Type == type2) {
1458#if defined(_MSC_VER)
1459#pragma warning(push)
1460#pragma warning(disable : 4101)
1463 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
1464 NUITKA_MAY_BE_UNUSED
long clong_result;
1465 NUITKA_MAY_BE_UNUSED
double cfloat_result;
1466#if defined(_MSC_VER)
1470 CHECK_OBJECT(operand1);
1471 assert(PyFloat_CheckExact(operand1));
1472 CHECK_OBJECT(operand2);
1473 assert(PyFloat_CheckExact(operand2));
1475 const double a = PyFloat_AS_DOUBLE(operand1);
1476 const double b = PyFloat_AS_DOUBLE(operand2);
1481 goto exit_result_ok_cfloat;
1483 exit_result_ok_cfloat:
1484 result = MAKE_FLOAT_FROM_DOUBLE(cfloat_result);
1485 goto exit_result_ok;
1491 return __BINARY_OPERATION_SUB_OBJECT_FLOAT_OBJECT(operand1, operand2);
1494PyObject *BINARY_OPERATION_SUB_OBJECT_FLOAT_OBJECT(PyObject *operand1, PyObject *operand2) {
1495 return _BINARY_OPERATION_SUB_OBJECT_FLOAT_OBJECT(operand1, operand2);
1499static PyObject *_BINARY_OPERATION_SUB_OBJECT_FLOAT_LONG(PyObject *operand1, PyObject *operand2) {
1500 CHECK_OBJECT(operand1);
1501 assert(PyFloat_CheckExact(operand1));
1502 CHECK_OBJECT(operand2);
1503 assert(PyLong_CheckExact(operand2));
1505#if defined(_MSC_VER)
1506#pragma warning(push)
1507#pragma warning(disable : 4101)
1509 NUITKA_MAY_BE_UNUSED
bool cbool_result;
1510 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
1511#if defined(_MSC_VER)
1515 binaryfunc slot1 = PyFloat_Type.tp_as_number->nb_subtract;
1518 if (slot1 != NULL) {
1519 PyObject *x = slot1(operand1, operand2);
1521 if (x != Py_NotImplemented) {
1523 goto exit_binary_result_object;
1526 Py_DECREF_IMMORTAL(x);
1531#if PYTHON_VERSION < 0x300
1532 PyErr_Format(PyExc_TypeError,
"unsupported operand type(s) for -: 'float' and 'long'");
1534 PyErr_Format(PyExc_TypeError,
"unsupported operand type(s) for -: 'float' and 'int'");
1536 goto exit_binary_exception;
1538exit_binary_result_object:
1541exit_binary_exception:
1545PyObject *BINARY_OPERATION_SUB_OBJECT_FLOAT_LONG(PyObject *operand1, PyObject *operand2) {
1546 return _BINARY_OPERATION_SUB_OBJECT_FLOAT_LONG(operand1, operand2);
1550static PyObject *_BINARY_OPERATION_SUB_OBJECT_LONG_FLOAT(PyObject *operand1, PyObject *operand2) {
1551 CHECK_OBJECT(operand1);
1552 assert(PyLong_CheckExact(operand1));
1553 CHECK_OBJECT(operand2);
1554 assert(PyFloat_CheckExact(operand2));
1556#if defined(_MSC_VER)
1557#pragma warning(push)
1558#pragma warning(disable : 4101)
1560 NUITKA_MAY_BE_UNUSED
bool cbool_result;
1561 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
1562#if defined(_MSC_VER)
1567 binaryfunc slot2 = NULL;
1572 slot2 = PyFloat_Type.tp_as_number->nb_subtract;
1575 if (slot2 != NULL) {
1576 PyObject *x = slot2(operand1, operand2);
1578 if (x != Py_NotImplemented) {
1580 goto exit_binary_result_object;
1583 Py_DECREF_IMMORTAL(x);
1588#if PYTHON_VERSION < 0x300
1589 PyErr_Format(PyExc_TypeError,
"unsupported operand type(s) for -: 'long' and 'float'");
1591 PyErr_Format(PyExc_TypeError,
"unsupported operand type(s) for -: 'int' and 'float'");
1593 goto exit_binary_exception;
1595exit_binary_result_object:
1598exit_binary_exception:
1602PyObject *BINARY_OPERATION_SUB_OBJECT_LONG_FLOAT(PyObject *operand1, PyObject *operand2) {
1603 return _BINARY_OPERATION_SUB_OBJECT_LONG_FLOAT(operand1, operand2);
1606#if PYTHON_VERSION < 0x300
1608static PyObject *_BINARY_OPERATION_SUB_OBJECT_FLOAT_INT(PyObject *operand1, PyObject *operand2) {
1609 CHECK_OBJECT(operand1);
1610 assert(PyFloat_CheckExact(operand1));
1611 CHECK_OBJECT(operand2);
1612 assert(PyInt_CheckExact(operand2));
1614#if defined(_MSC_VER)
1615#pragma warning(push)
1616#pragma warning(disable : 4101)
1618 NUITKA_MAY_BE_UNUSED
bool cbool_result;
1619 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
1620#if defined(_MSC_VER)
1624 binaryfunc slot1 = PyFloat_Type.tp_as_number->nb_subtract;
1627 if (slot1 != NULL) {
1628 PyObject *x = slot1(operand1, operand2);
1630 if (x != Py_NotImplemented) {
1632 goto exit_binary_result_object;
1635 Py_DECREF_IMMORTAL(x);
1640 PyErr_Format(PyExc_TypeError,
"unsupported operand type(s) for -: 'float' and 'int'");
1641 goto exit_binary_exception;
1643exit_binary_result_object:
1646exit_binary_exception:
1650PyObject *BINARY_OPERATION_SUB_OBJECT_FLOAT_INT(PyObject *operand1, PyObject *operand2) {
1651 return _BINARY_OPERATION_SUB_OBJECT_FLOAT_INT(operand1, operand2);
1655#if PYTHON_VERSION < 0x300
1657static PyObject *_BINARY_OPERATION_SUB_OBJECT_INT_FLOAT(PyObject *operand1, PyObject *operand2) {
1658 CHECK_OBJECT(operand1);
1659 assert(PyInt_CheckExact(operand1));
1660 CHECK_OBJECT(operand2);
1661 assert(PyFloat_CheckExact(operand2));
1663#if defined(_MSC_VER)
1664#pragma warning(push)
1665#pragma warning(disable : 4101)
1667 NUITKA_MAY_BE_UNUSED
bool cbool_result;
1668 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
1669#if defined(_MSC_VER)
1674 binaryfunc slot2 = NULL;
1679 slot2 = PyFloat_Type.tp_as_number->nb_subtract;
1682 if (slot2 != NULL) {
1683 PyObject *x = slot2(operand1, operand2);
1685 if (x != Py_NotImplemented) {
1687 goto exit_binary_result_object;
1690 Py_DECREF_IMMORTAL(x);
1695 PyErr_Format(PyExc_TypeError,
"unsupported operand type(s) for -: 'int' and 'float'");
1696 goto exit_binary_exception;
1698exit_binary_result_object:
1701exit_binary_exception:
1705PyObject *BINARY_OPERATION_SUB_OBJECT_INT_FLOAT(PyObject *operand1, PyObject *operand2) {
1706 return _BINARY_OPERATION_SUB_OBJECT_INT_FLOAT(operand1, operand2);
1710#if PYTHON_VERSION < 0x300
1712static PyObject *_BINARY_OPERATION_SUB_OBJECT_LONG_INT(PyObject *operand1, PyObject *operand2) {
1713 CHECK_OBJECT(operand1);
1714 assert(PyLong_CheckExact(operand1));
1715 CHECK_OBJECT(operand2);
1716 assert(PyInt_CheckExact(operand2));
1718#if defined(_MSC_VER)
1719#pragma warning(push)
1720#pragma warning(disable : 4101)
1722 NUITKA_MAY_BE_UNUSED
bool cbool_result;
1723 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
1724#if defined(_MSC_VER)
1728 binaryfunc slot1 = PyLong_Type.tp_as_number->nb_subtract;
1731 if (slot1 != NULL) {
1732 PyObject *x = slot1(operand1, operand2);
1734 if (x != Py_NotImplemented) {
1736 goto exit_binary_result_object;
1739 Py_DECREF_IMMORTAL(x);
1744 PyErr_Format(PyExc_TypeError,
"unsupported operand type(s) for -: 'long' and 'int'");
1745 goto exit_binary_exception;
1747exit_binary_result_object:
1750exit_binary_exception:
1754PyObject *BINARY_OPERATION_SUB_OBJECT_LONG_INT(PyObject *operand1, PyObject *operand2) {
1755 return _BINARY_OPERATION_SUB_OBJECT_LONG_INT(operand1, operand2);
1759#if PYTHON_VERSION < 0x300
1761static PyObject *_BINARY_OPERATION_SUB_OBJECT_INT_LONG(PyObject *operand1, PyObject *operand2) {
1762 CHECK_OBJECT(operand1);
1763 assert(PyInt_CheckExact(operand1));
1764 CHECK_OBJECT(operand2);
1765 assert(PyLong_CheckExact(operand2));
1767#if defined(_MSC_VER)
1768#pragma warning(push)
1769#pragma warning(disable : 4101)
1771 NUITKA_MAY_BE_UNUSED
bool cbool_result;
1772 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
1773#if defined(_MSC_VER)
1778 binaryfunc slot2 = NULL;
1783 slot2 = PyLong_Type.tp_as_number->nb_subtract;
1786 if (slot2 != NULL) {
1787 PyObject *x = slot2(operand1, operand2);
1789 if (x != Py_NotImplemented) {
1791 goto exit_binary_result_object;
1794 Py_DECREF_IMMORTAL(x);
1799 PyErr_Format(PyExc_TypeError,
"unsupported operand type(s) for -: 'int' and 'long'");
1800 goto exit_binary_exception;
1802exit_binary_result_object:
1805exit_binary_exception:
1809PyObject *BINARY_OPERATION_SUB_OBJECT_INT_LONG(PyObject *operand1, PyObject *operand2) {
1810 return _BINARY_OPERATION_SUB_OBJECT_INT_LONG(operand1, operand2);
1814#if PYTHON_VERSION < 0x300
1816static PyObject *_BINARY_OPERATION_SUB_OBJECT_INT_CLONG(PyObject *operand1,
long operand2) {
1817 CHECK_OBJECT(operand1);
1818 assert(PyInt_CheckExact(operand1));
1823#if defined(_MSC_VER)
1824#pragma warning(push)
1825#pragma warning(disable : 4101)
1827 NUITKA_MAY_BE_UNUSED
bool cbool_result;
1828 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
1829 NUITKA_MAY_BE_UNUSED
long clong_result;
1830 NUITKA_MAY_BE_UNUSED
double cfloat_result;
1831#if defined(_MSC_VER)
1835 CHECK_OBJECT(operand1);
1836 assert(PyInt_CheckExact(operand1));
1838 const long a = PyInt_AS_LONG(operand1);
1839 const long b = operand2;
1841 const long x = (long)((
unsigned long)a - b);
1842 bool no_overflow = ((x ^ a) >= 0 || (x ^ ~b) >= 0);
1843 if (likely(no_overflow)) {
1845 goto exit_result_ok_clong;
1849 PyObject *operand1_object = operand1;
1850 PyObject *operand2_object = Nuitka_PyLong_FromLong(operand2);
1852 PyObject *r = PyLong_Type.tp_as_number->nb_subtract(operand1_object, operand2_object);
1853 assert(r != Py_NotImplemented);
1855 Py_DECREF(operand2_object);
1858 goto exit_result_object;
1861exit_result_ok_clong:
1862 result = Nuitka_PyInt_FromLong(clong_result);
1863 goto exit_result_ok;
1866 if (unlikely(obj_result == NULL)) {
1867 goto exit_result_exception;
1869 result = obj_result;
1870 goto exit_result_ok;
1875exit_result_exception:
1879PyObject *BINARY_OPERATION_SUB_OBJECT_INT_CLONG(PyObject *operand1,
long operand2) {
1880 return _BINARY_OPERATION_SUB_OBJECT_INT_CLONG(operand1, operand2);
1884#if PYTHON_VERSION < 0x300
1886static PyObject *_BINARY_OPERATION_SUB_OBJECT_CLONG_INT(
long operand1, PyObject *operand2) {
1888 CHECK_OBJECT(operand2);
1889 assert(PyInt_CheckExact(operand2));
1894#if defined(_MSC_VER)
1895#pragma warning(push)
1896#pragma warning(disable : 4101)
1898 NUITKA_MAY_BE_UNUSED
bool cbool_result;
1899 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
1900 NUITKA_MAY_BE_UNUSED
long clong_result;
1901 NUITKA_MAY_BE_UNUSED
double cfloat_result;
1902#if defined(_MSC_VER)
1906 CHECK_OBJECT(operand2);
1907 assert(PyInt_CheckExact(operand2));
1909 const long a = operand1;
1910 const long b = PyInt_AS_LONG(operand2);
1912 const long x = (long)((
unsigned long)a - b);
1913 bool no_overflow = ((x ^ a) >= 0 || (x ^ ~b) >= 0);
1914 if (likely(no_overflow)) {
1916 goto exit_result_ok_clong;
1920 PyObject *operand1_object = Nuitka_PyLong_FromLong(operand1);
1921 PyObject *operand2_object = operand2;
1923 PyObject *r = PyLong_Type.tp_as_number->nb_subtract(operand1_object, operand2_object);
1924 assert(r != Py_NotImplemented);
1926 Py_DECREF(operand1_object);
1929 goto exit_result_object;
1932exit_result_ok_clong:
1933 result = Nuitka_PyInt_FromLong(clong_result);
1934 goto exit_result_ok;
1937 if (unlikely(obj_result == NULL)) {
1938 goto exit_result_exception;
1940 result = obj_result;
1941 goto exit_result_ok;
1946exit_result_exception:
1950PyObject *BINARY_OPERATION_SUB_OBJECT_CLONG_INT(
long operand1, PyObject *operand2) {
1951 return _BINARY_OPERATION_SUB_OBJECT_CLONG_INT(operand1, operand2);
1957static PyObject *_BINARY_OPERATION_SUB_OBJECT_LONG_DIGIT(PyObject *operand1,
long operand2) {
1958 CHECK_OBJECT(operand1);
1959 assert(PyLong_CheckExact(operand1));
1960 assert(Py_ABS(operand2) < (1 << PyLong_SHIFT));
1965#if defined(_MSC_VER)
1966#pragma warning(push)
1967#pragma warning(disable : 4101)
1969 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
1970 NUITKA_MAY_BE_UNUSED
long clong_result;
1971#if defined(_MSC_VER)
1975 PyLongObject *operand1_long_object = (PyLongObject *)operand1;
1977 if (Nuitka_LongGetDigitSize(operand1_long_object) <= 1 && (operand2 == 0 ? 0 : 1) <= 1) {
1978 long r = (long)(MEDIUM_VALUE(operand1_long_object) - (sdigit)operand2);
1981 goto exit_result_ok_clong;
1987 digit
const *a_digits = Nuitka_LongGetDigitPointer(operand1_long_object);
1988 Py_ssize_t a_digit_count = Nuitka_LongGetDigitSize(operand1_long_object);
1989 bool a_negative = Nuitka_LongIsNegative(operand1_long_object);
1990 digit
const *b_digits = (digit *)&operand2;
1991 Py_ssize_t b_digit_count = (operand2 == 0 ? 0 : 1);
1992 bool b_negative = operand2 < 0;
1996 z = _Nuitka_LongSubDigits(a_digits, a_digit_count, b_digits, b_digit_count);
1998 z = _Nuitka_LongAddDigits(a_digits, a_digit_count, b_digits, b_digit_count);
2001 Nuitka_LongFlipSign(z);
2004 z = _Nuitka_LongAddDigits(a_digits, a_digit_count, b_digits, b_digit_count);
2006 z = _Nuitka_LongSubDigits(a_digits, a_digit_count, b_digits, b_digit_count);
2010 obj_result = (PyObject *)z;
2011 goto exit_result_object;
2015 if (unlikely(obj_result == NULL)) {
2016 goto exit_result_exception;
2018 result = obj_result;
2019 goto exit_result_ok;
2021exit_result_ok_clong:
2022 result = Nuitka_LongFromCLong(clong_result);
2023 goto exit_result_ok;
2028exit_result_exception:
2032PyObject *BINARY_OPERATION_SUB_OBJECT_LONG_DIGIT(PyObject *operand1,
long operand2) {
2033 return _BINARY_OPERATION_SUB_OBJECT_LONG_DIGIT(operand1, operand2);
2038static PyObject *_BINARY_OPERATION_SUB_OBJECT_DIGIT_LONG(
long operand1, PyObject *operand2) {
2039 assert(Py_ABS(operand1) < (1 << PyLong_SHIFT));
2040 CHECK_OBJECT(operand2);
2041 assert(PyLong_CheckExact(operand2));
2046#if defined(_MSC_VER)
2047#pragma warning(push)
2048#pragma warning(disable : 4101)
2050 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
2051 NUITKA_MAY_BE_UNUSED
long clong_result;
2052#if defined(_MSC_VER)
2056 PyLongObject *operand2_long_object = (PyLongObject *)operand2;
2058 if ((operand1 == 0 ? 0 : 1) <= 1 && Nuitka_LongGetDigitSize(operand2_long_object) <= 1) {
2059 long r = (long)((sdigit)operand1 - MEDIUM_VALUE(operand2_long_object));
2062 goto exit_result_ok_clong;
2068 digit
const *a_digits = (digit *)&operand1;
2069 Py_ssize_t a_digit_count = (operand1 == 0 ? 0 : 1);
2070 bool a_negative = operand1 < 0;
2071 digit
const *b_digits = Nuitka_LongGetDigitPointer(operand2_long_object);
2072 Py_ssize_t b_digit_count = Nuitka_LongGetDigitSize(operand2_long_object);
2073 bool b_negative = Nuitka_LongIsNegative(operand2_long_object);
2077 z = _Nuitka_LongSubDigits(a_digits, a_digit_count, b_digits, b_digit_count);
2079 z = _Nuitka_LongAddDigits(a_digits, a_digit_count, b_digits, b_digit_count);
2082 Nuitka_LongFlipSign(z);
2085 z = _Nuitka_LongAddDigits(a_digits, a_digit_count, b_digits, b_digit_count);
2087 z = _Nuitka_LongSubDigits(a_digits, a_digit_count, b_digits, b_digit_count);
2091 obj_result = (PyObject *)z;
2092 goto exit_result_object;
2096 if (unlikely(obj_result == NULL)) {
2097 goto exit_result_exception;
2099 result = obj_result;
2100 goto exit_result_ok;
2102exit_result_ok_clong:
2103 result = Nuitka_LongFromCLong(clong_result);
2104 goto exit_result_ok;
2109exit_result_exception:
2113PyObject *BINARY_OPERATION_SUB_OBJECT_DIGIT_LONG(
long operand1, PyObject *operand2) {
2114 return _BINARY_OPERATION_SUB_OBJECT_DIGIT_LONG(operand1, operand2);
2118static PyObject *_BINARY_OPERATION_SUB_OBJECT_LONG_CLONG(PyObject *operand1,
long operand2) {
2119 CHECK_OBJECT(operand1);
2120 assert(PyLong_CheckExact(operand1));
2125#if defined(_MSC_VER)
2126#pragma warning(push)
2127#pragma warning(disable : 4101)
2129 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
2130 NUITKA_MAY_BE_UNUSED
long clong_result;
2131#if defined(_MSC_VER)
2135 PyLongObject *operand1_long_object = (PyLongObject *)operand1;
2137 bool operand2_is_negative;
2138 unsigned long operand2_abs_ival;
2141 operand2_abs_ival = (
unsigned long)(-1 - operand2) + 1;
2142 operand2_is_negative =
true;
2144 operand2_abs_ival = (
unsigned long)operand2;
2145 operand2_is_negative =
false;
2148 Py_ssize_t operand2_digit_count = 0;
2149 digit operand2_digits[5] = {0};
2151 unsigned long t = operand2_abs_ival;
2154 operand2_digit_count += 1;
2155 assert(operand2_digit_count <= (Py_ssize_t)(
sizeof(operand2_digit_count) /
sizeof(digit)));
2157 operand2_digits[operand2_digit_count] = (digit)(t & PyLong_MASK);
2162 NUITKA_MAY_BE_UNUSED Py_ssize_t operand2_size =
2163 operand2_is_negative ==
false ? operand2_digit_count : -operand2_digit_count;
2165 if (Nuitka_LongGetDigitSize(operand1_long_object) <= 1 && operand2_digit_count <= 1) {
2166 long r = (long)(MEDIUM_VALUE(operand1_long_object) - (sdigit)operand2);
2169 goto exit_result_ok_clong;
2175 digit
const *a_digits = Nuitka_LongGetDigitPointer(operand1_long_object);
2176 Py_ssize_t a_digit_count = Nuitka_LongGetDigitSize(operand1_long_object);
2177 bool a_negative = Nuitka_LongIsNegative(operand1_long_object);
2178 digit
const *b_digits = operand2_digits;
2179 Py_ssize_t b_digit_count = operand2_digit_count;
2180 bool b_negative = operand2_is_negative;
2184 z = _Nuitka_LongSubDigits(a_digits, a_digit_count, b_digits, b_digit_count);
2186 z = _Nuitka_LongAddDigits(a_digits, a_digit_count, b_digits, b_digit_count);
2189 Nuitka_LongFlipSign(z);
2192 z = _Nuitka_LongAddDigits(a_digits, a_digit_count, b_digits, b_digit_count);
2194 z = _Nuitka_LongSubDigits(a_digits, a_digit_count, b_digits, b_digit_count);
2198 obj_result = (PyObject *)z;
2199 goto exit_result_object;
2203 if (unlikely(obj_result == NULL)) {
2204 goto exit_result_exception;
2206 result = obj_result;
2207 goto exit_result_ok;
2209exit_result_ok_clong:
2210 result = Nuitka_LongFromCLong(clong_result);
2211 goto exit_result_ok;
2216exit_result_exception:
2220PyObject *BINARY_OPERATION_SUB_OBJECT_LONG_CLONG(PyObject *operand1,
long operand2) {
2221 return _BINARY_OPERATION_SUB_OBJECT_LONG_CLONG(operand1, operand2);
2225static PyObject *_BINARY_OPERATION_SUB_OBJECT_CLONG_LONG(
long operand1, PyObject *operand2) {
2227 CHECK_OBJECT(operand2);
2228 assert(PyLong_CheckExact(operand2));
2233#if defined(_MSC_VER)
2234#pragma warning(push)
2235#pragma warning(disable : 4101)
2237 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
2238 NUITKA_MAY_BE_UNUSED
long clong_result;
2239#if defined(_MSC_VER)
2243 bool operand1_is_negative;
2244 unsigned long operand1_abs_ival;
2247 operand1_abs_ival = (
unsigned long)(-1 - operand1) + 1;
2248 operand1_is_negative =
true;
2250 operand1_abs_ival = (
unsigned long)operand1;
2251 operand1_is_negative =
false;
2254 Py_ssize_t operand1_digit_count = 0;
2255 digit operand1_digits[5] = {0};
2257 unsigned long t = operand1_abs_ival;
2260 operand1_digit_count += 1;
2261 assert(operand1_digit_count <= (Py_ssize_t)(
sizeof(operand1_digit_count) /
sizeof(digit)));
2263 operand1_digits[operand1_digit_count] = (digit)(t & PyLong_MASK);
2268 NUITKA_MAY_BE_UNUSED Py_ssize_t operand1_size =
2269 operand1_is_negative ==
false ? operand1_digit_count : -operand1_digit_count;
2271 PyLongObject *operand2_long_object = (PyLongObject *)operand2;
2273 if (operand1_digit_count <= 1 && Nuitka_LongGetDigitSize(operand2_long_object) <= 1) {
2274 long r = (long)((sdigit)operand1 - MEDIUM_VALUE(operand2_long_object));
2277 goto exit_result_ok_clong;
2283 digit
const *a_digits = operand1_digits;
2284 Py_ssize_t a_digit_count = operand1_digit_count;
2285 bool a_negative = operand1_is_negative;
2286 digit
const *b_digits = Nuitka_LongGetDigitPointer(operand2_long_object);
2287 Py_ssize_t b_digit_count = Nuitka_LongGetDigitSize(operand2_long_object);
2288 bool b_negative = Nuitka_LongIsNegative(operand2_long_object);
2292 z = _Nuitka_LongSubDigits(a_digits, a_digit_count, b_digits, b_digit_count);
2294 z = _Nuitka_LongAddDigits(a_digits, a_digit_count, b_digits, b_digit_count);
2297 Nuitka_LongFlipSign(z);
2300 z = _Nuitka_LongAddDigits(a_digits, a_digit_count, b_digits, b_digit_count);
2302 z = _Nuitka_LongSubDigits(a_digits, a_digit_count, b_digits, b_digit_count);
2306 obj_result = (PyObject *)z;
2307 goto exit_result_object;
2311 if (unlikely(obj_result == NULL)) {
2312 goto exit_result_exception;
2314 result = obj_result;
2315 goto exit_result_ok;
2317exit_result_ok_clong:
2318 result = Nuitka_LongFromCLong(clong_result);
2319 goto exit_result_ok;
2324exit_result_exception:
2328PyObject *BINARY_OPERATION_SUB_OBJECT_CLONG_LONG(
long operand1, PyObject *operand2) {
2329 return _BINARY_OPERATION_SUB_OBJECT_CLONG_LONG(operand1, operand2);
2333static PyObject *_BINARY_OPERATION_SUB_OBJECT_FLOAT_CFLOAT(PyObject *operand1,
double operand2) {
2334 CHECK_OBJECT(operand1);
2335 assert(PyFloat_CheckExact(operand1));
2339#if defined(_MSC_VER)
2340#pragma warning(push)
2341#pragma warning(disable : 4101)
2344 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
2345 NUITKA_MAY_BE_UNUSED
long clong_result;
2346 NUITKA_MAY_BE_UNUSED
double cfloat_result;
2347#if defined(_MSC_VER)
2351 CHECK_OBJECT(operand1);
2352 assert(PyFloat_CheckExact(operand1));
2354 const double a = PyFloat_AS_DOUBLE(operand1);
2355 const double b = operand2;
2360 goto exit_result_ok_cfloat;
2362exit_result_ok_cfloat:
2363 result = MAKE_FLOAT_FROM_DOUBLE(cfloat_result);
2364 goto exit_result_ok;
2370PyObject *BINARY_OPERATION_SUB_OBJECT_FLOAT_CFLOAT(PyObject *operand1,
double operand2) {
2371 return _BINARY_OPERATION_SUB_OBJECT_FLOAT_CFLOAT(operand1, operand2);
2375static PyObject *_BINARY_OPERATION_SUB_OBJECT_CFLOAT_FLOAT(
double operand1, PyObject *operand2) {
2377 CHECK_OBJECT(operand2);
2378 assert(PyFloat_CheckExact(operand2));
2382#if defined(_MSC_VER)
2383#pragma warning(push)
2384#pragma warning(disable : 4101)
2387 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
2388 NUITKA_MAY_BE_UNUSED
long clong_result;
2389 NUITKA_MAY_BE_UNUSED
double cfloat_result;
2390#if defined(_MSC_VER)
2394 CHECK_OBJECT(operand2);
2395 assert(PyFloat_CheckExact(operand2));
2397 const double a = operand1;
2398 const double b = PyFloat_AS_DOUBLE(operand2);
2403 goto exit_result_ok_cfloat;
2405exit_result_ok_cfloat:
2406 result = MAKE_FLOAT_FROM_DOUBLE(cfloat_result);
2407 goto exit_result_ok;
2413PyObject *BINARY_OPERATION_SUB_OBJECT_CFLOAT_FLOAT(
double operand1, PyObject *operand2) {
2414 return _BINARY_OPERATION_SUB_OBJECT_CFLOAT_FLOAT(operand1, operand2);
2418static PyObject *_BINARY_OPERATION_SUB_OBJECT_OBJECT_OBJECT(PyObject *operand1, PyObject *operand2) {
2419 CHECK_OBJECT(operand1);
2420 CHECK_OBJECT(operand2);
2422#if PYTHON_VERSION < 0x300
2423 if (PyInt_CheckExact(operand1) && PyInt_CheckExact(operand2)) {
2427#if defined(_MSC_VER)
2428#pragma warning(push)
2429#pragma warning(disable : 4101)
2431 NUITKA_MAY_BE_UNUSED
bool cbool_result;
2432 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
2433 NUITKA_MAY_BE_UNUSED
long clong_result;
2434 NUITKA_MAY_BE_UNUSED
double cfloat_result;
2435#if defined(_MSC_VER)
2439 CHECK_OBJECT(operand1);
2440 assert(PyInt_CheckExact(operand1));
2441 CHECK_OBJECT(operand2);
2442 assert(PyInt_CheckExact(operand2));
2444 const long a = PyInt_AS_LONG(operand1);
2445 const long b = PyInt_AS_LONG(operand2);
2447 const long x = (long)((
unsigned long)a - b);
2448 bool no_overflow = ((x ^ a) >= 0 || (x ^ ~b) >= 0);
2449 if (likely(no_overflow)) {
2451 goto exit_result_ok_clong;
2455 PyObject *operand1_object = operand1;
2456 PyObject *operand2_object = operand2;
2458 PyObject *r = PyLong_Type.tp_as_number->nb_subtract(operand1_object, operand2_object);
2459 assert(r != Py_NotImplemented);
2462 goto exit_result_object;
2465 exit_result_ok_clong:
2466 result = Nuitka_PyInt_FromLong(clong_result);
2467 goto exit_result_ok;
2470 if (unlikely(obj_result == NULL)) {
2471 goto exit_result_exception;
2473 result = obj_result;
2474 goto exit_result_ok;
2479 exit_result_exception:
2484 PyTypeObject *type1 = Py_TYPE(operand1);
2485 PyTypeObject *type2 = Py_TYPE(operand2);
2487#if defined(_MSC_VER)
2488#pragma warning(push)
2489#pragma warning(disable : 4101)
2491 NUITKA_MAY_BE_UNUSED
bool cbool_result;
2492 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
2493#if defined(_MSC_VER)
2498 (type1->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type1)) ? type1->tp_as_number->nb_subtract : NULL;
2499 binaryfunc slot2 = NULL;
2501 if (!(type1 == type2)) {
2504 slot2 = (type2->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type2)) ? type2->tp_as_number->nb_subtract : NULL;
2506 if (slot1 == slot2) {
2511 if (slot1 != NULL) {
2512 if (slot2 != NULL) {
2513 if (Nuitka_Type_IsSubtype(type2, type1)) {
2514 PyObject *x = slot2(operand1, operand2);
2516 if (x != Py_NotImplemented) {
2518 goto exit_binary_result_object;
2521 Py_DECREF_IMMORTAL(x);
2526 PyObject *x = slot1(operand1, operand2);
2528 if (x != Py_NotImplemented) {
2530 goto exit_binary_result_object;
2533 Py_DECREF_IMMORTAL(x);
2536 if (slot2 != NULL) {
2537 PyObject *x = slot2(operand1, operand2);
2539 if (x != Py_NotImplemented) {
2541 goto exit_binary_result_object;
2544 Py_DECREF_IMMORTAL(x);
2547#if PYTHON_VERSION < 0x300
2548 if (!NEW_STYLE_NUMBER_TYPE(type1) || !NEW_STYLE_NUMBER_TYPE(type2)) {
2550 (type1->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type1)) ? type1->tp_as_number->nb_coerce : NULL;
2553 PyObject *coerced1 = operand1;
2554 PyObject *coerced2 = operand2;
2556 int err = c1(&coerced1, &coerced2);
2558 if (unlikely(err < 0)) {
2559 goto exit_binary_exception;
2563 PyNumberMethods *mv = Py_TYPE(coerced1)->tp_as_number;
2565 if (likely(mv == NULL)) {
2566 binaryfunc slot = mv->nb_subtract;
2568 if (likely(slot != NULL)) {
2569 PyObject *x = slot(coerced1, coerced2);
2571 Py_DECREF(coerced1);
2572 Py_DECREF(coerced2);
2575 goto exit_binary_result_object;
2580 Py_DECREF(coerced1);
2581 Py_DECREF(coerced2);
2585 (type2->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type2)) ? type2->tp_as_number->nb_coerce : NULL;
2588 PyObject *coerced1 = operand1;
2589 PyObject *coerced2 = operand2;
2591 int err = c2(&coerced2, &coerced1);
2593 if (unlikely(err < 0)) {
2594 goto exit_binary_exception;
2598 PyNumberMethods *mv = Py_TYPE(coerced1)->tp_as_number;
2600 if (likely(mv == NULL)) {
2601 binaryfunc slot = mv->nb_subtract;
2603 if (likely(slot != NULL)) {
2604 PyObject *x = slot(coerced1, coerced2);
2606 Py_DECREF(coerced1);
2607 Py_DECREF(coerced2);
2610 goto exit_binary_result_object;
2615 Py_DECREF(coerced1);
2616 Py_DECREF(coerced2);
2622 PyErr_Format(PyExc_TypeError,
"unsupported operand type(s) for -: '%s' and '%s'", type1->tp_name, type2->tp_name);
2623 goto exit_binary_exception;
2625exit_binary_result_object:
2628exit_binary_exception:
2632PyObject *BINARY_OPERATION_SUB_OBJECT_OBJECT_OBJECT(PyObject *operand1, PyObject *operand2) {
2633 return _BINARY_OPERATION_SUB_OBJECT_OBJECT_OBJECT(operand1, operand2);