diff --git a/include/libnux/vx/time.h b/include/libnux/vx/time.h index 7d0a3fec8b4c2f8759dabf6c9679ea17e067426c..7d55241c5a5716d79762195e045c1fa40b29cd4f 100644 --- a/include/libnux/vx/time.h +++ b/include/libnux/vx/time.h @@ -12,6 +12,12 @@ namespace libnux::vx { constexpr static uint32_t default_ppu_cycles_per_us = 250; +/* + * Idle for (approx.) `cycles` cycles. + * + * The current implementation uses a narrowing conversion of the user-supplied parameter to + * 'int32_t'. Values that don't fit in this data type will wrap. + */ void sleep_cycles(uint32_t cycles) ATTRIB_LINK_TO_INTERNAL; /* diff --git a/src/libnux/vx/time.cpp b/src/libnux/vx/time.cpp index 402642b87c11abfeb9883209500ef91fe47a214d..1556ae86ce31e259c342097b6bcc45507a9369cf 100644 --- a/src/libnux/vx/time.cpp +++ b/src/libnux/vx/time.cpp @@ -3,15 +3,13 @@ namespace libnux::vx { -/* - Idle for (approx.) `cycles` cycles. -*/ void __attribute__((optimize("O2"))) sleep_cycles(uint32_t cycles) { - static const uint8_t offset = 9; + static const int8_t offset = 9; time_base_t start; start = get_time_base(); - while ((uint32_t)(get_time_base() - start) <= (cycles - offset)); + while ((int32_t)(get_time_base() - start) <= (static_cast<int32_t>(cycles) - offset)) + ; } time_base_t now()