1616#include "builtin.h"
1717#include "builtintables.h"
1818#include "bc.h"
19- #include "intdivmod .h"
19+ #include "smallint .h"
2020#include "objgenerator.h"
2121
2222#if 0 // print debugging info
@@ -289,7 +289,7 @@ mp_obj_t mp_binary_op(int op, mp_obj_t lhs, mp_obj_t rhs) {
289289
290290 // If long long type exists and is larger than machine_int_t, then
291291 // we can use the following code to perform overflow-checked multiplication.
292- // Otherwise (eg in x64 case) we must use the branching code below .
292+ // Otherwise (eg in x64 case) we must use mp_small_int_mul_overflow .
293293 #if 0
294294 // compute result using long long precision
295295 long long res = (long long )lhs_val * (long long )rhs_val ;
@@ -302,44 +302,22 @@ mp_obj_t mp_binary_op(int op, mp_obj_t lhs, mp_obj_t rhs) {
302302 }
303303 #endif
304304
305- if (lhs_val > 0 ) { // lhs_val is positive
306- if (rhs_val > 0 ) { // lhs_val and rhs_val are positive
307- if (lhs_val > (MP_SMALL_INT_MAX / rhs_val )) {
308- goto mul_overflow ;
309- }
310- } else { // lhs_val positive, rhs_val nonpositive
311- if (rhs_val < (MP_SMALL_INT_MIN / lhs_val )) {
312- goto mul_overflow ;
313- }
314- } // lhs_val positive, rhs_val nonpositive
315- } else { // lhs_val is nonpositive
316- if (rhs_val > 0 ) { // lhs_val is nonpositive, rhs_val is positive
317- if (lhs_val < (MP_SMALL_INT_MIN / rhs_val )) {
318- goto mul_overflow ;
319- }
320- } else { // lhs_val and rhs_val are nonpositive
321- if (lhs_val != 0 && rhs_val < (MP_SMALL_INT_MAX / lhs_val )) {
322- goto mul_overflow ;
323- }
324- } // End if lhs_val and rhs_val are nonpositive
325- } // End if lhs_val is nonpositive
326-
327- // use standard precision
328- return MP_OBJ_NEW_SMALL_INT (lhs_val * rhs_val );
329-
330- mul_overflow :
331- // use higher precision
332- lhs = mp_obj_new_int_from_ll (lhs_val );
333- goto generic_binary_op ;
334-
305+ if (mp_small_int_mul_overflow (lhs_val , rhs_val )) {
306+ // use higher precision
307+ lhs = mp_obj_new_int_from_ll (lhs_val );
308+ goto generic_binary_op ;
309+ } else {
310+ // use standard precision
311+ return MP_OBJ_NEW_SMALL_INT (lhs_val * rhs_val );
312+ }
335313 break ;
336314 }
337315 case MP_BINARY_OP_FLOOR_DIVIDE :
338316 case MP_BINARY_OP_INPLACE_FLOOR_DIVIDE :
339317 if (rhs_val == 0 ) {
340318 goto zero_division ;
341319 }
342- lhs_val = python_floor_divide (lhs_val , rhs_val );
320+ lhs_val = mp_small_int_floor_divide (lhs_val , rhs_val );
343321 break ;
344322
345323 #if MICROPY_ENABLE_FLOAT
@@ -352,11 +330,11 @@ mp_obj_t mp_binary_op(int op, mp_obj_t lhs, mp_obj_t rhs) {
352330 #endif
353331
354332 case MP_BINARY_OP_MODULO :
355- case MP_BINARY_OP_INPLACE_MODULO :
356- {
357- lhs_val = python_modulo (lhs_val , rhs_val );
333+ case MP_BINARY_OP_INPLACE_MODULO : {
334+ lhs_val = mp_small_int_modulo (lhs_val , rhs_val );
358335 break ;
359336 }
337+
360338 case MP_BINARY_OP_POWER :
361339 case MP_BINARY_OP_INPLACE_POWER :
362340 if (rhs_val < 0 ) {
@@ -370,21 +348,19 @@ mp_obj_t mp_binary_op(int op, mp_obj_t lhs, mp_obj_t rhs) {
370348 machine_int_t ans = 1 ;
371349 while (rhs_val > 0 ) {
372350 if (rhs_val & 1 ) {
373- machine_int_t old = ans ;
374- ans *= lhs_val ;
375- if (ans < old ) {
351+ if (mp_small_int_mul_overflow (ans , lhs_val )) {
376352 goto power_overflow ;
377353 }
354+ ans *= lhs_val ;
378355 }
379356 if (rhs_val == 1 ) {
380357 break ;
381358 }
382359 rhs_val /= 2 ;
383- machine_int_t old = lhs_val ;
384- lhs_val *= lhs_val ;
385- if (lhs_val < old ) {
360+ if (mp_small_int_mul_overflow (lhs_val , lhs_val )) {
386361 goto power_overflow ;
387362 }
363+ lhs_val *= lhs_val ;
388364 }
389365 lhs_val = ans ;
390366 }
0 commit comments