1*1208bc7eSAndroid Build Coastguard Worker #include "jemalloc/internal/jemalloc_preamble.h"
2*1208bc7eSAndroid Build Coastguard Worker
3*1208bc7eSAndroid Build Coastguard Worker #include "jemalloc/internal/div.h"
4*1208bc7eSAndroid Build Coastguard Worker
5*1208bc7eSAndroid Build Coastguard Worker #include "jemalloc/internal/assert.h"
6*1208bc7eSAndroid Build Coastguard Worker
7*1208bc7eSAndroid Build Coastguard Worker /*
8*1208bc7eSAndroid Build Coastguard Worker * Suppose we have n = q * d, all integers. We know n and d, and want q = n / d.
9*1208bc7eSAndroid Build Coastguard Worker *
10*1208bc7eSAndroid Build Coastguard Worker * For any k, we have (here, all division is exact; not C-style rounding):
11*1208bc7eSAndroid Build Coastguard Worker * floor(ceil(2^k / d) * n / 2^k) = floor((2^k + r) / d * n / 2^k), where
12*1208bc7eSAndroid Build Coastguard Worker * r = (-2^k) mod d.
13*1208bc7eSAndroid Build Coastguard Worker *
14*1208bc7eSAndroid Build Coastguard Worker * Expanding this out:
15*1208bc7eSAndroid Build Coastguard Worker * ... = floor(2^k / d * n / 2^k + r / d * n / 2^k)
16*1208bc7eSAndroid Build Coastguard Worker * = floor(n / d + (r / d) * (n / 2^k)).
17*1208bc7eSAndroid Build Coastguard Worker *
18*1208bc7eSAndroid Build Coastguard Worker * The fractional part of n / d is 0 (because of the assumption that d divides n
19*1208bc7eSAndroid Build Coastguard Worker * exactly), so we have:
20*1208bc7eSAndroid Build Coastguard Worker * ... = n / d + floor((r / d) * (n / 2^k))
21*1208bc7eSAndroid Build Coastguard Worker *
22*1208bc7eSAndroid Build Coastguard Worker * So that our initial expression is equal to the quantity we seek, so long as
23*1208bc7eSAndroid Build Coastguard Worker * (r / d) * (n / 2^k) < 1.
24*1208bc7eSAndroid Build Coastguard Worker *
25*1208bc7eSAndroid Build Coastguard Worker * r is a remainder mod d, so r < d and r / d < 1 always. We can make
26*1208bc7eSAndroid Build Coastguard Worker * n / 2 ^ k < 1 by setting k = 32. This gets us a value of magic that works.
27*1208bc7eSAndroid Build Coastguard Worker */
28*1208bc7eSAndroid Build Coastguard Worker
29*1208bc7eSAndroid Build Coastguard Worker void
div_init(div_info_t * div_info,size_t d)30*1208bc7eSAndroid Build Coastguard Worker div_init(div_info_t *div_info, size_t d) {
31*1208bc7eSAndroid Build Coastguard Worker /* Nonsensical. */
32*1208bc7eSAndroid Build Coastguard Worker assert(d != 0);
33*1208bc7eSAndroid Build Coastguard Worker /*
34*1208bc7eSAndroid Build Coastguard Worker * This would make the value of magic too high to fit into a uint32_t
35*1208bc7eSAndroid Build Coastguard Worker * (we would want magic = 2^32 exactly). This would mess with code gen
36*1208bc7eSAndroid Build Coastguard Worker * on 32-bit machines.
37*1208bc7eSAndroid Build Coastguard Worker */
38*1208bc7eSAndroid Build Coastguard Worker assert(d != 1);
39*1208bc7eSAndroid Build Coastguard Worker
40*1208bc7eSAndroid Build Coastguard Worker uint64_t two_to_k = ((uint64_t)1 << 32);
41*1208bc7eSAndroid Build Coastguard Worker uint32_t magic = (uint32_t)(two_to_k / d);
42*1208bc7eSAndroid Build Coastguard Worker
43*1208bc7eSAndroid Build Coastguard Worker /*
44*1208bc7eSAndroid Build Coastguard Worker * We want magic = ceil(2^k / d), but C gives us floor. We have to
45*1208bc7eSAndroid Build Coastguard Worker * increment it unless the result was exact (i.e. unless d is a power of
46*1208bc7eSAndroid Build Coastguard Worker * two).
47*1208bc7eSAndroid Build Coastguard Worker */
48*1208bc7eSAndroid Build Coastguard Worker if (two_to_k % d != 0) {
49*1208bc7eSAndroid Build Coastguard Worker magic++;
50*1208bc7eSAndroid Build Coastguard Worker }
51*1208bc7eSAndroid Build Coastguard Worker div_info->magic = magic;
52*1208bc7eSAndroid Build Coastguard Worker #ifdef JEMALLOC_DEBUG
53*1208bc7eSAndroid Build Coastguard Worker div_info->d = d;
54*1208bc7eSAndroid Build Coastguard Worker #endif
55*1208bc7eSAndroid Build Coastguard Worker }
56