Coverage Report

Created: 2026-04-29 19:21

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/tmp/bitcoin/src/util/fastrange.h
Line
Count
Source
1
// Copyright (c) 2018-present The Bitcoin Core developers
2
// Distributed under the MIT software license, see the accompanying
3
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
5
#ifndef BITCOIN_UTIL_FASTRANGE_H
6
#define BITCOIN_UTIL_FASTRANGE_H
7
8
#include <cstdint>
9
10
/* This file offers implementations of the fast range reduction technique described
11
 * in https://lemire.me/blog/2016/06/27/a-fast-alternative-to-the-modulo-reduction/
12
 *
13
 * In short, they take an integer x and a range n, and return the upper bits of
14
 * (x * n). If x is uniformly distributed over its domain, the result is as close to
15
 * uniformly distributed over [0, n) as (x mod n) would be, but significantly faster.
16
 */
17
18
/** Fast range reduction with 32-bit input and 32-bit range. */
19
static inline uint32_t FastRange32(uint32_t x, uint32_t n)
20
41.7M
{
21
41.7M
    return (uint64_t{x} * n) >> 32;
22
41.7M
}
Unexecuted instantiation: blockchain_tests.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: blockfilter_index_tests.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: blockmanager_tests.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: chainstate_write_tests.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: coinstatsindex_tests.cpp:FastRange32(unsigned int, unsigned int)
cuckoocache_tests.cpp:FastRange32(unsigned int, unsigned int)
Line
Count
Source
20
32.6M
{
21
32.6M
    return (uint64_t{x} * n) >> 32;
22
32.6M
}
Unexecuted instantiation: denialofservice_tests.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: headers_sync_chainwork_tests.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: interfaces_tests.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: miner_tests.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: net_tests.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: peerman_tests.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: rpc_tests.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: script_assets_tests.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: script_p2sh_tests.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: script_tests.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: testnet4_miner_tests.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: transaction_tests.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: txdownload_tests.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: txindex_tests.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: txospenderindex_tests.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: txpackage_tests.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: txvalidation_tests.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: txvalidationcache_tests.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: validation_block_tests.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: validation_chainstate_tests.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: validation_chainstatemanager_tests.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: validation_flush_tests.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: validation_tests.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: spend_tests.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: wallet_tests.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: ipc_tests.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: blockfilter.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: setup_common.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: txmempool.cpp:FastRange32(unsigned int, unsigned int)
validation.cpp:FastRange32(unsigned int, unsigned int)
Line
Count
Source
20
2.02M
{
21
2.02M
    return (uint64_t{x} * n) >> 32;
22
2.02M
}
Unexecuted instantiation: blockencodings.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: base.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: coinstatsindex.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: txindex.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: txospenderindex.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: init.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: coinstats.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: net_processing.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: blockmanager_args.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: blockstorage.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: chainstate.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: chainstatemanager_args.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: context.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: interfaces.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: mempool_persist.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: mempool_persist_args.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: miner.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: transaction.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: txdownloadman_impl.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: utxo_snapshot.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: rest.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: blockchain.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: mempool.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: mining.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: net.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: rawtransaction.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: server.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: server_util.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: txoutproof.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: sigcache.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: coin.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: transactions.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: ipc_test.cpp:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: ipc_test.capnp.proxy-client.c++:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: ipc_test.capnp.proxy-types.c++:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: ipc_test.capnp.proxy-server.c++:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: init.capnp.proxy-client.c++:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: init.capnp.proxy-types.c++:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: mining.capnp.proxy-types.c++:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: init.capnp.proxy-server.c++:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: mining.capnp.proxy-client.c++:FastRange32(unsigned int, unsigned int)
Unexecuted instantiation: mining.capnp.proxy-server.c++:FastRange32(unsigned int, unsigned int)
bloom.cpp:FastRange32(unsigned int, unsigned int)
Line
Count
Source
20
7.05M
{
21
7.05M
    return (uint64_t{x} * n) >> 32;
22
7.05M
}
23
24
/** Fast range reduction with 64-bit input and 64-bit range. */
25
static inline uint64_t FastRange64(uint64_t x, uint64_t n)
26
528k
{
27
528k
#ifdef __SIZEOF_INT128__
28
528k
    return (static_cast<unsigned __int128>(x) * static_cast<unsigned __int128>(n)) >> 64;
29
#else
30
    // To perform the calculation on 64-bit numbers without losing the
31
    // result to overflow, split the numbers into the most significant and
32
    // least significant 32 bits and perform multiplication piece-wise.
33
    //
34
    // See: https://stackoverflow.com/a/26855440
35
    const uint64_t x_hi = x >> 32;
36
    const uint64_t x_lo = x & 0xFFFFFFFF;
37
    const uint64_t n_hi = n >> 32;
38
    const uint64_t n_lo = n & 0xFFFFFFFF;
39
40
    const uint64_t ac = x_hi * n_hi;
41
    const uint64_t ad = x_hi * n_lo;
42
    const uint64_t bc = x_lo * n_hi;
43
    const uint64_t bd = x_lo * n_lo;
44
45
    const uint64_t mid34 = (bd >> 32) + (bc & 0xFFFFFFFF) + (ad & 0xFFFFFFFF);
46
    const uint64_t upper64 = ac + (bc >> 32) + (ad >> 32) + (mid34 >> 32);
47
    return upper64;
48
#endif
49
528k
}
Unexecuted instantiation: blockchain_tests.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: blockfilter_index_tests.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: blockmanager_tests.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: chainstate_write_tests.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: coinstatsindex_tests.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: cuckoocache_tests.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: denialofservice_tests.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: headers_sync_chainwork_tests.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: interfaces_tests.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: miner_tests.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: net_tests.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: peerman_tests.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: rpc_tests.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: script_assets_tests.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: script_p2sh_tests.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: script_tests.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: testnet4_miner_tests.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: transaction_tests.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: txdownload_tests.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: txindex_tests.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: txospenderindex_tests.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: txpackage_tests.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: txvalidation_tests.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: txvalidationcache_tests.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: validation_block_tests.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: validation_chainstate_tests.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: validation_chainstatemanager_tests.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: validation_flush_tests.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: validation_tests.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: spend_tests.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: wallet_tests.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: ipc_tests.cpp:FastRange64(unsigned long, unsigned long)
blockfilter.cpp:FastRange64(unsigned long, unsigned long)
Line
Count
Source
26
528k
{
27
528k
#ifdef __SIZEOF_INT128__
28
528k
    return (static_cast<unsigned __int128>(x) * static_cast<unsigned __int128>(n)) >> 64;
29
#else
30
    // To perform the calculation on 64-bit numbers without losing the
31
    // result to overflow, split the numbers into the most significant and
32
    // least significant 32 bits and perform multiplication piece-wise.
33
    //
34
    // See: https://stackoverflow.com/a/26855440
35
    const uint64_t x_hi = x >> 32;
36
    const uint64_t x_lo = x & 0xFFFFFFFF;
37
    const uint64_t n_hi = n >> 32;
38
    const uint64_t n_lo = n & 0xFFFFFFFF;
39
40
    const uint64_t ac = x_hi * n_hi;
41
    const uint64_t ad = x_hi * n_lo;
42
    const uint64_t bc = x_lo * n_hi;
43
    const uint64_t bd = x_lo * n_lo;
44
45
    const uint64_t mid34 = (bd >> 32) + (bc & 0xFFFFFFFF) + (ad & 0xFFFFFFFF);
46
    const uint64_t upper64 = ac + (bc >> 32) + (ad >> 32) + (mid34 >> 32);
47
    return upper64;
48
#endif
49
528k
}
Unexecuted instantiation: setup_common.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: txmempool.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: validation.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: blockencodings.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: base.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: coinstatsindex.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: txindex.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: txospenderindex.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: init.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: coinstats.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: net_processing.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: blockmanager_args.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: blockstorage.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: chainstate.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: chainstatemanager_args.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: context.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: interfaces.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: mempool_persist.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: mempool_persist_args.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: miner.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: transaction.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: txdownloadman_impl.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: utxo_snapshot.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: rest.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: blockchain.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: mempool.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: mining.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: net.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: rawtransaction.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: server.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: server_util.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: txoutproof.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: sigcache.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: coin.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: transactions.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: ipc_test.cpp:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: ipc_test.capnp.proxy-client.c++:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: ipc_test.capnp.proxy-types.c++:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: ipc_test.capnp.proxy-server.c++:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: init.capnp.proxy-client.c++:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: init.capnp.proxy-types.c++:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: mining.capnp.proxy-types.c++:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: init.capnp.proxy-server.c++:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: mining.capnp.proxy-client.c++:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: mining.capnp.proxy-server.c++:FastRange64(unsigned long, unsigned long)
Unexecuted instantiation: bloom.cpp:FastRange64(unsigned long, unsigned long)
50
51
#endif // BITCOIN_UTIL_FASTRANGE_H