Skip to content

Commit

Permalink
Add fast_div16_8 & fast_div32_16 to the public API
Browse files Browse the repository at this point in the history
  • Loading branch information
adbancroft committed Nov 3, 2024
1 parent b2dd12e commit 833c898
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 15 deletions.
22 changes: 10 additions & 12 deletions src/avr-fast-div.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,16 @@
#define AFD_PUBLICAPI_ATTTRIBUTE
#endif

uint8_t AFD_PUBLICAPI_ATTTRIBUTE fast_div16_8(uint16_t udividend, uint8_t udivisor) {
AFD_ZERO_DIVISOR_CHECK(udividend, udivisor);
return (uint8_t)avr_fast_div_impl::divide(udividend, udivisor);
}

uint16_t AFD_PUBLICAPI_ATTTRIBUTE fast_div32_16(uint32_t udividend, uint16_t udivisor) {
AFD_ZERO_DIVISOR_CHECK(udividend, udivisor);
return avr_fast_div_impl::divide(udividend, udivisor);
}

uint8_t AFD_PUBLICAPI_ATTTRIBUTE fast_div(uint8_t udividend, uint8_t udivisor) {
AFD_ZERO_DIVISOR_CHECK(udividend, udivisor);
// u8/u8 => u8
Expand Down Expand Up @@ -63,12 +73,6 @@ static inline uint32_t fast_divu32u16(uint32_t udividend, uint16_t udivisor) {
if (udivisor > (uint16_t)(udividend >> 16U)) {
return avr_fast_div_impl::divide(udividend, udivisor);
}
// Fallback to 24-bit if supported
// #if defined(__UINT24_MAX__)
// if((udividend<__UINT24_MAX__)) {
// return (__uint24)udividend / (__uint24)udivisor;
// }
// #endif
// We now know that udividend > udivisor * 65536U
// u32/u32=>u32
return udividend / udivisor;
Expand All @@ -90,12 +94,6 @@ uint32_t AFD_PUBLICAPI_ATTTRIBUTE fast_div(uint32_t udividend, uint32_t udivisor
if (udivisor<=(uint32_t)UINT16_MAX) {
return fast_divu32u16(udividend, (uint16_t)udivisor);
}
// Fallback to 24-bit if supported
// #if defined(__UINT24_MAX__)
// if((udividend<__UINT24_MAX__) && (udivisor<__UINT24_MAX__)) {
// return (__uint24)udividend / (__uint24)udivisor;
// }
// #endif
// We now know that udivisor > 65535U. I.e. upper word bits are set
// u32/u32=>u32
return avr_fast_div_impl::divide_large_divisor<uint32_t>(udividend, udivisor);
Expand Down
24 changes: 21 additions & 3 deletions src/avr-fast-div.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,10 +60,28 @@ static inline TUnsigned safe_abs(TSigned svalue) {

// Public API

uint8_t fast_div(uint8_t udividend, uint8_t udivisor);
uint16_t fast_div(uint16_t udividend, uint8_t udivisor);
/// @brief Optimized division of a 16-bit unsigned by a 8-bit unsigned with an *8-bit unsigned result*
///
/// @warning Should only be called if it's known that the result will fit into 8-bits
///
/// @param udividend Dividend
/// @param udivisor Divisor
/// @return udividend/udivisor
uint8_t fast_div16_8(uint16_t udividend, uint8_t udivisor);

/// @brief Optimized division of a 32-bit unsigned by a 16-bit unsigned with a *16-bit unsigned result*
///
/// @warning Should only be called if it's known that the result will fit into 16-bits
///
/// @param udividend Dividend
/// @param udivisor Divisor
/// @return udividend/udivisor
uint16_t fast_div32_16(uint32_t udividend, uint16_t udivisor);

uint8_t fast_div(uint8_t udividend, uint8_t udivisor);
uint16_t fast_div(uint16_t udividend, uint8_t udivisor);
uint16_t fast_div(uint16_t udividend, uint16_t udivisor);
uint32_t fast_div(uint32_t udividend, uint8_t udivisor);
uint32_t fast_div(uint32_t udividend, uint8_t udivisor);
uint32_t fast_div(uint32_t udividend, uint16_t udivisor);
uint32_t fast_div(uint32_t udividend, uint32_t udivisor);

Expand Down

0 comments on commit 833c898

Please sign in to comment.