Skip to content

Commit de1e56a

Browse files
committed
perf: optimize division to uint32 to make re-target-pow calculation much faster
1 parent 317917a commit de1e56a

2 files changed

Lines changed: 20 additions & 0 deletions

File tree

src/arith_uint256.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
#include <arith_uint256.h>
77

8+
#include <limits>
89
#include <uint256.h>
910
#include <crypto/common.h>
1011

@@ -72,6 +73,23 @@ base_uint<BITS>& base_uint<BITS>::operator*=(const base_uint& b)
7273
return *this;
7374
}
7475

76+
template <unsigned int BITS>
77+
base_uint<BITS>& base_uint<BITS>::operator/=(uint64_t b32)
78+
{
79+
if (b32 == 0)
80+
throw uint_error("Division by zero");
81+
if (b32 > std::numeric_limits<uint32_t>::max()) {
82+
return *this /= base_uint(b32);
83+
}
84+
uint64_t rem = 0;
85+
for (int i = WIDTH - 1; i >= 0; --i) {
86+
uint64_t cur = (rem << 32) | pn[i];
87+
pn[i] = static_cast<uint32_t>(cur / b32);
88+
rem = cur % b32;
89+
}
90+
return *this;
91+
}
92+
7593
template <unsigned int BITS>
7694
base_uint<BITS>& base_uint<BITS>::operator/=(const base_uint& b)
7795
{

src/arith_uint256.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ class base_uint
158158

159159
base_uint& operator*=(uint32_t b32);
160160
base_uint& operator*=(const base_uint& b);
161+
base_uint& operator/=(uint64_t b32);
161162
base_uint& operator/=(const base_uint& b);
162163

163164
base_uint& operator++()
@@ -207,6 +208,7 @@ class base_uint
207208
friend inline base_uint operator>>(const base_uint& a, int shift) { return base_uint(a) >>= shift; }
208209
friend inline base_uint operator<<(const base_uint& a, int shift) { return base_uint(a) <<= shift; }
209210
friend inline base_uint operator*(const base_uint& a, uint32_t b) { return base_uint(a) *= b; }
211+
friend inline base_uint operator/(const base_uint& a, uint64_t b) { return base_uint(a) /= b; }
210212
friend inline bool operator==(const base_uint& a, const base_uint& b) { return memcmp(a.pn, b.pn, sizeof(a.pn)) == 0; }
211213
friend inline bool operator!=(const base_uint& a, const base_uint& b) { return memcmp(a.pn, b.pn, sizeof(a.pn)) != 0; }
212214
friend inline bool operator>(const base_uint& a, const base_uint& b) { return a.CompareTo(b) > 0; }

0 commit comments

Comments
 (0)