util: New function udiv64(): 64/32 -> 32q

This commit is contained in:
Keir Fraser 2023-09-17 08:31:59 +01:00
parent 0c423fb9de
commit 25742f6ecf
2 changed files with 14 additions and 0 deletions

View file

@ -69,6 +69,8 @@ int snprintf(char *str, size_t size, const char *format, ...)
#define htobe16(x) _rev16(x)
#define htobe32(x) _rev32(x)
uint32_t udiv64(uint64_t dividend, uint32_t divisor);
/* Arena-based memory allocation */
void *arena_alloc(uint32_t sz);
uint32_t arena_total(void);

View file

@ -335,6 +335,18 @@ unsigned int popcount(uint32_t x)
return (((x + (x >> 4)) & 0x0f0f0f0f) * 0x01010101) >> 24;
}
/* 64:32->32q division requiring 32:32->64 multiply. Cortex M3+ */
uint32_t udiv64(uint64_t dividend, uint32_t divisor)
{
uint32_t x, q = 0;
for (x = 1u<<31; x != 0; x >>= 1) {
if (((uint64_t)(q|x)*divisor) <= dividend)
q |= x;
}
return q;
}
/*
* Local variables:
* mode: C