util: New function udiv64(): 64/32 -> 32q
This commit is contained in:
parent
0c423fb9de
commit
25742f6ecf
2 changed files with 14 additions and 0 deletions
|
|
@ -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);
|
||||
|
|
|
|||
12
src/util.c
12
src/util.c
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue