extmod/utime_mphal: ticks_diff(): Optimize to avoid if conditions.

pull/2582/merge
Paul Sokolovsky 2016-11-02 02:50:48 +03:00
rodzic 5fae914326
commit 10bde6933e
1 zmienionych plików z 4 dodań i 6 usunięć

Wyświetl plik

@ -89,12 +89,10 @@ STATIC mp_obj_t time_ticks_diff(mp_obj_t end_in, mp_obj_t start_in) {
// we assume that the arguments come from ticks_xx so are small ints // we assume that the arguments come from ticks_xx so are small ints
uint32_t start = MP_OBJ_SMALL_INT_VALUE(start_in); uint32_t start = MP_OBJ_SMALL_INT_VALUE(start_in);
uint32_t end = MP_OBJ_SMALL_INT_VALUE(end_in); uint32_t end = MP_OBJ_SMALL_INT_VALUE(end_in);
int32_t diff = end - start; // Optimized formula avoiding if conditions. We adjust difference "forward",
if (diff < (signed)-(MICROPY_PY_UTIME_TICKS_PERIOD / 2)) { // wrap it around and adjust back.
diff += MICROPY_PY_UTIME_TICKS_PERIOD; int32_t diff = ((end - start + MICROPY_PY_UTIME_TICKS_PERIOD / 2) & (MICROPY_PY_UTIME_TICKS_PERIOD - 1))
} else if (diff >= (signed)(MICROPY_PY_UTIME_TICKS_PERIOD / 2)) { - MICROPY_PY_UTIME_TICKS_PERIOD / 2;
diff -= MICROPY_PY_UTIME_TICKS_PERIOD;
}
return MP_OBJ_NEW_SMALL_INT(diff); return MP_OBJ_NEW_SMALL_INT(diff);
} }
MP_DEFINE_CONST_FUN_OBJ_2(mp_utime_ticks_diff_obj, time_ticks_diff); MP_DEFINE_CONST_FUN_OBJ_2(mp_utime_ticks_diff_obj, time_ticks_diff);