/Users/eugenesiegel/btc/bitcoin/src/arith_uint256.cpp
| Line | Count | Source (jump to first uncovered line) | 
| 1 |  | // Copyright (c) 2009-2010 Satoshi Nakamoto | 
| 2 |  | // Copyright (c) 2009-2022 The Bitcoin Core developers | 
| 3 |  | // Distributed under the MIT software license, see the accompanying | 
| 4 |  | // file COPYING or http://www.opensource.org/licenses/mit-license.php. | 
| 5 |  |  | 
| 6 |  | #include <arith_uint256.h> | 
| 7 |  |  | 
| 8 |  | #include <uint256.h> | 
| 9 |  | #include <crypto/common.h> | 
| 10 |  |  | 
| 11 |  | #include <cassert> | 
| 12 |  |  | 
| 13 |  | template <unsigned int BITS> | 
| 14 |  | base_uint<BITS>& base_uint<BITS>::operator<<=(unsigned int shift) | 
| 15 | 28.0M | { | 
| 16 | 28.0M |     base_uint<BITS> a(*this); | 
| 17 | 252M |     for (int i = 0; i < WIDTH; i++224M) | 
| 18 | 224M |         pn[i] = 0; | 
| 19 | 28.0M |     int k = shift / 32; | 
| 20 | 28.0M |     shift = shift % 32; | 
| 21 | 252M |     for (int i = 0; i < WIDTH; i++224M) { | 
| 22 | 224M |         if (i + k + 1 < WIDTH && shift != 098.3M) | 
| 23 | 98.3M |             pn[i + k + 1] |= (a.pn[i] >> (32 - shift)); | 
| 24 | 224M |         if (i + k < WIDTH) | 
| 25 | 126M |             pn[i + k] |= (a.pn[i] << shift); | 
| 26 | 224M |     } | 
| 27 | 28.0M |     return *this; | 
| 28 | 28.0M | } _ZN9base_uintILj256EElSEj| Line | Count | Source |  | 15 | 28.0M | { |  | 16 | 28.0M |     base_uint<BITS> a(*this); |  | 17 | 252M |     for (int i = 0; i < WIDTH; i++224M) |  | 18 | 224M |         pn[i] = 0; |  | 19 | 28.0M |     int k = shift / 32; |  | 20 | 28.0M |     shift = shift % 32; |  | 21 | 252M |     for (int i = 0; i < WIDTH; i++224M) { |  | 22 | 224M |         if (i + k + 1 < WIDTH && shift != 098.3M) |  | 23 | 98.3M |             pn[i + k + 1] |= (a.pn[i] >> (32 - shift)); |  | 24 | 224M |         if (i + k < WIDTH) |  | 25 | 126M |             pn[i + k] |= (a.pn[i] << shift); |  | 26 | 224M |     } |  | 27 | 28.0M |     return *this; |  | 28 | 28.0M | } | 
Unexecuted instantiation: _ZN9base_uintILj6144EElSEj | 
| 29 |  |  | 
| 30 |  | template <unsigned int BITS> | 
| 31 |  | base_uint<BITS>& base_uint<BITS>::operator>>=(unsigned int shift) | 
| 32 | 28.4M | { | 
| 33 | 28.4M |     base_uint<BITS> a(*this); | 
| 34 | 255M |     for (int i = 0; i < WIDTH; i++227M) | 
| 35 | 227M |         pn[i] = 0; | 
| 36 | 28.4M |     int k = shift / 32; | 
| 37 | 28.4M |     shift = shift % 32; | 
| 38 | 255M |     for (int i = 0; i < WIDTH; i++227M) { | 
| 39 | 227M |         if (i - k - 1 >= 0 && shift != 0196M) | 
| 40 | 196M |             pn[i - k - 1] |= (a.pn[i] << (32 - shift)); | 
| 41 | 227M |         if (i - k >= 0) | 
| 42 | 225M |             pn[i - k] |= (a.pn[i] >> shift); | 
| 43 | 227M |     } | 
| 44 | 28.4M |     return *this; | 
| 45 | 28.4M | } _ZN9base_uintILj256EErSEj| Line | Count | Source |  | 32 | 28.4M | { |  | 33 | 28.4M |     base_uint<BITS> a(*this); |  | 34 | 255M |     for (int i = 0; i < WIDTH; i++227M) |  | 35 | 227M |         pn[i] = 0; |  | 36 | 28.4M |     int k = shift / 32; |  | 37 | 28.4M |     shift = shift % 32; |  | 38 | 255M |     for (int i = 0; i < WIDTH; i++227M) { |  | 39 | 227M |         if (i - k - 1 >= 0 && shift != 0196M) |  | 40 | 196M |             pn[i - k - 1] |= (a.pn[i] << (32 - shift)); |  | 41 | 227M |         if (i - k >= 0) |  | 42 | 225M |             pn[i - k] |= (a.pn[i] >> shift); |  | 43 | 227M |     } |  | 44 | 28.4M |     return *this; |  | 45 | 28.4M | } | 
Unexecuted instantiation: _ZN9base_uintILj6144EErSEj | 
| 46 |  |  | 
| 47 |  | template <unsigned int BITS> | 
| 48 |  | base_uint<BITS>& base_uint<BITS>::operator*=(uint32_t b32) | 
| 49 | 10.3k | { | 
| 50 | 10.3k |     uint64_t carry = 0; | 
| 51 | 93.4k |     for (int i = 0; i < WIDTH; i++83.0k) { | 
| 52 | 83.0k |         uint64_t n = carry + (uint64_t)b32 * pn[i]; | 
| 53 | 83.0k |         pn[i] = n & 0xffffffff; | 
| 54 | 83.0k |         carry = n >> 32; | 
| 55 | 83.0k |     } | 
| 56 | 10.3k |     return *this; | 
| 57 | 10.3k | } | 
| 58 |  |  | 
| 59 |  | template <unsigned int BITS> | 
| 60 |  | base_uint<BITS>& base_uint<BITS>::operator*=(const base_uint& b) | 
| 61 | 1.80M | { | 
| 62 | 1.80M |     base_uint<BITS> a; | 
| 63 | 16.2M |     for (int j = 0; j < WIDTH; j++14.4M) { | 
| 64 | 14.4M |         uint64_t carry = 0; | 
| 65 | 79.6M |         for (int i = 0; i + j < WIDTH; i++65.1M) { | 
| 66 | 65.1M |             uint64_t n = carry + a.pn[i + j] + (uint64_t)pn[j] * b.pn[i]; | 
| 67 | 65.1M |             a.pn[i + j] = n & 0xffffffff; | 
| 68 | 65.1M |             carry = n >> 32; | 
| 69 | 65.1M |         } | 
| 70 | 14.4M |     } | 
| 71 | 1.80M |     *this = a; | 
| 72 | 1.80M |     return *this; | 
| 73 | 1.80M | } _ZN9base_uintILj256EEmLERKS0_| Line | Count | Source |  | 61 | 1.80M | { |  | 62 | 1.80M |     base_uint<BITS> a; |  | 63 | 16.2M |     for (int j = 0; j < WIDTH; j++14.4M) { |  | 64 | 14.4M |         uint64_t carry = 0; |  | 65 | 79.6M |         for (int i = 0; i + j < WIDTH; i++65.1M) { |  | 66 | 65.1M |             uint64_t n = carry + a.pn[i + j] + (uint64_t)pn[j] * b.pn[i]; |  | 67 | 65.1M |             a.pn[i + j] = n & 0xffffffff; |  | 68 | 65.1M |             carry = n >> 32; |  | 69 | 65.1M |         } |  | 70 | 14.4M |     } |  | 71 | 1.80M |     *this = a; |  | 72 | 1.80M |     return *this; |  | 73 | 1.80M | } | 
Unexecuted instantiation: _ZN9base_uintILj6144EEmLERKS0_ | 
| 74 |  |  | 
| 75 |  | template <unsigned int BITS> | 
| 76 |  | base_uint<BITS>& base_uint<BITS>::operator/=(const base_uint& b) | 
| 77 | 14.0M | { | 
| 78 | 14.0M |     base_uint<BITS> div = b;     // make a copy, so we can shift. | 
| 79 | 14.0M |     base_uint<BITS> num = *this; // make a copy, so we can subtract. | 
| 80 | 14.0M |     *this = 0;                   // the quotient. | 
| 81 | 14.0M |     int num_bits = num.bits(); | 
| 82 | 14.0M |     int div_bits = div.bits(); | 
| 83 | 14.0M |     if (div_bits == 0) | 
| 84 | 0 |         throw uint_error("Division by zero"); | 
| 85 | 14.0M |     if (div_bits > num_bits) // the result is certainly 0. | 
| 86 | 0 |         return *this; | 
| 87 | 14.0M |     int shift = num_bits - div_bits; | 
| 88 | 14.0M |     div <<= shift; // shift so that div and num align. | 
| 89 | 42.1M |     while (shift >= 0) { | 
| 90 | 28.0M |         if (num >= div) { | 
| 91 | 14.0M |             num -= div; | 
| 92 | 14.0M |             pn[shift / 32] |= (1U << (shift & 31)); // set a bit of the result. | 
| 93 | 14.0M |         } | 
| 94 | 28.0M |         div >>= 1; // shift back. | 
| 95 | 28.0M |         shift--; | 
| 96 | 28.0M |     } | 
| 97 |  |     // num now contains the remainder of the division. | 
| 98 | 14.0M |     return *this; | 
| 99 | 14.0M | } _ZN9base_uintILj256EEdVERKS0_| Line | Count | Source |  | 77 | 14.0M | { |  | 78 | 14.0M |     base_uint<BITS> div = b;     // make a copy, so we can shift. |  | 79 | 14.0M |     base_uint<BITS> num = *this; // make a copy, so we can subtract. |  | 80 | 14.0M |     *this = 0;                   // the quotient. |  | 81 | 14.0M |     int num_bits = num.bits(); |  | 82 | 14.0M |     int div_bits = div.bits(); |  | 83 | 14.0M |     if (div_bits == 0) |  | 84 | 0 |         throw uint_error("Division by zero"); |  | 85 | 14.0M |     if (div_bits > num_bits) // the result is certainly 0. |  | 86 | 0 |         return *this; |  | 87 | 14.0M |     int shift = num_bits - div_bits; |  | 88 | 14.0M |     div <<= shift; // shift so that div and num align. |  | 89 | 42.1M |     while (shift >= 0) { |  | 90 | 28.0M |         if (num >= div) { |  | 91 | 14.0M |             num -= div; |  | 92 | 14.0M |             pn[shift / 32] |= (1U << (shift & 31)); // set a bit of the result. |  | 93 | 14.0M |         } |  | 94 | 28.0M |         div >>= 1; // shift back. |  | 95 | 28.0M |         shift--; |  | 96 | 28.0M |     } |  | 97 |  |     // num now contains the remainder of the division. |  | 98 | 14.0M |     return *this; |  | 99 | 14.0M | } | 
Unexecuted instantiation: _ZN9base_uintILj6144EEdVERKS0_ | 
| 100 |  |  | 
| 101 |  | template <unsigned int BITS> | 
| 102 |  | int base_uint<BITS>::CompareTo(const base_uint<BITS>& b) const | 
| 103 | 3.33G | { | 
| 104 | 26.4G |     for (int i = WIDTH - 1; i >= 0; i--23.1G) { | 
| 105 | 26.4G |         if (pn[i] < b.pn[i]) | 
| 106 | 2.33G |             return -1; | 
| 107 | 24.1G |         if (pn[i] > b.pn[i]) | 
| 108 | 968M |             return 1; | 
| 109 | 24.1G |     } | 
| 110 | 25.2M |     return 0; | 
| 111 | 3.33G | } _ZNK9base_uintILj256EE9CompareToERKS0_| Line | Count | Source |  | 103 | 3.33G | { |  | 104 | 26.4G |     for (int i = WIDTH - 1; i >= 0; i--23.1G) { |  | 105 | 26.4G |         if (pn[i] < b.pn[i]) |  | 106 | 2.33G |             return -1; |  | 107 | 24.1G |         if (pn[i] > b.pn[i]) |  | 108 | 968M |             return 1; |  | 109 | 24.1G |     } |  | 110 | 25.2M |     return 0; |  | 111 | 3.33G | } | 
Unexecuted instantiation: _ZNK9base_uintILj6144EE9CompareToERKS0_ | 
| 112 |  |  | 
| 113 |  | template <unsigned int BITS> | 
| 114 |  | bool base_uint<BITS>::EqualTo(uint64_t b) const | 
| 115 | 14.0M | { | 
| 116 | 14.0M |     for (int i = WIDTH - 1; i >= 2; i--0) { | 
| 117 | 14.0M |         if (pn[i]) | 
| 118 | 14.0M |             return false; | 
| 119 | 14.0M |     } | 
| 120 | 0 |     if (pn[1] != (b >> 32)) | 
| 121 | 0 |         return false; | 
| 122 | 0 |     if (pn[0] != (b & 0xfffffffful)) | 
| 123 | 0 |         return false; | 
| 124 | 0 |     return true; | 
| 125 | 0 | } | 
| 126 |  |  | 
| 127 |  | template <unsigned int BITS> | 
| 128 |  | double base_uint<BITS>::getdouble() const | 
| 129 | 36.6k | { | 
| 130 | 36.6k |     double ret = 0.0; | 
| 131 | 36.6k |     double fact = 1.0; | 
| 132 | 330k |     for (int i = 0; i < WIDTH; i++293k) { | 
| 133 | 293k |         ret += fact * pn[i]; | 
| 134 | 293k |         fact *= 4294967296.0; | 
| 135 | 293k |     } | 
| 136 | 36.6k |     return ret; | 
| 137 | 36.6k | } | 
| 138 |  |  | 
| 139 |  | template <unsigned int BITS> | 
| 140 |  | std::string base_uint<BITS>::GetHex() const | 
| 141 | 51.2k | { | 
| 142 | 51.2k |     base_blob<BITS> b; | 
| 143 | 461k |     for (int x = 0; x < this->WIDTH; ++x410k) { | 
| 144 | 410k |         WriteLE32(b.begin() + x*4, this->pn[x]); | 
| 145 | 410k |     } | 
| 146 | 51.2k |     return b.GetHex(); | 
| 147 | 51.2k | } | 
| 148 |  |  | 
| 149 |  | template <unsigned int BITS> | 
| 150 |  | std::string base_uint<BITS>::ToString() const | 
| 151 | 0 | { | 
| 152 | 0 |     return GetHex(); | 
| 153 | 0 | } | 
| 154 |  |  | 
| 155 |  | template <unsigned int BITS> | 
| 156 |  | unsigned int base_uint<BITS>::bits() const | 
| 157 | 28.4M | { | 
| 158 | 28.4M |     for (int pos = WIDTH - 1; pos >= 0; pos--0) { | 
| 159 | 28.4M |         if (pn[pos]) { | 
| 160 | 42.8M |             for (int nbits = 31; nbits > 0; nbits--14.3M) { | 
| 161 | 42.8M |                 if (pn[pos] & 1U << nbits) | 
| 162 | 28.4M |                     return 32 * pos + nbits + 1; | 
| 163 | 42.8M |             } | 
| 164 | 0 |             return 32 * pos + 1; | 
| 165 | 28.4M |         } | 
| 166 | 28.4M |     } | 
| 167 | 0 |     return 0; | 
| 168 | 28.4M | } _ZNK9base_uintILj256EE4bitsEv| Line | Count | Source |  | 157 | 28.4M | { |  | 158 | 28.4M |     for (int pos = WIDTH - 1; pos >= 0; pos--0) { |  | 159 | 28.4M |         if (pn[pos]) { |  | 160 | 42.8M |             for (int nbits = 31; nbits > 0; nbits--14.3M) { |  | 161 | 42.8M |                 if (pn[pos] & 1U << nbits) |  | 162 | 28.4M |                     return 32 * pos + nbits + 1; |  | 163 | 42.8M |             } |  | 164 | 0 |             return 32 * pos + 1; |  | 165 | 28.4M |         } |  | 166 | 28.4M |     } |  | 167 | 0 |     return 0; |  | 168 | 28.4M | } | 
Unexecuted instantiation: _ZNK9base_uintILj6144EE4bitsEv | 
| 169 |  |  | 
| 170 |  | // Explicit instantiations for base_uint<256> | 
| 171 |  | template class base_uint<256>; | 
| 172 |  |  | 
| 173 |  | // This implementation directly uses shifts instead of going | 
| 174 |  | // through an intermediate MPI representation. | 
| 175 |  | arith_uint256& arith_uint256::SetCompact(uint32_t nCompact, bool* pfNegative, bool* pfOverflow) | 
| 176 | 14.0M | { | 
| 177 | 14.0M |     int nSize = nCompact >> 24; | 
| 178 | 14.0M |     uint32_t nWord = nCompact & 0x007fffff; | 
| 179 | 14.0M |     if (nSize <= 3) { | 
| 180 | 0 |         nWord >>= 8 * (3 - nSize); | 
| 181 | 0 |         *this = nWord; | 
| 182 | 14.0M |     } else { | 
| 183 | 14.0M |         *this = nWord; | 
| 184 | 14.0M |         *this <<= 8 * (nSize - 3); | 
| 185 | 14.0M |     } | 
| 186 | 14.0M |     if (pfNegative) | 
| 187 | 14.0M |         *pfNegative = nWord != 0 && (nCompact & 0x00800000) != 0; | 
| 188 | 14.0M |     if (pfOverflow) | 
| 189 | 14.0M |         *pfOverflow = nWord != 0 && ((nSize > 34) || | 
| 190 | 14.0M |                                      (nWord > 0xff && nSize > 33) || | 
| 191 | 14.0M |                                      (nWord > 0xffff && nSize > 32)); | 
| 192 | 14.0M |     return *this; | 
| 193 | 14.0M | } | 
| 194 |  |  | 
| 195 |  | uint32_t arith_uint256::GetCompact(bool fNegative) const | 
| 196 | 353k | { | 
| 197 | 353k |     int nSize = (bits() + 7) / 8; | 
| 198 | 353k |     uint32_t nCompact = 0; | 
| 199 | 353k |     if (nSize <= 3) { | 
| 200 | 0 |         nCompact = GetLow64() << 8 * (3 - nSize); | 
| 201 | 353k |     } else { | 
| 202 | 353k |         arith_uint256 bn = *this >> 8 * (nSize - 3); | 
| 203 | 353k |         nCompact = bn.GetLow64(); | 
| 204 | 353k |     } | 
| 205 |  |     // The 0x00800000 bit denotes the sign. | 
| 206 |  |     // Thus, if it is already set, divide the mantissa by 256 and increase the exponent. | 
| 207 | 353k |     if (nCompact & 0x00800000) { | 
| 208 | 0 |         nCompact >>= 8; | 
| 209 | 0 |         nSize++; | 
| 210 | 0 |     } | 
| 211 | 353k |     assert((nCompact & ~0x007fffffU) == 0); | 
| 212 | 353k |     assert(nSize < 256); | 
| 213 | 353k |     nCompact |= nSize << 24; | 
| 214 | 353k |     nCompact |= (fNegative && (nCompact & 0x007fffff)0? 0x008000000: 0); | 
| 215 | 353k |     return nCompact; | 
| 216 | 353k | } | 
| 217 |  |  | 
| 218 |  | uint256 ArithToUint256(const arith_uint256 &a) | 
| 219 | 0 | { | 
| 220 | 0 |     uint256 b; | 
| 221 | 0 |     for(int x=0; x<a.WIDTH; ++x) | 
| 222 | 0 |         WriteLE32(b.begin() + x*4, a.pn[x]); | 
| 223 | 0 |     return b; | 
| 224 | 0 | } | 
| 225 |  | arith_uint256 UintToArith256(const uint256 &a) | 
| 226 | 1.46M | { | 
| 227 | 1.46M |     arith_uint256 b; | 
| 228 | 13.1M |     for(int x=0; x<b.WIDTH; ++x11.7M) | 
| 229 | 11.7M |         b.pn[x] = ReadLE32(a.begin() + x*4); | 
| 230 | 1.46M |     return b; | 
| 231 | 1.46M | } | 
| 232 |  |  | 
| 233 |  | // Explicit instantiations for base_uint<6144> (used in test/fuzz/muhash.cpp). | 
| 234 |  | template base_uint<6144>& base_uint<6144>::operator*=(const base_uint<6144>& b); | 
| 235 |  | template base_uint<6144>& base_uint<6144>::operator/=(const base_uint<6144>& b); |