18 #ifndef FOEDUS_ASSORTED_CONST_DIV_HPP_
19 #define FOEDUS_ASSORTED_CONST_DIV_HPP_
89 void init(uint32_t d);
99 uint32_t
div32(uint32_t n)
const;
101 uint32_t
rem32(uint32_t n, uint32_t d, uint32_t q)
const;
108 uint64_t
div64(uint64_t n)
const;
110 uint32_t
rem64(uint64_t n, uint32_t d, uint64_t q)
const;
147 if ((d & (d - 1)) == 0) {
166 uint32_t e = d - rem;
175 uint32_t twice_rem = rem * 2;
176 if (twice_rem >= d || twice_rem < rem) {
187 __uint128_t numer = 1;
189 uint64_t m = numer / d;
190 uint32_t rem = numer % d;
192 uint32_t e = d - rem;
196 uint32_t twice_rem = rem * 2;
197 if (twice_rem >= d || twice_rem < rem) {
232 uint64_t product =
static_cast<uint64_t
>(n) *
magic32_;
233 uint32_t quotient =
static_cast<uint32_t
>(product >> 32);
235 quotient += (n - quotient) >> 1;
246 if (n < (1ULL << 32)) {
248 return div32(static_cast<uint32_t>(n));
253 __uint128_t product =
static_cast<__uint128_t
>(n) *
magic64_;
254 uint64_t quotient =
static_cast<uint64_t
>(product >> 64);
256 quotient += (n - quotient) >> 1;
263 #endif // FOEDUS_ASSORTED_CONST_DIV_HPP_
uint8_t flags_
misc flags.
Add inidicator for 64bit division.
Root package of FOEDUS (Fast Optimistic Engine for Data Unification Services).
const uint32_t kPower2To31
ConstDiv(uint32_t d)
Pre-calculate the p-m pair for the given divisor.
The pre-calculated p-m pair for optimized integer division by constant.
const uint64_t kFull63Bits
uint32_t magic32_
magic number for 32 bit division.
uint32_t d_
Oridinal divisor.
Whether the divisor is a power of 2.
uint32_t rem32(uint32_t n, uint32_t d, uint32_t q) const
Calculate remainder.
const uint64_t kPower2To63
const uint32_t kFull32Bits
Add inidicator for 32bit division.
uint64_t magic64_
magic number for 64 bit division.
uint8_t d_highest_bits_
Highest bits to represent d.
const uint64_t kFull64Bits
uint8_t shift32_
"s" for 32 bit division.
const uint32_t kFull31Bits
uint32_t rem64(uint64_t n, uint32_t d, uint64_t q) const
Calculate remainder.
uint8_t shift64_
"s" for 64 bit division.
#define ASSERT_ND(x)
A warning-free wrapper macro of assert() that has no performance effect in release mode even when 'x'...
uint64_t div64(uint64_t n) const
64-bit integer division that outputs both quotient and remainder.
uint32_t div32(uint32_t n) const
32-bit integer division that outputs both quotient and remainder.