--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cgen/templates/inlined/PyLong_Type Fri May 11 16:21:51 2012 -0700 @@ -0,0 +1,40 @@ +%if instr.function_id in ['nb_add', 'nb_multiply', 'nb_subtract']: +<% inlined= True %> +<%text>\ +#define MEDIUM_VALUE(x) (Py_SIZE(x) < 0 ? -(sdigit)((PyLongObject*)x)->ob_digit[0] : \ + (Py_SIZE(x) == 0 ? (sdigit)0 : \ + (sdigit)((PyLongObject*)x)->ob_digit[0])) + +#define ABS(x) ((x) < 0 ? -(x) : (x)) +\ + + % if instr.function_id == 'nb_add': + if (ABS(Py_SIZE(v)) <= 1 && ABS(Py_SIZE(w)) <= 1) + x = PyLong_FromLong(MEDIUM_VALUE(v) + + MEDIUM_VALUE(w)); + else + x= PyLong_Type.tp_as_number->nb_add(v, w); + % elif instr.function_id == 'nb_multiply': + if (ABS(Py_SIZE(v)) <= 1 && ABS(Py_SIZE(w)) <= 1) { + stwodigits temp = (stwodigits)(MEDIUM_VALUE(v)) * MEDIUM_VALUE(w); +#ifdef HAVE_LONG_LONG + x= PyLong_FromLongLong((PY_LONG_LONG)temp); +#else + if (temp >= LONG_MIN && temp <= LONG_MAX) + x= PyLong_FromLong((long)temp); +#endif + } + else + x= PyLong_Type.tp_as_number->nb_multiply(v, w); + % elif instr.function_id == 'nb_subtract': + if (ABS(Py_SIZE(v)) <= 1 && ABS(Py_SIZE(w)) <= 1) + x = PyLong_FromLong(MEDIUM_VALUE(v)-MEDIUM_VALUE(w)); + else + x= PyLong_Type.tp_as_number->nb_subtract(v, w); + % endif + +#undef MEDIUM_VALUE +#undef ABS +% elif instr.function_id in ['nb_true_divide']: + x= PyLong_Type.tp_as_number->nb_true_divide(v, w); +%endif