diff --git a/src/arith_uint256.cpp b/src/arith_uint256.cpp index ed79e1b46..ebbb694d7 100644 --- a/src/arith_uint256.cpp +++ b/src/arith_uint256.cpp @@ -1,263 +1,262 @@ // Copyright (c) 2009-2010 Satoshi Nakamoto // Copyright (c) 2009-2016 The Bitcoin Core developers // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include #include #include - template base_uint::base_uint(const std::string &str) { static_assert(BITS / 32 > 0 && BITS % 32 == 0, "Template parameter BITS must be a positive multiple of 32."); SetHex(str); } template base_uint &base_uint::operator<<=(unsigned int shift) { base_uint a(*this); for (int i = 0; i < WIDTH; i++) { pn[i] = 0; } int k = shift / 32; shift = shift % 32; for (int i = 0; i < WIDTH; i++) { if (i + k + 1 < WIDTH && shift != 0) { pn[i + k + 1] |= (a.pn[i] >> (32 - shift)); } if (i + k < WIDTH) { pn[i + k] |= (a.pn[i] << shift); } } return *this; } template base_uint &base_uint::operator>>=(unsigned int shift) { base_uint a(*this); for (int i = 0; i < WIDTH; i++) { pn[i] = 0; } int k = shift / 32; shift = shift % 32; for (int i = 0; i < WIDTH; i++) { if (i - k - 1 >= 0 && shift != 0) { pn[i - k - 1] |= (a.pn[i] << (32 - shift)); } if (i - k >= 0) { pn[i - k] |= (a.pn[i] >> shift); } } return *this; } template base_uint &base_uint::operator*=(uint32_t b32) { uint64_t carry = 0; for (int i = 0; i < WIDTH; i++) { uint64_t n = carry + (uint64_t)b32 * pn[i]; pn[i] = n & 0xffffffff; carry = n >> 32; } return *this; } template base_uint &base_uint::operator*=(const base_uint &b) { base_uint a; for (int j = 0; j < WIDTH; j++) { uint64_t carry = 0; for (int i = 0; i + j < WIDTH; i++) { uint64_t n = carry + a.pn[i + j] + (uint64_t)pn[j] * b.pn[i]; a.pn[i + j] = n & 0xffffffff; carry = n >> 32; } } *this = a; return *this; } template base_uint &base_uint::operator/=(const base_uint &b) { // make a copy, so we can shift. base_uint div = b; // make a copy, so we can subtract. base_uint num = *this; // the quotient. *this = 0; int num_bits = num.bits(); int div_bits = div.bits(); if (div_bits == 0) { throw uint_error("Division by zero"); } // the result is certainly 0. if (div_bits > num_bits) { return *this; } int shift = num_bits - div_bits; // shift so that div and num align. div <<= shift; while (shift >= 0) { if (num >= div) { num -= div; // set a bit of the result. pn[shift / 32] |= (1 << (shift & 31)); } // shift back. div >>= 1; shift--; } // num now contains the remainder of the division. return *this; } template int base_uint::CompareTo(const base_uint &b) const { for (int i = WIDTH - 1; i >= 0; i--) { if (pn[i] < b.pn[i]) { return -1; } if (pn[i] > b.pn[i]) { return 1; } } return 0; } template bool base_uint::EqualTo(uint64_t b) const { for (int i = WIDTH - 1; i >= 2; i--) { if (pn[i]) { return false; } } if (pn[1] != (b >> 32)) { return false; } if (pn[0] != (b & 0xfffffffful)) { return false; } return true; } template double base_uint::getdouble() const { double ret = 0.0; double fact = 1.0; for (int i = 0; i < WIDTH; i++) { ret += fact * pn[i]; fact *= 4294967296.0; } return ret; } template std::string base_uint::GetHex() const { return ArithToUint256(*this).GetHex(); } template void base_uint::SetHex(const char *psz) { *this = UintToArith256(uint256S(psz)); } template void base_uint::SetHex(const std::string &str) { SetHex(str.c_str()); } template std::string base_uint::ToString() const { return (GetHex()); } template unsigned int base_uint::bits() const { for (int pos = WIDTH - 1; pos >= 0; pos--) { if (pn[pos]) { for (int nbits = 31; nbits > 0; nbits--) { if (pn[pos] & 1U << nbits) { return 32 * pos + nbits + 1; } } return 32 * pos + 1; } } return 0; } // Explicit instantiations for base_uint<256> template base_uint<256>::base_uint(const std::string &); template base_uint<256> &base_uint<256>::operator<<=(unsigned int); template base_uint<256> &base_uint<256>::operator>>=(unsigned int); template base_uint<256> &base_uint<256>::operator*=(uint32_t b32); template base_uint<256> &base_uint<256>::operator*=(const base_uint<256> &b); template base_uint<256> &base_uint<256>::operator/=(const base_uint<256> &b); template int base_uint<256>::CompareTo(const base_uint<256> &) const; template bool base_uint<256>::EqualTo(uint64_t) const; template double base_uint<256>::getdouble() const; template std::string base_uint<256>::GetHex() const; template std::string base_uint<256>::ToString() const; template void base_uint<256>::SetHex(const char *); template void base_uint<256>::SetHex(const std::string &); template unsigned int base_uint<256>::bits() const; // This implementation directly uses shifts instead of going through an // intermediate MPI representation. arith_uint256 &arith_uint256::SetCompact(uint32_t nCompact, bool *pfNegative, bool *pfOverflow) { int nSize = nCompact >> 24; uint32_t nWord = nCompact & 0x007fffff; if (nSize <= 3) { nWord >>= 8 * (3 - nSize); *this = nWord; } else { *this = nWord; *this <<= 8 * (nSize - 3); } if (pfNegative) { *pfNegative = nWord != 0 && (nCompact & 0x00800000) != 0; } if (pfOverflow) { *pfOverflow = nWord != 0 && ((nSize > 34) || (nWord > 0xff && nSize > 33) || (nWord > 0xffff && nSize > 32)); } return *this; } uint32_t arith_uint256::GetCompact(bool fNegative) const { int nSize = (bits() + 7) / 8; uint32_t nCompact = 0; if (nSize <= 3) { nCompact = GetLow64() << 8 * (3 - nSize); } else { arith_uint256 bn = *this >> 8 * (nSize - 3); nCompact = bn.GetLow64(); } // The 0x00800000 bit denotes the sign. // Thus, if it is already set, divide the mantissa by 256 and increase the // exponent. if (nCompact & 0x00800000) { nCompact >>= 8; nSize++; } assert((nCompact & ~0x007fffff) == 0); assert(nSize < 256); nCompact |= nSize << 24; nCompact |= (fNegative && (nCompact & 0x007fffff) ? 0x00800000 : 0); return nCompact; } uint256 ArithToUint256(const arith_uint256 &a) { uint256 b; for (int x = 0; x < a.WIDTH; ++x) { WriteLE32(b.begin() + x * 4, a.pn[x]); } return b; } arith_uint256 UintToArith256(const uint256 &a) { arith_uint256 b; for (int x = 0; x < b.WIDTH; ++x) { b.pn[x] = ReadLE32(a.begin() + x * 4); } return b; } diff --git a/src/bench/mempool_eviction.cpp b/src/bench/mempool_eviction.cpp index ab1c726b9..3d895548a 100644 --- a/src/bench/mempool_eviction.cpp +++ b/src/bench/mempool_eviction.cpp @@ -1,119 +1,118 @@ // Copyright (c) 2011-2016 The Bitcoin Core developers // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include #include #include - static void AddTx(const CTransactionRef &tx, const Amount &nFee, CTxMemPool &pool) EXCLUSIVE_LOCKS_REQUIRED(cs_main, pool.cs) { int64_t nTime = 0; unsigned int nHeight = 1; bool spendsCoinbase = false; unsigned int nSigOpCount = 1; LockPoints lp; pool.addUnchecked(CTxMemPoolEntry(tx, nFee, nTime, nHeight, spendsCoinbase, nSigOpCount, lp)); } // Right now this is only testing eviction performance in an extremely small // mempool. Code needs to be written to generate a much wider variety of // unique transactions for a more meaningful performance measurement. static void MempoolEviction(benchmark::State &state) { CMutableTransaction tx1 = CMutableTransaction(); tx1.vin.resize(1); tx1.vin[0].scriptSig = CScript() << OP_1; tx1.vout.resize(1); tx1.vout[0].scriptPubKey = CScript() << OP_1 << OP_EQUAL; tx1.vout[0].nValue = 10 * COIN; CMutableTransaction tx2 = CMutableTransaction(); tx2.vin.resize(1); tx2.vin[0].scriptSig = CScript() << OP_2; tx2.vout.resize(1); tx2.vout[0].scriptPubKey = CScript() << OP_2 << OP_EQUAL; tx2.vout[0].nValue = 10 * COIN; CMutableTransaction tx3 = CMutableTransaction(); tx3.vin.resize(1); tx3.vin[0].prevout = COutPoint(tx2.GetId(), 0); tx3.vin[0].scriptSig = CScript() << OP_2; tx3.vout.resize(1); tx3.vout[0].scriptPubKey = CScript() << OP_3 << OP_EQUAL; tx3.vout[0].nValue = 10 * COIN; CMutableTransaction tx4 = CMutableTransaction(); tx4.vin.resize(2); tx4.vin[0].prevout = COutPoint(); tx4.vin[0].scriptSig = CScript() << OP_4; tx4.vin[1].prevout = COutPoint(); tx4.vin[1].scriptSig = CScript() << OP_4; tx4.vout.resize(2); tx4.vout[0].scriptPubKey = CScript() << OP_4 << OP_EQUAL; tx4.vout[0].nValue = 10 * COIN; tx4.vout[1].scriptPubKey = CScript() << OP_4 << OP_EQUAL; tx4.vout[1].nValue = 10 * COIN; CMutableTransaction tx5 = CMutableTransaction(); tx5.vin.resize(2); tx5.vin[0].prevout = COutPoint(tx4.GetId(), 0); tx5.vin[0].scriptSig = CScript() << OP_4; tx5.vin[1].prevout = COutPoint(); tx5.vin[1].scriptSig = CScript() << OP_5; tx5.vout.resize(2); tx5.vout[0].scriptPubKey = CScript() << OP_5 << OP_EQUAL; tx5.vout[0].nValue = 10 * COIN; tx5.vout[1].scriptPubKey = CScript() << OP_5 << OP_EQUAL; tx5.vout[1].nValue = 10 * COIN; CMutableTransaction tx6 = CMutableTransaction(); tx6.vin.resize(2); tx6.vin[0].prevout = COutPoint(tx4.GetId(), 1); tx6.vin[0].scriptSig = CScript() << OP_4; tx6.vin[1].prevout = COutPoint(); tx6.vin[1].scriptSig = CScript() << OP_6; tx6.vout.resize(2); tx6.vout[0].scriptPubKey = CScript() << OP_6 << OP_EQUAL; tx6.vout[0].nValue = 10 * COIN; tx6.vout[1].scriptPubKey = CScript() << OP_6 << OP_EQUAL; tx6.vout[1].nValue = 10 * COIN; CMutableTransaction tx7 = CMutableTransaction(); tx7.vin.resize(2); tx7.vin[0].prevout = COutPoint(tx5.GetId(), 0); tx7.vin[0].scriptSig = CScript() << OP_5; tx7.vin[1].prevout = COutPoint(tx6.GetId(), 0); tx7.vin[1].scriptSig = CScript() << OP_6; tx7.vout.resize(2); tx7.vout[0].scriptPubKey = CScript() << OP_7 << OP_EQUAL; tx7.vout[0].nValue = 10 * COIN; tx7.vout[1].scriptPubKey = CScript() << OP_7 << OP_EQUAL; tx7.vout[1].nValue = 10 * COIN; CTxMemPool pool; LOCK2(cs_main, pool.cs); // Create transaction references outside the "hot loop" const CTransactionRef tx1_r{MakeTransactionRef(tx1)}; const CTransactionRef tx2_r{MakeTransactionRef(tx2)}; const CTransactionRef tx3_r{MakeTransactionRef(tx3)}; const CTransactionRef tx4_r{MakeTransactionRef(tx4)}; const CTransactionRef tx5_r{MakeTransactionRef(tx5)}; const CTransactionRef tx6_r{MakeTransactionRef(tx6)}; const CTransactionRef tx7_r{MakeTransactionRef(tx7)}; while (state.KeepRunning()) { AddTx(tx1_r, 10000 * SATOSHI, pool); AddTx(tx2_r, 5000 * SATOSHI, pool); AddTx(tx3_r, 20000 * SATOSHI, pool); AddTx(tx4_r, 7000 * SATOSHI, pool); AddTx(tx5_r, 1000 * SATOSHI, pool); AddTx(tx6_r, 1100 * SATOSHI, pool); AddTx(tx7_r, 9000 * SATOSHI, pool); pool.TrimToSize(pool.DynamicMemoryUsage() * 3 / 4); pool.TrimToSize(GetSerializeSize(*tx1_r, PROTOCOL_VERSION)); } } BENCHMARK(MempoolEviction, 41000); diff --git a/src/bench/rollingbloom.cpp b/src/bench/rollingbloom.cpp index 6983984f6..7d9da3d56 100644 --- a/src/bench/rollingbloom.cpp +++ b/src/bench/rollingbloom.cpp @@ -1,37 +1,36 @@ // Copyright (c) 2016 The Bitcoin Core developers // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. - #include #include static void RollingBloom(benchmark::State &state) { CRollingBloomFilter filter(120000, 0.000001); std::vector data(32); uint32_t count = 0; while (state.KeepRunning()) { count++; data[0] = count; data[1] = count >> 8; data[2] = count >> 16; data[3] = count >> 24; filter.insert(data); data[0] = count >> 24; data[1] = count >> 16; data[2] = count >> 8; data[3] = count; filter.contains(data); } } static void RollingBloomReset(benchmark::State &state) { CRollingBloomFilter filter(120000, 0.000001); while (state.KeepRunning()) { filter.reset(); } } BENCHMARK(RollingBloom, 1500 * 1000); BENCHMARK(RollingBloomReset, 20000); diff --git a/src/bench/rpc_mempool.cpp b/src/bench/rpc_mempool.cpp index d9fce0d99..9d4dd7afb 100644 --- a/src/bench/rpc_mempool.cpp +++ b/src/bench/rpc_mempool.cpp @@ -1,41 +1,40 @@ // Copyright (c) 2011-2019 The Bitcoin Core developers // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include #include #include #include - static void AddTx(const CTransactionRef &tx, const Amount &fee, CTxMemPool &pool) EXCLUSIVE_LOCKS_REQUIRED(cs_main, pool.cs) { LockPoints lp; pool.addUnchecked(CTxMemPoolEntry(tx, fee, /* time */ 0, /* height */ 1, /* spendsCoinbase */ false, /* sigOpCount */ 1, lp)); } static void RpcMempool(benchmark::State &state) { CTxMemPool pool; LOCK2(cs_main, pool.cs); for (int i = 0; i < 1000; ++i) { CMutableTransaction tx = CMutableTransaction(); tx.vin.resize(1); tx.vin[0].scriptSig = CScript() << OP_1; tx.vout.resize(1); tx.vout[0].scriptPubKey = CScript() << OP_1 << OP_EQUAL; tx.vout[0].nValue = i * COIN; const CTransactionRef tx_r{MakeTransactionRef(tx)}; AddTx(tx_r, /* fee */ i * COIN, pool); } while (state.KeepRunning()) { (void)MempoolToJSON(pool, /*verbose*/ true); } } BENCHMARK(RpcMempool, 40); diff --git a/src/crypto/sha256_shani.cpp b/src/crypto/sha256_shani.cpp index 290f79f77..1b3895e9b 100644 --- a/src/crypto/sha256_shani.cpp +++ b/src/crypto/sha256_shani.cpp @@ -1,388 +1,387 @@ // Copyright (c) 2018 The Bitcoin Core developers // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. // // Based on https://github.com/noloader/SHA-Intrinsics/blob/master/sha256-x86.c, // Written and placed in public domain by Jeffrey Walton. // Based on code from Intel, and by Sean Gulley for the miTLS project. #ifdef ENABLE_SHANI #include #include - namespace { alignas(__m128i) const uint8_t MASK[16] = {0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c}; alignas(__m128i) const uint8_t INIT0[16] = {0x8c, 0x68, 0x05, 0x9b, 0x7f, 0x52, 0x0e, 0x51, 0x85, 0xae, 0x67, 0xbb, 0x67, 0xe6, 0x09, 0x6a}; alignas(__m128i) const uint8_t INIT1[16] = {0x19, 0xcd, 0xe0, 0x5b, 0xab, 0xd9, 0x83, 0x1f, 0x3a, 0xf5, 0x4f, 0xa5, 0x72, 0xf3, 0x6e, 0x3c}; inline void __attribute__((always_inline)) QuadRound(__m128i &state0, __m128i &state1, uint64_t k1, uint64_t k0) { const __m128i msg = _mm_set_epi64x(k1, k0); state1 = _mm_sha256rnds2_epu32(state1, state0, msg); state0 = _mm_sha256rnds2_epu32(state0, state1, _mm_shuffle_epi32(msg, 0x0e)); } inline void __attribute__((always_inline)) QuadRound(__m128i &state0, __m128i &state1, __m128i m, uint64_t k1, uint64_t k0) { const __m128i msg = _mm_add_epi32(m, _mm_set_epi64x(k1, k0)); state1 = _mm_sha256rnds2_epu32(state1, state0, msg); state0 = _mm_sha256rnds2_epu32(state0, state1, _mm_shuffle_epi32(msg, 0x0e)); } inline void __attribute__((always_inline)) ShiftMessageA(__m128i &m0, __m128i m1) { m0 = _mm_sha256msg1_epu32(m0, m1); } inline void __attribute__((always_inline)) ShiftMessageC(__m128i &m0, __m128i m1, __m128i &m2) { m2 = _mm_sha256msg2_epu32(_mm_add_epi32(m2, _mm_alignr_epi8(m1, m0, 4)), m1); } inline void __attribute__((always_inline)) ShiftMessageB(__m128i &m0, __m128i m1, __m128i &m2) { ShiftMessageC(m0, m1, m2); ShiftMessageA(m0, m1); } inline void __attribute__((always_inline)) Shuffle(__m128i &s0, __m128i &s1) { const __m128i t1 = _mm_shuffle_epi32(s0, 0xB1); const __m128i t2 = _mm_shuffle_epi32(s1, 0x1B); s0 = _mm_alignr_epi8(t1, t2, 0x08); s1 = _mm_blend_epi16(t2, t1, 0xF0); } inline void __attribute__((always_inline)) Unshuffle(__m128i &s0, __m128i &s1) { const __m128i t1 = _mm_shuffle_epi32(s0, 0x1B); const __m128i t2 = _mm_shuffle_epi32(s1, 0xB1); s0 = _mm_blend_epi16(t1, t2, 0xF0); s1 = _mm_alignr_epi8(t2, t1, 0x08); } /* * Prevent the compiler from raising a -Wcast-align warning when using unaligned * specific instruction, such as _mm_loadu_si128 or _mm_storeu_si128 (note the * 'u' suffix for unaligned accesses). */ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wcast-align" inline __m128i __attribute__((always_inline)) LoadInteger128Unaligned(const uint8_t *mem_addr) { return _mm_loadu_si128((const __m128i *)mem_addr); } inline __m128i __attribute__((always_inline)) LoadInteger128Unaligned(const uint32_t *mem_addr) { return _mm_loadu_si128((const __m128i *)mem_addr); } inline void __attribute__((always_inline)) StoreInteger128Unaligned(uint8_t *mem_addr, __m128i i128) { _mm_storeu_si128((__m128i *)mem_addr, i128); } inline void __attribute__((always_inline)) StoreInteger128Unaligned(uint32_t *mem_addr, __m128i i128) { _mm_storeu_si128((__m128i *)mem_addr, i128); } #pragma GCC diagnostic pop __m128i inline __attribute__((always_inline)) Load(const uint8_t *in) { return _mm_shuffle_epi8(LoadInteger128Unaligned(in), _mm_load_si128((const __m128i *)MASK)); } inline void __attribute__((always_inline)) Save(uint8_t *out, __m128i s) { StoreInteger128Unaligned( out, _mm_shuffle_epi8(s, _mm_load_si128((const __m128i *)MASK))); } } // namespace namespace sha256_shani { void Transform(uint32_t *s, const uint8_t *chunk, size_t blocks) { __m128i m0, m1, m2, m3, s0, s1, so0, so1; /* Load state */ s0 = LoadInteger128Unaligned(s); s1 = LoadInteger128Unaligned(s + 4); Shuffle(s0, s1); while (blocks--) { /* Remember old state */ so0 = s0; so1 = s1; /* Load data and transform */ m0 = Load(chunk); QuadRound(s0, s1, m0, 0xe9b5dba5b5c0fbcfull, 0x71374491428a2f98ull); m1 = Load(chunk + 16); QuadRound(s0, s1, m1, 0xab1c5ed5923f82a4ull, 0x59f111f13956c25bull); ShiftMessageA(m0, m1); m2 = Load(chunk + 32); QuadRound(s0, s1, m2, 0x550c7dc3243185beull, 0x12835b01d807aa98ull); ShiftMessageA(m1, m2); m3 = Load(chunk + 48); QuadRound(s0, s1, m3, 0xc19bf1749bdc06a7ull, 0x80deb1fe72be5d74ull); ShiftMessageB(m2, m3, m0); QuadRound(s0, s1, m0, 0x240ca1cc0fc19dc6ull, 0xefbe4786E49b69c1ull); ShiftMessageB(m3, m0, m1); QuadRound(s0, s1, m1, 0x76f988da5cb0a9dcull, 0x4a7484aa2de92c6full); ShiftMessageB(m0, m1, m2); QuadRound(s0, s1, m2, 0xbf597fc7b00327c8ull, 0xa831c66d983e5152ull); ShiftMessageB(m1, m2, m3); QuadRound(s0, s1, m3, 0x1429296706ca6351ull, 0xd5a79147c6e00bf3ull); ShiftMessageB(m2, m3, m0); QuadRound(s0, s1, m0, 0x53380d134d2c6dfcull, 0x2e1b213827b70a85ull); ShiftMessageB(m3, m0, m1); QuadRound(s0, s1, m1, 0x92722c8581c2c92eull, 0x766a0abb650a7354ull); ShiftMessageB(m0, m1, m2); QuadRound(s0, s1, m2, 0xc76c51A3c24b8b70ull, 0xa81a664ba2bfe8a1ull); ShiftMessageB(m1, m2, m3); QuadRound(s0, s1, m3, 0x106aa070f40e3585ull, 0xd6990624d192e819ull); ShiftMessageB(m2, m3, m0); QuadRound(s0, s1, m0, 0x34b0bcb52748774cull, 0x1e376c0819a4c116ull); ShiftMessageB(m3, m0, m1); QuadRound(s0, s1, m1, 0x682e6ff35b9cca4full, 0x4ed8aa4a391c0cb3ull); ShiftMessageC(m0, m1, m2); QuadRound(s0, s1, m2, 0x8cc7020884c87814ull, 0x78a5636f748f82eeull); ShiftMessageC(m1, m2, m3); QuadRound(s0, s1, m3, 0xc67178f2bef9A3f7ull, 0xa4506ceb90befffaull); /* Combine with old state */ s0 = _mm_add_epi32(s0, so0); s1 = _mm_add_epi32(s1, so1); /* Advance */ chunk += 64; } Unshuffle(s0, s1); StoreInteger128Unaligned(s, s0); StoreInteger128Unaligned(s + 4, s1); } } // namespace sha256_shani namespace sha256d64_shani { void Transform_2way(uint8_t *out, const uint8_t *in) { __m128i am0, am1, am2, am3, as0, as1, aso0, aso1; __m128i bm0, bm1, bm2, bm3, bs0, bs1, bso0, bso1; /* Transform 1 */ bs0 = as0 = _mm_load_si128((const __m128i *)INIT0); bs1 = as1 = _mm_load_si128((const __m128i *)INIT1); am0 = Load(in); bm0 = Load(in + 64); QuadRound(as0, as1, am0, 0xe9b5dba5b5c0fbcfull, 0x71374491428a2f98ull); QuadRound(bs0, bs1, bm0, 0xe9b5dba5b5c0fbcfull, 0x71374491428a2f98ull); am1 = Load(in + 16); bm1 = Load(in + 80); QuadRound(as0, as1, am1, 0xab1c5ed5923f82a4ull, 0x59f111f13956c25bull); QuadRound(bs0, bs1, bm1, 0xab1c5ed5923f82a4ull, 0x59f111f13956c25bull); ShiftMessageA(am0, am1); ShiftMessageA(bm0, bm1); am2 = Load(in + 32); bm2 = Load(in + 96); QuadRound(as0, as1, am2, 0x550c7dc3243185beull, 0x12835b01d807aa98ull); QuadRound(bs0, bs1, bm2, 0x550c7dc3243185beull, 0x12835b01d807aa98ull); ShiftMessageA(am1, am2); ShiftMessageA(bm1, bm2); am3 = Load(in + 48); bm3 = Load(in + 112); QuadRound(as0, as1, am3, 0xc19bf1749bdc06a7ull, 0x80deb1fe72be5d74ull); QuadRound(bs0, bs1, bm3, 0xc19bf1749bdc06a7ull, 0x80deb1fe72be5d74ull); ShiftMessageB(am2, am3, am0); ShiftMessageB(bm2, bm3, bm0); QuadRound(as0, as1, am0, 0x240ca1cc0fc19dc6ull, 0xefbe4786E49b69c1ull); QuadRound(bs0, bs1, bm0, 0x240ca1cc0fc19dc6ull, 0xefbe4786E49b69c1ull); ShiftMessageB(am3, am0, am1); ShiftMessageB(bm3, bm0, bm1); QuadRound(as0, as1, am1, 0x76f988da5cb0a9dcull, 0x4a7484aa2de92c6full); QuadRound(bs0, bs1, bm1, 0x76f988da5cb0a9dcull, 0x4a7484aa2de92c6full); ShiftMessageB(am0, am1, am2); ShiftMessageB(bm0, bm1, bm2); QuadRound(as0, as1, am2, 0xbf597fc7b00327c8ull, 0xa831c66d983e5152ull); QuadRound(bs0, bs1, bm2, 0xbf597fc7b00327c8ull, 0xa831c66d983e5152ull); ShiftMessageB(am1, am2, am3); ShiftMessageB(bm1, bm2, bm3); QuadRound(as0, as1, am3, 0x1429296706ca6351ull, 0xd5a79147c6e00bf3ull); QuadRound(bs0, bs1, bm3, 0x1429296706ca6351ull, 0xd5a79147c6e00bf3ull); ShiftMessageB(am2, am3, am0); ShiftMessageB(bm2, bm3, bm0); QuadRound(as0, as1, am0, 0x53380d134d2c6dfcull, 0x2e1b213827b70a85ull); QuadRound(bs0, bs1, bm0, 0x53380d134d2c6dfcull, 0x2e1b213827b70a85ull); ShiftMessageB(am3, am0, am1); ShiftMessageB(bm3, bm0, bm1); QuadRound(as0, as1, am1, 0x92722c8581c2c92eull, 0x766a0abb650a7354ull); QuadRound(bs0, bs1, bm1, 0x92722c8581c2c92eull, 0x766a0abb650a7354ull); ShiftMessageB(am0, am1, am2); ShiftMessageB(bm0, bm1, bm2); QuadRound(as0, as1, am2, 0xc76c51A3c24b8b70ull, 0xa81a664ba2bfe8a1ull); QuadRound(bs0, bs1, bm2, 0xc76c51A3c24b8b70ull, 0xa81a664ba2bfe8a1ull); ShiftMessageB(am1, am2, am3); ShiftMessageB(bm1, bm2, bm3); QuadRound(as0, as1, am3, 0x106aa070f40e3585ull, 0xd6990624d192e819ull); QuadRound(bs0, bs1, bm3, 0x106aa070f40e3585ull, 0xd6990624d192e819ull); ShiftMessageB(am2, am3, am0); ShiftMessageB(bm2, bm3, bm0); QuadRound(as0, as1, am0, 0x34b0bcb52748774cull, 0x1e376c0819a4c116ull); QuadRound(bs0, bs1, bm0, 0x34b0bcb52748774cull, 0x1e376c0819a4c116ull); ShiftMessageB(am3, am0, am1); ShiftMessageB(bm3, bm0, bm1); QuadRound(as0, as1, am1, 0x682e6ff35b9cca4full, 0x4ed8aa4a391c0cb3ull); QuadRound(bs0, bs1, bm1, 0x682e6ff35b9cca4full, 0x4ed8aa4a391c0cb3ull); ShiftMessageC(am0, am1, am2); ShiftMessageC(bm0, bm1, bm2); QuadRound(as0, as1, am2, 0x8cc7020884c87814ull, 0x78a5636f748f82eeull); QuadRound(bs0, bs1, bm2, 0x8cc7020884c87814ull, 0x78a5636f748f82eeull); ShiftMessageC(am1, am2, am3); ShiftMessageC(bm1, bm2, bm3); QuadRound(as0, as1, am3, 0xc67178f2bef9A3f7ull, 0xa4506ceb90befffaull); QuadRound(bs0, bs1, bm3, 0xc67178f2bef9A3f7ull, 0xa4506ceb90befffaull); as0 = _mm_add_epi32(as0, _mm_load_si128((const __m128i *)INIT0)); bs0 = _mm_add_epi32(bs0, _mm_load_si128((const __m128i *)INIT0)); as1 = _mm_add_epi32(as1, _mm_load_si128((const __m128i *)INIT1)); bs1 = _mm_add_epi32(bs1, _mm_load_si128((const __m128i *)INIT1)); /* Transform 2 */ aso0 = as0; bso0 = bs0; aso1 = as1; bso1 = bs1; QuadRound(as0, as1, 0xe9b5dba5b5c0fbcfull, 0x71374491c28a2f98ull); QuadRound(bs0, bs1, 0xe9b5dba5b5c0fbcfull, 0x71374491c28a2f98ull); QuadRound(as0, as1, 0xab1c5ed5923f82a4ull, 0x59f111f13956c25bull); QuadRound(bs0, bs1, 0xab1c5ed5923f82a4ull, 0x59f111f13956c25bull); QuadRound(as0, as1, 0x550c7dc3243185beull, 0x12835b01d807aa98ull); QuadRound(bs0, bs1, 0x550c7dc3243185beull, 0x12835b01d807aa98ull); QuadRound(as0, as1, 0xc19bf3749bdc06a7ull, 0x80deb1fe72be5d74ull); QuadRound(bs0, bs1, 0xc19bf3749bdc06a7ull, 0x80deb1fe72be5d74ull); QuadRound(as0, as1, 0x240cf2540fe1edc6ull, 0xf0fe4786649b69c1ull); QuadRound(bs0, bs1, 0x240cf2540fe1edc6ull, 0xf0fe4786649b69c1ull); QuadRound(as0, as1, 0x16f988fa61b9411eull, 0x6cc984be4fe9346full); QuadRound(bs0, bs1, 0x16f988fa61b9411eull, 0x6cc984be4fe9346full); QuadRound(as0, as1, 0xb9d99ec7b019fc65ull, 0xa88e5a6df2c65152ull); QuadRound(bs0, bs1, 0xb9d99ec7b019fc65ull, 0xa88e5a6df2c65152ull); QuadRound(as0, as1, 0xc7353eb0fdb1232bull, 0xe70eeaa09a1231c3ull); QuadRound(bs0, bs1, 0xc7353eb0fdb1232bull, 0xe70eeaa09a1231c3ull); QuadRound(as0, as1, 0xdc1eeefd5a0f118full, 0xcb976d5f3069bad5ull); QuadRound(bs0, bs1, 0xdc1eeefd5a0f118full, 0xcb976d5f3069bad5ull); QuadRound(as0, as1, 0xe15d5b1658f4ca9dull, 0xde0b7a040a35b689ull); QuadRound(bs0, bs1, 0xe15d5b1658f4ca9dull, 0xde0b7a040a35b689ull); QuadRound(as0, as1, 0x6fab9537a507ea32ull, 0x37088980007f3e86ull); QuadRound(bs0, bs1, 0x6fab9537a507ea32ull, 0x37088980007f3e86ull); QuadRound(as0, as1, 0xc0bbbe37cdaa3b6dull, 0x0d8cd6f117406110ull); QuadRound(bs0, bs1, 0xc0bbbe37cdaa3b6dull, 0x0d8cd6f117406110ull); QuadRound(as0, as1, 0x6fd15ca70b02e931ull, 0xdb48a36383613bdaull); QuadRound(bs0, bs1, 0x6fd15ca70b02e931ull, 0xdb48a36383613bdaull); QuadRound(as0, as1, 0x6d4378906ed41a95ull, 0x31338431521afacaull); QuadRound(bs0, bs1, 0x6d4378906ed41a95ull, 0x31338431521afacaull); QuadRound(as0, as1, 0x532fb63cb5c9a0e6ull, 0x9eccabbdc39c91f2ull); QuadRound(bs0, bs1, 0x532fb63cb5c9a0e6ull, 0x9eccabbdc39c91f2ull); QuadRound(as0, as1, 0x4c191d76a4954b68ull, 0x07237ea3d2c741c6ull); QuadRound(bs0, bs1, 0x4c191d76a4954b68ull, 0x07237ea3d2c741c6ull); as0 = _mm_add_epi32(as0, aso0); bs0 = _mm_add_epi32(bs0, bso0); as1 = _mm_add_epi32(as1, aso1); bs1 = _mm_add_epi32(bs1, bso1); /* Extract hash */ Unshuffle(as0, as1); Unshuffle(bs0, bs1); am0 = as0; bm0 = bs0; am1 = as1; bm1 = bs1; /* Transform 3 */ bs0 = as0 = _mm_load_si128((const __m128i *)INIT0); bs1 = as1 = _mm_load_si128((const __m128i *)INIT1); QuadRound(as0, as1, am0, 0xe9b5dba5B5c0fbcfull, 0x71374491428a2f98ull); QuadRound(bs0, bs1, bm0, 0xe9b5dba5B5c0fbcfull, 0x71374491428a2f98ull); QuadRound(as0, as1, am1, 0xab1c5ed5923f82a4ull, 0x59f111f13956c25bull); QuadRound(bs0, bs1, bm1, 0xab1c5ed5923f82a4ull, 0x59f111f13956c25bull); ShiftMessageA(am0, am1); ShiftMessageA(bm0, bm1); bm2 = am2 = _mm_set_epi64x(0x0ull, 0x80000000ull); QuadRound(as0, as1, 0x550c7dc3243185beull, 0x12835b015807aa98ull); QuadRound(bs0, bs1, 0x550c7dc3243185beull, 0x12835b015807aa98ull); ShiftMessageA(am1, am2); ShiftMessageA(bm1, bm2); bm3 = am3 = _mm_set_epi64x(0x10000000000ull, 0x0ull); QuadRound(as0, as1, 0xc19bf2749bdc06a7ull, 0x80deb1fe72be5d74ull); QuadRound(bs0, bs1, 0xc19bf2749bdc06a7ull, 0x80deb1fe72be5d74ull); ShiftMessageB(am2, am3, am0); ShiftMessageB(bm2, bm3, bm0); QuadRound(as0, as1, am0, 0x240ca1cc0fc19dc6ull, 0xefbe4786e49b69c1ull); QuadRound(bs0, bs1, bm0, 0x240ca1cc0fc19dc6ull, 0xefbe4786e49b69c1ull); ShiftMessageB(am3, am0, am1); ShiftMessageB(bm3, bm0, bm1); QuadRound(as0, as1, am1, 0x76f988da5cb0a9dcull, 0x4a7484aa2de92c6full); QuadRound(bs0, bs1, bm1, 0x76f988da5cb0a9dcull, 0x4a7484aa2de92c6full); ShiftMessageB(am0, am1, am2); ShiftMessageB(bm0, bm1, bm2); QuadRound(as0, as1, am2, 0xbf597fc7b00327c8ull, 0xa831c66d983e5152ull); QuadRound(bs0, bs1, bm2, 0xbf597fc7b00327c8ull, 0xa831c66d983e5152ull); ShiftMessageB(am1, am2, am3); ShiftMessageB(bm1, bm2, bm3); QuadRound(as0, as1, am3, 0x1429296706ca6351ull, 0xd5a79147c6e00bf3ull); QuadRound(bs0, bs1, bm3, 0x1429296706ca6351ull, 0xd5a79147c6e00bf3ull); ShiftMessageB(am2, am3, am0); ShiftMessageB(bm2, bm3, bm0); QuadRound(as0, as1, am0, 0x53380d134d2c6dfcull, 0x2e1b213827b70a85ull); QuadRound(bs0, bs1, bm0, 0x53380d134d2c6dfcull, 0x2e1b213827b70a85ull); ShiftMessageB(am3, am0, am1); ShiftMessageB(bm3, bm0, bm1); QuadRound(as0, as1, am1, 0x92722c8581c2c92eull, 0x766a0abb650a7354ull); QuadRound(bs0, bs1, bm1, 0x92722c8581c2c92eull, 0x766a0abb650a7354ull); ShiftMessageB(am0, am1, am2); ShiftMessageB(bm0, bm1, bm2); QuadRound(as0, as1, am2, 0xc76c51a3c24b8b70ull, 0xa81a664ba2bfe8A1ull); QuadRound(bs0, bs1, bm2, 0xc76c51a3c24b8b70ull, 0xa81a664ba2bfe8A1ull); ShiftMessageB(am1, am2, am3); ShiftMessageB(bm1, bm2, bm3); QuadRound(as0, as1, am3, 0x106aa070f40e3585ull, 0xd6990624d192e819ull); QuadRound(bs0, bs1, bm3, 0x106aa070f40e3585ull, 0xd6990624d192e819ull); ShiftMessageB(am2, am3, am0); ShiftMessageB(bm2, bm3, bm0); QuadRound(as0, as1, am0, 0x34b0bcb52748774cull, 0x1e376c0819a4c116ull); QuadRound(bs0, bs1, bm0, 0x34b0bcb52748774cull, 0x1e376c0819a4c116ull); ShiftMessageB(am3, am0, am1); ShiftMessageB(bm3, bm0, bm1); QuadRound(as0, as1, am1, 0x682e6ff35b9cca4full, 0x4ed8aa4a391c0cb3ull); QuadRound(bs0, bs1, bm1, 0x682e6ff35b9cca4full, 0x4ed8aa4a391c0cb3ull); ShiftMessageC(am0, am1, am2); ShiftMessageC(bm0, bm1, bm2); QuadRound(as0, as1, am2, 0x8cc7020884c87814ull, 0x78a5636f748f82eeull); QuadRound(bs0, bs1, bm2, 0x8cc7020884c87814ull, 0x78a5636f748f82eeull); ShiftMessageC(am1, am2, am3); ShiftMessageC(bm1, bm2, bm3); QuadRound(as0, as1, am3, 0xc67178f2bef9a3f7ull, 0xa4506ceb90befffaull); QuadRound(bs0, bs1, bm3, 0xc67178f2bef9a3f7ull, 0xa4506ceb90befffaull); as0 = _mm_add_epi32(as0, _mm_load_si128((const __m128i *)INIT0)); bs0 = _mm_add_epi32(bs0, _mm_load_si128((const __m128i *)INIT0)); as1 = _mm_add_epi32(as1, _mm_load_si128((const __m128i *)INIT1)); bs1 = _mm_add_epi32(bs1, _mm_load_si128((const __m128i *)INIT1)); /* Extract hash into out */ Unshuffle(as0, as1); Unshuffle(bs0, bs1); Save(out, as0); Save(out + 16, as1); Save(out + 32, bs0); Save(out + 48, bs1); } } // namespace sha256d64_shani #endif diff --git a/src/rpc/misc.cpp b/src/rpc/misc.cpp index 414ec10a8..54af4394c 100644 --- a/src/rpc/misc.cpp +++ b/src/rpc/misc.cpp @@ -1,741 +1,742 @@ // Copyright (c) 2010 Satoshi Nakamoto // Copyright (c) 2009-2016 The Bitcoin Core developers // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include #include #include #include #include #include #include #include #include #include #include #include