17 inline uint128_t MultiplyUInt64(uint64_t x, uint64_t y) {
18 return uint128_t(x) * uint128_t(y);
21 inline uint64_t BarrettReduce128(uint64_t input_hi, uint64_t input_lo,
24 uint128_t n = (static_cast<uint128_t>(input_hi) << 64) |
25 (static_cast<uint128_t>(input_lo));
27 return static_cast<uint64_t>(n % modulus);
32 inline uint64_t DivideUInt128UInt64Lo(uint64_t x1, uint64_t x0, uint64_t y) {
34 (
static_cast<uint128_t
>(x1) << 64) | (
static_cast<uint128_t
>(x0));
37 return static_cast<uint64_t
>(q);
43 inline void MultiplyUInt64(uint64_t x, uint64_t y, uint64_t* prod_hi,
45 uint128_t prod = MultiplyUInt64(x, y);
46 *prod_hi =
static_cast<uint64_t
>(prod >> 64);
47 *prod_lo =
static_cast<uint64_t
>(prod);
51 template <
int BitShift>
52 inline uint64_t MultiplyUInt64Hi(uint64_t x, uint64_t y) {
53 uint128_t product = MultiplyUInt64(x, y);
54 return static_cast<uint64_t
>(product >> BitShift);
58 inline uint64_t MSB(uint64_t input) {
59 return static_cast<uint64_t
>(std::log2l(input));
62 #define HEXL_LOOP_UNROLL_4 _Pragma("GCC unroll 4") 63 #define HEXL_LOOP_UNROLL_8 _Pragma("GCC unroll 8")
#define HEXL_CHECK(cond, expr)
Definition: check.hpp:39
Definition: eltwise-add-mod.hpp:8